diff --git a/SendFtpElabData.pl b/SendFtpElabData.pl new file mode 100755 index 0000000..4794cf0 --- /dev/null +++ b/SendFtpElabData.pl @@ -0,0 +1,194 @@ +#!/usr/bin/perl +use warnings; +use strict; +use DBI; +use Getopt::Long; +use Net::FTP; +use Data::Dumper qw(Dumper); + +$|++; # Autoflush + +my $username = 'ase_lar'; +my $password = 'laravel'; +my $db_name = 'ase_lar'; +my $server = 'localhost'; +my $matlab_timestamp; +my $ftp_send = 1; +my $ftp_addrs; +my $ftp_user; +my $ftp_passwd; +my $ftp_parm; +my $ftp_filename; +my $ftp_target; +my $duedate = ''; +my ( $unit, $tool ); + +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"; + } + if ( defined $p1 and $p1 eq "db_ts" ) { + $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 trxelab { + my $dbh = + DBI->connect( "DBI:mysql:$db_name;host=$server", $username, $password ) + or die getTimeStamp("log") + . " - pid $$ >> Could not connect to database: $DBI::errstr"; + + my $sth = $dbh->prepare( +'select ftp_addrs, ftp_user, ftp_passwd, ftp_parm, ftp_filename, ftp_target, duedate from units + where name = ' . $unit . ';' + ) or die getTimeStamp("log") . " - pid $$ >> $DBI::errstr"; + + $sth->execute(); + if ( $sth->rows eq 0 ) { + die getTimeStamp("log") . " - pid $$ >> No unit ftp params selected.\n"; + } + else { + while ( my $results = $sth->fetchrow_hashref ) { + $ftp_addrs = $results->{'ftp_addrs'}; + $ftp_user = $results->{'ftp_user'}; + $ftp_passwd = $results->{'ftp_passwd'}; + $ftp_parm = $results->{'ftp_parm'}; + $ftp_filename = $results->{'ftp_filename'}; + $ftp_target = $results->{'ftp_target'}; + $duedate = $results->{'duedate'}; + } + } + + $sth->finish; + + # Disconnect + + my $fileelab; + + if ( $ftp_filename eq "" ) { + $fileelab = + '/var/lib/mysql-files/' + . $tool . '_' + . getTimeStamp() + . '.csv'; #mettere quello che si prende da query *** aggiungere $unit + } + else { + $ftp_filename =~ s/(\$\w+)/$1/eeg; + $ftp_filename =~ s/\s/_/g; + $fileelab = + '/var/lib/mysql-files/' + . $ftp_filename . '_' + . getTimeStamp() . '.csv'; + } + + my $sthdo = $dbh->do( + qq{ + select * from ( + select 'ToolNameID', 'EventDate', 'EventTime', 'NodeNum', 'NodeType', 'NodeDepth', + 'XShift', 'YShift', 'ZShift' , 'X', 'Y', 'Z', 'HShift', 'HShiftDir', 'HShift_local', + 'speed', 'speed_local', 'acceleration', 'acceleration_local', 'T_node', 'water_level', 'pressure', 'load_value', 'AlfaX', 'AlfaY', 'CalcErr' + union all + select ToolNameID, EventDate, EventTime, NodeNum, NodeType, NodeDepth, + XShift, YShift, ZShift , X, Y, Z, HShift, HShiftDir, HShift_local, + speed, speed_local, acceleration, acceleration_local, T_node, water_level, pressure, load_value, AlfaX, AlfaY, calcerr + from elabdataview + where UnitName = '$unit' and ToolNameID = '$tool' and updated_at > '$matlab_timestamp' + order by ToolNameID DESC, EventDate, EventTime, convert(`NodeNum`, UNSIGNED INTEGER) DESC + ) resulting_set + into outfile '$fileelab' + fields terminated by ',' optionally enclosed by '"' lines terminated by '\n'} + ) or die getTimeStamp("log") . " - pid $$ >> $DBI::errstr"; + + $dbh->disconnect; + + $ftp_parm //= ""; + $ftp_parm =~ s/\s//g; + + my %ftp_parms = ( 'Host' => $ftp_addrs, ); + $ftp_parms{'Debug'} = 0; + $ftp_parms{'Passive'} = 1; + + foreach my $parm ( split( /,/, $ftp_parm ) ) { + my ( $key, $val ) = split( /=>/, $parm ); + $ftp_parms{$key} = $val; + } + my $name = POSIX::cuserid(); + print getTimeStamp("log") . " - pid $$ >> Current user id: $name\n"; + print getTimeStamp("log") + . " - pid $$ >> $unit - $tool ftp parm:\n" + . Dumper(%ftp_parms); + + if ( !defined $duedate + or ( $duedate eq '0000-00-00 00:00:00' ) + or ( $duedate eq '' ) + or ( $duedate gt getTimeStamp("db_ts") ) ) + { + my $ftp = Net::FTP->new(%ftp_parms) + or die getTimeStamp("log") + . " - pid $$ >> Cannot connect to $ftp_addrs: $@ \n"; + + $ftp->starttls() if exists $ftp_parms{'SSL_version'}; + + $ftp->login( $ftp_user, $ftp_passwd ) + or die getTimeStamp("log") + . " - pid $$ >> Cannot login " + . $ftp->message . "\n"; + + $ftp_target //= ""; + if ( $ftp_target ne "" ) { + $ftp->cwd($ftp_target) + or die getTimeStamp("log") + . " - pid $$ >> Change remote dir failed " + . $ftp->message . "\n"; + } + + print getTimeStamp("log") + . " - pid $$ >> ftp target: " + . $ftp->pwd() . ".\n"; + + $ftp->put($fileelab) + or die getTimeStamp("log") + . " - pid $$ >> Put failed: " + . $ftp->message . "\n"; + + print getTimeStamp("log") + . " - pid $$ >> ftp target lists " + . scalar @{ $ftp->ls() } + . " elements.\n"; + + $ftp->quit; + print getTimeStamp("log") + . " - pid $$ >> $unit - $tool: $fileelab ftp put executed.\n"; + } + else { + print getTimeStamp("log") + . " - pid $$ >> $unit - $tool: $fileelab ftp put didn't executed because due date reached.\n"; + } + return; +} + +my $starttime = getTimeStamp("log"); +print "$starttime - pid $$ >> Start execution.\n"; + +GetOptions( + "matlabts=s" => \$matlab_timestamp, + "unit=s" => \$unit, + "tool=s" => \$tool +) or die("Error in command line arguments\n"); + +if ( $tool eq 'DT0076' ) { + sleep(600); +} + +trxelab(); + +print getTimeStamp("log") . " - pid $$ >> Execution ended.\n"; +exit; \ No newline at end of file