diff options
Diffstat (limited to 'config/nut')
-rw-r--r-- | config/nut/nut.inc | 320 |
1 files changed, 159 insertions, 161 deletions
diff --git a/config/nut/nut.inc b/config/nut/nut.inc index a186ab30..dae2269e 100644 --- a/config/nut/nut.inc +++ b/config/nut/nut.inc @@ -2,8 +2,8 @@ /* nut.inc part of pfSense (https://www.pfsense.org/) - - Copyright (C) 2007 Ryan Wagoner <rswagoner@gmail.com>. + Copyright (C) 2007 Ryan Wagoner <rswagoner@gmail.com> + Copyright (C) 2015 ESF, LLC All rights reserved. Redistribution and use in source and binary forms, with or without @@ -30,8 +30,7 @@ require_once("config.inc"); require_once("functions.inc"); - - /* Nut */ + require_once("util.inc"); define('NUT_RCFILE', '/usr/local/etc/rc.d/nut.sh'); @@ -43,80 +42,58 @@ define('NUT_DIR','/usr/local/etc/nut'); } - function nut_notice ($msg) { syslog(LOG_NOTICE, "nut: {$msg}"); return; } - function nut_warn ($msg) { syslog(LOG_WARNING, "nut: {$msg}"); return; } - - function nut_action ($action) { - if (file_exists(NUT_RCFILE)) - mwexec(NUT_RCFILE.' '.$action); - } - - function nut_config ($name) { + function nut_config($name) { global $config; - if($config['installedpackages']['nut']['config'][0]["{$name}"]) + if ($config['installedpackages']['nut']['config'][0]["{$name}"]) { return $config['installedpackages']['nut']['config'][0]["{$name}"]; - return null; - } + } else { + return null; + } + } - function nut_config_sub ($name,$len) { + function nut_config_sub($name,$len) { global $config; - if(nut_config($name)) + if (nut_config($name)) { return substr(nut_config($name),0,strlen(nut_config($name))-$len); - return null; - } - + } else { + return null; + } + } + function nut_write_config($file, $text, $mask = null, $uid = null) { $conf = fopen($file, "w"); - if(!$conf) { - nut_warn("Could not open {$file} for writing."); + if (!$conf) { + log_error("[nut] ERROR: Could not open {$file} for writing."); exit; } fwrite($conf, $text); fclose($conf); - if($mask) chmod($file, $mask); - if($uid) chown($file, $uid); + if ($mask) { + chmod($file, $mask); + } + if ($uid) { + chown($file, $uid); + } } - function nut_validate_ip($ip,$check_cdir) { - /* validate cdir */ - if($check_cdir) { - $ip_array = explode("/",$ip); - if(count($ip_array) == 2) { - if($ip_array[1] < 1 || $ip_array[1] > 32) - return false; - } else - if(count($ip_array) != 1) - return false; - } else - $ip_array[] = $ip; - - /* validate ip */ - if(!eregi("^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$", $ip_array[0])) - return false; - foreach(explode(".", $ip_array[0]) as $sub) - if($sub < 0 || $sub > 256) - return false; - return true; - } - function before_form_nut(&$pkg) { /* return available serial ports */ - + $serial_types = array("sio", "cua", "tty"); $ignore_files = array(".lock", ".init"); - foreach($serial_types as $st) { + foreach ($serial_types as $st) { $devices = glob("/dev/{$st}*"); - foreach($devices as $line) { - if($line != '') { + foreach ($devices as $line) { + if ($line != '') { $ignore = false; - foreach($ignore_files as $if) { - if(strstr($line, $if)) { + foreach ($ignore_files as $if) { + if (strstr($line, $if)) { $ignore = true; continue; } } - if($ignore == false) { + if ($ignore == false) { $names[] = str_replace("/dev/", "", $line); $values[] = $line; } @@ -127,69 +104,80 @@ /* find correct field */ $i = 0; foreach ($pkg['fields']['field'] as $field) { - if ($field['fieldname'] == 'port') + if ($field['fieldname'] == 'port') { break; - $i++; - } - $field = &$pkg['fields']['field'][$i]; + } else { + $i++; + } + } + $field = &$pkg['fields']['field'][$i]; /* add available serial ports */ - for ($i = 0; $i < count($values) ; $i++) + for ($i = 0; $i < count($values); $i++) { $field['options']['option'][] = array('name' => $names[$i], 'value' => $values[$i]); + } } function validate_form_nut($post, &$input_errors) { global $config; /* monitor remote validation */ - if($post['monitor'] == 'remote') { - if(!$post['remotename']) + if ($post['monitor'] == 'remote') { + if (!$post['remotename']) { $input_errors[] = 'You must specify a name in the \'Remote UPS Name\' field'; - if($post['remotename'] && !eregi('^[a-z0-9_.-]+$', $post['remotename'])) - $input_errors[] = 'Only [Aa-Zz], [0-9], and [-_] accepted in the \'Remote UPS Name\' field'; - if(!$post['remoteaddr'] || !nut_validate_ip($post['remoteaddr'],false)) + } + if ($post['remotename'] && !preg_match("/^[a-zA-Z0-9-_]+$/", $post['name'])) { + $input_errors[] = 'Only [Aa-Zz], [0-9], and [-_] accepted in the \'Remote UPS Name\' field'; + } + if (!$post['remoteaddr'] || !is_ipaddr($post['remoteaddr'])) { $input_errors[] = 'You must specify a valid address \'Remote UPS Address\' field'; - if(!$post['remoteuser']) + } + if (!$post['remoteuser']) { $input_errors[] = 'You must specify a name in the \'Remote UPS User\' field'; - if(!$post['remotepass']) + } + if (!$post['remotepass']) { $input_errors[] = 'You must specify a name in the \'Remote UPS Password\' field'; - } - - /* monitor local validation */ - elseif($post['monitor'] == 'local') { - if(!$post['name']) + } + } elseif ($post['monitor'] == 'local') { + /* monitor local validation */ + if (!$post['name']) { $input_errors[] = 'You must specify a name in the \'Local UPS Name\' field'; - if($post['name'] && !eregi('^[a-z0-9_.-]+$', $post['name'])) - $input_errors[] = 'Only [Aa-Zz], [0-9], and [-_] accepted in the \'Local UPS Name\' field'; - if(!$post['driver']) + } + if ($post['name'] && !preg_match("/^[a-zA-Z0-9-_]+$/", $post['name'])) { + $input_errors[] = 'Only [Aa-Zz], [0-9], and [-_] accepted in the \'Local UPS Name\' field'; + } + if (!$post['driver']) { $input_errors[] = 'You must select a driver in the \'Local UPS Driver\' field'; - if(!$post['port']) + } + if (!$post['port']) { $input_errors[] = 'You must select a port in the \'Local UPS Port\' field'; + } } } function deinstall_package_nut() { - nut_action('stop'); + stop_service("nut"); - @unlink(NUT_RCFILE); - @unlink(NUT_DIR.'/upsmon.conf'); - @unlink(NUT_DIR.'/ups.conf'); - @unlink(NUT_DIR.'/upsd.conf'); - @unlink(NUT_DIR.'/upsd.users'); + unlink_if_exists(NUT_RCFILE); + unlink_if_exists(NUT_DIR.'/upsmon.conf'); + unlink_if_exists(NUT_DIR.'/ups.conf'); + unlink_if_exists(NUT_DIR.'/upsd.conf'); + unlink_if_exists(NUT_DIR.'/upsd.users'); - exec('rm -rf /var/db/nut'); - } + exec('/bin/rm -rf /var/db/nut'); + } function sync_package_nut_remote() { $remotename = nut_config('remotename'); $remoteaddr = nut_config('remoteaddr'); $remoteuser = nut_config('remoteuser'); $remotepass = nut_config('remotepass'); - $shutdownflag = (nut_config('powerdown') == 'on') ? '-p' : '-h'; + $shutdownflag = (nut_config('powerdown') == 'on') ? '-p' : '-h'; $custom_upsmonconf = str_replace(";", "\n", nut_config('custom_upsmonconf')); - if(!($remotename && $remoteaddr && $remoteuser && $remotepass)) + if (!($remotename && $remoteaddr && $remoteuser && $remotepass)) { return false; + } /* upsmon.conf */ $upsmon_conf = <<<EOD @@ -199,16 +187,16 @@ SHUTDOWNCMD "/sbin/shutdown {$shutdownflag} +0" POWERDOWNFLAG /etc/killpower {$custom_upsmonconf} EOD; - + $stop = <<<EOD -if [ `pgrep upsmon | wc -l` != 0 ]; then +if [ `/bin/pgrep upsmon | /usr/bin/wc -l` != 0 ]; then /usr/bin/killall upsmon - while [ `pgrep upsmon | wc -l` != 0 ]; do + while [ `/bin/pgrep upsmon | /usr/bin/wc -l` != 0 ]; do sleep 1 done fi EOD; - + $start = $stop."\n\t/usr/local/sbin/upsmon {$remotename}@{$remoteaddr}\n"; /* write out configuration */ @@ -216,10 +204,10 @@ EOD; nut_write_config(NUT_DIR.'/upsmon.conf', $upsmon_conf, 0640, 'uucp'); write_rcfile(array( 'file' => 'nut.sh', - 'start' => $start, - 'stop' => $stop - ) - ); + 'start' => $start, + 'stop' => $stop + ) + ); conf_mount_ro(); return true; @@ -227,6 +215,7 @@ EOD; function sync_package_nut_local() { global $pfs_version; + $pfs_version = substr(trim(file_get_contents("/etc/version")),0,3); $name = nut_config('name'); $driver = nut_config_sub('driver', 2); @@ -235,43 +224,46 @@ EOD; $cable = nut_config_sub('cable', 3); $allowuser = nut_config('allowuser'); $allowpass = nut_config('allowpass'); - $shutdownflag = (nut_config('powerdown') == 'on') ? '-p' : '-h'; + $shutdownflag = (nut_config('powerdown') == 'on') ? '-p' : '-h'; $custom_upsconf = str_replace(";", "\n", nut_config('custom_upsconf')); $custom_upsdconf = str_replace(";", "\n", nut_config('custom_upsdconf')); $custom_upsdusers = str_replace(";", "\n", nut_config('custom_upsdusers')); $custom_upsmonconf = str_replace(";", "\n", nut_config('custom_upsmonconf')); - if(!($name && $driver && $port)) + if (!($name && $driver && $port)) { return false; + } /* some installs are missing the lock dir */ - if(!is_dir('/var/spool/lock')) { - @mkdir('/var/spool'); - mkdir('/var/spool/lock'); + if (!is_dir('/var/spool/lock')) { + safe_mkdir('/var/spool'); + safe_mkdir('/var/spool/lock'); chown('/var/spool/lock', 'uucp'); chgrp('/var/spool/lock', 'dialer'); } /* determine permissions for port */ - if($port != 'auto') { + if ($port != 'auto') { $port_rel = "chown root {$port}"; $port_set = "chown uucp {$port}"; } /* ups.conf */ - /* for usb ups run as root */ - if($port == 'auto') { + /* for USB ups run as root */ + if ($port == 'auto') { $ups_conf = "user=root\n"; $ovr_user = '-u root'; } $ups_conf .= "[{$name}]\n"; $ups_conf .= "driver={$driver}\n"; $ups_conf .= "port={$port}\n"; - if($cable) + if ($cable) { $ups_conf .= "cable={$cable}\n"; - if($upstype) + } + if ($upstype) { $ups_conf .= "upstype={$upstype}\n"; + } $ups_conf .= "{$custom_upsconf}"; /* upsd.conf */ @@ -284,17 +276,18 @@ EOD; $upsd_users = "[monuser]\n"; $upsd_users .= "password = {$password}\n"; $upsd_users .= "upsmon master\n"; - if($allowuser && $allowpass) { + if ($allowuser && $allowpass) { $upsd_users .= "\n[$allowuser]\n"; $upsd_users .= "password = $allowpass\n"; $upsd_users .= "upsmon master\n"; } $upsd_users .= "{$custom_upsdusers}"; - if ($pfs_version == "2.1") + if ($pfs_version == "2.1") { $upsdrvctl = "/usr/local/libexec/nut/upsdrvctl"; - else + } else { $upsdrvctl = "/usr/local/sbin/upsdrvctl"; + } /* upsmon.conf */ $upsmon_conf = <<<EOD @@ -306,26 +299,26 @@ POWERDOWNFLAG /etc/killpower EOD; $stop = <<<EOD - if [ `pgrep upsmon | wc -l` != 0 ]; then + if [ `/bin/pgrep upsmon | /usr/bin/wc -l` != 0 ]; then echo stopping upsmon /usr/bin/killall upsmon - while [ `pgrep upsmon | wc -l` != 0 ]; do + while [ `/bin/pgrep upsmon | /usr/bin/wc -l` != 0 ]; do sleep 1 done fi - if [ `pgrep upsd | wc -l` != 0 ]; then + if [ `/bin/pgrep upsd | /usr/bin/wc -l` != 0 ]; then echo stopping upsd /usr/bin/killall upsd fi - if [ `pgrep {$driver} | wc -l` != 0 ]; then + if [ `/bin/pgrep {$driver} | /usr/bin/wc -l` != 0 ]; then echo stopping {$driver} {$upsdrvctl} stop fi sleep 1 - if [ `pgrep {$driver} | wc -l` != 0 ]; then + if [ `/bin/pgrep {$driver} | /usr/bin/wc -l` != 0 ]; then echo forcing {$driver} termination /usr/bin/killall {$driver} - while [ `pgrep {$driver} | wc -l` != 0 ]; do + while [ `/bin/pgrep {$driver} | /usr/bin/wc -l` != 0 ]; do sleep 1 done fi @@ -333,7 +326,7 @@ EOD; EOD; $start = <<<EOD -if [ `pgrep {$driver} | wc -l` != 0 ]; then +if [ `/bin/pgrep {$driver} | /usr/bin/wc -l` != 0 ]; then {$stop} fi {$port_set} @@ -356,9 +349,9 @@ EOD; nut_write_config(NUT_DIR.'/upsmon.conf', $upsmon_conf, 0640, 'uucp'); write_rcfile(array( 'file' => 'nut.sh', - 'start' => $start, - 'stop' => $stop - ) + 'start' => $start, + 'stop' => $stop + ) ); conf_mount_ro(); @@ -369,7 +362,7 @@ EOD; $name = nut_config('snmpname'); $driver = "snmp-ups"; $port = nut_config('snmpaddr'); - $shutdownflag = (nut_config('powerdown') == 'on') ? '-p' : '-h'; + $shutdownflag = (nut_config('powerdown') == 'on') ? '-p' : '-h'; $snmpmib = nut_config('snmpmib'); $snmpversion = nut_config('snmpversion'); $snmpcommunity = nut_config('snmpcommunity'); @@ -382,8 +375,9 @@ EOD; $custom_upsdusers = str_replace(";", "\n", nut_config('custom_upsdusers')); $custom_upsmonconf = str_replace(";", "\n", nut_config('custom_upsmonconf')); - if(!($name && $driver && $port)) + if (!($name && $driver && $port)) { return false; + } /* ups.conf */ $ups_conf = "user=root\n"; @@ -391,16 +385,21 @@ EOD; $ups_conf .= "[{$name}]\n"; $ups_conf .= "driver={$driver}\n"; $ups_conf .= "port={$port}\n"; - if($snmpmib) + if ($snmpmib) { $ups_conf .= "mibs={$snmpmib}\n"; - if($snmpversion) + } + if ($snmpversion) { $ups_conf .= "snmp_version={$snmpversion}\n"; - if($snmpcommunity) + } + if ($snmpcommunity) { $ups_conf .= "community={$snmpcommunity}\n"; - if($snmpfreq) + } + if ($snmpfreq) { $ups_conf .= "pollfreq={$snmpfreq}\n"; - if($snmpdisabletransfer) + } + if ($snmpdisabletransfer) { $ups_conf .= "notransferoids=true\n"; + } $ups_conf .= "{$custom_upsconf}"; /* upsd.conf */ @@ -413,13 +412,14 @@ EOD; $upsd_users = "[monuser]\n"; $upsd_users .= "password = {$password}\n"; $upsd_users .= "upsmon master\n"; - if($allowuser && $allowpass) { + if ($allowuser && $allowpass) { $upsd_users .= "\n[$allowuser]\n"; $upsd_users .= "password = $allowpass\n"; $upsd_users .= "upsmon master\n"; } $upsd_users .= "{$custom_upsdusers}"; + $pfs_version = substr(trim(file_get_contents("/etc/version")),0,3); if ($pfs_version == "2.1") $upsdrvctl = "/usr/local/libexec/nut/upsdrvctl"; else @@ -435,26 +435,26 @@ POWERDOWNFLAG /etc/killpower EOD; $stop = <<<EOD - if [ `pgrep upsmon | wc -l` != 0 ]; then + if [ `/bin/pgrep upsmon | /usr/bin/wc -l` != 0 ]; then echo stopping upsmon /usr/bin/killall upsmon - while [ `pgrep upsmon | wc -l` != 0 ]; do + while [ `/bin/pgrep upsmon | /usr/bin/wc -l` != 0 ]; do sleep 1 done fi - if [ `pgrep upsd | wc -l` != 0 ]; then + if [ `/bin/pgrep upsd | /usr/bin/wc -l` != 0 ]; then echo stopping upsd /usr/bin/killall upsd fi - if [ `pgrep {$driver} | wc -l` != 0 ]; then + if [ `/bin/pgrep {$driver} | /usr/bin/wc -l` != 0 ]; then echo stopping {$driver} {$upsdrvctl} stop fi sleep 1 - if [ `pgrep {$driver} | wc -l` != 0 ]; then + if [ `/bin/pgrep {$driver} | /usr/bin/wc -l` != 0 ]; then echo forcing {$driver} termination /usr/bin/killall {$driver} - while [ `pgrep {$driver} | wc -l` != 0 ]; do + while [ `/bin/pgrep {$driver} | /usr/bin/wc -l` != 0 ]; do sleep 1 done fi @@ -462,7 +462,7 @@ EOD; EOD; $start = <<<EOD -if [ `pgrep {$driver} | wc -l` != 0 ]; then +if [ `/bin/pgrep {$driver} | /usr/bin/wc -l` != 0 ]; then {$stop} fi {$port_set} @@ -485,8 +485,8 @@ EOD; nut_write_config(NUT_DIR.'/upsmon.conf', $upsmon_conf, 0640, 'uucp'); write_rcfile(array( 'file' => 'nut.sh', - 'start' => $start, - 'stop' => $stop + 'start' => $start, + 'stop' => $stop ) ); conf_mount_ro(); @@ -500,51 +500,49 @@ EOD; config_lock(); - nut_action('stop'); + stop_service("nut"); /* create state path */ - if(!is_dir('/var/db/nut')) { - mkdir('/var/db/nut'); - chmod('/var/db/nut', 0700); - chown('/var/db/nut', 'uucp'); - } + safe_mkdir("/var/db/nut", 0700); + chown('/var/db/nut', 'uucp'); - if(nut_config('monitor') == 'remote') + if (nut_config('monitor') == 'remote') { $return = sync_package_nut_remote(); - elseif(nut_config('monitor') == 'local') + } elseif (nut_config('monitor') == 'local') { $return = sync_package_nut_local(); - elseif(nut_config('monitor') == 'snmp') + } elseif (nut_config('monitor') == 'snmp') { $return = sync_package_nut_snmp(); + } - if($return && $_POST['monitor']) { + if ($return && $_POST['monitor']) { /* only start if changing settings as we have a startup script for system boot */ /* this prevents service from starting / stopping / starting on boot */ - - nut_notice('Starting service'); - nut_action('start'); - if((int)exec('pgrep upsmon | wc -l') == 0) - nut_notice('Service failed to start: check configuration'); - } elseif(!$return && file_exists(NUT_RCFILE)) { + log_error("[nut] INFO: Starting service"); + start_service("nut"); + if ((int)exec('/bin/pgrep upsmon | /usr/bin/wc -l') == 0) { + log_error("[nut] ERROR: Service failed to start: check configuration."); + } + } elseif (!$return && file_exists(NUT_RCFILE)) { /* no parameters user does not want nut running */ /* lets stop the service and remove the rc file */ - if(!nut_config('monitor')) - nut_notice('Service stopped: nut disabled'); - else - nut_notice('Service stopped: check configuration'); + if (!nut_config('monitor')) { + log_error("[nut] INFO: Service stopped: nut disabled"); + } else { + log_error("[nut] WARNING: Service stopped: check configuration."); + } conf_mount_rw(); - unlink(NUT_RCFILE); - unlink(NUT_DIR.'/upsmon.conf'); - /* might not always exist */ - @unlink(NUT_DIR.'/ups.conf'); - @unlink(NUT_DIR.'/upsd.conf'); - @unlink(NUT_DIR.'/upsd.users'); - exec('rm -rf /var/db/nut'); + unlink_if_exists(NUT_RCFILE); + unlink_if_exists(NUT_DIR.'/upsmon.conf'); + unlink_if_exists(NUT_DIR.'/ups.conf'); + unlink_if_exists(NUT_DIR.'/upsd.conf'); + unlink_if_exists(NUT_DIR.'/upsd.users'); + exec('/bin/rm -rf /var/db/nut'); conf_mount_ro(); } - + config_unlock(); } ?> |