diff --git a/sysutils/pfSense-pkg-apcupsd/Makefile b/sysutils/pfSense-pkg-apcupsd/Makefile new file mode 100644 index 000000000000..ad23e199fcda --- /dev/null +++ b/sysutils/pfSense-pkg-apcupsd/Makefile @@ -0,0 +1,48 @@ +# $FreeBSD$ + +PORTNAME= pfSense-pkg-apcupsd +PORTVERSION= 0.3.9 +CATEGORIES= sysutils +MASTER_SITES= # empty +DISTFILES= # empty +EXTRACT_ONLY= # empty + +MAINTAINER= coreteam@pfsense.org +COMMENT= pfSense package apcupsd + +LICENSE= ESF + +RUN_DEPENDS= ${LOCALBASE}/sbin/apcupsd:sysutils/apcupsd + +NO_BUILD= yes +NO_MTREE= yes + +SUB_FILES= pkg-install pkg-deinstall +SUB_LIST= PORTNAME=${PORTNAME} + +do-extract: + ${MKDIR} ${WRKSRC} + +do-install: + ${MKDIR} ${STAGEDIR}${PREFIX}/pkg + ${MKDIR} ${STAGEDIR}${PREFIX}/www + ${MKDIR} ${STAGEDIR}/etc/inc/priv + ${MKDIR} ${STAGEDIR}${DATADIR} + ${INSTALL_DATA} -m 0644 ${FILESDIR}${PREFIX}/pkg/apcupsd.xml \ + ${STAGEDIR}${PREFIX}/pkg + ${INSTALL_DATA} ${FILESDIR}${PREFIX}/pkg/apcupsd.inc \ + ${STAGEDIR}${PREFIX}/pkg + ${INSTALL_DATA} ${FILESDIR}${PREFIX}/www/apcupsd_status.php \ + ${STAGEDIR}${PREFIX}/www + ${INSTALL_DATA} ${FILESDIR}${PREFIX}/pkg/apcupsd.conf.php \ + ${STAGEDIR}${PREFIX}/pkg + ${INSTALL_DATA} ${FILESDIR}${PREFIX}/pkg/apcupsd_mail.php \ + ${STAGEDIR}${PREFIX}/pkg + ${INSTALL_DATA} ${FILESDIR}/etc/inc/priv/apcupsd.priv.inc \ + ${STAGEDIR}/etc/inc/priv + ${INSTALL_DATA} ${FILESDIR}${DATADIR}/info.xml \ + ${STAGEDIR}${DATADIR} + @${REINPLACE_CMD} -i '' -e "s|%%PKGVERSION%%|${PKGVERSION}|" \ + ${STAGEDIR}${DATADIR}/info.xml + +.include diff --git a/sysutils/pfSense-pkg-apcupsd/files/etc/inc/priv/apcupsd.priv.inc b/sysutils/pfSense-pkg-apcupsd/files/etc/inc/priv/apcupsd.priv.inc new file mode 100644 index 000000000000..5526b99fac52 --- /dev/null +++ b/sysutils/pfSense-pkg-apcupsd/files/etc/inc/priv/apcupsd.priv.inc @@ -0,0 +1,38 @@ + diff --git a/sysutils/pfSense-pkg-apcupsd/files/pkg-deinstall.in b/sysutils/pfSense-pkg-apcupsd/files/pkg-deinstall.in new file mode 100644 index 000000000000..83d1c3dcab9e --- /dev/null +++ b/sysutils/pfSense-pkg-apcupsd/files/pkg-deinstall.in @@ -0,0 +1,3 @@ +#!/bin/sh + +/usr/local/bin/php -f /etc/rc.packages %%PORTNAME%% ${2} diff --git a/sysutils/pfSense-pkg-apcupsd/files/pkg-install.in b/sysutils/pfSense-pkg-apcupsd/files/pkg-install.in new file mode 100644 index 000000000000..25b18865994c --- /dev/null +++ b/sysutils/pfSense-pkg-apcupsd/files/pkg-install.in @@ -0,0 +1,7 @@ +#!/bin/sh + +if [ "${2}" != "POST-INSTALL" ]; then + exit 0 +fi + +/usr/local/bin/php -f /etc/rc.packages %%PORTNAME%% ${2} diff --git a/sysutils/pfSense-pkg-apcupsd/files/usr/local/pkg/apcupsd.conf.php b/sysutils/pfSense-pkg-apcupsd/files/usr/local/pkg/apcupsd.conf.php new file mode 100644 index 000000000000..abfd0a751671 --- /dev/null +++ b/sysutils/pfSense-pkg-apcupsd/files/usr/local/pkg/apcupsd.conf.php @@ -0,0 +1,363 @@ + + Copyright (C) 2015 ESF, LLC + 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 =<< +# Defines the type of cable connecting the UPS to your computer. +# +# Possible generic choices for 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 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} +{$device} + +# POLLTIME +# 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 for device lock file. Not used on Win32. +LOCKFILE {$lockfile} + +# SCRIPTDIR +# Directory in which apccontrol and event scripts are located. +SCRIPTDIR /usr/local/etc/apcupsd + +# PWRFAILDIR +# 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 +# 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 [ 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 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 +# 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 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 +# 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/sysutils/pfSense-pkg-apcupsd/files/usr/local/pkg/apcupsd.inc b/sysutils/pfSense-pkg-apcupsd/files/usr/local/pkg/apcupsd.inc new file mode 100644 index 000000000000..f0759c2ec89b --- /dev/null +++ b/sysutils/pfSense-pkg-apcupsd/files/usr/local/pkg/apcupsd.inc @@ -0,0 +1,306 @@ + + Copyright (C) 2015 ESF, LLC + 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(); + apccontrol_scripts_install(); +} + +function php_deinstall_apcupsd() { + global $config, $g; + + define('APCUPSD_BASE', '/usr/local'); + + 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 -rf /var/log/apcupsd/"); + } + if (is_dir("/var/run/apcupsd")) { + exec("/bin/rm -rf /var/run/apcupsd/"); + } + +} + +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.'; + } + } + + if ($post['emailnotification'] == 'smtpbuiltin') { + if (empty($post['smtphost'])) { + $input_errors[] = 'SMTP Host cannot be empty if SMTP builtin is enabled.'; + } + + if (empty($post['smtpport'])) { + $input_errors[] = 'SMTP Port cannot be empty if SMTP builtin is enabled.'; + } elseif (!is_port($post['smtpport'])) { + $input_errors[]='SMTP Port is not a valid port.'; + } + + if (empty($post['smtpfrom'])) { + $input_errors[] = 'From field cannot be empty if SMTP builtin is enabled.'; + } + + if (empty($post['smtpto'])) { + $input_errors[] = 'To field cannot be empty if SMTP builtin is enabled.'; + } + } + + } +} + +function sync_package_apcupsd() { + global $config, $g; + + conf_mount_rw(); + + 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']; + $device = ($apcupsd_config['device'] != '' ? "DEVICE {$apcupsd_config['device']}" : "#DEVICE"); + $polltime = $apcupsd_config['polltime'] ?: "60"; + $onbatterydelay = $apcupsd_config['onbatterydelay'] ?: "6"; + $batterylevel= $apcupsd_config['batterylevel'] ?: "5"; + $minutes = $apcupsd_config['minutes'] ?: "3"; + $timeout = $apcupsd_config['timeout'] ?: "0"; + $annoy = $apcupsd_config['annoy'] ?: "300"; + $annoydelay = $apcupsd_config['annoydelay'] ?: "60"; + $killdelay = $apcupsd_config['killdelay'] ?: "0"; + $netserver = $apcupsd_config['netserver']; + $nisip= $apcupsd_config['nisip'] ?: "0.0.0.0"; + $nisport = $apcupsd_config['nisport'] ?: "3551"; + $upsclass = $apcupsd_config['upsclass']; + $upsmode = $apcupsd_config['upsmode']; + $lockfile= $apcupsd_config['lockfile'] ?: "/var/tmp"; + $emailnotification = $apcupsd_config['emailnotification']; + + 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"; + $apcupsd_start .= " if [ ! -d {$lockfile} ]; then \n"; + $apcupsd_start .= " /bin/mkdir -p {$lockfile} \n"; + $apcupsd_start .= " fi \n"; + $apcupsd_start .= " /bin/rm -f {$lockfile}/*LCK* 2>/dev/null \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" + ) + ); + + restart_service("apcupsd"); + + } else { + stop_service("apcupsd"); + unlink_if_exists($apcupsd_rcfile); + } + + apccontrol_scripts_install($emailnotification); + conf_mount_ro(); +} + +function apccontrol_scripts_install($emailnotification) { + global $config, $g; + + define('APCUPSD_BASE', '/usr/local'); + + $apcstatus['commfailure'] = "\$HOSTNAME - Communications with UPS \$1 lost"; + $apcstatus['commok'] = "\$HOSTNAME - Communications with UPS \$1 restored"; + $apcstatus['onbattery'] = "\$HOSTNAME - Power failure. Running on UPS \$1 batteries"; + $apcstatus['offbattery'] = "\$HOSTNAME - UPS \$1 Power has returned..."; + $apcstatus['changeme'] = "\$HOSTNAME - Emergency! UPS batteries have failed. Change them NOW"; + + $apccontrol_scripts = array("offbattery","onbattery","commfailure","commok","changeme"); + foreach ($apccontrol_scripts as $apccontrol_script) { + + if ($emailnotification == "smtpbuiltin") { + + if (is_array($config['installedpackages']['apcupsd'])) { + $apcupsd_config = $config['installedpackages']['apcupsd']['config'][0]; + if ($apcupsd_config['apcupsdenabled'] == "on") { + $smtphost = $apcupsd_config['smtphost'] ?: "0.0.0.0"; + $smtpport = $apcupsd_config['smtpport'] ?: "25"; + $smtpfrom = $apcupsd_config['smtpfrom']; + $smtpto = $apcupsd_config['smtpto']; + $smtpcc = $apcupsd_config['smtpcc']; + if (empty($smtpcc)) { + $smtpcc_cmd = ""; + } else { + $smtpcc_cmd = "-c {$smtpcc}"; + } + } + } + + $pfSense_hostname = gethostname(); + + $apccontrol_script_file =<< /dev/null + +exit 0 + +EOF; + } + + file_put_contents(APCUPSD_BASE . "/etc/apcupsd/" . $apccontrol_script, $apccontrol_script_file, LOCK_EX); + } + +} + +function check_nis_running_apcupsd() { + global $config, $g; + + if (is_array($config['installedpackages']['apcupsd'])) { + $apcupsd_config = $config['installedpackages']['apcupsd']['config'][0]; + if ($apcupsd_config['apcupsdenabled'] == "on" && $apcupsd_config['netserver'] == "on" ) { + return(true); + } + } else { + return(false); + } +} + +function check_nis_ip_apcupsd() { + global $config, $g; + if (is_array($config['installedpackages']['apcupsd'])) { + $apcupsd_config = $config['installedpackages']['apcupsd']['config'][0]; + if ($apcupsd_config['apcupsdenabled']=="on" && $apcupsd_config['netserver']=="on" ) { + return($apcupsd_config['nisip']); + } + } else { + return(false); + } +} + +function check_nis_port_apcupsd() { + global $config, $g; + if (is_array($config['installedpackages']['apcupsd'])) { + $apcupsd_config = $config['installedpackages']['apcupsd']['config'][0]; + if ($apcupsd_config['apcupsdenabled']=="on" && $apcupsd_config['netserver']=="on" ) { + return($apcupsd_config['nisport']); + } + } else { + return(false); + } +} + +?> diff --git a/sysutils/pfSense-pkg-apcupsd/files/usr/local/pkg/apcupsd.xml b/sysutils/pfSense-pkg-apcupsd/files/usr/local/pkg/apcupsd.xml new file mode 100644 index 000000000000..8f52f699fdf2 --- /dev/null +++ b/sysutils/pfSense-pkg-apcupsd/files/usr/local/pkg/apcupsd.xml @@ -0,0 +1,402 @@ + + + + + + + Copyright (C) 2015 ESF, LLC + 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. +*/ +/* ====================================================================================== */ + ]]> + + Apcupsd + Services: Apcupsd + Apcupsd configuration has been created/modified. + Apcupsd configuration has been deleted. + /usr/local/etc/rc.d/apcupsd.sh restart + /usr/local/pkg/apcupsd.inc + + Apcupsd + Setup Apcupsd specific settings +
Services
+ /pkg_edit.php?xml=apcupsd.xml +
+ + apcupsd + apcupsd.sh + apcupsd + APC UPS Daemon + + + + General + /pkg_edit.php?xml=apcupsd.xml + + + + Status + apcupsd_status.php + + + + + General Configuration Parameters + listtopic + + + Enable + apcupsdenabled + Enable APC UPS Daemon service. + checkbox + + + UPS Name + upsname + Use this to give your UPS a name in log files and such. + input + 60 + true + + + UPS Cable + upscable + +
+ 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 + ]]> +
+ input + 60 + true +
+ + UPS Type + upstype + + + For USB UPSes, please leave the DEVICE directive blank. For other UPS types, you must specify an appropriate port or address.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
UPSTYPEDEVICEDescription
apcsmart/dev/tty**Newer serial character device, appropriate for SmartUPS models using a serial cable (not USB).
usbBLANKMost new UPSes are USB. A blank DEVICE setting enables autodetection, which is the best choice for most installations.
nethostname:portNetwork 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.
snmphostname:port:vendor:communitySNMP 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".
dumb/dev/tty**Old serial character device for use with simple-signaling UPSes.
pcnetipaddr:username:passphrase:portPowerChute 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.
+ ]]> +
+ input + 60 + true +
+ + Device + device + + input + 60 + + + Poll Time + polltime + Interval (in seconds) at which apcupsd polls the UPS for status. (Default: 60) + input + 10 + 60 + + + Kill on Power Fail + killonpowerfail + Hibernate UPS on powerfail. + checkbox + + + Lock File + lockfile + Path for device lock file. (Default: /var/tmp) + input + 60 + + + Configuration parameters used during power failures + listtopic + + + OnBattery Delay + onbatterydelay + Time in seconds from when a power failure is detected until we react to it with an onbattery event. (Default: 6) + input + 10 + 6 + + + Battery Level + batterylevel + 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: 5) + input + 10 + 5 + + + Minutes + minutes + 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: 3) + input + 10 + 3 + + + Timeout + timeout + 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. + input + 10 + 0 + + + Annoy + annoy + Time in seconds between annoying users to signoff prior to system shutdown. 0 disables. (Default: 300) + input + 10 + 300 + + + Annoy Delay + annoydelay + Initial delay after power failure before warning users to get off the system. (Default: 60) + input + 10 + 60 + + + Kill Delay + killdelay + + + This is for use on systems where apcupsd cannot regain control after a shutdown. 0 disables (default). + ]]> + + input + 10 + 0 + + + Configuration statements for Network Information Server + listtopic + + + Net Server + netserver + 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). + select + on + + + + + + + NIS IP + nisip + + + 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. + ]]> +
+ input + 10 + 0.0.0.0 +
+ + NIS Port + nisport + + + (Default is 3551 as registered with the IANA.) + ]]> + + input + 10 + 3551 + + + UPS Sharing Configuration + listtopic + + + UPS Class + upsclass + Normally standalone unless you share an UPS using an APC ShareUPS card. + select + standalone + + + + + + + + UPS Mode + upsmode + Normally disable unless you share an UPS using an APC ShareUPS card. + select + disable + + + + + + + Notifications + listtopic + + + E-mail notifications + emailnotification + +
+ php - In order to receive e-mail notifications through php, you need to configure SMTP Email Notifications + on System/Advanced/Notifications section.
+
+ SMTP built-in - A simple SMTP mail client for apcupsd. It does not have smtp authentication of any kind. + ]]> +
+ select + phpmailer + + + + +
+ + SMTP built-in settings + listtopic + + + SMTP Host + smtphost + + input + 20 + + + SMTP Port + smtpport + + input + 5 + + + From + smtpfrom + + input + 20 + + + To + smtpto + + input + 20 + + + Cc + smtpcc + + input + 20 + +
+ php_install_apcupsd(); + validate_input_apcupsd($_POST, $input_errors); + sync_package_apcupsd(); + php_deinstall_apcupsd(); +
diff --git a/sysutils/pfSense-pkg-apcupsd/files/usr/local/pkg/apcupsd_mail.php b/sysutils/pfSense-pkg-apcupsd/files/usr/local/pkg/apcupsd_mail.php new file mode 100755 index 000000000000..58712236cc42 --- /dev/null +++ b/sysutils/pfSense-pkg-apcupsd/files/usr/local/pkg/apcupsd_mail.php @@ -0,0 +1,66 @@ + + Copyright (C) 2015 ESF, LLC + 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("pkg-utils.inc"); +require_once("globals.inc"); +require_once("notices.inc"); + +$apcstatus[killpower] = "UPS now committed to shut down"; +$apcstatus[commfailure] = "Communications with UPS lost"; +$apcstatus[commok] = "Communications with UPS restored"; +$apcstatus[onbattery] = "Power failure. Running on UPS batteries"; +$apcstatus[offbattery] = "Power has returned..."; +$apcstatus[failing] = "UPS battery power exhausted. Doing shutdown"; +$apcstatus[timeout] = "UPS battery runtime limit exceeded. Doing shutdown"; +$apcstatus[loadlimit] = "UPS battery discharge limit reached. Doing shutdown"; +$apcstatus[runlimit] = "UPS battery runtime percent reached. Doing shutdown"; +$apcstatus[doreboot] = "Beginning Reboot Sequence"; +$apcstatus[doshutdown] = "Beginning Shutdown Sequence"; +$apcstatus[annoyme] = "Power problems please logoff"; +$apcstatus[emergency] = "Emergency Shutdown. Possible UPS battery failure"; +$apcstatus[changeme] = "Emergency! UPS batteries have failed. Change them NOW"; +$apcstatus[remotedown] = "Remote Shutdown. Beginning Shutdown Sequence"; + +if (empty($argv[1]) || empty($apcstatus["$argv[1]"])) { + return; +} + +$apcsubject = "apcupsd - " . $apcstatus["$argv[1]"]; +$apcmessage = "Status information from apcupsd:\n"; + +putenv("PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"); +$ph = popen('apcaccess status 2>&1', "r" ); +while ($line = fgets($ph)) { + $apcmessage .= $line; +} +pclose($ph); + +send_smtp_message($apcmessage, $apcsubject); + +?> diff --git a/sysutils/pfSense-pkg-apcupsd/files/usr/local/share/pfSense-pkg-apcupsd/info.xml b/sysutils/pfSense-pkg-apcupsd/files/usr/local/share/pfSense-pkg-apcupsd/info.xml new file mode 100644 index 000000000000..be1081d8c998 --- /dev/null +++ b/sysutils/pfSense-pkg-apcupsd/files/usr/local/share/pfSense-pkg-apcupsd/info.xml @@ -0,0 +1,11 @@ + + + + apcupsd + apcupsd + Set of programs for controlling APC's UPS models. + http://www.apcupsd.com/ + %%PKGVERSION%% + apcupsd.xml + + diff --git a/sysutils/pfSense-pkg-apcupsd/files/usr/local/www/apcupsd_status.php b/sysutils/pfSense-pkg-apcupsd/files/usr/local/www/apcupsd_status.php new file mode 100755 index 000000000000..36e45f00e50e --- /dev/null +++ b/sysutils/pfSense-pkg-apcupsd/files/usr/local/www/apcupsd_status.php @@ -0,0 +1,120 @@ + + Copyright (C) 2015 ESF, LLC + 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"); +require_once("/usr/local/pkg/apcupsd.inc"); + +$pgtitle = array(gettext("Package"), gettext("Services: Apcupsd"), gettext("Status")); +include("head.inc"); + +function puts($arg) { + echo "$arg\n"; +} + +$tab_array = array(); +$tab_array[] = array(gettext("General"), false, "/pkg_edit.php?xml=apcupsd.xml&id=0"); +$tab_array[] = array(gettext("Status"), true, "/apcupsd_status.php"); +display_top_tabs($tab_array); + +$nis_server = check_nis_running_apcupsd(); + +if ( $_POST['strapcaccess'] ) { + puts("

Status information from apcupsd

"); + puts("
");
+	puts("Running: apcaccess -h {$_POST['strapcaccess']} 
"); + putenv("PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"); + $ph = popen("apcaccess -h {$_POST['strapcaccess']} 2>&1", "r" ); + while ($line = fgets($ph)) { + echo htmlspecialchars($line); + } + pclose($ph); + puts("
"); + puts("
"); +} elseif ($nis_server) { + $nisip = (check_nis_ip_apcupsd() != ''? check_nis_ip_apcupsd() : "localhost"); + $nisport = (check_nis_port_apcupsd() != '' ? check_nis_port_apcupsd() : "3551"); + + puts("

Status information from apcupsd

"); + puts("
");
+	puts("Running: apcaccess -h {$nisip}:{$nisport} 
"); + putenv("PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"); + $ph = popen("apcaccess -h {$nisip}:{$nisport} 2>&1", "r" ); + while ($line = fgets($ph)) { + echo htmlspecialchars($line); + } + pclose($ph); + puts("
"); + puts("
"); +} else { + puts("

Status information from apcupsd

"); + puts("
");
+	puts("Network Information Server (NIS) not running, in order to run apcaccess on localhost, you need to enable it on APCupsd General settings. 
"); + puts("
"); + puts("
"); +} + +?> + +
+
+

+
+
+ +
+ + + Default: localhost

+ Note: apcaccess uses apcupsd's inbuilt Network Information Server (NIS) to obtain the current status information
+ from the UPS on the local or remote computer. It is therefore necessary to have the following configuration directives:
+ NETSERVER on
+ NISPORT 3551
+
+
+
+
+
+
+
+ +
+
+ + + diff --git a/sysutils/pfSense-pkg-apcupsd/pkg-descr b/sysutils/pfSense-pkg-apcupsd/pkg-descr new file mode 100644 index 000000000000..e2a5afb2aab7 --- /dev/null +++ b/sysutils/pfSense-pkg-apcupsd/pkg-descr @@ -0,0 +1,7 @@ +"apcupsd" can be used for controlling all APC UPS models + +It can monitor and log the current power and battery status, perform +automatic shutdown, and can run in network mode in order to power down +other hosts on a LAN + +WWW: http://www.apcupsd.com diff --git a/sysutils/pfSense-pkg-apcupsd/pkg-plist b/sysutils/pfSense-pkg-apcupsd/pkg-plist new file mode 100644 index 000000000000..df71189014ac --- /dev/null +++ b/sysutils/pfSense-pkg-apcupsd/pkg-plist @@ -0,0 +1,8 @@ +pkg/apcupsd.xml +pkg/apcupsd.inc +pkg/apcupsd.conf.php +pkg/apcupsd_mail.php +/etc/inc/priv/apcupsd.priv.inc +www/apcupsd_status.php +%%DATADIR%%/info.xml +@dir /etc/inc/priv