diff options
author | Ermal <eri@pfsense.org> | 2010-08-31 19:00:41 +0000 |
---|---|---|
committer | Ermal <eri@pfsense.org> | 2010-08-31 19:01:41 +0000 |
commit | ba8495f062a670cbfe570edcc8fd1a741fadb74e (patch) | |
tree | c81c88cefc58bbb7733c63a02886f9382a8f15f8 /etc/inc/service-utils.inc | |
parent | ce6d1106a185edeae91fb42dd7a9a9c89c273be8 (diff) | |
download | pfsense-ba8495f062a670cbfe570edcc8fd1a741fadb74e.zip pfsense-ba8495f062a670cbfe570edcc8fd1a741fadb74e.tar.gz |
Ticket #485. Correct code and use pkill/pgrep to match or kill process. Since these utilities know how to handle pidfiles and exact matches on process names.
Diffstat (limited to 'etc/inc/service-utils.inc')
-rw-r--r-- | etc/inc/service-utils.inc | 102 |
1 files changed, 52 insertions, 50 deletions
diff --git a/etc/inc/service-utils.inc b/etc/inc/service-utils.inc index 6f26221..7b24dae 100644 --- a/etc/inc/service-utils.inc +++ b/etc/inc/service-utils.inc @@ -38,60 +38,64 @@ pfSense_MODULE: utils */ +$rcfileprefix = "/usr/local/etc/rc.d/"; function write_rcfile($params) { - $fileprefix = "/usr/local/etc/rc.d/"; - if(!(is_writable($fileprefix . $params['file']) or $params['start'])) return false; - $towrite .= "#!/bin/sh\n# This file was automatically generated\n# by the {$g['product_website']} service handler.\n\n"; + if (!is_writable("{$rcfileprefix}{$params['file']}") || empty($params['start'])) + return false; + $towrite = "#!/bin/sh\n"; + $towrite .= "# This file was automatically generated\n# by the {$g['product_website']} service handler.\n\n"; + /* write our rc functions */ - $towrite .= "rc_start() {\n\t" . $params['start'] . "\n}\n\n"; - if($params['stop']) { + $towrite .= "rc_start() {\n"; + $towrite .= "\t{$params['start']}\n"; + $towrite .= "}\n\n"; + if(!empty($params['stop'])) { $tokill =& $params['stop']; - } elseif($params['executable']) { + } else if(!empty($params['executable'])) { /* just nuke the executable */ $tokill = "/usr/bin/killall {$params['executable']}"; } else { /* make an educated guess (bad) */ $tokill = array_pop(explode('/', array_shift(explode(' ', $params['start'])))); } - $towrite .= "rc_stop() {\n\t" . $tokill . "\n}\n\n"; + $towrite .= "rc_stop() {\n"; + $towrite .= "\t{$tokill}\n"; + $towrite .= "}\n\n"; /* begin rcfile logic */ - $towrite .= "case $1 in\n\tstart)\n\t\trc_start\n\t\t;;\n\tstop)\n\t\trc_stop\n\t\t;;\n\trestart)\n\t\trc_stop\n\t\trc_start\n\t\t;;\nesac\n\n"; - $fout = fopen($fileprefix . $params['file'], "w"); - fwrite($fout, $towrite); - fclose($fout); - chmod($fileprefix . $params['file'], 0755); + $towrite .= "case \$1 in\n\tstart)\n\t\trc_start\n\t\t;;\n\tstop)\n\t\trc_stop\n\t\t;;\n\trestart)\n\t\trc_stop\n\t\trc_start\n\t\t;;\nesac\n\n"; + + file_put_contents("{$rcfileprefix}{$params['file']}", $towrite); + @chmod("{$rcfileprefix}{$params['file']}", 0755); + return; } function start_service($name) { global $config; + /* make sure service is stopped before starting */ stop_service($name); sleep(2); - if(file_exists("/usr/local/etc/rc.d/{$name}.sh")) { - exec("/bin/sh /usr/local/etc/rc.d/{$name}.sh start"); + + if(file_exists("{$rcfileprefix}{$name}.sh")) { + exec("/bin/sh {$rcfileprefix}{$name}.sh start"); return; } if($config['installedpackages']['service']) { foreach($config['installedpackages']['service'] as $service) { if(strtolower($service['name']) == strtolower($name)) { if($service['rcfile']) { - if($service['prefix']) { + $prefix = $rcfileprefix; + if (!empty($service['prefix'])) { $prefix =& $service['prefix']; - } else { - $prefix = "/usr/local/etc/rc.d/"; } - if(file_exists($prefix . $service['rcfile'])) { - mwexec_bg($prefix . $service['rcfile'] . " start"); - } else { - if(file_exists("/usr/local/etc/rc.d/{$name}.sh")) - mwexec_bg("/usr/local/etc/rc.d/{$name}.sh start"); + if(file_exists("{$prefix}{$service['rcfile']}")) { + mwexec_bg("{$prefix}{$service['rcfile']} start"); } } - if($service['startcmd']) { + if (!empty($service['startcmd'])) eval($service['startcmd']); - } break; } } @@ -105,16 +109,15 @@ function stop_service($name) { foreach($config['installedpackages']['service'] as $service) { if(strtolower($service['name']) == strtolower($name)) { if($service['rcfile']) { - if($service['prefix']) { + $prefix = $rcfileprefix; + if(!empty($service['prefix'])) { $prefix =& $service['prefix']; - } else { - $prefix = "/usr/local/etc/rc.d/"; } mwexec_bg("{$prefix}{$service['rcfile']} stop"); } - if($service['stopcmd']) { + if (!empty($service['stopcmd'])) eval($service['stopcmd']); - } + if(!($service['rcfile'] or $service['stopcmd'])) { if(is_process_running("{$service['executable']}")) mwexec_bg("/usr/bin/killall {$service['executable']}"); @@ -131,8 +134,10 @@ function stop_service($name) { function restart_service($name) { global $config; + stop_service($name); start_service($name); + if($config['installedpackages']['service']) { foreach($config['installedpackages']['service'] as $service) { if(strtolower($service['name']) == strtolower($name)) { @@ -146,9 +151,11 @@ function restart_service($name) { } function is_pid_running($pidfile) { - $pid = trim(file_get_contents($pidfile)); - $running = (trim(shell_exec("/usr/bin/procstat {$pid} 2>/dev/null")) != ''); - return $running; + if (!file_exists($pidfile)) + return false; + $running = shell_exec("/bin/pgrep -F {$pidfile} 2>/dev/null"); + + return (intval($running) == 0); } function is_dhcp_running($interface) { @@ -167,33 +174,28 @@ function restart_service_if_running($service) { function is_service_running($service, $ps = "") { global $config; - /* - if(!$ps) { - exec("/bin/ps ax | awk '{ print $5 }'", $psout); - } - */ + if(is_array($config['installedpackages']['service'])) { foreach($config['installedpackages']['service'] as $aservice) { if(strtolower($service) == strtolower($aservice['name'])) { - if($aservice['custom_php_service_status_command'] <> "") { - $_cmd=explode(';', $aservice['custom_php_service_status_command']); - foreach($_cmd as $_acmd) { - if($_acmd) eval('$rc='.$_acmd.';'); - } + if ($aservice['custom_php_service_status_command'] <> "") { + eval("\$rc={$aservice['custom_php_service_status_command']};"); return $rc; } - if(!$aservice['executable']) return false; - /* - if(count(preg_grep("/{$aservice['executable']}/i", $ps))) { - return true; - } else { + if(empty($aservice['executable'])) return false; - } - */ - return is_process_running($aservice['executable']) ? true : false; + if (is_process_running($aservice['executable'])) + return true; + + return false; } } } + + if (is_process_running($service)) + return true; + + return false; } ?> |