diff options
author | Renato Botelho <renato@netgate.com> | 2016-08-16 15:02:55 -0300 |
---|---|---|
committer | Renato Botelho <renato@netgate.com> | 2016-08-16 15:03:26 -0300 |
commit | ffd2056a2f4b9f2c6a2daaea465eb28e90869dce (patch) | |
tree | ef9cb3081a29d0456e3d879ccc8e35f2a38ecb31 /src/etc/rc.filter_synchronize | |
parent | 3c98260548ce5e0432a49c6a65263b45e1b413f9 (diff) | |
download | pfsense-ffd2056a2f4b9f2c6a2daaea465eb28e90869dce.zip pfsense-ffd2056a2f4b9f2c6a2daaea465eb28e90869dce.tar.gz |
Ticket: #3734: Convert rc.filter_synchronize to use pear-XML_RPC2
Diffstat (limited to 'src/etc/rc.filter_synchronize')
-rwxr-xr-x | src/etc/rc.filter_synchronize | 200 |
1 files changed, 116 insertions, 84 deletions
diff --git a/src/etc/rc.filter_synchronize b/src/etc/rc.filter_synchronize index 9b69fe8..ff846e3 100755 --- a/src/etc/rc.filter_synchronize +++ b/src/etc/rc.filter_synchronize @@ -31,7 +31,7 @@ require_once("config.inc"); require_once("functions.inc"); require_once("filter.inc"); require_once("shaper.inc"); -require_once("xmlrpc.inc"); +require_once("XML/RPC2/Client.php"); require_once("interfaces.inc"); /* @@ -85,65 +85,75 @@ function remove_special_characters($string) { return $string; } -function carp_check_version($url, $username, $password, $port = 80, $method = 'pfsense.host_firmware_version') { +function carp_check_version($url, $username, $password, $method = 'host_firmware_version') { global $config, $g; if (file_exists("{$g['varrun_path']}/booting") || platform_booting()) { return; } - $params = array( - XML_RPC_encode($password) + $options = array( + 'prefix' => 'pfsense.', + 'sslverify' => false, + 'connectionTimeout' => 240 ); $numberofruns = 0; while ($numberofruns < 2) { - $msg = new XML_RPC_Message($method, $params); - $cli = new XML_RPC_Client('/xmlrpc.php', $url, $port); - $cli->setCredentials($username, $password); if ($numberofruns > 0) { - $cli->setDebug(1); - } - /* send our XMLRPC message and timeout after 240 seconds */ - $resp = $cli->send($msg, "240"); - if (!is_object($resp)) { - $error = "A communications error occurred while attempting XMLRPC sync with username {$username} {$url}:{$port}."; - } elseif ($resp->faultCode()) { - $error = "An error code was received while attempting XMLRPC sync with username {$username} {$url}:{$port} - Code " . $resp->faultCode() . ": " . $resp->faultString(); - } else { - $parsed_response = XML_RPC_decode($resp->value()); - if (!is_array($parsed_response)) { - if (trim($parsed_response) == "Authentication failed") { - $error = "An authentication failure occurred while trying to access {$url}:{$port} ({$method})."; - log_error($error); - file_notice("sync_settings", $error, "Settings Sync", ""); - return false; - } - } else { - if (!isset($parsed_response['config_version']) || - ($parsed_response['config_version'] < $config['version']) || - ($parsed_response['config_version'] > $config['version'])) { - update_filter_reload_status("The other member is on a different configuration version of {$g['product_name']}. Sync will not be done to prevent problems!"); - log_error("The other member is on a different configuration version of {$g['product_name']}. Sync will not be done to prevent problems!"); - return false; - } else { - return true; - } - } + $options['debug'] = true; } - log_error($error); - file_notice("sync_settings", $error, "Settings Sync", ""); + $numberofruns++; - } + $cli = XML_RPC2_Client::create($url, $options); + if (!is_object($cli)) { + $error = "A communications error occurred while attempting XMLRPC sync with username {$username} {$url}."; + log_error($error); + file_notice("sync_settings", $error, "Settings Sync", ""); + continue; + } + + try { + $resp = $cli->$method($password); + } catch (XML_RPC2_FaultException $e) { + // The XMLRPC server returns a XMLRPC error + $error = 'Exception calling XMLRPC method ' . $method . ' #' . $e->getFaultCode() . ' : ' . $e->getFaultString(); + log_error($error); + file_notice("sync_settings", $error, "Settings Sync", ""); + continue; + } catch (Exception $e) { + // Other errors (HTTP or networking problems...) + $error = 'Exception calling XMLRPC method ' . $method . ' #' . $e->getMessage(); + log_error($error); + file_notice("sync_settings", $error, "Settings Sync", ""); + continue; + } + + if (!is_array($resp)) { + if (trim($resp) == "Authentication failed") { + $error = "An authentication failure occurred while trying to access {$url} ({$method})."; + log_error($error); + file_notice("sync_settings", $error, "Settings Sync", ""); + return false; + } + } elseif (!isset($resp['config_version']) || + ($resp['config_version'] != $config['version'])) { + update_filter_reload_status("The other member is on a different configuration version of {$g['product_name']}. Sync will not be done to prevent problems!"); + log_error("The other member is on a different configuration version of {$g['product_name']}. Sync will not be done to prevent problems!"); + return false; + } else { + return true; + } + } return false; } -function carp_sync_xml($url, $username, $password, $sections, $port = 80, $method = 'pfsense.restore_config_section') { +function carp_sync_xml($url, $username, $password, $sections, $method = 'restore_config_section') { global $config, $g; if (file_exists("{$g['varrun_path']}/booting") || platform_booting()) { - return; + return true; } update_filter_reload_status("Syncing CARP data to {$url}"); @@ -241,45 +251,58 @@ function carp_sync_xml($url, $username, $password, $sections, $port = 80, $metho } } - $params = array( - XML_RPC_encode($password), - XML_RPC_encode($xml) + $options = array( + 'prefix' => 'pfsense.', + 'sslverify' => false, + 'connectionTimeout' => 240 ); $numberofruns = 0; while ($numberofruns < 2) { - log_error("Beginning XMLRPC sync to {$url}:{$port}."); - $msg = new XML_RPC_Message($method, $params); - $cli = new XML_RPC_Client('/xmlrpc.php', $url, $port); - $cli->setCredentials($username, $password); if ($numberofruns > 0) { - $cli->setDebug(1); + $options['debug'] = true; } - /* send our XMLRPC message and timeout after 240 seconds */ - $resp = $cli->send($msg, "240"); - if (!is_object($resp)) { - $error = "A communications error occurred while attempting XMLRPC sync with username {$username} {$url}:{$port}."; + + $numberofruns++; + + log_error("Beginning XMLRPC sync to {$url}."); + $cli = XML_RPC2_Client::create($url, $options); + if (!is_object($cli)) { + $error = "A communications error occurred while attempting XMLRPC sync with username {$username} {$url}."; + log_error($error); + file_notice("sync_settings", $error, "Settings Sync", ""); + continue; + } + + try { + $resp = $cli->$method($password, $xml); + } catch (XML_RPC2_FaultException $e) { + // The XMLRPC server returns a XMLRPC error + $error = 'Exception calling XMLRPC method ' . $method . '#' . $e->getFaultCode() . ' : ' . $e->getFaultString(); + log_error($error); + file_notice("sync_settings", $error, "Settings Sync", ""); + continue; + } catch (Exception $e) { + // Other errors (HTTP or networking problems...) + $error = 'Exception calling XMLRPC method ' . $method . ' #' . $e->getMessage(); log_error($error); file_notice("sync_settings", $error, "Settings Sync", ""); - } elseif ($resp->faultCode()) { - $error = "An error code was received while attempting XMLRPC sync with username {$username} {$url}:{$port} - Code " . $resp->faultCode() . ": " . $resp->faultString(); + continue; + } + + if (!is_array($resp) && trim($resp) == "Authentication failed") { + $error = "An authentication failure occurred while trying to access {$url} ($method)."; log_error($error); file_notice("sync_settings", $error, "Settings Sync", ""); + return false; } else { - $parsed_response = XML_RPC_decode($resp->value()); - if (!is_array($parsed_response) && trim($parsed_response) == "Authentication failed") { - $error = "An authentication failure occurred while trying to access {$url}:{$port} ($method)."; - log_error($error); - file_notice("sync_settings", $error, "Settings Sync", ""); - return -1; - } else { - log_error("XMLRPC sync successfully completed with {$url}:{$port}."); - update_filter_reload_status("XMLRPC sync successfully completed with {$url}:{$port}."); - } - $numberofruns = 3; + log_error("XMLRPC sync successfully completed with {$url}."); + update_filter_reload_status("XMLRPC sync successfully completed with {$url}."); + return true; } - $numberofruns++; } + + return false; } if (platform_booting()) { @@ -317,7 +340,7 @@ if (is_array($config['hasync'])) { if (is_ipaddrv6($hasync['synchronizetoip'])) { $hasync['synchronizetoip'] = "[{$hasync['synchronizetoip']}]"; } - $synchronizetoip .= $hasync['synchronizetoip']; + $synchronizetoip .= $hasync['synchronizetoip'] . ":{$port}/xmlrpc.php"; if ($hasync['synchronizerules'] != "") { if (!is_array($config['filter'])) { $config['filter'] = array(); @@ -443,34 +466,43 @@ if (is_array($config['hasync'])) { $username = $hasync['username']; } - if (!carp_check_version($synchronizetoip, $username, $hasync['password'], $port)) { + if (!carp_check_version($synchronizetoip, $username, $hasync['password'])) { return; } update_filter_reload_status("Signaling CARP reload signal..."); - if (carp_sync_xml($synchronizetoip, $username, $hasync['password'], $sections, $port) == -1) { + if (!carp_sync_xml($synchronizetoip, $username, $hasync['password'], $sections)) { return; } - $cli = new XML_RPC_Client('/xmlrpc.php', $synchronizetoip, $port); - $params = array( - XML_RPC_encode($hasync['password']) - ); - $msg = new XML_RPC_Message('pfsense.filter_configure', $params); - $cli->setCredentials($username, $hasync['password']); - $resp = $cli->send($msg, "900"); + $options = array( + 'prefix' => 'pfsense.', + 'sslverify' => false, + 'connectionTimeout' => 900 + ); - if (!is_object($resp)) { - $error = "A communications error occurred while attempting Filter sync with username {$username} {$synchronizetoip}:{$port}."; - log_error($error); - file_notice("sync_settings", $error, "Settings Sync", ""); - } elseif ($resp->faultCode()) { - $error = "An error code was received while attempting Filter sync with username {$username} {$synchronizetoip}:{$port} - Code " . $resp->faultCode() . ": " . $resp->faultString(); + $cli = XML_RPC2_Client::create($synchronizetoip, $options); + if (!is_object($cli)) { + $error = "A communications error occurred while attempting Filter sync with username {$username} {$synchronizetoip}."; log_error($error); file_notice("sync_settings", $error, "Settings Sync", ""); } else { - log_error("Filter sync successfully completed with {$synchronizetoip}:{$port}."); - $numberofruns = 3; + try { + $resp = $cli->filter_configure($hasync['password']); + } catch (XML_RPC2_FaultException $e) { + // The XMLRPC server returns a XMLRPC error + $error = 'Exception calling XMLRPC method filter_configure #' . $e->getFaultCode() . ' : ' . $e->getFaultString(); + log_error($error); + file_notice("sync_settings", $error, "Settings Sync", ""); + return; + } catch (Exception $e) { + // Other errors (HTTP or networking problems...) + $error = 'Exception calling XMLRPC method filter_configure #' . $e->getMessage(); + log_error($error); + file_notice("sync_settings", $error, "Settings Sync", ""); + return; + } + log_error("Filter sync successfully completed with {$synchronizetoip}."); } } |