aboutsummaryrefslogtreecommitdiffstats
path: root/config/nut
diff options
context:
space:
mode:
Diffstat (limited to 'config/nut')
-rw-r--r--config/nut/nut.inc320
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();
}
?>