summaryrefslogtreecommitdiffstats
path: root/src/etc/inc/zeromq.inc
diff options
context:
space:
mode:
Diffstat (limited to 'src/etc/inc/zeromq.inc')
-rw-r--r--src/etc/inc/zeromq.inc340
1 files changed, 340 insertions, 0 deletions
diff --git a/src/etc/inc/zeromq.inc b/src/etc/inc/zeromq.inc
new file mode 100644
index 0000000..6b513d3
--- /dev/null
+++ b/src/etc/inc/zeromq.inc
@@ -0,0 +1,340 @@
+<?php
+/*
+ zeromq.inc
+ part of the pfSense project (https://www.pfsense.org)
+ Copyright 2010 Scott Ullrich <sullrich@gmail.com>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+define('ZEROMQ_AUTH_FAIL', 'authfail');
+define('ZEROMQ_TRUE', 'true');
+define('ZEROMQ_FASLE', 'false');
+
+$do_not_include_config_gui_inc = true;
+require_once("auth.inc");
+
+//$debug = true;
+
+/* zeromq_send: Send a message to a member node */
+function zeromq_send($protocol = "tcp", $ipaddress = "127.0.0.1", $port = "8888",
+ $method, $params, $username, $password) {
+
+ global $debug;
+
+ /* Set calling function and auth information */
+ $xmlparams = array(
+ $username,
+ $password,
+ $method,
+ $params
+ );
+
+ /* Create new queue object */
+ $queue = new ZMQSocket(new ZMQContext(), ZMQ::SOCKET_REQ, "MySock1");
+ $queue->connect("{$protocol}://{$ipaddress}:{$port}");
+
+ /* Assign socket 1 to the queue, send and receive */
+ $result = $queue->send(serialize($xmlparams))->recv();
+
+ /* xmlrpc_params_to_php() the result and return */
+ $unserializedresult = unserialize($result);
+
+ /* Return the result to the caller */
+ return $unserializedresult;
+}
+
+function zeromq_server($protocol = "tcp", $ipaddress = "127.0.0.1", $port = "8888") {
+ global $debug;
+ if (!$ipaddress || !$port) {
+ if ($debug) {
+ echo "ERROR: You must pass, proto, ipaddress and port\n";
+ }
+ return;
+ }
+ if ($debug) {
+ echo "Creating ZMQSocket()\n";
+ }
+ $server = new ZMQSocket(new ZMQContext(), ZMQ::SOCKET_REP);
+ if ($debug) {
+ echo "Binding to {$protocol}://{$ipaddress}:{$port}\n";
+ }
+ $server->bind("{$protocol}://{$ipaddress}:{$port}");
+ if ($debug) {
+ echo "Entering while() loop\n";
+ }
+ while ($msg = $server->recv()) {
+ // Convert the XML to a PHP array
+ $message = unserialize($msg);
+ if ($debug) {
+ echo "Message received:\n";
+ print_r($message);
+ }
+ switch ($message[2]) {
+ case "pfsense.exec_shell":
+ $function_to_call = "exec_shell_zeromq";
+ break;
+ case "pfsense.exec_php":
+ $function_to_call = "exec_php_zeromq";
+ break;
+ case "pfsense.filter_configure":
+ $function_to_call = "filter_configure_zeromq";
+ break;
+ case "pfsense.interfaces_carp_configure":
+ $function_to_call = "interfaces_carp_configure_zeromq";
+ break;
+ case "pfsense.backup_config_section":
+ $function_to_call = "backup_config_section_zeromq";
+ break;
+ case "pfsense.restore_config_section":
+ $function_to_call = "restore_config_section_zeromq";
+ break;
+ case "pfsense.merge_config_section":
+ $function_to_call = "merge_config_section_zeromq";
+ break;
+ case "pfsense.merge_installedpackages_section_zeromq":
+ $function_to_call = "merge_installedpackages_section_zeromq";
+ break;
+ case "pfsense.check_firmware_version":
+ $function_to_call = "check_firmware_version_zeromq";
+ break;
+ case "pfsense.reboot":
+ $function_to_call = "reboot_zeromq";
+ break;
+ case "pfsense.get_notices":
+ $function_to_call = "get_notices_zeromq";
+ break;
+ }
+ if (!$function_to_call) {
+ if ($debug) {
+ echo "ERROR: Could not find a function to call";
+ }
+ return;
+ } else {
+ if ($debug) {
+ echo "Invoking function {$message[2]}()\n;";
+ }
+ }
+ /* Call function that is being invoked */
+ $result = $function_to_call($message);
+ /* echo back the result */
+ $server->send($result);
+ }
+}
+
+function zeromq_auth($params) {
+ global $config, $g, $debug;
+
+ $username = $params[0];
+ $passwd = $params[1];
+
+ $user = getUserEntry($username);
+ if (!$user) {
+ if ($debug) {
+ echo "Could not locate user $username with getUserEntry()\n";
+ }
+ return false;
+ }
+
+ if (is_account_disabled($username) || is_account_expired($username)) {
+ if ($debug) {
+ echo "Returning account expired/disabled\n";
+ }
+ return false;
+ }
+
+ if ($user['password']) {
+ $passwd = crypt($passwd, $user['password']);
+ if ($passwd == $user['password']) {
+ return true;
+ }
+ }
+
+ if ($user['md5-hash']) {
+ $passwd = md5($passwd);
+ if ($passwd == $user['md5-hash']) {
+ return true;
+ }
+ }
+
+ if ($debug) {
+ echo "zeromq_auth() fall through == false\n";
+ }
+
+ return false;
+}
+
+function exec_php_zeromq($raw_params) {
+ global $config, $g, $debug;
+ $params = $raw_params;
+ if (zeromq_auth($raw_params) == false) {
+ if ($debug) {
+ echo "Auth failed in exec_shell_zeromq()\n";
+ }
+ return ZEROMQ_AUTH_FAIL;
+ }
+ $exec_php = $params[3];
+ if ($debug) {
+ echo "Running exec_php_zeromq(): {$exec_php}\n";
+ }
+ eval($exec_php);
+ if ($toreturn) {
+ return serialize($toreturn);
+ } else {
+ return ZEROMQ_FASLE;
+ }
+}
+
+function exec_shell_zeromq($raw_params) {
+ global $config, $g, $debug;
+ $params = $raw_params;
+ if (zeromq_auth($raw_params) == false) {
+ if ($debug) {
+ echo "Auth failed in exec_shell_zeromq()\n";
+ }
+ return ZEROMQ_AUTH_FAIL;
+ }
+ $shell_cmd = $params[3];
+ if ($debug) {
+ echo "Running exec_shell_zeromq(): {$shell_cmd}\n";
+ }
+ mwexec($shell_cmd);
+ return ZEROMQ_FASLE;
+}
+
+function backup_config_section_zeromq($raw_params) {
+ global $config, $g, $debug;
+ $params = $raw_params;
+ if (zeromq_auth($raw_params) == false) {
+ return ZEROMQ_AUTH_FAIL;
+ }
+ $val = array_intersect_key($config, array_flip($params[3]));
+ return serialize($val);
+}
+
+function restore_config_section_zeromq($raw_params) {
+ global $config, $g, $debug;
+ $params = $raw_params;
+ if (zeromq_auth($raw_params) == false) {
+ return ZEROMQ_AUTH_FAIL;
+ }
+ $config = array_merge($config, $params[3]);
+ $mergedkeys = implode(",", array_keys($params[3]));
+ write_config(sprintf(gettext("Merged in config (%s sections) from ZeroMQ client."), $mergedkeys));
+ return ZEROMQ_FASLE;
+}
+
+function merge_installedpackages_section_zeromq($raw_params) {
+ global $config, $g, $debug;
+ $params = $raw_params;
+ if (zeromq_auth($raw_params) == false) {
+ return ZEROMQ_AUTH_FAIL;
+ }
+ $config['installedpackages'] = array_merge($config['installedpackages'], $params[0]);
+ $mergedkeys = implode(",", array_keys($params[3]));
+ write_config(sprintf(gettext("Merged in config (%s sections) from ZeroMQ client."), $mergedkeys));
+ return ZEROMQ_FASLE;
+}
+
+function merge_config_section_zeromq($raw_params) {
+ global $config, $g, $debug;
+ $params = $raw_params;
+ if (zeromq_auth($raw_params) == false) {
+ return ZEROMQ_AUTH_FAIL;
+ }
+ $config = array_merge_recursive_unique($config, $params[0]);
+ $mergedkeys = implode(",", array_keys($params[3]));
+ write_config("Merged in config ({$mergedkeys} sections) from ZeroMQ client.");
+ return ZEROMQ_FASLE;
+}
+
+function filter_configure_zeromq($raw_params) {
+ global $config, $g, $debug;
+ $params = $raw_params;
+ if (zeromq_auth($raw_params) == false) {
+ return ZEROMQ_AUTH_FAIL;
+ }
+ filter_configure();
+ system_routing_configure();
+ setup_gateways_monitor();
+ relayd_configure();
+ require_once("openvpn.inc");
+ openvpn_resync_all();
+ services_dhcpd_configure();
+ if (isset($config['dnsmasq']['enable'])) {
+ services_dnsmasq_configure();
+ } elseif (isset($config['unbound']['enable'])) {
+ services_unbound_configure();
+ }
+ local_sync_accounts();
+ return ZEROMQ_FASLE;
+}
+
+function interfaces_carp_configure_zeromq($raw_params) {
+ global $config, $g, $debug;
+ $params = $raw_params;
+ if (zeromq_auth($raw_params) == false) {
+ return ZEROMQ_AUTH_FAIL;
+ }
+ interfaces_sync_setup();
+ interfaces_vips_configure();
+ return ZEROMQ_FASLE;
+}
+
+function check_firmware_version_zeromq($raw_params) {
+ global $config, $g, $debug;
+ $params = $raw_params;
+ if (zeromq_auth($raw_params) == false) {
+ return ZEROMQ_AUTH_FAIL;
+ }
+ return serialize(check_firmware_version(false));
+}
+
+function reboot_zeromq($raw_params) {
+ global $config, $g, $debug;
+ $params = $raw_params;
+ if (zeromq_auth($raw_params) == false) {
+ return ZEROMQ_AUTH_FAIL;
+ }
+ mwexec_bg("/etc/rc.reboot");
+ return ZEROMQ_FASLE;
+}
+
+function get_notices_zeromq($raw_params) {
+ global $config, $g, $debug;
+ $params = $raw_params;
+ if (zeromq_auth($raw_params) == false) {
+ return ZEROMQ_AUTH_FAIL;
+ }
+ if (!function_exists("get_notices")) {
+ require("notices.inc");
+ }
+ if (!$params) {
+ $toreturn = get_notices();
+ } else {
+ $toreturn = get_notices($params);
+ }
+ return serialize($toreturn);
+}
+
+?>
OpenPOWER on IntegriCloud