Commit iniziale

Changes to be committed:
	new file:   AlertNotReceived.pl
	new file:   LoadCSVData.pl
	new file:   UnitCsvReceiverSmart.pl
This commit is contained in:
Alessandro Battilani
2017-08-30 22:33:00 +02:00
commit 134fc78aef
3 changed files with 613 additions and 0 deletions

314
LoadCSVData.pl Normal file
View File

@@ -0,0 +1,314 @@
#!/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/, <FILE>);
my ($unittype, $unit) = split(/\s/, uc <FILE>);
while (my $line = <FILE>) {
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 $$ >> Found 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;