aboutsummaryrefslogtreecommitdiffstats
path: root/config/lcdproc
diff options
context:
space:
mode:
Diffstat (limited to 'config/lcdproc')
-rw-r--r--config/lcdproc/lcdproc.inc363
-rw-r--r--config/lcdproc/lcdproc.xml304
-rw-r--r--config/lcdproc/lcdproc_client.php525
-rw-r--r--config/lcdproc/lcdproc_screens.xml91
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&amp;id=0</url>
+ <active/>
+ </tab>
+ <tab>
+ <text>Screens</text>
+ <url>/pkg_edit.php?xml=lcdproc_screens.xml&amp;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&amp;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(&amp;$pkg);
+ </custom_php_command_before_form>
+ <custom_php_validation_command>
+ validate_form_lcdproc($_POST, &amp;$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&amp;id=0</url>
+ </tab>
+ <tab>
+ <text>Screens</text>
+ <url>/pkg_edit.php?xml=lcdproc_screens.xml&amp;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&amp;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(&amp;$pkg);
+ </custom_php_command_before_form>
+ <custom_php_validation_command>
+ validate_form_lcdproc_screens($_POST, &amp;$input_errors);
+ </custom_php_validation_command>
+ <custom_php_resync_config_command>
+ sync_package_lcdproc_screens();
+ </custom_php_resync_config_command>
+</packagegui>