diff --git a/src/etc/inc/services.inc b/src/etc/inc/services.inc index 6154099d9..ac9edc16a 100644 --- a/src/etc/inc/services.inc +++ b/src/etc/inc/services.inc @@ -2675,7 +2675,7 @@ function services_get() $pconfig['id'] = $id; $pconfig['vpnid'] = $setting['vpnid']; $pconfig['description'] = gettext("OpenVPN") . " ".$mode.": ".htmlspecialchars($setting['description']); - $pconfig['pidfile'] = "/var/run/openvpn_{$mode}{$settings['vpnid']}.pid"; + $pconfig['pidfile'] = "/var/run/openvpn_{$mode}{$setting['vpnid']}.pid"; $services[] = $pconfig; } } @@ -2750,18 +2750,7 @@ function services_get() return $services; } -function find_service_by_openvpn_vpnid($vpnid) -{ - $services = services_get(); - foreach ($services as $service) { - if (($service["name"] == "openvpn") && isset($service["vpnid"]) && ($service["vpnid"] == $vpnid)) { - return $service; - } - } - return array(); -} - -function find_service_by_name($names) +function find_service_by_name($names, $filter = array()) { if (!is_array($names)) { $names = array($names); @@ -2771,8 +2760,22 @@ function find_service_by_name($names) foreach ($services as $service) { foreach ($names as $name) { - if ($service['name'] == $name) { - return $service; + if ($service['name'] != $name) { + continue; + } + if (!count($filter)) { + /* force match if filter wasn't set (standard behaviour) */ + $filter['name'] = $name; + } + foreach ($filter as $key => $value) { + if (isset($service[$key]) && $service[$key] == $value) { + /* + * First match wins, $names is only used + * to probe similar services that exclude + * each other. + */ + return $service; + } } } } diff --git a/src/www/fbegin.inc b/src/www/fbegin.inc index a66f8912d..c6617d09c 100644 --- a/src/www/fbegin.inc +++ b/src/www/fbegin.inc @@ -183,15 +183,7 @@ if($need_alert_display == true) {
  • - + $server['vpnid'])); ?> @@ -254,7 +254,7 @@ $( document ).ready(function() {
    - + $sk_server['vpnid'])); ?>
    @@ -294,7 +294,7 @@ $( document ).ready(function() {
    - + $client['vpnid'])); ?>
    diff --git a/src/www/status_services.php b/src/www/status_services.php index ebc201690..55a5ed6e1 100644 --- a/src/www/status_services.php +++ b/src/www/status_services.php @@ -118,29 +118,19 @@ function service_control_stop($name, $extras) { $msg = sprintf(gettext("%s has been stopped."), htmlspecialchars($name)); - switch ($name) { - case 'igmpproxy': - killbyname("igmpproxy"); - return $msg; - case 'miniupnpd': - upnp_action('stop'); - return $msg; - case 'sshd': - killbyname("sshd"); - return $msg; - case 'openvpn': - $vpnmode = htmlspecialchars($extras['vpnmode']); - if (($vpnmode == "server") or ($vpnmode == "client")) { - $id = htmlspecialchars($extras['id']); - $pidfile = "/var/run/openvpn_{$vpnmode}{$id}.pid"; - killbypid($pidfile); - } - return $msg; - case 'relayd': - killbyname('relayd'); - return $msg; - default: - break; + /* XXX openvpn is handled special at the moment */ + if ($name == 'openvpn') { + $vpnmode = htmlspecialchars($extras['vpnmode']); + if (($vpnmode == "server") or ($vpnmode == "client")) { + $id = htmlspecialchars($extras['id']); + $pidfile = "/var/run/openvpn_{$vpnmode}{$id}.pid"; + killbypid($pidfile); + } + return $msg; + /* XXX extra argument is extra tricky */ + } elseif ($name == 'miniupnpd') { + upnp_action('stop'); + return $msg; } $service = find_service_by_name($name); @@ -163,7 +153,8 @@ function service_control_stop($name, $extras) } elseif (isset($service['pidfile'])) { killbypid($service['pidfile']); } else { - $msg = sprintf(gettext("Could not stop service `%s'"), htmlspecialchars($name)); + /* last resort, but not very elegant */ + killbyname($service['name']); } return $msg;