#!/usr/local/bin/php XML_RPC_Value. * xmlrpc_params_to_php currently does *not* handle structs. */ require_once("xmlrpc_server.inc"); require_once("xmlparse_pkg.inc"); require_once("config.inc"); require_once("functions.inc"); // Helper functions. /* * xmlrpc_auth: Handle basic crypt() authentication of the XMLRPC request. This function assumes that * $params[0] contains the local system's plaintext password and removes the password from * the array before returning it. */ function xmlrpc_auth(&$params) { global $config; if (crypt($params[0], $config['system']['password']) != $config['system']['password']) return false; // Password didn't match. array_shift($params); // Shift the password parameter off of the array. return true; // Password matched. } /* * xmlrpc_params_to_php: Convert params array passed from XMLRPC server into a PHP array and return it. * * XXX: This function does not currently handle XML_RPC_Value objects of type "struct". */ function xmlrpc_params_to_php($params) { $array = array(); for($i = 0; $i < $params->getNumParams(); $i++) { $value = $params->getParam($i); if($value->kindOf() == "scalar") { $array[] = $value->scalarval(); } elseif($value->kindOf() == "array") { $array[] = xmlrpc_array_to_php($value); } } return $array; } /* * xmlrpc_array_to_php: Convert an XMLRPC array into a PHP array and return it. */ function xmlrpc_array_to_php($array) { $return = array(); $array_length = $array->arraysize(); for($i = 0; $i < $array->arraysize(); $i++) { $value = $array->arraymem($i); if($value->kindOf() == "scalar") { $return[] = $value->scalarval(); } elseif($value->kindOf() == "array") { $return[] = xmlrpc_array_to_php($value); } } return $return; } // Exposed functions. $backup_config_section_doc = 'XMLRPC wrapper for backup_config_section. This method must be called with two parameters: a string containing the local system\'s password followed by a string containing the section to be backed up.'; $backup_config_section_sig = array(array(string, string, string)); function backup_config_section_xmlrpc($raw_params) { $params = xmlrpc_params_to_php($raw_params); // Convert XML_RPC_Value objects to a PHP array of values. if(!xmlrpc_auth($params)) return new XML_RPC_Response(new XML_RPC_Value("auth_failure", 'string')); $val = new XML_RPC_Value(backup_config_section($params[0]), 'string'); return new XML_RPC_Response($val); } $restore_config_section_doc = 'XMLRPC wrapper for restore_config_section. This method must be called with three parameters: a string containing the local system\'s password, a string containing the section to be restored, and a string containing the returned value of backup_config_section() for that section. This function returns true upon completion.'; $restore_config_section_sig = array(array(boolean, string, array(), array())); function restore_config_section_xmlrpc($raw_params) { $params = xmlrpc_params_to_php($raw_params); $i = 0; if(!xmlrpc_auth($params)) return new XML_RPC_Response(new XML_RPC_Value("auth_failure", 'string')); foreach($params[0] as $section) { restore_config_section($section, $params[1][$i]); $i++; } return new XML_RPC_Response(new XML_RPC_Value(true, 'boolean')); } $filter_configure_doc = 'Basic XMLRPC wrapper for filter_configure. This method must be called with one paramater: a string containing the local system\'s password. This function returns true upon completion.'; $filter_configure_sig = array(array(boolean, string)); function filter_configure_xmlrpc($raw_params) { $params = xmlrpc_params_to_php($raw_params); if(!xmlrpc_auth($params)) return new XML_RPC_Response(new XML_RPC_Value("auth_failure", 'string')); filter_configure(); return new XML_RPC_Response(new XML_RPC_Value(true, 'boolean')); } $check_firmware_version_doc = 'Basic XMLRPC wrapper for filter_configure. This function will return the output of check_firmware_version upon completion.'; $check_firmware_version_sig = array(array(string, string)); function check_firmware_version_xmlrpc($raw_params) { return new XML_RPC_Response(new XML_RPC_Value(check_firmware_version(false), 'string')); } $auto_update_doc = 'Basic XMLRPC wrapper for auto_update. This method must be called with one paramater: a string containing the local system\'s password. This function will return true upon completion.'; $auto_update_sig = array(array(boolean, string)); function auto_update_xmlrpc($raw_params) { $params = xmlrpc_params_to_php($raw_params); if(!xmlrpc_auth($params)) return new XML_RPC_Response(new XML_RPC_Value("auth_failure", 'string')); auto_update(); return new XML_RPC_Response(new XML_RPC_Value(true, 'boolean')); } $server = new XML_RPC_Server( array( 'pfsense.backup_config_section' => array('function' => 'backup_config_section_xmlrpc', 'signature' => $backup_config_section_sig, 'docstring' => $backup_config_section_doc), 'pfsense.restore_config_section' => array('function' => 'restore_config_section_xmlrpc', 'signature' => $restore_config_section_sig, 'docstring' => $restore_config_section_doc), 'pfsense.filter_configure' => array('function' => 'filter_configure_xmlrpc', 'signature' => $filter_configure_sig, 'docstring' => $filter_configure_doc), 'pfsense.check_firmware_version' => array('function' => 'check_firmware_version_xmlrpc', 'signature' => $check_firmware_version_sig, 'docstring' => $check_firmware_version_doc) // 'pfsense.auto_update' => array('function' => 'auto_update_xmlrpc', // 'signature' => $auto_update_sig, // 'docstring' => $auto_update_doc) ) ); ?>