#!/usr/bin/perl use warnings; use strict; use Getopt::Long; use File::SmartTail; use File::Basename qw( fileparse ); use File::Copy qw( move ); use Net::FTP; use POSIX; $SIG{CHLD} = 'IGNORE'; $|++; # Autoflush sub getTimeStamp { # parm [ts] => timestamp for filename; log => timestamp for log my $format = "%04d%02d%02d%02d%02d%02d"; my ($p1) = @_; if ( defined $p1 and $p1 eq "log" ) { $format = "%04d%02d%02d %02d:%02d:%02d"; } my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime(time); my $timestamp = sprintf( $format, $year + 1900, $mon + 1, $mday, $hour, $min, $sec ); return $timestamp; } my $readingFile; my $ftpuser = "aseftp"; my $ftpuser1 = "asega"; my $recvOKstr = "OK UPLOAD"; my $ext = ".csv"; my $hostname = "160.78.21.55"; my $username = 'asega'; my $password = 'mums'; my $lockTS; my $lockfile = '/tmp/retransmit.lock'; GetOptions( "file=s" => \$readingFile, "lockts=i" => \$lockTS ) or die("Error in command line arguments\n"); if ( -e $lockfile ) { my $content; open( my $fh, '<', $lockfile ) or die "cannot open file $lockfile"; { local $/; $content = <$fh>; } close($fh); if ( $content != $lockTS ) { print getTimeStamp("log") . " >> timestamp mismatch... $content - $lockTS ... Exiting. \n"; exit(0); } } else { open( FH, '>', $lockfile ) or die $!; print FH $lockTS; close(FH); } if ( index( $readingFile, 'ZZZZZZ.csv' ) > 0 ) { unlink $lockfile; exit(0); } print getTimeStamp("log") . " >> $readingFile \n"; my ( $scriptname, $scriptpath ) = fileparse($0); my ( $filename, $path, $suffix ) = fileparse( $readingFile, qr/\.[^.]*/ ); my $send = $readingFile =~ s/received/transmitted/r; my ( $tool, $trxdate ) = split( /_/, $filename ); my ( $dmy1, $dmy2, $dmy3, $unit, $dmy4 ) = split( /\//, $path ); print getTimeStamp("log") . " >> Unit $unit - Filename $tool" . "$suffix \n"; my $ftp = Net::FTP->new( $hostname, Timeout => 20, Debug => 0, Passive => 0 ) or die getTimeStamp("log") . " >> Cannot connect to $hostname: $@"; if ( $ftp->login( $username, $password ) ) { if ( $ftp->put( $readingFile, $tool . $suffix ) ) { print getTimeStamp("log") . " >> Put $readingFile completed.\n"; if ( !move $readingFile, $send ) { warn getTimeStamp("log") . " >> Move $readingFile -> $send failed: $!"; } else { print getTimeStamp("log") . " >> Moved $readingFile -> $send.\n"; } } else { die getTimeStamp("log") . " >> Put $readingFile failed ", $ftp->message; } } else { die getTimeStamp("log") . " >> Cannot login ", $ftp->message; } exit(0);