#!/usr/bin/perl use warnings; use strict; use Getopt::Long; use File::SmartTail; use File::Basename qw( fileparse ); use File::Path qw( make_path ); 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; } sub getUnitName { # parm => file received ($trfile) my ($filename) = @_; my ( $fileDate, $fileTime ); my ( $unittype, $unit ); my ( $filenamecsv, $path, $suffix ) = fileparse( $filename, qr/\.[^.]*/ ); if ( $filenamecsv =~ m/^(\d\d_\d\d\d\d_|)(\d\d\d\d\d\d\d\d\d\d\d\d\d\d_)(G201_ID\d\d\d\d_DT\d\d\d\d)$/i ) { # GD201 my @strings = $filenamecsv =~ /(.{1,4})(.{1,2})(.{1,2})(.{1,2})(.{1,2})(.{1,2})_(.{1,4})_(.{1,6})_(.{1,6}).*/; $fileDate = $strings[0] . "/" . $strings[1] . "/" . $strings[2];; $fileTime = $strings[3] . ":" . $strings[4] . ":" . $strings[5]; $unittype = $strings[6]; $unit = $strings[7]; } else { open FILE, $filename or warn getTimeStamp("log") . " >> Error: opening input file $filename\n"; ( $fileDate, $fileTime ) = split( /\s/, ); ( $unittype, $unit ) = split( /\s/, uc ); $unit =~ s/;+$//; close FILE; } return $unit; } 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'; GetOptions( "file=s" => \$readingFile ) or die("Error in command line arguments\n"); my($scriptname, $scriptpath) = fileparse($0); my $tail = new File::SmartTail; $tail->WatchFile( -file => $readingFile, -type => "UNIX", -timeout => '10' ); while ( my $line = $tail->GetLine() ) { if (((index($line, $ftpuser) != -1) or (index($line, $ftpuser1) != -1)) and (index($line, $recvOKstr) != -1)) { my (undef, undef, undef, $truser, undef, $trip, undef, $trfile, $trstat) = split(/[\"\[\]]/, $line); my ($login,$pass,$uid,$gid) = getpwnam($truser) or warn getTimeStamp("log") . " >> $truser not in passwd file.\n"; my($filename, $path, $suffix) = fileparse($trfile, qr/\.[^.]*/); if ( ((uc $suffix) eq (uc $ext)) and ( $filename =~ m/^(\d\d_\d\d\d\d_|)(DT\d\d\d\d|LOC\d*|GD\d*)$/i or $filename =~ m/^(\d\d_\d\d\d\d_|)(\d\d\d\d\d\d\d\d\d\d\d\d\d\d_)(G201_ID\d\d\d\d_DT\d\d\d\d)$/i) ) { my $unit = getUnitName($trfile); print getTimeStamp("log") . " >> Unit $unit - Filename $trfile\n"; my $outpath = $path . $unit . "/received"; my $trnpath = $path . $unit . "/transmitted"; if ( !-d "$outpath" ) { make_path "$outpath" , {mode => 0755, owner=>$truser, group=>$truser} or warn getTimeStamp("log") . " >> Failed to create path: $outpath"; } if ( !-d "$trnpath" ) { make_path "$trnpath" , {mode => 0755, owner=>$truser, group=>$truser} or warn getTimeStamp("log") . " >> Failed to create path: $trnpath"; } my $timestamp = getTimeStamp(); my $dest = $outpath . "/" . $filename . "_". $timestamp . $suffix; my $send = $trnpath . "/" . $filename . "_". $timestamp . $suffix; if ( !move $trfile, $dest) { warn getTimeStamp("log") . " >> Move $trfile -> $dest failed: $!"; } else { print getTimeStamp("log") . " >> Moved $trfile -> $dest.\n"; chmod 0664 , $dest; my @fname = ($dest); chown $uid, $gid, @fname; } my $ftp = Net::FTP->new($hostname, Timeout => 20, Debug => 0, Passive => 0) or warn getTimeStamp("log") . " >> Cannot connect to $hostname: $@"; if ($ftp->login($username,$password)) { if ($ftp->put($dest, $filename . $suffix)) { if ( !move $dest, $send) { warn getTimeStamp("log") . " >> Move $dest -> $send failed: $!"; } else { print getTimeStamp("log") . " >> Moved $dest -> $send.\n"; } } else { warn getTimeStamp("log") . " >> Put $dest failed ", $ftp->message; } } else { warn getTimeStamp("log") . " >> Cannot login ", $ftp->message; } } } } exit(0);