diff --git a/agc_2-X/trunk/agi/agi-VDAD_LB_closer.agi b/agc_2-X/trunk/agi/agi-VDAD_LB_closer.agi index aff0c2ca..91476143 100644 --- a/agc_2-X/trunk/agi/agi-VDAD_LB_closer.agi +++ b/agc_2-X/trunk/agi/agi-VDAD_LB_closer.agi @@ -1,6 +1,6 @@ #!/usr/bin/perl # -# agi-VDAD_LB_transfer.agi version 0.3 *DBI-version* +# agi-VDAD_LB_closer.agi version 0.4 *DBI-version* # Load Balanced - when a call comes in on this server the script looks for an agent # on any server on the network on the same campaign to send call to. # @@ -23,13 +23,42 @@ # 60504-1107 - Added drop second/message/exten options from inbound_group # 60809-1056 - Changed to DBI by Marin Blu # - changed to use /etc/astguiclient.conf for configs +# 60821-1021 - added output options check from database +# - changed look for agent every 0.5 second for first 4 sec on hold # -$V = 1; # set to 1 for verbose mode -$M = 1; # set to 1 for 2 line messages mode +$script = 'agi-VDAD_LB_closer.agi'; $DROP_TIME = 360; ### number of seconds to wait until you drop a waiting call +($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) {$Fhour = "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"; +$start_time=$now_date; + $CIDdate = "$mon$mday$hour$min$sec"; + $tsSQLdate = "$year$mon$mday$hour$min$sec"; + $SQLdate = "$year-$mon-$mday $hour:$min:$sec"; + $SQLdateBEGIN = $SQLdate; + +$BDtarget = ($secX - 5); +($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget); +$Byear = ($Byear + 1900); +$Bmon++; +if ($Bmon < 10) {$Bmon = "0$Bmon";} +if ($Bmday < 10) {$Bmday = "0$Bmday";} +if ($Bhour < 10) {$Bhour = "0$Bhour";} +if ($Bmin < 10) {$Bmin = "0$Bmin";} +if ($Bsec < 10) {$Bsec = "0$Bsec";} + $BDtsSQLdate = "$Byear$Bmon$Bmday$Bhour$Bmin$Bsec"; + # default path to astguiclient configuration file: $PATHconf = '/etc/astguiclient.conf'; @@ -68,55 +97,45 @@ foreach(@conf) $i++; } -# Customized Variables -$server_ip = $VARserver_ip; # Asterisk server IP if (!$VARDB_port) {$VARDB_port='3306';} +if (!$AGILOGfile) {$AGILOGfile = "$PATHlogs/agiout.$year-$mon-$mday";} use DBI; use Time::HiRes ('gettimeofday','usleep','sleep'); # necessary to have perl sleep command of less than one second 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; -($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) {$Fhour = "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"; -$start_time=$now_date; - $CIDdate = "$mon$mday$hour$min$sec"; - $tsSQLdate = "$year$mon$mday$hour$min$sec"; - $SQLdate = "$year-$mon-$mday $hour:$min:$sec"; - $SQLdateBEGIN = $SQLdate; - -$BDtarget = ($secX - 5); -($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget); -$Byear = ($Byear + 1900); -$Bmon++; -if ($Bmon < 10) {$Bmon = "0$Bmon";} -if ($Bmday < 10) {$Bmday = "0$Bmday";} -if ($Bhour < 10) {$Bhour = "0$Bhour";} -if ($Bmin < 10) {$Bmin = "0$Bmin";} -if ($Bsec < 10) {$Bsec = "0$Bsec";} - $BDtsSQLdate = "$Byear$Bmon$Bmday$Bhour$Bmin$Bsec"; - +### Grab Server values from the database +$stmtA = "SELECT agi_output 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; +$rec_count=0; +while ($sthArows > $rec_count) + { + $AGILOG = '0'; + @aryA = $sthA->fetchrow_array; + $DBagi_output = "$aryA[0]"; + if ($DBagi_output =~ /STDERR/) {$AGILOG = '1';} + if ($DBagi_output =~ /FILE/) {$AGILOG = '2';} + if ($DBagi_output =~ /BOTH/) {$AGILOG = '3';} + $rec_count++; + } +$sthA->finish(); ### begin parsing run-time options ### if (length($ARGV[0])>1) { -if ($V) {print STDERR "Perl Environment Dump:\n";} + if ($AGILOG) {$agi_string = "Perl Environment Dump:"; &agi_output;} $i=0; while ($#ARGV >= $i) { $args = "$args $ARGV[$i]"; - if ($V) {print STDERR "$i|$ARGV[$i]|\n";} + if ($AGILOG) {$agi_string = "$i|$ARGV[$i]"; &agi_output;} $i++; } @@ -150,16 +169,12 @@ if ($V) {print STDERR "Perl Environment Dump:\n";} } } } -else -{ -if ($V) {print "no command line options set\n";} -} $|=1; while() { chomp; last unless length($_); - if ($V) + if ($AGILOG) { if (/^agi_(\w+)\:\s+(.*)$/) { @@ -196,46 +211,37 @@ while() { ### set the callerid to the filename of the audio for on-hold print "SET CALLERID $JqueryCID\n"; checkresult($result); - print STDERR "callerID changed: $JqueryCID\n"; + if ($AGILOG) {$agi_string = "callerID changed: $JqueryCID"; &agi_output;} } } - if ($V) - { +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|"; &agi_output;} - if ($V) {print STDERR "AGI Environment Dump:\n";} - foreach $i (sort keys %AGI) { - if ($V) {print STDERR " -- $i = $AGI{$i}\n";} - } - } $VDADcampaign=''; $VDADphone=''; $VDADphone_code=''; -if ($V) {print STDERR "AGI Environment Dump: |$unique_id|$channel|$extension|$type|$callerid|\n";} - - $CIDlead_id = $callerid; $CIDlead_id = substr($CIDlead_id, 11, 9); $CIDlead_id = ($CIDlead_id + 0); -if ($V) {print STDERR "\nCALL RECEIVED IN FROM VDAD: $callerid $channel\n";} -if ($M) {print STDERR "+++++ VDCL START : |$unique_id|$channel|$extension|$type|$callerid|$CIDlead_id|$now_date\n";} +if ($AGILOG) {$agi_string = ""+++++ VDAD START : |$CIDlead_id|$now_date|"; &agi_output;} if ($channel =~ /Local/i) { -if ($M) {print STDERR "+++++ VDCL START LOCAL CHANNEL: EXITING\n";} +if ($AGILOG) {$agi_string = ""+++++ VDAD START LOCAL CHANNEL: EXITING- $priority"; &agi_output;} exit; } - - -$dbhA = DBI->connect("DBI:mysql:$VARDB_database:$VARDB_server:$VARDB_port", "$VARDB_user", "$VARDB_pass") - or die "Couldn't connect to database: " . DBI->errstr; ### Grab Server values from the database $cbc=0; -$stmtA = "SELECT voicemail_dump_exten,ext_context,answer_transfer_agent,local_gmt,asterisk_version,max_vicidial_trunks FROM servers where server_ip = '$server_ip';"; +$stmtA = "SELECT voicemail_dump_exten,ext_context,answer_transfer_agent,local_gmt,asterisk_version,max_vicidial_trunks 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; @@ -300,18 +306,19 @@ $sthA->finish(); ### insert a LIVE record to the vicidial_auto_calls table -$stmtA = "INSERT INTO vicidial_auto_calls values('','$server_ip','$channel_group','LIVE','$CIDlead_id','$uniqueid','$callerid','$channel','$VDADphone_code','$VDADphone','$SQLdate','IN')"; +$stmtA = "INSERT INTO vicidial_auto_calls values('','$VARserver_ip','$channel_group','LIVE','$CIDlead_id','$uniqueid','$callerid','$channel','$VDADphone_code','$VDADphone','$SQLdate','IN')"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); $stmtA = "INSERT INTO vicidial_closer_log (lead_id,campaign_id,call_date,start_epoch,status,phone_code,phone_number,user,processed) values('$CIDlead_id','$VDADcampaign','$SQLdate','$now_date_epoch','QUEUE','$VDADphone_code','$VDADphone','VDCL','N')"; - if($M){print STDERR "\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if ($M) {print STDERR "-- VDCL : |$VDADlead_id|$CIDlead_id|insert to vicidial_closer_log\n";} +if ($AGILOG) {$agi_string = "-- VDCL : |$VDADlead_id|$CIDlead_id|insert to vicidial_closer_log"; &agi_output;} $stmtA = "INSERT INTO vicidial_xfer_log (lead_id,campaign_id,call_date,phone_code,phone_number,user,closer) values('$CIDlead_id','$VDADcampaign','$SQLdate','$VDADphone_code','$VDADphone','$VDADfronter','VDXL')"; - if($M){print STDERR "\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if ($M) {print STDERR "-- VDXL : |$VDADlead_id|$CIDlead_id|insert to vicidial_closer_log\n";} +if ($AGILOG) {$agi_string = "-- VDXL : |$VDADlead_id|$CIDlead_id|insert to vicidial_xfer_log"; &agi_output;} $drop_timer=0; @@ -324,7 +331,7 @@ while ($drop_timer <= $DROP_TIME) $channel_status = $AGI->channel_status("$channel"); if ($channel_status < 1) { - print STDERR "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer CHECKING AGAIN...\n"; + if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer CHECKING AGAIN"; &agi_output;} ### sleep for 99 hundredths of a second usleep(1*990*1000); @@ -332,12 +339,11 @@ if ($channel_status < 1) if ($channel_status_DC < 1) { - print STDERR "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer\n"; + if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer"; &agi_output;} if ($drop_timer < 360) {$drop_seconds = $drop_timer;} $drop_timer = ($drop_timer + 360); } } - $cbc=0; $stmtA = "SELECT next_agent_call FROM vicidial_inbound_groups where group_id='$channel_group';"; $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; @@ -358,12 +364,10 @@ if ($channel_status < 1) if ($CAMP_callorder =~ /oldest_call_finish/i) {$agent_call_order = 'order by last_call_finish';} if ($CAMP_callorder =~ /random/i) {$agent_call_order = 'order by random_id';} - - - $rec_countWAIT=0; - $cbc=0; + $rec_countWAIT=0; + $cbc=0; $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and campaign_id = '$channel_group' and call_time < \"$SQLdateBEGIN\" and lead_id != '$VDADlead_id';"; - if($M){print STDERR "\n\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -378,14 +382,14 @@ if ($channel_status < 1) if ($rec_countWAIT < 1) { - $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$CIDlead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid', call_server_ip='$server_ip' where status IN('CLOSER','READY') and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $VDADcampaign %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; + $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$CIDlead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid', call_server_ip='$VARserver_ip' where status IN('CLOSER','READY') and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $VDADcampaign %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDAD get agent: |$affected_rows|update of vla table: $VDADcampaign|$server_ip\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "-- VDAD get agent: |$affected_rows|$VDADcampaign|$stmtA|"; &agi_output;} if ($affected_rows > 0) { $cbc=0; $stmtA = "SELECT conf_exten,user,extension,server_ip FROM vicidial_live_agents where status = 'QUEUE' and campaign_id LIKE \"%CLOSER%\" and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -402,20 +406,19 @@ if ($channel_status < 1) $sthA->finish(); $stmtA = "UPDATE vicidial_auto_calls set status='CLOSER' where callerid='$callerid';"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL XFER : |$affected_rows|update of vac table: $callerid\n|$stmtA|\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL XFER : |$affected_rows|$callerid\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_xfer_log set closer='$VDADuser' where lead_id = '$CIDlead_id' order by call_date desc limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDXL vicidial_xfer_log update: |$affected_rows|$CIDlead_id|$VDADuser\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDXL XFER vicidial_xfer_log update: |$affected_rows|$CIDlead_id|$VDADuser\n|$stmtA|"; &agi_output;} $dbhA->disconnect(); ### format the remote server dialstring to get the call to the overflow agent meetme room $S='*'; $VDADremDIALstr=''; - if( ($VDADserver_ip =~ m/(\S+)\.(\S+)\.(\S+)\.(\S+)/) && ($VDADserver_ip !~ /$server_ip/) ) + if( ($VDADserver_ip =~ m/(\S+)\.(\S+)\.(\S+)\.(\S+)/) && ($VDADserver_ip !~ /$VARserver_ip/) ) { $a = leading_zero($1); $b = leading_zero($2); @@ -425,7 +428,7 @@ if ($channel_status < 1) } $VDADremDIALstr .= "$VDADconf_exten"; - print STDERR "\nexiting the VDAD app, transferring call to $VDADremDIALstr\n"; + if ($AGILOG) {$agi_string = "exiting VDAD app, transferring call to $VDADremDIALstr"; &agi_output;} print "SET CONTEXT $ext_context\n"; checkresult($result); print "SET EXTENSION $VDADremDIALstr\n"; @@ -444,23 +447,20 @@ if ($channel_status < 1) $now_date_epoch = time(); $now_date = "$year-$mon-$mday $hour:$min:$sec"; - print STDERR "\nXXXXXXXXXX VDAD transferred: start|stop $start_time|$now_date\n"; + if ($AGILOG) {$agi_string = "XXXXX VDAD transferred: start|stop $start_time|$now_date"; &agi_output;} exit; } else { - print STDERR "NNNNNNNNNN No agent record found!!!\n"; + if ($AGILOG) {$agi_string = "NNNNN No available agent found"; &agi_output;} } } else { - print STDERR "WWWWWWWW VDAD XFER WAIT: |$rec_countWAIT|$channel_group|$channel|$callerid|$uniqueid|\n"; + if ($AGILOG) {$agi_string = "WWWWW VDAD XFER WAIT: |$rec_countWAIT|$channel_group|$channel|$callerid|$uniqueid|"; &agi_output;} } - ### sleep for 99 hundredths of a second - usleep(1*990*1000); - if ($hold_message_counter > 30) { $AGI->stream_file('generic_hold'); @@ -474,7 +474,20 @@ if ($hold_tone_counter > 3) } else {$hold_tone_counter++;} -$drop_timer++; +if ($drop_timer < 3) + { + ### sleep for 44.5 hundredths of a second + usleep(1*445*1000); + + $drop_timer = ($drop_timer + 0.5); + } +else + { + ### sleep for 99 hundredths of a second + usleep(1*990*1000); + + $drop_timer++; + } } @@ -509,20 +522,20 @@ if ($drop_seconds < 1) { $cbc=0; $stmtA = "SELECT voicemail_ext FROM vicidial_inbound_groups where group_id = '$channel_group' limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; - $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; - $sthArows=$sthA->rows; - $rec_countCUSTDATA=0; - while ($sthArows > $cbc) + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $rec_countCUSTDATA=0; + while ($sthArows > $cbc) { - $VDADvoicemail_ext = "$aryA[0]"; - $VDADvoicemail_ext =~ s/\D//gi; - $DROPexten = "$voicemail_dump_exten$VDADvoicemail_ext"; - + @aryA = $sthA->fetchrow_array; + $VDADvoicemail_ext = "$aryA[0]"; + $VDADvoicemail_ext =~ s/\D//gi; + $DROPexten = "$voicemail_dump_exten$VDADvoicemail_ext"; $cbc++; - } - $sthA->finish(); + } + $sthA->finish(); } } @@ -532,7 +545,7 @@ if ($drop_seconds < 1) if (length($DROPexten)>0) { ### if DROP extension is defined then send the dropped call there instead of hangup - print STDERR "\nexiting the VDAD app, transferring call to $DROPexten\n"; + if ($AGILOG) {$agi_string = "exiting the VDAD app, transferring call to $DROPexten"; &agi_output;} print "SET CONTEXT $ext_context\n"; checkresult($result); print "SET EXTENSION $DROPexten\n"; @@ -543,30 +556,26 @@ if ($drop_seconds < 1) else { ### insert a NEW record to the vicidial_manager table to be processed - $stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$server_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')"; - $dbhA->do($stmtA) or die "Couldn't execute query:\n"; - if ($M) {print STDERR "-- VDCL call_hungup timout: |$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager\n";} + $stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$VARserver_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')"; + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL call_hungup timout: |$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager"; &agi_output;} } - $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' and server_ip='$server_ip' order by call_time desc limit 1;"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vac record deleted: |$affected_rows| $VDADcampaign|$server_ip\n";} + $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' and server_ip='$VARserver_ip' order by call_time desc limit 1;"; + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vac record deleted: |$affected_rows| $VDADcampaign|"; &agi_output;} $stmtA = "UPDATE vicidial_closer_log set status='DROP',end_epoch='$now_date_epoch',length_in_sec='$drop_seconds' where lead_id = '$CIDlead_id' order by start_epoch desc limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vicidial_closer_log update: |$affected_rows|$CIDlead_id\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vcl update: |$affected_rows|$CIDlead_id|\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_list set status='XDROP' where lead_id = '$CIDlead_id';"; - if($M){print STDERR "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vicidial_list update: |$affected_rows|$CIDlead_id\n";} - + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vl update: |$affected_rows|$CIDlead_id|\n|$stmtA|"; &agi_output;} } $dbhA->disconnect(); - exit; sub checkresult { @@ -595,3 +604,20 @@ sub leading_zero($) { s/^(\d\d)$/0$1/; return $_; } # End of the leading_zero() routine. + + +sub agi_output +{ +if ($AGILOG >=2) + { + ### open the log file for writing ### + open(Lout, ">>$AGILOGfile") + || die "Can't open $AGILOGfile: $!\n"; + print Lout "$now_date|$script|$agi_string\n"; + close(Lout); + } + ### send to STDERR writing ### +if ( ($AGILOG == '1') || ($AGILOG == '3') ) + {print STDERR "$now_date|$script|$agi_string\n";} +$agi_string=''; +} diff --git a/agc_2-X/trunk/agi/agi-VDAD_LB_closer_inbound.agi b/agc_2-X/trunk/agi/agi-VDAD_LB_closer_inbound.agi index 667395a9..d8addf0c 100644 --- a/agc_2-X/trunk/agi/agi-VDAD_LB_closer_inbound.agi +++ b/agc_2-X/trunk/agi/agi-VDAD_LB_closer_inbound.agi @@ -1,6 +1,6 @@ #!/usr/bin/perl # -# agi-VDAD_LB_closer_inbound.agi version 0.4 *DBI-version* +# agi-VDAD_LB_closer_inbound.agi version 0.5 *DBI-version* # # runs when a call comes in from an inbound call. This script will # send the calls out to the closers that are logged in. @@ -32,13 +32,42 @@ # 60504-1122 - Added drop second/message/exten options from inbound_group # 60809-1056 - Changed to DBI by Marin Blu # - changed to use /etc/astguiclient.conf for configs +# 60821-1021 - added output options check from database +# - changed look for agent every 0.5 second for first 4 sec on hold # -$V = 1; # set to 1 for verbose mode -$M = 1; # set to 1 for 2 line messages mode +$script = 'agi-VDAD_LB_closer_inbound.agi'; $DROP_TIME = 360; ### number of seconds to wait until you drop a waiting call +($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) {$Fhour = "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"; +$start_time=$now_date; + $CIDdate = "$mon$mday$hour$min$sec"; + $tsSQLdate = "$year$mon$mday$hour$min$sec"; + $SQLdate = "$year-$mon-$mday $hour:$min:$sec"; + $SQLdateBEGIN = $SQLdate; + +$BDtarget = ($secX - 5); +($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget); +$Byear = ($Byear + 1900); +$Bmon++; +if ($Bmon < 10) {$Bmon = "0$Bmon";} +if ($Bmday < 10) {$Bmday = "0$Bmday";} +if ($Bhour < 10) {$Bhour = "0$Bhour";} +if ($Bmin < 10) {$Bmin = "0$Bmin";} +if ($Bsec < 10) {$Bsec = "0$Bsec";} + $BDtsSQLdate = "$Byear$Bmon$Bmday$Bhour$Bmin$Bsec"; + # default path to astguiclient configuration file: $PATHconf = '/etc/astguiclient.conf'; @@ -77,55 +106,45 @@ foreach(@conf) $i++; } -# Customized Variables -$server_ip = $VARserver_ip; # Asterisk server IP if (!$VARDB_port) {$VARDB_port='3306';} +if (!$AGILOGfile) {$AGILOGfile = "$PATHlogs/agiout.$year-$mon-$mday";} use DBI; use Time::HiRes ('gettimeofday','usleep','sleep'); # necessary to have perl sleep command of less than one second 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; -($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) {$Fhour = "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"; -$start_time=$now_date; - $CIDdate = "$mon$mday$hour$min$sec"; - $tsSQLdate = "$year$mon$mday$hour$min$sec"; - $SQLdate = "$year-$mon-$mday $hour:$min:$sec"; - $SQLdateBEGIN = $SQLdate; - -$BDtarget = ($secX - 5); -($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget); -$Byear = ($Byear + 1900); -$Bmon++; -if ($Bmon < 10) {$Bmon = "0$Bmon";} -if ($Bmday < 10) {$Bmday = "0$Bmday";} -if ($Bhour < 10) {$Bhour = "0$Bhour";} -if ($Bmin < 10) {$Bmin = "0$Bmin";} -if ($Bsec < 10) {$Bsec = "0$Bsec";} - $BDtsSQLdate = "$Byear$Bmon$Bmday$Bhour$Bmin$Bsec"; - +### Grab Server values from the database +$stmtA = "SELECT agi_output 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; +$rec_count=0; +while ($sthArows > $rec_count) + { + $AGILOG = '0'; + @aryA = $sthA->fetchrow_array; + $DBagi_output = "$aryA[0]"; + if ($DBagi_output =~ /STDERR/) {$AGILOG = '1';} + if ($DBagi_output =~ /FILE/) {$AGILOG = '2';} + if ($DBagi_output =~ /BOTH/) {$AGILOG = '3';} + $rec_count++; + } +$sthA->finish(); ### begin parsing run-time options ### if (length($ARGV[0])>1) { -if ($V) {print STDERR "Perl Environment Dump:\n";} + if ($AGILOG) {$agi_string = "Perl Environment Dump:"; &agi_output;} $i=0; while ($#ARGV >= $i) { $args = "$args $ARGV[$i]"; - if ($V) {print STDERR "$i|$ARGV[$i]|\n";} + if ($AGILOG) {$agi_string = "$i|$ARGV[$i]"; &agi_output;} $i++; } @@ -170,16 +189,12 @@ if ($V) {print STDERR "Perl Environment Dump:\n";} } } } -else -{ -if ($V) {print "no command line options set\n";} -} $|=1; while() { chomp; last unless length($_); - if ($V) + if ($AGILOG) { if (/^agi_(\w+)\:\s+(.*)$/) { @@ -228,48 +243,34 @@ while() { # } } - if ($V) - { +foreach $i (sort keys %AGI) +{ + if ($AGILOG) {$agi_string = " -- $i = $AGI{$i}"; &agi_output;} +} - if ($V) {print STDERR "AGI Environment Dump:\n";} - foreach $i (sort keys %AGI) { - if ($V) {print STDERR " -- $i = $AGI{$i}\n";} - } - } +if ($AGILOG) {$agi_string = "AGI Variables: |$unique_id|$channel|$extension|$type|$callerid|"; &agi_output;} $AGI->stream_file('beep'); - if ($V) {print STDERR "\nINBOUND CALL VDCL STARTED\n";} - &enter_pin_number; $fronter = $pin; -if ($M) {print STDERR "+++++ INBOUND CALL VDCL STARTED : |$unique_id|$channel_group|$channel|$extension|$type|$callerid-$pin|$now_date\n";} +if ($AGILOG) {$agi_string = ""+++++ INBOUND CALL VDCL STARTED : |$channel_group|$callerid-$pin|$now_date"; &agi_output;} $VDADphone=''; $VDADphone_code=''; -if ($V) {print STDERR "AGI Environment Dump: |$unique_id|$channel|$extension|$type|$callerid|\n";} - - -if ($V) {print STDERR "\nINBOUND CALL RECEIVED IN FROM VDCL: $callerid $channel\n";} -if ($M) {print STDERR "+++++ INBOUND VDCL START : |$unique_id|$channel|$extension|$type|$now_date\n";} - if ($channel =~ /Local/i) { -if ($M) {print STDERR "+++++ VDCL START LOCAL CHANNEL: EXITING\n";} +if ($AGILOG) {$agi_string = ""+++++ VDAD START LOCAL CHANNEL: EXITING- $priority"; &agi_output;} exit; } - -$dbhA = DBI->connect("DBI:mysql:$VARDB_database:$VARDB_server:$VARDB_port", "$VARDB_user", "$VARDB_pass") - or die "Couldn't connect to database: " . DBI->errstr; - ### Grab Server values from the database $cbc=0; -$stmtA = "SELECT voicemail_dump_exten,ext_context,answer_transfer_agent,local_gmt,asterisk_version,max_vicidial_trunks FROM servers where server_ip = '$server_ip';"; +$stmtA = "SELECT voicemail_dump_exten,ext_context,answer_transfer_agent,local_gmt,asterisk_version,max_vicidial_trunks 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; @@ -310,7 +311,7 @@ while ($sthArows > $cbc) $sthA->finish(); $new_lead_id = $insert_lead_id; -if($M){print STDERR "\n|$stmtA|$new_lead_id|\n";} +if ($AGILOG) {$agi_string = "|$stmtA|$new_lead_id|"; &agi_output;} $PADlead_id = sprintf("%09s", $new_lead_id); while (length($PADlead_id) > 9) {chop($PADlead_id);} # YmmddhhmmssLLLLLLLLL @@ -319,7 +320,7 @@ $PADlead_id = sprintf("%09s", $new_lead_id); while (length($PADlead_id) > 9) {ch ### set the callerid print "SET CALLERID $YqueryCID\n"; checkresult($result); -print STDERR "callerID changed: $YqueryCID\n"; +if ($AGILOG) {$agi_string = "callerID changed: $YqueryCID"; &agi_output;} ### Grab inbound_group values from the database $cbc=0; @@ -341,26 +342,25 @@ while ($sthArows > $cbc) $sthA->finish(); - ### insert a LIVE record to the vicidial_auto_calls table -$stmtA = "INSERT INTO vicidial_auto_calls values('','$server_ip','$channel_group','LIVE','$new_lead_id','$uniqueid','$callerid','$channel','$phone_code','$phone_number','$SQLdate','IN')"; +$stmtA = "INSERT INTO vicidial_auto_calls values('','$VARserver_ip','$channel_group','LIVE','$new_lead_id','$uniqueid','$callerid','$channel','$phone_code','$phone_number','$SQLdate','IN')"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if($M){print STDERR "\n|$stmtA|\n";} $stmtA = "INSERT INTO vicidial_log (uniqueid,lead_id,campaign_id,call_date,start_epoch,status,phone_code,phone_number,user,processed) values('$uniqueid','$new_lead_id','$channel_group','$SQLdate','$now_date_epoch','XFER','$phone_code','$phone_number','$fronter','N')"; - if($M){print STDERR "\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if ($M) {print STDERR "-- VDAD : |$new_lead_id|$fronter|insert to vicidial_log: $uniqueid\n";} +if ($AGILOG) {$agi_string = "-- VDAD : |$new_lead_id|$fronter|insert to vicidial_log: $uniqueid"; &agi_output;} $stmtA = "INSERT INTO vicidial_closer_log (lead_id,campaign_id,call_date,start_epoch,status,phone_code,phone_number,user,processed) values('$new_lead_id','$channel_group','$SQLdate','$now_date_epoch','QUEUE','$phone_code','$phone_number','VDCL','N')"; - if($M){print STDERR "\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if ($M) {print STDERR "-- VDCL : |$new_lead_id|insert to vicidial_closer_log\n";} +if ($AGILOG) {$agi_string = "-- VDCL : |$new_lead_id|insert to vicidial_closer_log"; &agi_output;} $stmtA = "INSERT INTO vicidial_xfer_log (lead_id,campaign_id,call_date,phone_code,phone_number,user,closer) values('$new_lead_id','$channel_group','$SQLdate','$phone_code','$phone_number','$fronter','VDXL')"; - if($M){print STDERR "\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if ($M) {print STDERR "-- VDXL : |$new_lead_id|insert to vicidial_closer_log\n";} +if ($AGILOG) {$agi_string = "-- VDXL : |$new_lead_id|insert to vicidial_xfer_log"; &agi_output;} $VDADlead_id = $new_lead_id; @@ -374,7 +374,7 @@ while ($drop_timer <= $DROP_TIME) $channel_status = $AGI->channel_status("$channel"); if ($channel_status < 1) { - print STDERR "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer CHECKING AGAIN...\n"; + if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer CHECKING AGAIN"; &agi_output;} ### sleep for 99 hundredths of a second usleep(1*990*1000); @@ -382,15 +382,13 @@ if ($channel_status < 1) if ($channel_status_DC < 1) { - print STDERR "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer\n"; + if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer"; &agi_output;} if ($drop_timer < 360) {$drop_seconds = $drop_timer;} $drop_timer = ($drop_timer + 360); } } - $cbc=0; $stmtA = "SELECT next_agent_call FROM vicidial_inbound_groups where group_id='$channel_group';"; - $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -412,8 +410,7 @@ if ($channel_status < 1) $rec_countWAIT=0; $cbc=0; $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and campaign_id = '$channel_group' and call_time < \"$SQLdateBEGIN\" and lead_id != '$VDADlead_id';"; - if($M){print STDERR "\n\n|$stmtA|\n";} - + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -428,15 +425,14 @@ if ($channel_status < 1) if ($rec_countWAIT < 1) { - $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$new_lead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid', call_server_ip='$server_ip' where status IN('CLOSER','READY') and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $channel_group %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; + $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$new_lead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid', call_server_ip='$VARserver_ip' where status IN('CLOSER','READY') and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $channel_group %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDAD get agent: |$DROP_TIME|$drop_timer|$affected_rows|update of vla table: $channel_group|$server_ip\n";} - # if ($M) {print STDERR "|$stmtA|\n";} + if ($AGILOG) {$agi_string = "-- VDAD get agent: |$affected_rows|$channel_group|$stmtA|"; &agi_output;} if ($affected_rows > 0) { $cbc=0; $stmtA = "SELECT conf_exten,user,extension,server_ip FROM vicidial_live_agents where status = 'QUEUE' and campaign_id LIKE \"%CLOSER%\" and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -455,23 +451,22 @@ if ($channel_status < 1) $sthA->finish(); $stmtA = "UPDATE vicidial_auto_calls set status='CLOSER' where callerid='$callerid';"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL XFER : |$affected_rows|update of vac table: $callerid\n|$stmtA|\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL XFER : |$affected_rows|$callerid\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_xfer_log set closer='$VDADuser' where lead_id = '$new_lead_id' order by call_date desc limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDXL vicidial_xfer_log update: |$affected_rows|$new_lead_id|$VDADuser\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDXL XFER vicidial_xfer_log update: |$affected_rows|$new_lead_id|$VDADuser\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_closer_log set user='$VDADuser' where lead_id='$new_lead_id' order by call_date desc limit 1;"; my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- closer log : |$affected_rows|update of vcl table: $new_lead_id\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "-- closer log : |$affected_rows|$new_lead_id\n|$stmtA|"; &agi_output;} $dbhA->disconnect(); ### format the remote server dialstring to get the call to the overflow agent meetme room $S='*'; - if( ($VDADserver_ip =~ m/(\S+)\.(\S+)\.(\S+)\.(\S+)/) && ($VDADserver_ip !~ /$server_ip/) ) + if( ($VDADserver_ip =~ m/(\S+)\.(\S+)\.(\S+)\.(\S+)/) && ($VDADserver_ip !~ /$VARserver_ip/) ) { $a = leading_zero($1); $b = leading_zero($2); @@ -481,7 +476,7 @@ if ($channel_status < 1) } $VDADremDIALstr .= "$VDADconf_exten"; - print STDERR "\nexiting the VDAD app, transferring call to $VDADconf_exten\n"; + if ($AGILOG) {$agi_string = "exiting VDAD app, transferring call to $VDADremDIALstr"; &agi_output;} print "SET CONTEXT $ext_context\n"; checkresult($result); print "SET EXTENSION $VDADremDIALstr\n"; @@ -500,25 +495,22 @@ if ($channel_status < 1) $now_date_epoch = time(); $now_date = "$year-$mon-$mday $hour:$min:$sec"; - print STDERR "\nXXXXXXXXXX VDAD transferred: start|stop $start_time|$now_date\n"; + if ($AGILOG) {$agi_string = "XXXXX VDAD transferred: start|stop $start_time|$now_date"; &agi_output;} exit; } else { - print STDERR "NNNNNNNNNN No agent record found!!!\n"; + if ($AGILOG) {$agi_string = "NNNNN No available agent found"; &agi_output;} } } else { - print STDERR "WWWWWWWW VDAD REMOTE XFER WAIT: |$rec_countWAIT|$channel_group|$channel|$callerid|$uniqueid|\n"; + if ($AGILOG) {$agi_string = "WWWWW VDAD XFER WAIT: |$rec_countWAIT|$channel_group|$channel|$callerid|$uniqueid|"; &agi_output;} } - ### sleep for 99 hundredths of a second - usleep(1*990*1000); - if ($hold_message_counter > 30) { $AGI->stream_file('generic_hold'); @@ -532,7 +524,20 @@ if ($hold_tone_counter > 3) } else {$hold_tone_counter++;} -$drop_timer++; +if ($drop_timer < 3) + { + ### sleep for 44.5 hundredths of a second + usleep(1*445*1000); + + $drop_timer = ($drop_timer + 0.5); + } +else + { + ### sleep for 99 hundredths of a second + usleep(1*990*1000); + + $drop_timer++; + } } @@ -567,19 +572,20 @@ if ($drop_seconds < 1) { $cbc=0; $stmtA = "SELECT voicemail_ext FROM vicidial_inbound_groups where group_id = '$channel_group' limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; $rec_countCUSTDATA=0; while ($sthArows > $cbc) { + @aryA = $sthA->fetchrow_array; $VDADvoicemail_ext = "$aryA[0]"; $VDADvoicemail_ext =~ s/\D//gi; $DROPexten = "$voicemail_dump_exten$VDADvoicemail_ext"; $cbc++; } - $sthA->finish(); + $sthA->finish(); } } @@ -589,7 +595,7 @@ if ($drop_seconds < 1) if (length($DROPexten)>0) { ### if DROP extension is defined then send the dropped call there instead of hangup - print STDERR "\nexiting the VDAD app, transferring call to $DROPexten\n"; + if ($AGILOG) {$agi_string = "exiting the VDAD app, transferring call to $DROPexten"; &agi_output;} print "SET CONTEXT $ext_context\n"; checkresult($result); print "SET EXTENSION $DROPexten\n"; @@ -600,38 +606,32 @@ if ($drop_seconds < 1) else { ### insert a NEW record to the vicidial_manager table to be processed - $stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$server_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')"; + $stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$VARserver_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')"; $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL call_hungup timout: |$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager\n";} + if ($AGILOG) {$agi_string = "-- VDCL call_hungup timout: |$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager"; &agi_output;} } - $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' and server_ip='$server_ip' order by call_time desc limit 1;"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vac record deleted: |$affected_rows| $channel_group|$server_ip\n";} + $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' and server_ip='$VARserver_ip' order by call_time desc limit 1;"; + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vac record deleted: |$affected_rows| $VDADcampaign|"; &agi_output;} $stmtA = "UPDATE vicidial_closer_log set status='DROP',end_epoch='$now_date_epoch',length_in_sec='$drop_seconds' where lead_id = '$new_lead_id' order by start_epoch desc limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vicidial_closer_log update: |$affected_rows|$new_lead_id\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vcl update: |$affected_rows|$new_lead_id|\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_list set status='XDROP' where lead_id = '$new_lead_id';"; - if($M){print STDERR "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vicidial_list update: |$affected_rows|$new_lead_id\n";} - + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vl update: |$affected_rows|$new_lead_id|\n|$stmtA|"; &agi_output;} } - - - $dbhA->disconnect(); - - +$dbhA->disconnect(); exit; sub enter_pin_number { # please enter the pin number followed by the pound key +# please enter your 4 digit pin number $digit=''; undef $digit; @@ -640,7 +640,7 @@ undef $interrupt_digit; $interrupt_digit = $AGI->stream_file('four_digit_id','123456789'); - print STDERR "interrupt_digit |$interrupt_digit|\n"; + if ($AGILOG) {$agi_string = "interrupt_digit |$interrupt_digit|"; &agi_output;} $digits_being_entered=1; $totalDTMF=''; @@ -685,7 +685,7 @@ while ( ($digit_loop_counter < 4) ) if ($digit =~ /\d/) { $totalDTMF = "$totalDTMF$digit"; - print STDERR "digit |$digit| TotalDTMF |$totalDTMF|\n"; + if ($AGILOG) {$agi_string = "digit |$digit| TotalDTMF |$totalDTMF|"; &agi_output;} # $AGI->say_digits("$digit"); undef $digit; } @@ -699,7 +699,7 @@ while ( ($digit_loop_counter < 4) ) $totalDTMF =~ s/\D//gi; $pin = $totalDTMF; -if ($totalDTMF) {print STDERR "digit |$digit| TotalDTMF |$totalDTMF|\n";} +if ($totalDTMF) {if ($AGILOG) {$agi_string = "digit |$digit| TotalDTMF |$totalDTMF|"; &agi_output;}} } @@ -720,11 +720,28 @@ sub checkresult { $pass++; } } else { - print STDERR "FAIL (unexpected result '$res')\n"; + # print STDERR "FAIL (unexpected result '$res')\n"; $fail++; } } -### you're call is very important to us, please stay on the line and you will be transferred to the next available agent \ No newline at end of file +### you're call is very important to us, please stay on the line and you will be transferred to the next available agent + + +sub agi_output +{ +if ($AGILOG >=2) + { + ### open the log file for writing ### + open(Lout, ">>$AGILOGfile") + || die "Can't open $AGILOGfile: $!\n"; + print Lout "$now_date|$script|$agi_string\n"; + close(Lout); + } + ### send to STDERR writing ### +if ( ($AGILOG == '1') || ($AGILOG == '3') ) + {print STDERR "$now_date|$script|$agi_string\n";} +$agi_string=''; +} diff --git a/agc_2-X/trunk/agi/agi-VDAD_LO_closer.agi b/agc_2-X/trunk/agi/agi-VDAD_LO_closer.agi index a6cc863a..a0f1aae9 100644 --- a/agc_2-X/trunk/agi/agi-VDAD_LO_closer.agi +++ b/agc_2-X/trunk/agi/agi-VDAD_LO_closer.agi @@ -1,6 +1,6 @@ #!/usr/bin/perl # -# agi-VDAD_LO_closer.agi version 0.3 *DBI-version* +# agi-VDAD_LO_closer.agi version 0.4 *DBI-version* # Overflow Balanced - when a call comes in on this server the script looks for an agent # on this server to send call to. If none available it looks for the next available # agent on any other server on the network on the same campaign to send call to. @@ -24,13 +24,42 @@ # 60504-1150 - Added drop second/message/exten options from inbound_group # 60809-1056 - Changed to DBI by Marin Blu # - changed to use /etc/astguiclient.conf for configs +# 60821-1021 - added output options check from database +# - changed look for agent every 0.5 second for first 4 sec on hold # -$V = 1; # set to 1 for verbose mode -$M = 1; # set to 1 for 2 line messages mode +$script = 'agi-VDAD_LO_closer.agi'; $DROP_TIME = 360; ### number of seconds to wait until you drop a waiting call +($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) {$Fhour = "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"; +$start_time=$now_date; + $CIDdate = "$mon$mday$hour$min$sec"; + $tsSQLdate = "$year$mon$mday$hour$min$sec"; + $SQLdate = "$year-$mon-$mday $hour:$min:$sec"; + $SQLdateBEGIN = $SQLdate; + +$BDtarget = ($secX - 5); +($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget); +$Byear = ($Byear + 1900); +$Bmon++; +if ($Bmon < 10) {$Bmon = "0$Bmon";} +if ($Bmday < 10) {$Bmday = "0$Bmday";} +if ($Bhour < 10) {$Bhour = "0$Bhour";} +if ($Bmin < 10) {$Bmin = "0$Bmin";} +if ($Bsec < 10) {$Bsec = "0$Bsec";} + $BDtsSQLdate = "$Byear$Bmon$Bmday$Bhour$Bmin$Bsec"; + # default path to astguiclient configuration file: $PATHconf = '/etc/astguiclient.conf'; @@ -69,55 +98,45 @@ foreach(@conf) $i++; } -# Customized Variables -$server_ip = $VARserver_ip; # Asterisk server IP if (!$VARDB_port) {$VARDB_port='3306';} +if (!$AGILOGfile) {$AGILOGfile = "$PATHlogs/agiout.$year-$mon-$mday";} use DBI; use Time::HiRes ('gettimeofday','usleep','sleep'); # necessary to have perl sleep command of less than one second 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; -($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) {$Fhour = "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"; -$start_time=$now_date; - $CIDdate = "$mon$mday$hour$min$sec"; - $tsSQLdate = "$year$mon$mday$hour$min$sec"; - $SQLdate = "$year-$mon-$mday $hour:$min:$sec"; - $SQLdateBEGIN = $SQLdate; - -$BDtarget = ($secX - 5); -($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget); -$Byear = ($Byear + 1900); -$Bmon++; -if ($Bmon < 10) {$Bmon = "0$Bmon";} -if ($Bmday < 10) {$Bmday = "0$Bmday";} -if ($Bhour < 10) {$Bhour = "0$Bhour";} -if ($Bmin < 10) {$Bmin = "0$Bmin";} -if ($Bsec < 10) {$Bsec = "0$Bsec";} - $BDtsSQLdate = "$Byear$Bmon$Bmday$Bhour$Bmin$Bsec"; - +### Grab Server values from the database +$stmtA = "SELECT agi_output 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; +$rec_count=0; +while ($sthArows > $rec_count) + { + $AGILOG = '0'; + @aryA = $sthA->fetchrow_array; + $DBagi_output = "$aryA[0]"; + if ($DBagi_output =~ /STDERR/) {$AGILOG = '1';} + if ($DBagi_output =~ /FILE/) {$AGILOG = '2';} + if ($DBagi_output =~ /BOTH/) {$AGILOG = '3';} + $rec_count++; + } +$sthA->finish(); ### begin parsing run-time options ### if (length($ARGV[0])>1) { -if ($V) {print STDERR "Perl Environment Dump:\n";} + if ($AGILOG) {$agi_string = "Perl Environment Dump:"; &agi_output;} $i=0; while ($#ARGV >= $i) { $args = "$args $ARGV[$i]"; - if ($V) {print STDERR "$i|$ARGV[$i]|\n";} + if ($AGILOG) {$agi_string = "$i|$ARGV[$i]"; &agi_output;} $i++; } @@ -151,16 +170,12 @@ if ($V) {print STDERR "Perl Environment Dump:\n";} } } } -else -{ -if ($V) {print "no command line options set\n";} -} $|=1; while() { chomp; last unless length($_); - if ($V) + if ($AGILOG) { if (/^agi_(\w+)\:\s+(.*)$/) { @@ -197,46 +212,37 @@ while() { ### set the callerid to the filename of the audio for on-hold print "SET CALLERID $JqueryCID\n"; checkresult($result); - print STDERR "callerID changed: $JqueryCID\n"; + if ($AGILOG) {$agi_string = "callerID changed: $JqueryCID"; &agi_output;} } } - if ($V) - { +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|"; &agi_output;} - if ($V) {print STDERR "AGI Environment Dump:\n";} - foreach $i (sort keys %AGI) { - if ($V) {print STDERR " -- $i = $AGI{$i}\n";} - } - } $VDADcampaign=''; $VDADphone=''; $VDADphone_code=''; -if ($V) {print STDERR "AGI Environment Dump: |$unique_id|$channel|$extension|$type|$callerid|\n";} - - $CIDlead_id = $callerid; $CIDlead_id = substr($CIDlead_id, 11, 9); $CIDlead_id = ($CIDlead_id + 0); -if ($V) {print STDERR "\nCALL RECEIVED IN FROM VDAD: $callerid $channel\n";} -if ($M) {print STDERR "+++++ VDCL START : |$unique_id|$channel|$extension|$type|$callerid|$CIDlead_id|$now_date\n";} +if ($AGILOG) {$agi_string = ""+++++ VDAD START : |$CIDlead_id|$now_date|"; &agi_output;} if ($channel =~ /Local/i) { -if ($M) {print STDERR "+++++ VDCL START LOCAL CHANNEL: EXITING\n";} +if ($AGILOG) {$agi_string = ""+++++ VDAD START LOCAL CHANNEL: EXITING- $priority"; &agi_output;} exit; } - -$dbhA = DBI->connect("DBI:mysql:$VARDB_database:$VARDB_server:$VARDB_port", "$VARDB_user", "$VARDB_pass") - or die "Couldn't connect to database: " . DBI->errstr; - ### Grab Server values from the database $cbc=0; -$stmtA = "SELECT voicemail_dump_exten,ext_context,answer_transfer_agent,local_gmt,asterisk_version,max_vicidial_trunks FROM servers where server_ip = '$server_ip';"; +$stmtA = "SELECT voicemail_dump_exten,ext_context,answer_transfer_agent,local_gmt,asterisk_version,max_vicidial_trunks 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; @@ -301,18 +307,19 @@ $sthA->finish(); ### insert a LIVE record to the vicidial_auto_calls table -$stmtA = "INSERT INTO vicidial_auto_calls values('','$server_ip','$channel_group','LIVE','$CIDlead_id','$uniqueid','$callerid','$channel','$VDADphone_code','$VDADphone','$SQLdate','IN')"; +$stmtA = "INSERT INTO vicidial_auto_calls values('','$VARserver_ip','$channel_group','LIVE','$CIDlead_id','$uniqueid','$callerid','$channel','$VDADphone_code','$VDADphone','$SQLdate','IN')"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); $stmtA = "INSERT INTO vicidial_closer_log (lead_id,campaign_id,call_date,start_epoch,status,phone_code,phone_number,user,processed) values('$CIDlead_id','$VDADcampaign','$SQLdate','$now_date_epoch','QUEUE','$VDADphone_code','$VDADphone','VDCL','N')"; - if($M){print STDERR "\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if ($M) {print STDERR "-- VDCL : |$VDADlead_id|$CIDlead_id|insert to vicidial_closer_log\n";} +if ($AGILOG) {$agi_string = "-- VDCL : |$VDADlead_id|$CIDlead_id|insert to vicidial_closer_log"; &agi_output;} $stmtA = "INSERT INTO vicidial_xfer_log (lead_id,campaign_id,call_date,phone_code,phone_number,user,closer) values('$CIDlead_id','$VDADcampaign','$SQLdate','$VDADphone_code','$VDADphone','$VDADfronter','VDXL')"; - if($M){print STDERR "\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if ($M) {print STDERR "-- VDXL : |$VDADlead_id|$CIDlead_id|insert to vicidial_closer_log\n";} +if ($AGILOG) {$agi_string = "-- VDXL : |$VDADlead_id|$CIDlead_id|insert to vicidial_xfer_log"; &agi_output;} $drop_timer=0; @@ -325,7 +332,7 @@ while ($drop_timer <= $DROP_TIME) $channel_status = $AGI->channel_status("$channel"); if ($channel_status < 1) { - print STDERR "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer CHECKING AGAIN...\n"; + if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer CHECKING AGAIN"; &agi_output;} ### sleep for 99 hundredths of a second usleep(1*990*1000); @@ -333,12 +340,11 @@ if ($channel_status < 1) if ($channel_status_DC < 1) { - print STDERR "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer\n"; + if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer"; &agi_output;} if ($drop_timer < 360) {$drop_seconds = $drop_timer;} $drop_timer = ($drop_timer + 360); } } - $cbc=0; $stmtA = "SELECT next_agent_call FROM vicidial_inbound_groups where group_id='$channel_group';"; $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; @@ -353,19 +359,16 @@ if ($channel_status < 1) } $sthA->finish(); - $agent_call_order='order by last_call_finish'; if ($CAMP_callorder =~ /overall_user_level/i) {$agent_call_order = 'order by user_level desc,last_call_finish';} if ($CAMP_callorder =~ /oldest_call_start/i) {$agent_call_order = 'order by last_call_time';} if ($CAMP_callorder =~ /oldest_call_finish/i) {$agent_call_order = 'order by last_call_finish';} if ($CAMP_callorder =~ /random/i) {$agent_call_order = 'order by random_id';} - - - $rec_countWAIT=0; - $cbc=0; - $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip='$server_ip' and campaign_id = '$channel_group' and call_time < \"$SQLdateBEGIN\" and lead_id != '$VDADlead_id';"; - if($M){print STDERR "\n\n|$stmtA|\n";} + $rec_countWAIT=0; + $cbc=0; + $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip='$VARserver_ip' and campaign_id = '$channel_group' and call_time < \"$SQLdateBEGIN\" and lead_id != '$VDADlead_id';"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -380,14 +383,14 @@ if ($channel_status < 1) if ($rec_countWAIT < 1) { - $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$CIDlead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid' where status IN('CLOSER','READY') and server_ip='$server_ip' and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $VDADcampaign %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; + $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$CIDlead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid' where status IN('CLOSER','READY') and server_ip='$VARserver_ip' and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $VDADcampaign %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDAD get agent: |$affected_rows|update of vla table: $VDADcampaign|$server_ip\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "-- VDAD get agent: |$affected_rows|$VDADcampaign|$stmtA|"; &agi_output;} if ($affected_rows > 0) { $cbc=0; - $stmtA = "SELECT conf_exten,user,extension FROM vicidial_live_agents where status = 'QUEUE' and server_ip='$server_ip' and campaign_id LIKE \"%CLOSER%\" and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} + $stmtA = "SELECT conf_exten,user,extension FROM vicidial_live_agents where status = 'QUEUE' and server_ip='$VARserver_ip' and campaign_id LIKE \"%CLOSER%\" and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -403,18 +406,16 @@ if ($channel_status < 1) $sthA->finish(); $stmtA = "UPDATE vicidial_auto_calls set status='CLOSER' where callerid='$callerid';"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL XFER : |$affected_rows|update of vac table: $callerid\n|$stmtA|\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL XFER : |$affected_rows|$callerid\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_xfer_log set closer='$VDADuser' where lead_id = '$CIDlead_id' order by call_date desc limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDXL vicidial_xfer_log update: |$affected_rows|$CIDlead_id|$VDADuser\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDXL XFER vicidial_xfer_log update: |$affected_rows|$CIDlead_id|$VDADuser\n|$stmtA|"; &agi_output;} - $dbhA->disconnect(); - print STDERR "\nexiting the VDAD app, transferring call to $VDADconf_exten\n"; + if ($AGILOG) {$agi_string = "exiting VDAD app, transferring call to $VDADconf_exten"; &agi_output;} print "SET CONTEXT $ext_context\n"; checkresult($result); print "SET EXTENSION $VDADconf_exten\n"; @@ -433,28 +434,27 @@ if ($channel_status < 1) $now_date_epoch = time(); $now_date = "$year-$mon-$mday $hour:$min:$sec"; - print STDERR "\nXXXXXXXXXX VDAD transferred: start|stop $start_time|$now_date\n"; + if ($AGILOG) {$agi_string = "XXXXX VDAD transferred: start|stop $start_time|$now_date"; &agi_output;} exit; } else { - print STDERR "NNNNNNNNNN No agent record found!!!\n"; + if ($AGILOG) {$agi_string = "NNNNN No available agent found"; &agi_output;} } } else { - print STDERR "WWWWWWWW VDAD XFER WAIT: |$rec_countWAIT|$channel_group|$channel|$callerid|$uniqueid|\n"; + if ($AGILOG) {$agi_string = "WWWWW VDAD XFER WAIT: |$rec_countWAIT|$channel_group|$channel|$callerid|$uniqueid|"; &agi_output;} } ################################################################################################### ### noone found locally available, now check for someone on another server to take the call - - $rec_countWAITrem=0; - $cbc=0; - $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip!='$server_ip' and campaign_id = '$channel_group' and call_time < \"$SQLdateBEGIN\" and lead_id != '$VDADlead_id';"; - if($M){print STDERR "\n\n|$stmtA|\n";} + $cbc=0; + $rec_countWAITrem=0; + $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip!='$VARserver_ip' and campaign_id = '$channel_group' and call_time < \"$SQLdateBEGIN\" and lead_id != '$VDADlead_id';"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -468,14 +468,14 @@ if ($channel_status < 1) if ($rec_countWAITrem < 1) { - $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$CIDlead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid', call_server_ip='$server_ip' where status IN('CLOSER','READY') and server_ip!='$server_ip' and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $VDADcampaign %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; + $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$CIDlead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid', call_server_ip='$VARserver_ip' where status IN('CLOSER','READY') and server_ip!='$VARserver_ip' and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $VDADcampaign %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDAD get agent: |$affected_rows|update of vla table: $VDADcampaign|$server_ip\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "-- VDAD get agent: |$DROP_TIME|$drop_timer|$affected_rows|update of vla table: $channel_group|\n|$stmtA|"; &agi_output;} if ($affected_rows > 0) { $cbc=0; - $stmtA = "SELECT conf_exten,user,extension,server_ip FROM vicidial_live_agents where status = 'QUEUE' and server_ip!='$server_ip' and campaign_id LIKE \"%CLOSER%\" and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} + $stmtA = "SELECT conf_exten,user,extension,server_ip FROM vicidial_live_agents where status = 'QUEUE' and server_ip!='$VARserver_ip' and campaign_id LIKE \"%CLOSER%\" and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -489,17 +489,15 @@ if ($channel_status < 1) $VDADserver_ip = "$aryA[3]"; $cbc++; } - $sthA->finish(); + $sthA->finish(); $stmtA = "UPDATE vicidial_auto_calls set status='CLOSER' where callerid='$callerid';"; my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL XFER REMOTE: |$affected_rows|update of vac table: $callerid\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "-- VDCL XFER REMOTE: |$affected_rows|update of vac table: $callerid\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_xfer_log set closer='$VDADuser' where lead_id = '$CIDlead_id' order by call_date desc limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDXL vicidial_xfer_log update: |$affected_rows|$CIDlead_id|$VDADuser\n";} - + if ($AGILOG) {$agi_string = "-- VDXL vicidial_xfer_log update: |$affected_rows|$new_lead_id|$VDADuser\n|$stmtA|"; &agi_output;} $dbhA->disconnect(); @@ -515,7 +513,7 @@ if ($channel_status < 1) } $VDADremDIALstr .= "$VDADconf_exten"; - print STDERR "\nexiting the VDAD app, transferring call to $VDADremDIALstr\n"; + if ($AGILOG) {$agi_string = "exiting VDAD app, transferring call to $VDADremDIALstr"; &agi_output;} print "SET CONTEXT $ext_context\n"; checkresult($result); print "SET EXTENSION $VDADremDIALstr\n"; @@ -534,27 +532,20 @@ if ($channel_status < 1) $now_date_epoch = time(); $now_date = "$year-$mon-$mday $hour:$min:$sec"; - print STDERR "\nXXXXXXXXXX VDAD transferred: start|stop $start_time|$now_date\n"; + if ($AGILOG) {$agi_string = "XXXXX VDAD transferred: start|stop $start_time|$now_date"; &agi_output;} exit; } else { - print STDERR "NNNNNNNNNN No agent record found!!!\n"; + if ($AGILOG) {$agi_string = "NNNNN No available remote agent found"; &agi_output;} } } else { - print STDERR "WWWWWWWW VDAD XFER REMOTE WAIT: |$rec_countWAIT|$channel_group|$channel|$callerid|$uniqueid|\n"; + if ($AGILOG) {$agi_string = "WWWWW VDAD XFER REMOTE WAIT: |$rec_countWAITrem|$channel_group|$channel|$callerid|$uniqueid|"; &agi_output;} } - - - - - ### sleep for 99 hundredths of a second - usleep(1*990*1000); - if ($hold_message_counter > 30) { $AGI->stream_file('generic_hold'); @@ -568,7 +559,20 @@ if ($hold_tone_counter > 3) } else {$hold_tone_counter++;} -$drop_timer++; +if ($drop_timer < 3) + { + ### sleep for 44.5 hundredths of a second + usleep(1*445*1000); + + $drop_timer = ($drop_timer + 0.5); + } +else + { + ### sleep for 99 hundredths of a second + usleep(1*990*1000); + + $drop_timer++; + } } @@ -603,22 +607,20 @@ if ($drop_seconds < 1) { $cbc=0; $stmtA = "SELECT voicemail_ext FROM vicidial_inbound_groups where group_id = '$channel_group' limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; - $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; - $sthArows=$sthA->rows; - $rec_countCUSTDATA=0; - while ($sthArows > $cbc) - { - $VDADvoicemail_ext = "$aryA[0]"; - $VDADvoicemail_ext =~ s/\D//gi; - $DROPexten = "$voicemail_dump_exten$VDADvoicemail_ext"; - - $cbc++; - } - $sthA->finish(); - + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $rec_countCUSTDATA=0; + while ($sthArows > $cbc) + { + @aryA = $sthA->fetchrow_array; + $VDADvoicemail_ext = "$aryA[0]"; + $VDADvoicemail_ext =~ s/\D//gi; + $DROPexten = "$voicemail_dump_exten$VDADvoicemail_ext"; + $cbc++; + } + $sthA->finish(); } } @@ -628,7 +630,7 @@ if ($drop_seconds < 1) if (length($DROPexten)>0) { ### if DROP extension is defined then send the dropped call there instead of hangup - print STDERR "\nexiting the VDAD app, transferring call to $DROPexten\n"; + if ($AGILOG) {$agi_string = "exiting the VDAD app, transferring call to $DROPexten"; &agi_output;} print "SET CONTEXT $ext_context\n"; checkresult($result); print "SET EXTENSION $DROPexten\n"; @@ -639,32 +641,25 @@ if ($drop_seconds < 1) else { ### insert a NEW record to the vicidial_manager table to be processed - $stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$server_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')"; - $dbhA->do($stmtA) or die "Couldn't execute query:\n"; - if ($M) {print STDERR "-- VDCL call_hungup timout: |$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager\n";} + $stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$VARserver_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')"; + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL call_hungup timout: |$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager"; &agi_output;} } - $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' and server_ip='$server_ip' order by call_time desc limit 1;"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vac record deleted: |$affected_rows| $VDADcampaign|$server_ip\n";} + $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' and server_ip='$VARserver_ip' order by call_time desc limit 1;"; + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vac record deleted: |$affected_rows| $VDADcampaign|"; &agi_output;} $stmtA = "UPDATE vicidial_closer_log set status='DROP',end_epoch='$now_date_epoch',length_in_sec='$drop_seconds' where lead_id = '$CIDlead_id' order by start_epoch desc limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vicidial_closer_log update: |$affected_rows|$CIDlead_id\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vcl update: |$affected_rows|$CIDlead_id|\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_list set status='XDROP' where lead_id = '$CIDlead_id';"; - if($M){print STDERR "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vicidial_list update: |$affected_rows|$CIDlead_id\n";} - + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vl update: |$affected_rows|$CIDlead_id|\n|$stmtA|"; &agi_output;} } - - - $dbhA->disconnect(); - - +$dbhA->disconnect(); exit; @@ -694,3 +689,20 @@ sub leading_zero($) { s/^(\d\d)$/0$1/; return $_; } # End of the leading_zero() routine. + + +sub agi_output +{ +if ($AGILOG >=2) + { + ### open the log file for writing ### + open(Lout, ">>$AGILOGfile") + || die "Can't open $AGILOGfile: $!\n"; + print Lout "$now_date|$script|$agi_string\n"; + close(Lout); + } + ### send to STDERR writing ### +if ( ($AGILOG == '1') || ($AGILOG == '3') ) + {print STDERR "$now_date|$script|$agi_string\n";} +$agi_string=''; +} diff --git a/agc_2-X/trunk/agi/agi-VDAD_LO_closer_inbound.agi b/agc_2-X/trunk/agi/agi-VDAD_LO_closer_inbound.agi index b74c11cf..a538fd20 100644 --- a/agc_2-X/trunk/agi/agi-VDAD_LO_closer_inbound.agi +++ b/agc_2-X/trunk/agi/agi-VDAD_LO_closer_inbound.agi @@ -1,6 +1,6 @@ #!/usr/bin/perl # -# agi-VDAD_LO_closer_inbound.agi version 0.4 *DBI-version* +# agi-VDAD_LO_closer_inbound.agi version 0.5 *DBI-version* # # runs when a call comes in from an inbound call. This script will # send the calls out to the closers that are logged in. @@ -33,14 +33,43 @@ # 60504-1214 - Added drop second/message/exten options from inbound_group # 60809-1056 - Changed to DBI by Marin Blu # - changed to use /etc/astguiclient.conf for configs +# 60821-1021 - added output options check from database +# - changed look for agent every 0.5 second for first 4 sec on hold # -$V = 1; # set to 1 for verbose mode -$M = 1; # set to 1 for 2 line messages mode +$script = 'agi-VDAD_LO_closer_inbound.agi'; $DROP_TIME = 360; ### default number of seconds to wait until you drop a waiting call +($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) {$Fhour = "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"; +$start_time=$now_date; + $CIDdate = "$mon$mday$hour$min$sec"; + $tsSQLdate = "$year$mon$mday$hour$min$sec"; + $SQLdate = "$year-$mon-$mday $hour:$min:$sec"; + $SQLdateBEGIN = $SQLdate; + +$BDtarget = ($secX - 5); +($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget); +$Byear = ($Byear + 1900); +$Bmon++; +if ($Bmon < 10) {$Bmon = "0$Bmon";} +if ($Bmday < 10) {$Bmday = "0$Bmday";} +if ($Bhour < 10) {$Bhour = "0$Bhour";} +if ($Bmin < 10) {$Bmin = "0$Bmin";} +if ($Bsec < 10) {$Bsec = "0$Bsec";} + $BDtsSQLdate = "$Byear$Bmon$Bmday$Bhour$Bmin$Bsec"; + # default path to astguiclient configuration file: $PATHconf = '/etc/astguiclient.conf'; @@ -79,55 +108,45 @@ foreach(@conf) $i++; } -# Customized Variables -$server_ip = $VARserver_ip; # Asterisk server IP if (!$VARDB_port) {$VARDB_port='3306';} +if (!$AGILOGfile) {$AGILOGfile = "$PATHlogs/agiout.$year-$mon-$mday";} use DBI; use Time::HiRes ('gettimeofday','usleep','sleep'); # necessary to have perl sleep command of less than one second 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; -($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) {$Fhour = "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"; -$start_time=$now_date; - $CIDdate = "$mon$mday$hour$min$sec"; - $tsSQLdate = "$year$mon$mday$hour$min$sec"; - $SQLdate = "$year-$mon-$mday $hour:$min:$sec"; - $SQLdateBEGIN = $SQLdate; - -$BDtarget = ($secX - 5); -($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget); -$Byear = ($Byear + 1900); -$Bmon++; -if ($Bmon < 10) {$Bmon = "0$Bmon";} -if ($Bmday < 10) {$Bmday = "0$Bmday";} -if ($Bhour < 10) {$Bhour = "0$Bhour";} -if ($Bmin < 10) {$Bmin = "0$Bmin";} -if ($Bsec < 10) {$Bsec = "0$Bsec";} - $BDtsSQLdate = "$Byear$Bmon$Bmday$Bhour$Bmin$Bsec"; - +### Grab Server values from the database +$stmtA = "SELECT agi_output 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; +$rec_count=0; +while ($sthArows > $rec_count) + { + $AGILOG = '0'; + @aryA = $sthA->fetchrow_array; + $DBagi_output = "$aryA[0]"; + if ($DBagi_output =~ /STDERR/) {$AGILOG = '1';} + if ($DBagi_output =~ /FILE/) {$AGILOG = '2';} + if ($DBagi_output =~ /BOTH/) {$AGILOG = '3';} + $rec_count++; + } +$sthA->finish(); ### begin parsing run-time options ### if (length($ARGV[0])>1) { -if ($V) {print STDERR "Perl Environment Dump:\n";} + if ($AGILOG) {$agi_string = "Perl Environment Dump:"; &agi_output;} $i=0; while ($#ARGV >= $i) { $args = "$args $ARGV[$i]"; - if ($V) {print STDERR "$i|$ARGV[$i]|\n";} + if ($AGILOG) {$agi_string = "$i|$ARGV[$i]"; &agi_output;} $i++; } @@ -172,16 +191,12 @@ if ($V) {print STDERR "Perl Environment Dump:\n";} } } } -else -{ -if ($V) {print "no command line options set\n";} -} $|=1; while() { chomp; last unless length($_); - if ($V) + if ($AGILOG) { if (/^agi_(\w+)\:\s+(.*)$/) { @@ -230,48 +245,34 @@ while() { # } } - if ($V) - { +foreach $i (sort keys %AGI) +{ + if ($AGILOG) {$agi_string = " -- $i = $AGI{$i}"; &agi_output;} +} - if ($V) {print STDERR "AGI Environment Dump:\n";} - foreach $i (sort keys %AGI) { - if ($V) {print STDERR " -- $i = $AGI{$i}\n";} - } - } +if ($AGILOG) {$agi_string = "AGI Variables: |$unique_id|$channel|$extension|$type|$callerid|"; &agi_output;} $AGI->stream_file('beep'); - if ($V) {print STDERR "\nINBOUND CALL VDCL STARTED\n";} - &enter_pin_number; $fronter = $pin; -if ($M) {print STDERR "+++++ INBOUND CALL VDCL STARTED : |$unique_id|$channel_group|$channel|$extension|$type|$callerid-$pin|$now_date\n";} +if ($AGILOG) {$agi_string = ""+++++ INBOUND CALL VDCL STARTED : |$channel_group|$callerid-$pin|$now_date"; &agi_output;} $VDADphone=''; $VDADphone_code=''; -if ($V) {print STDERR "AGI Environment Dump: |$unique_id|$channel|$extension|$type|$callerid|\n";} - - -if ($V) {print STDERR "\nINBOUND CALL RECEIVED IN FROM VDCL: $callerid $channel\n";} -if ($M) {print STDERR "+++++ INBOUND VDCL START : |$unique_id|$channel|$extension|$type|$now_date\n";} - if ($channel =~ /Local/i) { -if ($M) {print STDERR "+++++ VDCL START LOCAL CHANNEL: EXITING\n";} +if ($AGILOG) {$agi_string = ""+++++ VDAD START LOCAL CHANNEL: EXITING- $priority"; &agi_output;} exit; } - -$dbhA = DBI->connect("DBI:mysql:$VARDB_database:$VARDB_server:$VARDB_port", "$VARDB_user", "$VARDB_pass") - or die "Couldn't connect to database: " . DBI->errstr; - ### Grab Server values from the database $cbc=0; -$stmtA = "SELECT voicemail_dump_exten,ext_context,answer_transfer_agent,local_gmt,asterisk_version,max_vicidial_trunks FROM servers where server_ip = '$server_ip';"; +$stmtA = "SELECT voicemail_dump_exten,ext_context,answer_transfer_agent,local_gmt,asterisk_version,max_vicidial_trunks 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; @@ -312,7 +313,7 @@ while ($sthArows > $cbc) $sthA->finish(); $new_lead_id = $insert_lead_id; -if($M){print STDERR "\n|$stmtA|$new_lead_id|\n";} +if ($AGILOG) {$agi_string = "|$stmtA|$new_lead_id|"; &agi_output;} $PADlead_id = sprintf("%09s", $new_lead_id); while (length($PADlead_id) > 9) {chop($PADlead_id);} # YmmddhhmmssLLLLLLLLL @@ -321,7 +322,7 @@ $PADlead_id = sprintf("%09s", $new_lead_id); while (length($PADlead_id) > 9) {ch ### set the callerid print "SET CALLERID $YqueryCID\n"; checkresult($result); -print STDERR "callerID changed: $YqueryCID\n"; +if ($AGILOG) {$agi_string = "callerID changed: $YqueryCID"; &agi_output;} ### Grab inbound_group values from the database $cbc=0; @@ -343,26 +344,25 @@ while ($sthArows > $cbc) $sthA->finish(); - ### insert a LIVE record to the vicidial_auto_calls table -$stmtA = "INSERT INTO vicidial_auto_calls values('','$server_ip','$channel_group','LIVE','$new_lead_id','$uniqueid','$callerid','$channel','$phone_code','$phone_number','$SQLdate','IN')"; +$stmtA = "INSERT INTO vicidial_auto_calls values('','$VARserver_ip','$channel_group','LIVE','$new_lead_id','$uniqueid','$callerid','$channel','$phone_code','$phone_number','$SQLdate','IN')"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if($M){print STDERR "\n|$stmtA|\n";} $stmtA = "INSERT INTO vicidial_log (uniqueid,lead_id,campaign_id,call_date,start_epoch,status,phone_code,phone_number,user,processed) values('$uniqueid','$new_lead_id','$channel_group','$SQLdate','$now_date_epoch','XFER','$phone_code','$phone_number','$fronter','N')"; - if($M){print STDERR "\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if ($M) {print STDERR "-- VDAD : |$new_lead_id|$fronter|insert to vicidial_log: $uniqueid\n";} +if ($AGILOG) {$agi_string = "-- VDAD : |$new_lead_id|$fronter|insert to vicidial_log: $uniqueid"; &agi_output;} $stmtA = "INSERT INTO vicidial_closer_log (lead_id,campaign_id,call_date,start_epoch,status,phone_code,phone_number,user,processed) values('$new_lead_id','$channel_group','$SQLdate','$now_date_epoch','QUEUE','$phone_code','$phone_number','VDCL','N')"; - if($M){print STDERR "\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if ($M) {print STDERR "-- VDCL : |$new_lead_id|insert to vicidial_closer_log\n";} +if ($AGILOG) {$agi_string = "-- VDCL : |$new_lead_id|insert to vicidial_closer_log"; &agi_output;} $stmtA = "INSERT INTO vicidial_xfer_log (lead_id,campaign_id,call_date,phone_code,phone_number,user,closer) values('$new_lead_id','$channel_group','$SQLdate','$phone_code','$phone_number','$fronter','VDXL')"; - if($M){print STDERR "\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if ($M) {print STDERR "-- VDXL : |$new_lead_id|insert to vicidial_closer_log\n";} +if ($AGILOG) {$agi_string = "-- VDXL : |$new_lead_id|insert to vicidial_xfer_log"; &agi_output;} $VDADlead_id = $new_lead_id; @@ -376,7 +376,7 @@ while ($drop_timer <= $DROP_TIME) $channel_status = $AGI->channel_status("$channel"); if ($channel_status < 1) { - print STDERR "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer CHECKING AGAIN...\n"; + if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer CHECKING AGAIN"; &agi_output;} ### sleep for 99 hundredths of a second usleep(1*990*1000); @@ -384,15 +384,13 @@ if ($channel_status < 1) if ($channel_status_DC < 1) { - print STDERR "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer\n"; + if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer"; &agi_output;} if ($drop_timer < 360) {$drop_seconds = $drop_timer;} $drop_timer = ($drop_timer + 360); } } - $cbc=0; $stmtA = "SELECT next_agent_call FROM vicidial_inbound_groups where group_id='$channel_group';"; - $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -413,8 +411,8 @@ if ($channel_status < 1) $rec_countWAIT=0; $cbc=0; - $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip='$server_ip' and campaign_id = '$channel_group' and call_time < \"$SQLdateBEGIN\" and lead_id != '$VDADlead_id';"; - if($M){print STDERR "\n\n|$stmtA|\n";} + $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip='$VARserver_ip' and campaign_id = '$channel_group' and call_time < \"$SQLdateBEGIN\" and lead_id != '$VDADlead_id';"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -429,15 +427,14 @@ if ($channel_status < 1) if ($rec_countWAIT < 1) { - $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$new_lead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid' where status IN('CLOSER','READY') and server_ip='$server_ip' and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $channel_group %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; + $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$new_lead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid' where status IN('CLOSER','READY') and server_ip='$VARserver_ip' and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $channel_group %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDAD get agent: |$DROP_TIME|$drop_timer|$affected_rows|update of vla table: $channel_group|$server_ip\n";} - # if ($M) {print STDERR "|$stmtA|\n";} + if ($AGILOG) {$agi_string = "-- VDAD get agent: |$affected_rows|$channel_group|$stmtA|"; &agi_output;} if ($affected_rows > 0) { $cbc=0; - $stmtA = "SELECT conf_exten,user,extension FROM vicidial_live_agents where status = 'QUEUE' and server_ip='$server_ip' and campaign_id LIKE \"%CLOSER%\" and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} + $stmtA = "SELECT conf_exten,user,extension FROM vicidial_live_agents where status = 'QUEUE' and server_ip='$VARserver_ip' and campaign_id LIKE \"%CLOSER%\" and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -455,21 +452,20 @@ if ($channel_status < 1) $sthA->finish(); $stmtA = "UPDATE vicidial_auto_calls set status='CLOSER' where callerid='$callerid';"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL XFER : |$affected_rows|update of vac table: $callerid\n|$stmtA|\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL XFER : |$affected_rows|$callerid\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_xfer_log set closer='$VDADuser' where lead_id = '$new_lead_id' order by call_date desc limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDXL vicidial_xfer_log update: |$affected_rows|$new_lead_id|$VDADuser\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDXL XFER vicidial_xfer_log update: |$affected_rows|$new_lead_id|$VDADuser\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_closer_log set user='$VDADuser' where lead_id='$new_lead_id' order by call_date desc limit 1;"; my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- closer log : |$affected_rows|update of vcl table: $new_lead_id\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "-- closer log : |$affected_rows|$new_lead_id\n|$stmtA|"; &agi_output;} $dbhA->disconnect(); - print STDERR "\nexiting the VDAD app, transferring call to $VDADconf_exten\n"; + if ($AGILOG) {$agi_string = "exiting VDAD app, transferring call to $VDADconf_exten"; &agi_output;} print "SET CONTEXT $ext_context\n"; checkresult($result); print "SET EXTENSION $VDADconf_exten\n"; @@ -488,30 +484,29 @@ if ($channel_status < 1) $now_date_epoch = time(); $now_date = "$year-$mon-$mday $hour:$min:$sec"; - print STDERR "\nXXXXXXXXXX VDAD transferred: start|stop $start_time|$now_date\n"; + if ($AGILOG) {$agi_string = "XXXXX VDAD transferred: start|stop $start_time|$now_date"; &agi_output;} exit; } else { - print STDERR "NNNNNNNNNN No agent record found!!!\n"; + if ($AGILOG) {$agi_string = "NNNNN No available agent found"; &agi_output;} } } else { - print STDERR "WWWWWWWW VDAD XFER WAIT: |$rec_countWAIT|$channel_group|$channel|$callerid|$uniqueid|\n"; + if ($AGILOG) {$agi_string = "WWWWW VDAD XFER WAIT: |$rec_countWAIT|$channel_group|$channel|$callerid|$uniqueid|"; &agi_output;} } ################################################################################################### ### noone found locally available, now check for someone on another server to take the call - $cbc=0; - $rec_countWAITrem=0; - $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip!='$server_ip' and campaign_id = '$channel_group' and call_time < \"$SQLdateBEGIN\" and lead_id != '$VDADlead_id';"; - if($M){print STDERR "\n\n|$stmtA|\n";} + $cbc=0; + $rec_countWAITrem=0; + $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip!='$VARserver_ip' and campaign_id = '$channel_group' and call_time < \"$SQLdateBEGIN\" and lead_id != '$VDADlead_id';"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; - while ($sthArows > $cbc) { @aryA = $sthA->fetchrow_array; @@ -522,46 +517,40 @@ if ($channel_status < 1) if ($rec_countWAITrem < 1) { - $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$new_lead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid', call_server_ip='$server_ip' where status IN('CLOSER','READY') and server_ip!='$server_ip' and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $channel_group %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; + $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$new_lead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid', call_server_ip='$VARserver_ip' where status IN('CLOSER','READY') and server_ip!='$VARserver_ip' and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $channel_group %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; my $affected_rows = $dbhA->do($stmtA); - my $affected_rows = $dbhA->get_affected_rows_length; - if ($M) {print STDERR "-- VDAD get agent: |$DROP_TIME|$drop_timer|$affected_rows|update of vla table: $channel_group|$server_ip\n";} - # if ($M) {print STDERR "|$stmtA|\n";} + if ($AGILOG) {$agi_string = "-- VDAD get agent: |$DROP_TIME|$drop_timer|$affected_rows|update of vla table: $channel_group|\n|$stmtA|"; &agi_output;} if ($affected_rows > 0) { $cbc=0; - $stmtA = "SELECT conf_exten,user,extension,server_ip FROM vicidial_live_agents where status = 'QUEUE' and server_ip!='$server_ip' and campaign_id LIKE \"%CLOSER%\" and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - + $stmtA = "SELECT conf_exten,user,extension,server_ip FROM vicidial_live_agents where status = 'QUEUE' and server_ip!='$VARserver_ip' and campaign_id LIKE \"%CLOSER%\" and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; $rec_countCUSTDATA=0; - while ($sthArows > $cbc) + while ($sthArows > $cbc) { @aryA = $sthA->fetchrow_array; - $VDADconf_exten = "$aryA[0]"; $VDADuser = "$aryA[1]"; $VDADextension = "$aryA[2]"; $VDADserver_ip = "$aryA[3]"; - $cbc++; } $sthA->finish(); $stmtA = "UPDATE vicidial_auto_calls set status='CLOSER' where callerid='$callerid';"; my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL XFER : |$affected_rows|update of vac table: $callerid\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "-- VDCL XFER REMOTE: |$affected_rows|update of vac table: $callerid\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_xfer_log set closer='$VDADuser' where lead_id = '$new_lead_id' order by call_date desc limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDXL vicidial_xfer_log update: |$affected_rows|$new_lead_id|$VDADuser\n";} + if ($AGILOG) {$agi_string = "-- VDXL vicidial_xfer_log update: |$affected_rows|$new_lead_id|$VDADuser\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_closer_log set user='$VDADuser' where lead_id='$new_lead_id' order by call_date desc limit 1;"; my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- closer log : |$affected_rows|update of vcl table: $new_lead_id\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "-- closer log : |$affected_rows|update of vcl table: $new_lead_id\n|$stmtA|"; &agi_output;} $dbhA->disconnect(); @@ -577,7 +566,7 @@ if ($channel_status < 1) } $VDADremDIALstr .= "$VDADconf_exten"; - print STDERR "\nexiting the VDAD app, transferring call to $VDADconf_exten\n"; + if ($AGILOG) {$agi_string = "exiting VDAD app, transferring call to $VDADremDIALstr"; &agi_output;} print "SET CONTEXT $ext_context\n"; checkresult($result); print "SET EXTENSION $VDADremDIALstr\n"; @@ -596,25 +585,20 @@ if ($channel_status < 1) $now_date_epoch = time(); $now_date = "$year-$mon-$mday $hour:$min:$sec"; - print STDERR "\nXXXXXXXXXX VDAD transferred: start|stop $start_time|$now_date\n"; + if ($AGILOG) {$agi_string = "XXXXX VDAD transferred: start|stop $start_time|$now_date"; &agi_output;} exit; } else { - print STDERR "NNNNNNNNNN No agent record found!!!\n"; + if ($AGILOG) {$agi_string = "NNNNN No available remote agent found"; &agi_output;} } } else { - print STDERR "WWWWWWWW VDAD REMOTE XFER WAIT: |$rec_countWAITrem|$channel_group|$channel|$callerid|$uniqueid|\n"; + if ($AGILOG) {$agi_string = "WWWWW VDAD XFER REMOTE WAIT: |$rec_countWAITrem|$channel_group|$channel|$callerid|$uniqueid|"; &agi_output;} } - - - ### sleep for 99 hundredths of a second - usleep(1*990*1000); - if ($hold_message_counter > 30) { $AGI->stream_file('generic_hold'); @@ -628,7 +612,20 @@ if ($hold_tone_counter > 3) } else {$hold_tone_counter++;} -$drop_timer++; +if ($drop_timer < 3) + { + ### sleep for 44.5 hundredths of a second + usleep(1*445*1000); + + $drop_timer = ($drop_timer + 0.5); + } +else + { + ### sleep for 99 hundredths of a second + usleep(1*990*1000); + + $drop_timer++; + } } @@ -663,19 +660,20 @@ if ($drop_seconds < 1) { $cbc=0; $stmtA = "SELECT voicemail_ext FROM vicidial_inbound_groups where group_id = '$channel_group' limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; $rec_countCUSTDATA=0; while ($sthArows > $cbc) { + @aryA = $sthA->fetchrow_array; $VDADvoicemail_ext = "$aryA[0]"; $VDADvoicemail_ext =~ s/\D//gi; $DROPexten = "$voicemail_dump_exten$VDADvoicemail_ext"; $cbc++; } - $sthA->finish(); + $sthA->finish(); } } @@ -685,7 +683,7 @@ if ($drop_seconds < 1) if (length($DROPexten)>0) { ### if DROP extension is defined then send the dropped call there instead of hangup - print STDERR "\nexiting the VDAD app, transferring call to $DROPexten\n"; + if ($AGILOG) {$agi_string = "exiting the VDAD app, transferring call to $DROPexten"; &agi_output;} print "SET CONTEXT $ext_context\n"; checkresult($result); print "SET EXTENSION $DROPexten\n"; @@ -696,39 +694,32 @@ if ($drop_seconds < 1) else { ### insert a NEW record to the vicidial_manager table to be processed - $stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$server_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')"; - $affected_rows = $dbhA->do($stmtA) or die "Couldn't execute query:\n"; - if ($M) {print STDERR "-- VDCL call_hungup timout: |$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager\n";} + $stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$VARserver_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')"; + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL call_hungup timout: |$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager"; &agi_output;} } - $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' and server_ip='$server_ip' order by call_time desc limit 1;"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vac record deleted: |$affected_rows| $channel_group|$server_ip\n";} + $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' and server_ip='$VARserver_ip' order by call_time desc limit 1;"; + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vac record deleted: |$affected_rows| $VDADcampaign|"; &agi_output;} $stmtA = "UPDATE vicidial_closer_log set status='DROP',end_epoch='$now_date_epoch',length_in_sec='$drop_seconds' where lead_id = '$new_lead_id' order by start_epoch desc limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vicidial_closer_log update: |$affected_rows|$new_lead_id\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vcl update: |$affected_rows|$new_lead_id|\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_list set status='XDROP' where lead_id = '$new_lead_id';"; - if($M){print STDERR "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vicidial_list update: |$affected_rows|$new_lead_id\n";} - + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vl update: |$affected_rows|$new_lead_id|\n|$stmtA|"; &agi_output;} } - - - $dbhA->disconnect(); - - - +$dbhA->disconnect(); exit; sub enter_pin_number { # please enter the pin number followed by the pound key +# please enter your 4 digit pin number $digit=''; undef $digit; @@ -737,7 +728,7 @@ undef $interrupt_digit; $interrupt_digit = $AGI->stream_file('four_digit_id','123456789'); - print STDERR "interrupt_digit |$interrupt_digit|\n"; + if ($AGILOG) {$agi_string = "interrupt_digit |$interrupt_digit|"; &agi_output;} $digits_being_entered=1; $totalDTMF=''; @@ -782,7 +773,7 @@ while ( ($digit_loop_counter < 4) ) if ($digit =~ /\d/) { $totalDTMF = "$totalDTMF$digit"; - print STDERR "digit |$digit| TotalDTMF |$totalDTMF|\n"; + if ($AGILOG) {$agi_string = "digit |$digit| TotalDTMF |$totalDTMF|"; &agi_output;} # $AGI->say_digits("$digit"); undef $digit; } @@ -796,7 +787,7 @@ while ( ($digit_loop_counter < 4) ) $totalDTMF =~ s/\D//gi; $pin = $totalDTMF; -if ($totalDTMF) {print STDERR "digit |$digit| TotalDTMF |$totalDTMF|\n";} +if ($totalDTMF) {if ($AGILOG) {$agi_string = "digit |$digit| TotalDTMF |$totalDTMF|"; &agi_output;}} } @@ -817,11 +808,28 @@ sub checkresult { $pass++; } } else { - print STDERR "FAIL (unexpected result '$res')\n"; + # print STDERR "FAIL (unexpected result '$res')\n"; $fail++; } } -### you're call is very important to us, please stay on the line and you will be transferred to the next available agent \ No newline at end of file +### you're call is very important to us, please stay on the line and you will be transferred to the next available agent + + +sub agi_output +{ +if ($AGILOG >=2) + { + ### open the log file for writing ### + open(Lout, ">>$AGILOGfile") + || die "Can't open $AGILOGfile: $!\n"; + print Lout "$now_date|$script|$agi_string\n"; + close(Lout); + } + ### send to STDERR writing ### +if ( ($AGILOG == '1') || ($AGILOG == '3') ) + {print STDERR "$now_date|$script|$agi_string\n";} +$agi_string=''; +} diff --git a/agc_2-X/trunk/agi/agi-VDADcloser.agi b/agc_2-X/trunk/agi/agi-VDADcloser.agi index dfb09ece..c2f3f126 100644 --- a/agc_2-X/trunk/agi/agi-VDADcloser.agi +++ b/agc_2-X/trunk/agi/agi-VDADcloser.agi @@ -1,6 +1,6 @@ #!/usr/bin/perl # -# agi-VDADcloser.agi version 0.4 *DBI-version* +# agi-VDADcloser.agi version 0.5 *DBI-version* # # runs when a call comes in from a VICIDIAL fronter. This script will # send the calls out to the closers that are logged in. @@ -21,13 +21,42 @@ # 60503-1242 - Added drop second/message/exten options from inbound_group # 60811-1127 - Changed to DBI # 60811-1145 - changed to use /etc/astguiclient.conf for configs +# 60821-1021 - added output options check from database +# - changed look for agent every 0.5 second for first 4 sec on hold # -$V = 1; # set to 1 for verbose mode -$M = 1; # set to 1 for 2 line messages mode +$script = 'agi-VDADcloser.agi'; $DROP_TIME = 360; ### default number of seconds to wait until you drop a waiting call +($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) {$Fhour = "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"; +$start_time=$now_date; + $CIDdate = "$mon$mday$hour$min$sec"; + $tsSQLdate = "$year$mon$mday$hour$min$sec"; + $SQLdate = "$year-$mon-$mday $hour:$min:$sec"; + $SQLdateBEGIN = $SQLdate; + +$BDtarget = ($secX - 5); +($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget); +$Byear = ($Byear + 1900); +$Bmon++; +if ($Bmon < 10) {$Bmon = "0$Bmon";} +if ($Bmday < 10) {$Bmday = "0$Bmday";} +if ($Bhour < 10) {$Bhour = "0$Bhour";} +if ($Bmin < 10) {$Bmin = "0$Bmin";} +if ($Bsec < 10) {$Bsec = "0$Bsec";} + $BDtsSQLdate = "$Byear$Bmon$Bmday$Bhour$Bmin$Bsec"; + # default path to astguiclient configuration file: $PATHconf = '/etc/astguiclient.conf'; @@ -66,57 +95,45 @@ foreach(@conf) $i++; } -# Customized Variables -$server_ip = $VARserver_ip; # Asterisk server IP - if (!$VARDB_port) {$VARDB_port='3306';} +if (!$AGILOGfile) {$AGILOGfile = "$PATHlogs/agiout.$year-$mon-$mday";} use DBI; use Time::HiRes ('gettimeofday','usleep','sleep'); # necessary to have perl sleep command of less than one second 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; - -($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) {$Fhour = "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"; -$start_time=$now_date; - $CIDdate = "$mon$mday$hour$min$sec"; - $tsSQLdate = "$year$mon$mday$hour$min$sec"; - $SQLdate = "$year-$mon-$mday $hour:$min:$sec"; - $SQLdateBEGIN = $SQLdate; - -$BDtarget = ($secX - 5); -($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget); -$Byear = ($Byear + 1900); -$Bmon++; -if ($Bmon < 10) {$Bmon = "0$Bmon";} -if ($Bmday < 10) {$Bmday = "0$Bmday";} -if ($Bhour < 10) {$Bhour = "0$Bhour";} -if ($Bmin < 10) {$Bmin = "0$Bmin";} -if ($Bsec < 10) {$Bsec = "0$Bsec";} - $BDtsSQLdate = "$Byear$Bmon$Bmday$Bhour$Bmin$Bsec"; - +### Grab Server values from the database +$stmtA = "SELECT agi_output 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; +$rec_count=0; +while ($sthArows > $rec_count) + { + $AGILOG = '0'; + @aryA = $sthA->fetchrow_array; + $DBagi_output = "$aryA[0]"; + if ($DBagi_output =~ /STDERR/) {$AGILOG = '1';} + if ($DBagi_output =~ /FILE/) {$AGILOG = '2';} + if ($DBagi_output =~ /BOTH/) {$AGILOG = '3';} + $rec_count++; + } +$sthA->finish(); ### begin parsing run-time options ### if (length($ARGV[0])>1) { -if ($V) {print STDERR "Perl Environment Dump:\n";} + if ($AGILOG) {$agi_string = "Perl Environment Dump:"; &agi_output;} $i=0; while ($#ARGV >= $i) { $args = "$args $ARGV[$i]"; - if ($V) {print STDERR "$i|$ARGV[$i]|\n";} + if ($AGILOG) {$agi_string = "$i|$ARGV[$i]"; &agi_output;} $i++; } @@ -150,16 +167,12 @@ if ($V) {print STDERR "Perl Environment Dump:\n";} } } } -else -{ -if ($V) {print "no command line options set\n";} -} $|=1; while() { chomp; last unless length($_); - if ($V) + if ($AGILOG) { if (/^agi_(\w+)\:\s+(.*)$/) { @@ -196,46 +209,37 @@ while() { ### set the callerid to the filename of the audio for on-hold print "SET CALLERID $JqueryCID\n"; checkresult($result); - print STDERR "callerID changed: $JqueryCID\n"; + if ($AGILOG) {$agi_string = "callerID changed: $JqueryCID"; &agi_output;} } } - if ($V) - { +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|"; &agi_output;} - if ($V) {print STDERR "AGI Environment Dump:\n";} - foreach $i (sort keys %AGI) { - if ($V) {print STDERR " -- $i = $AGI{$i}\n";} - } - } $VDADcampaign=''; $VDADphone=''; $VDADphone_code=''; -if ($V) {print STDERR "AGI Environment Dump: |$unique_id|$channel|$extension|$type|$callerid|\n";} - - $CIDlead_id = $callerid; $CIDlead_id = substr($CIDlead_id, 11, 9); $CIDlead_id = ($CIDlead_id + 0); -if ($V) {print STDERR "\nCALL RECEIVED IN FROM VDAD: $callerid $channel\n";} -if ($M) {print STDERR "+++++ VDCL START : |$unique_id|$channel|$extension|$type|$callerid|$CIDlead_id|$now_date\n";} +if ($AGILOG) {$agi_string = ""+++++ VDAD START : |$CIDlead_id|$now_date|"; &agi_output;} if ($channel =~ /Local/i) { -if ($M) {print STDERR "+++++ VDCL START LOCAL CHANNEL: EXITING\n";} +if ($AGILOG) {$agi_string = ""+++++ VDAD START LOCAL CHANNEL: EXITING- $priority"; &agi_output;} exit; } - -$dbhA = DBI->connect("DBI:mysql:$VARDB_database:$VARDB_server:$VARDB_port", "$VARDB_user", "$VARDB_pass") - or die "Couldn't connect to database: " . DBI->errstr; - ### Grab Server values from the database $cbc=0; -$stmtA = "SELECT voicemail_dump_exten,ext_context,answer_transfer_agent,local_gmt,asterisk_version,max_vicidial_trunks FROM servers where server_ip = '$server_ip';"; +$stmtA = "SELECT voicemail_dump_exten,ext_context,answer_transfer_agent,local_gmt,asterisk_version,max_vicidial_trunks 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; @@ -299,18 +303,19 @@ $sthA->finish(); ### insert a LIVE record to the vicidial_auto_calls table -$stmtA = "INSERT INTO vicidial_auto_calls values('','$server_ip','$channel_group','LIVE','$CIDlead_id','$uniqueid','$callerid','$channel','$VDADphone_code','$VDADphone','$SQLdate','IN')"; +$stmtA = "INSERT INTO vicidial_auto_calls values('','$VARserver_ip','$channel_group','LIVE','$CIDlead_id','$uniqueid','$callerid','$channel','$VDADphone_code','$VDADphone','$SQLdate','IN')"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); $stmtA = "INSERT INTO vicidial_closer_log (lead_id,campaign_id,call_date,start_epoch,status,phone_code,phone_number,user,processed) values('$CIDlead_id','$VDADcampaign','$SQLdate','$now_date_epoch','QUEUE','$VDADphone_code','$VDADphone','VDCL','N')"; - if($M){print STDERR "\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if ($M) {print STDERR "-- VDCL : |$VDADlead_id|$CIDlead_id|insert to vicidial_closer_log\n";} +if ($AGILOG) {$agi_string = "-- VDCL : |$VDADlead_id|$CIDlead_id|insert to vicidial_closer_log"; &agi_output;} $stmtA = "INSERT INTO vicidial_xfer_log (lead_id,campaign_id,call_date,phone_code,phone_number,user,closer) values('$CIDlead_id','$VDADcampaign','$SQLdate','$VDADphone_code','$VDADphone','$VDADfronter','VDXL')"; - if($M){print STDERR "\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if ($M) {print STDERR "-- VDXL : |$VDADlead_id|$CIDlead_id|insert to vicidial_closer_log\n";} +if ($AGILOG) {$agi_string = "-- VDXL : |$VDADlead_id|$CIDlead_id|insert to vicidial_xfer_log"; &agi_output;} $drop_timer=0; @@ -323,7 +328,7 @@ while ($drop_timer <= $DROP_TIME) $channel_status = $AGI->channel_status("$channel"); if ($channel_status < 1) { - print STDERR "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer CHECKING AGAIN...\n"; + if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer CHECKING AGAIN"; &agi_output;} ### sleep for 99 hundredths of a second usleep(1*990*1000); @@ -331,17 +336,16 @@ if ($channel_status < 1) if ($channel_status_DC < 1) { - print STDERR "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer\n"; + if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer"; &agi_output;} if ($drop_timer < 360) {$drop_seconds = $drop_timer;} $drop_timer = ($drop_timer + 360); } } - + $cbc=0; $stmtA = "SELECT next_agent_call FROM vicidial_inbound_groups where group_id='$channel_group';"; $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; - $cbc=0; while ($sthArows > $cbc) { @aryA = $sthA->fetchrow_array; @@ -357,8 +361,8 @@ if ($channel_status < 1) if ($CAMP_callorder =~ /random/i) {$agent_call_order = 'order by random_id';} $rec_countWAIT=0; - $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip='$server_ip' and campaign_id = '$channel_group' and call_time < \"$SQLdateBEGIN\" and lead_id != '$VDADlead_id';"; - if($M){print STDERR "\n\n|$stmtA|\n";} + $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip='$VARserver_ip' and campaign_id = '$channel_group' and call_time < \"$SQLdateBEGIN\" and lead_id != '$VDADlead_id';"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -373,13 +377,13 @@ if ($channel_status < 1) if ($rec_countWAIT < 1) { - $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$CIDlead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid' where status IN('CLOSER','READY') and server_ip='$server_ip' and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $VDADcampaign %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; + $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$CIDlead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid' where status IN('CLOSER','READY') and server_ip='$VARserver_ip' and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $VDADcampaign %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDAD get agent: |$affected_rows|update of vla table: $VDADcampaign|$server_ip\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "-- VDAD get agent: |$affected_rows|$VDADcampaign|$stmtA|"; &agi_output;} if ($affected_rows > 0) { - $stmtA = "SELECT conf_exten,user,extension FROM vicidial_live_agents where status = 'QUEUE' and server_ip='$server_ip' and campaign_id LIKE \"%CLOSER%\" and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} + $stmtA = "SELECT conf_exten,user,extension FROM vicidial_live_agents where status = 'QUEUE' and server_ip='$VARserver_ip' and campaign_id LIKE \"%CLOSER%\" and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -397,16 +401,15 @@ if ($channel_status < 1) $stmtA = "UPDATE vicidial_auto_calls set status='CLOSER' where callerid='$callerid';"; $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL XFER : |$affected_rows|update of vac table: $callerid\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "-- VDCL XFER : |$affected_rows|$callerid\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_xfer_log set closer='$VDADuser' where lead_id = '$CIDlead_id' order by call_date desc limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDXL vicidial_xfer_log update: |$affected_rows|$CIDlead_id|$VDADuser\n";} + if ($AGILOG) {$agi_string = "-- VDXL XFER vicidial_xfer_log update: |$affected_rows|$CIDlead_id|$VDADuser\n|$stmtA|"; &agi_output;} $dbhA->disconnect(); - print STDERR "\nexiting the VDAD app, transferring call to $VDADconf_exten\n"; + if ($AGILOG) {$agi_string = "exiting VDAD app, transferring call to $VDADconf_exten"; &agi_output;} print "SET CONTEXT $ext_context\n"; checkresult($result); print "SET EXTENSION $VDADconf_exten\n"; @@ -425,23 +428,20 @@ if ($channel_status < 1) $now_date_epoch = time(); $now_date = "$year-$mon-$mday $hour:$min:$sec"; - print STDERR "\nXXXXXXXXXX VDAD transferred: start|stop $start_time|$now_date\n"; + if ($AGILOG) {$agi_string = "XXXXX VDAD transferred: start|stop $start_time|$now_date"; &agi_output;} exit; } else { - print STDERR "NNNNNNNNNN No agent record found!!!\n"; + if ($AGILOG) {$agi_string = "NNNNN No available agent found"; &agi_output;} } } else { - print STDERR "WWWWWWWW VDAD XFER WAIT: |$rec_countWAIT|$channel_group|$channel|$callerid|$uniqueid|\n"; + if ($AGILOG) {$agi_string = "WWWWW VDAD XFER WAIT: |$rec_countWAIT|$channel_group|$channel|$callerid|$uniqueid|"; &agi_output;} } - ### sleep for 99 hundredths of a second - usleep(1*990*1000); - if ($hold_message_counter > 30) { $AGI->stream_file('generic_hold'); @@ -455,7 +455,20 @@ if ($hold_tone_counter > 3) } else {$hold_tone_counter++;} -$drop_timer++; +if ($drop_timer < 3) + { + ### sleep for 44.5 hundredths of a second + usleep(1*445*1000); + + $drop_timer = ($drop_timer + 0.5); + } +else + { + ### sleep for 99 hundredths of a second + usleep(1*990*1000); + + $drop_timer++; + } } @@ -488,12 +501,13 @@ if ($drop_seconds < 1) } else { + $cbc=0; $stmtA = "SELECT voicemail_ext FROM vicidial_inbound_groups where group_id = '$channel_group' limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; - $cbc=0; + $rec_countCUSTDATA=0; while ($sthArows > $cbc) { @aryA = $sthA->fetchrow_array; @@ -503,7 +517,6 @@ if ($drop_seconds < 1) $cbc++; } $sthA->finish(); - } } @@ -513,7 +526,7 @@ if ($drop_seconds < 1) if (length($DROPexten)>0) { ### if DROP extension is defined then send the dropped call there instead of hangup - print STDERR "\nexiting the VDAD app, transferring call to $DROPexten\n"; + if ($AGILOG) {$agi_string = "exiting the VDAD app, transferring call to $DROPexten"; &agi_output;} print "SET CONTEXT $ext_context\n"; checkresult($result); print "SET EXTENSION $DROPexten\n"; @@ -524,32 +537,25 @@ if ($drop_seconds < 1) else { ### insert a NEW record to the vicidial_manager table to be processed - $stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$server_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')"; - $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL call_hungup timout: |$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager\n";} + $stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$VARserver_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')"; + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL call_hungup timout: |$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager"; &agi_output;} } - $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' and server_ip='$server_ip' order by call_time desc limit 1;"; + $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' and server_ip='$VARserver_ip' order by call_time desc limit 1;"; $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vac record deleted: |$affected_rows| $VDADcampaign|$server_ip\n";} + if ($AGILOG) {$agi_string = "-- VDCL vac record deleted: |$affected_rows| $VDADcampaign|"; &agi_output;} $stmtA = "UPDATE vicidial_closer_log set status='DROP',end_epoch='$now_date_epoch',length_in_sec='$drop_seconds' where lead_id = '$CIDlead_id' order by start_epoch desc limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vicidial_closer_log update: |$affected_rows|$CIDlead_id\n";} + if ($AGILOG) {$agi_string = "-- VDCL vcl update: |$affected_rows|$CIDlead_id|\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_list set status='XDROP' where lead_id = '$CIDlead_id';"; - if($M){print STDERR "\n\n|$stmtA|\n";} $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vicidial_list update: |$affected_rows|$CIDlead_id\n";} - + if ($AGILOG) {$agi_string = "-- VDCL vl update: |$affected_rows|$CIDlead_id|\n|$stmtA|"; &agi_output;} } - - - $dbhA->disconnect(); - - +$dbhA->disconnect(); exit; @@ -572,3 +578,20 @@ sub checkresult { $fail++; } } + + +sub agi_output +{ +if ($AGILOG >=2) + { + ### open the log file for writing ### + open(Lout, ">>$AGILOGfile") + || die "Can't open $AGILOGfile: $!\n"; + print Lout "$now_date|$script|$agi_string\n"; + close(Lout); + } + ### send to STDERR writing ### +if ( ($AGILOG == '1') || ($AGILOG == '3') ) + {print STDERR "$now_date|$script|$agi_string\n";} +$agi_string=''; +} diff --git a/agc_2-X/trunk/agi/agi-VDADcloser_PHONE.agi b/agc_2-X/trunk/agi/agi-VDADcloser_PHONE.agi index 4f5d9558..46afc5c5 100644 --- a/agc_2-X/trunk/agi/agi-VDADcloser_PHONE.agi +++ b/agc_2-X/trunk/agi/agi-VDADcloser_PHONE.agi @@ -1,6 +1,6 @@ #!/usr/bin/perl # -# agi-VDADcloser_PHONE.agi version 0.4 *DBI-version* +# agi-VDADcloser_PHONE.agi version 0.5 *DBI-version* # # runs when a call comes in from a VICIDIAL fronter from a foreign location. This script will # send the calls out to the closers that are logged in. Customer data is not supplied aside from phone number, @@ -40,13 +40,42 @@ # 60504-1243 - Added drop second/message/exten options from inbound_group # 60811-1100 - Changed to DBI # 60811-1145 - changed to use /etc/astguiclient.conf for configs +# 60821-1021 - added output options check from database +# - changed look for agent every 0.5 second for first 4 sec on hold # -$V = 1; # set to 1 for verbose mode -$M = 1; # set to 1 for 2 line messages mode +$script = 'agi-VDADcloser_PHONE.agi'; $DROP_TIME = 360; ### number of seconds to wait until you drop a waiting call +($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) {$Fhour = "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"; +$start_time=$now_date; + $CIDdate = "$mon$mday$hour$min$sec"; + $tsSQLdate = "$year$mon$mday$hour$min$sec"; + $SQLdate = "$year-$mon-$mday $hour:$min:$sec"; + $SQLdateBEGIN = $SQLdate; + +$BDtarget = ($secX - 5); +($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget); +$Byear = ($Byear + 1900); +$Bmon++; +if ($Bmon < 10) {$Bmon = "0$Bmon";} +if ($Bmday < 10) {$Bmday = "0$Bmday";} +if ($Bhour < 10) {$Bhour = "0$Bhour";} +if ($Bmin < 10) {$Bmin = "0$Bmin";} +if ($Bsec < 10) {$Bsec = "0$Bsec";} + $BDtsSQLdate = "$Byear$Bmon$Bmday$Bhour$Bmin$Bsec"; + # default path to astguiclient configuration file: $PATHconf = '/etc/astguiclient.conf'; @@ -85,57 +114,45 @@ foreach(@conf) $i++; } -# Customized Variables -$server_ip = $VARserver_ip; # Asterisk server IP - if (!$VARDB_port) {$VARDB_port='3306';} +if (!$AGILOGfile) {$AGILOGfile = "$PATHlogs/agiout.$year-$mon-$mday";} use DBI; use Time::HiRes ('gettimeofday','usleep','sleep'); # necessary to have perl sleep command of less than one second 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; - -($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) {$Fhour = "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"; -$start_time=$now_date; - $CIDdate = "$mon$mday$hour$min$sec"; - $tsSQLdate = "$year$mon$mday$hour$min$sec"; - $SQLdate = "$year-$mon-$mday $hour:$min:$sec"; - $SQLdateBEGIN = $SQLdate; - -$BDtarget = ($secX - 5); -($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget); -$Byear = ($Byear + 1900); -$Bmon++; -if ($Bmon < 10) {$Bmon = "0$Bmon";} -if ($Bmday < 10) {$Bmday = "0$Bmday";} -if ($Bhour < 10) {$Bhour = "0$Bhour";} -if ($Bmin < 10) {$Bmin = "0$Bmin";} -if ($Bsec < 10) {$Bsec = "0$Bsec";} - $BDtsSQLdate = "$Byear$Bmon$Bmday$Bhour$Bmin$Bsec"; - +### Grab Server values from the database +$stmtA = "SELECT agi_output 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; +$rec_count=0; +while ($sthArows > $rec_count) + { + $AGILOG = '0'; + @aryA = $sthA->fetchrow_array; + $DBagi_output = "$aryA[0]"; + if ($DBagi_output =~ /STDERR/) {$AGILOG = '1';} + if ($DBagi_output =~ /FILE/) {$AGILOG = '2';} + if ($DBagi_output =~ /BOTH/) {$AGILOG = '3';} + $rec_count++; + } +$sthA->finish(); ### begin parsing run-time options ### if (length($ARGV[0])>1) { -if ($V) {print STDERR "Perl Environment Dump:\n";} + if ($AGILOG) {$agi_string = "Perl Environment Dump:"; &agi_output;} $i=0; while ($#ARGV >= $i) { $args = "$args $ARGV[$i]"; - if ($V) {print STDERR "$i|$ARGV[$i]|\n";} + if ($AGILOG) {$agi_string = "$i|$ARGV[$i]"; &agi_output;} $i++; } @@ -169,16 +186,12 @@ if ($V) {print STDERR "Perl Environment Dump:\n";} } } } -else -{ -if ($V) {print "no command line options set\n";} -} $|=1; while() { chomp; last unless length($_); - if ($V) + if ($AGILOG) { if (/^agi_(\w+)\:\s+(.*)$/) { @@ -220,44 +233,36 @@ while() { } } - if ($V) - { +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|"; &agi_output;} - if ($V) {print STDERR "AGI Environment Dump:\n";} - foreach $i (sort keys %AGI) { - if ($V) {print STDERR " -- $i = $AGI{$i}\n";} - } - } $VDADcampaign=''; $VDADphone=''; $VDADphone_code=''; -if ($V) {print STDERR "AGI Environment Dump: |$unique_id|$channel|$extension|$type|$callerid|\n";} - - $CIDlead_id = $callerid; $CIDlead_id = substr($CIDlead_id, 11, 9); $CIDlead_id = ($CIDlead_id + 0); -if ($V) {print STDERR "\nCALL RECEIVED IN FROM VDAD: $callerid $channel\n";} -if ($M) {print STDERR "+++++ VDCL START : |$unique_id|$channel|$extension|$type|$callerid|$CIDlead_id|$now_date\n";} +if ($AGILOG) {$agi_string = ""+++++ VDAD START : |$CIDlead_id|$now_date|"; &agi_output;} if ($channel =~ /Local/i) { -if ($M) {print STDERR "+++++ VDCL START LOCAL CHANNEL: EXITING\n";} +if ($AGILOG) {$agi_string = ""+++++ VDAD START LOCAL CHANNEL: EXITING- $priority"; &agi_output;} exit; } if (!$list_id) {$list_id = '999';} if (!$phone_code) {$phone_code = '1';} if (!$VLcomments) {$VLcomments = '';} -$dbhA = DBI->connect("DBI:mysql:$VARDB_database:$VARDB_server:$VARDB_port", "$VARDB_user", "$VARDB_pass") - or die "Couldn't connect to database: " . DBI->errstr; - ### Grab Server values from the database $cbc=0; -$stmtA = "SELECT voicemail_dump_exten,ext_context,answer_transfer_agent,local_gmt,asterisk_version,max_vicidial_trunks FROM servers where server_ip = '$server_ip';"; +$stmtA = "SELECT voicemail_dump_exten,ext_context,answer_transfer_agent,local_gmt,asterisk_version,max_vicidial_trunks 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; @@ -300,22 +305,22 @@ $sthA->finish(); $new_lead_id = $insert_lead_id; $CIDlead_id = $new_lead_id; -if($M){print STDERR "\n|$stmtA|$new_lead_id|\n";} +if ($AGILOG) {$agi_string = "|$stmtA|$new_lead_id|"; &agi_output;} - $PADlead_id = sprintf("%09s", $new_lead_id); while (length($PADlead_id) > 9) {chop($PADlead_id);} - # YmmddhhmmssLLLLLLLLL - $YqueryCID = "Y$CIDdate$PADlead_id"; - $callerid = $YqueryCID; - ### set the callerid - print "SET CALLERID $YqueryCID\n"; - checkresult($result); - print STDERR "callerID changed: $YqueryCID\n"; +$PADlead_id = sprintf("%09s", $new_lead_id); while (length($PADlead_id) > 9) {chop($PADlead_id);} +# YmmddhhmmssLLLLLLLLL + $YqueryCID = "Y$CIDdate$PADlead_id"; + $callerid = $YqueryCID; +### set the callerid +print "SET CALLERID $YqueryCID\n"; +checkresult($result); +if ($AGILOG) {$agi_string = "callerID changed: $YqueryCID"; &agi_output;} - $VDADcampaign = "$channel_group"; - $VDADphone = "$cust_phone"; - $VDADphone_code = "$phone_code"; - $VDADlead_id = "$new_lead_id"; - $VDADfronter = "$ref_agent"; +$VDADcampaign = "$channel_group"; +$VDADphone = "$cust_phone"; +$VDADphone_code = "$phone_code"; +$VDADlead_id = "$new_lead_id"; +$VDADfronter = "$ref_agent"; ### Grab inbound_group values from the database $cbc=0; @@ -339,18 +344,18 @@ $sthA->finish(); ### insert a LIVE record to the vicidial_auto_calls table -$stmtA = "INSERT INTO vicidial_auto_calls values('','$server_ip','$channel_group','LIVE','$CIDlead_id','$uniqueid','$callerid','$channel','$VDADphone_code','$VDADphone','$SQLdate','IN')"; +$stmtA = "INSERT INTO vicidial_auto_calls values('','$VARserver_ip','$channel_group','LIVE','$CIDlead_id','$uniqueid','$callerid','$channel','$VDADphone_code','$VDADphone','$SQLdate','IN')"; $affected_rows = $dbhA->do($stmtA); $stmtA = "INSERT INTO vicidial_closer_log (lead_id,campaign_id,call_date,start_epoch,status,phone_code,phone_number,user,processed) values('$CIDlead_id','$VDADcampaign','$SQLdate','$now_date_epoch','QUEUE','$VDADphone_code','$VDADphone','VDCL','N')"; - if($M){print STDERR "\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if ($M) {print STDERR "-- VDCL : |$VDADlead_id|$CIDlead_id|insert to vicidial_closer_log\n";} +if ($AGILOG) {$agi_string = "-- VDCL : |$VDADlead_id|$CIDlead_id|insert to vicidial_closer_log"; &agi_output;} $stmtA = "INSERT INTO vicidial_xfer_log (lead_id,campaign_id,call_date,phone_code,phone_number,user,closer) values('$CIDlead_id','$VDADcampaign','$SQLdate','$VDADphone_code','$VDADphone','$VDADfronter','VDXL')"; - if($M){print STDERR "\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if ($M) {print STDERR "-- VDXL : |$VDADlead_id|$CIDlead_id|insert to vicidial_closer_log\n";} +if ($AGILOG) {$agi_string = "-- VDXL : |$VDADlead_id|$CIDlead_id|insert to vicidial_xferr_log"; &agi_output;} $drop_timer=0; @@ -363,7 +368,7 @@ while ($drop_timer <= $DROP_TIME) $channel_status = $AGI->channel_status("$channel"); if ($channel_status < 1) { - print STDERR "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer CHECKING AGAIN...\n"; + if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer CHECKING AGAIN"; &agi_output;} ### sleep for 99 hundredths of a second usleep(1*990*1000); @@ -371,12 +376,11 @@ if ($channel_status < 1) if ($channel_status_DC < 1) { - print STDERR "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer\n"; + if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer"; &agi_output;} if ($drop_timer < 360) {$drop_seconds = $drop_timer;} $drop_timer = ($drop_timer + 360); } } - $cbc=0; $stmtA = "SELECT next_agent_call FROM vicidial_inbound_groups where group_id='$channel_group';"; $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; @@ -399,8 +403,8 @@ if ($channel_status < 1) $rec_countWAIT=0; $cbc=0; - $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip='$server_ip' and campaign_id = '$channel_group' and call_time < \"$SQLdateBEGIN\" and lead_id != '$VDADlead_id';"; - if($M){print STDERR "\n\n|$stmtA|\n";} + $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip='$VARserver_ip' and campaign_id = '$channel_group' and call_time < \"$SQLdateBEGIN\" and lead_id != '$VDADlead_id';"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -415,14 +419,14 @@ if ($channel_status < 1) if ($rec_countWAIT < 1) { - $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$CIDlead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid' where status IN('CLOSER','READY') and server_ip='$server_ip' and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $VDADcampaign %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; + $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$CIDlead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid' where status IN('CLOSER','READY') and server_ip='$VARserver_ip' and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $VDADcampaign %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDAD get agent: |$affected_rows|update of vla table: $VDADcampaign|$server_ip\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "-- VDAD get agent: |$affected_rows|$VDADcampaign|$stmtA|"; &agi_output;} if ($affected_rows > 0) { $cbc=0; - $stmtA = "SELECT conf_exten,user,extension FROM vicidial_live_agents where status = 'QUEUE' and server_ip='$server_ip' and campaign_id LIKE \"%CLOSER%\" and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} + $stmtA = "SELECT conf_exten,user,extension FROM vicidial_live_agents where status = 'QUEUE' and server_ip='$VARserver_ip' and campaign_id LIKE \"%CLOSER%\" and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -441,16 +445,15 @@ if ($channel_status < 1) $stmtA = "UPDATE vicidial_auto_calls set status='CLOSER' where callerid='$callerid';"; $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL XFER : |$affected_rows|update of vac table: $callerid\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "-- VDCL XFER : |$affected_rows|$callerid\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_xfer_log set closer='$VDADuser' where lead_id = '$CIDlead_id' order by call_date desc limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDXL vicidial_xfer_log update: |$affected_rows|$CIDlead_id|$VDADuser\n";} + if ($AGILOG) {$agi_string = "-- VDXL XFER vicidial_xfer_log update: |$affected_rows|$CIDlead_id|$VDADuser\n|$stmtA|"; &agi_output;} $dbhA->disconnect(); - print STDERR "\nexiting the VDAD app, transferring call to $VDADconf_exten\n"; + if ($AGILOG) {$agi_string = "exiting VDAD app, transferring call to $VDADconf_exten"; &agi_output;} print "SET CONTEXT $ext_context\n"; checkresult($result); print "SET EXTENSION $VDADconf_exten\n"; @@ -469,23 +472,20 @@ if ($channel_status < 1) $now_date_epoch = time(); $now_date = "$year-$mon-$mday $hour:$min:$sec"; - print STDERR "\nXXXXXXXXXX VDAD transferred: start|stop $start_time|$now_date\n"; + if ($AGILOG) {$agi_string = "XXXXX VDAD transferred: start|stop $start_time|$now_date"; &agi_output;} exit; } else { - print STDERR "NNNNNNNNNN No agent record found!!!\n"; + if ($AGILOG) {$agi_string = "NNNNN No available agent found"; &agi_output;} } } else { - print STDERR "WWWWWWWW VDAD XFER WAIT: |$rec_countWAIT|$channel_group|$channel|$callerid|$uniqueid|\n"; + if ($AGILOG) {$agi_string = "WWWWW VDAD XFER WAIT: |$rec_countWAIT|$channel_group|$channel|$callerid|$uniqueid|"; &agi_output;} } - ### sleep for 99 hundredths of a second - usleep(1*990*1000); - if ($hold_message_counter > 30) { $AGI->stream_file('generic_hold'); @@ -499,7 +499,20 @@ if ($hold_tone_counter > 3) } else {$hold_tone_counter++;} -$drop_timer++; +if ($drop_timer < 3) + { + ### sleep for 44.5 hundredths of a second + usleep(1*445*1000); + + $drop_timer = ($drop_timer + 0.5); + } +else + { + ### sleep for 99 hundredths of a second + usleep(1*990*1000); + + $drop_timer++; + } } @@ -534,21 +547,20 @@ if ($drop_seconds < 1) { $cbc=0; $stmtA = "SELECT voicemail_ext FROM vicidial_inbound_groups where group_id = '$channel_group' limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; - $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; - $sthArows=$sthA->rows; - $rec_countCUSTDATA=0; - while ($sthArows > $cbc) - { - $VDADvoicemail_ext = "$aryA[0]"; - $VDADvoicemail_ext =~ s/\D//gi; - $DROPexten = "$voicemail_dump_exten$VDADvoicemail_ext"; - - $cbc++; - } - $sthA->finish(); + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $rec_countCUSTDATA=0; + while ($sthArows > $cbc) + { + @aryA = $sthA->fetchrow_array; + $VDADvoicemail_ext = "$aryA[0]"; + $VDADvoicemail_ext =~ s/\D//gi; + $DROPexten = "$voicemail_dump_exten$VDADvoicemail_ext"; + $cbc++; + } + $sthA->finish(); } } @@ -558,7 +570,7 @@ if ($drop_seconds < 1) if (length($DROPexten)>0) { ### if DROP extension is defined then send the dropped call there instead of hangup - print STDERR "\nexiting the VDAD app, transferring call to $DROPexten\n"; + if ($AGILOG) {$agi_string = "exiting the VDAD app, transferring call to $DROPexten"; &agi_output;} print "SET CONTEXT $ext_context\n"; checkresult($result); print "SET EXTENSION $DROPexten\n"; @@ -569,30 +581,25 @@ if ($drop_seconds < 1) else { ### insert a NEW record to the vicidial_manager table to be processed - $stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$server_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')"; - $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL call_hungup timout: |$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager\n";} + $stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$VARserver_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')"; + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL call_hungup timout: |$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager"; &agi_output;} } - $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' and server_ip='$server_ip' order by call_time desc limit 1;"; + $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' and server_ip='$VARserver_ip' order by call_time desc limit 1;"; $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vac record deleted: |$affected_rows| $VDADcampaign|$server_ip\n";} + if ($AGILOG) {$agi_string = "-- VDCL vac record deleted: |$affected_rows| $VDADcampaign|"; &agi_output;} $stmtA = "UPDATE vicidial_closer_log set status='DROP',end_epoch='$now_date_epoch',length_in_sec='$drop_seconds' where lead_id = '$CIDlead_id' order by start_epoch desc limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vicidial_closer_log update: |$affected_rows|$CIDlead_id\n";} + if ($AGILOG) {$agi_string = "-- VDCL vcl update: |$affected_rows|$CIDlead_id|\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_list set status='XDROP' where lead_id = '$CIDlead_id';"; - if($M){print STDERR "\n\n|$stmtA|\n";} $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vicidial_list update: |$affected_rows|$CIDlead_id\n";} - + if ($AGILOG) {$agi_string = "-- VDCL vl update: |$affected_rows|$CIDlead_id|\n|$stmtA|"; &agi_output;} } - - - $dbhA->disconnect(); +$dbhA->disconnect(); @@ -617,3 +624,19 @@ sub checkresult { $fail++; } } + +sub agi_output +{ +if ($AGILOG >=2) + { + ### open the log file for writing ### + open(Lout, ">>$AGILOGfile") + || die "Can't open $AGILOGfile: $!\n"; + print Lout "$now_date|$script|$agi_string\n"; + close(Lout); + } + ### send to STDERR writing ### +if ( ($AGILOG == '1') || ($AGILOG == '3') ) + {print STDERR "$now_date|$script|$agi_string\n";} +$agi_string=''; +} diff --git a/agc_2-X/trunk/agi/agi-VDADcloser_inbound.agi b/agc_2-X/trunk/agi/agi-VDADcloser_inbound.agi index 27a02a9f..7ddd1a65 100644 --- a/agc_2-X/trunk/agi/agi-VDADcloser_inbound.agi +++ b/agc_2-X/trunk/agi/agi-VDADcloser_inbound.agi @@ -1,6 +1,6 @@ #!/usr/bin/perl # -# agi-VDADcloser_inbound.agi version 0.4 *DBI-version* +# agi-VDADcloser_inbound.agi version 0.5 *DBI-version* # # runs when a call comes in from an inbound call. This script will # send the calls out to the closers that are logged in. @@ -31,13 +31,42 @@ # 60504-1224 - Added drop second/message/exten options from inbound_group # 60811-1003 - Changed to DBI by Marin Blu # 60811-1145 - changed to use /etc/astguiclient.conf for configs +# 60821-1021 - added output options check from database +# - changed look for agent every 0.5 second for first 4 sec on hold # -$V = 1; # set to 1 for verbose mode -$M = 1; # set to 1 for 2 line messages mode +$script = 'agi-VDADcloser_inbound.agi'; $DROP_TIME = 360; ### number of seconds to wait until you drop a waiting call +($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) {$Fhour = "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"; +$start_time=$now_date; + $CIDdate = "$mon$mday$hour$min$sec"; + $tsSQLdate = "$year$mon$mday$hour$min$sec"; + $SQLdate = "$year-$mon-$mday $hour:$min:$sec"; + $SQLdateBEGIN = $SQLdate; + +$BDtarget = ($secX - 5); +($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget); +$Byear = ($Byear + 1900); +$Bmon++; +if ($Bmon < 10) {$Bmon = "0$Bmon";} +if ($Bmday < 10) {$Bmday = "0$Bmday";} +if ($Bhour < 10) {$Bhour = "0$Bhour";} +if ($Bmin < 10) {$Bmin = "0$Bmin";} +if ($Bsec < 10) {$Bsec = "0$Bsec";} + $BDtsSQLdate = "$Byear$Bmon$Bmday$Bhour$Bmin$Bsec"; + # default path to astguiclient configuration file: $PATHconf = '/etc/astguiclient.conf'; @@ -76,57 +105,45 @@ foreach(@conf) $i++; } -# Customized Variables -$server_ip = $VARserver_ip; # Asterisk server IP - if (!$VARDB_port) {$VARDB_port='3306';} +if (!$AGILOGfile) {$AGILOGfile = "$PATHlogs/agiout.$year-$mon-$mday";} use DBI; use Time::HiRes ('gettimeofday','usleep','sleep'); # necessary to have perl sleep command of less than one second 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; - -($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) {$Fhour = "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"; -$start_time=$now_date; - $CIDdate = "$mon$mday$hour$min$sec"; - $tsSQLdate = "$year$mon$mday$hour$min$sec"; - $SQLdate = "$year-$mon-$mday $hour:$min:$sec"; - $SQLdateBEGIN = $SQLdate; - -$BDtarget = ($secX - 5); -($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget); -$Byear = ($Byear + 1900); -$Bmon++; -if ($Bmon < 10) {$Bmon = "0$Bmon";} -if ($Bmday < 10) {$Bmday = "0$Bmday";} -if ($Bhour < 10) {$Bhour = "0$Bhour";} -if ($Bmin < 10) {$Bmin = "0$Bmin";} -if ($Bsec < 10) {$Bsec = "0$Bsec";} - $BDtsSQLdate = "$Byear$Bmon$Bmday$Bhour$Bmin$Bsec"; - +### Grab Server values from the database +$stmtA = "SELECT agi_output 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; +$rec_count=0; +while ($sthArows > $rec_count) + { + $AGILOG = '0'; + @aryA = $sthA->fetchrow_array; + $DBagi_output = "$aryA[0]"; + if ($DBagi_output =~ /STDERR/) {$AGILOG = '1';} + if ($DBagi_output =~ /FILE/) {$AGILOG = '2';} + if ($DBagi_output =~ /BOTH/) {$AGILOG = '3';} + $rec_count++; + } +$sthA->finish(); ### begin parsing run-time options ### if (length($ARGV[0])>1) { -if ($V) {print STDERR "Perl Environment Dump:\n";} + if ($AGILOG) {$agi_string = "Perl Environment Dump:"; &agi_output;} $i=0; while ($#ARGV >= $i) { $args = "$args $ARGV[$i]"; - if ($V) {print STDERR "$i|$ARGV[$i]|\n";} + if ($AGILOG) {$agi_string = "$i|$ARGV[$i]"; &agi_output;} $i++; } @@ -171,16 +188,12 @@ if ($V) {print STDERR "Perl Environment Dump:\n";} } } } -else -{ -if ($V) {print "no command line options set\n";} -} $|=1; while() { chomp; last unless length($_); - if ($V) + if ($AGILOG) { if (/^agi_(\w+)\:\s+(.*)$/) { @@ -229,48 +242,34 @@ while() { # } } - if ($V) - { +foreach $i (sort keys %AGI) +{ + if ($AGILOG) {$agi_string = " -- $i = $AGI{$i}"; &agi_output;} +} - if ($V) {print STDERR "AGI Environment Dump:\n";} - foreach $i (sort keys %AGI) { - if ($V) {print STDERR " -- $i = $AGI{$i}\n";} - } - } +if ($AGILOG) {$agi_string = "AGI Variables: |$unique_id|$channel|$extension|$type|$callerid|"; &agi_output;} $AGI->stream_file('beep'); - if ($V) {print STDERR "\nINBOUND CALL VDCL STARTED\n";} - &enter_pin_number; $fronter = $pin; -if ($M) {print STDERR "+++++ INBOUND CALL VDCL STARTED : |$unique_id|$channel_group|$channel|$extension|$type|$callerid-$pin|$now_date\n";} +if ($AGILOG) {$agi_string = ""+++++ INBOUND CALL VDCL STARTED : |$channel_group|$callerid-$pin|$now_date"; &agi_output;} $VDADphone=''; $VDADphone_code=''; -if ($V) {print STDERR "AGI Environment Dump: |$unique_id|$channel|$extension|$type|$callerid|\n";} - - -if ($V) {print STDERR "\nINBOUND CALL RECEIVED IN FROM VDCL: $callerid $channel\n";} -if ($M) {print STDERR "+++++ INBOUND VDCL START : |$unique_id|$channel|$extension|$type|$now_date\n";} - if ($channel =~ /Local/i) { -if ($M) {print STDERR "+++++ VDCL START LOCAL CHANNEL: EXITING\n";} +if ($AGILOG) {$agi_string = ""+++++ VDAD START LOCAL CHANNEL: EXITING- $priority"; &agi_output;} exit; } - - -$dbhA = DBI->connect("DBI:mysql:$VARDB_database:$VARDB_server:$VARDB_port", "$VARDB_user", "$VARDB_pass") - or die "Couldn't connect to database: " . DBI->errstr; ### Grab Server values from the database $cbc=0; -$stmtA = "SELECT voicemail_dump_exten,ext_context,answer_transfer_agent,local_gmt,asterisk_version,max_vicidial_trunks FROM servers where server_ip = '$server_ip';"; +$stmtA = "SELECT voicemail_dump_exten,ext_context,answer_transfer_agent,local_gmt,asterisk_version,max_vicidial_trunks 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; @@ -294,7 +293,6 @@ while ($sthArows > $cbc) } $sthA->finish(); - ### insert a record into the vicidial_list table $stmtA = "INSERT INTO vicidial_list (entry_date,modify_date,status,user,vendor_lead_code,source_id,list_id,called_since_last_reset,phone_code,phone_number,security_phrase,called_count,gmt_offset_now) values('$SQLdate','$tsSQLdate','INBND','$fronter','$channel_group','VDCL','$list_id','Y','$phone_code','$phone_number','$channel_group','1','-5.00');"; $affected_rows = $dbhA->do($stmtA); @@ -310,10 +308,9 @@ while ($sthArows > $cbc) $cbc++; } $sthA->finish(); - - + $new_lead_id = $insert_lead_id; -if($M){print STDERR "\n|$stmtA|$new_lead_id|\n";} +if ($AGILOG) {$agi_string = "|$stmtA|$new_lead_id|"; &agi_output;} $PADlead_id = sprintf("%09s", $new_lead_id); while (length($PADlead_id) > 9) {chop($PADlead_id);} # YmmddhhmmssLLLLLLLLL @@ -322,7 +319,7 @@ $PADlead_id = sprintf("%09s", $new_lead_id); while (length($PADlead_id) > 9) {ch ### set the callerid print "SET CALLERID $YqueryCID\n"; checkresult($result); -print STDERR "callerID changed: $YqueryCID\n"; +if ($AGILOG) {$agi_string = "callerID changed: $YqueryCID"; &agi_output;} ### Grab inbound_group values from the database $cbc=0; @@ -345,24 +342,24 @@ $sthA->finish(); ### insert a LIVE record to the vicidial_auto_calls table -$stmtA = "INSERT INTO vicidial_auto_calls values('','$server_ip','$channel_group','LIVE','$new_lead_id','$uniqueid','$callerid','$channel','$phone_code','$phone_number','$SQLdate','IN')"; +$stmtA = "INSERT INTO vicidial_auto_calls values('','$VARserver_ip','$channel_group','LIVE','$new_lead_id','$uniqueid','$callerid','$channel','$phone_code','$phone_number','$SQLdate','IN')"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if($M){print STDERR "\n|$stmtA|\n";} $stmtA = "INSERT INTO vicidial_log (uniqueid,lead_id,campaign_id,call_date,start_epoch,status,phone_code,phone_number,user,processed) values('$uniqueid','$new_lead_id','$channel_group','$SQLdate','$now_date_epoch','XFER','$phone_code','$phone_number','$fronter','N')"; - if($M){print STDERR "\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if ($M) {print STDERR "-- VDAD : |$new_lead_id|$fronter|insert to vicidial_log: $uniqueid\n";} +if ($AGILOG) {$agi_string = "-- VDAD : |$new_lead_id|$fronter|insert to vicidial_log: $uniqueid"; &agi_output;} $stmtA = "INSERT INTO vicidial_closer_log (lead_id,campaign_id,call_date,start_epoch,status,phone_code,phone_number,user,processed) values('$new_lead_id','$channel_group','$SQLdate','$now_date_epoch','QUEUE','$phone_code','$phone_number','VDCL','N')"; - if($M){print STDERR "\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if ($M) {print STDERR "-- VDCL : |$new_lead_id|insert to vicidial_closer_log\n";} +if ($AGILOG) {$agi_string = "-- VDCL : |$new_lead_id|insert to vicidial_closer_log"; &agi_output;} $stmtA = "INSERT INTO vicidial_xfer_log (lead_id,campaign_id,call_date,phone_code,phone_number,user,closer) values('$new_lead_id','$channel_group','$SQLdate','$phone_code','$phone_number','$fronter','VDXL')"; - if($M){print STDERR "\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if ($M) {print STDERR "-- VDXL : |$new_lead_id|insert to vicidial_closer_log\n";} +if ($AGILOG) {$agi_string = "-- VDXL : |$new_lead_id|insert to vicidial_xfer_log"; &agi_output;} $VDADlead_id = $new_lead_id; @@ -376,7 +373,7 @@ while ($drop_timer <= $DROP_TIME) $channel_status = $AGI->channel_status("$channel"); if ($channel_status < 1) { - print STDERR "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer CHECKING AGAIN...\n"; + if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer CHECKING AGAIN"; &agi_output;} ### sleep for 99 hundredths of a second usleep(1*990*1000); @@ -384,15 +381,13 @@ if ($channel_status < 1) if ($channel_status_DC < 1) { - print STDERR "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer\n"; + if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer"; &agi_output;} if ($drop_timer < 360) {$drop_seconds = $drop_timer;} $drop_timer = ($drop_timer + 360); } } - $cbc=0; $stmtA = "SELECT next_agent_call FROM vicidial_inbound_groups where group_id='$channel_group';"; - $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -413,8 +408,8 @@ if ($channel_status < 1) $rec_countWAIT=0; $cbc=0; - $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip='$server_ip' and campaign_id = '$channel_group' and call_time < \"$SQLdateBEGIN\" and lead_id != '$VDADlead_id';"; - if($M){print STDERR "\n\n|$stmtA|\n";} + $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip='$VARserver_ip' and campaign_id = '$channel_group' and call_time < \"$SQLdateBEGIN\" and lead_id != '$VDADlead_id';"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -430,15 +425,14 @@ if ($channel_status < 1) if ($rec_countWAIT < 1) { - $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$new_lead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid' where status IN('CLOSER','READY') and server_ip='$server_ip' and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $channel_group %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; + $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$new_lead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid' where status IN('CLOSER','READY') and server_ip='$VARserver_ip' and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $channel_group %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDAD get agent: |$DROP_TIME|$drop_timer|$affected_rows|update of vla table: $channel_group|$server_ip\n";} - # if ($M) {print STDERR "|$stmtA|\n";} + if ($AGILOG) {$agi_string = "-- VDAD get agent: |$affected_rows|$channel_group|$stmtA|"; &agi_output;} if ($affected_rows > 0) { $cbc=0; - $stmtA = "SELECT conf_exten,user,extension FROM vicidial_live_agents where status = 'QUEUE' and server_ip='$server_ip' and campaign_id LIKE \"%CLOSER%\" and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} + $stmtA = "SELECT conf_exten,user,extension FROM vicidial_live_agents where status = 'QUEUE' and server_ip='$VARserver_ip' and campaign_id LIKE \"%CLOSER%\" and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -456,21 +450,20 @@ if ($channel_status < 1) $sthA->finish(); $stmtA = "UPDATE vicidial_auto_calls set status='CLOSER' where callerid='$callerid';"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL XFER : |$affected_rows|update of vac table: $callerid\n|$stmtA|\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL XFER : |$affected_rows|$callerid\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_xfer_log set closer='$VDADuser' where lead_id = '$new_lead_id' order by call_date desc limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDXL vicidial_xfer_log update: |$affected_rows|$new_lead_id|$VDADuser\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDXL XFER vicidial_xfer_log update: |$affected_rows|$new_lead_id|$VDADuser\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_closer_log set user='$VDADuser' where lead_id='$new_lead_id' order by call_date desc limit 1;"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- closer log : |$affected_rows|update of vcl table: $new_lead_id\n|$stmtA|\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- closer log : |$affected_rows|$new_lead_id\n|$stmtA|"; &agi_output;} $dbhA->disconnect(); - print STDERR "\nexiting the VDAD app, transferring call to $VDADconf_exten\n"; + if ($AGILOG) {$agi_string = "exiting VDAD app, transferring call to $VDADconf_exten"; &agi_output;} print "SET CONTEXT $ext_context\n"; checkresult($result); print "SET EXTENSION $VDADconf_exten\n"; @@ -489,23 +482,20 @@ if ($channel_status < 1) $now_date_epoch = time(); $now_date = "$year-$mon-$mday $hour:$min:$sec"; - print STDERR "\nXXXXXXXXXX VDAD transferred: start|stop $start_time|$now_date\n"; + if ($AGILOG) {$agi_string = "XXXXX VDAD transferred: start|stop $start_time|$now_date"; &agi_output;} exit; } else { - print STDERR "NNNNNNNNNN No agent record found!!!\n"; + if ($AGILOG) {$agi_string = "NNNNN No available agent found"; &agi_output;} } } else { - print STDERR "WWWWWWWW VDAD XFER WAIT: |$rec_countWAIT|$channel_group|$channel|$callerid|$uniqueid|\n"; + if ($AGILOG) {$agi_string = "WWWWW VDAD XFER WAIT: |$rec_countWAIT|$channel_group|$channel|$callerid|$uniqueid|"; &agi_output;} } - ### sleep for 99 hundredths of a second - usleep(1*990*1000); - if ($hold_message_counter > 30) { $AGI->stream_file('generic_hold'); @@ -519,7 +509,20 @@ if ($hold_tone_counter > 3) } else {$hold_tone_counter++;} -$drop_timer++; +if ($drop_timer < 3) + { + ### sleep for 44.5 hundredths of a second + usleep(1*445*1000); + + $drop_timer = ($drop_timer + 0.5); + } +else + { + ### sleep for 99 hundredths of a second + usleep(1*990*1000); + + $drop_timer++; + } } @@ -554,21 +557,20 @@ if ($drop_seconds < 1) { $cbc=0; $stmtA = "SELECT voicemail_ext FROM vicidial_inbound_groups where group_id = '$channel_group' limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; - $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; - $sthArows=$sthA->rows; - $rec_countCUSTDATA=0; - while ($sthArows > $cbc) - { - $VDADvoicemail_ext = "$aryA[0]"; - $VDADvoicemail_ext =~ s/\D//gi; - $DROPexten = "$voicemail_dump_exten$VDADvoicemail_ext"; - - $cbc++; - } - $sthA->finish(); + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $rec_countCUSTDATA=0; + while ($sthArows > $cbc) + { + @aryA = $sthA->fetchrow_array; + $VDADvoicemail_ext = "$aryA[0]"; + $VDADvoicemail_ext =~ s/\D//gi; + $DROPexten = "$voicemail_dump_exten$VDADvoicemail_ext"; + $cbc++; + } + $sthA->finish(); } } @@ -578,7 +580,7 @@ if ($drop_seconds < 1) if (length($DROPexten)>0) { ### if DROP extension is defined then send the dropped call there instead of hangup - print STDERR "\nexiting the VDAD app, transferring call to $DROPexten\n"; + if ($AGILOG) {$agi_string = "exiting the VDAD app, transferring call to $DROPexten"; &agi_output;} print "SET CONTEXT $ext_context\n"; checkresult($result); print "SET EXTENSION $DROPexten\n"; @@ -589,38 +591,32 @@ if ($drop_seconds < 1) else { ### insert a NEW record to the vicidial_manager table to be processed - $stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$server_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')"; - $affected_rows = $dbhA->do($stmtA) or die "Couldn't execute query:\n"; - if ($M) {print STDERR "-- VDCL call_hungup timout: |$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager\n";} + $stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$VARserver_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')"; + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL call_hungup timout: |$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager"; &agi_output;} } - $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' and server_ip='$server_ip' order by call_time desc limit 1;"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vac record deleted: |$affected_rows| $channel_group|$server_ip\n";} + $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' and server_ip='$VARserver_ip' order by call_time desc limit 1;"; + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vac record deleted: |$affected_rows| $VDADcampaign|"; &agi_output;} $stmtA = "UPDATE vicidial_closer_log set status='DROP',end_epoch='$now_date_epoch',length_in_sec='$drop_seconds' where lead_id = '$new_lead_id' order by start_epoch desc limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vicidial_closer_log update: |$affected_rows|$new_lead_id\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vcl update: |$affected_rows|$new_lead_id|\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_list set status='XDROP' where lead_id = '$new_lead_id';"; - if($M){print STDERR "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vicidial_list update: |$affected_rows|$new_lead_id\n";} - + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vl update: |$affected_rows|$new_lead_id|\n|$stmtA|"; &agi_output;} } - - - $dbhA->disconnect(); - - +$dbhA->disconnect(); exit; sub enter_pin_number { # please enter the pin number followed by the pound key +# please enter your 4 digit pin number $digit=''; undef $digit; @@ -629,7 +625,7 @@ undef $interrupt_digit; $interrupt_digit = $AGI->stream_file('four_digit_id','123456789'); - print STDERR "interrupt_digit |$interrupt_digit|\n"; + if ($AGILOG) {$agi_string = "interrupt_digit |$interrupt_digit|"; &agi_output;} $digits_being_entered=1; $totalDTMF=''; @@ -674,7 +670,7 @@ while ( ($digit_loop_counter < 4) ) if ($digit =~ /\d/) { $totalDTMF = "$totalDTMF$digit"; - print STDERR "digit |$digit| TotalDTMF |$totalDTMF|\n"; + if ($AGILOG) {$agi_string = "digit |$digit| TotalDTMF |$totalDTMF|"; &agi_output;} # $AGI->say_digits("$digit"); undef $digit; } @@ -688,7 +684,7 @@ while ( ($digit_loop_counter < 4) ) $totalDTMF =~ s/\D//gi; $pin = $totalDTMF; -if ($totalDTMF) {print STDERR "digit |$digit| TotalDTMF |$totalDTMF|\n";} +if ($totalDTMF) {if ($AGILOG) {$agi_string = "digit |$digit| TotalDTMF |$totalDTMF|"; &agi_output;}} } @@ -709,11 +705,28 @@ sub checkresult { $pass++; } } else { - print STDERR "FAIL (unexpected result '$res')\n"; + # print STDERR "FAIL (unexpected result '$res')\n"; $fail++; } } -### you're call is very important to us, please stay on the line and you will be transferred to the next available agent \ No newline at end of file +### you're call is very important to us, please stay on the line and you will be transferred to the next available agent + + +sub agi_output +{ +if ($AGILOG >=2) + { + ### open the log file for writing ### + open(Lout, ">>$AGILOGfile") + || die "Can't open $AGILOGfile: $!\n"; + print Lout "$now_date|$script|$agi_string\n"; + close(Lout); + } + ### send to STDERR writing ### +if ( ($AGILOG == '1') || ($AGILOG == '3') ) + {print STDERR "$now_date|$script|$agi_string\n";} +$agi_string=''; +} diff --git a/agc_2-X/trunk/agi/agi-VDADcloser_inboundANI.agi b/agc_2-X/trunk/agi/agi-VDADcloser_inboundANI.agi index 124508d5..468c7ecf 100644 --- a/agc_2-X/trunk/agi/agi-VDADcloser_inboundANI.agi +++ b/agc_2-X/trunk/agi/agi-VDADcloser_inboundANI.agi @@ -1,6 +1,6 @@ #!/usr/bin/perl # -# agi-VDADcloser_inboundANI.agi version 0.4 *DBI-version* +# agi-VDADcloser_inboundANI.agi version 0.5 *DBI-version* # # runs when a call comes in from an inbound call. This script will # send the calls out to the closers that are logged in. @@ -30,13 +30,42 @@ # 60504-1240 - Added drop second/message/exten options from inbound_group # 60811-1003 - Changed to DBI by Marin Blu # 60811-1145 - changed to use /etc/astguiclient.conf for configs +# 60821-1021 - added output options check from database +# - changed look for agent every 0.5 second for first 4 sec on hold # -$V = 1; # set to 1 for verbose mode -$M = 1; # set to 1 for 2 line messages mode +$script = 'agi-VDADcloser_inboundANI.agi'; $DROP_TIME = 360; ### number of seconds to wait until you drop a waiting call +($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) {$Fhour = "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"; +$start_time=$now_date; + $CIDdate = "$mon$mday$hour$min$sec"; + $tsSQLdate = "$year$mon$mday$hour$min$sec"; + $SQLdate = "$year-$mon-$mday $hour:$min:$sec"; + $SQLdateBEGIN = $SQLdate; + +$BDtarget = ($secX - 5); +($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget); +$Byear = ($Byear + 1900); +$Bmon++; +if ($Bmon < 10) {$Bmon = "0$Bmon";} +if ($Bmday < 10) {$Bmday = "0$Bmday";} +if ($Bhour < 10) {$Bhour = "0$Bhour";} +if ($Bmin < 10) {$Bmin = "0$Bmin";} +if ($Bsec < 10) {$Bsec = "0$Bsec";} + $BDtsSQLdate = "$Byear$Bmon$Bmday$Bhour$Bmin$Bsec"; + # default path to astguiclient configuration file: $PATHconf = '/etc/astguiclient.conf'; @@ -75,57 +104,45 @@ foreach(@conf) $i++; } -# Customized Variables -$server_ip = $VARserver_ip; # Asterisk server IP - if (!$VARDB_port) {$VARDB_port='3306';} +if (!$AGILOGfile) {$AGILOGfile = "$PATHlogs/agiout.$year-$mon-$mday";} use DBI; use Time::HiRes ('gettimeofday','usleep','sleep'); # necessary to have perl sleep command of less than one second 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; - -($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) {$Fhour = "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"; -$start_time=$now_date; - $CIDdate = "$mon$mday$hour$min$sec"; - $tsSQLdate = "$year$mon$mday$hour$min$sec"; - $SQLdate = "$year-$mon-$mday $hour:$min:$sec"; - $SQLdateBEGIN = $SQLdate; - -$BDtarget = ($secX - 5); -($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget); -$Byear = ($Byear + 1900); -$Bmon++; -if ($Bmon < 10) {$Bmon = "0$Bmon";} -if ($Bmday < 10) {$Bmday = "0$Bmday";} -if ($Bhour < 10) {$Bhour = "0$Bhour";} -if ($Bmin < 10) {$Bmin = "0$Bmin";} -if ($Bsec < 10) {$Bsec = "0$Bsec";} - $BDtsSQLdate = "$Byear$Bmon$Bmday$Bhour$Bmin$Bsec"; - +### Grab Server values from the database +$stmtA = "SELECT agi_output 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; +$rec_count=0; +while ($sthArows > $rec_count) + { + $AGILOG = '0'; + @aryA = $sthA->fetchrow_array; + $DBagi_output = "$aryA[0]"; + if ($DBagi_output =~ /STDERR/) {$AGILOG = '1';} + if ($DBagi_output =~ /FILE/) {$AGILOG = '2';} + if ($DBagi_output =~ /BOTH/) {$AGILOG = '3';} + $rec_count++; + } +$sthA->finish(); ### begin parsing run-time options ### if (length($ARGV[0])>1) { -if ($V) {print STDERR "Perl Environment Dump:\n";} + if ($AGILOG) {$agi_string = "Perl Environment Dump:"; &agi_output;} $i=0; while ($#ARGV >= $i) { $args = "$args $ARGV[$i]"; - if ($V) {print STDERR "$i|$ARGV[$i]|\n";} + if ($AGILOG) {$agi_string = "$i|$ARGV[$i]"; &agi_output;} $i++; } @@ -170,16 +187,12 @@ if ($V) {print STDERR "Perl Environment Dump:\n";} } } } -else -{ -if ($V) {print "no command line options set\n";} -} $|=1; while() { chomp; last unless length($_); - if ($V) + if ($AGILOG) { if (/^agi_(\w+)\:\s+(.*)$/) { @@ -227,50 +240,36 @@ while() { } } - if ($V) - { +foreach $i (sort keys %AGI) +{ + if ($AGILOG) {$agi_string = " -- $i = $AGI{$i}"; &agi_output;} +} - if ($V) {print STDERR "AGI Environment Dump:\n";} - foreach $i (sort keys %AGI) { - if ($V) {print STDERR " -- $i = $AGI{$i}\n";} - } - } +if ($AGILOG) {$agi_string = "AGI Variables: |$unique_id|$channel|$extension|$type|$callerid|"; &agi_output;} $AGI->stream_file('beep'); - if ($V) {print STDERR "\nINBOUND CALL VDCL STARTED\n";} - #&enter_pin_number; $pin = $inbound_number; $fronter = $pin; -if ($M) {print STDERR "+++++ INBOUND CALL VDCL STARTED : |$unique_id|$channel_group|$channel|$extension|$type|$callerid-$pin|$now_date\n";} +if ($AGILOG) {$agi_string = ""+++++ INBOUND CALL VDCL STARTED : |$channel_group|$callerid-$pin|$now_date"; &agi_output;} $VDADphone=''; $VDADphone_code=''; -if ($V) {print STDERR "AGI Environment Dump: |$unique_id|$channel|$extension|$type|$callerid|\n";} - - -if ($V) {print STDERR "\nINBOUND CALL RECEIVED IN FROM VDCL: $callerid $channel\n";} -if ($M) {print STDERR "+++++ INBOUND VDCL START : |$unique_id|$channel|$extension|$type|$now_date\n";} - if ($channel =~ /Local/i) { -if ($M) {print STDERR "+++++ VDCL START LOCAL CHANNEL: EXITING\n";} +if ($AGILOG) {$agi_string = ""+++++ VDAD START LOCAL CHANNEL: EXITING- $priority"; &agi_output;} exit; } - - -$dbhA = DBI->connect("DBI:mysql:$VARDB_database:$VARDB_server:$VARDB_port", "$VARDB_user", "$VARDB_pass") - or die "Couldn't connect to database: " . DBI->errstr; ### Grab Server values from the database $cbc=0; -$stmtA = "SELECT voicemail_dump_exten,ext_context,answer_transfer_agent,local_gmt,asterisk_version,max_vicidial_trunks FROM servers where server_ip = '$server_ip';"; +$stmtA = "SELECT voicemail_dump_exten,ext_context,answer_transfer_agent,local_gmt,asterisk_version,max_vicidial_trunks 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; @@ -311,7 +310,7 @@ while ($sthArows > $cbc) $sthA->finish(); $new_lead_id = $insert_lead_id; -if($M){print STDERR "\n|$stmtA|$new_lead_id|\n";} +if ($AGILOG) {$agi_string = "|$stmtA|$new_lead_id|"; &agi_output;} $PADlead_id = sprintf("%09s", $new_lead_id); while (length($PADlead_id) > 9) {chop($PADlead_id);} # YmmddhhmmssLLLLLLLLL @@ -320,7 +319,7 @@ $PADlead_id = sprintf("%09s", $new_lead_id); while (length($PADlead_id) > 9) {ch ### set the callerid print "SET CALLERID $YqueryCID\n"; checkresult($result); -print STDERR "callerID changed: $YqueryCID\n"; +if ($AGILOG) {$agi_string = "callerID changed: $YqueryCID"; &agi_output;} ### Grab inbound_group values from the database $cbc=0; @@ -343,14 +342,14 @@ $sthA->finish(); ### insert a LIVE record to the vicidial_auto_calls table -$stmtA = "INSERT INTO vicidial_auto_calls values('','$server_ip','$channel_group','LIVE','$new_lead_id','$uniqueid','$callerid','$channel','$phone_code','$phone_number','$SQLdate','IN')"; +$stmtA = "INSERT INTO vicidial_auto_calls values('','$VARserver_ip','$channel_group','LIVE','$new_lead_id','$uniqueid','$callerid','$channel','$phone_code','$phone_number','$SQLdate','IN')"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if($M){print STDERR "\n|$stmtA|\n";} $stmtA = "INSERT INTO vicidial_closer_log (lead_id,campaign_id,call_date,start_epoch,status,phone_code,phone_number,user,processed) values('$new_lead_id','$channel_group','$SQLdate','$now_date_epoch','QUEUE','$phone_code','$phone_number','VDCL','N')"; - if($M){print STDERR "\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if ($M) {print STDERR "-- VDCL : |$new_lead_id|insert to vicidial_closer_log\n";} +if ($AGILOG) {$agi_string = "-- VDCL : |$new_lead_id|insert to vicidial_closer_log"; &agi_output;} $VDADlead_id = $new_lead_id; @@ -364,7 +363,7 @@ while ($drop_timer <= $DROP_TIME) $channel_status = $AGI->channel_status("$channel"); if ($channel_status < 1) { - print STDERR "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer CHECKING AGAIN...\n"; + if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer CHECKING AGAIN"; &agi_output;} ### sleep for 99 hundredths of a second usleep(1*990*1000); @@ -372,15 +371,13 @@ if ($channel_status < 1) if ($channel_status_DC < 1) { - print STDERR "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer\n"; + if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer"; &agi_output;} if ($drop_timer < 360) {$drop_seconds = $drop_timer;} $drop_timer = ($drop_timer + 360); } } - $cbc=0; $stmtA = "SELECT next_agent_call FROM vicidial_inbound_groups where group_id='$channel_group';"; - $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -401,8 +398,8 @@ if ($channel_status < 1) $rec_countWAIT=0; $cbc=0; - $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip='$server_ip' and campaign_id = '$channel_group' and call_time < \"$SQLdateBEGIN\" and lead_id != '$VDADlead_id';"; - if($M){print STDERR "\n\n|$stmtA|\n";} + $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip='$VARserver_ip' and campaign_id = '$channel_group' and call_time < \"$SQLdateBEGIN\" and lead_id != '$VDADlead_id';"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -417,14 +414,14 @@ if ($channel_status < 1) if ($rec_countWAIT < 1) { - $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$new_lead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid' where status IN('CLOSER','READY') and server_ip='$server_ip' and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $channel_group %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; + $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$new_lead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid' where status IN('CLOSER','READY') and server_ip='$VARserver_ip' and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $channel_group %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDAD get agent: |$DROP_TIME|$drop_timer|$affected_rows|update of vla table: $channel_group|$server_ip\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "-- VDAD get agent: |$affected_rows|$channel_group|$stmtA|"; &agi_output;} if ($affected_rows > 0) { $cbc=0; - $stmtA = "SELECT conf_exten,user,extension FROM vicidial_live_agents where status = 'QUEUE' and server_ip='$server_ip' and campaign_id LIKE \"%CLOSER%\" and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} + $stmtA = "SELECT conf_exten,user,extension FROM vicidial_live_agents where status = 'QUEUE' and server_ip='$VARserver_ip' and campaign_id LIKE \"%CLOSER%\" and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -442,16 +439,16 @@ if ($channel_status < 1) $sthA->finish(); $stmtA = "UPDATE vicidial_auto_calls set status='CLOSER' where callerid='$callerid';"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL XFER : |$affected_rows|update of vac table: $callerid\n|$stmtA|\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL XFER : |$affected_rows|$callerid\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_closer_log set user='$VDADuser' where lead_id='$new_lead_id' order by call_date desc limit 1;"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- closer log : |$affected_rows|update of vcl table: $new_lead_id\n|$stmtA|\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- closer log : |$affected_rows|$new_lead_id\n|$stmtA|"; &agi_output;} $dbhA->disconnect(); - print STDERR "\nexiting the VDAD app, transferring call to $VDADconf_exten\n"; + if ($AGILOG) {$agi_string = "exiting VDAD app, transferring call to $VDADconf_exten"; &agi_output;} print "SET CONTEXT $ext_context\n"; checkresult($result); print "SET EXTENSION $VDADconf_exten\n"; @@ -470,23 +467,20 @@ if ($channel_status < 1) $now_date_epoch = time(); $now_date = "$year-$mon-$mday $hour:$min:$sec"; - print STDERR "\nXXXXXXXXXX VDAD transferred: start|stop $start_time|$now_date\n"; + if ($AGILOG) {$agi_string = "XXXXX VDAD transferred: start|stop $start_time|$now_date"; &agi_output;} exit; } else { - print STDERR "NNNNNNNNNN No agent record found!!!\n"; + if ($AGILOG) {$agi_string = "NNNNN No available agent found"; &agi_output;} } } else { - print STDERR "WWWWWWWW VDAD XFER WAIT: |$rec_countWAIT|$channel_group|$channel|$callerid|$uniqueid|\n"; + if ($AGILOG) {$agi_string = "WWWWW VDAD XFER WAIT: |$rec_countWAIT|$channel_group|$channel|$callerid|$uniqueid|"; &agi_output;} } - ### sleep for 99 hundredths of a second - usleep(1*990*1000); - if ($hold_message_counter > 30) { $AGI->stream_file('generic_hold'); @@ -500,7 +494,20 @@ if ($hold_tone_counter > 3) } else {$hold_tone_counter++;} -$drop_timer++; +if ($drop_timer < 3) + { + ### sleep for 44.5 hundredths of a second + usleep(1*445*1000); + + $drop_timer = ($drop_timer + 0.5); + } +else + { + ### sleep for 99 hundredths of a second + usleep(1*990*1000); + + $drop_timer++; + } } @@ -535,21 +542,20 @@ if ($drop_seconds < 1) { $cbc=0; $stmtA = "SELECT voicemail_ext FROM vicidial_inbound_groups where group_id = '$channel_group' limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; - $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; - $sthArows=$sthA->rows; - $rec_countCUSTDATA=0; - while ($sthArows > $cbc) - { - $VDADvoicemail_ext = "$aryA[0]"; - $VDADvoicemail_ext =~ s/\D//gi; - $DROPexten = "$voicemail_dump_exten$VDADvoicemail_ext"; - - $cbc++; - } - $sthA->finish(); + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $rec_countCUSTDATA=0; + while ($sthArows > $cbc) + { + @aryA = $sthA->fetchrow_array; + $VDADvoicemail_ext = "$aryA[0]"; + $VDADvoicemail_ext =~ s/\D//gi; + $DROPexten = "$voicemail_dump_exten$VDADvoicemail_ext"; + $cbc++; + } + $sthA->finish(); } } @@ -559,7 +565,7 @@ if ($drop_seconds < 1) if (length($DROPexten)>0) { ### if DROP extension is defined then send the dropped call there instead of hangup - print STDERR "\nexiting the VDAD app, transferring call to $DROPexten\n"; + if ($AGILOG) {$agi_string = "exiting the VDAD app, transferring call to $DROPexten"; &agi_output;} print "SET CONTEXT $ext_context\n"; checkresult($result); print "SET EXTENSION $DROPexten\n"; @@ -570,41 +576,39 @@ if ($drop_seconds < 1) else { ### insert a NEW record to the vicidial_manager table to be processed - $stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$server_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')"; - $affected_rows = $dbhA->do($stmtA) or die "Couldn't execute query:\n"; - if ($M) {print STDERR "-- VDCL call_hungup timout: |$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager\n";} + $stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$VARserver_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')"; + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL call_hungup timout: |$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager"; &agi_output;} } - $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' and server_ip='$server_ip' order by call_time desc limit 1;"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vac record deleted: |$affected_rows| $channel_group|$server_ip\n";} + $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' and server_ip='$VARserver_ip' order by call_time desc limit 1;"; + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vac record deleted: |$affected_rows| $VDADcampaign|"; &agi_output;} $stmtA = "UPDATE vicidial_closer_log set status='DROP',end_epoch='$now_date_epoch',length_in_sec='$drop_seconds' where lead_id = '$new_lead_id' order by start_epoch desc limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vicidial_closer_log update: |$affected_rows|$new_lead_id\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vcl update: |$affected_rows|$new_lead_id|\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_list set status='XDROP' where lead_id = '$new_lead_id';"; - if($M){print STDERR "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vicidial_list update: |$affected_rows|$new_lead_id\n";} - + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vl update: |$affected_rows|$new_lead_id|\n|$stmtA|"; &agi_output;} } - $dbhA->disconnect(); +$dbhA->disconnect(); exit; sub enter_pin_number { # please enter the pin number followed by the pound key +# please enter your 4 digit pin number $interrupt_digit=''; undef $interrupt_digit; $interrupt_digit = $AGI->stream_file('four_digit_id','123456789'); - print STDERR "interrupt_digit |$interrupt_digit|\n"; + if ($AGILOG) {$agi_string = "interrupt_digit |$interrupt_digit|"; &agi_output;} $digits_being_entered=1; $totalDTMF=''; @@ -649,7 +653,7 @@ while ( ($digit_loop_counter < 4) ) if ($digit =~ /\d/) { $totalDTMF = "$totalDTMF$digit"; - print STDERR "digit |$digit| TotalDTMF |$totalDTMF|\n"; + if ($AGILOG) {$agi_string = "digit |$digit| TotalDTMF |$totalDTMF|"; &agi_output;} # $AGI->say_digits("$digit"); undef $digit; } @@ -663,7 +667,7 @@ while ( ($digit_loop_counter < 4) ) $totalDTMF =~ s/\D//gi; $pin = $totalDTMF; -if ($totalDTMF) {print STDERR "digit |$digit| TotalDTMF |$totalDTMF|\n";} +if ($totalDTMF) {if ($AGILOG) {$agi_string = "digit |$digit| TotalDTMF |$totalDTMF|"; &agi_output;}} } @@ -684,7 +688,25 @@ sub checkresult { $pass++; } } else { - print STDERR "FAIL (unexpected result '$res')\n"; + # print STDERR "FAIL (unexpected result '$res')\n"; $fail++; } } + + + +sub agi_output +{ +if ($AGILOG >=2) + { + ### open the log file for writing ### + open(Lout, ">>$AGILOGfile") + || die "Can't open $AGILOGfile: $!\n"; + print Lout "$now_date|$script|$agi_string\n"; + close(Lout); + } + ### send to STDERR writing ### +if ( ($AGILOG == '1') || ($AGILOG == '3') ) + {print STDERR "$now_date|$script|$agi_string\n";} +$agi_string=''; +} diff --git a/agc_2-X/trunk/agi/agi-VDADcloser_inboundCID-debug.agi b/agc_2-X/trunk/agi/agi-VDADcloser_inboundCID-debug.agi deleted file mode 100644 index 781091c5..00000000 --- a/agc_2-X/trunk/agi/agi-VDADcloser_inboundCID-debug.agi +++ /dev/null @@ -1,718 +0,0 @@ -#!/usr/bin/perl -# -# agi-VDADcloser_inboundCID.agi version 0.4 *DBI-version* -# -# runs when a call comes in from an inbound call. This script will -# send the calls out to the closers that are logged in. -# *** This version detects inbound callerID over PRI *** -# -# if there are no available agents, then it will check every second until an agent becomes available, -# if at the end of 360 seconds(default) it has not found an agent it will hangup the call and mark it as dropped -# -# You need to put lines similar to those below in your extensions.conf file: -# -# ; 1. the full name of the IN GROUP to be used in vicidial for the inbound call -# ; 2. the phone number that was called, for the log entry -# ; 3. the callerID or lead_id of the person that called(usually overridden) -# ; 4. the park extension audio file name if used -# ; 5. the status of the call initially(usually not used) -# ; 6. the list_id to insert the new lead under if it is new (and callerID available) -# ; 7. the phone dialing code to insert with the new lead if new (and callerID available) -# -# ;inbound VICIDIAL calls: -#exten => 1234,1,Ringing ; call ringing -#exten => 1234,2,Wait(1) ; Wait 1 second for CID delivery from PRI -#exten => 1234,3,Answer ; Answer the line -#exten => 1234,4,AGI(agi-VDADcloser_inboundCID.agi,CL_GALLERIA-----7275555134-----Closer-----park----------999-----1) -#exten => 1234,5,Hangup -# -# Copyright (C) 2006 Matt Florell LICENSE: GPLv2 -# -# changes: -# 60504-1241 - Added drop second/message/exten options from inbound_group -# 60811-1003 - Changed to DBI by Marin Blu -# 60811-1145 - changed to use /etc/astguiclient.conf for configs -# - -$V = 1; # set to 1 for verbose mode -$M = 1; # set to 1 for 2 line messages mode - -$DROP_TIME = 360; ### number of seconds to wait until you drop a waiting call - -# default path to astguiclient configuration file: -$PATHconf = '/etc/astguiclient.conf'; - -open(conf, "$PATHconf") || die "can't open $PATHconf: $!\n"; -@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++; - } - -# Customized Variables -$server_ip = $VARserver_ip; # Asterisk server IP - -if (!$VARDB_port) {$VARDB_port='3306';} - -use DBI; -use Time::HiRes ('gettimeofday','usleep','sleep'); # necessary to have perl sleep command of less than one second -use Asterisk::AGI; -$AGI = new Asterisk::AGI; - -### open the error out file for writing ### -open(out, ">$PATHlogs/AGI_test-output.txt") - || die "Can't open $PATHlogs/AGI_test-output.txt: $!\n"; - - - -($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) {$Fhour = "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"; -$start_time=$now_date; - $CIDdate = "$mon$mday$hour$min$sec"; - $tsSQLdate = "$year$mon$mday$hour$min$sec"; - $SQLdate = "$year-$mon-$mday $hour:$min:$sec"; - $SQLdateBEGIN = $SQLdate; - -$BDtarget = ($secX - 5); -($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget); -$Byear = ($Byear + 1900); -$Bmon++; -if ($Bmon < 10) {$Bmon = "0$Bmon";} -if ($Bmday < 10) {$Bmday = "0$Bmday";} -if ($Bhour < 10) {$Bhour = "0$Bhour";} -if ($Bmin < 10) {$Bmin = "0$Bmin";} -if ($Bsec < 10) {$Bsec = "0$Bsec";} - $BDtsSQLdate = "$Byear$Bmon$Bmday$Bhour$Bmin$Bsec"; - - - -### begin parsing run-time options ### -if (length($ARGV[0])>1) -{ -if ($V) {print out "Perl Environment Dump:\n";} - $i=0; - while ($#ARGV >= $i) - { - $args = "$args $ARGV[$i]"; - if ($V) {print out "$i|$ARGV[$i]|\n";} - $i++; - } - - ### list of command-line array arguments: - @ARGV_vars = split(/-----/, $ARGV[0]); - - $channel_group = $ARGV_vars[0]; - $inbound_number = $ARGV_vars[1]; - $parked_by = $ARGV_vars[2]; - $park_extension = $ARGV_vars[3]; - $status = $ARGV_vars[4]; - $list_id = $ARGV_vars[5]; - $phone_code = $ARGV_vars[6]; - - if ($args =~ /--help/i) - { - print "allowed run time options:\n [-q] = quiet\n [-t] = test\n [-debug] = verbose debug messages\n\n"; - } - else - { - if ($args =~ /-V/i) - { - $V=1; - } - if ($args =~ /-debug/i) - { - $DG=1; - } - if ($args =~ /-dbAVS/i) - { - $DGA=1; - } - if ($args =~ /-q/i) - { - $q=1; - $Q=1; - } - if ($args =~ /-t/i) - { - $TEST=1; - $T=1; - } - } -} -else -{ -if ($V) {print "no command line options set\n";} -} - -$|=1; -while() { - chomp; - last unless length($_); - if ($V) - { - if (/^agi_(\w+)\:\s+(.*)$/) - { - $AGI{$1} = $2; - } - } - - if (/^agi_uniqueid\:\s+(.*)$/) {$unique_id = $1; $uniqueid = $unique_id;} - 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 ( ($callerid =~ /\".*\"/) && ( (!$calleridname) or ($calleridname =~ /unknown/) ) ) - { - $calleridname = $callerid; - $calleridname =~ s/\<\d\d\d\d\d\d\d\d\d\d\>//gi; - $calleridname =~ s/\"|\" //gi; - } - - $callerid =~ s/\D//gi; - $calleridname =~ s/unknown//gi; - if ( (!$callerid) or ($callerid =~ /unknown/) ) - {$callerid = $calleridname;} - - if (length($callerid)>0) {$phone_number = $callerid;} - else {$phone_number = '';} - if (length($calleridname)>0) {$VLcomments = $calleridname;} - else {$VLcomments = '';} - -# if ($channel =~ /^SIP/) {$channel =~ s/-.*//gi;} -# if ($channel =~ /^Zap\//) {$channel =~ s/-\d$//gi;} - if (length($callerid)<10) {$callerid = $parked_by;} - if (length($pin)>0) {$callerid = $pin;} - - - ### allow for external callerid to be collected -# if ($extension =~ /\*\d\d\d\d\d\d\d\d\d\d\*/) -# { -# @EXT_vars = split(/\*/, $extension); -# -# $referring_extension = $EXT_vars[0]; # initial extension sent -# $channel_group = $EXT_vars[1]; # name of the parked group -# $inbound_number = $EXT_vars[2]; # extension to send call to after parsing -# $parked_by = $EXT_vars[3]; # leadID -# $park_extension = $EXT_vars[4]; # filename of the on-hold music file -# $comment_d = $EXT_vars[5]; # N/A -# $comment_e = $EXT_vars[6]; # N/A -# -# $PADlead_id = sprintf("%09s", $parked_by); while (length($PADlead_id) > 9) {chop($PADlead_id);} -# # JmmddhhmmssLLLLLLLLL -# $JqueryCID = "J$CIDdate$PADlead_id"; -# $callerid = $JqueryCID; -# ### set the callerid to the filename of the audio for on-hold -# print "SET CALLERID $JqueryCID\n"; -# checkresult($result); -# print out "callerID changed: $JqueryCID\n"; -# } -} - - if ($V) - { - - if ($V) {print out "AGI Environment Dump:\n";} - foreach $i (sort keys %AGI) { - if ($V) {print out " -- $i = $AGI{$i}\n";} - } - } - - -$AGI->stream_file('beep'); - - if ($V) {print out "\nINBOUND CALL VDCL STARTED\n";} - -#&enter_pin_number; - -$pin = $inbound_number; - -$fronter = $pin; - -if ($M) {print out "+++++ INBOUND CALL VDCL STARTED : |$unique_id|$channel_group|$channel|$extension|$type|$callerid-$pin|$now_date\n";} - -$VDADphone=''; -$VDADphone_code=''; - -if ($V) {print out "AGI Environment Dump: |$unique_id|$channel|$extension|$type|$callerid|\n";} - - -if ($V) {print out "\nINBOUND CALL RECEIVED IN FROM VDCL: $callerid $channel\n";} -if ($M) {print out "+++++ INBOUND VDCL START : |$unique_id|$channel|$extension|$type|$now_date\n";} - -if ($channel =~ /Local/i) -{ -if ($M) {print out "+++++ VDCL START LOCAL CHANNEL: EXITING\n";} -close(out); -exit; -} - - -$dbhA = DBI->connect("DBI:mysql:$VARDB_database:$VARDB_server:$VARDB_port", "$VARDB_user", "$VARDB_pass") - or die "Couldn't connect to database: " . DBI->errstr; - -### Grab Server values from the database -$cbc=0; -$stmtA = "SELECT voicemail_dump_exten,ext_context,answer_transfer_agent,local_gmt,asterisk_version,max_vicidial_trunks FROM servers where server_ip = '$server_ip';"; -$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; -$sthA->execute or die "executing: $stmtA ", $dbhA->errstr; -$sthArows=$sthA->rows; -while ($sthArows > $cbc) - { - @aryA = $sthA->fetchrow_array; - - $DBvoicemail_dump_exten = "$aryA[0]"; - $DBext_context = "$aryA[1]"; - $DBanswer_transfer_agent = "$aryA[2]"; - $DBSERVER_GMT = "$aryA[3]"; - $DBasterisk_version = "$aryA[4]"; - $DBmax_vicidial_trunks = "$aryA[5]"; - if ($DBvoicemail_dump_exten) {$voicemail_dump_exten = $DBvoicemail_dump_exten;} - if ($DBext_context) {$ext_context = $DBext_context;} - if ($DBanswer_transfer_agent) {$answer_transfer_agent = $DBanswer_transfer_agent;} - if ($DBSERVER_GMT) {$SERVER_GMT = $DBSERVER_GMT;} - if ($DBasterisk_version) {$AST_ver = $DBasterisk_version;} - if ($DBmax_vicidial_trunks) {$max_vicidial_trunks = $DBmax_vicidial_trunks;} - $cbc++; - } -$sthA->finish(); - - - -### insert a record into the vicidial_list table -$stmtA = "INSERT INTO vicidial_list (entry_date,modify_date,status,user,vendor_lead_code,source_id,list_id,called_since_last_reset,phone_code,phone_number,security_phrase,called_count,gmt_offset_now,comments) values('$SQLdate','$tsSQLdate','INBND','$fronter','$channel_group','VDCL','$list_id','Y','$phone_code','$phone_number','$channel_group','1','-5.00','$VLcomments');"; -$affected_rows = $dbhA->do($stmtA); -$cbc=0; -$stmtA = "select LAST_INSERT_ID() LIMIT 1;"; -$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; -$sthA->execute or die "executing: $stmtA ", $dbhA->errstr; -$sthArows=$sthA->rows; -while ($sthArows > $cbc) - { - @aryA = $sthA->fetchrow_array; - $insert_lead_id = "$aryA[0]"; - $cbc++; - } -$sthA->finish(); - -$new_lead_id = $insert_lead_id; -if($M){print out "\n|$stmtA|$new_lead_id|\n";} - -$PADlead_id = sprintf("%09s", $new_lead_id); while (length($PADlead_id) > 9) {chop($PADlead_id);} -# YmmddhhmmssLLLLLLLLL - $YqueryCID = "Y$CIDdate$PADlead_id"; - $callerid = $YqueryCID; -### set the callerid -print "SET CALLERID $YqueryCID\n"; -checkresult($result); -print out "callerID changed: $YqueryCID\n"; - -### Grab inbound_group values from the database -$cbc=0; -$stmtA = "SELECT drop_call_seconds,drop_message,drop_exten FROM vicidial_inbound_groups where group_id = '$channel_group';"; -$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; -$sthA->execute or die "executing: $stmtA ", $dbhA->errstr; -$sthArows=$sthA->rows; -while ($sthArows > $cbc) - { - @aryA = $sthA->fetchrow_array; - $DBdrop_call_seconds = "$aryA[0]"; - $DBdrop_message = "$aryA[1]"; - $DBdrop_exten = "$aryA[2]"; - if ($DBdrop_call_seconds) {$DROP_TIME = $DBdrop_call_seconds;} - if ($DBdrop_message) {$drop_message = $DBdrop_message;} - if ($DBdrop_exten) {$drop_exten = $DBdrop_exten;} - $cbc++; - } -$sthA->finish(); - -### insert a LIVE record to the vicidial_auto_calls table -$stmtA = "INSERT INTO vicidial_auto_calls values('','$server_ip','$channel_group','LIVE','$new_lead_id','$uniqueid','$callerid','$channel','$phone_code','$phone_number','$SQLdate','IN')"; -$affected_rows = $dbhA->do($stmtA); -if($M){print out "\n|$stmtA|\n";} - -$stmtA = "INSERT INTO vicidial_closer_log (lead_id,campaign_id,call_date,start_epoch,status,phone_code,phone_number,user,processed) values('$new_lead_id','$channel_group','$SQLdate','$now_date_epoch','QUEUE','$phone_code','$phone_number','VDCL','N')"; - if($M){print out "\n|$stmtA|\n";} -$affected_rows = $dbhA->do($stmtA); -if ($M) {print out "-- VDCL : |$new_lead_id|insert to vicidial_closer_log\n";} - -$VDADlead_id = $new_lead_id; - -$drop_timer=0; -$drop_seconds=0; -$hold_message_counter=25; -$hold_tone_counter=0; - -while ($drop_timer <= $DROP_TIME) -{ -$channel_status = $AGI->channel_status("$channel"); -if ($channel_status < 1) - { - print out "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer CHECKING AGAIN...\n"; - ### sleep for 99 hundredths of a second - usleep(1*990*1000); - - $channel_status_DC = $AGI->channel_status("$channel"); - - if ($channel_status_DC < 1) - { - print out "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer\n"; - if ($drop_timer < 360) {$drop_seconds = $drop_timer;} - $drop_timer = ($drop_timer + 360); - } - } - - $cbc=0; - $stmtA = "SELECT next_agent_call FROM vicidial_inbound_groups where group_id='$channel_group';"; - - $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; - $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; - $sthArows=$sthA->rows; - $rec_countCUSTDATA=0; - while ($sthArows > $cbc) - { - @aryA = $sthA->fetchrow_array; - $CAMP_callorder = "$aryA[0]"; - $cbc++; - } - $sthA->finish(); - - $agent_call_order='order by last_call_finish'; - if ($CAMP_callorder =~ /overall_user_level/i) {$agent_call_order = 'order by user_level desc,last_call_finish';} - if ($CAMP_callorder =~ /oldest_call_start/i) {$agent_call_order = 'order by last_call_time';} - if ($CAMP_callorder =~ /oldest_call_finish/i) {$agent_call_order = 'order by last_call_finish';} - if ($CAMP_callorder =~ /random/i) {$agent_call_order = 'order by random_id';} - - $rec_countWAIT=0; - $cbc=0; - $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip='$server_ip' and campaign_id = '$channel_group' and call_time < \"$SQLdateBEGIN\" and lead_id != '$VDADlead_id';"; - if($M){print STDERR "\n\n|$stmtA|\n";} - $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; - $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; - $sthArows=$sthA->rows; - - while ($sthArows > $cbc) - { - @aryA = $sthA->fetchrow_array; - $rec_countWAIT = "$aryA[0]"; - $cbc++; - } - $sthA->finish(); - - if ($rec_countWAIT < 1) - { - $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$new_lead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid' where status IN('CLOSER','READY') and server_ip='$server_ip' and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $channel_group %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print out "-- VDAD get agent: |$DROP_TIME|$drop_timer|$affected_rows|update of vla table: $channel_group|$server_ip\n|$stmtA|\n";} - if ($affected_rows > 0) - { - $cbc=0; - $stmtA = "SELECT conf_exten,user,extension FROM vicidial_live_agents where status = 'QUEUE' and server_ip='$server_ip' and campaign_id LIKE \"%CLOSER%\" and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; - $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; - $sthArows=$sthA->rows; - $rec_countCUSTDATA=0; - while ($sthArows > $cbc) - { - @aryA = $sthA->fetchrow_array; - - $VDADconf_exten = "$aryA[0]"; - $VDADuser = "$aryA[1]"; - $VDADextension = "$aryA[2]"; - - $cbc++; - } - $sthA->finish(); - - $stmtA = "UPDATE vicidial_auto_calls set status='CLOSER' where callerid='$callerid';"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print out "-- VDCL XFER : |$affected_rows|update of vac table: $callerid\n|$stmtA|\n";} - - $stmtA = "UPDATE vicidial_closer_log set user='$VDADuser' where lead_id='$new_lead_id' order by call_date desc limit 1;"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print out "-- closer log : |$affected_rows|update of vcl table: $new_lead_id\n|$stmtA|\n";} - - $dbhA->disconnect(); - - print out "\nexiting the VDAD app, transferring call to $VDADconf_exten\n"; - print "SET CONTEXT $ext_context\n"; - checkresult($result); - print "SET EXTENSION $VDADconf_exten\n"; - checkresult($result); - print "SET PRIORITY 1\n"; - checkresult($result); - - ($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) {$Fhour = "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"; - print out "\nXXXXXXXXXX VDAD transferred: start|stop $start_time|$now_date\n"; - - close(out); - exit; - } - else - { - print STDERR "NNNNNNNNNN No agent record found!!!\n"; - } - } - else - { - print out "WWWWWWWW VDAD XFER WAIT: |$rec_countWAIT|$channel_group|$channel|$callerid|$uniqueid|\n"; - } - - ### sleep for 99 hundredths of a second - usleep(1*990*1000); - -if ($hold_message_counter > 30) - { - $AGI->stream_file('generic_hold'); - $hold_message_counter = 0; - } - else {$hold_message_counter++;} -if ($hold_tone_counter > 3) - { - $AGI->stream_file('hold_tone'); - $hold_tone_counter = 0; - } - else {$hold_tone_counter++;} - -$drop_timer++; -} - - -if ($drop_timer >= $DROP_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) {$Fhour = "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"; - $CIDdate = "$mon$mday$hour$min$sec"; - $tsSQLdate = "$year$mon$mday$hour$min$sec"; - $SQLdate = "$year-$mon-$mday $hour:$min:$sec"; - $VDADvoicemail_ext = ''; - -$DROPexten = ''; -if ($drop_seconds < 1) - { - $drop_seconds = $DROP_TIME; - - if ($drop_message=='Y') - { - $DROPexten = "$drop_exten"; - } - else - { - $cbc=0; - $stmtA = "SELECT voicemail_ext FROM vicidial_inbound_groups where group_id = '$channel_group' limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - - $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; - $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; - $sthArows=$sthA->rows; - $rec_countCUSTDATA=0; - while ($sthArows > $cbc) - { - $VDADvoicemail_ext = "$aryA[0]"; - $VDADvoicemail_ext =~ s/\D//gi; - $DROPexten = "$voicemail_dump_exten$VDADvoicemail_ext"; - - $cbc++; - } - $sthA->finish(); - } - } - - - ### use STDOUT to send call to proper DROP location - $VH{CID = "VH$CIDdate$VDADconf_exten"; - - if (length($DROPexten)>0) - { ### if DROP extension is defined then send the dropped call there instead of hangup - print out "\nexiting the VDAD app, transferring call to $DROPexten\n"; - print "SET CONTEXT $ext_context\n"; - checkresult($result); - print "SET EXTENSION $DROPexten\n"; - checkresult($result); - print "SET PRIORITY 1\n"; - checkresult($result); - } - else - { - ### insert a NEW record to the vicidial_manager table to be processed - $stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$server_ip','','Hangup','$VH{CID','Channel: $channel','','','','','','','','','')"; - $affected_rows = $dbhA->do($stmtA) or die "Couldn't execute {:\n"; - if ($M) {print out "-- VDCL call_hungup timout: |$VH{CID|$VDADconf_exten|$channel|insert to vicidial_manager\n";} - } - - $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' and server_ip='$server_ip' order by call_time desc limit 1;"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print out "-- VDCL vac record deleted: |$affected_rows| $channel_group|$server_ip\n";} - - $stmtA = "UPDATE vicidial_closer_log set status='DROP',end_epoch='$now_date_epoch',length_in_sec='$drop_seconds' where lead_id = '$new_lead_id' order by start_epoch desc limit 1;"; - if($M){print out "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print out "-- VDCL vicidial_closer_log update: |$affected_rows|$new_lead_id\n";} - - $stmtA = "UPDATE vicidial_list set status='XDROP' where lead_id = '$new_lead_id';"; - if($M){print out "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print out "-- VDCL vicidial_list update: |$affected_rows|$new_lead_id\n";} - -} - - - - $dbhA->disconnect(); - - -close(out); - -exit; - -sub enter_pin_number -{ -# please enter the pin number followed by the pound key - -$interrupt_digit=''; -undef $interrupt_digit; - -$interrupt_digit = $AGI->stream_file('four_digit_id','123456789'); - - print out "interrupt_digit |$interrupt_digit|\n"; - -$digits_being_entered=1; -$totalDTMF=''; -if ($interrupt_digit > 1) - { - if ($interrupt_digit == 48) {$interrupt_digit=0;} - if ($interrupt_digit == 49) {$interrupt_digit=1;} - if ($interrupt_digit == 50) {$interrupt_digit=2;} - if ($interrupt_digit == 51) {$interrupt_digit=3;} - if ($interrupt_digit == 52) {$interrupt_digit=4;} - if ($interrupt_digit == 53) {$interrupt_digit=5;} - if ($interrupt_digit == 54) {$interrupt_digit=6;} - if ($interrupt_digit == 55) {$interrupt_digit=7;} - if ($interrupt_digit == 56) {$interrupt_digit=8;} - if ($interrupt_digit == 57) {$interrupt_digit=9;} - - $totalDTMF=$interrupt_digit; - } - -$digit_loop_counter=0; -#while ( ($digits_being_entered) && ($digit_loop_counter < 20) ) -# { -# $digit = chr($AGI->wait_for_digit('30000')); # wait 30 seconds for input or until the pound key is pressed -# if ($digit =~ /\d/) -# { -# $totalDTMF = "$totalDTMF$digit"; -# print out "digit |$digit| TotalDTMF |$totalDTMF|\n"; -# $AGI->say_digits("$digit"); -# undef $digit; -# } -# else -# { -# $digits_being_entered=0; -# } -# -# $digit_loop_counter++; -# } - -while ( ($digit_loop_counter < 4) ) - { - $digit = chr($AGI->wait_for_digit('10000')); # wait 10 seconds for input or until the pound key is pressed - if ($digit =~ /\d/) - { - $totalDTMF = "$totalDTMF$digit"; - print out "digit |$digit| TotalDTMF |$totalDTMF|\n"; -# $AGI->say_digits("$digit"); - undef $digit; - } - else - { - $digit_loop_counter=4; - } - - $digit_loop_counter++; - } - -$totalDTMF =~ s/\D//gi; -$pin = $totalDTMF; -if ($totalDTMF) {print out "digit |$digit| TotalDTMF |$totalDTMF|\n";} -} - - - - -sub checkresult { - my ($res) = @_; - my $retval; - $tests++; - chomp $res; - if ($res =~ /^200/) { - $res =~ /result=(-?\d+)/; - if (!length($1)) { - # print out "FAIL ($res)\n"; - $fail++; - } else { - # print out "PASS ($1)\n"; - $pass++; - } - } else { - print out "FAIL (unexpected result '$res')\n"; - $fail++; - } -} diff --git a/agc_2-X/trunk/agi/agi-VDADcloser_inboundCID.agi b/agc_2-X/trunk/agi/agi-VDADcloser_inboundCID.agi index c2c4192c..59ada982 100644 --- a/agc_2-X/trunk/agi/agi-VDADcloser_inboundCID.agi +++ b/agc_2-X/trunk/agi/agi-VDADcloser_inboundCID.agi @@ -1,6 +1,6 @@ #!/usr/bin/perl # -# agi-VDADcloser_inboundCID.agi version 0.4 *DBI-version* +# agi-VDADcloser_inboundCID.agi version 0.5 *DBI-version* # # runs when a call comes in from an inbound call. This script will # send the calls out to the closers that are logged in. @@ -32,13 +32,42 @@ # 60504-1241 - Added drop second/message/exten options from inbound_group # 60811-1003 - Changed to DBI by Marin Blu # 60811-1145 - changed to use /etc/astguiclient.conf for configs +# 60821-1021 - added output options check from database +# - changed look for agent every 0.5 second for first 4 sec on hold # -$V = 1; # set to 1 for verbose mode -$M = 1; # set to 1 for 2 line messages mode +$script = 'agi-VDADcloser_inboundCID.agi'; $DROP_TIME = 360; ### number of seconds to wait until you drop a waiting call +($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) {$Fhour = "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"; +$start_time=$now_date; + $CIDdate = "$mon$mday$hour$min$sec"; + $tsSQLdate = "$year$mon$mday$hour$min$sec"; + $SQLdate = "$year-$mon-$mday $hour:$min:$sec"; + $SQLdateBEGIN = $SQLdate; + +$BDtarget = ($secX - 5); +($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget); +$Byear = ($Byear + 1900); +$Bmon++; +if ($Bmon < 10) {$Bmon = "0$Bmon";} +if ($Bmday < 10) {$Bmday = "0$Bmday";} +if ($Bhour < 10) {$Bhour = "0$Bhour";} +if ($Bmin < 10) {$Bmin = "0$Bmin";} +if ($Bsec < 10) {$Bsec = "0$Bsec";} + $BDtsSQLdate = "$Byear$Bmon$Bmday$Bhour$Bmin$Bsec"; + # default path to astguiclient configuration file: $PATHconf = '/etc/astguiclient.conf'; @@ -77,57 +106,45 @@ foreach(@conf) $i++; } -# Customized Variables -$server_ip = $VARserver_ip; # Asterisk server IP - if (!$VARDB_port) {$VARDB_port='3306';} +if (!$AGILOGfile) {$AGILOGfile = "$PATHlogs/agiout.$year-$mon-$mday";} use DBI; use Time::HiRes ('gettimeofday','usleep','sleep'); # necessary to have perl sleep command of less than one second 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; - -($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) {$Fhour = "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"; -$start_time=$now_date; - $CIDdate = "$mon$mday$hour$min$sec"; - $tsSQLdate = "$year$mon$mday$hour$min$sec"; - $SQLdate = "$year-$mon-$mday $hour:$min:$sec"; - $SQLdateBEGIN = $SQLdate; - -$BDtarget = ($secX - 5); -($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget); -$Byear = ($Byear + 1900); -$Bmon++; -if ($Bmon < 10) {$Bmon = "0$Bmon";} -if ($Bmday < 10) {$Bmday = "0$Bmday";} -if ($Bhour < 10) {$Bhour = "0$Bhour";} -if ($Bmin < 10) {$Bmin = "0$Bmin";} -if ($Bsec < 10) {$Bsec = "0$Bsec";} - $BDtsSQLdate = "$Byear$Bmon$Bmday$Bhour$Bmin$Bsec"; - +### Grab Server values from the database +$stmtA = "SELECT agi_output 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; +$rec_count=0; +while ($sthArows > $rec_count) + { + $AGILOG = '0'; + @aryA = $sthA->fetchrow_array; + $DBagi_output = "$aryA[0]"; + if ($DBagi_output =~ /STDERR/) {$AGILOG = '1';} + if ($DBagi_output =~ /FILE/) {$AGILOG = '2';} + if ($DBagi_output =~ /BOTH/) {$AGILOG = '3';} + $rec_count++; + } +$sthA->finish(); ### begin parsing run-time options ### if (length($ARGV[0])>1) { -if ($V) {print STDERR "Perl Environment Dump:\n";} + if ($AGILOG) {$agi_string = "Perl Environment Dump:"; &agi_output;} $i=0; while ($#ARGV >= $i) { $args = "$args $ARGV[$i]"; - if ($V) {print STDERR "$i|$ARGV[$i]|\n";} + if ($AGILOG) {$agi_string = "$i|$ARGV[$i]"; &agi_output;} $i++; } @@ -172,16 +189,12 @@ if ($V) {print STDERR "Perl Environment Dump:\n";} } } } -else -{ -if ($V) {print "no command line options set\n";} -} $|=1; while() { chomp; last unless length($_); - if ($V) + if ($AGILOG) { if (/^agi_(\w+)\:\s+(.*)$/) { @@ -243,50 +256,36 @@ while() { # } } - if ($V) - { +foreach $i (sort keys %AGI) +{ + if ($AGILOG) {$agi_string = " -- $i = $AGI{$i}"; &agi_output;} +} - if ($V) {print STDERR "AGI Environment Dump:\n";} - foreach $i (sort keys %AGI) { - if ($V) {print STDERR " -- $i = $AGI{$i}\n";} - } - } +if ($AGILOG) {$agi_string = "AGI Variables: |$unique_id|$channel|$extension|$type|$callerid|"; &agi_output;} $AGI->stream_file('beep'); - if ($V) {print STDERR "\nINBOUND CALL VDCL STARTED\n";} - #&enter_pin_number; $pin = $inbound_number; $fronter = $pin; -if ($M) {print STDERR "+++++ INBOUND CALL VDCL STARTED : |$unique_id|$channel_group|$channel|$extension|$type|$callerid-$pin|$now_date\n";} +if ($AGILOG) {$agi_string = ""+++++ INBOUND CALL VDCL STARTED : |$channel_group|$callerid-$pin|$now_date"; &agi_output;} $VDADphone=''; $VDADphone_code=''; -if ($V) {print STDERR "AGI Environment Dump: |$unique_id|$channel|$extension|$type|$callerid|\n";} - - -if ($V) {print STDERR "\nINBOUND CALL RECEIVED IN FROM VDCL: $callerid $channel\n";} -if ($M) {print STDERR "+++++ INBOUND VDCL START : |$unique_id|$channel|$extension|$type|$now_date\n";} - if ($channel =~ /Local/i) { -if ($M) {print STDERR "+++++ VDCL START LOCAL CHANNEL: EXITING\n";} +if ($AGILOG) {$agi_string = ""+++++ VDAD START LOCAL CHANNEL: EXITING- $priority"; &agi_output;} exit; } - -$dbhA = DBI->connect("DBI:mysql:$VARDB_database:$VARDB_server:$VARDB_port", "$VARDB_user", "$VARDB_pass") - or die "Couldn't connect to database: " . DBI->errstr; - ### Grab Server values from the database $cbc=0; -$stmtA = "SELECT voicemail_dump_exten,ext_context,answer_transfer_agent,local_gmt,asterisk_version,max_vicidial_trunks FROM servers where server_ip = '$server_ip';"; +$stmtA = "SELECT voicemail_dump_exten,ext_context,answer_transfer_agent,local_gmt,asterisk_version,max_vicidial_trunks 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; @@ -328,7 +327,7 @@ while ($sthArows > $cbc) $sthA->finish(); $new_lead_id = $insert_lead_id; -if($M){print STDERR "\n|$stmtA|$new_lead_id|\n";} +if ($AGILOG) {$agi_string = "|$stmtA|$new_lead_id|"; &agi_output;} $PADlead_id = sprintf("%09s", $new_lead_id); while (length($PADlead_id) > 9) {chop($PADlead_id);} # YmmddhhmmssLLLLLLLLL @@ -337,7 +336,7 @@ $PADlead_id = sprintf("%09s", $new_lead_id); while (length($PADlead_id) > 9) {ch ### set the callerid print "SET CALLERID $YqueryCID\n"; checkresult($result); -print STDERR "callerID changed: $YqueryCID\n"; +if ($AGILOG) {$agi_string = "callerID changed: $YqueryCID"; &agi_output;} ### Grab inbound_group values from the database $cbc=0; @@ -359,14 +358,14 @@ while ($sthArows > $cbc) $sthA->finish(); ### insert a LIVE record to the vicidial_auto_calls table -$stmtA = "INSERT INTO vicidial_auto_calls values('','$server_ip','$channel_group','LIVE','$new_lead_id','$uniqueid','$callerid','$channel','$phone_code','$phone_number','$SQLdate','IN')"; +$stmtA = "INSERT INTO vicidial_auto_calls values('','$VARserver_ip','$channel_group','LIVE','$new_lead_id','$uniqueid','$callerid','$channel','$phone_code','$phone_number','$SQLdate','IN')"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if($M){print STDERR "\n|$stmtA|\n";} $stmtA = "INSERT INTO vicidial_closer_log (lead_id,campaign_id,call_date,start_epoch,status,phone_code,phone_number,user,processed) values('$new_lead_id','$channel_group','$SQLdate','$now_date_epoch','QUEUE','$phone_code','$phone_number','VDCL','N')"; - if($M){print STDERR "\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if ($M) {print STDERR "-- VDCL : |$new_lead_id|insert to vicidial_closer_log\n";} +if ($AGILOG) {$agi_string = "-- VDCL : |$new_lead_id|insert to vicidial_closer_log"; &agi_output;} $VDADlead_id = $new_lead_id; @@ -380,7 +379,7 @@ while ($drop_timer <= $DROP_TIME) $channel_status = $AGI->channel_status("$channel"); if ($channel_status < 1) { - print STDERR "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer CHECKING AGAIN...\n"; + if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer CHECKING AGAIN"; &agi_output;} ### sleep for 99 hundredths of a second usleep(1*990*1000); @@ -388,12 +387,11 @@ if ($channel_status < 1) if ($channel_status_DC < 1) { - print STDERR "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer\n"; + if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer"; &agi_output;} if ($drop_timer < 360) {$drop_seconds = $drop_timer;} $drop_timer = ($drop_timer + 360); } } - $cbc=0; $stmtA = "SELECT next_agent_call FROM vicidial_inbound_groups where group_id='$channel_group';"; $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; @@ -416,8 +414,8 @@ if ($channel_status < 1) $rec_countWAIT=0; $cbc=0; - $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip='$server_ip' and campaign_id = '$channel_group' and call_time < \"$SQLdateBEGIN\" and lead_id != '$VDADlead_id';"; - if($M){print STDERR "\n\n|$stmtA|\n";} + $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip='$VARserver_ip' and campaign_id = '$channel_group' and call_time < \"$SQLdateBEGIN\" and lead_id != '$VDADlead_id';"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -432,14 +430,14 @@ if ($channel_status < 1) if ($rec_countWAIT < 1) { - $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$new_lead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid' where status IN('CLOSER','READY') and server_ip='$server_ip' and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $channel_group %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; + $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$new_lead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid' where status IN('CLOSER','READY') and server_ip='$VARserver_ip' and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $channel_group %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDAD get agent: |$DROP_TIME|$drop_timer|$affected_rows|update of vla table: $channel_group|$server_ip\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "-- VDAD get agent: |$affected_rows|$channel_group|$stmtA|"; &agi_output;} if ($affected_rows > 0) { $cbc=0; - $stmtA = "SELECT conf_exten,user,extension FROM vicidial_live_agents where status = 'QUEUE' and server_ip='$server_ip' and campaign_id LIKE \"%CLOSER%\" and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} + $stmtA = "SELECT conf_exten,user,extension FROM vicidial_live_agents where status = 'QUEUE' and server_ip='$VARserver_ip' and campaign_id LIKE \"%CLOSER%\" and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -457,16 +455,16 @@ if ($channel_status < 1) $sthA->finish(); $stmtA = "UPDATE vicidial_auto_calls set status='CLOSER' where callerid='$callerid';"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL XFER : |$affected_rows|update of vac table: $callerid\n|$stmtA|\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL XFER : |$affected_rows|$callerid\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_closer_log set user='$VDADuser' where lead_id='$new_lead_id' order by call_date desc limit 1;"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- closer log : |$affected_rows|update of vcl table: $new_lead_id\n|$stmtA|\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- closer log : |$affected_rows|$new_lead_id\n|$stmtA|"; &agi_output;} - $dbhA->disconnect(); + $dbhA->disconnect(); - print STDERR "\nexiting the VDAD app, transferring call to $VDADconf_exten\n"; + if ($AGILOG) {$agi_string = "exiting VDAD app, transferring call to $VDADconf_exten"; &agi_output;} print "SET CONTEXT $ext_context\n"; checkresult($result); print "SET EXTENSION $VDADconf_exten\n"; @@ -485,23 +483,20 @@ if ($channel_status < 1) $now_date_epoch = time(); $now_date = "$year-$mon-$mday $hour:$min:$sec"; - print STDERR "\nXXXXXXXXXX VDAD transferred: start|stop $start_time|$now_date\n"; + if ($AGILOG) {$agi_string = "XXXXX VDAD transferred: start|stop $start_time|$now_date"; &agi_output;} exit; } else { - print STDERR "NNNNNNNNNN No agent record found!!!\n"; + if ($AGILOG) {$agi_string = "NNNNN No available agent found"; &agi_output;} } } else { - print STDERR "WWWWWWWW VDAD XFER WAIT: |$rec_countWAIT|$channel_group|$channel|$callerid|$uniqueid|\n"; + if ($AGILOG) {$agi_string = "WWWWW VDAD XFER WAIT: |$rec_countWAIT|$channel_group|$channel|$callerid|$uniqueid|"; &agi_output;} } - ### sleep for 99 hundredths of a second - usleep(1*990*1000); - if ($hold_message_counter > 30) { $AGI->stream_file('generic_hold'); @@ -515,7 +510,20 @@ if ($hold_tone_counter > 3) } else {$hold_tone_counter++;} -$drop_timer++; +if ($drop_timer < 3) + { + ### sleep for 44.5 hundredths of a second + usleep(1*445*1000); + + $drop_timer = ($drop_timer + 0.5); + } +else + { + ### sleep for 99 hundredths of a second + usleep(1*990*1000); + + $drop_timer++; + } } @@ -550,21 +558,20 @@ if ($drop_seconds < 1) { $cbc=0; $stmtA = "SELECT voicemail_ext FROM vicidial_inbound_groups where group_id = '$channel_group' limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; - $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; - $sthArows=$sthA->rows; - $rec_countCUSTDATA=0; - while ($sthArows > $cbc) - { - $VDADvoicemail_ext = "$aryA[0]"; - $VDADvoicemail_ext =~ s/\D//gi; - $DROPexten = "$voicemail_dump_exten$VDADvoicemail_ext"; - - $cbc++; - } - $sthA->finish(); + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $rec_countCUSTDATA=0; + while ($sthArows > $cbc) + { + @aryA = $sthA->fetchrow_array; + $VDADvoicemail_ext = "$aryA[0]"; + $VDADvoicemail_ext =~ s/\D//gi; + $DROPexten = "$voicemail_dump_exten$VDADvoicemail_ext"; + $cbc++; + } + $sthA->finish(); } } @@ -574,7 +581,7 @@ if ($drop_seconds < 1) if (length($DROPexten)>0) { ### if DROP extension is defined then send the dropped call there instead of hangup - print STDERR "\nexiting the VDAD app, transferring call to $DROPexten\n"; + if ($AGILOG) {$agi_string = "exiting the VDAD app, transferring call to $DROPexten"; &agi_output;} print "SET CONTEXT $ext_context\n"; checkresult($result); print "SET EXTENSION $DROPexten\n"; @@ -585,41 +592,39 @@ if ($drop_seconds < 1) else { ### insert a NEW record to the vicidial_manager table to be processed - $stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$server_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')"; - $affected_rows = $dbhA->do($stmtA) or die "Couldn't execute query:\n"; - if ($M) {print STDERR "-- VDCL call_hungup timout: |$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager\n";} + $stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$VARserver_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')"; + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL call_hungup timout: |$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager"; &agi_output;} } - $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' and server_ip='$server_ip' order by call_time desc limit 1;"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vac record deleted: |$affected_rows| $channel_group|$server_ip\n";} + $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' and server_ip='$VARserver_ip' order by call_time desc limit 1;"; + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vac record deleted: |$affected_rows| $VDADcampaign|"; &agi_output;} $stmtA = "UPDATE vicidial_closer_log set status='DROP',end_epoch='$now_date_epoch',length_in_sec='$drop_seconds' where lead_id = '$new_lead_id' order by start_epoch desc limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vicidial_closer_log update: |$affected_rows|$new_lead_id\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vcl update: |$affected_rows|$new_lead_id|\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_list set status='XDROP' where lead_id = '$new_lead_id';"; - if($M){print STDERR "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vicidial_list update: |$affected_rows|$new_lead_id\n";} - + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vl update: |$affected_rows|$new_lead_id|\n|$stmtA|"; &agi_output;} } - $dbhA->disconnect(); +$dbhA->disconnect(); exit; sub enter_pin_number { # please enter the pin number followed by the pound key +# please enter your 4 digit pin number $interrupt_digit=''; undef $interrupt_digit; $interrupt_digit = $AGI->stream_file('four_digit_id','123456789'); - print STDERR "interrupt_digit |$interrupt_digit|\n"; + if ($AGILOG) {$agi_string = "interrupt_digit |$interrupt_digit|"; &agi_output;} $digits_being_entered=1; $totalDTMF=''; @@ -664,7 +669,7 @@ while ( ($digit_loop_counter < 4) ) if ($digit =~ /\d/) { $totalDTMF = "$totalDTMF$digit"; - print STDERR "digit |$digit| TotalDTMF |$totalDTMF|\n"; + if ($AGILOG) {$agi_string = "digit |$digit| TotalDTMF |$totalDTMF|"; &agi_output;} # $AGI->say_digits("$digit"); undef $digit; } @@ -678,7 +683,7 @@ while ( ($digit_loop_counter < 4) ) $totalDTMF =~ s/\D//gi; $pin = $totalDTMF; -if ($totalDTMF) {print STDERR "digit |$digit| TotalDTMF |$totalDTMF|\n";} +if ($totalDTMF) {if ($AGILOG) {$agi_string = "digit |$digit| TotalDTMF |$totalDTMF|"; &agi_output;}} } @@ -699,7 +704,25 @@ sub checkresult { $pass++; } } else { - print STDERR "FAIL (unexpected result '$res')\n"; + # print STDERR "FAIL (unexpected result '$res')\n"; $fail++; } } + + + +sub agi_output +{ +if ($AGILOG >=2) + { + ### open the log file for writing ### + open(Lout, ">>$AGILOGfile") + || die "Can't open $AGILOGfile: $!\n"; + print Lout "$now_date|$script|$agi_string\n"; + close(Lout); + } + ### send to STDERR writing ### +if ( ($AGILOG == '1') || ($AGILOG == '3') ) + {print STDERR "$now_date|$script|$agi_string\n";} +$agi_string=''; +} diff --git a/agc_2-X/trunk/agi/agi-VDADcloser_inboundCIDlookup.agi b/agc_2-X/trunk/agi/agi-VDADcloser_inboundCIDlookup.agi index c08f5aa2..c0258f37 100644 --- a/agc_2-X/trunk/agi/agi-VDADcloser_inboundCIDlookup.agi +++ b/agc_2-X/trunk/agi/agi-VDADcloser_inboundCIDlookup.agi @@ -1,6 +1,6 @@ #!/usr/bin/perl # -# agi-VDADcloser_inboundCID.agi version 0.4 *DBI-version* +# agi-VDADcloser_inboundCIDlookup.agi version 0.5 *DBI-version* # # runs when a call comes in from an inbound call. This script will # send the calls out to the closers that are logged in. @@ -32,13 +32,42 @@ # 60504-1242 - Added drop second/message/exten options from inbound_group # 60811-1003 - Changed to DBI by Marin Blu # 60811-1145 - changed to use /etc/astguiclient.conf for configs +# 60821-1021 - added output options check from database +# - changed look for agent every 0.5 second for first 4 sec on hold # -$V = 1; # set to 1 for verbose mode -$M = 1; # set to 1 for 2 line messages mode +$script = 'agi-VDADcloser_inboundCIDlookup.agi'; $DROP_TIME = 360; ### number of seconds to wait until you drop a waiting call +($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) {$Fhour = "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"; +$start_time=$now_date; + $CIDdate = "$mon$mday$hour$min$sec"; + $tsSQLdate = "$year$mon$mday$hour$min$sec"; + $SQLdate = "$year-$mon-$mday $hour:$min:$sec"; + $SQLdateBEGIN = $SQLdate; + +$BDtarget = ($secX - 5); +($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget); +$Byear = ($Byear + 1900); +$Bmon++; +if ($Bmon < 10) {$Bmon = "0$Bmon";} +if ($Bmday < 10) {$Bmday = "0$Bmday";} +if ($Bhour < 10) {$Bhour = "0$Bhour";} +if ($Bmin < 10) {$Bmin = "0$Bmin";} +if ($Bsec < 10) {$Bsec = "0$Bsec";} + $BDtsSQLdate = "$Byear$Bmon$Bmday$Bhour$Bmin$Bsec"; + # default path to astguiclient configuration file: $PATHconf = '/etc/astguiclient.conf'; @@ -77,57 +106,45 @@ foreach(@conf) $i++; } -# Customized Variables -$server_ip = $VARserver_ip; # Asterisk server IP - if (!$VARDB_port) {$VARDB_port='3306';} +if (!$AGILOGfile) {$AGILOGfile = "$PATHlogs/agiout.$year-$mon-$mday";} use DBI; use Time::HiRes ('gettimeofday','usleep','sleep'); # necessary to have perl sleep command of less than one second 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; - -($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) {$Fhour = "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"; -$start_time=$now_date; - $CIDdate = "$mon$mday$hour$min$sec"; - $tsSQLdate = "$year$mon$mday$hour$min$sec"; - $SQLdate = "$year-$mon-$mday $hour:$min:$sec"; - $SQLdateBEGIN = $SQLdate; - -$BDtarget = ($secX - 5); -($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget); -$Byear = ($Byear + 1900); -$Bmon++; -if ($Bmon < 10) {$Bmon = "0$Bmon";} -if ($Bmday < 10) {$Bmday = "0$Bmday";} -if ($Bhour < 10) {$Bhour = "0$Bhour";} -if ($Bmin < 10) {$Bmin = "0$Bmin";} -if ($Bsec < 10) {$Bsec = "0$Bsec";} - $BDtsSQLdate = "$Byear$Bmon$Bmday$Bhour$Bmin$Bsec"; - +### Grab Server values from the database +$stmtA = "SELECT agi_output 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; +$rec_count=0; +while ($sthArows > $rec_count) + { + $AGILOG = '0'; + @aryA = $sthA->fetchrow_array; + $DBagi_output = "$aryA[0]"; + if ($DBagi_output =~ /STDERR/) {$AGILOG = '1';} + if ($DBagi_output =~ /FILE/) {$AGILOG = '2';} + if ($DBagi_output =~ /BOTH/) {$AGILOG = '3';} + $rec_count++; + } +$sthA->finish(); ### begin parsing run-time options ### if (length($ARGV[0])>1) { -if ($V) {print STDERR "Perl Environment Dump:\n";} + if ($AGILOG) {$agi_string = "Perl Environment Dump:"; &agi_output;} $i=0; while ($#ARGV >= $i) { $args = "$args $ARGV[$i]"; - if ($V) {print STDERR "$i|$ARGV[$i]|\n";} + if ($AGILOG) {$agi_string = "$i|$ARGV[$i]"; &agi_output;} $i++; } @@ -173,15 +190,12 @@ if ($V) {print STDERR "Perl Environment Dump:\n";} } } else -{ -if ($V) {print "no command line options set\n";} -} $|=1; while() { chomp; last unless length($_); - if ($V) + if ($AGILOG) { if (/^agi_(\w+)\:\s+(.*)$/) { @@ -243,50 +257,36 @@ while() { # } } - if ($V) - { +foreach $i (sort keys %AGI) +{ + if ($AGILOG) {$agi_string = " -- $i = $AGI{$i}"; &agi_output;} +} - if ($V) {print STDERR "AGI Environment Dump:\n";} - foreach $i (sort keys %AGI) { - if ($V) {print STDERR " -- $i = $AGI{$i}\n";} - } - } +if ($AGILOG) {$agi_string = "AGI Variables: |$unique_id|$channel|$extension|$type|$callerid|"; &agi_output;} $AGI->stream_file('beep'); - if ($V) {print STDERR "\nINBOUND CALL VDCL STARTED\n";} - #&enter_pin_number; $pin = $inbound_number; $fronter = $pin; -if ($M) {print STDERR "+++++ INBOUND CALL VDCL STARTED : |$unique_id|$channel_group|$channel|$extension|$type|$callerid-$pin|$now_date\n";} +if ($AGILOG) {$agi_string = ""+++++ INBOUND CALL VDCL STARTED : |$channel_group|$callerid-$pin|$now_date"; &agi_output;} $VDADphone=''; $VDADphone_code=''; -if ($V) {print STDERR "AGI Environment Dump: |$unique_id|$channel|$extension|$type|$callerid|\n";} - - -if ($V) {print STDERR "\nINBOUND CALL RECEIVED IN FROM VDCL: $callerid $channel\n";} -if ($M) {print STDERR "+++++ INBOUND VDCL START : |$unique_id|$channel|$extension|$type|$now_date\n";} - if ($channel =~ /Local/i) { -if ($M) {print STDERR "+++++ VDCL START LOCAL CHANNEL: EXITING\n";} +if ($AGILOG) {$agi_string = ""+++++ VDAD START LOCAL CHANNEL: EXITING- $priority"; &agi_output;} exit; } - -$dbhA = DBI->connect("DBI:mysql:$VARDB_database:$VARDB_server:$VARDB_port", "$VARDB_user", "$VARDB_pass") - or die "Couldn't connect to database: " . DBI->errstr; - ### Grab Server values from the database $cbc=0; -$stmtA = "SELECT voicemail_dump_exten,ext_context,answer_transfer_agent,local_gmt,asterisk_version,max_vicidial_trunks FROM servers where server_ip = '$server_ip';"; +$stmtA = "SELECT voicemail_dump_exten,ext_context,answer_transfer_agent,local_gmt,asterisk_version,max_vicidial_trunks 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; @@ -316,7 +316,6 @@ $stmtA= "SELECT lead_id from vicidial_list where list_id='$list_id' and phone_nu $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; - if ($sthArows > 0) { $rec_countCUSTDATA=0; @@ -350,7 +349,7 @@ else } $new_lead_id = $insert_lead_id; -if($M){print STDERR "\n|$stmtA|$new_lead_id|\n";} +if ($AGILOG) {$agi_string = "|$stmtA|$new_lead_id|"; &agi_output;} $PADlead_id = sprintf("%09s", $new_lead_id); while (length($PADlead_id) > 9) {chop($PADlead_id);} # YmmddhhmmssLLLLLLLLL @@ -359,7 +358,7 @@ $PADlead_id = sprintf("%09s", $new_lead_id); while (length($PADlead_id) > 9) {ch ### set the callerid print "SET CALLERID $YqueryCID\n"; checkresult($result); -print STDERR "callerID changed: $YqueryCID\n"; +if ($AGILOG) {$agi_string = "callerID changed: $YqueryCID"; &agi_output;} ### Grab inbound_group values from the database $stmtA = "SELECT drop_call_seconds,drop_message,drop_exten FROM vicidial_inbound_groups where group_id = '$channel_group';"; @@ -383,14 +382,14 @@ $sthA->finish(); ### insert a LIVE record to the vicidial_auto_calls table -$stmtA = "INSERT INTO vicidial_auto_calls values('','$server_ip','$channel_group','LIVE','$new_lead_id','$uniqueid','$callerid','$channel','$phone_code','$phone_number','$SQLdate','IN')"; +$stmtA = "INSERT INTO vicidial_auto_calls values('','$VARserver_ip','$channel_group','LIVE','$new_lead_id','$uniqueid','$callerid','$channel','$phone_code','$phone_number','$SQLdate','IN')"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if($M){print STDERR "\n|$stmtA|\n";} $stmtA = "INSERT INTO vicidial_closer_log (lead_id,campaign_id,call_date,start_epoch,status,phone_code,phone_number,user,processed) values('$new_lead_id','$channel_group','$SQLdate','$now_date_epoch','QUEUE','$phone_code','$phone_number','VDCL','N')"; - if($M){print STDERR "\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if ($M) {print STDERR "-- VDCL : |$new_lead_id|insert to vicidial_closer_log\n";} +if ($AGILOG) {$agi_string = "-- VDCL : |$new_lead_id|insert to vicidial_closer_log"; &agi_output;} $VDADlead_id = $new_lead_id; @@ -404,7 +403,7 @@ while ($drop_timer <= $DROP_TIME) $channel_status = $AGI->channel_status("$channel"); if ($channel_status < 1) { - print STDERR "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer CHECKING AGAIN...\n"; + if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer CHECKING AGAIN"; &agi_output;} ### sleep for 99 hundredths of a second usleep(1*990*1000); @@ -412,7 +411,7 @@ if ($channel_status < 1) if ($channel_status_DC < 1) { - print STDERR "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer\n"; + if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer"; &agi_output;} if ($drop_timer < 360) {$drop_seconds = $drop_timer;} $drop_timer = ($drop_timer + 360); } @@ -440,8 +439,8 @@ if ($channel_status < 1) $rec_countWAIT=0; $cbc=0; - $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip='$server_ip' and campaign_id = '$channel_group' and call_time < \"$SQLdateBEGIN\" and lead_id != '$VDADlead_id';"; - if($M){print STDERR "\n\n|$stmtA|\n";} + $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip='$VARserver_ip' and campaign_id = '$channel_group' and call_time < \"$SQLdateBEGIN\" and lead_id != '$VDADlead_id';"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -456,14 +455,14 @@ if ($channel_status < 1) if ($rec_countWAIT < 1) { - $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$new_lead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid' where status IN('CLOSER','READY') and server_ip='$server_ip' and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $channel_group %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; + $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$new_lead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid' where status IN('CLOSER','READY') and server_ip='$VARserver_ip' and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $channel_group %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDAD get agent: |$DROP_TIME|$drop_timer|$affected_rows|update of vla table: $channel_group|$server_ip\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "-- VDAD get agent: |$affected_rows|$channel_group|$stmtA|"; &agi_output;} if ($affected_rows > 0) { $cbc=0; - $stmtA = "SELECT conf_exten,user,extension FROM vicidial_live_agents where status = 'QUEUE' and server_ip='$server_ip' and campaign_id LIKE \"%CLOSER%\" and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} + $stmtA = "SELECT conf_exten,user,extension FROM vicidial_live_agents where status = 'QUEUE' and server_ip='$VARserver_ip' and campaign_id LIKE \"%CLOSER%\" and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -481,16 +480,16 @@ if ($channel_status < 1) $sthA->finish(); $stmtA = "UPDATE vicidial_auto_calls set status='CLOSER' where callerid='$callerid';"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL XFER : |$affected_rows|update of vac table: $callerid\n|$stmtA|\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL XFER : |$affected_rows|$callerid\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_closer_log set user='$VDADuser' where lead_id='$new_lead_id' order by call_date desc limit 1;"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- closer log : |$affected_rows|update of vcl table: $new_lead_id\n|$stmtA|\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- closer log : |$affected_rows|$new_lead_id\n|$stmtA|"; &agi_output;} - $dbhA->disconnect(); + $dbhA->disconnect(); - print STDERR "\nexiting the VDAD app, transferring call to $VDADconf_exten\n"; + if ($AGILOG) {$agi_string = "exiting VDAD app, transferring call to $VDADconf_exten"; &agi_output;} print "SET CONTEXT $ext_context\n"; checkresult($result); print "SET EXTENSION $VDADconf_exten\n"; @@ -509,23 +508,20 @@ if ($channel_status < 1) $now_date_epoch = time(); $now_date = "$year-$mon-$mday $hour:$min:$sec"; - print STDERR "\nXXXXXXXXXX VDAD transferred: start|stop $start_time|$now_date\n"; + if ($AGILOG) {$agi_string = "XXXXX VDAD transferred: start|stop $start_time|$now_date"; &agi_output;} exit; } else { - print STDERR "NNNNNNNNNN No agent record found!!!\n"; + if ($AGILOG) {$agi_string = "NNNNN No available agent found"; &agi_output;} } } else { - print STDERR "WWWWWWWW VDAD XFER WAIT: |$rec_countWAIT|$channel_group|$channel|$callerid|$uniqueid|\n"; + if ($AGILOG) {$agi_string = "WWWWW VDAD XFER WAIT: |$rec_countWAIT|$channel_group|$channel|$callerid|$uniqueid|"; &agi_output;} } - ### sleep for 99 hundredths of a second - usleep(1*990*1000); - if ($hold_message_counter > 30) { $AGI->stream_file('generic_hold'); @@ -539,7 +535,20 @@ if ($hold_tone_counter > 3) } else {$hold_tone_counter++;} -$drop_timer++; +if ($drop_timer < 3) + { + ### sleep for 44.5 hundredths of a second + usleep(1*445*1000); + + $drop_timer = ($drop_timer + 0.5); + } +else + { + ### sleep for 99 hundredths of a second + usleep(1*990*1000); + + $drop_timer++; + } } @@ -574,21 +583,20 @@ if ($drop_seconds < 1) { $cbc=0; $stmtA = "SELECT voicemail_ext FROM vicidial_inbound_groups where group_id = '$channel_group' limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; - $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; - $sthArows=$sthA->rows; - $rec_countCUSTDATA=0; - while ($sthArows > $cbc) - { - $VDADvoicemail_ext = "$aryA[0]"; - $VDADvoicemail_ext =~ s/\D//gi; - $DROPexten = "$voicemail_dump_exten$VDADvoicemail_ext"; - - $cbc++; - } - $sthA->finish(); + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $rec_countCUSTDATA=0; + while ($sthArows > $cbc) + { + @aryA = $sthA->fetchrow_array; + $VDADvoicemail_ext = "$aryA[0]"; + $VDADvoicemail_ext =~ s/\D//gi; + $DROPexten = "$voicemail_dump_exten$VDADvoicemail_ext"; + $cbc++; + } + $sthA->finish(); } } @@ -598,7 +606,7 @@ if ($drop_seconds < 1) if (length($DROPexten)>0) { ### if DROP extension is defined then send the dropped call there instead of hangup - print STDERR "\nexiting the VDAD app, transferring call to $DROPexten\n"; + if ($AGILOG) {$agi_string = "exiting the VDAD app, transferring call to $DROPexten"; &agi_output;} print "SET CONTEXT $ext_context\n"; checkresult($result); print "SET EXTENSION $DROPexten\n"; @@ -609,45 +617,39 @@ if ($drop_seconds < 1) else { ### insert a NEW record to the vicidial_manager table to be processed - $stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$server_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')"; - $affected_rows = $dbhA->do($stmtA) or die "Couldn't execute query:\n"; - if ($M) {print STDERR "-- VDCL call_hungup timout: |$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager\n";} + $stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$VARserver_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')"; + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL call_hungup timout: |$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager"; &agi_output;} } - $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' and server_ip='$server_ip' order by call_time desc limit 1;"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vac record deleted: |$affected_rows| $channel_group|$server_ip\n";} + $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' and server_ip='$VARserver_ip' order by call_time desc limit 1;"; + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vac record deleted: |$affected_rows| $VDADcampaign|"; &agi_output;} $stmtA = "UPDATE vicidial_closer_log set status='DROP',end_epoch='$now_date_epoch',length_in_sec='$drop_seconds' where lead_id = '$new_lead_id' order by start_epoch desc limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vicidial_closer_log update: |$affected_rows|$new_lead_id\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vcl update: |$affected_rows|$new_lead_id|\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_list set status='XDROP' where lead_id = '$new_lead_id';"; - if($M){print STDERR "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vicidial_list update: |$affected_rows|$new_lead_id\n";} - + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vl update: |$affected_rows|$new_lead_id|\n|$stmtA|"; &agi_output;} } - - - $dbhA->disconnect(); - - +$dbhA->disconnect(); exit; sub enter_pin_number { # please enter the pin number followed by the pound key +# please enter your 4 digit pin number $interrupt_digit=''; undef $interrupt_digit; $interrupt_digit = $AGI->stream_file('four_digit_id','123456789'); - print STDERR "interrupt_digit |$interrupt_digit|\n"; + if ($AGILOG) {$agi_string = "interrupt_digit |$interrupt_digit|"; &agi_output;} $digits_being_entered=1; $totalDTMF=''; @@ -692,7 +694,7 @@ while ( ($digit_loop_counter < 4) ) if ($digit =~ /\d/) { $totalDTMF = "$totalDTMF$digit"; - print STDERR "digit |$digit| TotalDTMF |$totalDTMF|\n"; + if ($AGILOG) {$agi_string = "digit |$digit| TotalDTMF |$totalDTMF|"; &agi_output;} # $AGI->say_digits("$digit"); undef $digit; } @@ -706,7 +708,7 @@ while ( ($digit_loop_counter < 4) ) $totalDTMF =~ s/\D//gi; $pin = $totalDTMF; -if ($totalDTMF) {print STDERR "digit |$digit| TotalDTMF |$totalDTMF|\n";} +if ($totalDTMF) {if ($AGILOG) {$agi_string = "digit |$digit| TotalDTMF |$totalDTMF|"; &agi_output;}} } @@ -727,7 +729,25 @@ sub checkresult { $pass++; } } else { - print STDERR "FAIL (unexpected result '$res')\n"; + # print STDERR "FAIL (unexpected result '$res')\n"; $fail++; } } + + + +sub agi_output +{ +if ($AGILOG >=2) + { + ### open the log file for writing ### + open(Lout, ">>$AGILOGfile") + || die "Can't open $AGILOGfile: $!\n"; + print Lout "$now_date|$script|$agi_string\n"; + close(Lout); + } + ### send to STDERR writing ### +if ( ($AGILOG == '1') || ($AGILOG == '3') ) + {print STDERR "$now_date|$script|$agi_string\n";} +$agi_string=''; +} diff --git a/agc_2-X/trunk/agi/agi-VDADcloser_inbound_5ID.agi b/agc_2-X/trunk/agi/agi-VDADcloser_inbound_5ID.agi index bfd53977..7bdee5e2 100644 --- a/agc_2-X/trunk/agi/agi-VDADcloser_inbound_5ID.agi +++ b/agc_2-X/trunk/agi/agi-VDADcloser_inbound_5ID.agi @@ -1,6 +1,6 @@ #!/usr/bin/perl # -# agi-VDADcloser_inbound.agi version 0.4 *DBI-version* +# agi-VDADcloser_inbound_5ID.agi version 0.5 *DBI-version* # # runs when a call comes in from an inbound call. This script will # send the calls out to the closers that are logged in. @@ -31,13 +31,42 @@ # 60504-1236 - Added drop second/message/exten options from inbound_group # 60811-1003 - Changed to DBI by Marin Blu # 60811-1145 - changed to use /etc/astguiclient.conf for configs +# 60821-1021 - added output options check from database +# - changed look for agent every 0.5 second for first 4 sec on hold # -$V = 1; # set to 1 for verbose mode -$M = 1; # set to 1 for 2 line messages mode +$script = 'agi-VDADcloser_inbound_5ID.agi'; $DROP_TIME = 360; ### number of seconds to wait until you drop a waiting call +($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) {$Fhour = "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"; +$start_time=$now_date; + $CIDdate = "$mon$mday$hour$min$sec"; + $tsSQLdate = "$year$mon$mday$hour$min$sec"; + $SQLdate = "$year-$mon-$mday $hour:$min:$sec"; + $SQLdateBEGIN = $SQLdate; + +$BDtarget = ($secX - 5); +($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget); +$Byear = ($Byear + 1900); +$Bmon++; +if ($Bmon < 10) {$Bmon = "0$Bmon";} +if ($Bmday < 10) {$Bmday = "0$Bmday";} +if ($Bhour < 10) {$Bhour = "0$Bhour";} +if ($Bmin < 10) {$Bmin = "0$Bmin";} +if ($Bsec < 10) {$Bsec = "0$Bsec";} + $BDtsSQLdate = "$Byear$Bmon$Bmday$Bhour$Bmin$Bsec"; + # default path to astguiclient configuration file: $PATHconf = '/etc/astguiclient.conf'; @@ -76,57 +105,45 @@ foreach(@conf) $i++; } -# Customized Variables -$server_ip = $VARserver_ip; # Asterisk server IP - if (!$VARDB_port) {$VARDB_port='3306';} +if (!$AGILOGfile) {$AGILOGfile = "$PATHlogs/agiout.$year-$mon-$mday";} use DBI; use Time::HiRes ('gettimeofday','usleep','sleep'); # necessary to have perl sleep command of less than one second 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; - -($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) {$Fhour = "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"; -$start_time=$now_date; - $CIDdate = "$mon$mday$hour$min$sec"; - $tsSQLdate = "$year$mon$mday$hour$min$sec"; - $SQLdate = "$year-$mon-$mday $hour:$min:$sec"; - $SQLdateBEGIN = $SQLdate; - -$BDtarget = ($secX - 5); -($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget); -$Byear = ($Byear + 1900); -$Bmon++; -if ($Bmon < 10) {$Bmon = "0$Bmon";} -if ($Bmday < 10) {$Bmday = "0$Bmday";} -if ($Bhour < 10) {$Bhour = "0$Bhour";} -if ($Bmin < 10) {$Bmin = "0$Bmin";} -if ($Bsec < 10) {$Bsec = "0$Bsec";} - $BDtsSQLdate = "$Byear$Bmon$Bmday$Bhour$Bmin$Bsec"; - +### Grab Server values from the database +$stmtA = "SELECT agi_output 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; +$rec_count=0; +while ($sthArows > $rec_count) + { + $AGILOG = '0'; + @aryA = $sthA->fetchrow_array; + $DBagi_output = "$aryA[0]"; + if ($DBagi_output =~ /STDERR/) {$AGILOG = '1';} + if ($DBagi_output =~ /FILE/) {$AGILOG = '2';} + if ($DBagi_output =~ /BOTH/) {$AGILOG = '3';} + $rec_count++; + } +$sthA->finish(); ### begin parsing run-time options ### if (length($ARGV[0])>1) { -if ($V) {print STDERR "Perl Environment Dump:\n";} + if ($AGILOG) {$agi_string = "Perl Environment Dump:"; &agi_output;} $i=0; while ($#ARGV >= $i) { $args = "$args $ARGV[$i]"; - if ($V) {print STDERR "$i|$ARGV[$i]|\n";} + if ($AGILOG) {$agi_string = "$i|$ARGV[$i]"; &agi_output;} $i++; } @@ -171,16 +188,12 @@ if ($V) {print STDERR "Perl Environment Dump:\n";} } } } -else -{ -if ($V) {print "no command line options set\n";} -} $|=1; while() { chomp; last unless length($_); - if ($V) + if ($AGILOG) { if (/^agi_(\w+)\:\s+(.*)$/) { @@ -229,48 +242,34 @@ while() { # } } - if ($V) - { +foreach $i (sort keys %AGI) +{ + if ($AGILOG) {$agi_string = " -- $i = $AGI{$i}"; &agi_output;} +} - if ($V) {print STDERR "AGI Environment Dump:\n";} - foreach $i (sort keys %AGI) { - if ($V) {print STDERR " -- $i = $AGI{$i}\n";} - } - } +if ($AGILOG) {$agi_string = "AGI Variables: |$unique_id|$channel|$extension|$type|$callerid|"; &agi_output;} $AGI->stream_file('beep'); - if ($V) {print STDERR "\nINBOUND CALL VDCL STARTED\n";} - &enter_pin_number; $fronter = $pin; -if ($M) {print STDERR "+++++ INBOUND CALL VDCL STARTED : |$unique_id|$channel_group|$channel|$extension|$type|$callerid-$pin|$now_date\n";} +if ($AGILOG) {$agi_string = ""+++++ INBOUND CALL VDCL STARTED : |$channel_group|$callerid-$pin|$now_date"; &agi_output;} $VDADphone=''; $VDADphone_code=''; -if ($V) {print STDERR "AGI Environment Dump: |$unique_id|$channel|$extension|$type|$callerid|\n";} - - -if ($V) {print STDERR "\nINBOUND CALL RECEIVED IN FROM VDCL: $callerid $channel\n";} -if ($M) {print STDERR "+++++ INBOUND VDCL START : |$unique_id|$channel|$extension|$type|$now_date\n";} - if ($channel =~ /Local/i) { -if ($M) {print STDERR "+++++ VDCL START LOCAL CHANNEL: EXITING\n";} +if ($AGILOG) {$agi_string = ""+++++ VDAD START LOCAL CHANNEL: EXITING- $priority"; &agi_output;} exit; } - - -$dbhA = DBI->connect("DBI:mysql:$VARDB_database:$VARDB_server:$VARDB_port", "$VARDB_user", "$VARDB_pass") - or die "Couldn't connect to database: " . DBI->errstr; ### Grab Server values from the database $cbc=0; -$stmtA = "SELECT voicemail_dump_exten,ext_context,answer_transfer_agent,local_gmt,asterisk_version,max_vicidial_trunks FROM servers where server_ip = '$server_ip';"; +$stmtA = "SELECT voicemail_dump_exten,ext_context,answer_transfer_agent,local_gmt,asterisk_version,max_vicidial_trunks 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; @@ -311,7 +310,7 @@ while ($sthArows > $cbc) $sthA->finish(); $new_lead_id = $insert_lead_id; -if($M){print STDERR "\n|$stmtA|$new_lead_id|\n";} +if ($AGILOG) {$agi_string = "|$stmtA|$new_lead_id|"; &agi_output;} $PADlead_id = sprintf("%09s", $new_lead_id); while (length($PADlead_id) > 9) {chop($PADlead_id);} # YmmddhhmmssLLLLLLLLL @@ -320,7 +319,7 @@ $PADlead_id = sprintf("%09s", $new_lead_id); while (length($PADlead_id) > 9) {ch ### set the callerid print "SET CALLERID $YqueryCID\n"; checkresult($result); -print STDERR "callerID changed: $YqueryCID\n"; +if ($AGILOG) {$agi_string = "callerID changed: $YqueryCID"; &agi_output;} ### Grab inbound_group values from the database $cbc=0; @@ -342,24 +341,24 @@ while ($sthArows > $cbc) $sthA->finish(); ### insert a LIVE record to the vicidial_auto_calls table -$stmtA = "INSERT INTO vicidial_auto_calls values('','$server_ip','$channel_group','LIVE','$new_lead_id','$uniqueid','$callerid','$channel','$phone_code','$phone_number','$SQLdate','IN')"; +$stmtA = "INSERT INTO vicidial_auto_calls values('','$VARserver_ip','$channel_group','LIVE','$new_lead_id','$uniqueid','$callerid','$channel','$phone_code','$phone_number','$SQLdate','IN')"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if($M){print STDERR "\n|$stmtA|\n";} $stmtA = "INSERT INTO vicidial_log (uniqueid,lead_id,campaign_id,call_date,start_epoch,status,phone_code,phone_number,user,processed) values('$uniqueid','$new_lead_id','$channel_group','$SQLdate','$now_date_epoch','XFER','$phone_code','$phone_number','$fronter','N')"; - if($M){print STDERR "\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if ($M) {print STDERR "-- VDAD : |$new_lead_id|$fronter|insert to vicidial_log: $uniqueid\n";} +if ($AGILOG) {$agi_string = "-- VDAD : |$new_lead_id|$fronter|insert to vicidial_log: $uniqueid"; &agi_output;} $stmtA = "INSERT INTO vicidial_closer_log (lead_id,campaign_id,call_date,start_epoch,status,phone_code,phone_number,user,processed) values('$new_lead_id','$channel_group','$SQLdate','$now_date_epoch','QUEUE','$phone_code','$phone_number','VDCL','N')"; - if($M){print STDERR "\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if ($M) {print STDERR "-- VDCL : |$new_lead_id|insert to vicidial_closer_log\n";} +if ($AGILOG) {$agi_string = "-- VDCL : |$new_lead_id|insert to vicidial_closer_log"; &agi_output;} $stmtA = "INSERT INTO vicidial_xfer_log (lead_id,campaign_id,call_date,phone_code,phone_number,user,closer) values('$new_lead_id','$channel_group','$SQLdate','$phone_code','$phone_number','$fronter','VDXL')"; - if($M){print STDERR "\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if ($M) {print STDERR "-- VDXL : |$new_lead_id|insert to vicidial_closer_log\n";} +if ($AGILOG) {$agi_string = "-- VDXL : |$new_lead_id|insert to vicidial_xfer_log"; &agi_output;} $VDADlead_id = $new_lead_id; @@ -373,7 +372,7 @@ while ($drop_timer <= $DROP_TIME) $channel_status = $AGI->channel_status("$channel"); if ($channel_status < 1) { - print STDERR "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer CHECKING AGAIN...\n"; + if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer CHECKING AGAIN"; &agi_output;} ### sleep for 99 hundredths of a second usleep(1*990*1000); @@ -381,12 +380,11 @@ if ($channel_status < 1) if ($channel_status_DC < 1) { - print STDERR "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer\n"; + if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer"; &agi_output;} if ($drop_timer < 360) {$drop_seconds = $drop_timer;} $drop_timer = ($drop_timer + 360); } } - $cbc=0; $stmtA = "SELECT next_agent_call FROM vicidial_inbound_groups where group_id='$channel_group';"; $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; @@ -409,8 +407,8 @@ if ($channel_status < 1) $rec_countWAIT=0; $cbc=0; - $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip='$server_ip' and campaign_id = '$channel_group' and call_time < \"$SQLdateBEGIN\" and lead_id != '$VDADlead_id';"; - if($M){print STDERR "\n\n|$stmtA|\n";} + $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip='$VARserver_ip' and campaign_id = '$channel_group' and call_time < \"$SQLdateBEGIN\" and lead_id != '$VDADlead_id';"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -425,15 +423,14 @@ if ($channel_status < 1) if ($rec_countWAIT < 1) { - $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$new_lead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid' where status IN('CLOSER','READY') and server_ip='$server_ip' and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $channel_group %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; + $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$new_lead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid' where status IN('CLOSER','READY') and server_ip='$VARserver_ip' and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $channel_group %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDAD get agent: |$DROP_TIME|$drop_timer|$affected_rows|update of vla table: $channel_group|$server_ip\n";} - # if ($M) {print STDERR "|$stmtA|\n";} + if ($AGILOG) {$agi_string = "-- VDAD get agent: |$affected_rows|$channel_group|$stmtA|"; &agi_output;} if ($affected_rows > 0) { $cbc=0; - $stmtA = "SELECT conf_exten,user,extension FROM vicidial_live_agents where status = 'QUEUE' and server_ip='$server_ip' and campaign_id LIKE \"%CLOSER%\" and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} + $stmtA = "SELECT conf_exten,user,extension FROM vicidial_live_agents where status = 'QUEUE' and server_ip='$VARserver_ip' and campaign_id LIKE \"%CLOSER%\" and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -451,21 +448,20 @@ if ($channel_status < 1) $sthA->finish(); $stmtA = "UPDATE vicidial_auto_calls set status='CLOSER' where callerid='$callerid';"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL XFER : |$affected_rows|update of vac table: $callerid\n|$stmtA|\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL XFER : |$affected_rows|$callerid\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_xfer_log set closer='$VDADuser' where lead_id = '$new_lead_id' order by call_date desc limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDXL vicidial_xfer_log update: |$affected_rows|$new_lead_id|$VDADuser\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDXL XFER vicidial_xfer_log update: |$affected_rows|$new_lead_id|$VDADuser\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_closer_log set user='$VDADuser' where lead_id='$new_lead_id' order by call_date desc limit 1;"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- closer log : |$affected_rows|update of vcl table: $new_lead_id\n|$stmtA|\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- closer log : |$affected_rows|$new_lead_id\n|$stmtA|"; &agi_output;} $dbhA->disconnect(); - print STDERR "\nexiting the VDAD app, transferring call to $VDADconf_exten\n"; + if ($AGILOG) {$agi_string = "exiting VDAD app, transferring call to $VDADconf_exten"; &agi_output;} print "SET CONTEXT $ext_context\n"; checkresult($result); print "SET EXTENSION $VDADconf_exten\n"; @@ -484,23 +480,20 @@ if ($channel_status < 1) $now_date_epoch = time(); $now_date = "$year-$mon-$mday $hour:$min:$sec"; - print STDERR "\nXXXXXXXXXX VDAD transferred: start|stop $start_time|$now_date\n"; + if ($AGILOG) {$agi_string = "XXXXX VDAD transferred: start|stop $start_time|$now_date"; &agi_output;} exit; } else { - print STDERR "NNNNNNNNNN No agent record found!!!\n"; + if ($AGILOG) {$agi_string = "NNNNN No available agent found"; &agi_output;} } } else { - print STDERR "WWWWWWWW VDAD XFER WAIT: |$rec_countWAIT|$channel_group|$channel|$callerid|$uniqueid|\n"; + if ($AGILOG) {$agi_string = "WWWWW VDAD XFER WAIT: |$rec_countWAIT|$channel_group|$channel|$callerid|$uniqueid|"; &agi_output;} } - ### sleep for 99 hundredths of a second - usleep(1*990*1000); - if ($hold_message_counter > 30) { $AGI->stream_file('generic_hold'); @@ -514,7 +507,20 @@ if ($hold_tone_counter > 3) } else {$hold_tone_counter++;} -$drop_timer++; +if ($drop_timer < 3) + { + ### sleep for 44.5 hundredths of a second + usleep(1*445*1000); + + $drop_timer = ($drop_timer + 0.5); + } +else + { + ### sleep for 99 hundredths of a second + usleep(1*990*1000); + + $drop_timer++; + } } @@ -549,21 +555,20 @@ if ($drop_seconds < 1) { $cbc=0; $stmtA = "SELECT voicemail_ext FROM vicidial_inbound_groups where group_id = '$channel_group' limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; - $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; - $sthArows=$sthA->rows; - $rec_countCUSTDATA=0; - while ($sthArows > $cbc) - { - $VDADvoicemail_ext = "$aryA[0]"; - $VDADvoicemail_ext =~ s/\D//gi; - $DROPexten = "$voicemail_dump_exten$VDADvoicemail_ext"; - - $cbc++; - } - $sthA->finish(); + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $rec_countCUSTDATA=0; + while ($sthArows > $cbc) + { + @aryA = $sthA->fetchrow_array; + $VDADvoicemail_ext = "$aryA[0]"; + $VDADvoicemail_ext =~ s/\D//gi; + $DROPexten = "$voicemail_dump_exten$VDADvoicemail_ext"; + $cbc++; + } + $sthA->finish(); } } @@ -573,7 +578,7 @@ if ($drop_seconds < 1) if (length($DROPexten)>0) { ### if DROP extension is defined then send the dropped call there instead of hangup - print STDERR "\nexiting the VDAD app, transferring call to $DROPexten\n"; + if ($AGILOG) {$agi_string = "exiting the VDAD app, transferring call to $DROPexten"; &agi_output;} print "SET CONTEXT $ext_context\n"; checkresult($result); print "SET EXTENSION $DROPexten\n"; @@ -584,35 +589,32 @@ if ($drop_seconds < 1) else { ### insert a NEW record to the vicidial_manager table to be processed - $stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$server_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')"; - $affected_rows = $dbhA->do($stmtA) or die "Couldn't execute query:\n"; - if ($M) {print STDERR "-- VDCL call_hungup timout: |$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager\n";} + $stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$VARserver_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')"; + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL call_hungup timout: |$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager"; &agi_output;} } - $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' and server_ip='$server_ip' order by call_time desc limit 1;"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vac record deleted: |$affected_rows| $channel_group|$server_ip\n";} + $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' and server_ip='$VARserver_ip' order by call_time desc limit 1;"; + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vac record deleted: |$affected_rows| $VDADcampaign|"; &agi_output;} $stmtA = "UPDATE vicidial_closer_log set status='DROP',end_epoch='$now_date_epoch',length_in_sec='$drop_seconds' where lead_id = '$new_lead_id' order by start_epoch desc limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vicidial_closer_log update: |$affected_rows|$new_lead_id\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vcl update: |$affected_rows|$new_lead_id|\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_list set status='XDROP' where lead_id = '$new_lead_id';"; - if($M){print STDERR "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vicidial_list update: |$affected_rows|$new_lead_id\n";} - + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vl update: |$affected_rows|$new_lead_id|\n|$stmtA|"; &agi_output;} } $dbhA->disconnect(); - exit; sub enter_pin_number { # please enter the pin number followed by the pound key +# please enter your 4 digit pin number $digit=''; undef $digit; @@ -621,7 +623,7 @@ undef $interrupt_digit; $interrupt_digit = $AGI->stream_file('four_digit_id','123456789'); - print STDERR "interrupt_digit |$interrupt_digit|\n"; + if ($AGILOG) {$agi_string = "interrupt_digit |$interrupt_digit|"; &agi_output;} $digits_being_entered=1; $totalDTMF=''; @@ -666,7 +668,7 @@ while ( ($digit_loop_counter < 5) ) if ($digit =~ /\d/) { $totalDTMF = "$totalDTMF$digit"; - print STDERR "digit |$digit| TotalDTMF |$totalDTMF|\n"; + if ($AGILOG) {$agi_string = "digit |$digit| TotalDTMF |$totalDTMF|"; &agi_output;} # $AGI->say_digits("$digit"); undef $digit; } @@ -680,7 +682,7 @@ while ( ($digit_loop_counter < 5) ) $totalDTMF =~ s/\D//gi; $pin = $totalDTMF; -if ($totalDTMF) {print STDERR "digit |$digit| TotalDTMF |$totalDTMF|\n";} +if ($totalDTMF) {if ($AGILOG) {$agi_string = "digit |$digit| TotalDTMF |$totalDTMF|"; &agi_output;}} } @@ -701,11 +703,28 @@ sub checkresult { $pass++; } } else { - print STDERR "FAIL (unexpected result '$res')\n"; + # print STDERR "FAIL (unexpected result '$res')\n"; $fail++; } } -### you're call is very important to us, please stay on the line and you will be transferred to the next available agent \ No newline at end of file +### you're call is very important to us, please stay on the line and you will be transferred to the next available agent + + +sub agi_output +{ +if ($AGILOG >=2) + { + ### open the log file for writing ### + open(Lout, ">>$AGILOGfile") + || die "Can't open $AGILOGfile: $!\n"; + print Lout "$now_date|$script|$agi_string\n"; + close(Lout); + } + ### send to STDERR writing ### +if ( ($AGILOG == '1') || ($AGILOG == '3') ) + {print STDERR "$now_date|$script|$agi_string\n";} +$agi_string=''; +} diff --git a/agc_2-X/trunk/agi/agi-VDADcloser_inbound_NOCID.agi b/agc_2-X/trunk/agi/agi-VDADcloser_inbound_NOCID.agi index b79de2f4..9a78f24c 100644 --- a/agc_2-X/trunk/agi/agi-VDADcloser_inbound_NOCID.agi +++ b/agc_2-X/trunk/agi/agi-VDADcloser_inbound_NOCID.agi @@ -1,6 +1,6 @@ #!/usr/bin/perl # -# agi-VDADcloser_inbound_NOCID.agi version 0.4 *DBI-version* +# agi-VDADcloser_inbound_NOCID.agi version 0.5 *DBI-version* # # runs when a call comes in from an inbound call. This script will # send the calls out to the closers that are logged in. @@ -31,13 +31,41 @@ # 60504-1238 - Added drop second/message/exten options from inbound_group # 60811-1003 - Changed to DBI by Marin Blu # 60811-1145 - changed to use /etc/astguiclient.conf for configs +# 60821-1021 - added output options check from database # -$V = 1; # set to 1 for verbose mode -$M = 1; # set to 1 for 2 line messages mode +$script = 'agi-VDADcloser_inbound_NOCID.agi'; $DROP_TIME = 360; ### number of seconds to wait until you drop a waiting call +($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) {$Fhour = "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"; +$start_time=$now_date; + $CIDdate = "$mon$mday$hour$min$sec"; + $tsSQLdate = "$year$mon$mday$hour$min$sec"; + $SQLdate = "$year-$mon-$mday $hour:$min:$sec"; + $SQLdateBEGIN = $SQLdate; + +$BDtarget = ($secX - 5); +($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget); +$Byear = ($Byear + 1900); +$Bmon++; +if ($Bmon < 10) {$Bmon = "0$Bmon";} +if ($Bmday < 10) {$Bmday = "0$Bmday";} +if ($Bhour < 10) {$Bhour = "0$Bhour";} +if ($Bmin < 10) {$Bmin = "0$Bmin";} +if ($Bsec < 10) {$Bsec = "0$Bsec";} + $BDtsSQLdate = "$Byear$Bmon$Bmday$Bhour$Bmin$Bsec"; + # default path to astguiclient configuration file: $PATHconf = '/etc/astguiclient.conf'; @@ -76,57 +104,45 @@ foreach(@conf) $i++; } -# Customized Variables -$server_ip = $VARserver_ip; # Asterisk server IP - if (!$VARDB_port) {$VARDB_port='3306';} +if (!$AGILOGfile) {$AGILOGfile = "$PATHlogs/agiout.$year-$mon-$mday";} use DBI; use Time::HiRes ('gettimeofday','usleep','sleep'); # necessary to have perl sleep command of less than one second 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; - -($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) {$Fhour = "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"; -$start_time=$now_date; - $CIDdate = "$mon$mday$hour$min$sec"; - $tsSQLdate = "$year$mon$mday$hour$min$sec"; - $SQLdate = "$year-$mon-$mday $hour:$min:$sec"; - $SQLdateBEGIN = $SQLdate; - -$BDtarget = ($secX - 5); -($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget); -$Byear = ($Byear + 1900); -$Bmon++; -if ($Bmon < 10) {$Bmon = "0$Bmon";} -if ($Bmday < 10) {$Bmday = "0$Bmday";} -if ($Bhour < 10) {$Bhour = "0$Bhour";} -if ($Bmin < 10) {$Bmin = "0$Bmin";} -if ($Bsec < 10) {$Bsec = "0$Bsec";} - $BDtsSQLdate = "$Byear$Bmon$Bmday$Bhour$Bmin$Bsec"; - +### Grab Server values from the database +$stmtA = "SELECT agi_output 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; +$rec_count=0; +while ($sthArows > $rec_count) + { + $AGILOG = '0'; + @aryA = $sthA->fetchrow_array; + $DBagi_output = "$aryA[0]"; + if ($DBagi_output =~ /STDERR/) {$AGILOG = '1';} + if ($DBagi_output =~ /FILE/) {$AGILOG = '2';} + if ($DBagi_output =~ /BOTH/) {$AGILOG = '3';} + $rec_count++; + } +$sthA->finish(); ### begin parsing run-time options ### if (length($ARGV[0])>1) { -if ($V) {print STDERR "Perl Environment Dump:\n";} + if ($AGILOG) {$agi_string = "Perl Environment Dump:"; &agi_output;} $i=0; while ($#ARGV >= $i) { $args = "$args $ARGV[$i]"; - if ($V) {print STDERR "$i|$ARGV[$i]|\n";} + if ($AGILOG) {$agi_string = "$i|$ARGV[$i]"; &agi_output;} $i++; } @@ -171,16 +187,12 @@ if ($V) {print STDERR "Perl Environment Dump:\n";} } } } -else -{ -if ($V) {print "no command line options set\n";} -} $|=1; while() { chomp; last unless length($_); - if ($V) + if ($AGILOG) { if (/^agi_(\w+)\:\s+(.*)$/) { @@ -229,56 +241,41 @@ while() { # } } - if ($V) - { +foreach $i (sort keys %AGI) +{ + if ($AGILOG) {$agi_string = " -- $i = $AGI{$i}"; &agi_output;} +} - if ($V) {print STDERR "AGI Environment Dump:\n";} - foreach $i (sort keys %AGI) { - if ($V) {print STDERR " -- $i = $AGI{$i}\n";} - } - } +if ($AGILOG) {$agi_string = "AGI Variables: |$unique_id|$channel|$extension|$type|$callerid|"; &agi_output;} $AGI->stream_file('beep'); - if ($V) {print STDERR "\nINBOUND CALL VDCL STARTED\n";} - #&enter_pin_number; $pin = '123456'; $fronter = $pin; -if ($M) {print STDERR "+++++ INBOUND CALL VDCL STARTED : |$unique_id|$channel_group|$channel|$extension|$type|$callerid-$pin|$now_date\n";} +if ($AGILOG) {$agi_string = ""+++++ INBOUND CALL VDCL STARTED : |$channel_group|$callerid-$pin|$now_date"; &agi_output;} $VDADphone=''; $VDADphone_code=''; -if ($V) {print STDERR "AGI Environment Dump: |$unique_id|$channel|$extension|$type|$callerid|\n";} - - -if ($V) {print STDERR "\nINBOUND CALL RECEIVED IN FROM VDCL: $callerid $channel\n";} -if ($M) {print STDERR "+++++ INBOUND VDCL START : |$unique_id|$channel|$extension|$type|$now_date\n";} - if ($channel =~ /Local/i) { -if ($M) {print STDERR "+++++ VDCL START LOCAL CHANNEL: EXITING\n";} +if ($AGILOG) {$agi_string = ""+++++ VDAD START LOCAL CHANNEL: EXITING- $priority"; &agi_output;} exit; } - -$dbhA = DBI->connect("DBI:mysql:$VARDB_database:$VARDB_server:$VARDB_port", "$VARDB_user", "$VARDB_pass") - or die "Couldn't connect to database: " . DBI->errstr; - ### Grab Server values from the database $cbc=0; -$stmtA = "SELECT voicemail_dump_exten,ext_context,answer_transfer_agent,local_gmt,asterisk_version,max_vicidial_trunks FROM servers where server_ip = '$server_ip';"; +$stmtA = "SELECT voicemail_dump_exten,ext_context,answer_transfer_agent,local_gmt,asterisk_version,max_vicidial_trunks 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; while ($sthArows > $cbc) { @aryA = $sthA->fetchrow_array; - $DBvoicemail_dump_exten = "$aryA[0]"; $DBext_context = "$aryA[1]"; $DBanswer_transfer_agent = "$aryA[2]"; @@ -312,16 +309,16 @@ while ($sthArows > $cbc) $sthA->finish(); $new_lead_id = $insert_lead_id; -if($M){print STDERR "\n|$stmtA|$new_lead_id|\n";} +if ($AGILOG) {$agi_string = "|$stmtA|$new_lead_id|"; &agi_output;} - $PADlead_id = sprintf("%09s", $new_lead_id); while (length($PADlead_id) > 9) {chop($PADlead_id);} - # YmmddhhmmssLLLLLLLLL - $YqueryCID = "Y$CIDdate$PADlead_id"; - $callerid = $YqueryCID; - ### set the callerid - print "SET CALLERID $YqueryCID\n"; - checkresult($result); - print STDERR "callerID changed: $YqueryCID\n"; +$PADlead_id = sprintf("%09s", $new_lead_id); while (length($PADlead_id) > 9) {chop($PADlead_id);} +# YmmddhhmmssLLLLLLLLL + $YqueryCID = "Y$CIDdate$PADlead_id"; + $callerid = $YqueryCID; +### set the callerid +print "SET CALLERID $YqueryCID\n"; +checkresult($result); +if ($AGILOG) {$agi_string = "callerID changed: $YqueryCID"; &agi_output;} ### Grab inbound_group values from the database $cbc=0; @@ -343,24 +340,24 @@ while ($sthArows > $cbc) $sthA->finish(); ### insert a LIVE record to the vicidial_auto_calls table -$stmtA = "INSERT INTO vicidial_auto_calls values('','$server_ip','$channel_group','LIVE','$new_lead_id','$uniqueid','$callerid','$channel','$phone_code','$phone_number','$SQLdate','IN')"; +$stmtA = "INSERT INTO vicidial_auto_calls values('','$VARserver_ip','$channel_group','LIVE','$new_lead_id','$uniqueid','$callerid','$channel','$phone_code','$phone_number','$SQLdate','IN')"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if($M){print STDERR "\n|$stmtA|\n";} $stmtA = "INSERT INTO vicidial_log (uniqueid,lead_id,campaign_id,call_date,start_epoch,status,phone_code,phone_number,user,processed) values('$uniqueid','$new_lead_id','$channel_group','$SQLdate','$now_date_epoch','XFER','$phone_code','$phone_number','$fronter','N')"; - if($M){print STDERR "\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if ($M) {print STDERR "-- VDAD : |$new_lead_id|$fronter|insert to vicidial_log: $uniqueid\n";} +if ($AGILOG) {$agi_string = "-- VDAD : |$new_lead_id|$fronter|insert to vicidial_log: $uniqueid"; &agi_output;} $stmtA = "INSERT INTO vicidial_closer_log (lead_id,campaign_id,call_date,start_epoch,status,phone_code,phone_number,user,processed) values('$new_lead_id','$channel_group','$SQLdate','$now_date_epoch','QUEUE','$phone_code','$phone_number','VDCL','N')"; - if($M){print STDERR "\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if ($M) {print STDERR "-- VDCL : |$new_lead_id|insert to vicidial_closer_log\n";} +if ($AGILOG) {$agi_string = "-- VDCL : |$new_lead_id|insert to vicidial_closer_log"; &agi_output;} $stmtA = "INSERT INTO vicidial_xfer_log (lead_id,campaign_id,call_date,phone_code,phone_number,user,closer) values('$new_lead_id','$channel_group','$SQLdate','$phone_code','$phone_number','$fronter','VDXL')"; - if($M){print STDERR "\n|$stmtA|\n";} + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $affected_rows = $dbhA->do($stmtA); -if ($M) {print STDERR "-- VDXL : |$new_lead_id|insert to vicidial_closer_log\n";} +if ($AGILOG) {$agi_string = "-- VDXL : |$new_lead_id|insert to vicidial_xfer_log"; &agi_output;} $VDADlead_id = $new_lead_id; @@ -374,7 +371,7 @@ while ($drop_timer <= $DROP_TIME) $channel_status = $AGI->channel_status("$channel"); if ($channel_status < 1) { - print STDERR "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer CHECKING AGAIN...\n"; + if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer CHECKING AGAIN"; &agi_output;} ### sleep for 99 hundredths of a second usleep(1*990*1000); @@ -382,15 +379,13 @@ if ($channel_status < 1) if ($channel_status_DC < 1) { - print STDERR "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer\n"; + if ($AGILOG) {$agi_string = "CHANNEL $channel DOWN $channel_status $DROP_TIME|$drop_timer"; &agi_output;} if ($drop_timer < 360) {$drop_seconds = $drop_timer;} $drop_timer = ($drop_timer + 360); } } - - $cbc=0; + $cbc=0; $stmtA = "SELECT next_agent_call FROM vicidial_inbound_groups where group_id='$channel_group';"; - $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -411,8 +406,8 @@ if ($channel_status < 1) $rec_countWAIT=0; $cbc=0; - $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip='$server_ip' and campaign_id = '$channel_group' and call_time < \"$SQLdateBEGIN\" and lead_id != '$VDADlead_id';"; - if($M){print STDERR "\n\n|$stmtA|\n";} + $stmtA = "SELECT count(*) FROM vicidial_auto_calls where status = 'LIVE' and server_ip='$VARserver_ip' and campaign_id = '$channel_group' and call_time < \"$SQLdateBEGIN\" and lead_id != '$VDADlead_id';"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -427,15 +422,14 @@ if ($channel_status < 1) if ($rec_countWAIT < 1) { - $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$new_lead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid' where status IN('CLOSER','READY') and server_ip='$server_ip' and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $channel_group %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; + $stmtA = "UPDATE vicidial_live_agents set status='QUEUE',lead_id='$new_lead_id',uniqueid='$unique_id', channel='$channel', callerid='$callerid' where status IN('CLOSER','READY') and server_ip='$VARserver_ip' and campaign_id LIKE \"%CLOSER%\" and closer_campaigns LIKE \"% $channel_group %\" and last_update_time > '$BDtsSQLdate' $agent_call_order limit 1;"; my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDAD get agent: |$DROP_TIME|$drop_timer|$affected_rows|update of vla table: $channel_group|$server_ip\n";} - # if ($M) {print STDERR "|$stmtA|\n";} + if ($AGILOG) {$agi_string = "-- VDAD get agent: |$affected_rows|$channel_group|$stmtA|"; &agi_output;} if ($affected_rows > 0) { $cbc=0; - $stmtA = "SELECT conf_exten,user,extension FROM vicidial_live_agents where status = 'QUEUE' and server_ip='$server_ip' and campaign_id LIKE \"%CLOSER%\" and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} + $stmtA = "SELECT conf_exten,user,extension FROM vicidial_live_agents where status = 'QUEUE' and server_ip='$VARserver_ip' and campaign_id LIKE \"%CLOSER%\" and callerid='$callerid' and channel='$channel' order by last_call_time limit 1;"; + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -453,21 +447,20 @@ if ($channel_status < 1) $sthA->finish(); $stmtA = "UPDATE vicidial_auto_calls set status='CLOSER' where callerid='$callerid';"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL XFER : |$affected_rows|update of vac table: $callerid\n|$stmtA|\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL XFER : |$affected_rows|$callerid\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_xfer_log set closer='$VDADuser' where lead_id = '$new_lead_id' order by call_date desc limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDXL vicidial_xfer_log update: |$affected_rows|$new_lead_id|$VDADuser\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDXL XFER vicidial_xfer_log update: |$affected_rows|$new_lead_id|$VDADuser\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_closer_log set user='$VDADuser' where lead_id='$new_lead_id' order by call_date desc limit 1;"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- closer log : |$affected_rows|update of vcl table: $new_lead_id\n|$stmtA|\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- closer log : |$affected_rows|$new_lead_id\n|$stmtA|"; &agi_output;} - $dbhA->disconnect(); + $dbhA->disconnect(); - print STDERR "\nexiting the VDAD app, transferring call to $VDADconf_exten\n"; + if ($AGILOG) {$agi_string = "exiting VDAD app, transferring call to $VDADconf_exten"; &agi_output;} print "SET CONTEXT $ext_context\n"; checkresult($result); print "SET EXTENSION $VDADconf_exten\n"; @@ -486,24 +479,20 @@ if ($channel_status < 1) $now_date_epoch = time(); $now_date = "$year-$mon-$mday $hour:$min:$sec"; - print STDERR "\nXXXXXXXXXX VDAD transferred: start|stop $start_time|$now_date\n"; + if ($AGILOG) {$agi_string = "XXXXX VDAD transferred: start|stop $start_time|$now_date"; &agi_output;} exit; } else { - print STDERR "NNNNNNNNNN No agent record found!!!\n"; - } - + if ($AGILOG) {$agi_string = "NNNNN No available agent found"; &agi_output;} + } } else { - print STDERR "WWWWWWWW VDAD XFER WAIT: |$rec_countWAIT|$channel_group|$channel|$callerid|$uniqueid|\n"; + if ($AGILOG) {$agi_string = "WWWWW VDAD XFER WAIT: |$rec_countWAIT|$channel_group|$channel|$callerid|$uniqueid|"; &agi_output;} } - ### sleep for 99 hundredths of a second - usleep(1*990*1000); - if ($hold_message_counter > 30) { $AGI->stream_file('generic_hold'); @@ -517,7 +506,20 @@ if ($hold_tone_counter > 3) } else {$hold_tone_counter++;} -$drop_timer++; +if ($drop_timer < 3) + { + ### sleep for 44.5 hundredths of a second + usleep(1*445*1000); + + $drop_timer = ($drop_timer + 0.5); + } +else + { + ### sleep for 99 hundredths of a second + usleep(1*990*1000); + + $drop_timer++; + } } @@ -552,21 +554,20 @@ if ($drop_seconds < 1) { $cbc=0; $stmtA = "SELECT voicemail_ext FROM vicidial_inbound_groups where group_id = '$channel_group' limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - + if ($AGILOG) {$agi_string = "|$stmtA|"; &agi_output;} $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; - $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; - $sthArows=$sthA->rows; - $rec_countCUSTDATA=0; - while ($sthArows > $cbc) - { - $VDADvoicemail_ext = "$aryA[0]"; - $VDADvoicemail_ext =~ s/\D//gi; - $DROPexten = "$voicemail_dump_exten$VDADvoicemail_ext"; - - $cbc++; - } - $sthA->finish(); + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + $rec_countCUSTDATA=0; + while ($sthArows > $cbc) + { + @aryA = $sthA->fetchrow_array; + $VDADvoicemail_ext = "$aryA[0]"; + $VDADvoicemail_ext =~ s/\D//gi; + $DROPexten = "$voicemail_dump_exten$VDADvoicemail_ext"; + $cbc++; + } + $sthA->finish(); } } @@ -576,7 +577,7 @@ if ($drop_seconds < 1) if (length($DROPexten)>0) { ### if DROP extension is defined then send the dropped call there instead of hangup - print STDERR "\nexiting the VDAD app, transferring call to $DROPexten\n"; + if ($AGILOG) {$agi_string = "exiting the VDAD app, transferring call to $DROPexten"; &agi_output;} print "SET CONTEXT $ext_context\n"; checkresult($result); print "SET EXTENSION $DROPexten\n"; @@ -587,33 +588,28 @@ if ($drop_seconds < 1) else { ### insert a NEW record to the vicidial_manager table to be processed - $stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$server_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')"; - $affected_rows = $dbhA->do($stmtA) or die "Couldn't execute query:\n"; - if ($M) {print STDERR "-- VDCL call_hungup timout: |$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager\n";} + $stmtA = "INSERT INTO vicidial_manager values('','','$SQLdate','NEW','N','$VARserver_ip','','Hangup','$VHqueryCID','Channel: $channel','','','','','','','','','')"; + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL call_hungup timout: |$VHqueryCID|$VDADconf_exten|$channel|insert to vicidial_manager"; &agi_output;} } - $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' and server_ip='$server_ip' order by call_time desc limit 1;"; - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vac record deleted: |$affected_rows| $channel_group|$server_ip\n";} + $stmtA = "DELETE FROM vicidial_auto_calls where callerid='$callerid' and server_ip='$VARserver_ip' order by call_time desc limit 1;"; + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vac record deleted: |$affected_rows| $VDADcampaign|"; &agi_output;} $stmtA = "UPDATE vicidial_closer_log set status='DROP',end_epoch='$now_date_epoch',length_in_sec='$drop_seconds' where lead_id = '$new_lead_id' order by start_epoch desc limit 1;"; - if($M){print STDERR "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vicidial_closer_log update: |$affected_rows|$new_lead_id\n";} + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vcl update: |$affected_rows|$new_lead_id|\n|$stmtA|"; &agi_output;} $stmtA = "UPDATE vicidial_list set status='XDROP' where lead_id = '$new_lead_id';"; - if($M){print STDERR "\n\n|$stmtA|\n";} - my $affected_rows = $dbhA->do($stmtA); - if ($M) {print STDERR "-- VDCL vicidial_list update: |$affected_rows|$new_lead_id\n";} - + $affected_rows = $dbhA->do($stmtA); + if ($AGILOG) {$agi_string = "-- VDCL vl update: |$affected_rows|$new_lead_id|\n|$stmtA|"; &agi_output;} } - $dbhA->disconnect(); +$dbhA->disconnect(); exit; - - sub checkresult { my ($res) = @_; my $retval; @@ -629,11 +625,28 @@ sub checkresult { $pass++; } } else { - print STDERR "FAIL (unexpected result '$res')\n"; + # print STDERR "FAIL (unexpected result '$res')\n"; $fail++; } } -### you're call is very important to us, please stay on the line and you will be transferred to the next available agent \ No newline at end of file +### you're call is very important to us, please stay on the line and you will be transferred to the next available agent + + +sub agi_output +{ +if ($AGILOG >=2) + { + ### open the log file for writing ### + open(Lout, ">>$AGILOGfile") + || die "Can't open $AGILOGfile: $!\n"; + print Lout "$now_date|$script|$agi_string\n"; + close(Lout); + } + ### send to STDERR writing ### +if ( ($AGILOG == '1') || ($AGILOG == '3') ) + {print STDERR "$now_date|$script|$agi_string\n";} +$agi_string=''; +}