From cc95d6f89282c9d66120f2a9b40a9aaff2f981bb Mon Sep 17 00:00:00 2001 From: fmertz Date: Wed, 24 Jun 2020 16:25:21 +0000 Subject: system display: T2564 Extend VyOS to support appliance LCDs Added support for system LCDs under CLI system display +data/templates/system-display/LCDd.conf.tmpl template for LCDd server configuration file +data/templates/system-display/lcdproc.conf.tmpl template for lcdproc client configuration file +interface-definitions/system-display.xml.in CLI for system display +src/conf_mode/system-display.py processing code for system display +src/systemd/lcdproc.service systemd service definition file for lcdproc client CLI: system display model (SDEC|EZIO) system display config (enabled|disabled) system display show host (cpu|cpu-all|cpu-hist|disk|load-hist|memory|proc|uptime) network interface alias units (bps|Bps|pps) clock (big|mini|date-time) title system display duration system display hello system display bye --- src/conf_mode/system-display.py | 92 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100755 src/conf_mode/system-display.py (limited to 'src/conf_mode/system-display.py') diff --git a/src/conf_mode/system-display.py b/src/conf_mode/system-display.py new file mode 100755 index 000000000..4db375d8e --- /dev/null +++ b/src/conf_mode/system-display.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2020 Francois Mertz fireboxled at gmail.com +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 or later as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import os +import re + +from sys import exit + +from vyos.config import Config +from vyos import ConfigError +from vyos.util import run +from vyos.template import render + +from vyos import airbag +airbag.enable() + +def get_config(): + c = Config() + + if not c.exists('system display'): + return None + + c.set_level('system display') + + return c.get_config_dict([]) + +def generate(c): + if c == None: + return None + # Render config file for daemon LCDd + render('/etc/LCDd.conf', 'system-display/LCDd.conf.tmpl', c) + # Render config file for client lcdproc + render('/etc/lcdproc.conf', 'system-display/lcdproc.conf.tmpl', c) + + return None + +def verify(c): + if c == None: + return None + + if c.get('model') == None: + raise ConfigError('For system display, a model is [REQUIRED]') + + if c.get('show') == None: + raise ConfigError('For system display, show cannot be empty') + + if 'network' in c['show'] and 'interface' not in c['show']['network']: + raise ConfigError('system display show network must have at least one interface') + + if 'network' in c['show'] and 'interface' in c['show']['network'] and len(c['show']['network']['interface']) > 3: + raise ConfigError('system display show network interface cannot have more than 3 entries') + + return None + +def apply(c): + if not c or c['config'] == 'disabled': + # Stop client first + run('systemctl stop lcdproc.service') + # Stop server next + return run('systemctl stop LCDd.service') + + # Stop client first + run('systemctl stop lcdproc.service') + # Restart server next + run('systemctl restart LCDd.service') + # Start client + run('systemctl start lcdproc.service') + + return None + +if __name__ == '__main__': + try: + c = get_config() + verify(c) + generate(c) + apply(c) + except ConfigError as e: + print(e) + exit(1) -- cgit v1.2.3 From f3e0a409ee01e1b3ffa0c9a267434a7725f61231 Mon Sep 17 00:00:00 2001 From: fmertz Date: Sun, 28 Jun 2020 20:36:19 +0000 Subject: system display: T2564: Replace "config (enabled|disabled)" with "display disabled" * interface-definitions/system-display.xml.in system disply disabled * src/conf_mode/system-display.py system display disabled --- interface-definitions/system-display.xml.in | 26 ++++++-------------------- src/conf_mode/system-display.py | 2 +- 2 files changed, 7 insertions(+), 21 deletions(-) (limited to 'src/conf_mode/system-display.py') diff --git a/interface-definitions/system-display.xml.in b/interface-definitions/system-display.xml.in index ac9f17b6c..afa6dba10 100644 --- a/interface-definitions/system-display.xml.in +++ b/interface-definitions/system-display.xml.in @@ -2,7 +2,6 @@ @@ -42,27 +42,13 @@ - - + + - Configuration status - - enabled disabled - - - (enabled|disabled) - - Invalid system display config status - - enabled - Turn system display configuration ON - - - disabled - Turn system display configuration OFF - + Disable sytem display + - + Select the screens for the system display [REQUIRED] diff --git a/src/conf_mode/system-display.py b/src/conf_mode/system-display.py index 4db375d8e..e30d591cc 100755 --- a/src/conf_mode/system-display.py +++ b/src/conf_mode/system-display.py @@ -66,7 +66,7 @@ def verify(c): return None def apply(c): - if not c or c['config'] == 'disabled': + if not c or 'disabled' in c.keys(): # Stop client first run('systemctl stop lcdproc.service') # Stop server next -- cgit v1.2.3 From 440d0fb1115bbfb428132ef91804ae213ffca30f Mon Sep 17 00:00:00 2001 From: fmertz Date: Sun, 28 Jun 2020 21:21:27 +0000 Subject: system display: T2564: py code cleanup * src/conf_mode/system-display.py cleanup use of dictionary * data/templates/system-display/lcdproc.conf.tmpl cleanup, removed extra DateTime --- data/templates/system-display/lcdproc.conf.tmpl | 12 ++-- src/conf_mode/system-display.py | 75 +++++++++++++------------ 2 files changed, 43 insertions(+), 44 deletions(-) (limited to 'src/conf_mode/system-display.py') diff --git a/data/templates/system-display/lcdproc.conf.tmpl b/data/templates/system-display/lcdproc.conf.tmpl index 2fe491e63..92aee8efe 100644 --- a/data/templates/system-display/lcdproc.conf.tmpl +++ b/data/templates/system-display/lcdproc.conf.tmpl @@ -37,7 +37,6 @@ ReportToSyslog=true DisplayName="{%- if show['title'] %}{{ show['title'] }}{%- else %}VyOS{%- endif %}" {%- if show['host'] %} -{#%- for s in show['host'] %#} [CPU] # Show screen @@ -77,7 +76,6 @@ Active={%- if 'proc' in show['host'] %}true{%- else %}false{%- endif %} [Disk] # Show screen Active={%- if 'disk' in show['host'] %}true{%- else %}false{%- endif %} -{#%- endfor %#} {%- else %} {# if show['host'] #} {# Turn off sections that default active #} @@ -90,8 +88,6 @@ Active=false [Load] Active=false -[TimeDate] -Active=false {%- endif %} {# if show['host'] #} [TimeDate] @@ -118,10 +114,10 @@ TimeFormat="%H:%M" Active={%- if show['network']['interface'] %}true{%- else %}false{%- endif %} {%- for i in show['network']['interface'] %} # Show stats for Interface {{ i }} -Interface0={{ i }} +Interface{{ loop.index0 }}={{ i }} {%- if show['network']['interface'][i]['alias'] %} # Interface alias name to display [default: ] -Alias0={{ show['network']['interface'][i]['alias'] }} +Alias{{ loop.index0 }}={{ show['network']['interface'][i]['alias'] }} {%- endif %} {%- endfor %} @@ -139,7 +135,7 @@ unit=bit #transfer=TRUE {%- endif %} {# if show['network'] #} -{%- else %} {# if show #} +{%- else %}{# if show #} {# Turn off sections that default active #} [CPU] @@ -153,7 +149,7 @@ Active=false [TimeDate] Active=false -{%- endif %} +{%- endif %}{# if show #} [Battery] # Show screen diff --git a/src/conf_mode/system-display.py b/src/conf_mode/system-display.py index e30d591cc..557b7cf6a 100755 --- a/src/conf_mode/system-display.py +++ b/src/conf_mode/system-display.py @@ -15,7 +15,6 @@ # along with this program. If not, see . import os -import re from sys import exit @@ -28,53 +27,57 @@ from vyos import airbag airbag.enable() def get_config(): - c = Config() + # Return a (possibly empty) configuration dictionary + return Config().get_config_dict(['system', 'display']) - if not c.exists('system display'): - return None - - c.set_level('system display') - - return c.get_config_dict([]) - -def generate(c): - if c == None: +def generate(config_dict): + if not config_dict: return None # Render config file for daemon LCDd - render('/etc/LCDd.conf', 'system-display/LCDd.conf.tmpl', c) + render('/etc/LCDd.conf', 'system-display/LCDd.conf.tmpl', config_dict) # Render config file for client lcdproc - render('/etc/lcdproc.conf', 'system-display/lcdproc.conf.tmpl', c) + render('/etc/lcdproc.conf', 'system-display/lcdproc.conf.tmpl', config_dict) return None -def verify(c): - if c == None: +def verify(config_dict): + if not config_dict: return None - if c.get('model') == None: - raise ConfigError('For system display, a model is [REQUIRED]') + if 'model' not in config_dict: + raise ConfigError('Display model is [REQUIRED]') - if c.get('show') == None: - raise ConfigError('For system display, show cannot be empty') + if ( 'show' not in config_dict + or ( 'clock' not in config_dict['show'] + and 'network' not in config_dict['show'] + and 'host' not in config_dict['show'] + ) + ): + raise ConfigError('Display show must have a clock, host or network') - if 'network' in c['show'] and 'interface' not in c['show']['network']: - raise ConfigError('system display show network must have at least one interface') + if ( 'network' in config_dict['show'] + and 'interface' not in config_dict['show']['network'] + ): + raise ConfigError('Display show network must have an interface') - if 'network' in c['show'] and 'interface' in c['show']['network'] and len(c['show']['network']['interface']) > 3: - raise ConfigError('system display show network interface cannot have more than 3 entries') + if ( 'network' in config_dict['show'] + and 'interface' in config_dict['show']['network'] + and len(config_dict['show']['network']['interface']) > 3 + ): + raise ConfigError('Display show network cannot have > 3 interfaces') return None -def apply(c): - if not c or 'disabled' in c.keys(): - # Stop client first - run('systemctl stop lcdproc.service') - # Stop server next - return run('systemctl stop LCDd.service') - - # Stop client first +def apply(config_dict): + # Stop client run('systemctl stop lcdproc.service') - # Restart server next + + if not config_dict or 'disabled' in config_dict: + # Stop server + run('systemctl stop LCDd.service') + return None + + # Restart server run('systemctl restart LCDd.service') # Start client run('systemctl start lcdproc.service') @@ -83,10 +86,10 @@ def apply(c): if __name__ == '__main__': try: - c = get_config() - verify(c) - generate(c) - apply(c) + config_dict = get_config() + verify(config_dict) + generate(config_dict) + apply(config_dict) except ConfigError as e: print(e) exit(1) -- cgit v1.2.3 From 14e0a2339451492e226869cb977ab858bb1e7f17 Mon Sep 17 00:00:00 2001 From: fmertz Date: Thu, 2 Jul 2020 05:08:20 +0000 Subject: system display: T2564: Conf files to /run * src/conf_mode/system-display.py conf files to /run + src/systemd/LCDd@.service lo - src/systemd/lcdproc.service + src/systemd/lcdproc@.service lo --- src/conf_mode/system-display.py | 12 ++++++------ src/systemd/LCDd@.service | 10 ++++++++++ src/systemd/lcdproc.service | 10 ---------- src/systemd/lcdproc@.service | 10 ++++++++++ 4 files changed, 26 insertions(+), 16 deletions(-) create mode 100644 src/systemd/LCDd@.service delete mode 100644 src/systemd/lcdproc.service create mode 100644 src/systemd/lcdproc@.service (limited to 'src/conf_mode/system-display.py') diff --git a/src/conf_mode/system-display.py b/src/conf_mode/system-display.py index 557b7cf6a..9ab35a331 100755 --- a/src/conf_mode/system-display.py +++ b/src/conf_mode/system-display.py @@ -34,9 +34,9 @@ def generate(config_dict): if not config_dict: return None # Render config file for daemon LCDd - render('/etc/LCDd.conf', 'system-display/LCDd.conf.tmpl', config_dict) + render('/run/LCDd/LCDd.lo.conf', 'system-display/LCDd.conf.tmpl', config_dict) # Render config file for client lcdproc - render('/etc/lcdproc.conf', 'system-display/lcdproc.conf.tmpl', config_dict) + render('/run/lcdproc/lcdproc.lo.conf', 'system-display/lcdproc.conf.tmpl', config_dict) return None @@ -70,17 +70,17 @@ def verify(config_dict): def apply(config_dict): # Stop client - run('systemctl stop lcdproc.service') + run('systemctl stop lcdproc@lo.service') if not config_dict or 'disabled' in config_dict: # Stop server - run('systemctl stop LCDd.service') + run('systemctl stop LCDd@lo.service') return None # Restart server - run('systemctl restart LCDd.service') + run('systemctl restart LCDd@lo.service') # Start client - run('systemctl start lcdproc.service') + run('systemctl start lcdproc@lo.service') return None diff --git a/src/systemd/LCDd@.service b/src/systemd/LCDd@.service new file mode 100644 index 000000000..a4604cf21 --- /dev/null +++ b/src/systemd/LCDd@.service @@ -0,0 +1,10 @@ +[Unit] +Description=LCD display daemon on %I +Documentation=man:LCDd(8) http://www.lcdproc.org/ + +[Service] +User=root +ExecStart=/usr/sbin/LCDd -s 1 -f -c /run/LCDd/LCDd.%I.conf + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/src/systemd/lcdproc.service b/src/systemd/lcdproc.service deleted file mode 100644 index ea9178de9..000000000 --- a/src/systemd/lcdproc.service +++ /dev/null @@ -1,10 +0,0 @@ -[Unit] -Description=LCDproc system status information viewer -Documentation=man:lcdproc(8) http://www.lcdproc.org/ - -[Service] -User=root -ExecStart=/usr/bin/lcdproc -f -c /etc/lcdproc.conf - -[Install] -WantedBy=multi-user.target \ No newline at end of file diff --git a/src/systemd/lcdproc@.service b/src/systemd/lcdproc@.service new file mode 100644 index 000000000..9a1723dba --- /dev/null +++ b/src/systemd/lcdproc@.service @@ -0,0 +1,10 @@ +[Unit] +Description=LCDproc system status information viewer on %I +Documentation=man:lcdproc(8) http://www.lcdproc.org/ + +[Service] +User=root +ExecStart=/usr/bin/lcdproc -f -c /run/lcdproc/lcdproc.%I.conf + +[Install] +WantedBy=multi-user.target \ No newline at end of file -- cgit v1.2.3 From 48ddea3755c72db55e5366997a82d725e106c3aa Mon Sep 17 00:00:00 2001 From: fmertz Date: Sun, 5 Jul 2020 15:01:21 +0000 Subject: system display: T2564: Dictionary code update * src/conf_mode/system-display.py added get_first_key to dictionary call --- src/conf_mode/system-display.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) (limited to 'src/conf_mode/system-display.py') diff --git a/src/conf_mode/system-display.py b/src/conf_mode/system-display.py index 9ab35a331..3eafc30c0 100755 --- a/src/conf_mode/system-display.py +++ b/src/conf_mode/system-display.py @@ -27,18 +27,11 @@ from vyos import airbag airbag.enable() def get_config(): + conf = Config() + base = ['system', 'display'] + display = conf.get_config_dict(base, key_mangling=('-', '_'), get_first_key=True) # Return a (possibly empty) configuration dictionary - return Config().get_config_dict(['system', 'display']) - -def generate(config_dict): - if not config_dict: - return None - # Render config file for daemon LCDd - render('/run/LCDd/LCDd.lo.conf', 'system-display/LCDd.conf.tmpl', config_dict) - # Render config file for client lcdproc - render('/run/lcdproc/lcdproc.lo.conf', 'system-display/lcdproc.conf.tmpl', config_dict) - - return None + return display def verify(config_dict): if not config_dict: @@ -68,6 +61,16 @@ def verify(config_dict): return None +def generate(config_dict): + if not config_dict: + return None + # Render config file for daemon LCDd + render('/run/LCDd/LCDd.lo.conf', 'system-display/LCDd.conf.tmpl', config_dict) + # Render config file for client lcdproc + render('/run/lcdproc/lcdproc.lo.conf', 'system-display/lcdproc.conf.tmpl', config_dict) + + return None + def apply(config_dict): # Stop client run('systemctl stop lcdproc@lo.service') -- cgit v1.2.3