diff options
Diffstat (limited to 'config/lcdproc')
-rw-r--r-- | config/lcdproc/lcdproc.inc | 363 | ||||
-rw-r--r-- | config/lcdproc/lcdproc.xml | 304 | ||||
-rw-r--r-- | config/lcdproc/lcdproc_client.php | 525 | ||||
-rw-r--r-- | config/lcdproc/lcdproc_screens.xml | 91 |
4 files changed, 1283 insertions, 0 deletions
diff --git a/config/lcdproc/lcdproc.inc b/config/lcdproc/lcdproc.inc new file mode 100644 index 00000000..b296b841 --- /dev/null +++ b/config/lcdproc/lcdproc.inc @@ -0,0 +1,363 @@ +<?php +/* $Id$ */ +/* + lcdproc.inc + Copyright (C) 2007 Seth Mos <seth.mos@xs4all.nl> + 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"); + + /* LCDproc */ + define('LCDPROC_RCFILE', '/usr/local/etc/rc.d/lcdproc.sh'); + define('LCDPROC_CLIENT', '/tmp/lcdclient.sh'); + define('LCDPROC_CONFIG','/usr/local/etc/LCDd.conf'); + define('LCDPROC_HOST','localhost'); + define('LCDPROC_PORT','13666'); + + function lcdproc_notice ($msg) { syslog(LOG_NOTICE, "lcdproc: {$msg}"); } + function lcdproc_warn ($msg) { syslog(LOG_WARNING, "lcdproc: {$msg}"); } + + function lcdproc_action ($action) { + if (file_exists(LCDPROC_RCFILE)) + mwexec(LCDPROC_RCFILE.' '.$action); + } + + function lcdproc_running () { + if((int)exec('pgrep LCDd | wc -l') > 0) + return true; + return false; + } + + function lcdproc_write_config($file, $text) { + $handle = fopen($file, 'w'); + if(!$handle) { + lcdproc_warn("Could not open {$file} for writing."); + exit; + } + fwrite($handle, $text); + fclose($handle); + } + + function lcdproc_write_script($file, $text) { + $handle = fopen($file, 'wx'); + if(!$handle) { + lcdproc_warn("Could not open {$file} for writing."); + exit; + } + fwrite($handle, $text); + fclose($handle); + chmod($file, 0755); + } + + function before_form_lcdproc($pkg) { + global $config; + + config_lock(); + + config_unlock(); + } + + function before_form_lcdproc_screens($pkg) { + global $config; + + config_lock(); + + config_unlock(); + } + + function validate_form_lcdproc($post, $input_errors) { + if($post['comport']) { + switch($post['comport']) { + case "none": + continue; + break; + case "com2": + continue; + break; + case "ucom1": + continue; + break; + case "ucom2": + continue; + break; + case "lpt1": + continue; + break; + default: + $input_errors[] = "The chosen com port is not valid"; + break; + } + } + if($post['size']) { + switch($post['size']) { + case "12x1": + continue; + break; + case "12x2": + continue; + break; + case "12x4": + continue; + break; + case "16x1": + continue; + break; + case "16x2": + continue; + break; + case "16x4": + continue; + break; + case "20x1": + continue; + break; + case "20x2": + continue; + break; + case "20x4": + continue; + break; + default: + $input_errors[] = "The chosen display size is not valid"; + break; + } + } + } + function validate_form_lcdproc_screens($post, $input_errors) { + // No validation required ?! + } + + function sync_package_lcdproc_screens() { + sync_package_lcdproc(); + } + function sync_package_lcdproc() { + global $g; + global $config; + global $input_errors; + + config_lock(); + + $lcdproc_config = $config['installedpackages']['lcdproc']['config'][0]; + $lcdproc_screens_config = $config['installedpackages']['lcdprocscreens']['config'][0]; + + /* since config is written before this file invoked we don't need to read post data */ + if($lcdproc_config['enable'] && ($lcdproc_config['comport'] != "none")) { + switch($lcdproc_config['comport']) { + case "com2": + $realport = "/dev/cua1"; + break; + case "ucom1": + $realport = "/dev/cuaU0"; + break; + case "ucom2": + $realport = "/dev/cuaU1"; + break; + case "lpt1": + $realport = "/dev/lpt0"; + break; + default: + lcdproc_warn("The selected com port is not valid!"); + return; + } + + $config_text = "[server]\n"; + $config_text .= "Driver={$lcdproc_config[driver]}\n"; + $config_text .= "Bind=127.0.0.1\n"; + $config_text .= "Port=13666\n"; + $config_text .= "ReportLevel=3\n"; + $config_text .= "ReportToSyslog=yes\n"; + $config_text .= "WaitTime=5\n"; + $config_text .= "User=nobody\n"; + $config_text .= "ServerScreen=no\n"; + $config_text .= "Foreground=no\n"; + $config_text .= "DriverPath=/usr/local/lib/lcdproc/\n"; + $config_text .= "GoodBye=\"Thanks for using\"\n"; + $config_text .= "GoodBye=\" {$g['product_name']} \"\n"; + /* FIXME: Specific to the pyramid project */ + $config_text .= "ToggleRotateKey=Enter\n"; + $config_text .= "PrevScreenKey=Left\n"; + $config_text .= "NextScreenKey=Right\n"; + $config_text .= "ScrollUpKey=Up\n"; + $config_text .= "ScrollDownKey=Down\n"; + /* FIXME: pyramid test menu */ + $config_text .= "[menu]\n"; + $config_text .= "MenuKey=Escape\n"; + $config_text .= "EnterKey=Enter\n"; + $config_text .= "UpKey=Up\n"; + $config_text .= "DownKey=Down\n"; + + /* lcdproc default driver definitions */ + switch($lcdproc_config[driver]) { + case "bayrad": + $config_text .= "[{$lcdproc_config['driver']}]\n"; + $config_text .= "Device={$realport}\n"; + $config_text .= "Speed=9600\n"; + break; + case "CFontz": + $config_text .= "[{$lcdproc_config['driver']}]\n"; + $config_text .= "Device={$realport}\n"; + $config_text .= "Size={$lcdproc_config['size']}\n"; + $config_text .= "Contrast=350\n"; + $config_text .= "Brightness=1000\n"; + $config_text .= "OffBrightness=50\n"; + $config_text .= "Speed=9600\n"; + $config_text .= "NewFirmware=no\n"; + $config_text .= "Reboot=no\n"; + break; + case "CFontz633": + $config_text .= "[{$lcdproc_config['driver']}]\n"; + $config_text .= "Device={$realport}\n"; + $config_text .= "Size={$lcdproc_config['size']}\n"; + $config_text .= "Contrast=350\n"; + $config_text .= "Brightness=1000\n"; + $config_text .= "OffBrightness=50\n"; + $config_text .= "Speed=19200\n"; + $config_text .= "NewFirmware=yes\n"; + $config_text .= "Reboot=yes\n"; + break; + case "CFontzPacket": + $config_text .= "[{$lcdproc_config['driver']}]\n"; + $config_text .= "Device={$realport}\n"; + $config_text .= "Model=635\n"; + $config_text .= "Size={$lcdproc_config['size']}\n"; + $config_text .= "Contrast=350\n"; + $config_text .= "Brightness=1000\n"; + $config_text .= "OffBrightness=50\n"; + $config_text .= "Speed=115200\n"; + $config_text .= "NewFirmware=yes\n"; + $config_text .= "Reboot=yes\n"; + break; + case "curses": + $config_text .= "[{$lcdproc_config['driver']}]\n"; + $config_text .= "Foreground=blue\n"; + $config_text .= "Background=cyan\n"; + $config_text .= "Backlight=red\n"; + $config_text .= "Size={$lcdproc_config['size']}\n"; + $config_text .= "TopLeftX=7\n"; + $config_text .= "TopLeftY=7\n"; + $config_text .= "UseACS=no\n"; + break; + case "CwLynx": + $config_text .= "[{$lcdproc_config['driver']}]\n"; + $config_text .= "Model=12232\n"; + $config_text .= "Device={$realport}\n"; + $config_text .= "Size={$lcdproc_config['size']}\n"; + $config_text .= "Speed=19200\n"; + $config_text .= "Reboot=no\n"; + break; + case "pyramid": + $config_text .= "[{$lcdproc_config['driver']}]\n"; + $config_text .= "Device={$realport}\n"; + $config_text .= "Size={$lcdproc_config['size']}\n"; + break; + case "ea65": + $config_text .= "[{$lcdproc_config['driver']}]\n"; + $config_text .= "Device={$realport}\n"; + $config_text .= "OffBrightness=0\n"; + $config_text .= "Brightness=500\n"; + break; + default: + lcdproc_warn("The chosen lcdproc driver is not a valid choice"); + unset($lcdproc_config[driver]); + } + + /* generate rc file start and stop */ + $client_script = <<<EOD +#!/bin/sh + +# script starts a lcd client and always keeps it active. +counter=1 +while [ "\$counter" -ne 0 ] +do + # loop the client to drive the display + /usr/local/bin/php -f /usr/local/pkg/lcdproc_client.php + sleep 1 +done + +EOD; + + /* generate rc file start and stop */ + $stop = <<<EOD + +if [ `ps auxw |awk '/LCD[d]/ {print $2}'| wc -l` != 0 ]; then + ps auxw |awk '/LCD[d]/ {print $2}'|xargs kill + sleep 1 +fi +if [ `ps auxw |awk '/lcdclient.s[h]/ {print $2}'| wc -l` != 0 ]; then + ps auxw |awk '/lcdclient.s[h]/ {print $2}'|xargs kill + sleep 1 +fi + +EOD; + $start = $stop ."\n"; + $start .= "\t/usr/local/sbin/LCDd -c ". LCDPROC_CONFIG ."\n"; + $start .= "\t". LCDPROC_CLIENT ." &\n"; + + /* write out the configuration */ + conf_mount_rw(); + lcdproc_write_script(LCDPROC_CLIENT, $client_script); + lcdproc_write_config(LCDPROC_CONFIG, $config_text); + write_rcfile(array( + 'file' => 'lcdproc.sh', + 'start' => $start, + 'stop' => $stop + )); + conf_mount_ro(); + + /* if lcdproc not running start it */ + if(!lcdproc_running()) { + lcdproc_notice("Starting service lcdproc"); + lcdproc_action('start'); + } + /* or restart lcdproc if settings were changed */ + elseif($_POST['comport']) { + lcdproc_notice("Restarting service lcdproc"); + lcdproc_action('restart'); + } + } + + if((! $lcdproc_config['driver']) || ($lcdproc_config['comport'] == "none")) { + /* no parameters user does not want lcdproc running */ + /* lets stop the service and remove the rc file */ + + if(file_exists(LCDPROC_RCFILE)) { + if(!$lcdproc_config['enable']) { + lcdproc_notice('Stopping service: lcdproc disabled'); + } else { + lcdproc_notice('Stopping service: no com port selected'); + } + lcdproc_action('stop'); + conf_mount_rw(); + unlink(LCDPROC_RCFILE); + unlink(LCDPROC_CLIENT); + unlink(LCDPROC_CONFIG); + conf_mount_ro(); + } + } + config_unlock(); + } + +?> diff --git a/config/lcdproc/lcdproc.xml b/config/lcdproc/lcdproc.xml new file mode 100644 index 00000000..fb097248 --- /dev/null +++ b/config/lcdproc/lcdproc.xml @@ -0,0 +1,304 @@ +<?xml version="1.0" encoding="utf-8" ?> +<packagegui> + <title>Services: LCDproc</title> + <name>lcdproc</name> + <version>0.5.2_1-p11</version> + <savetext>Save</savetext> + <include_file>/usr/local/pkg/lcdproc.inc</include_file> + <tabs> + <tab> + <text>Server</text> + <url>/pkg_edit.php?xml=lcdproc.xml&id=0</url> + <active/> + </tab> + <tab> + <text>Screens</text> + <url>/pkg_edit.php?xml=lcdproc_screens.xml&id=0</url> + </tab> + </tabs> + <menu> + <name>LCDproc</name> + <tooltiptext>Set LCDproc settings such as display driver and com port</tooltiptext> + <section>Services</section> + <url>/pkg_edit.php?xml=lcdproc.xml&id=0</url> + </menu> + <additional_files_needed> + <item>http://www.pfsense.org/packages/config/lcdproc/lcdproc.inc</item> + <prefix>/usr/local/pkg/</prefix> + <chmod>0755</chmod> + </additional_files_needed> + <additional_files_needed> + <item>http://www.pfsense.org/packages/config/lcdproc/lcdproc_screens.xml</item> + <prefix>/usr/local/pkg/</prefix> + <chmod>0755</chmod> + </additional_files_needed> + <additional_files_needed> + <item>http://www.pfsense.org/packages/config/lcdproc/lcdproc_client.php</item> + <prefix>/usr/local/pkg/</prefix> + <chmod>0755</chmod> + </additional_files_needed> + <service> + <name>lcdproc</name> + <rcfile>lcdproc.sh</rcfile> + <executable>lcdproc</executable> + </service> + <fields> + <field> + <fielddescr>Enable LCDproc</fielddescr> + <fieldname>enable</fieldname> + <type>checkbox</type> + </field> + <field> + <fieldname>comport</fieldname> + <fielddescr>Com Port</fielddescr> + <description>Set the com port LCDproc should use.</description> + <type>select</type> + <options> + <option> + <value>none</value> + <name>none</name> + </option> + <option> + <value>com2</value> + <name>Serial Com port 2 (/dev/cua1)</name> + </option> + <option> + <value>ucom1</value> + <name>USB Com port 1 (/dev/cuaU0)</name> + </option> + <option> + <value>ucom2</value> + <name>USB Com port 2 (/dev/cuaU1)</name> + </option> + <option> + <value>lpt1</value> + <name>Parallel port 1 (/dev/lpt0)</name> + </option> + </options> + <default_value>ucom1</default_value> + </field> + <field> + <fieldname>size</fieldname> + <fielddescr>Display Size</fielddescr> + <description>Set the display size lcdproc should use.</description> + <type>select</type> + <options> + <option> + <value>12x1</value> + <name>1 rows 12 colums</name> + </option> + <option> + <value>12x2</value> + <name>2 rows 12 colums</name> + </option> + <option> + <value>12x4</value> + <name>4 rows 12 colums</name> + </option> + <option> + <value>16x1</value> + <name>1 row 16 colums</name> + </option> + <option> + <value>16x2</value> + <name>2 rows 16 colums</name> + </option> + <option> + <value>16x4</value> + <name>4 rows 16 colums</name> + </option> + <option> + <value>20x1</value> + <name>1 row 20 colums</name> + </option> + <option> + <value>20x2</value> + <name>2 rows 20 colums</name> + </option> + <option> + <value>20x4</value> + <name>4 rows 20 colums</name> + </option> + </options> + <default_value>16x2</default_value> + </field> + <field> + <fieldname>driver</fieldname> + <fielddescr>Driver</fielddescr> + <description>Set the LCD driver LCDproc should use.</description> + <type>select</type> + <options> + <option> + <value>bayrad</value> + <name>bayrad</name> + </option> + <option> + <value>CFontz</value> + <name>CrystalFontz</name> + </option> + <option> + <value>CFontz633</value> + <name>CrystalFontz 633</name> + </option> + <option> + <value>CFontzPacket</value> + <name>CrystalFontz Packet</name> + </option> + <option> + <value>curses</value> + <name>curses</name> + </option> + <option> + <value>CwLnx</value> + <name>CwLnx</name> + </option> + <option> + <value>ea65</value> + <name>ea65</name> + </option> + <option> + <value>EyeBoxOne</value> + <name>EyeBoxOne</name> + </option> + <option> + <value>gl5</value> + <name>gl5</name> + </option> + <option> + <value>glcdlib</value> + <name>glcdlib</name> + </option> + <option> + <value>glk</value> + <name>glk</name> + </option> + <option> + <value>hd44780</value> + <name>hd44780</name> + </option> + <option> + <value>icp_a106</value> + <name>icp_a106</name> + </option> + <option> + <value>imon</value> + <name>imon</name> + </option> + <option> + <value>IOWarrior</value> + <name>IOWarrior</name> + </option> + <option> + <value>irman</value> + <name>irman</name> + </option> + <option> + <value>joy</value> + <name>joy</name> + </option> + <option> + <value>lb216</value> + <name>lb216</name> + </option> + <option> + <value>lcdm001</value> + <name>lcdm001</name> + </option> + <option> + <value>lcterm</value> + <name>lcterm</name> + </option> + <option> + <value>lirc</value> + <name>lirc</name> + </option> + <option> + <value>MD8800</value> + <name>MD8800</name> + </option> + <option> + <value>ms6931</value> + <name>ms6931</name> + </option> + <option> + <value>mtc_s16209x</value> + <name>mtc_s16209x</name> + </option> + <option> + <value>MtxOrb</value> + <name>MtxOrb</name> + </option> + <option> + <value>NoritakeVFD</value> + <name>NoritakeVFD</name> + </option> + <option> + <value>picolcd</value> + <name>picolcd</name> + </option> + <option> + <value>pyramid</value> + <name>pyramid</name> + </option> + <option> + <value>Sed1330</value> + <name>Sed1330</name> + </option> + <option> + <value>sed1520</value> + <name>sed1520</name> + </option> + <option> + <value>serialpos</value> + <name>serialpos</name> + </option> + <option> + <value>serialVFD</value> + <name>serialVFD</name> + </option> + <option> + <value>sli</value> + <name>sli</name> + </option> + <option> + <value>stv5730</value> + <name>stv5730</name> + </option> + <option> + <value>svga</value> + <name>svga</name> + </option> + <option> + <value>t6963</value> + <name>t6963</name> + </option> + <option> + <value>text</value> + <name>text</name> + </option> + <option> + <value>tyan</value> + <name>tyan</name> + </option> + <option> + <value>ula200</value> + <name>ula200</name> + </option> + <option> + <value>xosd</value> + <name>xosd</name> + </option> + </options> + <default_value>pyramid</default_value> + </field> + </fields> + <custom_php_command_before_form> + before_form_lcdproc(&$pkg); + </custom_php_command_before_form> + <custom_php_validation_command> + validate_form_lcdproc($_POST, &$input_errors); + </custom_php_validation_command> + <custom_php_resync_config_command> + sync_package_lcdproc(); + </custom_php_resync_config_command> +</packagegui> diff --git a/config/lcdproc/lcdproc_client.php b/config/lcdproc/lcdproc_client.php new file mode 100644 index 00000000..b26767c3 --- /dev/null +++ b/config/lcdproc/lcdproc_client.php @@ -0,0 +1,525 @@ +<?php +/* $Id$ */ +/* + lcdproc_client.php + Copyright (C) 2007 Seth Mos <seth.mos@xs4all.nl> + 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"); + require_once("/usr/local/pkg/lcdproc.inc"); + require_once("/usr/local/www/includes/functions.inc.php"); + + function get_uptime_stats() { + exec("/usr/bin/uptime", $output, $ret); + if(stristr($output[0], "day")) { + $temp = explode(" ", $output[0]); + $status = "$temp[2] $temp[3] $temp[4] $temp[5] $temp[6] $temp[7] ". substr($temp[8], 0, -1); + } else { + $temp = explode(" ", $output[0]); + $status = "$temp[2] $temp[3] $temp[4] $temp[5] $temp[6] ". substr($temp[7], 0, -1); + } + return($status); + } + + function get_loadavg_stats() { + exec("/usr/bin/uptime", $output, $ret); + if(stristr($output[0], "day")) { + $temp = explode(" ", $output[0]); + $status = "$temp[11] $temp[12] $temp[13]"; + } else { + $temp = explode(" ", $output[0]); + $status = "$temp[10] $temp[11] $temp[12]"; + } + return($status); + } + + function get_interfaces_stats() { + global $g; + global $config; + $ifstatus = array(); + $i = 0; + $ifdescrs = array('wan' => 'WAN', 'lan' => 'LAN'); + for ($j = 1; isset($config['interfaces']['opt' . $j]); $j++) { + $ifdescrs['opt' . $j] = $config['interfaces']['opt' . $j]['descr']; + } + foreach ($ifdescrs as $ifdescr => $ifname){ + $ifinfo = get_interface_info($ifdescr); + if($ifinfo['status'] == "up") { + $online = "Up"; + } else { + $online = "Down"; + } + if(!empty($ifinfo['ipaddr'])) { + $ip = htmlspecialchars($ifinfo['ipaddr']); + } else { + $ip = "-"; + } + $ifstatus[] = htmlspecialchars($ifname) ." [$online]"; + } + $status = " ". implode(", ", $ifstatus); + return($status); + } + + function get_slbd_stats() { + global $g; + global $config; + + if (!is_array($config['load_balancer']['lbpool'])) { + $config['load_balancer']['lbpool'] = array(); + } + $a_pool = &$config['load_balancer']['lbpool']; + + $slbd_logfile = "{$g['varlog_path']}/slbd.log"; + + $nentries = $config['syslog']['nentries']; + if (!$nentries) + $nentries = 50; + + $now = time(); + $year = date("Y"); + $pstatus = ""; + $i = 0; + foreach ($a_pool as $vipent) { + $pstatus[] = "{$vipent['name']}"; + if ($vipent['type'] == "gateway") { + $poolfile = "{$g['tmp_path']}/{$vipent['name']}.pool"; + if(file_exists("$poolfile")) { + $poolstatus = file_get_contents("$poolfile"); + } else { + continue; + } + foreach ((array) $vipent['servers'] as $server) { + $lastchange = ""; + $svr = split("\|", $server); + $monitorip = $svr[1]; + if(stristr($poolstatus, $monitorip)) { + $online = "Up"; + } else { + $online = "Down"; + } + $pstatus[] = strtoupper($svr[0]) ." [{$online}]"; + } + } else { + $pstatus[] = "{$vipent['monitor']}"; + } + } + if(count($a_pool) == 0) { + $pstatus[] = "Disabled"; + } + $status = implode(", ", $pstatus); + return($status); + } + + function get_carp_stats () { + global $g; + global $config; + + if(is_array($config['virtualip']['vip'])) { + $carpint = 0; + $initcount = 0; + $mastercount = 0; + $backupcount = 0; + foreach($config['virtualip']['vip'] as $carp) { + if ($carp['mode'] != "carp") { + continue; + } + $ipaddress = $carp['subnet']; + $password = $carp['password']; + $netmask = $carp['subnet_bits']; + $vhid = $carp['vhid']; + $advskew = $carp['advskew']; + $carp_int = find_carp_interface($ipaddress); + $status = get_carp_interface_status($carp_int); + switch($status) { + case "MASTER": + $mastercount++; + break; + case "BACKUP": + $backupcount++; + break; + case "INIT": + $initcount++; + break; + } + } + $status = "M/B/I {$mastercount}/{$backupcount}/{$initcount}"; + } else { + $status = "CARP Disabled"; + } + return($status); + } + + function get_ipsec_tunnel_sad() { + /* query SAD */ + $fd = @popen("/sbin/setkey -D", "r"); + $sad = array(); + if ($fd) { + while (!feof($fd)) { + $line = chop(fgets($fd)); + if (!$line) + continue; + if ($line == "No SAD entries.") + break; + if ($line[0] != "\t") { + if (is_array($cursa)) + $sad[] = $cursa; + $cursa = array(); + list($cursa['src'],$cursa['dst']) = explode(" ", $line); + $i = 0; + } else { + $linea = explode(" ", trim($line)); + if ($i == 1) { + $cursa['proto'] = $linea[0]; + $cursa['spi'] = substr($linea[2], strpos($linea[2], "x")+1, -1); + } else if ($i == 2) { + $cursa['ealgo'] = $linea[1]; + } else if ($i == 3) { + $cursa['aalgo'] = $linea[1]; + } + } + $i++; + } + if (is_array($cursa) && count($cursa)) + $sad[] = $cursa; + pclose($fd); + } + return($sad); + } + + function get_ipsec_tunnel_src($tunnel) { + global $g, $config, $sad; + $if = "WAN"; + if ($tunnel['interface']) { + $if = $tunnel['interface']; + $realinterface = convert_friendly_interface_to_real_interface_name($if); + $interfaceip = find_interface_ip($realinterface); + } + return $interfaceip; + } + + function output_ipsec_tunnel_status($tunnel) { + global $g, $config, $sad; + $if = "WAN"; + $interfaceip = get_ipsec_tunnel_src($tunnel); + $foundsrc = false; + $founddst = false; + + if(!is_array($sad)) { + /* we have no sad array, bail */ + return(false); + } + foreach($sad as $sa) { + if($sa['src'] == $interfaceip) + $foundsrc = true; + if($sa['dst'] == $tunnel['remote-gateway']) + $founddst = true; + } + if($foundsrc && $founddst) { + /* tunnel is up */ + $iconfn = "pass"; + return(true); + } else { + /* tunnel is down */ + $iconfn = "reject"; + return(false); + } + } + + function get_ipsec_stats() { + global $g, $config, $sad; + $sad = array(); + $sad = get_ipsec_tunnel_sad(); + + $activecounter = 0; + $inactivecounter = 0; + + foreach ($config['ipsec']['tunnel'] as $tunnel){ + $ipsecstatus = false; + + $tun_disabled = "false"; + $foundsrc = false; + $founddst = false; + + if (isset($tunnel['disabled'])) { + $tun_disabled = "true"; + continue; + } + + if(output_ipsec_tunnel_status($tunnel)) { + /* tunnel is up */ + $iconfn = "true"; + $activecounter++; + } else { + /* tunnel is down */ + $iconfn = "false"; + $inactivecounter++; + } + + } + + if (is_array($config['ipsec']['tunnel'])) { + $status = "Up/Down $activecounter/$inactivecounter"; + } else { + $status = "IPSEC Disabled"; + } + return($status); + } + + + /* Define functions */ + function send_lcd_commands($lcd, $lcd_cmds) { + if(!is_array($lcd_cmds) || (empty($lcd_cmds))) { + lcdproc_warn("Failed to interpret lcd commands"); + return; + } + foreach($lcd_cmds as $lcd_cmd) { + $cmd_output = ""; + if(! fwrite($lcd, "$lcd_cmd\n")) { + lcdproc_warn("Connection to LCDd process lost $errstr ($errno)"); + die(); + } + $cmd_output = fgets($lcd, 256); + // FIXME: add support for interpreting menu commands here. + if(preg_match("/^huh?/", $cmd_output)) { + lcdproc_notice("LCDd output: \"$cmd_output\". Executed \"$lcd_cmd\""); + } + } + } + + function build_interface($lcd) { + global $g; + global $config; + $lcdproc_screens_config = $config['installedpackages']['lcdprocscreens']['config'][0]; + + $lcd_cmds = array(); + $lcd_cmds[] = "hello"; + $lcd_cmds[] = "client_set name pfSense"; + $lcd_cmds[] = "screen_add welcome_scr"; + $lcd_cmds[] = "screen_set welcome_scr heartbeat off"; + $lcd_cmds[] = "screen_set welcome_scr name welcome"; + $lcd_cmds[] = "screen_set $name duration 80"; + $lcd_cmds[] = "widget_add welcome_scr title_wdgt title"; + $lcd_cmds[] = "widget_add welcome_scr text_wdgt scroller"; + + /* process screens to display */ + if(is_array($lcdproc_screens_config)) { + foreach($lcdproc_screens_config as $name => $screen) { + if($screen == "on") { + switch($name) { + case "scr_time": + $lcd_cmds[] = "screen_add $name"; + $lcd_cmds[] = "screen_set $name heartbeat off"; + $lcd_cmds[] = "screen_set $name name $name"; + $lcd_cmds[] = "screen_set $name duration 40"; + $lcd_cmds[] = "widget_add $name title_wdgt string"; + $lcd_cmds[] = "widget_add $name text_wdgt scroller"; + break; + case "scr_uptime": + $lcd_cmds[] = "screen_add $name"; + $lcd_cmds[] = "screen_set $name heartbeat off"; + $lcd_cmds[] = "screen_set $name name $name"; + $lcd_cmds[] = "screen_set $name duration 80"; + $lcd_cmds[] = "widget_add $name title_wdgt string"; + $lcd_cmds[] = "widget_add $name text_wdgt scroller"; + break; + case "scr_hostname": + $lcd_cmds[] = "screen_add $name"; + $lcd_cmds[] = "screen_set $name heartbeat off"; + $lcd_cmds[] = "screen_set $name name $name"; + $lcd_cmds[] = "screen_set $name duration 80"; + $lcd_cmds[] = "widget_add $name title_wdgt string"; + $lcd_cmds[] = "widget_add $name text_wdgt scroller"; + break; + case "scr_system": + $lcd_cmds[] = "screen_add $name"; + $lcd_cmds[] = "screen_set $name heartbeat off"; + $lcd_cmds[] = "screen_set $name name $name"; + $lcd_cmds[] = "screen_set $name duration 80"; + $lcd_cmds[] = "widget_add $name title_wdgt string"; + $lcd_cmds[] = "widget_add $name text_wdgt scroller"; + break; + case "scr_disk": + $lcd_cmds[] = "screen_add $name"; + $lcd_cmds[] = "screen_set $name heartbeat off"; + $lcd_cmds[] = "screen_set $name name $name"; + $lcd_cmds[] = "screen_set $name duration 80"; + $lcd_cmds[] = "widget_add $name title_wdgt string"; + $lcd_cmds[] = "widget_add $name text_wdgt scroller"; + break; + case "scr_load": + $lcd_cmds[] = "screen_add $name"; + $lcd_cmds[] = "screen_set $name heartbeat off"; + $lcd_cmds[] = "screen_set $name name $name"; + $lcd_cmds[] = "screen_set $name duration 80"; + $lcd_cmds[] = "widget_add $name title_wdgt string"; + $lcd_cmds[] = "widget_add $name text_wdgt scroller"; + break; + case "scr_states": + $lcd_cmds[] = "screen_add $name"; + $lcd_cmds[] = "screen_set $name heartbeat off"; + $lcd_cmds[] = "screen_set $name name $name"; + $lcd_cmds[] = "screen_set $name duration 80"; + $lcd_cmds[] = "widget_add $name title_wdgt string"; + $lcd_cmds[] = "widget_add $name text_wdgt scroller"; + break; + case "scr_carp": + $lcd_cmds[] = "screen_add $name"; + $lcd_cmds[] = "screen_set $name heartbeat off"; + $lcd_cmds[] = "screen_set $name name $name"; + $lcd_cmds[] = "screen_set $name duration 80"; + $lcd_cmds[] = "widget_add $name title_wdgt string"; + $lcd_cmds[] = "widget_add $name text_wdgt scroller"; + break; + case "scr_ipsec": + $lcd_cmds[] = "screen_add $name"; + $lcd_cmds[] = "screen_set $name heartbeat off"; + $lcd_cmds[] = "screen_set $name name $name"; + $lcd_cmds[] = "screen_set $name duration 80"; + $lcd_cmds[] = "widget_add $name title_wdgt string"; + $lcd_cmds[] = "widget_add $name text_wdgt scroller"; + break; + case "scr_slbd": + $lcd_cmds[] = "screen_add $name"; + $lcd_cmds[] = "screen_set $name heartbeat off"; + $lcd_cmds[] = "screen_set $name name $name"; + $lcd_cmds[] = "screen_set $name duration 80"; + $lcd_cmds[] = "widget_add $name title_wdgt string"; + $lcd_cmds[] = "widget_add $name text_wdgt scroller"; + break; + case "scr_interfaces": + $lcd_cmds[] = "screen_add $name"; + $lcd_cmds[] = "screen_set $name heartbeat off"; + $lcd_cmds[] = "screen_set $name name $name"; + $lcd_cmds[] = "screen_set $name duration 80"; + $lcd_cmds[] = "widget_add $name title_wdgt string"; + $lcd_cmds[] = "widget_add $name text_wdgt scroller"; + break; + } + } + } + } + send_lcd_commands($lcd, $lcd_cmds); + } + + function loop_status($lcd) { + global $g; + global $config; + $lcdproc_screens_config = $config['installedpackages']['lcdprocscreens']['config'][0]; + if(empty($g['product_name'])) { + $g['product_name'] = "pfSense"; + } + $version = @file_get_contents("/etc/version"); + $version = trim($version); + /* keep a counter to see how many times we can loop */ + $i = 1; + while($i) { + $lcd_cmds = array(); + $lcd_cmds[] = "widget_set welcome_scr title_wdgt \"Welcome to\""; + $lcd_cmds[] = "widget_set welcome_scr text_wdgt 1 2 16 2 h 2 \"{$g['product_name']} {$version}\""; + + /* process screens to display */ + foreach((array) $lcdproc_screens_config as $name => $screen) { + if($screen != "on") { + continue; + } + switch($name) { + case "scr_time": + $time = date ("n/j/Y H:i"); + $lcd_cmds[] = "widget_set $name title_wdgt 1 1 \"+ System Time\""; + $lcd_cmds[] = "widget_set $name text_wdgt 1 2 16 2 h 2 \"{$time}\""; + break; + case "scr_uptime": + $uptime = get_uptime_stats(); + $lcd_cmds[] = "widget_set $name title_wdgt 1 1 \"+ System Uptime\""; + $lcd_cmds[] = "widget_set $name text_wdgt 1 2 16 2 h 2 \"{$uptime}\""; + break; + case "scr_hostname": + exec("/bin/hostname", $output, $ret); + $hostname = $output[0]; + $lcd_cmds[] = "widget_set $name title_wdgt 1 1 \"+ System Name\""; + $lcd_cmds[] = "widget_set $name text_wdgt 1 2 16 2 h 2 \"{$hostname}\""; + break; + case "scr_system": + $processor = cpu_usage(); + $memory = mem_usage(); + $lcd_cmds[] = "widget_set $name title_wdgt 1 1 \"+ System Stats\""; + $lcd_cmds[] = "widget_set $name text_wdgt 1 2 16 2 h 2 \"CPU {$processor}%, Mem {$memory}%\""; + break; + case "scr_disk": + $disk = disk_usage(); + $lcd_cmds[] = "widget_set $name title_wdgt 1 1 \"+ Disk Use\""; + $lcd_cmds[] = "widget_set $name text_wdgt 1 2 16 2 h 2 \"Disk {$disk}%\""; + break; + case "scr_load": + $loadavg = get_loadavg_stats(); + $lcd_cmds[] = "widget_set $name title_wdgt 1 1 \"+ Load Averages\""; + $lcd_cmds[] = "widget_set $name text_wdgt 1 2 16 2 h 2 \"{$loadavg}\""; + break; + case "scr_states": + $states = get_pfstate(); + $lcd_cmds[] = "widget_set $name title_wdgt 1 1 \"+ Traffic States\""; + $lcd_cmds[] = "widget_set $name text_wdgt 1 2 16 2 h 2 \"Curr/Max {$states}\""; + break; + case "scr_carp": + $carp = get_carp_stats(); + $lcd_cmds[] = "widget_set $name title_wdgt 1 1 \"+ CARP State\""; + $lcd_cmds[] = "widget_set $name text_wdgt 1 2 16 2 h 2 \"{$carp}\""; + break; + case "scr_ipsec": + $ipsec = get_ipsec_stats(); + $lcd_cmds[] = "widget_set $name title_wdgt 1 1 \"+ IPsec Tunnels\""; + $lcd_cmds[] = "widget_set $name text_wdgt 1 2 16 2 h 2 \"{$ipsec}\""; + break; + case "scr_slbd": + $slbd = get_slbd_stats(); + $lcd_cmds[] = "widget_set $name title_wdgt 1 1 \"+ Load Balancer\""; + $lcd_cmds[] = "widget_set $name text_wdgt 1 2 16 2 h 2 \"{$slbd}\""; + break; + case "scr_interfaces": + $interfaces = get_interfaces_stats(); + $lcd_cmds[] = "widget_set $name title_wdgt 1 1 \"+ Interfaces\""; + $lcd_cmds[] = "widget_set $name text_wdgt 1 2 16 2 h 2 \"{$interfaces}\""; + break; + } + } + + send_lcd_commands($lcd, $lcd_cmds); + sleep(5); + $i++; + } + } + + /* Connect to the LCDd port and interface with the LCD */ + $lcd = fsockopen(LCDPROC_HOST, LCDPROC_PORT, $errno, $errstr, 10); + if (!$lcd) { + lcdproc_warn("Failed to connect to LCDd process $errstr ($errno)"); + } else { + build_interface($lcd); + loop_status($lcd); + /* loop exited? Close fd and wait for the script to kick in again */ + fclose($lcd); + } +?> diff --git a/config/lcdproc/lcdproc_screens.xml b/config/lcdproc/lcdproc_screens.xml new file mode 100644 index 00000000..5c43ab61 --- /dev/null +++ b/config/lcdproc/lcdproc_screens.xml @@ -0,0 +1,91 @@ +<?xml version="1.0" encoding="utf-8" ?> +<packagegui> + <title>Services: LCDproc: Screens</title> + <name>lcdproc_screens</name> + <version>0.5.2_1-p9</version> + <savetext>Save</savetext> + <include_file>/usr/local/pkg/lcdproc.inc</include_file> + <tabs> + <tab> + <text>Server</text> + <url>/pkg_edit.php?xml=lcdproc.xml&id=0</url> + </tab> + <tab> + <text>Screens</text> + <url>/pkg_edit.php?xml=lcdproc_screens.xml&id=0</url> + <active/> + </tab> + </tabs> + <menu> + <name>LCDproc</name> + <tooltiptext>Set LCDproc settings such as display driver and com port</tooltiptext> + <section>Services</section> + <url>/pkg_edit.php?xml=lcdproc.xml&id=0</url> + </menu> + <fields> + <field> + <fielddescr>Enable Time</fielddescr> + <fieldname>scr_time</fieldname> + <type>checkbox</type> + </field> + <field> + <fielddescr>Enable Uptime</fielddescr> + <fieldname>scr_uptime</fieldname> + <type>checkbox</type> + </field> + <field> + <fielddescr>Enable Hostname</fielddescr> + <fieldname>scr_hostname</fieldname> + <type>checkbox</type> + </field> + <field> + <fielddescr>Enable System</fielddescr> + <fieldname>scr_system</fieldname> + <type>checkbox</type> + </field> + <field> + <fielddescr>Enable Disk</fielddescr> + <fieldname>scr_disk</fieldname> + <type>checkbox</type> + </field> + <field> + <fielddescr>Enable Load</fielddescr> + <fieldname>scr_load</fieldname> + <type>checkbox</type> + </field> + <field> + <fielddescr>Enable States</fielddescr> + <fieldname>scr_states</fieldname> + <type>checkbox</type> + </field> + <field> + <fielddescr>Enable Carp</fielddescr> + <fieldname>scr_carp</fieldname> + <type>checkbox</type> + </field> + <field> + <fielddescr>Enable IPsec</fielddescr> + <fieldname>scr_ipsec</fieldname> + <type>checkbox</type> + </field> + <field> + <fielddescr>Enable Load Balancer</fielddescr> + <fieldname>scr_slbd</fieldname> + <type>checkbox</type> + </field> + <field> + <fielddescr>Enable Interfaces</fielddescr> + <fieldname>scr_interfaces</fieldname> + <type>checkbox</type> + </field> + </fields> + <custom_php_command_before_form> + before_form_lcdproc_screens(&$pkg); + </custom_php_command_before_form> + <custom_php_validation_command> + validate_form_lcdproc_screens($_POST, &$input_errors); + </custom_php_validation_command> + <custom_php_resync_config_command> + sync_package_lcdproc_screens(); + </custom_php_resync_config_command> +</packagegui> |