aboutsummaryrefslogtreecommitdiffstats
path: root/config/apcupsd
diff options
context:
space:
mode:
authorDanilo G. Baio (dbaio) <dbaio@bsd.com.br>2013-12-26 16:44:39 -0200
committerDanilo G. Baio (dbaio) <dbaio@bsd.com.br>2013-12-26 16:44:39 -0200
commitaf6e4bec14ca958e0c85c0819e4509b000f64e05 (patch)
tree1a66d5ecd84f60eac7a8430bc70dd87633c4bef1 /config/apcupsd
parent901c4c7a85e3056c5e86a0b19cfdccc1003f00ca (diff)
downloadpfsense-packages-af6e4bec14ca958e0c85c0819e4509b000f64e05.tar.gz
pfsense-packages-af6e4bec14ca958e0c85c0819e4509b000f64e05.tar.bz2
pfsense-packages-af6e4bec14ca958e0c85c0819e4509b000f64e05.zip
New package Apcupsd. A daemon for controlling APC UPSes.
Diffstat (limited to 'config/apcupsd')
-rw-r--r--config/apcupsd/apcupsd.conf.php362
-rw-r--r--config/apcupsd/apcupsd.inc191
-rw-r--r--config/apcupsd/apcupsd.xml333
-rwxr-xr-xconfig/apcupsd/apcupsd_status.php118
4 files changed, 1004 insertions, 0 deletions
diff --git a/config/apcupsd/apcupsd.conf.php b/config/apcupsd/apcupsd.conf.php
new file mode 100644
index 00000000..6a19b915
--- /dev/null
+++ b/config/apcupsd/apcupsd.conf.php
@@ -0,0 +1,362 @@
+<?php
+/*
+ apcupsd.conf.php
+ part of the apcupsd package for pfSense
+ Copyright (C) 2013 Danilo G. Baio <dbaio@bsd.com.br>
+ 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.
+
+*/
+
+// create apcupsd.conf
+$apcupsdconf=<<<EOF
+## apcupsd.conf v1.1 ##
+#
+# for apcupsd release 3.14.10 (13 September 2011) - freebsd
+#
+# "apcupsd" POSIX config file
+
+#
+# ========= General configuration parameters ============
+#
+
+# UPSNAME xxx
+# Use this to give your UPS a name in log files and such. This
+# is particulary useful if you have multiple UPSes. This does not
+# set the EEPROM. It should be 8 characters or less.
+UPSNAME {$upsname}
+
+# UPSCABLE <cable>
+# Defines the type of cable connecting the UPS to your computer.
+#
+# Possible generic choices for <cable> are:
+# simple, smart, ether, usb
+#
+# Or a specific cable model number may be used:
+# 940-0119A, 940-0127A, 940-0128A, 940-0020B,
+# 940-0020C, 940-0023A, 940-0024B, 940-0024C,
+# 940-1524C, 940-0024G, 940-0095A, 940-0095B,
+# 940-0095C, M-04-02-2000
+#
+UPSCABLE {$upscable}
+
+# To get apcupsd to work, in addition to defining the cable
+# above, you must also define a UPSTYPE, which corresponds to
+# the type of UPS you have (see the Description for more details).
+# You must also specify a DEVICE, sometimes referred to as a port.
+# For USB UPSes, please leave the DEVICE directive blank. For
+# other UPS types, you must specify an appropriate port or address.
+#
+# UPSTYPE DEVICE Description
+# apcsmart /dev/tty** Newer serial character device, appropriate for
+# SmartUPS models using a serial cable (not USB).
+#
+# usb <BLANK> Most new UPSes are USB. A blank DEVICE
+# setting enables autodetection, which is
+# the best choice for most installations.
+#
+# net hostname:port Network link to a master apcupsd through apcupsd's
+# Network Information Server. This is used if the
+# UPS powering your computer is connected to a
+# different computer for monitoring.
+#
+# snmp hostname:port:vendor:community
+# SNMP network link to an SNMP-enabled UPS device.
+# Hostname is the ip address or hostname of the UPS
+# on the network. Vendor can be can be "APC" or
+# "APC_NOTRAP". "APC_NOTRAP" will disable SNMP trap
+# catching; you usually want "APC". Port is usually
+# 161. Community is usually "private".
+#
+# netsnmp hostname:port:vendor:community
+# OBSOLETE
+# Same as SNMP above but requires use of the
+# net-snmp library. Unless you have a specific need
+# for this old driver, you should use 'snmp' instead.
+#
+# dumb /dev/tty** Old serial character device for use with
+# simple-signaling UPSes.
+#
+# pcnet ipaddr:username:passphrase:port
+# PowerChute Network Shutdown protocol which can be
+# used as an alternative to SNMP with the AP9617
+# family of smart slot cards. ipaddr is the IP
+# address of the UPS management card. username and
+# passphrase are the credentials for which the card
+# has been configured. port is the port number on
+# which to listen for messages from the UPS, normally
+# 3052. If this parameter is empty or missing, the
+# default of 3052 will be used.
+#
+UPSTYPE {$upstype}
+
+# POLLTIME <int>
+# Interval (in seconds) at which apcupsd polls the UPS for status. This
+# setting applies both to directly-attached UPSes (UPSTYPE apcsmart, usb,
+# dumb) and networked UPSes (UPSTYPE net, snmp). Lowering this setting
+# will improve apcupsd's responsiveness to certain events at the cost of
+# higher CPU utilization. The default of 60 is appropriate for most
+# situations.
+POLLTIME {$polltime}
+
+# LOCKFILE <path to lockfile>
+# Path for device lock file. Not used on Win32.
+LOCKFILE /var/spool/lock
+
+# SCRIPTDIR <path to script directory>
+# Directory in which apccontrol and event scripts are located.
+SCRIPTDIR /usr/local/etc/apcupsd
+
+# PWRFAILDIR <path to powerfail directory>
+# Directory in which to write the powerfail flag file. This file
+# is created when apcupsd initiates a system shutdown and is
+# checked in the OS halt scripts to determine if a killpower
+# (turning off UPS output power) is required.
+PWRFAILDIR /var/run
+
+# NOLOGINDIR <path to nologin directory>
+# Directory in which to write the nologin file. The existence
+# of this flag file tells the OS to disallow new logins.
+NOLOGINDIR /var/run
+
+
+#
+# ======== Configuration parameters used during power failures ==========
+#
+
+# The ONBATTERYDELAY is the time in seconds from when a power failure
+# is detected until we react to it with an onbattery event.
+#
+# This means that, apccontrol will be called with the powerout argument
+# immediately when a power failure is detected. However, the
+# onbattery argument is passed to apccontrol only after the
+# ONBATTERYDELAY time. If you don't want to be annoyed by short
+# powerfailures, make sure that apccontrol powerout does nothing
+# i.e. comment out the wall.
+ONBATTERYDELAY {$onbatterydelay}
+
+#
+# Note: BATTERYLEVEL, MINUTES, and TIMEOUT work in conjunction, so
+# the first that occurs will cause the initation of a shutdown.
+#
+
+# If during a power failure, the remaining battery percentage
+# (as reported by the UPS) is below or equal to BATTERYLEVEL,
+# apcupsd will initiate a system shutdown.
+BATTERYLEVEL {$batterylevel}
+
+# If during a power failure, the remaining runtime in minutes
+# (as calculated internally by the UPS) is below or equal to MINUTES,
+# apcupsd, will initiate a system shutdown.
+MINUTES {$minutes}
+
+# If during a power failure, the UPS has run on batteries for TIMEOUT
+# many seconds or longer, apcupsd will initiate a system shutdown.
+# A value of 0 disables this timer.
+#
+# Note, if you have a Smart UPS, you will most likely want to disable
+# this timer by setting it to zero. That way, you UPS will continue
+# on batteries until either the % charge remaing drops to or below BATTERYLEVEL,
+# or the remaining battery runtime drops to or below MINUTES. Of course,
+# if you are testing, setting this to 60 causes a quick system shutdown
+# if you pull the power plug.
+# If you have an older dumb UPS, you will want to set this to less than
+# the time you know you can run on batteries.
+TIMEOUT {$timeout}
+
+# Time in seconds between annoying users to signoff prior to
+# system shutdown. 0 disables.
+ANNOY {$annoy}
+
+# Initial delay after power failure before warning users to get
+# off the system.
+ANNOYDELAY {$annoydelay}
+
+# The condition which determines when users are prevented from
+# logging in during a power failure.
+# NOLOGON <string> [ disable | timeout | percent | minutes | always ]
+NOLOGON disable
+
+# If KILLDELAY is non-zero, apcupsd will continue running after a
+# shutdown has been requested, and after the specified time in
+# seconds attempt to kill the power. This is for use on systems
+# where apcupsd cannot regain control after a shutdown.
+# KILLDELAY <seconds> 0 disables
+KILLDELAY {$killdelay}
+
+#
+# ==== Configuration statements for Network Information Server ====
+#
+
+# NETSERVER [ on | off ] on enables, off disables the network
+# information server. If netstatus is on, a network information
+# server process will be started for serving the STATUS and
+# EVENT data over the network (used by CGI programs).
+NETSERVER {$netserver}
+
+# NISIP <dotted notation ip address>
+# IP address on which NIS server will listen for incoming connections.
+# This is useful if your server is multi-homed (has more than one
+# network interface and IP address). Default value is 0.0.0.0 which
+# means any incoming request will be serviced. Alternatively, you can
+# configure this setting to any specific IP address of your server and
+# NIS will listen for connections only on that interface. Use the
+# loopback address (127.0.0.1) to accept connections only from the
+# local machine.
+NISIP ${nisip}
+
+# NISPORT <port> default is 3551 as registered with the IANA
+# port to use for sending STATUS and EVENTS data over the network.
+# It is not used unless NETSERVER is on. If you change this port,
+# you will need to change the corresponding value in the cgi directory
+# and rebuild the cgi programs.
+NISPORT ${nisport}
+
+# If you want the last few EVENTS to be available over the network
+# by the network information server, you must define an EVENTSFILE.
+EVENTSFILE /var/log/apcupsd.events
+
+# EVENTSFILEMAX <kilobytes>
+# By default, the size of the EVENTSFILE will be not be allowed to exceed
+# 10 kilobytes. When the file grows beyond this limit, older EVENTS will
+# be removed from the beginning of the file (first in first out). The
+# parameter EVENTSFILEMAX can be set to a different kilobyte value, or set
+# to zero to allow the EVENTSFILE to grow without limit.
+EVENTSFILEMAX 10
+
+#
+# ========== Configuration statements used if sharing =============
+# a UPS with more than one machine
+
+#
+# Remaining items are for ShareUPS (APC expansion card) ONLY
+#
+
+# UPSCLASS [ standalone | shareslave | sharemaster ]
+# Normally standalone unless you share an UPS using an APC ShareUPS
+# card.
+UPSCLASS {$upsclass}
+
+# UPSMODE [ disable | share ]
+# Normally disable unless you share an UPS using an APC ShareUPS card.
+UPSMODE {$upsmode}
+
+#
+# ===== Configuration statements to control apcupsd system logging ========
+#
+
+# Time interval in seconds between writing the STATUS file; 0 disables
+STATTIME 0
+
+# Location of STATUS file (written to only if STATTIME is non-zero)
+STATFILE /var/log/apcupsd.status
+
+# LOGSTATS [ on | off ] on enables, off disables
+# Note! This generates a lot of output, so if
+# you turn this on, be sure that the
+# file defined in syslog.conf for LOG_NOTICE is a named pipe.
+# You probably do not want this on.
+LOGSTATS off
+
+# Time interval in seconds between writing the DATA records to
+# the log file. 0 disables.
+DATATIME 0
+
+# FACILITY defines the logging facility (class) for logging to syslog.
+# If not specified, it defaults to "daemon". This is useful
+# if you want to separate the data logged by apcupsd from other
+# programs.
+#FACILITY DAEMON
+
+#
+# ========== Configuration statements used in updating the UPS EPROM =========
+#
+
+#
+# These statements are used only by apctest when choosing "Set EEPROM with conf
+# file values" from the EEPROM menu. THESE STATEMENTS HAVE NO EFFECT ON APCUPSD.
+#
+
+# UPS name, max 8 characters
+#UPSNAME UPS_IDEN
+
+# Battery date - 8 characters
+#BATTDATE mm/dd/yy
+
+# Sensitivity to line voltage quality (H cause faster transfer to batteries)
+# SENSITIVITY H M L (default = H)
+#SENSITIVITY H
+
+# UPS delay after power return (seconds)
+# WAKEUP 000 060 180 300 (default = 0)
+#WAKEUP 60
+
+# UPS Grace period after request to power off (seconds)
+# SLEEP 020 180 300 600 (default = 20)
+#SLEEP 180
+
+# Low line voltage causing transfer to batteries
+# The permitted values depend on your model as defined by last letter
+# of FIRMWARE or APCMODEL. Some representative values are:
+# D 106 103 100 097
+# M 177 172 168 182
+# A 092 090 088 086
+# I 208 204 200 196 (default = 0 => not valid)
+#LOTRANSFER 208
+
+# High line voltage causing transfer to batteries
+# The permitted values depend on your model as defined by last letter
+# of FIRMWARE or APCMODEL. Some representative values are:
+# D 127 130 133 136
+# M 229 234 239 224
+# A 108 110 112 114
+# I 253 257 261 265 (default = 0 => not valid)
+#HITRANSFER 253
+
+# Battery charge needed to restore power
+# RETURNCHARGE 00 15 50 90 (default = 15)
+#RETURNCHARGE 15
+
+# Alarm delay
+# 0 = zero delay after pwr fail, T = power fail + 30 sec, L = low battery, N = never
+# BEEPSTATE 0 T L N (default = 0)
+#BEEPSTATE T
+
+# Low battery warning delay in minutes
+# LOWBATT 02 05 07 10 (default = 02)
+#LOWBATT 2
+
+# UPS Output voltage when running on batteries
+# The permitted values depend on your model as defined by last letter
+# of FIRMWARE or APCMODEL. Some representative values are:
+# D 115
+# M 208
+# A 100
+# I 230 240 220 225 (default = 0 => not valid)
+#OUTPUTVOLTS 230
+
+# Self test interval in hours 336=2 weeks, 168=1 week, ON=at power on
+# SELFTEST 336 168 ON OFF (default = 336)
+#SELFTEST 336
+EOF;
+?>
diff --git a/config/apcupsd/apcupsd.inc b/config/apcupsd/apcupsd.inc
new file mode 100644
index 00000000..9abc23ba
--- /dev/null
+++ b/config/apcupsd/apcupsd.inc
@@ -0,0 +1,191 @@
+<?php
+/* $Id$ */
+/* ========================================================================== */
+/*
+ apcupsd.inc
+ part of the apcupsd package for pfSense
+ Copyright (C) 2013 Danilo G. Baio <dbaio@bsd.com.br>
+
+ 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("util.inc");
+require_once("functions.inc");
+require_once("pkg-utils.inc");
+require_once("globals.inc");
+
+function php_install_apcupsd(){
+ sync_package_apcupsd();
+}
+
+function php_deinstall_apcupsd(){
+ global $config, $g;
+
+ conf_mount_rw();
+ $pfs_version = substr(trim(file_get_contents("/etc/version")),0,3);
+ if ($pfs_version > 2.0){
+ define('APCUPSD_BASE', '/usr/pbi/apcupsd-' . php_uname("m"));
+ } else {
+ define('APCUPSD_BASE', '/usr/local');
+ }
+
+ exec("/usr/bin/killall apcupsd");
+ unlink_if_exists(APCUPSD_BASE . "/etc/rc.d/apcupsd.sh");
+ unlink_if_exists(APCUPSD_BASE . "/etc/apcupsd/apcupsd.conf");
+ unlink_if_exists("/var/log/apcupsd/apcupsd.log");
+ unlink_if_exists("/var/run/apcupsd/apcupsd.pid");
+
+ if (is_dir("/var/log/apcupsd"))
+ exec("/bin/rm -r /var/log/apcupsd/");
+ if (is_dir("/var/run/apcupsd"))
+ exec("/bin/rm -r /var/run/apcupsd/");
+
+ conf_mount_ro();
+}
+
+function validate_input_apcupsd($post,&$input_errors){
+
+ if (isset($post['apcupsdenabled'])){
+
+ if ($post['polltime'] != '' && !is_numericint($post['polltime'])) {
+ $input_errors[]='Poll Time is not numeric.';
+ }
+
+ if ($post['onbatterydelay'] != '' && !is_numericint($post['onbatterydelay'])) {
+ $input_errors[]='OnBattery Delay is not numeric.';
+ }
+
+ if ($post['batterylevel'] != '' && !is_numericint($post['batterylevel'])) {
+ $input_errors[]='Battery Level is not numeric.';
+ }
+
+ if ($post['minutes'] != '' && !is_numericint($post['minutes'])) {
+ $input_errors[]='Minutes is not numeric.';
+ }
+
+ if ($post['timeout'] != '' && !is_numericint($post['timeout'])) {
+ $input_errors[]='Timeout is not numeric.';
+ }
+
+ if ($post['annoy'] != '' && !is_numericint($post['annoy'])) {
+ $input_errors[]='Annoy is not numeric.';
+ }
+
+ if ($post['annoydelay'] != '' && !is_numericint($post['annoydelay'])) {
+ $input_errors[]='Annoy Delay is not numeric.';
+ }
+
+ if ($post['killdelay'] != '' && !is_numericint($post['killdelay'])) {
+ $input_errors[]='Kill Delay is not numeric.';
+ }
+
+ if ($post['nisip'] != '') {
+ if (!is_ipaddr_configured($post['nisip']) && !preg_match("/(127.0.0.1|0.0.0.0)/",$post['nisip'])) {
+ $input_errors[]='NIS Ip is not a configured IP address.';
+ }
+ }
+
+ if ($post['nisport'] != '') {
+ if (!preg_match("/^\d+$/", $post['nisport'])) {
+ $input_errors[]='NIS Port is not numeric.';
+ }
+ }
+
+ } // apcupsdenabled
+}
+
+function sync_package_apcupsd(){
+ global $config, $g;
+
+ conf_mount_rw();
+
+ // check pfsense version
+ $pfs_version = substr(trim(file_get_contents("/etc/version")),0,3);
+ if ($pfs_version > 2.0){
+ define('APCUPSD_BASE', '/usr/pbi/apcupsd-' . php_uname("m"));
+ }
+ else {
+ define('APCUPSD_BASE', '/usr/local');
+ }
+
+ // check apcupsd settings
+ if (is_array($config['installedpackages']['apcupsd'])){
+ $apcupsd_config = $config['installedpackages']['apcupsd']['config'][0];
+ if ($apcupsd_config['apcupsdenabled']=="on"){
+ $upsname=$apcupsd_config['upsname'];
+ $upscable=$apcupsd_config['upscable'];
+ $upstype=$apcupsd_config['upstype'];
+ $polltime=($apcupsd_config['polltime'] != ''? $apcupsd_config['polltime'] : "60");
+ $onbatterydelay=($apcupsd_config['onbatterydelay'] != ''? $apcupsd_config['onbatterydelay'] : "6");
+ $batterylevel=($apcupsd_config['batterylevel'] != ''? $apcupsd_config['batterylevel'] : "5");
+ $minutes=($apcupsd_config['minutes'] != ''? $apcupsd_config['minutes'] : "3");
+ $timeout=($apcupsd_config['timeout'] != ''? $apcupsd_config['timeout'] : "0");
+ $annoy=($apcupsd_config['annoy'] != ''? $apcupsd_config['annoy'] : "300");
+ $annoydelay=($apcupsd_config['annoydelay'] != ''? $apcupsd_config['annoydelay'] : "60");
+ $killdelay=($apcupsd_config['killdelay'] != ''? $apcupsd_config['killdelay'] : "0");
+ $netserver=$apcupsd_config['netserver'];
+ $nisip=($apcupsd_config['nisip'] != ''? $apcupsd_config['nisip'] : "0.0.0.0");
+ $nisport=($apcupsd_config['nisport'] != ''? $apcupsd_config['nisport'] : "3551");
+ $upsclass=$apcupsd_config['upsclass'];
+ $upsmode=$apcupsd_config['upsmode'];
+
+ include("/usr/local/pkg/apcupsd.conf.php");
+ file_put_contents(APCUPSD_BASE . "/etc/apcupsd/apcupsd.conf", $apcupsdconf, LOCK_EX);
+ }
+ }
+
+ // RC FILE
+ $apcupsd_rcfile="/usr/local/etc/rc.d/apcupsd.sh";
+ if (is_array($apcupsd_config) && $apcupsd_config['apcupsdenabled']=="on"){
+ $apcupsd_start = "echo \"Starting APC UPS Daemon...\"\n";
+ if ($apcupsd_config['killonpowerfail']=="on"){
+ $apcupsd_start .= " " . APCUPSD_BASE . "/sbin/apcupsd --kill-on-powerfail";
+ }else{
+ $apcupsd_start .= " " . APCUPSD_BASE . "/sbin/apcupsd";
+ }
+
+ $apcupsd_stop = "echo \"Stopping APC UPS Daemon...\"\n";
+ $apcupsd_stop .= " /usr/bin/killall apcupsd\n";
+ $apcupsd_stop .= " /bin/sleep 5";
+
+ /* write out rc.d start/stop file */
+ write_rcfile(array(
+ "file" => "apcupsd.sh",
+ "start" => "$apcupsd_start",
+ "stop" => "$apcupsd_stop"
+ )
+ );
+ mwexec("{$apcupsd_rcfile} restart");
+ }else{
+ if (file_exists($apcupsd_rcfile)){
+ mwexec("{$apcupsd_rcfile} stop");
+ unlink($apcupsd_rcfile);
+ }
+ }
+
+ conf_mount_ro();
+}
+?>
diff --git a/config/apcupsd/apcupsd.xml b/config/apcupsd/apcupsd.xml
new file mode 100644
index 00000000..8674af61
--- /dev/null
+++ b/config/apcupsd/apcupsd.xml
@@ -0,0 +1,333 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packagegui>
+<copyright>
+ <![CDATA[
+/* $Id$ */
+/* ========================================================================== */
+/*
+ apcupsd.xml
+ part of the apcupsd package for pfSense
+ Copyright (C) 2013 Danilo G. Baio <dbaio@bsd.com.br>
+
+ 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.
+ */
+/* ========================================================================== */
+ ]]>
+ </copyright>
+ <name>Apcupsd</name>
+ <title>Services: Apcupsd (General)</title>
+ <category>Monitoring</category>
+ <version>0.1</version>
+ <include_file>/usr/local/pkg/apcupsd.inc</include_file>
+ <addedit_string>Apcupsd has been created/modified.</addedit_string>
+ <delete_string>Apcupsd has been deleted.</delete_string>
+ <restart_command>/usr/local/etc/rc.d/apcupsd.sh restart</restart_command>
+ <additional_files_needed>
+ <item>http://www.pfsense.org/packages/config/apcupsd/apcupsd.inc</item>
+ <prefix>/usr/local/pkg/</prefix>
+ <chmod>0755</chmod>
+ </additional_files_needed>
+ <additional_files_needed>
+ <item>http://www.pfsense.org/packages/config/apcupsd/apcupsd_status.php</item>
+ <prefix>/usr/local/www/</prefix>
+ <chmod>0755</chmod>
+ </additional_files_needed>
+ <additional_files_needed>
+ <item>http://www.pfsense.org/packages/config/apcupsd/apcupsd.conf.php</item>
+ <prefix>/usr/local/pkg/</prefix>
+ <chmod>0755</chmod>
+ </additional_files_needed>
+ <menu>
+ <name>Apcupsd</name>
+ <tooltiptext>Setup Apcupsd specific settings</tooltiptext>
+ <section>Services</section>
+ <url>/pkg_edit.php?xml=apcupsd.xml&amp;id=0</url>
+ </menu>
+ <service>
+ <name>apcupsd</name>
+ <rcfile>apcupsd.sh</rcfile>
+ <executable>apcupsd</executable>
+ <description>Apcupsd a daemon for controlling APC UPSes</description>
+ </service>
+ <tabs>
+ <tab>
+ <text>General</text>
+ <url>/pkg_edit.php?xml=apcupsd.xml&amp;id=0</url>
+ <active/>
+ </tab>
+ <tab>
+ <text>Status</text>
+ <url>apcupsd_status.php</url>
+ </tab>
+ </tabs>
+ <fields>
+ <field>
+ <name>General configuration parameters</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <fielddescr>Enable</fielddescr>
+ <fieldname>apcupsdenabled</fieldname>
+ <description>Enable APC UPS Daemon service</description>
+ <type>checkbox</type>
+ </field>
+ <field>
+ <fielddescr>UPS Name</fielddescr>
+ <fieldname>upsname</fieldname>
+ <description>Use this to give your UPS a name in log files and such</description>
+ <type>input</type>
+ <size>60</size>
+ <required>true</required>
+ </field>
+ <field>
+ <fielddescr>UPS Cable</fielddescr>
+ <fieldname>upscable</fieldname>
+ <description><![CDATA[Defines the type of cable connecting the UPS to your computer.<br>
+<br>
+Possible generic choices for <cable> are:<br>
+ simple, smart, ether, usb<br>
+<br>
+Or a specific cable model number may be used:<br>
+ 940-0119A, 940-0127A, 940-0128A, 940-0020B,<br>
+ 940-0020C, 940-0023A, 940-0024B, 940-0024C,<br>
+ 940-1524C, 940-0024G, 940-0095A, 940-0095B,<br>
+ 940-0095C, M-04-02-2000
+ ]]></description>
+ <type>input</type>
+ <size>60</size>
+ <required>true</required>
+ </field>
+ <field>
+ <fielddescr>UPS Type / Device</fielddescr>
+ <fieldname>upstype</fieldname>
+ <description><![CDATA[To get apcupsd to work, in addition to defining the cable
+above, you must also define a UPSTYPE, which corresponds to
+the type of UPS you have (see the Description for more details).
+You must also specify a DEVICE, sometimes referred to as a port.
+For USB UPSes, please leave the DEVICE directive blank. For
+other UPS types, you must specify an appropriate port or address.<br>
+<br>
+UPSTYPE DEVICE Description <br>
+<br>
+<strong>apcsmart /dev/tty**</strong> Newer serial character device, appropriate for
+ SmartUPS models using a serial cable (not USB).<br>
+<br>
+<strong>usb BLANK</strong> Most new UPSes are USB. A blank DEVICE
+ setting enables autodetection, which is
+ the best choice for most installations.<br>
+<br>
+<strong>net hostname:port</strong> Network link to a master apcupsd through apcupsd's
+ Network Information Server. This is used if the
+ UPS powering your computer is connected to a
+ different computer for monitoring.<br>
+<br>
+<strong>snmp hostname:port:vendor:community</strong>
+ SNMP network link to an SNMP-enabled UPS device.
+ Hostname is the ip address or hostname of the UPS
+ on the network. Vendor can be can be "APC" or
+ "APC_NOTRAP". "APC_NOTRAP" will disable SNMP trap
+ catching; you usually want "APC". Port is usually
+ 161. Community is usually "private".<br>
+<br>
+<strong>netsnmp hostname:port:vendor:community</strong>
+ OBSOLETE
+ Same as SNMP above but requires use of the
+ net-snmp library. Unless you have a specific need
+ for this old driver, you should use 'snmp' instead.<br>
+<br>
+<strong>dumb /dev/tty**</strong> Old serial character device for use with
+ simple-signaling UPSes.<br>
+<br>
+<strong>pcnet ipaddr:username:passphrase:port</strong>
+ PowerChute Network Shutdown protocol which can be
+ used as an alternative to SNMP with the AP9617
+ family of smart slot cards. ipaddr is the IP
+ address of the UPS management card. username and
+ passphrase are the credentials for which the card
+ has been configured. port is the port number on
+ which to listen for messages from the UPS, normally
+ 3052. If this parameter is empty or missing, the
+ default of 3052 will be used.<br>
+<br>
+ ]]></description>
+ <type>input</type>
+ <size>60</size>
+ <required>true</required>
+ </field>
+ <field>
+ <fielddescr>Poll Time</fielddescr>
+ <fieldname>polltime</fieldname>
+ <description>Interval (in seconds) at which apcupsd polls the UPS for status. Default is 60</description>
+ <type>input</type>
+ <size>10</size>
+ <default_value>60</default_value>
+ </field>
+ <field>
+ <fielddescr>Kill on Power Fail</fielddescr>
+ <fieldname>killonpowerfail</fieldname>
+ <description>Hibernate UPS on powerfail</description>
+ <type>checkbox</type>
+ </field>
+ <field>
+ <name>Configuration parameters used during power failures</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <fielddescr>OnBattery Delay</fielddescr>
+ <fieldname>onbatterydelay</fieldname>
+ <description>Time in seconds from when a power failure is detected until we react to it with an onbattery event. Default is 6</description>
+ <type>input</type>
+ <size>10</size>
+ <default_value>6</default_value>
+ </field>
+ <field>
+ <fielddescr>Battery Level</fielddescr>
+ <fieldname>batterylevel</fieldname>
+ <description>If during a power failure, the remaining battery percentage (as reported by the UPS) is
+ below or equal to BATTERYLEVEL, apcupsd will initiate a system shutdown. Default is 5</description>
+ <type>input</type>
+ <size>10</size>
+ <default_value>5</default_value>
+ </field>
+ <field>
+ <fielddescr>Minutes</fielddescr>
+ <fieldname>minutes</fieldname>
+ <description>If during a power failure, the remaining runtime in minutes (as calculated internally
+ by the UPS) is below or equal to MINUTES, apcupsd, will initiate a system shutdown. Default is 3</description>
+ <type>input</type>
+ <size>10</size>
+ <default_value>3</default_value>
+ </field>
+ <field>
+ <fielddescr>Timeout</fielddescr>
+ <fieldname>timeout</fieldname>
+ <description>If during a power failure, the UPS has run on batteries for TIMEOUT many seconds
+ or longer, apcupsd will initiate a system shutdown. A value of 0 (default) disables this timer</description>
+ <type>input</type>
+ <size>10</size>
+ <default_value>0</default_value>
+ </field>
+ <field>
+ <fielddescr>Annoy</fielddescr>
+ <fieldname>annoy</fieldname>
+ <description>Time in seconds between annoying users to signoff prior to system shutdown. 0 disables. Default is 300</description>
+ <type>input</type>
+ <size>10</size>
+ <default_value>300</default_value>
+ </field>
+ <field>
+ <fielddescr>Annoy Delay</fielddescr>
+ <fieldname>annoydelay</fieldname>
+ <description>Initial delay after power failure before warning users to get off the system. Default is 60</description>
+ <type>input</type>
+ <size>10</size>
+ <default_value>60</default_value>
+ </field>
+ <field>
+ <fielddescr>Kill Delay</fielddescr>
+ <fieldname>killdelay</fieldname>
+ <description>If KILLDELAY is non-zero, apcupsd will continue running after a shutdown has been
+ requested, and after the specified time in seconds attempt to kill the power. This is for use
+ on systems where apcupsd cannot regain control after a shutdown. 0 disables (default)</description>
+ <type>input</type>
+ <size>10</size>
+ <default_value>0</default_value>
+ </field>
+ <field>
+ <name>Configuration statements for Network Information Server</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <fielddescr>Net Server</fielddescr>
+ <fieldname>netserver</fieldname>
+ <description>If netstatus is on, a network information server process will be started for serving
+ the STATUS and EVENT data over the network (used by CGI programs)</description>
+ <type>select</type>
+ <default_value>on</default_value>
+ <options>
+ <option><name>On</name><value>on</value></option>
+ <option><name>Off</name><value>off</value></option>
+ </options>
+ </field>
+ <field>
+ <fielddescr>NIS Ip</fielddescr>
+ <fieldname>nisip</fieldname>
+ <description>IP address on which NIS server will listen for incoming connections. Default value is
+ 0.0.0.0 which means any incoming request will be serviced. Alternatively, you can configure this
+ setting to any specific IP address of your server and NIS will listen for connections only on that
+ interface. Use the loopback address (127.0.0.1) to accept connections only from the local machine</description>
+ <type>input</type>
+ <size>10</size>
+ <default_value>0.0.0.0</default_value>
+ </field>
+ <field>
+ <fielddescr>NIS Port</fielddescr>
+ <fieldname>nisport</fieldname>
+ <description>Port to use for sending STATUS and EVENTS data over the network.
+ It is not used unless NETSERVER is on. If you change this port,
+ you will need to change the corresponding value in the cgi directory
+ and rebuild the cgi programs. Default is 3551 as registered with the IANA</description>
+ <type>input</type>
+ <size>10</size>
+ <default_value>3551</default_value>
+ </field>
+ <field>
+ <name>Configuration statements used if sharing</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <fielddescr>UPS Class</fielddescr>
+ <fieldname>upsclass</fieldname>
+ <description>Normally standalone unless you share an UPS using an APC ShareUPS card</description>
+ <type>select</type>
+ <default_value>standalone</default_value>
+ <options>
+ <option><name>Standalone</name><value>standalone</value></option>
+ <option><name>Share Master</name><value>sharemaster</value></option>
+ <option><name>Share Slave</name><value>shareslave</value></option>
+ </options>
+ </field>
+ <field>
+ <fielddescr>UPS Mode</fielddescr>
+ <fieldname>upsmode</fieldname>
+ <description>Normally disable unless you share an UPS using an APC ShareUPS card</description>
+ <type>select</type>
+ <default_value>disable</default_value>
+ <options>
+ <option><name>Disable</name><value>disable</value></option>
+ <option><name>Share</name><value>share</value></option>
+ </options>
+ </field>
+ </fields>
+ <custom_php_install_command>sync_package_apcupsd();</custom_php_install_command>
+ <custom_php_command_before_form></custom_php_command_before_form>
+ <custom_php_after_head_command></custom_php_after_head_command>
+ <custom_php_after_form_command></custom_php_after_form_command>
+ <custom_php_validation_command>validate_input_apcupsd($_POST, &amp;$input_errors);</custom_php_validation_command>
+ <custom_add_php_command></custom_add_php_command>
+ <custom_php_resync_config_command>sync_package_apcupsd();</custom_php_resync_config_command>
+ <custom_php_deinstall_command>php_deinstall_apcupsd();</custom_php_deinstall_command>
+</packagegui>
diff --git a/config/apcupsd/apcupsd_status.php b/config/apcupsd/apcupsd_status.php
new file mode 100755
index 00000000..e465f62c
--- /dev/null
+++ b/config/apcupsd/apcupsd_status.php
@@ -0,0 +1,118 @@
+<?php
+/*
+ apcupsd_status.php
+ part of pfSense (http://www.pfsense.com/)
+ Copyright (C) 2013 Danilo G. Baio <dbaio@bsd.com.br>
+ 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");
+
+$pfSversion = str_replace("\n", "", file_get_contents("/etc/version"));
+
+if(strstr($pfSversion, "1.2"))
+ $one_two = true;
+
+$pgtitle = "Services: Apcupsd (Status)";
+include("head.inc");
+
+function puts( $arg ) { echo "$arg\n"; }
+
+?>
+
+<style>
+<!--
+
+input {
+ font-family: courier new, courier;
+ font-weight: normal;
+ font-size: 9pt;
+}
+
+pre {
+ border: 2px solid #435370;
+ background: #F0F0F0;
+ padding: 1em;
+ font-family: courier new, courier;
+ white-space: pre;
+ line-height: 10pt;
+ font-size: 10pt;
+}
+
+.label {
+ font-family: tahoma, verdana, arial, helvetica;
+ font-size: 11px;
+ font-weight: bold;
+}
+
+.button {
+ font-family: tahoma, verdana, arial, helvetica;
+ font-weight: bold;
+ font-size: 11px;
+}
+
+-->
+</style>
+</head>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+
+ <?php include("fbegin.inc"); ?>
+
+ <?php if($one_two): ?>
+ <p class="pgtitle"><?=$pgtitle?></font></p>
+ <?php endif; ?>
+
+
+<div id="mainlevel">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr><td>
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("General"), false, "/pkg_edit.php?xml=apcupsd.xml&amp;id=0");
+ $tab_array[] = array(gettext("Status"), true, "/apcupsd_status.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td></tr>
+ </table>
+</div>
+
+<div id="mainarea" style="padding-top: 0px; padding-bottom: 0px; ">
+ <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="6">
+ <tr><td>
+<?php
+ puts("<pre>");
+ putenv("PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin");
+ $ph = popen('apcaccess 2>&1', "r" );
+ while ($line = fgets($ph)) echo htmlspecialchars($line);
+ pclose($ph);
+ puts("</pre>");
+?>
+ </td></tr>
+ </table>
+</div>
+<?php
+include("fend.inc");
+?>
+</body>
+</html>