Fix for Asterisk manager changes since version 13.

Added optionnal Asterisk security logging script.

git-svn-id: svn://192.168.202.10@3230 3d104415-ff17-0410-8863-d5cf3c621b8a
This commit is contained in:
mattf
2020-04-22 20:08:54 +00:00
parent e02aa4702a
commit 7e88b39b1f
10 changed files with 1834 additions and 161 deletions
+20 -1
View File
@@ -139,9 +139,10 @@
# 190713-0900 - Added vicidial_lead_call_quota_counts log archiving
# 191017-2039 - Added reset of calls_today_filtered fields
# 200122-0847 - Added CID Groups auto-rotate feature
# 200422-1544 - Added purging of vicidial_security_event_log table after 7 days
#
$build = '200122-0847';
$build = '200422-1544';
$DB=0; # Debug flag
$teodDB=0; # flag to log Timeclock End of Day processes to log file
@@ -1836,6 +1837,24 @@ if ($timeclock_end_of_day_NOW > 0)
##### END vicidial_sessions_recent_archive end of day process removing records older than 7 days #####
##### BEGIN vicidial_security_event_log end of day process removing records older than 7 days #####
$stmtA = "DELETE from vicidial_security_event_log where event_time < \"$SDSQLdate\";";
if($DBX){print STDERR "\n|$stmtA|\n";}
$affected_rows = $dbhA->do($stmtA);
if($DB){print STDERR "\n|$affected_rows vicidial_security_event_log records older than 7 days purged|\n";}
if ($teodDB) {$event_string = "vicidial_security_event_log records older than 7 days purged: |$stmtA|$affected_rows|"; &teod_logger;}
$stmtA = "optimize table vicidial_security_event_log;";
if($DBX){print STDERR "\n|$stmtA|\n";}
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
$sthA->execute or die "executing: $stmtA ", $dbhA->errstr;
$sthArows=$sthA->rows;
@aryA = $sthA->fetchrow_array;
if ($DB) {print "|",$aryA[0],"|",$aryA[1],"|",$aryA[2],"|",$aryA[3],"|","\n";}
$sthA->finish();
##### END vicidial_security_event_log end of day process removing records older than 7 days #####
##### BEGIN usacan_phone_dialcode_fix funciton #####
if ($usacan_phone_dialcode_fix > 0)
{
+74 -12
View File
@@ -4,7 +4,7 @@
#
# This script checks if there are channels in reserved conferences
#
# Copyright (C) 2018 Matt Florell <vicidial@gmail.com> LICENSE: AGPLv2
# Copyright (C) 2020 Matt Florell <vicidial@gmail.com> LICENSE: AGPLv2
#
# 50810-1532 - Added database server variable definitions lookup
# 50823-1456 - Added commandline arguments for debug at runtime
@@ -20,10 +20,12 @@
# 150610-1200 - Added support for AMI version 1.3
# 170916-0947 - Added support for AMI version 2+
# 180420-2302 - Fix for high-volume systems, added varibles to hangup queryCID
# 200413-1356 - Fix for \n\n at the end of PING commands causing errors in AMI
#
# constants
$DB=0; # Debug flag, set to 0 for no debug messages per minute
$DBX=0;
$US='__';
$MT[0]='';
$no_vc_3way_check=0;
@@ -43,6 +45,7 @@ if (length($ARGV[0])>1)
print "allowed run time options:\n";
print " [-t] = test\n";
print " [-debug] = verbose debug messages\n";
print " [-debugX] = extra verbose debug messages\n";
print " [--no-vc-3way-check] = separate 3way script is running\n";
print "\n";
exit;
@@ -54,6 +57,12 @@ if (length($ARGV[0])>1)
$DB=1; # Debug flag
print "-- DEBUGGING ENABLED --\n\n";
}
if ($args =~ /-debugX/i)
{
$DB=1;
$DBX=1;
print "-- SUPER DEBUGGING ENABLED --\n\n";
}
if ($args =~ /-no-vc-3way-check/i)
{
$no_vc_3way_check=1; # no 3way check flag
@@ -158,8 +167,12 @@ if ($sthArows > 0)
if ($DBext_context) {$ext_context = $DBext_context;}
if ($vicidial_recording_limit < 60) {$vicidial_recording_limit=60;}
}
$sthA->finish();
$sthA->finish();
# determine if we should use a \n\n at the end of the AMI commands
$command_end = "\n\n";
%ast_ver_str = parse_asterisk_version($asterisk_version);
if (( $ast_ver_str{major} = 1 ) && ($ast_ver_str{minor} >= 13)) { $command_end = ''; };
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year = ($year + 1900);
@@ -256,7 +269,24 @@ if ($no_vc_3way_check < 1)
$max_buffer = 4*1024*1024; # 4 meg buffer
$t='';
$telnet_log_file = '';
### connect to asterisk manager through telnet
if ($DBX)
{
$telnet_log_file = "$PATHlogs/AST_conf_telnet_log.$now_date_epoch";
$t = new Net::Telnet (
Port => $telnet_port,
Prompt => '/\r\n/',
Output_record_separator => "\n\n",
Max_buffer_length => $max_buffer,
Telnetmode => 0,
Dump_log => $telnet_log_file
);
}
else
{
$t = new Net::Telnet (
Port => $telnet_port,
Prompt => '/\r\n/',
@@ -264,8 +294,7 @@ if ($no_vc_3way_check < 1)
Max_buffer_length => $max_buffer,
Telnetmode => 0,
);
$LItelnetlog = "$PATHlogs/listen_telnet_log.txt"; # uncomment for telnet log
#$fh = $t->dump_log("$LItelnetlog"); # uncomment for telnet log
}
if (length($ASTmgrUSERNAMEsend) > 3) {$telnet_login = $ASTmgrUSERNAMEsend;}
else {$telnet_login = $ASTmgrUSERNAME;}
$t->open("$telnet_host");
@@ -291,7 +320,7 @@ if ($no_vc_3way_check < 1)
if ($ami_version =~ /^1\./i)
{
$COMMAND = "Action: Command\nCommand: Meetme list $PT_conf_extens[$i]\n\nAction: Ping\n\n";
$COMMAND = "Action: Command\nCommand: Meetme list $PT_conf_extens[$i]\n\nAction: Ping$command_end";
if ($DB) {print "|$PTextensions[$i]|$PT_conf_extens[$i]|$COMMAND|\n";}
%ast_ver_str = parse_asterisk_version($asterisk_version);
if (( $ast_ver_str{major} = 1 ) && ($ast_ver_str{minor} < 6))
@@ -384,7 +413,7 @@ if ($no_vc_3way_check < 1)
}
$t->buffer_empty;
@hangup = $t->cmd(String => "Action: Logoff\n\n", Prompt => "/.*/");
@hangup = $t->cmd(String => "Action: Logoff$command_end", Prompt => "/.*/");
$t->buffer_empty;
$t->waitfor(Match => '/Message:.*\n\n/', Timeout => 10);
$ok = $t->close;
@@ -393,7 +422,14 @@ if ($no_vc_3way_check < 1)
sleep(5);
}
if($DBX)
{
open (FILE, '<', "$telnet_log_file") or die "could not open the log file\n";
print <FILE>;
close (FILE);
unlink($telnet_log_file) or die "Can't delete $telnet_log_file: $!\n";
}
@@ -422,16 +458,32 @@ if (!$telnet_port) {$telnet_port = '5038';}
$max_buffer = 4*1024*1024; # 4 meg buffer
$t='';
$telnet_log_file = '';
### connect to asterisk manager through telnet
$t = new Net::Telnet (
if ($DBX)
{
$telnet_log_file = "$PATHlogs/AST_conf_telnet_log.$now_date_epoch";
$t = new Net::Telnet (
Port => $telnet_port,
Prompt => '/\r\n/',
Output_record_separator => "\n\n",
Max_buffer_length => $max_buffer,
Telnetmode => 0,
);
$LItelnetlog = "$PATHlogs/listen_telnet_log.txt"; # uncomment for telnet log
#$fh = $t->dump_log("$LItelnetlog"); # uncomment for telnet log
Dump_log => $telnet_log_file
);
}
else
{
$t = new Net::Telnet (
Port => $telnet_port,
Prompt => '/\r\n/',
Output_record_separator => "\n\n",
Max_buffer_length => $max_buffer,
Telnetmode => 0,
);
}
if (length($ASTmgrUSERNAMEsend) > 3) {$telnet_login = $ASTmgrUSERNAMEsend;}
else {$telnet_login = $ASTmgrUSERNAME;}
$t->open("$telnet_host");
@@ -459,7 +511,7 @@ if ( !( ( @PTextensions == 1 ) && ( $PTextensions[0] eq '') ) )
if ($ami_version =~ /^1\./i)
{
$COMMAND = "Action: Command\nCommand: Meetme list $PT_conf_extens[$i]\n\nAction: Ping\n\n";
$COMMAND = "Action: Command\nCommand: Meetme list $PT_conf_extens[$i]\n\nAction: Ping$command_end";
if ($DB) {print "|$PT_conf_extens[$i]|$COMMAND|\n";}
%ast_ver_str = parse_asterisk_version($asterisk_version);
if (( $ast_ver_str{major} = 1 ) && ($ast_ver_str{minor} < 6))
@@ -542,13 +594,23 @@ if ( !( ( @PTextensions == 1 ) && ( $PTextensions[0] eq '') ) )
$t->buffer_empty;
@hangup = $t->cmd(String => "Action: Logoff\n\n", Prompt => "/.*/");
@hangup = $t->cmd(String => "Action: Logoff$command_end", Prompt => "/.*/");
$t->buffer_empty;
$t->waitfor(Match => '/Message:.*\n\n/', Timeout => 10);
$ok = $t->close;
$dbhA->disconnect();
if($DBX)
{
open (FILE, '<', "$telnet_log_file") or die "could not open the log file\n";
print <FILE>;
close (FILE);
unlink($telnet_log_file) or die "Can't delete $telnet_log_file: $!\n";
}
if($DB){print "DONE... Exiting... Goodbye... See you later... \n";}
exit;
+38 -6
View File
@@ -11,7 +11,7 @@
# script's crontab entry that does some of these functions:
# AST_conf_update.pl --no-vc-3way-check
#
# Copyright (C) 2018 Matt Florell <vicidial@gmail.com> LICENSE: AGPLv2
# Copyright (C) 2020 Matt Florell <vicidial@gmail.com> LICENSE: AGPLv2
#
# 100811-2119 - First build, based upon AST_conf_update.pl script
# 100928-1506 - Changed from hard-coded 60 minute limit to servers.vicidial_recording_limit
@@ -20,6 +20,7 @@
# 170222-0939 - Changed to file logging using server settings
# 170921-1814 - Added support for AMI2
# 180420-2301 - Fix for high-volume systems, added varibles to hangup queryCID
# 200413-1356 - Fix for \n\n at the end of PING commands causing errors in AMI
#
# constants
@@ -181,7 +182,12 @@ if ($sthArows > 0)
if ($DBvd_server_logs =~ /Y/) {$SYSLOG = '1';}
else {$SYSLOG = '0';}
}
$sthA->finish();
$sthA->finish();
# determine if we should use a \n\n at the end of the AMI commands
%ast_ver_str = parse_asterisk_version($asterisk_version);
$command_end = "\n\n";
if (( $ast_ver_str{major} = 1 ) && ($ast_ver_str{minor} >= 13)) { $command_end = '';}
if (!$telnet_port) {$telnet_port = '5038';}
if (length($ASTmgrUSERNAMEsend) > 3) {$telnet_login = $ASTmgrUSERNAMEsend;}
@@ -261,7 +267,24 @@ while ($loops > $loop_counter)
{
$max_buffer = 4*1024*1024; # 4 meg buffer
$t='';
$telnet_log_file = '';
### connect to asterisk manager through telnet
if ($DBX)
{
$telnet_log_file = "$PATHlogs/AST_conf_telnet_log.$now_date_epoch";
print "$telnet_log_file\n";
$t = new Net::Telnet (
Port => $telnet_port,
Prompt => '/\r\n/',
Output_record_separator => "\n\n",
Max_buffer_length => $max_buffer,
Telnetmode => 0,
Dump_log => $telnet_log_file
);
}
else
{
$t = new Net::Telnet (
Port => $telnet_port,
Prompt => '/\r\n/',
@@ -269,8 +292,8 @@ while ($loops > $loop_counter)
Max_buffer_length => $max_buffer,
Telnetmode => 0,
);
$LItelnetlog = "$PATHlogs/3way_telnet_log.txt"; # uncomment for telnet log
# $fh = $t->dump_log("$LItelnetlog"); # uncomment for telnet log
}
if (length($ASTmgrUSERNAMEsend) > 3) {$telnet_login = $ASTmgrUSERNAMEsend;}
else {$telnet_login = $ASTmgrUSERNAME;}
$t->open("$telnet_host");
@@ -294,7 +317,7 @@ while ($loops > $loop_counter)
if ($ami_version =~ /^1\./i)
{
$COMMAND = "Action: Command\nCommand: Meetme list $PT_conf_extens[$i]\n\nAction: Ping\n\n";
$COMMAND = "Action: Command\nCommand: Meetme list $PT_conf_extens[$i]\n\nAction: Ping$command_end";
$event_string = "|$PT_conf_extens[$i]|$COMMAND|";
&event_logger;
%ast_ver_str = parse_asterisk_version($asterisk_version);
@@ -396,10 +419,19 @@ while ($loops > $loop_counter)
}
$t->buffer_empty;
@hangup = $t->cmd(String => "Action: Logoff\n\n", Prompt => "/.*/");
@hangup = $t->cmd(String => "Action: Logoff$command_end", Prompt => "/.*/");
$t->buffer_empty;
$t->waitfor(Match => '/Message:.*\n\n/', Timeout => 10);
$ok = $t->close;
if($DBX)
{
open (FILE, '<', "$telnet_log_file") or die "could not open the log file\n";
print <FILE>;
close (FILE);
unlink($telnet_log_file) or die "Can't delete $telnet_log_file: $!\n";
}
}
### sleep for X delay seconds between runs
File diff suppressed because it is too large Load Diff
+52 -14
View File
@@ -5,11 +5,11 @@
# DESCRIPTION:
# populates "show peers" output for SIP and IAX as well as tail of last 1000 lines of Asterisk output into database
#
# Copyright (C) 2018 Matt Florell <vicidial@gmail.com> LICENSE: AGPLv2
# Copyright (C) 2020 Matt Florell <vicidial@gmail.com> LICENSE: AGPLv2
#
# 151229-1548 - first build
# 180403-1546 - Updated telnet login process to work with newer Asterisk versions
#
# 200413-2156 - Fix for \n\n at the end of PING commands causing errors in AMI
# constants
$DB=0; # Debug flag, set to 0 for no debug messages per minute
@@ -158,6 +158,11 @@ $sthA->finish();
$secX = time();
# determine if we should use a \n\n at the end of the AMI commands
$command_end = "\n\n";
%ast_ver_str = parse_asterisk_version($asterisk_version);
if (( $ast_ver_str{major} = 1 ) && ($ast_ver_str{minor} >= 13)) { $command_end = ''; };
$BDtarget = ($secX - 86400);
($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget);
$Byear = ($Byear + 1900);
@@ -174,10 +179,33 @@ $BDtsSQLdate = "$Byear$Bmon$Bmday$Bhour$Bmin$Bsec";
############# BEGIN GATHER SECTION ################################################
if($DB){print "\n\nSIP SHOW PEERS:\n";}
$max_buffer = 4*1024*1024; # 4 meg buffer
$t='';
$telnet_log_file = '';
### connect to asterisk manager through telnet
$t = new Net::Telnet (Port => 5038,
if ($DBX)
{
$telnet_log_file = "$PATHlogs/AST_output_telnet_log.$secX";
$t = new Net::Telnet (
Port => $telnet_port,
Prompt => '/\r\n/',
Output_record_separator => '',);
Output_record_separator => "\n\n",
Max_buffer_length => $max_buffer,
Dump_log => $telnet_log_file
);
}
else
{
$t = new Net::Telnet (
Port => $telnet_port,
Prompt => '/\r\n/',
Output_record_separator => "\n\n",
Max_buffer_length => $max_buffer,
);
}
##### uncomment both lines below for telnet log
# $LItelnetlog = "$PATHlogs/output_telnet_log.txt";
@@ -194,7 +222,7 @@ $ami_version =~ s/\n//gi;
if ($DB) {print "----- AMI Version $ami_version -----\n";}
# Login
$t->print("Action: Login\nUsername: $telnet_login\nSecret: $ASTmgrSECRET\n\n");
$t->print("Action: Login\nUsername: $telnet_login\nSecret: $ASTmgrSECRET$command_end");
$t->waitfor('/Authentication accepted/'); # waitfor auth accepted
$t->buffer_empty;
@@ -206,11 +234,11 @@ $t->buffer_empty;
%ast_ver_str = parse_asterisk_version($asterisk_version);
if (( $ast_ver_str{major} = 1 ) && ($ast_ver_str{minor} < 6))
{
@list_channels = $t->cmd(String => "Action: Command\nCommand: sip show peers\n\nAction: Ping\n\n", Prompt => '/Response: Pong.*/');
@list_channels = $t->cmd(String => "Action: Command\nCommand: sip show peers\n\nAction: Ping$command_end", Prompt => '/Response: Pong.*/');
}
else
{
@list_channels = $t->cmd(String => "Action: Command\nCommand: sip show peers\n\nAction: Ping\n\n", Prompt => '/Response: Success\nPing: Pong.*/');
@list_channels = $t->cmd(String => "Action: Command\nCommand: sip show peers\n\nAction: Ping$command_end", Prompt => '/Response: Success\nPing: Pong.*/');
}
$j=0;
@@ -226,11 +254,11 @@ $t->buffer_empty;
%ast_ver_str = parse_asterisk_version($asterisk_version);
if (( $ast_ver_str{major} = 1 ) && ($ast_ver_str{minor} < 6))
{
@list_channels = $t->cmd(String => "Action: Command\nCommand: sip show registry\n\nAction: Ping\n\n", Prompt => '/Response: Pong.*/');
@list_channels = $t->cmd(String => "Action: Command\nCommand: sip show registry\n\nAction: Ping$command_end", Prompt => '/Response: Pong.*/');
}
else
{
@list_channels = $t->cmd(String => "Action: Command\nCommand: sip show registry\n\nAction: Ping\n\n", Prompt => '/Response: Success\nPing: Pong.*/');
@list_channels = $t->cmd(String => "Action: Command\nCommand: sip show registry\n\nAction: Ping$command_end", Prompt => '/Response: Success\nPing: Pong.*/');
}
$j=0;
@@ -260,11 +288,11 @@ $t->buffer_empty;
%ast_ver_str = parse_asterisk_version($asterisk_version);
if (( $ast_ver_str{major} = 1 ) && ($ast_ver_str{minor} < 6))
{
@list_channels = $t->cmd(String => "Action: Command\nCommand: iax2 show peers\n\nAction: Ping\n\n", Prompt => '/Response: Pong.*/');
@list_channels = $t->cmd(String => "Action: Command\nCommand: iax2 show peers\n\nAction: Ping$command_end", Prompt => '/Response: Pong.*/');
}
else
{
@list_channels = $t->cmd(String => "Action: Command\nCommand: iax2 show peers\n\nAction: Ping\n\n", Prompt => '/Response: Success\nPing: Pong.*/');
@list_channels = $t->cmd(String => "Action: Command\nCommand: iax2 show peers\n\nAction: Ping$command_end", Prompt => '/Response: Success\nPing: Pong.*/');
}
$j=0;
@@ -280,11 +308,11 @@ $t->buffer_empty;
%ast_ver_str = parse_asterisk_version($asterisk_version);
if (( $ast_ver_str{major} = 1 ) && ($ast_ver_str{minor} < 6))
{
@list_channels = $t->cmd(String => "Action: Command\nCommand: iax2 show registry\n\nAction: Ping\n\n", Prompt => '/Response: Pong.*/');
@list_channels = $t->cmd(String => "Action: Command\nCommand: iax2 show registry\n\nAction: Ping$command_end", Prompt => '/Response: Pong.*/');
}
else
{
@list_channels = $t->cmd(String => "Action: Command\nCommand: iax2 show registry\n\nAction: Ping\n\n", Prompt => '/Response: Success\nPing: Pong.*/');
@list_channels = $t->cmd(String => "Action: Command\nCommand: iax2 show registry\n\nAction: Ping$command_end", Prompt => '/Response: Success\nPing: Pong.*/');
}
$j=0;
@@ -304,10 +332,20 @@ usleep(1*100*1000);
$t->buffer_empty;
@hangup = $t->cmd(String => "Action: Logoff\n\n", Prompt => "/.*/");
@hangup = $t->cmd(String => "Action: Logoff$command_end", Prompt => "/.*/");
$t->buffer_empty;
$t->waitfor(Match => '/Message:.*\n\n/', Timeout => 10);
$ok = $t->close;
if($DBX)
{
open (FILE, '<', "$telnet_log_file") or die "could not open the log file\n";
print <FILE>;
close (FILE);
unlink($telnet_log_file) or die "Can't delete $telnet_log_file: $!\n";
}
############# END GATHER SECTION ################################################
+77 -23
View File
@@ -5,7 +5,7 @@
# DESCRIPTION:
# checks the registered IP address of the phone and updates the phones table
#
# Copyright (C) 2018 Matt Florell <vicidial@gmail.com> LICENSE: AGPLv2
# Copyright (C) 2020 Matt Florell <vicidial@gmail.com> LICENSE: AGPLv2
#
# 70521-1529 - first build
# 100625-1220 - Added waitfors after logout to fix broken pipe errors in asterisk <MikeC>
@@ -13,7 +13,7 @@
# 131210-1305 - Added Asterisk 1.8 compatibility
# 150610-1200 - Added support for AMI version 1.3
# 180403-1545 - Updated telnet login process to work with newer Asterisk versions
#
# 200413-2156 - Fix for \n\n at the end of PING commands causing errors in AMI
# constants
$DB=0; # Debug flag, set to 0 for no debug messages per minute
@@ -157,6 +157,13 @@ $sthA->finish();
$secX = time();
# determine if we should use a \n\n at the end of the AMI commands
$command_end = "\n\n";
%ast_ver_str = parse_asterisk_version($asterisk_version);
if (( $ast_ver_str{major} = 1 ) && ($ast_ver_str{minor} >= 13)) { $command_end = ''; };
$max_buffer = 4*1024*1024; # 4 meg buffer
$BDtarget = ($secX - 86400);
($Bsec,$Bmin,$Bhour,$Bmday,$Bmon,$Byear,$Bwday,$Byday,$Bisdst) = localtime($BDtarget);
$Byear = ($Byear + 1900);
@@ -214,15 +221,29 @@ if ( ($sip_count > 0) || ($agent_lookup < 1) )
}
$sthA->finish();
$t='';
$telnet_log_file = '';
### connect to asterisk manager through telnet
$t = new Net::Telnet (Port => 5038,
if ($DBX)
{
$telnet_log_file = "$PATHlogs/AST_phone_telnet_log.$secX";
$t = new Net::Telnet (
Port => $telnet_port,
Prompt => '/\r\n/',
Output_record_separator => '',);
##### uncomment both lines below for telnet log
# $LItelnetlog = "$PATHlogs/phone_telnet_log.txt";
# $fh = $t->dump_log("$LItelnetlog");
Output_record_separator => "\n\n",
Max_buffer_length => $max_buffer,
Dump_log => $telnet_log_file
);
}
else
{
$t = new Net::Telnet (
Port => $telnet_port,
Prompt => '/\r\n/',
Output_record_separator => "\n\n",
Max_buffer_length => $max_buffer,
);
}
if (length($ASTmgrUSERNAMEsend) > 3) {$telnet_login = $ASTmgrUSERNAMEsend;}
else {$telnet_login = $ASTmgrUSERNAME;}
@@ -235,7 +256,7 @@ if ( ($sip_count > 0) || ($agent_lookup < 1) )
if ($DB) {print "----- AMI Version $ami_version -----\n";}
# Login
$t->print("Action: Login\nUsername: $telnet_login\nSecret: $ASTmgrSECRET\n\n");
$t->print("Action: Login\nUsername: $telnet_login\nSecret: $ASTmgrSECRET$command_end");
$t->waitfor('/Authentication accepted/'); # waitfor auth accepted
$t->buffer_empty;
@@ -249,11 +270,11 @@ if ( ($sip_count > 0) || ($agent_lookup < 1) )
%ast_ver_str = parse_asterisk_version($asterisk_version);
if (( $ast_ver_str{major} = 1 ) && ($ast_ver_str{minor} < 6))
{
@list_channels = $t->cmd(String => "Action: Command\nCommand: sip show peer $PTextensions[$i]\n\nAction: Ping\n\n", Prompt => '/Response: Pong.*/');
@list_channels = $t->cmd(String => "Action: Command\nCommand: sip show peer $PTextensions[$i]\n\nAction: Ping$command_end", Prompt => '/Response: Pong.*/');
}
else
{
@list_channels = $t->cmd(String => "Action: Command\nCommand: sip show peer $PTextensions[$i]\n\nAction: Ping\n\n", Prompt => '/Response: Success\nPing: Pong.*/');
@list_channels = $t->cmd(String => "Action: Command\nCommand: sip show peer $PTextensions[$i]\n\nAction: Ping$command_end", Prompt => '/Response: Success\nPing: Pong.*/');
}
$j=0;
@@ -299,10 +320,19 @@ if ( ($sip_count > 0) || ($agent_lookup < 1) )
}
$t->buffer_empty;
@hangup = $t->cmd(String => "Action: Logoff\n\n", Prompt => "/.*/");
@hangup = $t->cmd(String => "Action: Logoff$command_end", Prompt => "/.*/");
$t->buffer_empty;
$t->waitfor(Match => '/Message:.*\n\n/', Timeout => 10);
$ok = $t->close;
if($DBX)
{
open (FILE, '<', "$telnet_log_file") or die "could not open the log file\n";
print <FILE>;
close (FILE);
unlink($telnet_log_file) or die "Can't delete $telnet_log_file: $!\n";
}
}
############# END SIP SECTION ################################################
@@ -355,14 +385,29 @@ if ( ($iax_count > 0) || ($agent_lookup < 1) )
$sthA->finish();
$t='';
$telnet_log_file = '';
### connect to asterisk manager through telnet
$t = new Net::Telnet (Port => 5038,
if ($DBX)
{
$telnet_log_file = "$PATHlogs/AST_phone_telnet_log.$secX";
$t = new Net::Telnet (
Port => $telnet_port,
Prompt => '/\r\n/',
Output_record_separator => '',);
##### uncomment both lines below for telnet log
# $LItelnetlog = "$PATHlogs/phone_telnet_log.txt";
# $fh = $t->dump_log("$LItelnetlog");
Output_record_separator => "\n\n",
Max_buffer_length => $max_buffer,
Dump_log => $telnet_log_file
);
}
else
{
$t = new Net::Telnet (
Port => $telnet_port,
Prompt => '/\r\n/',
Output_record_separator => "\n\n",
Max_buffer_length => $max_buffer,
);
}
if (length($ASTmgrUSERNAMEsend) > 3) {$telnet_login = $ASTmgrUSERNAMEsend;}
else {$telnet_login = $ASTmgrUSERNAME;}
@@ -375,7 +420,7 @@ if ( ($iax_count > 0) || ($agent_lookup < 1) )
if ($DB) {print "----- AMI Version $ami_version -----\n";}
# Login
$t->print("Action: Login\nUsername: $telnet_login\nSecret: $ASTmgrSECRET\n\n");
$t->print("Action: Login\nUsername: $telnet_login\nSecret: $ASTmgrSECRET$command_end");
$t->waitfor('/Authentication accepted/'); # waitfor auth accepted
$t->buffer_empty;
@@ -388,11 +433,11 @@ if ( ($iax_count > 0) || ($agent_lookup < 1) )
%ast_ver_str = parse_asterisk_version($asterisk_version);
if (( $ast_ver_str{major} = 1 ) && ($ast_ver_str{minor} < 6))
{
@list_channels = $t->cmd(String => "Action: Command\nCommand: iax2 show peer $PTextensions[$i]\n\nAction: Ping\n\n", Prompt => '/Response: Pong.*/');
@list_channels = $t->cmd(String => "Action: Command\nCommand: iax2 show peer $PTextensions[$i]\n\nAction: Ping$command_end", Prompt => '/Response: Pong.*/');
}
else
{
@list_channels = $t->cmd(String => "Action: Command\nCommand: iax2 show peer $PTextensions[$i]\n\nAction: Ping\n\n", Prompt => '/Response: Success\nPing: Pong.*/');
@list_channels = $t->cmd(String => "Action: Command\nCommand: iax2 show peer $PTextensions[$i]\n\nAction: Ping$command_end", Prompt => '/Response: Success\nPing: Pong.*/');
}
$j=0;
@@ -438,10 +483,19 @@ if ( ($iax_count > 0) || ($agent_lookup < 1) )
}
$t->buffer_empty;
@hangup = $t->cmd(String => "Action: Logoff\n\n", Prompt => "/.*/");
@hangup = $t->cmd(String => "Action: Logoff$command_end", Prompt => "/.*/");
$t->buffer_empty;
$t->waitfor(Match => '/Message:.*\n\n/', Timeout => 10);
$ok = $t->close;
if($DBX)
{
open (FILE, '<', "$telnet_log_file") or die "could not open the log file\n";
print <FILE>;
close (FILE);
unlink($telnet_log_file) or die "Can't delete $telnet_log_file: $!\n";
}
}
############# END IAX2 SECTION ################################################
+42 -15
View File
@@ -14,7 +14,7 @@
#
# NOTE: THIS SHOULD ONLY BE RUN ON THE DESIGNATED VOICEMAIL SERVER IN A CLUSTER!
#
# Copyright (C) 2017 Matt Florell <vicidial@gmail.com> LICENSE: AGPLv2
# Copyright (C) 2020 Matt Florell <vicidial@gmail.com> LICENSE: AGPLv2
#
# 50823-1422 - Added database server variable definitions lookup
# 50823-1452 - Added commandline arguments for debug at runtime
@@ -26,6 +26,7 @@
# 141124-1019 - Changed to only allow running on designated voicemail server, run for all mailboxes
# 150610-1200 - Added support for AMI version 1.3
# 170609-0936 - Added support for Asterisk 13
# 200413-1356 - Fix for \n\n at the end of PING commands causing errors in AMI
#
# constants
@@ -204,18 +205,31 @@ $sthA->finish();
$max_buffer = 4*1024*1024; # 4 meg buffer
$t = '';
$telnet_log_file = '';
### connect to asterisk manager through telnet
$t = new Net::Telnet (
if ($DBX)
{
$telnet_log_file = "$PATHlogs/AST_vm_telnet_log.$secX";
$t = new Net::Telnet (
Port => $telnet_port,
Prompt => '/\r\n/',
Output_record_separator => "\n\n",
Max_buffer_length => $max_buffer,
Telnetmode => 0,
);
##### uncomment both lines below for telnet log
# $LItelnetlog = "$PATHlogs/listen_telnet_log.txt";
# $fh = $t->dump_log("$LItelnetlog");
Dump_log => $telnet_log_file
);
}
else
{
$t = new Net::Telnet (
Port => $telnet_port,
Prompt => '/\r\n/',
Output_record_separator => "\n\n",
Max_buffer_length => $max_buffer,
Telnetmode => 0,
);
}
if (length($ASTmgrUSERNAMEsend) > 3) {$telnet_login = $ASTmgrUSERNAMEsend;}
else {$telnet_login = $ASTmgrUSERNAME;}
@@ -233,16 +247,20 @@ $t->waitfor('/Authentication accepted/'); # waitfor auth accepted
$t->buffer_empty;
# determine if we should use a \n\n at the end of the AMI commands
%ast_ver_str = parse_asterisk_version($asterisk_version);
$command_end = "\n\n";
if (( $ast_ver_str{major} = 1 ) && ($ast_ver_str{minor} >= 13)) { $command_end = '';}
$i=0;
foreach(@PTvoicemail_ids)
{
@list_channels=@MT;
$t->buffer_empty;
%ast_ver_str = parse_asterisk_version($asterisk_version);
if (( $ast_ver_str{major} = 1 ) && ($ast_ver_str{minor} < 6))
{
@list_channels = $t->cmd(String => "Action: MailboxCount\nMailbox: $PTvoicemail_ids[$i]\n\nAction: Ping\n\n", Prompt => '/Response: Pong.*/');
@list_channels = $t->cmd(String => "Action: MailboxCount\nMailbox: $PTvoicemail_ids[$i]\n\nAction: Ping$command_end", Prompt => '/Response: Pong.*/');
$j=0;
foreach(@list_channels)
@@ -259,7 +277,7 @@ foreach(@PTvoicemail_ids)
}
elsif (( $ast_ver_str{major} = 1 ) && ($ast_ver_str{minor} < 13))
{
@list_channels = $t->cmd(String => "Action: MailboxCount\nMailbox: $PTvoicemail_ids[$i]\n\nAction: Ping\n\n", Prompt => '/Response: Success\nPing: Pong.*/');
@list_channels = $t->cmd(String => "Action: MailboxCount\nMailbox: $PTvoicemail_ids[$i]\n\nAction: Ping$command_end", Prompt => '/Response: Success\nPing: Pong.*/');
$j=0;
foreach(@list_channels)
@@ -291,7 +309,7 @@ foreach(@PTvoicemail_ids)
# create a new action id
$action_id = "$now_sec.$now_micro_sec";
@list_channels = $t->cmd(String => "Action: MailboxCount\nActionID: $action_id\nMailbox: $PTvoicemail_ids[$i]\n\nAction: Ping\n\n", Prompt => '/Response: Success\nPing: Pong.*/');
@list_channels = $t->cmd(String => "Action: MailboxCount\nActionID: $action_id\nMailbox: $PTvoicemail_ids[$i]\n\nAction: Ping$command_end", Prompt => '/Response: Success\nPing: Pong.*/');
$j=0;
foreach(@list_channels)
@@ -397,7 +415,7 @@ if ($active_voicemail_server > 0)
%ast_ver_str = parse_asterisk_version($asterisk_version);
if (( $ast_ver_str{major} = 1 ) && ($ast_ver_str{minor} < 6))
{
@list_channels = $t->cmd(String => "Action: MailboxCount\nMailbox: $PTvoicemail_ids[$i]\n\nAction: Ping\n\n", Prompt => '/Response: Pong.*/');
@list_channels = $t->cmd(String => "Action: MailboxCount\nMailbox: $PTvoicemail_ids[$i]\n\nAction: Ping$command_end", Prompt => '/Response: Pong.*/');
$j=0;
foreach(@list_channels)
@@ -414,7 +432,7 @@ if ($active_voicemail_server > 0)
}
elsif (( $ast_ver_str{major} = 1 ) && ($ast_ver_str{minor} < 13))
{
@list_channels = $t->cmd(String => "Action: MailboxCount\nMailbox: $PTvoicemail_ids[$i]\n\nAction: Ping\n\n", Prompt => '/Response: Success\nPing: Pong.*/');
@list_channels = $t->cmd(String => "Action: MailboxCount\nMailbox: $PTvoicemail_ids[$i]\n\nAction: Ping$command_end", Prompt => '/Response: Success\nPing: Pong.*/');
$j=0;
foreach(@list_channels)
@@ -446,7 +464,7 @@ if ($active_voicemail_server > 0)
# create a new action id
$action_id = "$now_sec.$now_micro_sec";
@list_channels = $t->cmd(String => "Action: MailboxCount\nActionID: $action_id\nMailbox: $PTvoicemail_ids[$i]\n\nAction: Ping\n\n", Prompt => '/Response: Success\nPing: Pong.*/');
@list_channels = $t->cmd(String => "Action: MailboxCount\nActionID: $action_id\nMailbox: $PTvoicemail_ids[$i]\n\nAction: Ping$command_end", Prompt => '/Response: Success\nPing: Pong.*/');
$j=0;
foreach(@list_channels)
@@ -491,7 +509,7 @@ if ($active_voicemail_server > 0)
$t->buffer_empty;
@hangup = $t->cmd(String => "Action: Logoff\n\n", Prompt => "/.*/");
@hangup = $t->cmd(String => "Action: Logoff$command_end", Prompt => "/.*/");
$t->buffer_empty;
$t->waitfor(Match => '/Message:.*\n\n/', Timeout => 10);
$ok = $t->close;
@@ -500,6 +518,15 @@ $ok = $t->close;
$dbhA->disconnect();
if($DBX)
{
open (FILE, '<', "$telnet_log_file") or die "could not open the log file\n";
print <FILE>;
close (FILE);
unlink($telnet_log_file) or die "Can't delete $telnet_log_file: $!\n";
}
if($DB)
{
$secY = time();
@@ -4272,6 +4272,31 @@ index (call_date),
index (lead_id)
) ENGINE=MyISAM;
CREATE TABLE vicidial_security_event_log (
event_id int(9) UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL,
server_ip varchar(15),
event VARCHAR(25) NOT NULL,
event_time DATETIME(3) NOT NULL,
severity ENUM('Informational','Error') NOT NULL,
service VARCHAR(25) NOT NULL,
event_version VARCHAR(25) NOT NULL,
account_id VARCHAR(25) NOT NULL,
session_id VARCHAR(25) NOT NULL,
local_address VARCHAR(15) NOT NULL,
local_port SMALLINT NOT NULL,
remote_address VARCHAR(15) NOT NULL,
remote_port SMALLINT NOT NULL,
module VARCHAR(25),
session_time DATETIME(3),
optional_one VARCHAR(100),
optional_two VARCHAR(100),
optional_three VARCHAR(100),
index (server_ip),
index (event),
index (event_time),
index (remote_address)
) ENGINE=MyISAM;
ALTER TABLE vicidial_email_list MODIFY message text character set utf8;
@@ -4600,4 +4625,4 @@ INSERT INTO vicidial_settings_containers(container_id,container_notes,container_
UPDATE system_settings set vdc_agent_api_active='1';
UPDATE system_settings SET db_schema_version='1592',db_schema_update_date=NOW(),reload_timestamp=NOW();
UPDATE system_settings SET db_schema_version='1593',db_schema_update_date=NOW(),reload_timestamp=NOW();
+27
View File
@@ -1199,3 +1199,30 @@ ALTER TABLE vicidial_inbound_groups ADD browser_alert_sound VARCHAR(20) default
ALTER TABLE vicidial_inbound_groups ADD browser_alert_volume TINYINT(3) UNSIGNED default '50';
UPDATE system_settings SET db_schema_version='1592',db_schema_update_date=NOW() where db_schema_version < 1592;
CREATE TABLE vicidial_security_event_log (
event_id int(9) UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL,
server_ip varchar(15),
event VARCHAR(25) NOT NULL,
event_time DATETIME(3) NOT NULL,
severity ENUM('Informational','Error') NOT NULL,
service VARCHAR(25) NOT NULL,
event_version VARCHAR(25) NOT NULL,
account_id VARCHAR(25) NOT NULL,
session_id VARCHAR(25) NOT NULL,
local_address VARCHAR(15) NOT NULL,
local_port SMALLINT NOT NULL,
remote_address VARCHAR(15) NOT NULL,
remote_port SMALLINT NOT NULL,
module VARCHAR(25),
session_time DATETIME(3),
optional_one VARCHAR(100),
optional_two VARCHAR(100),
optional_three VARCHAR(100),
index (server_ip),
index (event),
index (event_time),
index (remote_address)
) ENGINE=MyISAM;
UPDATE system_settings SET db_schema_version='1593',db_schema_update_date=NOW() where db_schema_version < 1593;
+1 -1
View File
@@ -567,7 +567,7 @@ if ($stage == "log_agent_out")
$kick_local_channel = "$local_DEF$VLA_conf_exten$local_AMP$ext_context";
$queryCID = "ULGH3457$StarTtimE";
$stmtC="INSERT INTO vicidial_manager values('','','$NOW_TIME','NEW','N','$VLA_server_ip','','Originate','$queryCID','Channel: $kick_local_channel','Context: $ext_context','Exten: 8300','Priority: 1','Callerid: $queryCID','','','','$channel','$exten');";
$stmtC="INSERT INTO vicidial_manager values('','','$NOW_TIME','NEW','N','$VLA_server_ip','','Originate','$queryCID','Channel: $kick_local_channel','Context: $ext_context','Exten: 8300','Priority: 1','Callerid: $queryCID','','','','','');";
if ($DB) {echo "<BR>$stmtC\n";}
$rslt=mysql_to_mysqli($stmtC, $link);