Files
agc_2-X/extras/KHOMP/KHOMP_updater.pl
T
mattf a39afe285b small fix for KHOMP_updater.pl script
git-svn-id: svn://192.168.202.10@3427 3d104415-ff17-0410-8863-d5cf3c621b8a
2021-04-21 22:07:13 +00:00

261 lines
8.3 KiB
Perl

#!/usr/bin/perl
#
# KHOMP_updater.pl
#
# Copyright (C) 2019 Matt Florell <vicidial@gmail.com>, Joe Johnson <freewermadmin@gmail.com> LICENSE: AGPLv2
#
# Script designed to be used as a cron job, where the KHOMP log table in the database will
# be queried for any new KHOMP codes that aren't currently stored in the dialer.
#
# 191105-1355 - First build
#
use DBI;
use Time::Local;
# default path to astguiclient configuration file:
$PATHconf = '/etc/astguiclient.conf';
open(conf, "$PATHconf") || die "can't open $PATHconf: $!\n";
@conf = <conf>;
close(conf);
$i=0;
foreach(@conf)
{
$line = $conf[$i];
$line =~ s/ |>|\n|\r|\t|\#.*|;.*//gi;
if ( ($line =~ /^PATHhome/) && ($CLIhome < 1) )
{$PATHhome = $line; $PATHhome =~ s/.*=//gi;}
if ( ($line =~ /^PATHlogs/) && ($CLIlogs < 1) )
{$PATHlogs = $line; $PATHlogs =~ s/.*=//gi;}
if ( ($line =~ /^PATHagi/) && ($CLIagi < 1) )
{$PATHagi = $line; $PATHagi =~ s/.*=//gi;}
if ( ($line =~ /^PATHweb/) && ($CLIweb < 1) )
{$PATHweb = $line; $PATHweb =~ s/.*=//gi;}
if ( ($line =~ /^PATHsounds/) && ($CLIsounds < 1) )
{$PATHsounds = $line; $PATHsounds =~ s/.*=//gi;}
if ( ($line =~ /^PATHmonitor/) && ($CLImonitor < 1) )
{$PATHmonitor = $line; $PATHmonitor =~ s/.*=//gi;}
if ( ($line =~ /^VARserver_ip/) && ($CLIserver_ip < 1) )
{$VARserver_ip = $line; $VARserver_ip =~ s/.*=//gi;}
if ( ($line =~ /^VARDB_server/) && ($CLIDB_server < 1) )
{$VARDB_server = $line; $VARDB_server =~ s/.*=//gi;}
if ( ($line =~ /^VARDB_database/) && ($CLIDB_database < 1) )
{$VARDB_database = $line; $VARDB_database =~ s/.*=//gi;}
if ( ($line =~ /^VARDB_user/) && ($CLIDB_user < 1) )
{$VARDB_user = $line; $VARDB_user =~ s/.*=//gi;}
if ( ($line =~ /^VARDB_pass/) && ($CLIDB_pass < 1) )
{$VARDB_pass = $line; $VARDB_pass =~ s/.*=//gi;}
if ( ($line =~ /^VARDB_port/) && ($CLIDB_port < 1) )
{$VARDB_port = $line; $VARDB_port =~ s/.*=//gi;}
if ( ($line =~ /^VARREPORT_host/) && ($CLIREPORT_host < 1) )
{$VARREPORT_host = $line; $VARREPORT_host =~ s/.*=//gi;}
if ( ($line =~ /^VARREPORT_user/) && ($CLIREPORT_user < 1) )
{$VARREPORT_user = $line; $VARREPORT_user =~ s/.*=//gi;}
if ( ($line =~ /^VARREPORT_pass/) && ($CLIREPORT_pass < 1) )
{$VARREPORT_pass = $line; $VARREPORT_pass =~ s/.*=//gi;}
if ( ($line =~ /^VARREPORT_port/) && ($CLIREPORT_port < 1) )
{$VARREPORT_port = $line; $VARREPORT_port =~ s/.*=//gi;}
if ( ($line =~ /^VARREPORT_dir/) && ($CLIREPORT_dir < 1) )
{$VARREPORT_dir = $line; $VARREPORT_dir =~ s/.*=//gi;}
$i++;
}
$dbh = DBI->connect("DBI:mysql:$VARDB_database:$VARDB_server:$VARDB_port", "$VARDB_user", "$VARDB_pass")
or die "Couldn't connect to database: " . DBI->errstr;
$dbhB = DBI->connect("DBI:mysql:$VARDB_database:$VARDB_server:$VARDB_port", "$VARDB_user", "$VARDB_pass")
or die "Couldn't connect to database: " . DBI->errstr;
$secX = time();
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year = ($year + 1900);
$mon++;
$rowdate = "$mon/$mday/$year";
if ($mon < 10) {$mon = "0$mon";}
if ($mday < 10) {$mday = "0$mday";}
if ($min < 10) {$min = "0$min";}
if ($hour < 10) {$hour = "0$hour";}
if ($sec < 10) {$sec = "0$sec";}
$run_time="$year-$mon-$mday $hour:$min:$sec";
$time = $secX;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time-14400);
$year = ($year + 1900);
$mon++;
$rowdate = "$mon/$mday/$year";
if ($mon < 10) {$mon = "0$mon";}
if ($mday < 10) {$mday = "0$mday";}
if ($min < 10) {$min = "0$min";}
if ($hour < 10) {$hour = "0$hour";}
if ($sec < 10) {$sec = "0$sec";}
$shipdate = "$year-$mon-$mday";
$start_date = "$year$mon$mday";
$datestamp = "$year/$mon/$mday $hour:$min";
$four_hours_ago = "$year-$mon-$mday $hour:$min:$sec";
$FILEDATE = "$year$mon$mday$hour$min$sec";
$time = $secX;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time-86400*30);
$year = ($year + 1900);
$mon++;
if ($mon < 10) {$mon = "0$mon";}
if ($mday < 10) {$mday = "0$mday";}
if ($min < 10) {$min = "0$min";}
if ($hour < 10) {$hour = "0$hour";}
if ($sec < 10) {$sec = "0$sec";}
$one_month_ago = "$year-$mon-$mday $hour:$min:$sec";
if (length($ARGV[0])>1)
{
$i=0;
while ($#ARGV >= $i)
{
$args = "$args $ARGV[$i]";
$i++;
}
if ($args =~ /--help/i)
{
print "allowed run time options:\n";
print " [--month-check] = Check the entire KHOMP log table for any missing phone patterns from the past month.\n";
print " [--full-check] = Check the entire KHOMP log table for any missing phone patterns - will only execute\n";
print " if no agents are logged in - otherwise the 4-hour window is used.\n";
print " [--custom-check=yyyy-mm-dd] = Check the entire KHOMP log table for any missing phone patterns from the date defined.\n";
print " Date must be in yyyy-mm-dd format or default 4-hour window is used.\n";
print " Use caution if running while agents are dialing to prevent database locking.\n";
print " [-debug] = Verbose debug messages\n";
print " [-debugX] = Extra verbose debug messages\n";
print "\n";
exit;
}
if ($args =~ /--month-check/i)
{
$month_check=1;
}
if ($args =~ /--full-check/i)
{
$full_check=1;
}
if ($args =~ /--custom-check/i)
{
$custom_check=1;
@cdate_array = split(/--custom-check=/,$args);
$custom_date=$cdate_array[1];
$custom_date=~s/ .*//;
$custom_date=~s/[^0-9\-]//g;
}
if ($args =~ /--debug/i)
{
$DB=1;
}
if ($args =~ /--debugX/i)
{
$DB=1;
$DBX=1;
}
}
$run_check=1;
### concurrency check -mandatory per previous line
if ($run_check > 0)
{
my $grepout = `/bin/ps ax | grep $0 | grep -v grep | grep -v '/bin/sh'`;
my $grepnum=0;
$grepnum++ while ($grepout =~ m/\n/g);
if ($grepnum > 1)
{
if ($DB) {print "I am not alone! Another $0 is running! Exiting...\n";}
exit;
}
}
$stmt="select * from vicidial_settings_containers where container_id='KHOMPSTATUSMAP'";
$rslt=$dbh->prepare($stmt);
$rslt->execute();
@row=$rslt->fetchrow_array();
$rslt->finish;
$container_entry=$row[4];
@container_array=split(/\n/, $container_entry);
@khomps_array=();
@new_khomps=();
for ($i=0; $i<scalar(@container_array); $i++) {
@khomp_side=split(/\=\>/, $container_array[$i]);
$khomp_side[0]=~s/^\s+|\s+$//g;
push @khomps_array, $khomp_side[0];
}
$start_date=$four_hours_ago;
$action="4HR CHECK";
if ($custom_check>0) {
if ($custom_date=~/[0-9]{4}\-[0-9]{2}\-[0-9]{2}/) {
$start_date="$custom_date 00:00:00";
$action="CUSTOM DATE CHECK";
} else {
print "\n\nWARNING: custom date is not in valid yyyy-mm-dd format - reverting to default start time of $four_hours_ago\n\n";
}
} elsif ($month_check>0) {
$start_date=$one_month_ago;
$action="MONTH CHECK";
} elsif ($full_check) {
$lc_stmt="select count(*) From live_channels";
if ($DB) {print "$lc_stmt\n";}
$lc_rslt=$dbh->prepare($lc_stmt);
$lc_rslt->execute();
@lc_row=$lc_rslt->fetchrow_array;
$live_channels=$lc_row[0];
$lc_rslt->finish;
$vla_stmt="select count(*) From vicidial_live_agents";
if ($DB) {print "$vla_stmt\n";}
$vla_rslt=$dbh->prepare($vla_stmt);
$vla_rslt->execute();
@vla_row=$vla_rslt->fetchrow_array;
$live_agents=$vla_row[0];
$vla_rslt->finish;
if ($live_channels==0 && $live_agents==0) {
$start_date="2010-01-01";
$action="FULL CHECK";
}
}
$khomp_stmt="select conclusion, pattern from vicidial_khomp_log where start_date>='$start_date'";
if ($DB) {print $khomp_stmt."\n";}
$khomp_rslt=$dbh->prepare($khomp_stmt);
$khomp_rslt->execute();
while(@khomp_row=$khomp_rslt->fetchrow_array) {
if (length($khomp_row[0])>0) {
$khomp_key="\"$khomp_row[0]\"";
if (length($khomp_row[1])>0) {
$khomp_key.=".\"$khomp_row[1]\"";
}
if ( !grep( /^$khomp_key$/, @khomps_array ) ) {
push @new_khomps, $khomp_key;
push @khomps_array, $khomp_key;
}
}
}
$khomp_rslt->finish();
if ($DBX) {foreach (@khomps_array) {print "$_\n";}}
my $new_khomps_str = join ' => \r\n', @new_khomps;
if ($new_khomps_str!~/\s\=\>\s$/) {$new_khomps_str.=" => ";}
$container_entry.="\r\n$new_khomps_str";
$container_entry=~s/\\r\\n/\r\n/gi;
if (scalar(@new_khomps)>0) {
$upd_stmt="update vicidial_settings_containers set container_entry='".$container_entry."' where container_id='KHOMPSTATUSMAP'";
if ($DB) {print $upd_stmt."\n";}
$upd_rslt=$dbh->prepare($upd_stmt);
$upd_rslt->execute();
$upd_rslt->finish;
}
$dbh->disconnect;
$dbhB->disconnect;