/* * svc * * part of pfSense (https://www.pfsense.org) * Copyright (c) 2016 Rubicon Communications, LLC (Netgate) * 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. * * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgment: * "This product includes software developed by the pfSense Project * for use in the pfSense® software distribution. (http://www.pfsense.org/). * * 4. The names "pfSense" and "pfSense Project" must not be used to * endorse or promote products derived from this software without * prior written permission. For written permission, please contact * coreteam@pfsense.org. * * 5. Products derived from this software may not be called "pfSense" * nor may "pfSense" appear in their names without prior written * permission of the Electric Sheep Fencing, LLC. * * 6. Redistributions of any form whatsoever must retain the following * acknowledgment: * * "This product includes software developed by the pfSense Project * for use in the pfSense software distribution (http://www.pfsense.org/). * * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY * EXPRESSED 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 pfSense PROJECT OR * ITS CONTRIBUTORS 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. */ require_once("config.inc"); require_once("util.inc"); require_once("service-utils.inc"); function usage() { echo "Usage: playback svc [service-specific options]\n\n"; echo "Examples:\n"; echo "playback svc stop dhcpd\n"; echo "playback svc restart openvpn client 2\n"; echo "playback svc stop captiveportal zone1\n"; echo "\n"; } global $g, $config, $argv, $command_split; if (is_array($command_split)) { $args = array_slice($command_split, 2); } else { $args = array_slice($argv, 3); } if (empty($args[0])) { usage(); } $extras = array(); // start, stop, restart $action = $args[0]; // dhcpd, openvpn, etc. $svc_name = $args[1]; // Handle service-specific options. switch ($svc_name) { case "openvpn": if (in_array($args[2], array("server", "client"))) { $extras['vpnmode'] = $args[2]; } else { echo "Invalid OpenVPN mode (server, client)\n"; return; } if (is_numeric($args[3])) { $extras['id'] = $args[3]; } else { echo "Invalid OpenVPN ID, must be numeric\n"; return; } $vpnsvc = find_service_by_openvpn_vpnid($extras['id']); if (empty($vpnsvc)) { echo "No OpenVPN client or server found with that ID.\n"; return; } break; case "captiveportal": if (is_validaliasname($args[2])) { $extras['zone'] = $args[2]; } else { echo "Invalid Captive Portal Zone.\n"; return; } $cpzone = find_service_by_cp_zone($extras['zone']); if (empty($cpzone)) { echo "No Captive Portal Zone found with that name.\n"; return; } break; } switch ($action) { case "restart": echo "Attempting to issue {$action} to {$svc_name} service...\n"; $savemsg = service_control_restart($svc_name, $extras); break; case "start": echo "Attempting to issue {$action} to {$svc_name} service...\n"; $savemsg = service_control_start($svc_name, $extras); break; case "stop": echo "Attempting to issue {$action} to {$svc_name} service...\n"; $savemsg = service_control_stop($svc_name, $extras); break; case "status": switch ($svc_name) { case "openvpn": $service = $vpnsvc; break; case "captiveportal": $service = $cpzone; break; default: $service = find_service_by_name($svc_name); break; } $savemsg = get_service_status($service) ? "Service {$svc_name} is running." : "Service {$svc_name} is stopped."; break; } echo "\n{$savemsg}\n";