diff options
-rw-r--r-- | packages/nut/nut.inc | 354 | ||||
-rw-r--r-- | packages/nut/nut.xml | 479 | ||||
-rw-r--r-- | packages/nut/status_nut.php | 94 | ||||
-rw-r--r-- | pkg_config.xml | 2 |
4 files changed, 928 insertions, 1 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&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 <br>(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 <br>(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(&$pkg); + </custom_php_command_before_form> + <custom_php_validation_command> + validate_form_nut($_POST, &$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> diff --git a/pkg_config.xml b/pkg_config.xml index 1e4b7a54..8b782afb 100644 --- a/pkg_config.xml +++ b/pkg_config.xml @@ -191,7 +191,7 @@ <status>ALPHA</status> <required_version>1.0</required_version> <maintainer>ryan@wgnrs.dynu.com</maintainer> - <config_file>http://www.pfsense.com/packages/config/nut.xml</config_file> + <config_file>http://www.pfsense.com/packages/config/nut/nut.xml</config_file> <configurationfile>nut.xml</configurationfile> <depends_on_package_base_url>ftp://ftp-mirror.internap.com/pub/FreeBSD/ports/i386/packages-6-stable/All/</depends_on_package_base_url> <depends_on_package>nut-2.0.5.tbz</depends_on_package> |