Add ability to unblock addresses and use more descriptive variable names.

This commit is contained in:
FusionPBX 2022-08-17 00:06:52 -06:00 committed by GitHub
parent 326544a006
commit 9b06671810
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 96 additions and 41 deletions

View File

@ -61,6 +61,11 @@
$debug = true;
}
//get the hostname
if (!isset($hostname)) {
$hostname = gethostname();
}
//set the php operating system
$php_os = strtolower(PHP_OS);
@ -115,11 +120,64 @@
echo "Unable to connect to event socket\n";
}
//preset values
$interval_seconds = 30;
$previous_time = time() - $interval_seconds;
//loop through the switch events
$cmd = "event json ALL";
$result = $socket->request($cmd);
while (true) {
//check pending unblock requests
if ((time() - $previous_time) > $interval_seconds) {
//debug info
if ($debug) {
echo "time difference: ". (time() - $previous_time)."\n";
}
//check the database for pending requests
$sql = "select event_guard_log_uuid, log_date, filter, ip_address, extension, user_agent ";
$sql .= "from v_event_guard_logs ";
$sql .= "where log_status = 'pending' ";
$sql .= "and hostname = :hostname ";
if ($debug) { echo $sql." ".$hostname."\n"; }
$parameters['hostname'] = $hostname;
$database = new database;
$event_guard_logs = $database->select($sql, $parameters, 'all');
unset($database);
if (is_array($event_guard_logs)) {
foreach($event_guard_logs as $row) {
//unblock the ip address
unblock($row['ip_address'], $row['filter']);
//log the blocked ip address to the syslog
openlog("fusionpbx", LOG_PID | LOG_PERROR);
syslog(LOG_WARNING, "fusionpbx: unblocked: [ip_address: ".$row['ip_address'].", filter: ".$row['filter'].", to-user: ".$row['extension'].", to-host: ".$row['hostname'].", line: ".__line__."]");
closelog();
//log the blocked ip address to the database
$array['event_guard_logs'][0]['event_guard_log_uuid'] = $row['event_guard_log_uuid'];
$array['event_guard_logs'][0]['log_date'] = 'now()';
$array['event_guard_logs'][0]['log_status'] = 'unblocked';
}
if (is_array($array)) {
$p = new permissions;
$p->add('event_guard_log_edit', 'temp');
$database = new database;
$database->app_name = 'event guard';
$database->app_uuid = 'c5b86612-1514-40cb-8e2c-3f01a8f6f637';
$database->save($array);
//$message = $database->message;
$p->delete('event_guard_log_edit', 'temp');
unset($database, $array);
}
}
//update the time
$previous_time = time();
}
//reconnect to event socket
if (!$socket) {
echo "Not connected to even socket\n";
@ -133,68 +191,68 @@
}
//read the socket
$response = $socket->read_event();
$json_response = $socket->read_event();
//decode the response
if (isset($response) && $response != '') {
$array = json_decode($response['$'], true);
unset($response);
if (isset($json_response) && $json_response != '') {
$json_array = json_decode($json_response['$'], true);
unset($json_response);
}
//registration failed - block IP address unless they are registered,
if (is_array($array) && $array['Event-Subclass'] == 'sofia::register_failure') {
if (is_array($json_array) && $json_array['Event-Subclass'] == 'sofia::register_failure') {
//not registered so block the address
if (!access_allowed($array['network-ip'])) {
block($array['network-ip'], 'sip-auth-fail', $array);
if (!access_allowed($json_array['network-ip'])) {
block($json_array['network-ip'], 'sip-auth-fail', $json_array);
}
}
//registration to the IP address
if (is_array($array) && $array['Event-Subclass'] == 'sofia::pre_register') {
if (isset($array['to-host'])) {
$is_valid_ip = filter_var($array['to-host'], FILTER_VALIDATE_IP);
if (is_array($json_array) && $json_array['Event-Subclass'] == 'sofia::pre_register') {
if (isset($json_array['to-host'])) {
$is_valid_ip = filter_var($json_array['to-host'], FILTER_VALIDATE_IP);
if ($is_valid_ip) {
//if not registered block the address
if (!access_allowed($array['network-ip'])) {
block($array['network-ip'], 'sip-auth-ip', $array);
if (!access_allowed($json_array['network-ip'])) {
block($json_array['network-ip'], 'sip-auth-ip', $json_array);
}
//debug info
if ($debug) {
echo "network-ip ".$array['network-ip']."\n";
echo "to-host ".$array['to-host']."\n";
echo "network-ip ".$json_array['network-ip']."\n";
echo "to-host ".$json_array['to-host']."\n";
echo "\n";
}
}
}
}
//unset the array
if (is_array($array)) {
unset($array);
}
//debug information
if ($debug && ($array['Event-Subclass'] == 'sofia::register_failure' || $array['Event-Subclass'] == 'sofia::pre_register')) {
if ($debug && ($json_array['Event-Subclass'] == 'sofia::register_failure' || $json_array['Event-Subclass'] == 'sofia::pre_register')) {
echo "\n";
print_r($array);
print_r($json_array);
//echo "event_name: ".$array['Event-Name']."\n";
//echo "event_type: ".$array['event_type']."\n";
//echo "event_subclass: ".$array['Event-Subclass']."\n";
//echo "status: ".$array['status']."\n";
//echo "network_ip: ".$array['network-ip']."\n";
//echo "channel_state: ".$array['Channel-State']."\n";
//echo "channel_call_state: ".$array['Channel-Call-State']."\n";
//echo "call_direction: ".$array['Call-Direction']."\n";
//echo "channel_call_uuid: ".$array['Channel-Call-UUID']."\n";
//echo "answer_state: ".$array['Answer-State']."\n";
//echo "hangup_cause: ".$array['Hangup-Cause']."\n";
//echo "to-host: $array['to-host']\n";
//echo "event_name: ".$json_array['Event-Name']."\n";
//echo "event_type: ".$json_array['event_type']."\n";
//echo "event_subclass: ".$json_array['Event-Subclass']."\n";
//echo "status: ".$json_array['status']."\n";
//echo "network_ip: ".$json_array['network-ip']."\n";
//echo "channel_state: ".$json_array['Channel-State']."\n";
//echo "channel_call_state: ".$json_array['Channel-Call-State']."\n";
//echo "call_direction: ".$json_array['Call-Direction']."\n";
//echo "channel_call_uuid: ".$json_array['Channel-Call-UUID']."\n";
//echo "answer_state: ".$json_array['Answer-State']."\n";
//echo "hangup_cause: ".$json_array['Hangup-Cause']."\n";
//echo "to-host: $json_array['to-host']\n";
//echo "\n";
}
//unset the array
if (is_array($json_array)) {
unset($json_array);
}
//debug info
if ($debug && $debug_level == '2') {
//current memory
@ -275,7 +333,7 @@
}
//unblock the ip address
function unblock($ip_address, $chain) {
function unblock($ip_address, $filter) {
//set global variables
global $firewall;
@ -286,15 +344,12 @@
//unblock the address
if ($firewall == 'iptables') {
$command = 'iptables -L -n --line-numbers | grep '.$ip_address;
$result = shell($command);
$command = 'iptables -L '.$filter.' -n --line-numbers | grep "'.$ip_address.' " | cut -d " " -f1';
$line_number = trim(shell($command));
echo "\n". $command . " line ".__line__." result ".$result."\n";
if (strlen($result) > 3) {
$array = explode(' ', trim($result));
$line_number = trim($array[0]);
if (is_numeric($line_number)) {
//$result = shell('iptables -D INPUT '.$line_number);
$command = 'iptables -D '.$chain.' '.$line_number;
$command = 'iptables -D '.$filter.' '.$line_number;
$result = shell($command);
echo "Unblock address ".$ip_address ." line ".$line_number." command ".$command." result ".$result."\n";
}