#!/usr/bin/perl use warnings; use strict; use DBI; use Getopt::Long; use Net::FTP; use List::Util qw( max ); use Data::Dumper qw(Dumper); $|++; # Autoflush my ($filename, $sqlout); my $username = 'ase_lar'; my $password = 'laravel'; my $db_lar = 'ase_lar'; my $server = 'localhost'; my $db_name = "ase_mums"; my $table = "RAWDATA"; my (@CSVData, @sql); my $outcount = 0; my $outfilenum = 0; my $maxsqllines = 10000; my ($tool, $toolbatt, $tooltemp, $tooltype, @channels, @NewData, @din, @nodetype); my $matlab_ip = "160.78.21.71"; my $matlab_cmd = "matlab.cmd"; 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 $unit_id; 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 writeOutSql { my ($tn) = @_; my $outfile = $sqlout . "_" . $outfilenum++; open SQLOUT, ">", $outfile or die(getTimeStamp("log") . " - pid $$ >> Error: opening output file " . $outfile . ":$!\n"); print getTimeStamp("log") . " - pid $$ >> file $outfile created\n"; print SQLOUT "/* lock " . $db_name . ".$table table */\nLOCK TABLES " . $db_name . ".$table WRITE;\n"; print SQLOUT "INSERT IGNORE INTO " . $db_name . ".$table\n"; print SQLOUT "(`UnitName`,`ToolNameID`,`NodeNum`,`EventDate`,`EventTime`,`BatLevel`,`Temperature`,\n"; print SQLOUT "`Val0`,`Val1`,`Val2`,`Val3`,`Val4`,`Val5`,`Val6`,`Val7`,`Val8`,`Val9`,`ValA`,`ValB`,`ValC`,`ValD`,`ValE`,`ValF`)\n"; print SQLOUT "VALUES\n"; print SQLOUT @sql; @sql = (); print SQLOUT "/* unlock table */\nUNLOCK TABLES;\n"; print SQLOUT "/* call stored procedure to copy in ase_lar */\ncall ase_lar.CopyAndFill('$tn');\n"; close SQLOUT or die(getTimeStamp("log") . " - pid $$ >> Error in closing file " . $outfile . "\n"); my @args = ("mysql", "--login-path=asepath", "-e source " . $outfile); system(@args) == 0 or die (getTimeStamp("log") . " - pid $$ >> system @args failed: $?\n"); print getTimeStamp("log") . " - pid $$ >> file $outfile loaded into DB\n"; unlink $outfile; return; } sub matlabCalc { getMatlabCmd(); $matlab_timestamp = getTimeStamp("db_ts"); print getTimeStamp("log") . " - pid $$ >> $tool MatLab calc started...\n"; my @out_matlab = `ssh1 $matlab_ip 'cmd /c $matlab_cmd ' $tool`; print getTimeStamp("log") . " - pid $$ >> $tool MatLab calc executed: $out_matlab[-1]"; #print getTimeStamp("log") . " - @out_matlab"; #print getTimeStamp("log") . " - pid $$ >> $out_matlab[-1]"; return; } sub trxelab { my $dbh = DBI->connect("DBI:mysql:$db_lar;host=$server", $username, $password) or die getTimeStamp("log") . " - Could not connect to database: $DBI::errstr"; my $sth = $dbh->prepare('select ftp_addrs, ftp_user, ftp_passwd, ftp_parm, ftp_filename, ftp_target from units where id = ' . $unit_id . ';') or die getTimeStamp("log") . " - $DBI::errstr"; $sth->execute(); if ($sth->rows < 0) { die getTimeStamp("log") . " - 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'}; } } $sth->finish; # Disconnect my $fileelab; if ($ftp_filename eq "") { $fileelab = '/var/lib/mysql-files/' . $tool . '_' . getTimeStamp() . '.csv'; #mettere quello che si prende da query } 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', 'week_shift', 'week_shift_x', 'week_shift_y', 'week_shift_z', 'T_node', 'water_level', 'pressure', 'load_value' ) union all ( select ToolNameID, EventDate, EventTime, NodeNum, NodeType, NodeDepth, XShift, YShift, ZShift , X, Y, Z, HShift, HShiftDir, HShift_local, week_shift, week_shift_x, week_shift_y, week_shift_z, T_node, water_level, pressure, load_value from ElabDataView where ToolNameID = '$tool' and created_at > '$matlab_timestamp' order by EventDate, EventTime, NodeDepth ) ) resulting_set into outfile '$fileelab' fields terminated by ',' optionally enclosed by '"' lines terminated by '\n'}) or die getTimeStamp("log") . " - $DBI::errstr"; $dbh->disconnect; $ftp_parm //= ""; if ($ftp_parm ne "") { $ftp_parm = "debug => 0, " . $ftp_parm; } else { $ftp_parm = "debug => 0"; } print getTimeStamp("log") . " - pid $$ >> $tool: ftp parm = $ftp_parm.\n"; my $ftp = Net::FTP->new($ftp_addrs, debug => 0) or die getTimeStamp("log") . " - pid $$ >> Cannot connect to $ftp_addrs: $@ \n"; $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"; $ftp->quit; print getTimeStamp("log") . " - pid $$ >> $tool: $fileelab ftp put executed.\n"; return; } sub getNodesType { my $dbh = DBI->connect("DBI:mysql:$db_lar;host=$server", $username, $password) or die getTimeStamp("log") . " - Could not connect to database: $DBI::errstr"; my $sth = $dbh->prepare('select t.name as name, n.seq as seq, n.num as num, n.channels as channels, y.type as type, n.din as din from nodes as n inner join tools as t on t.id = n.tool_id inner join nodetypes as y on n.nodetype_id = y.id where t.name = "' . $tool . '" order by 3;') or die getTimeStamp("log") . " - $DBI::errstr"; $sth->execute(); if ($sth->rows < 0) { die getTimeStamp("log") . " - No node channels selected.\n"; } else { my $row = 0; while (my $results = $sth->fetchrow_hashref) { $channels[$row] = $results->{'channels'}; $nodetype[$row] = $results->{'type'}; $din[$row++] = $results->{'din'}; } } $sth->finish; # Disconnect $dbh->disconnect; return; } sub getMatlabCmd { my $dbh = DBI->connect("DBI:mysql:$db_lar;host=$server", $username, $password) or die getTimeStamp("log") . " - Could not connect to database: $DBI::errstr"; my $sth = $dbh->prepare('select m.matcall, t.ftp_send , t.unit_id from matfuncs as m inner join tools as t on t.matfunc = m.id where t.name = "' . $tool . '" ;') or die getTimeStamp("log") . " - $DBI::errstr"; $sth->execute(); if ($sth->rows < 0) { die getTimeStamp("log") . " - No tool's matlab function selected.\n"; } else { my $mfunc; while (my $results = $sth->fetchrow_hashref) { $mfunc = uc $results->{'matcall'}; $ftp_send = $results->{'ftp_send'}; $unit_id = $results->{'unit_id'}; } $matlab_cmd = 'matlab_' . $mfunc . '.cmd'; } $sth->finish; # Disconnect $dbh->disconnect; return; } my $starttime = getTimeStamp("log"); print "$starttime - pid $$ >> Start execution.\n"; GetOptions ("filename=s" => \$filename, "sqlout=s" => \$sqlout, "dbname=s" => \$db_name) or die("Error in command line arguments\n"); open FILE, $filename or die("Error: opening input file " . $filename . "\n"); my ($fileDate, $fileTime) = split(/\s/, ); my ($unittype, $unit) = split(/\s/, uc ); while (my $line = ) { my($first, $NodeData) = split(/;/, $line, 2); if ( defined $first and ($first ne '')) { if ( ! defined $NodeData or ($NodeData =~ m/^;+/) ) { my @info = (split(/[\/,\.]/, $first)); if (defined $info[3] && $info[3] =~ m/^DT\d\d\d\d$/i ) { $tool= uc $info[3]; $tooltype = uc $info[2]; print getTimeStamp("log") . " - pid $$ >> Found $tooltype tool name: $tool\n"; getNodesType(); } elsif (defined $info[2] && $info[2] =~ m/^LOC\d*$/i ) { $tool= uc $info[2]; $tooltype = 'LOC'; print getTimeStamp("log") . " - pid $$ >> Found $tooltype tool name: $tool\n"; getNodesType(); } } else { $NodeData =~ s/\x0d{0,1}\x0a\Z//s; #$NodeData =~ s/\r\n\z//; if ($tooltype eq "MUX" ) { #$NodeData =~ s/Dis\./N\/A/g; @NewData = grep /\S/, split(/\||;/,$NodeData); my $idx = 0; $CSVData[$idx++] = join( ';', splice(@NewData, 0, 2)); foreach my $ch (@channels) { $CSVData[$idx++] = join( ';', splice(@NewData, 0, $ch)); } #print Dumper \@NewData; #print Dumper \@din; } elsif ($tooltype eq "LOC") { if (!defined $din[0]) { print getTimeStamp("log") . " - pid $$ >> Din not defined.\n"; print getTimeStamp("log") . " - pid $$ >> Execution ended.\n"; exit; }; my ($Vbat, $Tmod, $Ain1, $Ain2, $Din1, $Din2) = split(/;/,$NodeData); $CSVData[0] = $Vbat . ";" . $Tmod; $CSVData[1] = $Din1; } else { @CSVData = split(/\|/,$NodeData); } my $nodenum = 0; foreach (@CSVData) { $sql[($outcount%$maxsqllines)] = ""; my(@data) = grep {/\S/} split(/\;/,$_); if ($nodenum eq 0) { $toolbatt = $data[0]; $tooltemp = $data[1]; } else { my($y, $m, $d, $t) = split(/[\s\/]/,$first); foreach (@data) { if ($sql[($outcount%$maxsqllines)] eq "") { $sql[($outcount%$maxsqllines)] = "('$unit','$tool','$nodenum','$y-$m-$d','$t','$toolbatt','$tooltemp'"; } $sql[($outcount%$maxsqllines)] .= ",'" . $_ . "'"; } my $InsCompl = ",NULL" x (15 - $#data); $sql[($outcount%$maxsqllines)] .= $InsCompl . ")"; if (++$outcount%$maxsqllines eq 0) { $sql[($outcount%$maxsqllines)-1] .= ";\n"; writeOutSql($tool); } else { $sql[($outcount%$maxsqllines)-1] .= ",\n"; } } $nodenum++; } } } } close FILE; $sql[($outcount%$maxsqllines)-1] =~ s/,$/;/g; writeOutSql($tool); matlabCalc(); if ($ftp_send) { trxelab(); } print getTimeStamp("log") . " - pid $$ >> Execution ended.\n"; exit;