aboutsummaryrefslogtreecommitdiffstats
path: root/packages/nut
diff options
context:
space:
mode:
Diffstat (limited to 'packages/nut')
-rw-r--r--packages/nut/nut.inc354
-rw-r--r--packages/nut/nut.xml479
-rw-r--r--packages/nut/status_nut.php94
3 files changed, 927 insertions, 0 deletions
diff --git a/packages/nut/nut.inc b/packages/nut/nut.inc
new file mode 100644
index 00000000..defc8807
--- /dev/null
+++ b/packages/nut/nut.inc
@@ -0,0 +1,354 @@
+<?php
+/*
+ nut.inc
+ part of pfSense (http://www.pfsense.com/)
+
+ Copyright (C) 2007 Ryan Wagoner <ryan@wgnrs.dynu.com>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+ require_once("config.inc");
+ require_once("functions.inc");
+
+ /* Nut */
+
+ define('NUT_RCFILE', '/usr/local/etc/rc.d/nut.sh');
+ 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) {
+ global $config;
+ if($config['installedpackages']['nut']['config'][0]["{$name}"])
+ return $config['installedpackages']['nut']['config'][0]["{$name}"];
+ return null;
+ }
+
+ function nut_config_sub ($name,$len) {
+ global $config;
+ if(nut_config($name))
+ return substr(nut_config($name),0,strlen(nut_config($name))-$len);
+ 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.");
+ exit;
+ }
+ fwrite($conf, $text);
+ fclose($conf);
+ if($mask) chmod($file, $mask);
+ if($uid) chown($file, $uid);
+ }
+
+ function nut_validate_ip($ip) {
+ if(!eregi("^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$", $ip))
+ return false;
+ foreach(explode('.', $ip) as $sub)
+ if($sub < 0 || $sub > 256)
+ return false;
+ return true;
+ }
+
+ function before_form_nut($pkg) {
+ /* return available serial ports */
+ $handle = popen('dmesg | grep \'^sio[0-9]: type\'','r');
+ $read = fread($handle, 2096);
+ pclose($handle);
+
+ /* explode at the newlines */
+ $read = explode("\n",$read);
+
+ /* parse resulting text */
+ foreach($read as $line) {
+ if($line!= '') {
+ $names[] = 'ttyd'.$line{3}.' (COM'.($line{3}+1).')';
+ $values[] = '/dev/ttyd'.$line{3};
+ }
+ }
+
+ /* find correct field */
+ $i = 0;
+ foreach ($pkg['fields']['field'] as $field) {
+ if ($field['fieldname'] == 'port')
+ break;
+ $i++;
+ }
+ $field = &$pkg['fields']['field'][$i];
+
+ /* add available serial ports */
+ 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'])
+ $input_errors[] = 'You must specify a name in the \'Remote Name\' field';
+ if(!$post['remoteaddr'] || !nut_validate_ip($post['remoteaddr']))
+ $input_errors[] = 'You must specify a valid address \'Remote Address\' field';
+ if(!$post['remoteuser'])
+ $input_errors[] = 'You must specify a name in the \'Remote User\' field';
+ if(!$post['remotepass'])
+ $input_errors[] = 'You must specify a name in the \'Remote Password\' field';
+ }
+
+ /* monitor local validation */
+ elseif($post['monitor'] == 'local') {
+ if(!$post['name'])
+ $input_errors[] = 'You must specify a name in the \'Name\' field';
+ if(!$post['driver'])
+ $input_errors[] = 'You must select a driver in the \'Driver\' field';
+ if(!$post['port'])
+ $input_errors[] = 'You must select a port in the \'Port\' field';
+ }
+
+ /* this is run before the config file changed */
+ /* so we can unassign the existing port */
+ if(nut_config('monitor') == 'local' && count($input_errors) == 0) {
+ $port = nut_config('port');
+ $driver = nut_config_sub('driver', 2);
+
+ if($port && $driver) {
+ nut_action('stop');
+
+ if($port != 'auto')
+ chown($port, 'root');
+ }
+ }
+ }
+
+ function deinstall_package_nut() {
+ nut_action('stop');
+
+ @unlink(NUT_RCFILE);
+ @unlink(NUT_DIR.'/upsmon.conf');
+ @unlink(NUT_DIR.'/ups.conf');
+ @unlink(NUT_DIR.'/upsd.conf');
+ @unlink(NUT_DIR.'/upsd.users');
+
+ exec('rm -rf /var/db/nut');
+
+ /*exec("pkg_delete nut-usb-2.0.5");
+ exec("pkg_delete nut-2.0.5");*/
+ }
+
+ function sync_package_nut_remote() {
+ $remotename = nut_config('remotename');
+ $remoteaddr = nut_config('remoteaddr');
+ $remoteuser = nut_config('remoteuser');
+ $remotepass = nut_config('remotepass');
+
+ if(!($remotename && $remoteaddr && $remoteuser && $remotepass))
+ return false;
+
+ /* upsmon.conf */
+ $upsmon_conf = <<<EOD
+MONITOR {$remotename}@{$remoteaddr} 1 {$remoteuser} {$remotepass} slave
+MINSUPPLIES 1
+SHUTDOWNCMD "/sbin/shutdown -h +0"
+POWERDOWNFLAG /etc/killpower
+EOD;
+
+ $stop = <<<EOD
+if [ `pgrep upsmon | wc -l` != 0 ]; then
+ /usr/bin/killall upsmon
+ while [ `pgrep upsmon | wc -l` != 0 ]; do
+ sleep 1
+ done
+ fi
+EOD;
+
+ $start = $stop."\n\t/usr/local/sbin/upsmon {$remotename}@{$remoteaddr}\n";
+
+ /* write out configuration */
+ conf_mount_rw();
+ nut_write_config(NUT_DIR.'/upsmon.conf', $upsmon_conf, 0640, 'uucp');
+ write_rcfile(array(
+ 'file' => 'nut.sh',
+ 'start' => $start,
+ 'stop' => $stop
+ )
+ );
+ conf_mount_ro();
+
+ return true;
+ }
+
+ function sync_package_nut_local() {
+ $name = nut_config('name');
+ $driver = nut_config_sub('driver', 2);
+ $port = nut_config('port');
+ $upstype = nut_config_sub('upstype', 3);
+ $cable = nut_config_sub('cable', 3);
+ $allowaddr = nut_config('allowaddr');
+ $allowuser = nut_config('allowuser');
+ $allowpass = nut_config('allowpass');
+
+ if(!($name && $driver && $port))
+ return false;
+
+ if($port != 'auto')
+ chown($port, 'uucp');
+
+ /* ups.conf */
+ if($port == 'auto')
+ $ups_conf = "user=root\n";
+ $ups_conf .= "[{$name}]\n";
+ $ups_conf .= "driver={$driver}\n";
+ $ups_conf .= "port={$port}\n";
+ if($cable)
+ $ups_conf .= "cable={$cable}\n";
+ if($upstype)
+ $ups_conf .= "upstype={$upstype}\n";
+
+ /* upsd.conf */
+ $upsd_conf = "ACL all 0.0.0.0/0\n";
+ $upsd_conf .= "ACL localhost 127.0.0.1/32\n";
+ if($allowaddr && $allowuser) {
+ $upsd_conf .= "ACL remote {$allowaddr}\n";
+ $upsd_conf .= "ACCEPT remote\n";
+ }
+ $upsd_conf .= "ACCEPT localhost\n";
+ $upsd_conf .= "REJECT all\n";
+
+ /* upsd.users */
+ $upsd_users = "[monuser]\n";
+ $upsd_users .= "password = mypass\n";
+ $upsd_users .= "allowfrom = localhost\n";
+ $upsd_users .= "upsmon master\n";
+ if($allowaddr && $allowuser) {
+ $upsd_users .= "\n[$allowuser]\n";
+ $upsd_users .= "password = $allowpass\n";
+ $upsd_users .= "allowfrom = remote\n";
+ $upsd_users .= "upsmon master\n";
+ }
+
+ /* upsmon.conf */
+ $upsmon_conf = <<<EOD
+MONITOR {$name}@localhost 1 monuser mypass master
+MINSUPPLIES 1
+SHUTDOWNCMD "/sbin/shutdown -h +0"
+POWERDOWNFLAG /etc/killpower
+EOD;
+
+ $stop = <<<EOD
+/usr/bin/killall upsmon
+ sleep 1
+ /usr/bin/killall upsd
+ /usr/local/libexec/nut/upsdrvctl stop
+ while [ `pgrep {$driver} | wc -l` != 0 ]; do
+ sleep 1
+ killall {$driver}
+ done
+EOD;
+
+ $start = <<<EOD
+if [ `pgrep {$driver} | wc -l` != 0 ]; then
+ {$stop}
+ fi
+ if /usr/local/libexec/nut/upsdrvctl start; then
+ /usr/local/sbin/upsd
+ /usr/local/sbin/upsmon {$name}@localhost
+ fi
+EOD;
+
+ /* write out configuration */
+ conf_mount_rw();
+ nut_write_config(NUT_DIR.'/ups.conf', $ups_conf);
+ nut_write_config(NUT_DIR.'/upsd.conf', $upsd_conf, 0640, 'uucp');
+ nut_write_config(NUT_DIR.'/upsd.users', $upsd_users, 0640, 'uucp');
+ nut_write_config(NUT_DIR.'/upsmon.conf', $upsmon_conf, 0640, 'uucp');
+ write_rcfile(array(
+ 'file' => 'nut.sh',
+ 'start' => $start,
+ 'stop' => $stop
+ )
+ );
+ conf_mount_ro();
+
+ return true;
+ }
+
+ function sync_package_nut() {
+ global $config;
+ global $input_errors;
+
+ config_lock();
+
+ nut_action('stop');
+
+ /* create state path, might already exist */
+ @mkdir('/var/db/nut');
+ chmod('/var/db/nut', 0700);
+ chown('/var/db/nut', 'uucp');
+
+ if(nut_config('monitor') == 'remote')
+ $return = sync_package_nut_remote();
+ elseif(nut_config('monitor') == 'local')
+ $return = sync_package_nut_local();
+
+ 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)) {
+ /* 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');
+
+ 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');
+ conf_mount_ro();
+ }
+
+ config_unlock();
+ }
+?>
diff --git a/packages/nut/nut.xml b/packages/nut/nut.xml
new file mode 100644
index 00000000..92d5ec09
--- /dev/null
+++ b/packages/nut/nut.xml
@@ -0,0 +1,479 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<packagegui>
+ <title>Services: NUT</title>
+ <name>nut</name>
+ <version>2.0.5</version>
+ <savetext>Change</savetext>
+ <include_file>/usr/local/pkg/nut.inc</include_file>
+ <aftersaveredirect>/status_nut.php</aftersaveredirect>
+ <menu>
+ <name>NUT</name>
+ <tooltiptext>Set Network UPS Tools settings.</tooltiptext>
+ <section>Services</section>
+ <url>/status_nut.php</url>
+ </menu>
+ <additional_files_needed>
+ <item>http://www.pfsense.com/packages/config/nut/nut.inc</item>
+ <prefix>/usr/local/pkg/</prefix>
+ <chmod>0755</chmod>
+ </additional_files_needed>
+ <additional_files_needed>
+ <item>http://www.pfsense.com/packages/config/nut/status_nut.php</item>
+ <prefix>/usr/local/www/</prefix>
+ <chmod>0755</chmod>
+ </additional_files_needed>
+ <service>
+ <name>nut</name>
+ <rcfile>nut.sh</rcfile>
+ <executable>upsmon</executable>
+ </service>
+ <tabs>
+ <tab>
+ <text>NUT Status</text>
+ <url>/status_nut.php</url>
+ </tab>
+ <tab>
+ <text>NUT Settings</text>
+ <url>/pkg_edit.php?xml=nut.xml&amp;id=0</url>
+ <active/>
+ </tab>
+ </tabs>
+ <fields>
+ <field>
+ <fielddescr>UPS Monitoring</fielddescr>
+ <fieldname>monitor</fieldname>
+ <type>select</type>
+ <required/>
+ <options>
+ <option>
+ <name>Disabled</name>
+ <value></value>
+ </option>
+ <option>
+ <name>Local UPS</name>
+ <value>local</value>
+ </option>
+ <option>
+ <name>Remote UPS</name>
+ <value>remote</value>
+ </option>
+ </options>
+ </field>
+ <field>
+ <fielddescr>Local UPS Name</fielddescr>
+ <fieldname>name</fieldname>
+ <type>input</type>
+ </field>
+ <field>
+ <fielddescr>Local UPS Model</fielddescr>
+ <fieldname>driver</fieldname>
+ <type>select</type>
+ <options>
+ <option>
+ <name>APC Back-UPS (Generic/Cable)</name>
+ <value>genericups00</value>
+ </option>
+ <option>
+ <name>APC Back-UPS RS (Generic/Cable)</name>
+ <value>genericups02</value>
+ </option>
+ <option>
+ <name>APC Back-UPS Pro (Cable)</name>
+ <value>apcsmart00</value>
+ </option>
+ <option>
+ <name>APC Smart-UPS (Cable)</name>
+ <value>apcsmart01</value>
+ </option>
+ <option>
+ <name>APC Matrix-UPS</name>
+ <value>apcsmart02</value>
+ </option>
+ <option>
+ <name>APC Masterswitch (Generic/Cable)</name>
+ <value>genericups01</value>
+ </option>
+ <option>
+ <name>APC Back-UPS USB</name>
+ <value>newhidups03</value>
+ </option>
+ <option>
+ <name>APC Back-UPS LS USB</name>
+ <value>newhidups00</value>
+ </option>
+ <option>
+ <name>APC Back-UPS ES USB</name>
+ <value>newhidups01</value>
+ </option>
+ <option>
+ <name>APC Back-UPS Pro USB</name>
+ <value>newhidups02</value>
+ </option>
+ <option>
+ <name>APC Smart-UPS USB</name>
+ <value>newhidups03</value>
+ </option>
+ <option>
+ <name>Belkin Regulator Pro</name>
+ <value>belkin00</value>
+ </option>
+ <option>
+ <name>Belkin Universal UPS</name>
+ <value>belkinunv00</value>
+ </option>
+ <option>
+ <name>Belkin Universal UPS USB</name>
+ <value>newhidups04</value>
+ </option>
+ <option>
+ <name>Best Power Fortress</name>
+ <value>bestups00</value>
+ </option>
+ <option>
+ <name>Best Power Fortress Telecom</name>
+ <value>bestups01</value>
+ </option>
+ <option>
+ <name>Best Power Axxium Rackmount</name>
+ <value>bestups02</value>
+ </option>
+ <option>
+ <name>Best Power Patriot Pro</name>
+ <value>bestups03</value>
+ </option>
+ <option>
+ <name>Best Power Patriot (Generic/Cable)</name>
+ <value>genericups03</value>
+ </option>
+ <option>
+ <name>Best Power Micro-Ferrups</name>
+ <value>bestuferrups00</value>
+ </option>
+ <option>
+ <name>Best Power Fortress/Ferrups</name>
+ <value>bestfcom00</value>
+ </option>
+ <option>
+ <name>Cyber Power Systems 320AVR</name>
+ <value>cyberpower00</value>
+ </option>
+ <option>
+ <name>Cyber Power Systems 500AVR</name>
+ <value>cyberpower01</value>
+ </option>
+ <option>
+ <name>Cyber Power Systems 650AVR</name>
+ <value>cyberpower02</value>
+ </option>
+ <option>
+ <name>Cyber Power Systems 700AVR</name>
+ <value>cyberpower03</value>
+ </option>
+ <option>
+ <name>Cyber Power Systems 800AVR</name>
+ <value>cyberpower04</value>
+ </option>
+ <option>
+ <name>Cyber Power Systems 850AVR</name>
+ <value>cyberpower05</value>
+ </option>
+ <option>
+ <name>Cyber Power Systems 900AVR</name>
+ <value>cyberpower06</value>
+ </option>
+ <option>
+ <name>Cyber Power Systems 1250AVR</name>
+ <value>cyberpower07</value>
+ </option>
+ <option>
+ <name>Cyber Power Systems 1500AVR</name>
+ <value>cyberpower08</value>
+ </option>
+ <option>
+ <name>Meta System HF Line</name>
+ <value>metasys00</value>
+ </option>
+ <option>
+ <name>Meta System HF Millennium</name>
+ <value>metasys01</value>
+ </option>
+ <option>
+ <name>Meta System HF TOP Line</name>
+ <value>metasys02</value>
+ </option>
+ <option>
+ <name>Meta System ECO Network</name>
+ <value>metasys03</value>
+ </option>
+ <option>
+ <name>Meta System ECO</name>
+ <value>metasys04</value>
+ </option>
+ <option>
+ <name>Meta System ally HF</name>
+ <value>metasys05</value>
+ </option>
+ <option>
+ <name>Meta System Megaline</name>
+ <value>metasys06</value>
+ </option>
+ <option>
+ <name>MGE UPS SYSTEMS NOVA AVR</name>
+ <value>mge-shut00</value>
+ </option>
+ <option>
+ <name>MGE UPS SYSTEMS Pulsar Ellipse</name>
+ <value>mge-shut01</value>
+ </option>
+ <option>
+ <name>MGE UPS SYSTEMS Ellipse Office</name>
+ <value>mge-shut02</value>
+ </option>
+ <option>
+ <name>MGE UPS SYSTEMS Pulsar EXtreme</name>
+ <value>mge-shut03</value>
+ </option>
+ <option>
+ <name>MGE UPS SYSTEMS Comet</name>
+ <value>mge-shut04</value>
+ </option>
+ <option>
+ <name>MGE UPS SYSTEMS Pulsar Esprit</name>
+ <value>mge-shut05</value>
+ </option>
+ <option>
+ <name>MGE UPS SYSTEMS Evolution</name>
+ <value>mge-shut06</value>
+ </option>
+ <option>
+ <name>MGE UPS SYSTEMS Comet USB</name>
+ <value>newhidups05</value>
+ </option>
+ <option>
+ <name>MGE UPS SYSTEMS Protection Center USB</name>
+ <value>newhidups06</value>
+ </option>
+ <option>
+ <name>MGE UPS SYSTEMS NOVA AVR USB</name>
+ <value>newhidups07</value>
+ </option>
+ <option>
+ <name>MGE UPS SYSTEMS Pulsar Ellipse USB</name>
+ <value>newhidups08</value>
+ </option>
+ <option>
+ <name>MGE UPS SYSTEMS Ellipse Office USB</name>
+ <value>newhidups09</value>
+ </option>
+ <option>
+ <name>MGE UPS SYSTEMS Pulsar Evolution USB</name>
+ <value>newhidups10</value>
+ </option>
+ <option>
+ <name>MGE UPS SYSTEMS Evolution USB</name>
+ <value>newhidups11</value>
+ </option>
+ <option>
+ <name>MGE UPS SYSTEMS Pulsar USB</name>
+ <value>newhidups12</value>
+ </option>
+ <option>
+ <name>MicroDowell B.Box BP</name>
+ <value>cpsups00</value>
+ </option>
+ <option>
+ <name>Microsol Solis</name>
+ <value>solis00</value>
+ </option>
+ <option>
+ <name>Microsol Rhino</name>
+ <value>rhino00</value>
+ </option>
+ <option>
+ <name>Mustek Various</name>
+ <value>megatec00</value>
+ </option>
+ <option>
+ <name>Mustek Powermust</name>
+ <value>megatec01</value>
+ </option>
+ <option>
+ <name>Mustek Powermust USB</name>
+ <value>megatec02</value>
+ </option>
+ <option>
+ <name>Tripp-Lite SmartUPS</name>
+ <value>tripplite00</value>
+ </option>
+ <option>
+ <name>Tripp-Lite SmartOnline</name>
+ <value>tripplitesu00</value>
+ </option>
+ <option>
+ <name>Tripp-Lite OMNIVUS USB</name>
+ <value>tripplite_usb00</value>
+ </option>
+ <option>
+ <name>Tripp-Lite SMART USB</name>
+ <value>tripplite_usb01</value>
+ </option>
+ </options>
+ </field>
+ <field>
+ <fielddescr>Local UPS Port</fielddescr>
+ <fieldname>port</fieldname>
+ <type>select</type>
+ <options>
+ <option>
+ <name>auto (USB only)</name>
+ <value>auto</value>
+ </option>
+ </options>
+ </field>
+ <field>
+ <fielddescr>Local UPS Generic Type (optional)</fielddescr>
+ <fieldname>upstype</fieldname>
+ <type>select</type>
+ <options>
+ <option>
+ <value></value>
+ <name></name>
+ </option>
+ <option>
+ <value>1 00</value>
+ <name>1 (APC Back-UPS)</name>
+ </option>
+ <option>
+ <value>2 00</value>
+ <name>2 (APC Back-UPS)</name>
+ </option>
+ <option>
+ <value>9 00</value>
+ <name>9 (APC Back-UPS)</name>
+ </option>
+ <option>
+ <value>12 00</value>
+ <name>12 (APC Back-UPS Office)</name>
+ </option>
+ <option>
+ <value>12 01</value>
+ <name>12 (APC Masterswitch)</name>
+ </option>
+ <option>
+ <value>20 00</value>
+ <name>20 (APC Back-UPS RS)</name>
+ </option>
+ <option>
+ <value>6 00</value>
+ <name>6 (Best Power Patriot)</name>
+ </option>
+ </options>
+ </field>
+ <field>
+ <fielddescr>Local UPS Cable Type (optional)</fielddescr>
+ <fieldname>cable</fieldname>
+ <type>select</type>
+ <options>
+ <option>
+ <value></value>
+ <name></name>
+ </option>
+ <option>
+ <value>940-0020B 00</value>
+ <name>940-0020B (APC Back-Ups - Simple Signalling - Gray Cable)</name>
+ </option>
+ <option>
+ <value>940-0020C 00</value>
+ <name>940-0020C (APC Back-Ups - Simple Signalling)</name>
+ </option>
+ <option>
+ <value>940-0023A 00</value>
+ <name>940-0023A (APC Back-Ups - Simple Signalling)</name>
+ </option>
+ <option>
+ <value>940-0119A 00</value>
+ <name>940-0119A (APC Back-Ups Office - Simple Signalling - Phone Jack Cable)</name>
+ </option>
+ <option>
+ <value>940-0095A 00</value>
+ <name>940-0095A (APC Back-Ups Pro - Smart Signalling)</name>
+ </option>
+ <option>
+ <value>940-0095B 00</value>
+ <name>940-0095B (APC Back-Ups Pro - Smart Signalling - Gray Cable)</name>
+ </option>
+ <option>
+ <value>940-0095C 00</value>
+ <name>940-0095C (APC Back-Ups Pro - Smart Signalling)</name>
+ </option>
+ <option>
+ <value>940-0024B 00</value>
+ <name>940-0024B (APC Smart-Ups - Smart Signalling)</name>
+ </option>
+ <option>
+ <value>940-0024C 00</value>
+ <name>940-0024C (APC Smart-Ups - Smart Signalling - Black Cable)</name>
+ </option>
+ <option>
+ <value>940-0024G 00</value>
+ <name>940-0024G (APC Smart-Ups - Smart Signalling)</name>
+ </option>
+ <option>
+ <value>940-0020 00</value>
+ <name>940-0020 (APC Masterswitch - Simple Signalling - Gray Cable)</name>
+ </option>
+ <option>
+ <value>INT51 00</value>
+ <name>INT51 (Best Power Patriot)</name>
+ </option>
+ </options>
+ </field>
+ <field>
+ <fielddescr>Local Remote Access Address &lt;br&gt;(ex: 192.168.1.0/24) (optional)</fielddescr>
+ <fieldname>allowaddr</fieldname>
+ <type>input</type>
+ </field>
+ <field>
+ <fielddescr>Local Remote Access User (optional)</fielddescr>
+ <fieldname>allowuser</fieldname>
+ <type>input</type>
+ </field>
+ <field>
+ <fielddescr>Local Remote Acces Password (optional)</fielddescr>
+ <fieldname>allowpass</fieldname>
+ <type>password</type>
+ </field>
+ <field>
+ <fielddescr>Remote UPS Name</fielddescr>
+ <fieldname>remotename</fieldname>
+ <type>input</type>
+ </field>
+ <field>
+ <fielddescr>Remote UPS Address &lt;br&gt;(ex: 192.168.1.10)</fielddescr>
+ <fieldname>remoteaddr</fieldname>
+ <type>input</type>
+ </field>
+ <field>
+ <fielddescr>Remote UPS User</fielddescr>
+ <fieldname>remoteuser</fieldname>
+ <type>input</type>
+ </field>
+ <field>
+ <fielddescr>Remote UPS Password</fielddescr>
+ <fieldname>remotepass</fieldname>
+ <type>password</type>
+ </field>
+ </fields>
+ <custom_php_command_before_form>
+ before_form_nut(&amp;$pkg);
+ </custom_php_command_before_form>
+ <custom_php_validation_command>
+ validate_form_nut($_POST, &amp;$input_errors);
+ </custom_php_validation_command>
+ <custom_php_resync_config_command>
+ sync_package_nut();
+ </custom_php_resync_config_command>
+ <custom_php_deinstall_command>
+ deinstall_package_nut();
+ </custom_php_deinstall_command>
+</packagegui>
diff --git a/packages/nut/status_nut.php b/packages/nut/status_nut.php
new file mode 100644
index 00000000..2a7c800d
--- /dev/null
+++ b/packages/nut/status_nut.php
@@ -0,0 +1,94 @@
+<?php
+/*
+ status_nut.php
+ part of pfSense (http://www.pfsense.com/)
+
+ Copyright (C) 2006 Ryan Wagoner <ryan@wgnrs.dynu.com>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require("guiconfig.inc");
+
+$nut_config = $config['installedpackages']['nut']['config'][0];
+
+/* Defaults to this page but if no settings are present, redirect to setup page */
+if(!$nut_config['monitor'])
+ Header("Location: /pkg_edit.php?xml=nut.xml&id=0");
+
+$pgtitle = "Status: NUT Status";
+include("head.inc");
+/* put your custom HTML head content here */
+/* using some of the $pfSenseHead function calls */
+//$pfSenseHead->addMeta("<meta http-equiv=\"refresh\" content=\"120;url={$_SERVER['SCRIPT_NAME']}\" />");
+//echo $pfSenseHead->getHTML();
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<p class="pgtitle"><?=$pgtitle?></font></p>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+
+<div id="mainlevel">
+<table width="100%" border="0" cellpadding="0" cellspacing="0">
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("NUT Status "), true, "/status_nut.php");
+ $tab_array[] = array(gettext("NUT Settings "), false, "/pkg_edit.php?xml=nut.xml&id=0");
+ display_top_tabs($tab_array);
+?>
+</table>
+<table width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td class="tabcont">
+<?php
+ if($nut_config['monitor'] == 'local') {
+ /* grab values from upsc */
+ $handle = popen("upsc {$nut_config['name']}@localhost","r");
+ $read = fread($handle, 4096);
+ pclose($handle);
+
+ /* parse upsc into array */
+ $read = explode("\n",$read);
+ $ups = array();
+ foreach($read as $line) {
+ $line = explode(':', $line);
+ $ups[$line[0]] = $line[1];
+ }
+
+ print("Status: {$ups['ups.status']}<br />");
+ print("Battery Charge: {$ups['battery.charge']}<br />");
+ print("Battery Voltage: {$ups['battery.voltage']}<br />");
+ print("Input Voltage: {$ups['input.voltage']}<br />");
+ print("Output Voltage: {$ups['output.voltage']}<br />");
+
+ /*print('<pre>'); print_r($ups); print('</pre>');*/
+ }
+?>
+ </td>
+ </tr>
+</table>
+</div>
+<?php include("fend.inc"); ?>
+</body>
+</html>