"") { eval("\$rc={$aservice['custom_php_service_status_command']};"); return $rc; } if (empty($aservice['executable'])) { return false; } if (is_process_running($aservice['executable'])) { return true; } return false; } } } if (is_process_running($service)) { return true; } return false; } function get_services() { global $config; if (is_array($config['installedpackages']['service'])) { $services = $config['installedpackages']['service']; } else { $services = array(); } /* * Add services that are in the base. */ if (is_radvd_enabled()) { $pconfig = array(); $pconfig['name'] = "radvd"; $pconfig['description'] = gettext("Router Advertisement Daemon"); $services[] = $pconfig; } if (isset($config['dnsmasq']['enable'])) { $pconfig = array(); $pconfig['name'] = "dnsmasq"; $pconfig['description'] = gettext("DNS Forwarder"); $services[] = $pconfig; } if (isset($config['unbound']['enable'])) { $pconfig = array(); $pconfig['name'] = "unbound"; $pconfig['description'] = gettext("DNS Resolver"); $services[] = $pconfig; } $pconfig = array(); $pconfig['name'] = "ntpd"; $pconfig['description'] = gettext("NTP clock sync"); $services[] = $pconfig; $pconfig = array(); $pconfig['name'] = "syslogd"; $pconfig['description'] = gettext("System Logger Daemon"); $services[] = $pconfig; if (is_array($config['captiveportal'])) { foreach ($config['captiveportal'] as $zone => $setting) { if (isset($setting['enable'])) { $pconfig = array(); $pconfig['name'] = "captiveportal"; $pconfig['zone'] = $zone; $pconfig['description'] = gettext("Captive Portal") . ": " . htmlspecialchars($setting['zone']); $services[] = $pconfig; } } } $iflist = array(); $ifdescrs = get_configured_interface_list(); foreach ($ifdescrs as $if) { $oc = $config['interfaces'][$if]; if ($oc['if'] && (!link_interface_to_bridge($if))) { $iflist[$if] = $if; } } if (isset($config['dhcrelay']['enable'])) { $pconfig = array(); $pconfig['name'] = "dhcrelay"; $pconfig['description'] = gettext("DHCP Relay"); $services[] = $pconfig; } if (isset($config['dhcrelay6']['enable'])) { $pconfig = array(); $pconfig['name'] = "dhcrelay6"; $pconfig['description'] = gettext("DHCPv6 Relay"); $services[] = $pconfig; } if (is_dhcp_server_enabled()) { $pconfig = array(); $pconfig['name'] = "dhcpd"; $pconfig['description'] = gettext("DHCP Service"); $services[] = $pconfig; } $gateways_arr = return_gateways_array(); if (is_array($gateways_arr)) { $pconfig = array(); $pconfig['name'] = "dpinger"; $pconfig['description'] = gettext("Gateway Monitoring Daemon"); $services[] = $pconfig; } if (isset($config['snmpd']['enable'])) { $pconfig = array(); $pconfig['name'] = "bsnmpd"; $pconfig['description'] = gettext("SNMP Service"); $services[] = $pconfig; } if (is_array($config['igmpproxy']['igmpentry']) && (count($config['igmpproxy']['igmpentry']) > 0)) { $pconfig = array(); $pconfig['name'] = "igmpproxy"; $pconfig['description'] = gettext("IGMP proxy"); $services[] = $pconfig; } if (isset($config['installedpackages']['miniupnpd']) && $config['installedpackages']['miniupnpd']['config'][0]['enable']) { $pconfig = array(); $pconfig['name'] = "miniupnpd"; $pconfig['description'] = gettext("UPnP Service"); $services[] = $pconfig; } if (ipsec_enabled()) { $pconfig = array(); $pconfig['name'] = "ipsec"; $pconfig['description'] = gettext("IPsec VPN"); $services[] = $pconfig; } if (isset($config['system']['ssh']['enable'])) { $pconfig = array(); $pconfig['name'] = "sshd"; $pconfig['description'] = gettext("Secure Shell Daemon"); $services[] = $pconfig; } foreach (array('server', 'client') as $mode) { if (is_array($config['openvpn']["openvpn-{$mode}"])) { foreach ($config['openvpn']["openvpn-{$mode}"] as $id => $setting) { if (!isset($setting['disable'])) { $pconfig = array(); $pconfig['name'] = "openvpn"; $pconfig['mode'] = $mode; $pconfig['id'] = $id; $pconfig['vpnid'] = $setting['vpnid']; $pconfig['description'] = gettext("OpenVPN") . " " . $mode . ": " . htmlspecialchars($setting['description']); $services[] = $pconfig; } } } } if (!is_array($config['load_balancer']['lbpool'])) { $config['load_balancer']['lbpool'] = array(); } if (is_array($config['load_balancer']['virtual_server']) && count($config['load_balancer']['virtual_server']) && count($config['load_balancer']['lbpool'])) { $pconfig = array(); $pconfig['name'] = "relayd"; $pconfig['description'] = gettext("Server load balancing daemon"); $services[] = $pconfig; } return $services; } function find_service_by_name($name) { $services = get_services(); foreach ($services as $service) { if ($service["name"] == $name) { return $service; } } return array(); } function find_service_by_openvpn_vpnid($vpnid) { $services = get_services(); foreach ($services as $service) { if (($service["name"] == "openvpn") && isset($service["vpnid"]) && ($service["vpnid"] == $vpnid)) { return $service; } } return array(); } function find_service_by_cp_zone($zone) { $services = get_services(); foreach ($services as $service) { if (($service["name"] == "captiveportal") && isset($service["zone"]) && ($service["zone"] == $zone)) { return $service; } } return array(); } function service_description_compare($a, $b) { if (strtolower($a['description']) == strtolower($b['description'])) { return 0; } return (strtolower($a['description']) < strtolower($b['description'])) ? -1 : 1; } function service_name_compare($a, $b) { /* If the names are equal, fall back to sorting by description */ if (strtolower($a['name']) == strtolower($b['name'])) { return service_description_compare($a, $b); } return (strtolower($a['name']) < strtolower($b['name'])) ? -1 : 1; } function service_dispname_compare($a, $b) { /* If two items have an instance suffix, perform an integer comparison to avoid awkward sorting */ if ((strpos($a['dispname'], '_') > 0) && (strpos($b['dispname'], '_') > 0)) { list($adn1, $adn2) = explode('_', $a['dispname'], 2); list($bdn1, $bdn2) = explode('_', $b['dispname'], 2); if (($adn1 == $bdn1) && is_numeric($adn2) && is_numeric($bdn2)) { if ($adn2 == $bdn2) { return 0; } return ((int)$adn2 < (int)$bdn2) ? -1 : 1; } } /* If the display names are equal, compare the internal name */ if (strtolower($a['dispname']) == strtolower($b['dispname'])) { return service_name_compare($a, $b); } return (strtolower($a['dispname']) < strtolower($b['dispname'])) ? -1 : 1; } function get_pkg_descr($package_name) { global $config; if (is_array($config['installedpackages']['package'])) { foreach ($config['installedpackages']['package'] as $pkg) { if ($pkg['name'] == $package_name) { return $pkg['descr']; } } } return gettext("Not available."); } function get_service_status($service) { global $g; switch ($service['name']) { case "openvpn": $running = is_pid_running("{$g['varrun_path']}/openvpn_{$service['mode']}{$service['vpnid']}.pid"); break; case "captiveportal": $running = is_pid_running("{$g['varrun_path']}/nginx-{$service['zone']}-CaptivePortal.pid"); if (isset($config['captiveportal'][$service['zone']]['httpslogin'])) { $running = $running && is_pid_running("{$g['varrun_path']}/nginx-{$service['zone']}-CaptivePortal-SSL.pid"); } break; case "vhosts-http": $running = is_pid_running("{$g['varrun_path']}/vhosts-http.pid"); break; case "dhcrelay6": $running = is_pid_running("{$g['varrun_path']}/dhcrelay6.pid"); break; case 'ipsec': $running = is_pid_running("{$g['varrun_path']}/charon.pid"); break; default: $running = is_service_running($service['name']); } return $running; } function get_service_status_icon($service, $withtext = true, $smallicon = false, $withthumbs = false, $title = "service_state") { $output = ""; if (get_service_status($service)) { $statustext = gettext("Running"); $text_class = "text-success"; $fa_class = "fa fa-check-circle"; $fa_class_thumbs = "fa fa-thumbs-o-up"; $Thumbs_UpDown = "Thumbs up"; } else { if (is_service_enabled($service['name'])) { $statustext = gettext("Stopped"); $text_class = "text-danger"; $fa_class = "fa fa-times-circle"; } else { $statustext = gettext("Disabled"); $text_class = "text-warning"; $fa_class = "fa fa-ban"; } $fa_class_thumbs = "fa fa-thumbs-o-down"; $Thumbs_UpDown = "Thumbs down"; } $fa_size = ($smallicon) ? "fa-1x" : "fa-lg"; if ($title == "state") { $title = $statustext; } elseif ($title == "service_state") { $title = sprintf(gettext('%1$s Service is %2$s'), $service["name"], $statustext); } elseif ($title == "description_state") { $title = sprintf(gettext('%1$s Service is %2$s'), $service["description"], $statustext); } elseif ($title == "description_service_state") { $title = sprintf(gettext('%1$s, %2$s Service is %3$s'), $service["description"], $service["name"], $statustext); } $spacer = ($withthumbs || $withtext) ? " " : ""; $output = "{$statustext}{$spacer}"; $spacer = ($withtext) ? " " : ""; if ($withthumbs) { $output .= "{$spacer}"; } if ($withtext) { $output .= "" . $statustext . ""; } return $output; } function get_service_control_links($service, $addname = false) { global $g; $output = ""; $stitle = ($addname) ? $service['name'] . " " : ""; switch ($service['name']) { case "openvpn": $link = ''; break; case "captiveportal": $link = ''; break; default: $link = ''; } if (get_service_status($service)) { switch ($service['name']) { case "openvpn": $output .= ''; break; case "captiveportal": $output .= ''; break; default: $output .= ''; } $output .= "\n"; switch ($service['name']) { case "openvpn": $output .= ''; break; case "captiveportal": $output .= ''; break; default: $output .= ''; } $output .= ""; } else { $service_enabled = is_service_enabled($service['name']); if ($service['name'] == 'openvpn' || $service['name'] == 'captiveportal' || $service_enabled) { $output .= sprintf($link, sprintf(gettext("Start %sService"), $stitle), 'startservice'); $output .= ' '; } } return $output; } function service_control_start($name, $extras) { global $g; switch ($name) { case 'radvd': services_radvd_configure(); break; case 'captiveportal': $zone = htmlspecialchars($extras['zone']); captiveportal_init_webgui_zonename($zone); break; case 'ntpd': system_ntp_configure(); break; case 'dpinger': setup_gateways_monitor(); break; case 'bsnmpd': services_snmpd_configure(); break; case 'dhcrelay': services_dhcrelay_configure(); break; case 'dhcrelay6': services_dhcrelay6_configure(); break; case 'dnsmasq': services_dnsmasq_configure(); break; case 'unbound': services_unbound_configure(); break; case 'dhcpd': services_dhcpd_configure(); break; case 'igmpproxy': services_igmpproxy_configure(); break; case 'miniupnpd': upnp_action('start'); break; case 'ipsec': vpn_ipsec_force_reload(); break; case 'sshd': send_event("service restart sshd"); break; case 'openvpn': $vpnmode = isset($extras['vpnmode']) ? htmlspecialchars($extras['vpnmode']) : htmlspecialchars($extras['mode']); if (($vpnmode == "server") || ($vpnmode == "client")) { $id = isset($extras['vpnid']) ? htmlspecialchars($extras['vpnid']) : htmlspecialchars($extras['id']); $configfile = "{$g['varetc_path']}/openvpn/{$vpnmode}{$id}.conf"; if (file_exists($configfile)) { openvpn_restart_by_vpnid($vpnmode, $id); } } break; case 'relayd': relayd_configure(); filter_configure(); break; case 'syslogd': system_syslogd_start(); break; default: start_service($name); break; } return sprintf(gettext("%s has been started."), htmlspecialchars($name)); } function service_control_stop($name, $extras) { global $g; switch ($name) { case 'radvd': killbypid("{$g['varrun_path']}/radvd.pid"); break; case 'captiveportal': $zone = htmlspecialchars($extras['zone']); killbypid("{$g['varrun_path']}/nginx-{$zone}-CaptivePortal.pid"); killbypid("{$g['varrun_path']}/nginx-{$zone}-CaptivePortal-SSL.pid"); break; case 'ntpd': killbyname("ntpd"); break; case 'openntpd': killbyname("openntpd"); break; case 'dpinger': stop_dpinger(); break; case 'bsnmpd': killbypid("{$g['varrun_path']}/snmpd.pid"); break; case 'choparp': killbyname("choparp"); break; case 'dhcpd': killbyname("dhcpd"); break; case 'dhcrelay': killbypid("{$g['varrun_path']}/dhcrelay.pid"); break; case 'dhcrelay6': killbypid("{$g['varrun_path']}/dhcrelay6.pid"); break; case 'dnsmasq': killbypid("{$g['varrun_path']}/dnsmasq.pid"); break; case 'unbound': killbypid("{$g['varrun_path']}/unbound.pid"); break; case 'igmpproxy': killbyname("igmpproxy"); break; case 'miniupnpd': upnp_action('stop'); break; case 'sshd': killbyname("sshd"); break; case 'ipsec': exec("/usr/local/sbin/ipsec stop"); break; case 'openvpn': $vpnmode = htmlspecialchars($extras['vpnmode']); if (($vpnmode == "server") or ($vpnmode == "client")) { $id = htmlspecialchars($extras['id']); $pidfile = "{$g['varrun_path']}/openvpn_{$vpnmode}{$id}.pid"; killbypid($pidfile); } break; case 'relayd': sigkillbyname("relayd", "TERM"); break; case 'syslogd': if (isvalidpid("{$g['varrun_path']}/syslog.pid")) { sigkillbypid("{$g['varrun_path']}/syslog.pid", "TERM"); usleep(100000); } if (isvalidpid("{$g['varrun_path']}/syslog.pid")) { sigkillbypid("{$g['varrun_path']}/syslog.pid", "KILL"); usleep(100000); } /* Make sure sshguard stops as well */ sigkillbyname("sshguard", "TERM"); break; default: stop_service($name); break; } return sprintf(gettext("%s has been stopped."), htmlspecialchars($name)); } function service_control_restart($name, $extras) { global $g; switch ($name) { case 'radvd': services_radvd_configure(); break; case 'captiveportal': $zone = htmlspecialchars($extras['zone']); killbypid("{$g['varrun_path']}/nginx-{$zone}-CaptivePortal.pid"); killbypid("{$g['varrun_path']}/nginx-{$zone}-CaptivePortal-SSL.pid"); captiveportal_init_webgui_zonename($zone); break; case 'ntpd': case 'openntpd': system_ntp_configure(); break; case 'dpinger': setup_gateways_monitor(); break; case 'bsnmpd': services_snmpd_configure(); break; case 'dhcrelay': services_dhcrelay_configure(); break; case 'dhcrelay6': services_dhcrelay6_configure(); break; case 'dnsmasq': services_dnsmasq_configure(); break; case 'unbound': services_unbound_configure(); break; case 'dhcpd': services_dhcpd_configure(); break; case 'igmpproxy': services_igmpproxy_configure(); break; case 'miniupnpd': upnp_action('restart'); break; case 'ipsec': vpn_ipsec_force_reload(); break; case 'sshd': send_event("service restart sshd"); break; case 'openvpn': $vpnmode = htmlspecialchars($extras['vpnmode']); if ($vpnmode == "server" || $vpnmode == "client") { $id = htmlspecialchars($extras['id']); $configfile = "{$g['varetc_path']}/openvpn/{$vpnmode}{$id}.conf"; if (file_exists($configfile)) { openvpn_restart_by_vpnid($vpnmode, $id); } } break; case 'relayd': relayd_configure(true); filter_configure(); break; case 'syslogd': system_syslogd_start(); break; default: restart_service($name); break; } return sprintf(gettext("%s has been restarted."), htmlspecialchars($name)); } ?>