|
/*
|
|
* softdiscomon
|
|
*
|
|
* Soft Disconnect Monitor
|
|
* Written by Ansen Labardee and Kris Linnel
|
|
*
|
|
* This script uses curl to monitor gateways based on the html they recive back from specified sites
|
|
* If a specified string is found the html response a specified number of times, we mark the gateway up
|
|
* If the string is not found in the page source we mark the gateway as down.
|
|
*
|
|
* This script is intened to be run by crontab and should be stored at /etc/phpshellsessions/softdiscomon
|
|
* This script can be invoked by the root user with the command "pfSsh.php playback softdiscomon
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
require_once("config.inc");
|
|
require_once("functions.inc");
|
|
|
|
global $g, $config, $test, $threshhold;
|
|
|
|
|
|
// Set the URLs, match string and match threshold here.
|
|
// Threshold is the number of times a match must be found in the html from the configured URL
|
|
|
|
$threshhold = 3;
|
|
$test = array();
|
|
|
|
$test[1]['url'] = "https://google.com/";
|
|
$test[2]['url'] = "https://www.freebsd.org/";
|
|
$test[3]['url'] = "https://www.linux.org/";
|
|
|
|
$test[1]['match'] = 'google.com';
|
|
$test[2]['match'] = 'freebsd.org';
|
|
$test[3]['match'] = 'linux.org';
|
|
|
|
|
|
// Get the friendly interface name of both gateways, if a gateway doesn't exist a NULL value will be returned
|
|
|
|
$gw0_friendly = $config['gateways']['gateway_item']['0']['interface'];
|
|
//mai("GW0 Friendly Interface Name: $gw0_friendly \n");
|
|
$gw1_friendly = $config['gateways']['gateway_item']['1']['interface'];
|
|
//echo("GW1 Friendly Interface Name: $gw1_friendly \n");
|
|
|
|
// If the friendly interface name exists then use it to get the real interface name
|
|
// Also get the current status of the gateway
|
|
|
|
if ($gw0_friendly) {
|
|
$gw0_interface = $config['interfaces'][$gw0_friendly]['if'];
|
|
$gw0_name = $config['gateways']['gateway_item']['0']['name'];
|
|
// echo("GW0 Real Interface: $gw0_interface \n");
|
|
// echo("GW0 Name: $gw0_name \n");
|
|
$gw0_status = get_dpinger_status($gw0_name)['status'];
|
|
// echo("GW0 Status: $gw0_status \n");
|
|
}
|
|
|
|
if ($gw1_friendly) {
|
|
$gw1_interface = $config['interfaces'][$gw1_friendly]['if'];
|
|
$gw1_name = $config['gateways']['gateway_item']['1']['name'];
|
|
// echo("GW1 Real Interface: $gw1_interface \n");
|
|
// echo("GW1 Name: $gw1_name \n");
|
|
$gw1_status = get_dpinger_status($gw1_name)['status'];
|
|
// echo("GW1 Status: $gw1_status \n");
|
|
}
|
|
|
|
// If the Gateway has a real interface and the status is not down, then begin testing
|
|
// using the test array and threshholds configured above.
|
|
// We will test Gateway 0 with URLS 1&2 and Gateway 1 with URLS 2&3, if either urls return sucessfull then Mark
|
|
// the gateway up, if both urls fail then mark it as down.
|
|
|
|
if (($gw0_interface) && (!$gw0_status == 'down')) {
|
|
// echo("Starting tests on first gateway \n");
|
|
$pass_gw0 = 0;
|
|
|
|
$pass_gw0 = pass_gw0 + test_url(1, $gw0_interface);
|
|
$pass_gw0 = pass_gw0 + test_url(2, $gw0_interface);
|
|
|
|
if ($pass_gw0 > 0) {
|
|
mark_gw_online(0);
|
|
}
|
|
else {
|
|
mark_gw_offline(0);
|
|
}
|
|
}
|
|
|
|
if (($gw1_interface) && (!$gw1_status == 'down')) {
|
|
// echo("Starting tests on second gateway \n");
|
|
$pass_gw1 = 0;
|
|
|
|
$pass_gw1 = pass_gw1 + test_url(2, $gw1_interface);
|
|
$pass_gw1 = pass_gw1 + test_url(3, $gw1_interface);
|
|
|
|
if ($pass_gw1 > 0) {
|
|
mark_gw_online(1);
|
|
}
|
|
else {
|
|
mark_gw_offline(1);
|
|
}
|
|
}
|
|
|
|
exit(0);
|
|
|
|
|
|
function mark_gw_online($gw_number) {
|
|
global $g, $config, $test, $threshhold;
|
|
if (!isset($config['gateways']['gateway_item'][$gw_number]['force_down'])) {
|
|
// echo("Gateway Already Enabled! \n");
|
|
return 0;
|
|
}
|
|
else {
|
|
unset($config['gateways']['gateway_item'][$gw_number]['force_down']);
|
|
write_config();
|
|
$name = $config['gateways']['gateway_item'][$gw_number]['name'];
|
|
exec("/usr/local/bin/mail.php Gateway, $name is back online.");
|
|
// echo("Gateway Has Been Enabled! \n");
|
|
}
|
|
|
|
}
|
|
|
|
function mark_gw_offline($gw_number) {
|
|
global $g, $config, $test, $threshhold;
|
|
if (isset($config['gateways']['gateway_item'][$gw_number]['force_down'])) {
|
|
// echo("Gateway Already Disabled! \n");
|
|
return 0;
|
|
}
|
|
else {
|
|
$config['gateways']['gateway_item'][$gw_number]['force_down'] = "";
|
|
write_config();
|
|
$name = $config['gateways']['gateway_item'][$gw_number]['name'];
|
|
exec("/usr/local/bin/mail.php Disabled gateway $name! It seems that our tests have failed.");
|
|
// echo("Gateway Has Been Disabled! \n");
|
|
}
|
|
|
|
}
|
|
|
|
function test_url($test_number, $interface) {
|
|
global $g, $config, $test, $threshhold;
|
|
$url = $test[$test_number]['url'];
|
|
$curl = curl_init($url);
|
|
curl_setopt($curl, CURLOPT_INTERFACE, $interface);
|
|
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
|
|
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT ,5);
|
|
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
|
|
$page_source = curl_exec($curl);
|
|
curl_close($curl);
|
|
|
|
$match = $test[$test_number]['match'];
|
|
$count = preg_match_all($match, $page_source);
|
|
if ($count >= $threshold) {
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|