#!/usr/bin/perl
#/* ========================================
# * ███╗   ███╗██████╗ ██╗ █████╗ ██╗
# * ████╗ ████║██╔══██╗██║██╔══██╗██║
# * ██╔████╔██║██║  ██║██║███████║██║
# * ██║╚██╔╝██║██║  ██║██║██╔══██║██║
# * ██║ ╚═╝ ██║██████╔╝██║██║  ██║███████╗
# * ╚═╝     ╚═╝╚═════╝ ╚═╝╚═╝  ╚═╝╚══════╝
# * ========================================
# * mDial - Omni-Channel Contact Centre Suite.
# * Initially Written by Martin McCarthy.
# * Contributions welcome.
# * Active: 2020 - 2023.
# *
# * This software is licensed under AGPLv2.
# * You can find more information here;
# * https://www.gnu.org/licenses/agpl-3.0.en.html
# * A copy of the license is also shipped with this build.
# *
# * Important note: this software is provided to you free of charge.
# * If you paid for this software, you were ripped off.
# *
# * This project is a fork of the awesome FOSS project, ViCiDial.
# * ViCiDial is copyrighted by Matt Florell and the ViCiDial Group
# * under the AGPLv2 license.
# *
# * You can find out more about ViCiDial;
# * Web: https://www.vicidial.com/
# * Email: Matt Florell <vicidial@gmail.com>
# * IRC: Libera.Chat - ##vicidial
# *
# * Bug reports, feature requests and patches welcome!
# * ======================================== */
$|++;
use Getopt::Long;
my $secX = time();    #Start time
( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) =
  localtime(time);
$year = ( $year + 1900 );
$mon++;
if ( $mon < 10 )  { $mon  = "0$mon"; }
if ( $mday < 10 ) { $mday = "0$mday"; }
if ( $hour < 10 ) { $hour = "0$hour"; }
if ( $min < 10 )  { $min  = "0$min"; }
if ( $sec < 10 )  { $sec  = "0$sec"; }
$now_date = "$year-$mon-$mday $hour:$min:$sec";
my ( $CLOhelp, $SYSLOG, $DB, $DBX );
my (
    $url_id,   $lead_id,  $phone_number, $call_type, $user,
    $uniqueid, $alt_dial, $call_id,      $function
);
my $FULL_LOG = 1;
$url_function = 'other';
$US           = '_';

if ( scalar @ARGV ) {
    GetOptions(
        'help!'        => \$CLOhelp,
        'SYSLOG!'      => \$SYSLOG,
        'url_id=s'     => \$url_id,
        'debug!'       => \$DB,
        'debugX!'      => \$DBX,
        'fulllog!'     => \$FULL_LOG,
        'compat_url=s' => \$compat_url
    );
    $DB = 1 if ($DBX);
    if ($DB) {
        print "\n----- DEBUGGING -----\n\n";
        print "\n----- SUPER-DUPER DEBUGGING -----\n\n" if ($DBX);
        print "  SYSLOG:                $SYSLOG\n"      if ($SYSLOG);
        print "  url_id:                $url_id\n"      if ($url_id);
        print "  compat_url:            $compat_url\n"  if ($compat_url);
        print "\n";
    }
    if ($CLOhelp) {
        print "allowed run time options:\n";
        print "  [--help] = this help screen\n";
        print "  [--SYSLOG] = whether to log actions or not\n";
        print "  [--debug] = debug\n";
        print "  [--debugX] = extra debug\n";
        print
          "  [--compat_url] = full compatible URL to send(not implemented)\n";
        print "required flags:\n";
        print "  [--url_id] = URL ID to run\n";
        print "\n";
        print "You may prefix an option with 'no' to disable it.\n";
        print " ie. --noSYSLOG or --noFULLLOG\n";
        exit 0;
    }
}
$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 =~ /^PATHlogs/ ) && ( $CLIlogs < 1 ) ) {
        $PATHlogs = $line;
        $PATHlogs =~ 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;
    }
    $i++;
}
if ( !$VARDB_port ) { $VARDB_port = '3306'; }
if ( length($url_id) > 0 ) {
    $wgetbin = '';
    if ( -e ('/bin/wget') ) { $wgetbin = '/bin/wget'; }
    else {
        if ( -e ('/usr/bin/wget') ) { $wgetbin = '/usr/bin/wget'; }
        else {
            if ( -e ('/usr/local/bin/wget') ) {
                $wgetbin = '/usr/local/bin/wget';
            }
            else {
                print "Can't find wget binary! Exiting...\n";
                exit;
            }
        }
    }
    use Time::HiRes ( 'gettimeofday', 'usleep', 'sleep' )
      ;    # necessary to have perl sleep command of less than one second
    use DBI;
    $dbhA = DBI->connect( "DBI:mysql:$VARDB_database:$VARDB_server:$VARDB_port",
        "$VARDB_user", "$VARDB_pass" )
      or die "Couldn't connect to database: " . DBI->errstr;
    $stmtA =
"SELECT vd_server_logs,local_gmt,ext_context FROM servers where server_ip = '$VARserver_ip';";
    $sthA = $dbhA->prepare($stmtA) or die "preparing: ",        $dbhA->errstr;
    $sthA->execute                 or die "executing: $stmtA ", $dbhA->errstr;
    $sthArows = $sthA->rows;

    if ( $sthArows > 0 ) {
        @aryA             = $sthA->fetchrow_array;
        $DBvd_server_logs = $aryA[0];
        $DBSERVER_GMT     = $aryA[1];
        $ext_context      = $aryA[2];
        if   ( $DBvd_server_logs =~ /Y/ ) { $SYSLOG = '1'; }
        else                              { $SYSLOG = '0'; }
        if ( length($DBSERVER_GMT) > 0 ) { $SERVER_GMT = $DBSERVER_GMT; }
    }
    $sthA->finish();
    $stmtG = "SELECT url FROM vicidial_url_log where url_log_id='$url_id';";
    $sthA  = $dbhA->prepare($stmtG) or die "preparing: ", $dbhA->errstr;
    $sthA->execute or die "executing: $stmtG ", $dbhA->errstr;
    $url_ct = $sthA->rows;
    if ( $url_ct > 0 ) {
        @aryA = $sthA->fetchrow_array;
        $url  = $aryA[0];
    }
    $sthA->finish();
    if ( length($url) > 5 ) {
        $url =~ s/ /+/gi;
        $url =~ s/&/\\&/gi;
        $url =~ s/'/\\'/gi;
        $url =~ s/"/\\"/gi;
        my $secW = time();
`$wgetbin --no-check-certificate --output-document=/tmp/ASUBtmpD$US$url_id$US$secX --output-file=/tmp/ASUBtmpF$US$url_id$US$secX $url `;
        $event_string =
"$function|$wgetbin --no-check-certificate --output-document=/tmp/ASUBtmpD$US$url_id$US$secX --output-file=/tmp/ASUBtmpF$US$url_id$US$secX $url|";
        &event_logger;
        my $secY         = time();
        my $response_sec = ( $secY - $secW );
        open( Wdoc, "/tmp/ASUBtmpD$US$url_id$US$secX" )
          || die "can't open /tmp/ASUBtmpD$US$url_id$US$secX: $!\n";
        @Wdoc = <Wdoc>;
        close(Wdoc);
        $i            = 0;
        $Wdocline_cat = '';

        foreach (@Wdoc) {
            $Wdocline = $Wdoc[$i];
            $Wdocline =~ s/\n|\r/!/gi;
            $Wdocline =~ s/  |\t|\'|\`//gi;
            $Wdocline_cat .= "$Wdocline";
            $i++;
        }
        if ( length($Wdocline_cat) < 1 ) { $Wdocline_cat = '<RESPONSE EMPTY>'; }
        open( Wfile, "/tmp/ASUBtmpF$US$url_id$US$secX" )
          || die "can't open /tmp/ASUBtmpF$US$url_id$US$secX: $!\n";
        @Wfile = <Wfile>;
        close(Wfile);
        $i             = 0;
        $Wfileline_cat = '';
        foreach (@Wfile) {
            $Wfileline = $Wfile[$i];
            $Wfileline =~ s/\n|\r/!/gi;
            $Wfileline =~ s/  |\t|\'|\`//gi;
            $Wfileline_cat .= "$Wfileline";
            $i++;
        }
        if ( length($Wfileline_cat) < 1 ) { $Wfileline_cat = '<HEADER EMPTY>'; }
        $stmtA =
"UPDATE vicidial_url_log SET url_response='$Wdocline_cat|$Wfileline_cat',response_sec='$response_sec' where url_log_id='$url_id';";
        $affected_rows = $dbhA->do($stmtA);
        if ($DB) { print "$affected_rows|$stmtA\n"; }
    }
    else {
        if ($DB) { print "ERROR: no valid URL found: $url_id|$url\n"; }
    }
}
my $secZ        = time();
my $script_time = ( $secZ - $secX );
if ($DB) { print "DONE execute time: $script_time seconds\n"; }
exit 0;

sub event_logger {
    my ($tms) = @_;
    my ( $sec, $min, $hour, $mday, $mon, $year ) = getTime($tms);
    $now_date =
      $year . '-' . $mon . '-' . $mday . ' ' . $hour . ':' . $min . ':' . $sec;
    $log_date = $year . '-' . $mon . '-' . $mday;
    if ( !$ASULOGfile ) { $ASULOGfile = "$PATHlogs/sendurlbasic.$log_date"; }
    if ($DB)            { print "$now_date|$event_string|\n"; }
    if ($SYSLOG) {
        open( Lout, ">>$ASULOGfile" )
          || die "Can't open $VDRLOGfile: $!\n";
        print Lout "$now_date|$event_string|\n";
        close(Lout);
    }
    $event_string = '';
}

sub getTime {
    my ($tms) = @_;
    $tms = time unless ($tms);
    my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) =
      localtime($tms);
    $year += 1900;
    $mon++;
    $mon  = "0" . $mon  if ( $mon < 10 );
    $mday = "0" . $mday if ( $mday < 10 );
    $min  = "0" . $min  if ( $min < 10 );
    $sec  = "0" . $sec  if ( $sec < 10 );
    return ( $sec, $min, $hour, $mday, $mon, $year );
}
