#!/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!
# * ======================================== */
$script = 'agi-VDAD_RINGALL.agi';
( $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_epoch = time();
$now_date       = "$year-$mon-$mday $hour:$min:$sec";
$now_num        = "$year$mon$mday$hour$min$sec";
$CIDdate        = "$mon$mday$hour$min$sec";
$S              = '*';
$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;
    }
    $i++;
}
if ( !$VARDB_port ) { $VARDB_port = '3306'; }
if ( !$AGILOGfile ) { $AGILOGfile = "$PATHlogs/agiout.$year-$mon-$mday"; }
use DBI;
use Asterisk::AGI;
$AGI  = new Asterisk::AGI;
$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 agi_output,ext_context,asterisk_version 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 ) {
    $AGILOG           = '0';
    @aryA             = $sthA->fetchrow_array;
    $DBagi_output     = $aryA[0];
    $ext_context      = $aryA[1];
    $asterisk_version = $aryA[2];
    if ( $DBagi_output =~ /STDERR/ ) { $AGILOG = '1'; }
    if ( $DBagi_output =~ /FILE/ )   { $AGILOG = '2'; }
    if ( $DBagi_output =~ /BOTH/ )   { $AGILOG = '3'; }
}
$sthA->finish();
$| = 1;
while (<STDIN>) {
    chomp;
    last unless length($_);
    if ($AGILOG) {
        if (/^agi_(\w+)\:\s+(.*)$/) {
            $AGI{$1} = $2;
        }
    }
    if (/^agi_uniqueid\:\s+(.*)$/)     { $unique_id    = $1; }
    if (/^agi_channel\:\s+(.*)$/)      { $channel      = $1; }
    if (/^agi_extension\:\s+(.*)$/)    { $extension    = $1; }
    if (/^agi_type\:\s+(.*)$/)         { $type         = $1; }
    if (/^agi_callerid\:\s+(.*)$/)     { $callerid     = $1; }
    if (/^agi_calleridname\:\s+(.*)$/) { $calleridname = $1; }
    if ( $calleridname =~ /\"/ )       { $calleridname =~ s/\"//gi; }

    if (
           ( !$callerid )
        or ( $callerid =~ /unknown/ )
        or (   ( $calleridname =~ /\d\d\d\d\d\d\d\d\d/ )
            && ( length($calleridname) > 16 ) )
      )
    {
        $callerid = $calleridname;
    }
    if ( ( $callerid =~ / / ) && ( length($callerid) > 20 ) ) {
        $callerid =~ s/ .*//gi;
    }
    $calleridname = $callerid;
    if ( $extension =~ /^8331\*\d/ ) {
        @EXTEN_vars    = split( /\*/, $extension );
        $auto_call_id  = $EXTEN_vars[1];
        $call_callerid = $EXTEN_vars[2];
        $dial_user     = $EXTEN_vars[3];
        $phone_exten   = $EXTEN_vars[4];
        $channel_root  = $channel;
        $channel_root =~ s/\,.*//gi;
    }
}
if ($AGILOG) { $agi_string = "AGI Environment Dump:"; &agi_output; }
foreach $i ( sort keys %AGI ) {
    if ($AGILOG) { $agi_string = " -- $i = $AGI{$i}"; &agi_output; }
}
if ($AGILOG) {
    $agi_string =
"AGI Variables: |$unique_id|$channel|$extension|$type|$callerid|$auto_call_id|";
    &agi_output;
}
if ($AGILOG) { $agi_string = "RING-AGENT AGI STARTED"; &agi_output; }
if ( $channel =~ /^Local/ ) {
    $AGI->stream_file('sip-silence');
    $AGI->stream_file('sip-silence');
    $AGI->stream_file('sip-silence');
    if ($AGILOG) {
        $agi_string = "RING-ALL AGI Local Channel, exiting...";
        &agi_output;
    }
    exit;
}
$stmtA =
"SELECT campaign_id,call_type,extension,phone_number,lead_id,callerid FROM vicidial_auto_calls where auto_call_id='$auto_call_id';";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",        $dbhA->errstr;
$sthA->execute                 or die "executing: $stmtA ", $dbhA->errstr;
$VACcount = $sthA->rows;
if ( $VACcount > 0 ) {
    @aryA             = $sthA->fetchrow_array;
    $VAC_campaign_id  = $aryA[0];
    $VAC_call_type    = $aryA[1];
    $VAC_extension    = $aryA[2];
    $VAC_phone_number = $aryA[3];
    $VAC_lead_id      = $aryA[4];
    $VAC_call_id      = $aryA[5];
    if ($AGILOG) {
        $agi_string =
"--    VAC Call Found: |$callerid|$VAC_campaign_id|$VAC_call_type|$VAC_extension|$VAC_phone_number|$VAC_lead_id|$auto_call_id|";
        &agi_output;
    }
    $sthA->finish();
}
else {
    if ($AGILOG) {
        $agi_string =
          "--    VAC Call Not Found, exiting: |$callerid|$auto_call_id|";
        &agi_output;
    }
    $AGI->stream_file('buzz');
    $AGI->hangup();
    exit;
}
$stmtA =
"SELECT conf_exten,extension,server_ip,ra_user,campaign_id from vicidial_live_agents WHERE user='$dial_user' and status IN('READY','CLOSER');";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",        $dbhA->errstr;
$sthA->execute                 or die "executing: $stmtA ", $dbhA->errstr;
$VLAcount = $sthA->rows;
if ( $VLAcount > 0 ) {
    @aryA           = $sthA->fetchrow_array;
    $VLAconf_exten  = $aryA[0];
    $VLAextension   = $aryA[1];
    $VLAserver_ip   = $aryA[2];
    $VLAra_user     = $aryA[3];
    $VLAcampaign_id = $aryA[4];
    if ($AGILOG) {
        $agi_string =
"--    VLA Agent Found: |$callerid|$VLAconf_exten|$VLAextension|$VLAserver_ip|$VLAra_user|$VLAcampaign_id|$auto_call_id|";
        &agi_output;
    }
    $sthA->finish();
}
else {
    if ($AGILOG) {
        $agi_string =
"--    VLA Agent Not Found, exiting: |$callerid|$auto_call_id|$dial_user|";
        &agi_output;
    }
    $AGI->stream_file('buzz');
    $AGI->hangup();
    exit;
}
$stmtA =
"SELECT user,extension,conf_exten,server_ip FROM vicidial_live_agents where ring_callerid='$call_callerid';";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",        $dbhA->errstr;
$sthA->execute                 or die "executing: $stmtA ", $dbhA->errstr;
$sthArows   = $sthA->rows;
$orAGENTct  = 0;
$RINGct     = 0;
$user_phone = '';

while ( $sthArows > $RINGct ) {
    @aryA                        = $sthA->fetchrow_array;
    $ringVLA_user[$RINGct]       = $aryA[0];
    $ringVLA_exten[$RINGct]      = $aryA[1];
    $ringVLA_conf_exten[$RINGct] = $aryA[2];
    $ringVLA_server_ip[$RINGct]  = $aryA[3];
    $ring_user                   = $aryA[0];
    if ($AGILOG) {
        $agi_string =
"--    Ringing agents for this call: |$call_callerid|$RINGct|$ringVLA_user[$RINGct]|$ringVLA_exten[$RINGct]|$ringVLA_conf_exten[$RINGct]|$ringVLA_server_ip[$RINGct]|";
        &agi_output;
    }
    if ( $dial_user =~ /^$ring_user$/ ) {
        $user_phone = $ringVLA_exten[$RINGct];
    }
    else {
        $orVLA_user[$orAGENTct]       = $aryA[0];
        $orVLA_exten[$orAGENTct]      = $aryA[1];
        $orVLA_conf_exten[$orAGENTct] = $aryA[2];
        $orVLA_server_ip[$orAGENTct]  = $aryA[3];
        if ( $orVLA_exten[$orAGENTct] =~ /^R\// ) {
            $orVLA_exten[$orAGENTct] =
              "Local/" . $orVLA_conf_exten[$orAGENTct] . "\@default";
        }
        $orAGENTct++;
    }
    $RINGct++;
}
$sthA->finish();
if ($AGILOG) {
    $agi_string =
      "--    Ringing stats: |$call_callerid|$RINGct|$orAGENTct|$user_phone|";
    &agi_output;
}
$stmtA =
"SELECT count(*) FROM vicidial_auto_calls where auto_call_id='$auto_call_id' and agent_grab='';";
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",        $dbhA->errstr;
$sthA->execute                 or die "executing: $stmtA ", $dbhA->errstr;
$NAGcount = $sthA->rows;
if ( $NAGcount > 0 ) {
    @aryA              = $sthA->fetchrow_array;
    $not_grabbed_count = $aryA[0];
    $sthA->finish();
    if ( $not_grabbed_count > 0 ) {
        if ( $VLAextension =~ /^R\// ) {
            $stmtA =
"SELECT count(*) FROM vicidial_conferences where server_ip='$VLAserver_ip' and ((extension='') or (extension is null)) and conf_exten != '$VLAconf_exten';";
            $sthA = $dbhA->prepare($stmtA) or die "preparing: ", $dbhA->errstr;
            $sthA->execute or die "executing: $stmtA ",          $dbhA->errstr;
            $AVCcount = $sthA->rows;
            if ( $AVCcount > 0 ) {
                @aryA               = $sthA->fetchrow_array;
                $available_sessions = $aryA[0];
                $sthA->finish();
                if ( $available_sessions > 0 ) {
                    $stmtA =
"UPDATE vicidial_conferences set extension='3WAY_$dial_user', leave_3way='1', leave_3way_datetime='$now_date' where server_ip='$VLAserver_ip' and ((extension='') or (extension is null)) and conf_exten != '$VLAconf_exten' limit 1;";
                    $AVCaffected_rows = $dbhA->do($stmtA);
                    if ( $AVCaffected_rows > 0 ) {
                        $stmtA =
"SELECT conf_exten from vicidial_conferences where server_ip='$VLAserver_ip' and extension='3WAY_$dial_user' and leave_3way_datetime='$now_date' and conf_exten != '$VLAconf_exten';";
                        $sthA = $dbhA->prepare($stmtA)
                          or die "preparing: ", $dbhA->errstr;
                        $sthA->execute
                          or die "executing: $stmtA ", $dbhA->errstr;
                        $SVCcount = $sthA->rows;
                        if ( $SVCcount > 0 ) {
                            @aryA          = $sthA->fetchrow_array;
                            $VLAconf_exten = $aryA[0];
                            $sthA->finish();
                            if ($AGILOG) {
                                $agi_string =
"--    AVC Session Reserved: |$callerid|$auto_call_id|$dial_user|3WAY_$dial_user|$now_date|$VLAconf_exten|";
                                &agi_output;
                            }
                            if ( length($VLAcampaign_id) > 0 ) {
                                $stmtA =
"SELECT campaign_recording,campaign_rec_filename FROM vicidial_campaigns where campaign_id='$VLAcampaign_id';";
                                $sthA = $dbhA->prepare($stmtA)
                                  or die "preparing: ", $dbhA->errstr;
                                $sthA->execute
                                  or die "executing: $stmtA ", $dbhA->errstr;
                                $VCRcount = $sthA->rows;
                                if ( $VCRcount > 0 ) {
                                    @aryA               = $sthA->fetchrow_array;
                                    $campaign_recording = $aryA[0];
                                    $campaign_rec_filename = $aryA[1];
                                }
                                $sthA->finish();
                            }
                            if ( length($VLAra_user) > 0 ) {
                                $stmtA =
"SELECT vicidial_recording_override,vicidial_recording FROM vicidial_users where user='$VLAra_user';";
                                $sthA = $dbhA->prepare($stmtA)
                                  or die "preparing: ", $dbhA->errstr;
                                $sthA->execute
                                  or die "executing: $stmtA ", $dbhA->errstr;
                                $sthArowsVUrec = $sthA->rows;
                                if ( $sthArowsVUrec > 0 ) {
                                    @aryA = $sthA->fetchrow_array;
                                    if ( $aryA[0] !~ /DISABLED/ ) {
                                        $campaign_recording = $aryA[0];
                                    }
                                    if ( $aryA[1] < 1 ) {
                                        $campaign_recording = 'NONE';
                                    }
                                }
                                $sthA->finish();
                            }
                            if ( $campaign_recording =~ /ALLCALLS|ALLFORCE/ ) {
                                $stmtA =
"SELECT vendor_lead_code FROM vicidial_list where lead_id='$VAC_lead_id';";
                                $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;
                                    $vendor_lead_code = $aryA[0];
                                }
                                $sthA->finish();
                                (
                                    $sec,  $min,  $hour, $mday, $mon,
                                    $year, $wday, $yday, $isdst
                                ) = localtime(time);
                                $year  = ( $year + 1900 );
                                $Tyear = ( $year - 2000 );
                                $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_epoch = time();
                                $now_date = "$year-$mon-$mday $hour:$min:$sec";
                                $recdate  = "$year$mon$mday-$hour$min$sec";
                                $tinydate = "$Tyear$mon$mday$hour$min$sec";
                                $campaign_rec_filename =~
                                  s/CAMPAIGN/$VLAcampaign_id/gi;
                                $campaign_rec_filename =~
                                  s/INGROUP/$VAC_campaign_id/gi;
                                $campaign_rec_filename =~
                                  s/CUSTPHONE/$VAC_phone_number/gi;
                                $campaign_rec_filename =~
                                  s/FULLDATE/$recdate/gi;
                                $campaign_rec_filename =~
                                  s/TINYDATE/$tinydate/gi;
                                $campaign_rec_filename =~
                                  s/EPOCH/$now_date_epoch/gi;
                                $campaign_rec_filename =~ s/AGENT/$dial_user/gi;
                                $campaign_rec_filename =~
                                  s/VENDORLEADCODE/$vendor_lead_code/gi;
                                $campaign_rec_filename =~
                                  s/LEADID/$VAC_lead_id/gi;
                                $campaign_rec_filename =~
                                  s/CALLID/$VAC_call_id/gi;
                                $campaign_rec_filename =~ s/\"|\'//gi;
                                %ast_ver_str =
                                  parse_asterisk_version($asterisk_version);

                                if (   ( $ast_ver_str{major} = 1 )
                                    && ( $ast_ver_str{minor} < 6 ) )
                                {
                                    $AGI->exec(
"Monitor wav|/var/spool/asterisk/monitor/MIX/$campaign_rec_filename"
                                    );
                                }
                                else {
                                    $AGI->exec( "Monitor",
"wav,/var/spool/asterisk/monitor/MIX/$campaign_rec_filename"
                                    );
                                }
                                $stmtA =
"INSERT INTO recording_log (channel,server_ip,extension,start_time,start_epoch,length_in_sec,filename,lead_id,user,location,vicidial_id) values('$channel','$VARserver_ip','$VAC_phone_number','$now_date','$now_date_epoch','0','$campaign_rec_filename','$VAC_lead_id','$dial_user','$campaign_rec_filename','$uniqueid');";
                                $RLRAaffected_rows = $dbhA->do($stmtA);
                                if ($AGILOG) {
                                    $agi_string =
"--    REMOTE RECORDING STARTED : |$RLRAaffected_rows|$campaign_rec_filename|$stmtA|";
                                    &agi_output;
                                }
                            }
                        }
                        else {
                            if ($AGILOG) {
                                $agi_string =
"--    AVC No Available Sessions(SELECT3), exiting: |$VLAserver_ip|$auto_call_id|$dial_user|$VLAextension$now_num|";
                                &agi_output;
                            }
                            $AGI->stream_file('buzz');
                            $AGI->hangup();
                            exit;
                        }
                    }
                    else {
                        if ($AGILOG) {
                            $agi_string =
"--    AVC No Available Sessions(UPDATE), exiting: |$VLAserver_ip|$auto_call_id|$dial_user|";
                            &agi_output;
                        }
                        $AGI->stream_file('buzz');
                        $AGI->hangup();
                        exit;
                    }
                }
                else {
                    if ($AGILOG) {
                        $agi_string =
"--    AVC No Available Sessions(SELECT2), exiting: |$VLAserver_ip|$auto_call_id|$dial_user|";
                        &agi_output;
                    }
                    $AGI->stream_file('buzz');
                    $AGI->hangup();
                    exit;
                }
            }
            else {
                if ($AGILOG) {
                    $agi_string =
"--    AVC No Available Sessions(SELECT), exiting: |$VLAserver_ip|$auto_call_id|$dial_user|";
                    &agi_output;
                }
                $AGI->stream_file('buzz');
                $AGI->hangup();
                exit;
            }
        }
        $stmtA =
"UPDATE vicidial_auto_calls SET agent_grab='$dial_user',agent_grab_extension='$VLAconf_exten' where auto_call_id='$auto_call_id' and agent_grab='';";
        $AGaffected_rows = $dbhA->do($stmtA);
        if ( $AGaffected_rows > 0 ) {
            if ($AGILOG) {
                $agi_string =
"--    VAC Call Grabbed: |$callerid|$auto_call_id|$dial_user|$AGaffected_rows|";
                &agi_output;
            }
            $VIG_next_agent_call = '';
            $stmtA =
"SELECT next_agent_call FROM vicidial_inbound_groups where group_id='$VAC_campaign_id';";
            $sthA = $dbhA->prepare($stmtA) or die "preparing: ", $dbhA->errstr;
            $sthA->execute or die "executing: $stmtA ",          $dbhA->errstr;
            $VIGcount = $sthA->rows;
            if ( $VIGcount > 0 ) {
                @aryA                = $sthA->fetchrow_array;
                $VIG_next_agent_call = $aryA[0];
                if ($AGILOG) {
                    $agi_string =
"--    Check for in-group next agent call setting: |$callerid|$VAC_campaign_id|$VIG_next_agent_call|";
                    &agi_output;
                }
                $sthA->finish();
            }
            if ( ( $VIG_next_agent_call =~ /ring_all/i ) && ( $orAGENTct > 0 ) )
            {
                $stmtA =
"SELECT channel,server_ip FROM live_sip_channels where extension='ring';";
                $sthA = $dbhA->prepare($stmtA)
                  or die "preparing: ", $dbhA->errstr;
                $sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
                $sthArows  = $sthA->rows;
                $rec_count = 0;
                while ( $sthArows > $rec_count ) {
                    @aryA                       = $sthA->fetchrow_array;
                    $LSC_channel[$rec_count]    = $aryA[0];
                    $LSC_server_ip[$rec_count]  = $aryA[1];
                    $LSC_channelREG[$rec_count] = $aryA[0];
                    $LSC_channelREG[$rec_count] =~ s/\*/STARSYM/gi;
                    $LSC_channelREG[$rec_count] =~ s/\@/ATSYM/gi;
                    if ($AGILOG) {
                        $agi_string =
"--    Other ringing channels: |$rec_count|$LSC_channel[$rec_count]|$LSC_server_ip[$rec_count]|";
                        &agi_output;
                    }
                    $rec_count++;
                }
                $sthA->finish();
                if ( $rec_count > 0 ) {
                    $orct = 0;
                    foreach (@orVLA_exten) {
                        $exten_match = '';
                        if ( $orVLA_exten[$orct] =~ /^Local\// ) {
                            $orVLA_exten[$orct] =~ s/^Local\/|\@.*//gi;
                            $exten_match =
                              "STARSYM" . $orVLA_exten[$orct] . "ATSYM";
                        }
                        if ( $orVLA_exten[$orct] =~ /^SIP/i ) {
                            $orVLA_exten[$orct] =~ s/^SIP\///gi;
                            $stmtA =
"SELECT dialplan_number FROM phones where extension='$orVLA_exten[$orct]' and server_ip='$orVLA_server_ip[$orct]' and protocol='SIP';";
                            $sthA = $dbhA->prepare($stmtA)
                              or die "preparing: ", $dbhA->errstr;
                            $sthA->execute
                              or die "executing: $stmtA ", $dbhA->errstr;
                            $Pcount = $sthA->rows;
                            if ( $Pcount > 0 ) {
                                @aryA             = $sthA->fetchrow_array;
                                $Pdialplan_number = $aryA[0];
                                $exten_match =
                                  "STARSYM" . $Pdialplan_number . "ATSYM";
                            }
                            $sthA->finish();
                        }
                        if ( $orVLA_exten[$orct] =~ /^IAX/i ) {
                            $orVLA_exten[$orct] =~ s/^IAX2\/|^IAX\///gi;
                            $stmtA =
"SELECT dialplan_number FROM phones where extension='$orVLA_exten[$orct]' and server_ip='$orVLA_server_ip[$orct]' and protocol='IAX2';";
                            $sthA = $dbhA->prepare($stmtA)
                              or die "preparing: ", $dbhA->errstr;
                            $sthA->execute
                              or die "executing: $stmtA ", $dbhA->errstr;
                            $Pcount = $sthA->rows;
                            if ( $Pcount > 0 ) {
                                @aryA             = $sthA->fetchrow_array;
                                $Pdialplan_number = $aryA[0];
                                $exten_match =
                                  "STARSYM" . $Pdialplan_number . "ATSYM";
                            }
                            $sthA->finish();
                        }
                        if ( $orVLA_exten[$orct] =~ /^Zap|^DAHDI/i ) {
                            $orVLA_exten[$orct] =~ s/^Zap\/|^DAHDI\///gi;
                            $stmtA =
"SELECT dialplan_number FROM phones where extension='$orVLA_exten[$orct]' and server_ip='$orVLA_server_ip[$orct]' and protocol='Zap';";
                            $sthA = $dbhA->prepare($stmtA)
                              or die "preparing: ", $dbhA->errstr;
                            $sthA->execute
                              or die "executing: $stmtA ", $dbhA->errstr;
                            $Pcount = $sthA->rows;
                            if ( $Pcount > 0 ) {
                                @aryA             = $sthA->fetchrow_array;
                                $Pdialplan_number = $aryA[0];
                                $exten_match =
                                  "STARSYM" . $Pdialplan_number . "ATSYM";
                            }
                            $sthA->finish();
                        }
                        if ( length($exten_match) > 2 ) {
                            $lscct = 0;
                            foreach (@LSC_channel) {
                                if ( $LSC_channelREG[$lscct] =~ /$exten_match/ )
                                {
                                    if ($AGILOG) {
                                        $agi_string =
"--    Chan to hangup: |$callerid|$exten_match|$LSC_channel[$lscct]|$LSC_server_ip[$lscct]|";
                                        &agi_output;
                                    }
                                    $VHqueryCID = "RGHANGUP$CIDdate$lscct";
                                    $stmtA =
"INSERT INTO vicidial_manager values('','','$now_date','NEW','N','$VARserver_ip','','Hangup','$VHqueryCID','Channel: $LSC_channel[$lscct]','','','','','','','','','')";
                                    $AGaffected_rows = $dbhA->do($stmtA);
                                    if ($AGILOG) {
                                        $agi_string =
"--    Other Ringing Hangup Sent: |$callerid|$AGaffected_rows|$LSC_channel[$lscct]|$VHqueryCID|";
                                        &agi_output;
                                    }
                                }
                                $lscct++;
                            }
                        }
                        $orct++;
                    }
                }
            }
            if ( $VLAserver_ip =~ m/(\S+)\.(\S+)\.(\S+)\.(\S+)/ ) {
                $a           = leading_zero($1);
                $b           = leading_zero($2);
                $c           = leading_zero($3);
                $d           = leading_zero($4);
                $VLA_DIALstr = "$a$S$b$S$c$S$d$S";
            }
            $VLA_DIALstr .= "7$VLAconf_exten";
            $AGI->stream_file('sip-silence');
            $AGI->stream_file('sip-silence');
            $AGI->stream_file('sip-silence');
            $AGI->stream_file('sip-silence');
            if ($AGILOG) {
                $agi_string =
"--    Ring-Agent Sending Call: |$callerid|$auto_call_id|$dial_user|$VLA_DIALstr|";
                &agi_output;
            }
            print "SET CONTEXT $ext_context\n";
            $result = <STDIN>;
            checkresult($result);
            print "SET EXTENSION $VLA_DIALstr\n";
            $result = <STDIN>;
            checkresult($result);
            print "SET PRIORITY 1\n";
            $result = <STDIN>;
            checkresult($result);
            $dbhA->disconnect();
            exit;
        }
        else {
            if ($AGILOG) {
                $agi_string =
"--    VAC Call Already Grabbed(UPDATE2), exiting: |$callerid|$auto_call_id|$dial_user|$AGaffected_rows|";
                &agi_output;
            }
            $AGI->stream_file('buzz');
            $AGI->hangup();
            exit;
        }
    }
    else {
        if ($AGILOG) {
            $agi_string =
"--    VAC Call Already Grabbed(UPDATE), exiting: |$callerid|$auto_call_id|$dial_user|$AGaffected_rows|";
            &agi_output;
        }
        $AGI->stream_file('buzz');
        $AGI->hangup();
        exit;
    }
}
else {
    if ($AGILOG) {
        $agi_string =
"--    VAC Call Already Grabbed(SELECT), exiting: |$callerid|$auto_call_id|$dial_user|$AGaffected_rows|";
        &agi_output;
    }
    $AGI->stream_file('buzz');
    $AGI->hangup();
    exit;
}
if ($AGILOG) {
    $agi_string = "--    sleeping: |$callerid|$auto_call_id|";
    &agi_output;
}
sleep(10);
exit;
$dbhA->disconnect();
$AGI->stream_file('sip-silence');
if ($AGILOG) {
    $agi_string = "--    Exiting Ring-Agent AGI:  |$callerid|";
    &agi_output;
}
exit;

sub agi_output {
    if ( $AGILOG >= 2 ) {
        open( Lout, ">>$AGILOGfile" )
          || die "Can't open $AGILOGfile: $!\n";
        print Lout "$now_date|$script|$agi_string\n";
        close(Lout);
    }
    if ( ( $AGILOG == '1' ) || ( $AGILOG == '3' ) ) {
        print STDERR "$now_date|$script|$agi_string\n";
    }
    $agi_string = '';
}

sub checkresult {
    my ($res) = @_;
    my $retval;
    $tests++;
    chomp $res;
    if ( $res =~ /^200/ ) {
        $res =~ /result=(-?\d+)/;
        if ( !length($1) ) {
            $fail++;
        }
        else {
            $pass++;
        }
    }
    else {
        $fail++;
    }
}

sub leading_zero($) {
    $_ = $_[0];
    s/^(\d)$/0$1/;
    s/^(\d\d)$/0$1/;
    return $_;
}    # End of the leading_zero() routine.

sub parse_asterisk_version {
    my $ast_ver_str     = $_[0];
    my @hyphen_parts    = split( /-/, $ast_ver_str );
    my $ast_ver_postfix = $hyphen_parts[1];
    my @dot_parts       = split( /\./, $hyphen_parts[0] );
    my %ast_ver_hash;
    if ( $dot_parts[0] <= 1 ) {
        %ast_ver_hash = (
            "major"    => $dot_parts[0],
            "minor"    => $dot_parts[1],
            "build"    => $dot_parts[2],
            "revision" => $dot_parts[3],
            "postfix"  => $ast_ver_postfix
        );
    }
    if ( $dot_parts[0] > 1 ) {
        %ast_ver_hash = (
            "major"    => 1,
            "minor"    => $dot_parts[0],
            "build"    => $dot_parts[1],
            "revision" => $dot_parts[2],
            "postfix"  => $ast_ver_postfix
        );
    }
    return (%ast_ver_hash);
}
