From 4384a2973993b8b0f572912026f45e9ee910e3ec Mon Sep 17 00:00:00 2001 From: Christian Poessinger Date: Sat, 23 May 2020 20:14:41 +0200 Subject: console-server: T2490: initial support --- src/conf_mode/ser2net.py | 116 ++++++++++++++++++++++++++++++++++++++++++++ src/systemd/ser2net.service | 13 +++++ 2 files changed, 129 insertions(+) create mode 100755 src/conf_mode/ser2net.py create mode 100644 src/systemd/ser2net.service (limited to 'src') diff --git a/src/conf_mode/ser2net.py b/src/conf_mode/ser2net.py new file mode 100755 index 000000000..5231a6a05 --- /dev/null +++ b/src/conf_mode/ser2net.py @@ -0,0 +1,116 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2018-2020 VyOS maintainers and contributors +# +# 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 + +from copy import deepcopy +from sys import exit + +from vyos.config import Config +from vyos.template import render +from vyos.util import call +from vyos import ConfigError + +config_file = r'/run/ser2net/ser2net.conf' + +default_config_data = { + 'devices': [], +} + +def get_config(): + ser2net = deepcopy(default_config_data) + conf = Config() + base = ['service', 'ser2net'] + + if not conf.exists(base): + return None + else: + conf.set_level(base) + + for serial_port in conf.list_nodes(['device']): + conf.set_level(base + ['device', serial_port]) + serial = { + 'data_bits': '', + 'parity': '', + 'port': '', + 'serial_port': '/dev/' + serial_port, + 'speed': '', + 'stop_bits': '', + 'timeout': '600' + } + + if conf.exists(['data-bits']): + serial['data_bits'] = conf.return_value(['data-bits']) + + if conf.exists(['stop-bits']): + serial['stop_bits'] = conf.return_value(['stop-bits']) + + if conf.exists(['parity']): + serial['parity'] = conf.return_value(['parity']) + + if conf.exists(['port']): + serial['port'] = conf.return_value(['port']) + + if conf.exists(['speed']): + serial['speed'] = conf.return_value(['speed']) + + ser2net['devices'].append(serial) + + return ser2net + +def verify(ser2net): + if not ser2net: + return None + + for device in ser2net['devices']: + if not os.path.exists('{serial_port}'.format(**device)): + raise ConfigError('Serial interface "{serial_port} does not exist"' + .format(**device)) + + for key in ['data_bits', 'parity', 'port', 'speed', 'stop_bits']: + if not device[key]: + value = key.replace('_','-') + raise ConfigError(f'{value} option must be defined!') + + return None + +def generate(ser2net): + if not ser2net: + return None + + render(config_file, 'ser2net/ser2net.conf.tmpl', ser2net) + return None + +def apply(ser2net): + if not ser2net: + call('systemctl stop ser2net.service') + if os.path.isfile(config_file): + os.unlink(config_file) + + return None + + call('systemctl restart ser2net.service') + return None + +if __name__ == '__main__': + try: + c = get_config() + verify(c) + generate(c) + apply(c) + except ConfigError as e: + print(e) + exit(1) diff --git a/src/systemd/ser2net.service b/src/systemd/ser2net.service new file mode 100644 index 000000000..a5b4243af --- /dev/null +++ b/src/systemd/ser2net.service @@ -0,0 +1,13 @@ +[Unit] +Description=Serial to Network Proxy +ConditionPathExists=/run/ser2net/ser2net.conf +After=vyos-router.service + +[Service] +WorkingDirectory=/run/ser2net +PIDFile=/run/ser2net/ser2net.pid +ExecStart=/usr/sbin/ser2net -n -c /run/ser2net/ser2net.conf -P /run/ser2net/ser2net.pid -p localhost,2000 +Restart=always + +[Install] +WantedBy=multi-user.target -- cgit v1.2.3 From 6727ddc78035c14ca5015419ef4a9240af8288d8 Mon Sep 17 00:00:00 2001 From: Christian Poessinger Date: Fri, 29 May 2020 22:49:02 +0200 Subject: console-server: T2490: use new USB ports "by-bus" --- interface-definitions/ser2net.xml.in | 4 ++-- src/conf_mode/ser2net.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/interface-definitions/ser2net.xml.in b/interface-definitions/ser2net.xml.in index b9520d20b..8b025070f 100644 --- a/interface-definitions/ser2net.xml.in +++ b/interface-definitions/ser2net.xml.in @@ -19,11 +19,11 @@ Regular serial interface - ttyUSBxxx + usbxbxpx USB based serial interface - ^tty(S|USB)[0-9]+$ + ^(ttyS\d+|usb\d+b.*p.*)$ diff --git a/src/conf_mode/ser2net.py b/src/conf_mode/ser2net.py index 5231a6a05..ec8afcb48 100755 --- a/src/conf_mode/ser2net.py +++ b/src/conf_mode/ser2net.py @@ -46,7 +46,7 @@ def get_config(): 'data_bits': '', 'parity': '', 'port': '', - 'serial_port': '/dev/' + serial_port, + 'serial_port': '/dev/serial/by-bus/' + serial_port, 'speed': '', 'stop_bits': '', 'timeout': '600' -- cgit v1.2.3 From b02de1795f5b77d846bc7a6a1cce4e8fd1246e04 Mon Sep 17 00:00:00 2001 From: Christian Poessinger Date: Sun, 14 Jun 2020 19:00:49 +0200 Subject: console-server: T2490: rename CLI to "serial-proxy" --- data/templates/ser2net/ser2net.conf.tmpl | 4 +- interface-definitions/ser2net.xml.in | 82 --------------- interface-definitions/service_serial-proxy.xml.in | 82 +++++++++++++++ src/conf_mode/ser2net.py | 116 ---------------------- src/conf_mode/system_serial-proxy.py | 116 ++++++++++++++++++++++ 5 files changed, 199 insertions(+), 201 deletions(-) delete mode 100644 interface-definitions/ser2net.xml.in create mode 100644 interface-definitions/service_serial-proxy.xml.in delete mode 100755 src/conf_mode/ser2net.py create mode 100755 src/conf_mode/system_serial-proxy.py (limited to 'src') diff --git a/data/templates/ser2net/ser2net.conf.tmpl b/data/templates/ser2net/ser2net.conf.tmpl index 202fe8104..0e946e84e 100644 --- a/data/templates/ser2net/ser2net.conf.tmpl +++ b/data/templates/ser2net/ser2net.conf.tmpl @@ -69,9 +69,7 @@ # The original config file shipped with the upstream sources can be # found in /usr/share/doc/ser2net/examples -BANNER:banner:\r\nser2net port \p device \d [\s] (VyOS)\r\n\r\n - -#3001:telnet:600:/dev/ttyS1:19200 8DATABITS NONE 1STOPBIT banner +BANNER:banner:\r\nConnected to serial proxy device \d [\s]\r\n\r\n {% for d in devices %} localhost,{{ d.port }}:telnet:{{ d.timeout }}:{{ d.serial_port }}:{{ d.speed }} {{ d.data_bits}}DATABITS {{ d.parity | upper }} {{ d.stop_bits}}STOPBIT banner diff --git a/interface-definitions/ser2net.xml.in b/interface-definitions/ser2net.xml.in deleted file mode 100644 index 8b025070f..000000000 --- a/interface-definitions/ser2net.xml.in +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - Serial to Network - - - - - System serial interface name (ttyS or ttyUSB) - - - - - - ttySxxx - Regular serial interface - - - usbxbxpx - USB based serial interface - - - ^(ttyS\d+|usb\d+b.*p.*)$ - - - - #include - #include - - - Serial port baud rate - - 300 1200 2400 4800 9600 19200 38400 57600 115200 - - - (300|1200|2400|4800|9600|19200|38400|57600|115200) - - - - - - Serial port data bits - - 7 8 - - - (7|8) - - - - - - Serial port stop bits - - 1 2 - - - (1|2) - - - - - - Parity setting - - even odd none - - - (even|odd|none) - - - - - - - - - - diff --git a/interface-definitions/service_serial-proxy.xml.in b/interface-definitions/service_serial-proxy.xml.in new file mode 100644 index 000000000..cedaae5ea --- /dev/null +++ b/interface-definitions/service_serial-proxy.xml.in @@ -0,0 +1,82 @@ + + + + + + + Serial to Network + + + + + System serial interface name (ttyS or ttyUSB) + + + + + + ttySxxx + Regular serial interface + + + usbxbxpx + USB based serial interface + + + ^(ttyS\d+|usb\d+b.*p.*)$ + + + + #include + #include + + + Serial port baud rate + + 300 1200 2400 4800 9600 19200 38400 57600 115200 + + + (300|1200|2400|4800|9600|19200|38400|57600|115200) + + + + + + Serial port data bits + + 7 8 + + + (7|8) + + + + + + Serial port stop bits + + 1 2 + + + (1|2) + + + + + + Parity setting + + even odd none + + + (even|odd|none) + + + + + + + + + + diff --git a/src/conf_mode/ser2net.py b/src/conf_mode/ser2net.py deleted file mode 100755 index ec8afcb48..000000000 --- a/src/conf_mode/ser2net.py +++ /dev/null @@ -1,116 +0,0 @@ -#!/usr/bin/env python3 -# -# Copyright (C) 2018-2020 VyOS maintainers and contributors -# -# 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 - -from copy import deepcopy -from sys import exit - -from vyos.config import Config -from vyos.template import render -from vyos.util import call -from vyos import ConfigError - -config_file = r'/run/ser2net/ser2net.conf' - -default_config_data = { - 'devices': [], -} - -def get_config(): - ser2net = deepcopy(default_config_data) - conf = Config() - base = ['service', 'ser2net'] - - if not conf.exists(base): - return None - else: - conf.set_level(base) - - for serial_port in conf.list_nodes(['device']): - conf.set_level(base + ['device', serial_port]) - serial = { - 'data_bits': '', - 'parity': '', - 'port': '', - 'serial_port': '/dev/serial/by-bus/' + serial_port, - 'speed': '', - 'stop_bits': '', - 'timeout': '600' - } - - if conf.exists(['data-bits']): - serial['data_bits'] = conf.return_value(['data-bits']) - - if conf.exists(['stop-bits']): - serial['stop_bits'] = conf.return_value(['stop-bits']) - - if conf.exists(['parity']): - serial['parity'] = conf.return_value(['parity']) - - if conf.exists(['port']): - serial['port'] = conf.return_value(['port']) - - if conf.exists(['speed']): - serial['speed'] = conf.return_value(['speed']) - - ser2net['devices'].append(serial) - - return ser2net - -def verify(ser2net): - if not ser2net: - return None - - for device in ser2net['devices']: - if not os.path.exists('{serial_port}'.format(**device)): - raise ConfigError('Serial interface "{serial_port} does not exist"' - .format(**device)) - - for key in ['data_bits', 'parity', 'port', 'speed', 'stop_bits']: - if not device[key]: - value = key.replace('_','-') - raise ConfigError(f'{value} option must be defined!') - - return None - -def generate(ser2net): - if not ser2net: - return None - - render(config_file, 'ser2net/ser2net.conf.tmpl', ser2net) - return None - -def apply(ser2net): - if not ser2net: - call('systemctl stop ser2net.service') - if os.path.isfile(config_file): - os.unlink(config_file) - - return None - - call('systemctl restart ser2net.service') - return None - -if __name__ == '__main__': - try: - c = get_config() - verify(c) - generate(c) - apply(c) - except ConfigError as e: - print(e) - exit(1) diff --git a/src/conf_mode/system_serial-proxy.py b/src/conf_mode/system_serial-proxy.py new file mode 100755 index 000000000..83369d39d --- /dev/null +++ b/src/conf_mode/system_serial-proxy.py @@ -0,0 +1,116 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2018-2020 VyOS maintainers and contributors +# +# 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 + +from copy import deepcopy +from sys import exit + +from vyos.config import Config +from vyos.template import render +from vyos.util import call +from vyos import ConfigError + +config_file = r'/run/ser2net/ser2net.conf' + +default_config_data = { + 'devices': [], +} + +def get_config(): + proxy = deepcopy(default_config_data) + conf = Config() + base = ['service', 'serial-proxy'] + + if not conf.exists(base): + return None + else: + conf.set_level(base) + + for serial_port in conf.list_nodes(['device']): + conf.set_level(base + ['device', serial_port]) + serial = { + 'data_bits': '', + 'parity': '', + 'port': '', + 'serial_port': '/dev/serial/by-bus/' + serial_port, + 'speed': '', + 'stop_bits': '', + 'timeout': '600' + } + + if conf.exists(['data-bits']): + serial['data_bits'] = conf.return_value(['data-bits']) + + if conf.exists(['stop-bits']): + serial['stop_bits'] = conf.return_value(['stop-bits']) + + if conf.exists(['parity']): + serial['parity'] = conf.return_value(['parity']) + + if conf.exists(['port']): + serial['port'] = conf.return_value(['port']) + + if conf.exists(['speed']): + serial['speed'] = conf.return_value(['speed']) + + proxy['devices'].append(serial) + + return proxy + +def verify(proxy): + if not proxy: + return None + + for device in proxy['devices']: + if not os.path.exists('{serial_port}'.format(**device)): + raise ConfigError('Serial interface "{serial_port} does not exist"' + .format(**device)) + + for key in ['data_bits', 'parity', 'port', 'speed', 'stop_bits']: + if not device[key]: + value = key.replace('_','-') + raise ConfigError(f'{value} option must be defined!') + + return None + +def generate(proxy): + if not proxy: + return None + + render(config_file, 'ser2net/ser2net.conf.tmpl', proxy) + return None + +def apply(proxy): + if not proxy: + call('systemctl stop ser2net.service') + if os.path.isfile(config_file): + os.unlink(config_file) + + return None + + call('systemctl start ser2net.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 f1f2b647195db515e55a769370b4a689a4dafa44 Mon Sep 17 00:00:00 2001 From: Christian Poessinger Date: Sun, 14 Jun 2020 19:32:13 +0200 Subject: console-server: T2490: add default CLI values --- interface-definitions/service_serial-proxy.xml.in | 6 +++--- src/conf_mode/system_serial-proxy.py | 15 ++++++++------- 2 files changed, 11 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/interface-definitions/service_serial-proxy.xml.in b/interface-definitions/service_serial-proxy.xml.in index cedaae5ea..b027752b9 100644 --- a/interface-definitions/service_serial-proxy.xml.in +++ b/interface-definitions/service_serial-proxy.xml.in @@ -42,7 +42,7 @@ - Serial port data bits + Serial port data bits (default: 8) 7 8 @@ -53,7 +53,7 @@ - Serial port stop bits + Serial port stop bits (default: 1) 1 2 @@ -64,7 +64,7 @@ - Parity setting + Parity setting (default: none) even odd none diff --git a/src/conf_mode/system_serial-proxy.py b/src/conf_mode/system_serial-proxy.py index 83369d39d..007277918 100755 --- a/src/conf_mode/system_serial-proxy.py +++ b/src/conf_mode/system_serial-proxy.py @@ -43,12 +43,12 @@ def get_config(): for serial_port in conf.list_nodes(['device']): conf.set_level(base + ['device', serial_port]) serial = { - 'data_bits': '', - 'parity': '', + 'data_bits': '8', + 'parity': 'none', 'port': '', 'serial_port': '/dev/serial/by-bus/' + serial_port, 'speed': '', - 'stop_bits': '', + 'stop_bits': '1', 'timeout': '600' } @@ -80,10 +80,11 @@ def verify(proxy): raise ConfigError('Serial interface "{serial_port} does not exist"' .format(**device)) - for key in ['data_bits', 'parity', 'port', 'speed', 'stop_bits']: - if not device[key]: - value = key.replace('_','-') - raise ConfigError(f'{value} option must be defined!') + if not device['port']: + raise ConfigError(f'Port must be defined!') + + if not device['speed']: + raise ConfigError(f'Speed must be defined!') return None -- cgit v1.2.3 From a1ba7bae02673aca63a7006cf683ad5d541a5054 Mon Sep 17 00:00:00 2001 From: Christian Poessinger Date: Wed, 17 Jun 2020 22:52:08 +0200 Subject: console-server: T2490: replace ser2net with conserver --- debian/control | 3 ++- src/systemd/ser2net.service | 13 ------------- 2 files changed, 2 insertions(+), 14 deletions(-) delete mode 100644 src/systemd/ser2net.service (limited to 'src') diff --git a/debian/control b/debian/control index aa1e87e23..42d0475e3 100644 --- a/debian/control +++ b/debian/control @@ -59,7 +59,8 @@ Depends: python3, iputils-arping, libvyosconfig0, beep, - ser2net, + conserver-server, + conserver-client, isc-dhcp-server, isc-dhcp-relay, keepalived (>=2.0.5), diff --git a/src/systemd/ser2net.service b/src/systemd/ser2net.service deleted file mode 100644 index a5b4243af..000000000 --- a/src/systemd/ser2net.service +++ /dev/null @@ -1,13 +0,0 @@ -[Unit] -Description=Serial to Network Proxy -ConditionPathExists=/run/ser2net/ser2net.conf -After=vyos-router.service - -[Service] -WorkingDirectory=/run/ser2net -PIDFile=/run/ser2net/ser2net.pid -ExecStart=/usr/sbin/ser2net -n -c /run/ser2net/ser2net.conf -P /run/ser2net/ser2net.pid -p localhost,2000 -Restart=always - -[Install] -WantedBy=multi-user.target -- cgit v1.2.3 From b242e24af4d870e936155bdbd965858bdd39aa98 Mon Sep 17 00:00:00 2001 From: Christian Poessinger Date: Thu, 18 Jun 2020 18:55:22 +0200 Subject: console-server: T2490: move CLI parsing to get_config_dict() For more examples on the new get_config_dict() approach migrate this implementation as it is not yet in production use. Also this serves as proof of concept code for further migrations. --- data/templates/conserver/conserver.conf.tmpl | 38 +++++++ data/templates/ser2net/ser2net.conf.tmpl | 76 ------------- interface-definitions/service_serial-proxy.xml.in | 2 +- op-mode-definitions/connect-disconnect.xml | 2 +- src/conf_mode/service_serial-proxy.py | 101 ++++++++++++++++++ src/conf_mode/system_serial-proxy.py | 117 --------------------- .../conserver-server.service.d/override.conf | 3 + 7 files changed, 144 insertions(+), 195 deletions(-) create mode 100644 data/templates/conserver/conserver.conf.tmpl delete mode 100644 data/templates/ser2net/ser2net.conf.tmpl create mode 100755 src/conf_mode/service_serial-proxy.py delete mode 100755 src/conf_mode/system_serial-proxy.py create mode 100644 src/etc/systemd/system/conserver-server.service.d/override.conf (limited to 'src') diff --git a/data/templates/conserver/conserver.conf.tmpl b/data/templates/conserver/conserver.conf.tmpl new file mode 100644 index 000000000..ec0eca5f0 --- /dev/null +++ b/data/templates/conserver/conserver.conf.tmpl @@ -0,0 +1,38 @@ +### Autogenerated by service_serial-proxy.py ### + +# See https://www.conserver.com/docs/conserver.cf.man.html for additional options + +config * { +} + +default * { + motd "VyOS Console Server" + # The character '&' in logfile names are substituted with the console name. + logfile /var/log/conserver/&.log; + timestamp "30m"; + rw *; +} + +## +## list of consoles we serve +## +{% for key, value in device.items() %} +{# Depending on our USB serial console we could require a path adjustment #} +{% set path = '/dev' if key.startswith('ttyS') else '/dev/serial/by-bus' %} +console {{ key }} { + master localhost; + type device; + device {{ path }}/{{ key }}; + baud {{ value.speed }}; + parity {{ value.parity }}; + options {{ "!" if value.stop_bits == "1" }}cstopb; +} +{% endfor %} + +## +## list of clients we allow +## +access * { + trusted 127.0.0.1; + allowed 127.0.0.1; +} diff --git a/data/templates/ser2net/ser2net.conf.tmpl b/data/templates/ser2net/ser2net.conf.tmpl deleted file mode 100644 index 0e946e84e..000000000 --- a/data/templates/ser2net/ser2net.conf.tmpl +++ /dev/null @@ -1,76 +0,0 @@ -### Autogenerated by ser2net.py ### - -# This is the configuration file for ser2net. It has the following format: -# :::: -# TCP port -# Name or number of the TCP/IP port to accept con- -# nections from for this device. A port number may -# be of the form [host,]port, such as 127.0.0.1,2000 -# or localhost,2000. If this is specified, it will -# only bind to the IP address specified. Otherwise -# it will bind to all the ports on the machine. -# -# state Either raw or rawlp or telnet or off. off disables -# the port from accepting connections. It can be -# turned on later from the control port. raw enables -# the port and transfers all data as-is between the -# port and the long. rawlp enables the port and -# transfers all input data to device, device is open -# without any termios setting. It allow to use -# /dev/lpX devices and printers connected to them. -# telnet enables the port and runs the telnet proto- -# col on the port to set up telnet parameters. This -# is most useful for using telnet. -# -# timeout -# The time (in seconds) before the port will be dis- -# connected if there is no activity on it. A zero -# value disables this funciton. -# -# device The name of the device to connect to. This -# must be in the form of /dev/. -# -# options -# Sets operational parameters for the serial port. -# Options 300, 1200, 2400, 4800, 9600, 19200, 38400, -# 57600, 115200 set the various baud rates. EVEN, -# ODD, NONE set the parity. 1STOPBIT, 2STOPBITS set -# the number of stop bits. 7DATABITS, 8DATABITS set -# the number of data bits. [-]XONXOFF turns on (- -# off) XON/XOFF support. [-]RTSCTS turns on (- off) -# hardware flow control, [-]LOCAL turns off (- on) -# monitoring of the modem lines, and -# [-]HANGUP_WHEN_DONE turns on (- off) lowering the -# modem control lines when the connextion is done. -# NOBREAK disables automatic setting of the break -# setting of the serial port. -# The "remctl" option allow remote control (ala RFC -# 2217) of serial-port configuration. A banner name -# may also be specified, that banner will be printed -# for the line. If no banner is given, then no -# banner is printed. -# -# or... - -# BANNER::banner -# This will create a banner, if the banner name is given in the -# options of a line, that banner will be printed. This takes the -# standard "C" \x characters (\r is carraige return, \n is newline, -# etc.). It also accepts \d, which prints the device name, \p, -# which prints the TCP port number, and \s which prints the serial -# parameters (eg 9600N81). Banners can span lines if the last -# character on a line is '\'. Note that you *must* use \r\n to -# start a new line. -# -# Note that the same device can be listed multiple times under different -# ports, this allows the same serial port to have both telnet and raw -# protocols. - -# The original config file shipped with the upstream sources can be -# found in /usr/share/doc/ser2net/examples - -BANNER:banner:\r\nConnected to serial proxy device \d [\s]\r\n\r\n - -{% for d in devices %} -localhost,{{ d.port }}:telnet:{{ d.timeout }}:{{ d.serial_port }}:{{ d.speed }} {{ d.data_bits}}DATABITS {{ d.parity | upper }} {{ d.stop_bits}}STOPBIT banner -{% endfor %} diff --git a/interface-definitions/service_serial-proxy.xml.in b/interface-definitions/service_serial-proxy.xml.in index b027752b9..ca93fcac3 100644 --- a/interface-definitions/service_serial-proxy.xml.in +++ b/interface-definitions/service_serial-proxy.xml.in @@ -2,7 +2,7 @@ - + Serial to Network diff --git a/op-mode-definitions/connect-disconnect.xml b/op-mode-definitions/connect-disconnect.xml index 3d9262335..a394e9b91 100644 --- a/op-mode-definitions/connect-disconnect.xml +++ b/op-mode-definitions/connect-disconnect.xml @@ -22,7 +22,7 @@ service serial-proxy device - /usr/bin/telnet localhost $(cli-shell-api returnActiveValue service serial-proxy device "$3" port) + /usr/bin/console "$3" diff --git a/src/conf_mode/service_serial-proxy.py b/src/conf_mode/service_serial-proxy.py new file mode 100755 index 000000000..85fcfed08 --- /dev/null +++ b/src/conf_mode/service_serial-proxy.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2018-2020 VyOS maintainers and contributors +# +# 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 + +from sys import exit + +from vyos.config import Config +from vyos.configdict import dict_merge +from vyos.template import render +from vyos.util import call +from vyos import ConfigError + +config_file = r'/etc/conserver/conserver.cf' + +# Default values are necessary until the implementation of T2588 is completed +default_values = { + 'data_bits': '8', + 'parity': 'none', + 'stop_bits': '1' +} + +def get_config(): + conf = Config() + base = ['service', 'serial-proxy'] + + if not conf.exists(base): + return None + + # Retrieve CLI representation as dictionary + proxy = conf.get_config_dict(base, key_mangling=('-', '_')) + # The retrieved dictionary will look something like this: + # + # {'device': {'usb0b2.4p1.0': {'speed': '9600'}, + # 'usb0b2.4p1.1': {'data_bits': '8', + # 'parity': 'none', + # 'speed': '115200', + # 'stop_bits': '2'}}} + + # We have gathered the dict representation of the CLI, but there are default + # options which we need to update into the dictionary retrived. + for device in proxy['device'].keys(): + tmp = dict_merge(default_values, proxy['device'][device]) + proxy['device'][device] = tmp + + return proxy + +def verify(proxy): + if not proxy: + return None + + for tmp in proxy['device']: + device = proxy['device'][tmp] + if not device['speed']: + raise ConfigError(f'Speed must be defined!') + + if device['ssh']: + if not device['ssh']['port']: + raise ConfigError(f'SSH port must be defined!') + + return None + +def generate(proxy): + if not proxy: + return None + + render(config_file, 'conserver/conserver.conf.tmpl', proxy) + return None + +def apply(proxy): + if not proxy: + call('systemctl stop conserver-server.service') + if os.path.isfile(config_file): + os.unlink(config_file) + return None + + call('systemctl restart conserver-server.service') + return None + +if __name__ == '__main__': + try: + c = get_config() + verify(c) + generate(c) + apply(c) + except ConfigError as e: + print(e) + exit(1) diff --git a/src/conf_mode/system_serial-proxy.py b/src/conf_mode/system_serial-proxy.py deleted file mode 100755 index 007277918..000000000 --- a/src/conf_mode/system_serial-proxy.py +++ /dev/null @@ -1,117 +0,0 @@ -#!/usr/bin/env python3 -# -# Copyright (C) 2018-2020 VyOS maintainers and contributors -# -# 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 - -from copy import deepcopy -from sys import exit - -from vyos.config import Config -from vyos.template import render -from vyos.util import call -from vyos import ConfigError - -config_file = r'/run/ser2net/ser2net.conf' - -default_config_data = { - 'devices': [], -} - -def get_config(): - proxy = deepcopy(default_config_data) - conf = Config() - base = ['service', 'serial-proxy'] - - if not conf.exists(base): - return None - else: - conf.set_level(base) - - for serial_port in conf.list_nodes(['device']): - conf.set_level(base + ['device', serial_port]) - serial = { - 'data_bits': '8', - 'parity': 'none', - 'port': '', - 'serial_port': '/dev/serial/by-bus/' + serial_port, - 'speed': '', - 'stop_bits': '1', - 'timeout': '600' - } - - if conf.exists(['data-bits']): - serial['data_bits'] = conf.return_value(['data-bits']) - - if conf.exists(['stop-bits']): - serial['stop_bits'] = conf.return_value(['stop-bits']) - - if conf.exists(['parity']): - serial['parity'] = conf.return_value(['parity']) - - if conf.exists(['port']): - serial['port'] = conf.return_value(['port']) - - if conf.exists(['speed']): - serial['speed'] = conf.return_value(['speed']) - - proxy['devices'].append(serial) - - return proxy - -def verify(proxy): - if not proxy: - return None - - for device in proxy['devices']: - if not os.path.exists('{serial_port}'.format(**device)): - raise ConfigError('Serial interface "{serial_port} does not exist"' - .format(**device)) - - if not device['port']: - raise ConfigError(f'Port must be defined!') - - if not device['speed']: - raise ConfigError(f'Speed must be defined!') - - return None - -def generate(proxy): - if not proxy: - return None - - render(config_file, 'ser2net/ser2net.conf.tmpl', proxy) - return None - -def apply(proxy): - if not proxy: - call('systemctl stop ser2net.service') - if os.path.isfile(config_file): - os.unlink(config_file) - - return None - - call('systemctl start ser2net.service') - return None - -if __name__ == '__main__': - try: - c = get_config() - verify(c) - generate(c) - apply(c) - except ConfigError as e: - print(e) - exit(1) diff --git a/src/etc/systemd/system/conserver-server.service.d/override.conf b/src/etc/systemd/system/conserver-server.service.d/override.conf new file mode 100644 index 000000000..1be5cec81 --- /dev/null +++ b/src/etc/systemd/system/conserver-server.service.d/override.conf @@ -0,0 +1,3 @@ +[Unit] +After= +After=vyos-router.service -- cgit v1.2.3 From 067ddcf27ac1fbc33cee710ae66a85b0368a26d9 Mon Sep 17 00:00:00 2001 From: Christian Poessinger Date: Thu, 18 Jun 2020 21:44:17 +0200 Subject: console-server: T2490: log to journald --- data/templates/conserver/conserver.conf.tmpl | 7 +++---- op-mode-definitions/show-log.xml | 6 ++++++ src/conf_mode/service_serial-proxy.py | 2 +- src/etc/systemd/system/conserver-server.service.d/override.conf | 6 ++++++ 4 files changed, 16 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/data/templates/conserver/conserver.conf.tmpl b/data/templates/conserver/conserver.conf.tmpl index ec0eca5f0..329a9b4ae 100644 --- a/data/templates/conserver/conserver.conf.tmpl +++ b/data/templates/conserver/conserver.conf.tmpl @@ -3,13 +3,12 @@ # See https://www.conserver.com/docs/conserver.cf.man.html for additional options config * { + primaryport 3109; + daemonmode false; } default * { - motd "VyOS Console Server" - # The character '&' in logfile names are substituted with the console name. - logfile /var/log/conserver/&.log; - timestamp "30m"; + motd "VyOS Console Server"; rw *; } diff --git a/op-mode-definitions/show-log.xml b/op-mode-definitions/show-log.xml index 0c4da647b..827bee4c7 100644 --- a/op-mode-definitions/show-log.xml +++ b/op-mode-definitions/show-log.xml @@ -32,6 +32,12 @@ cat $(printf "%s\n" /var/log/messages* | sort -nr ) | grep -e conntrackd + + + Show log for serial console server + + /usr/bin/journalctl -u conserver-server.service + Show log for Dynamic Host Control Protocol (DHCP) diff --git a/src/conf_mode/service_serial-proxy.py b/src/conf_mode/service_serial-proxy.py index 85fcfed08..0dd1cfc6d 100755 --- a/src/conf_mode/service_serial-proxy.py +++ b/src/conf_mode/service_serial-proxy.py @@ -24,7 +24,7 @@ from vyos.template import render from vyos.util import call from vyos import ConfigError -config_file = r'/etc/conserver/conserver.cf' +config_file = r'/run/conserver/conserver.cf' # Default values are necessary until the implementation of T2588 is completed default_values = { diff --git a/src/etc/systemd/system/conserver-server.service.d/override.conf b/src/etc/systemd/system/conserver-server.service.d/override.conf index 1be5cec81..5301b38ce 100644 --- a/src/etc/systemd/system/conserver-server.service.d/override.conf +++ b/src/etc/systemd/system/conserver-server.service.d/override.conf @@ -1,3 +1,9 @@ [Unit] After= After=vyos-router.service + +[Service] +Type=simple +ExecStart= +ExecStart=/usr/sbin/conserver -C /run/conserver/conserver.cf + -- cgit v1.2.3 From e59da2923cbbb21258cc9769b6a152d6af78abe6 Mon Sep 17 00:00:00 2001 From: Christian Poessinger Date: Thu, 18 Jun 2020 23:04:46 +0200 Subject: console-server: T2490: add SSH support A user can define a port under the SSH node per device. WHen connecting to that port and authenticating using regular credentials we will immediately drop to the serial console. This is the same as executing "connect serial-proxy ". --- debian/control | 1 + interface-definitions/service_serial-proxy.xml.in | 8 ++++++++ src/conf_mode/service_serial-proxy.py | 17 ++++++++++++----- src/systemd/dropbear@.service | 14 ++++++++++++++ src/systemd/dropbearkey.service | 11 +++++++++++ 5 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 src/systemd/dropbear@.service create mode 100644 src/systemd/dropbearkey.service (limited to 'src') diff --git a/debian/control b/debian/control index 42d0475e3..bf330c35c 100644 --- a/debian/control +++ b/debian/control @@ -59,6 +59,7 @@ Depends: python3, iputils-arping, libvyosconfig0, beep, + dropbear, conserver-server, conserver-client, isc-dhcp-server, diff --git a/interface-definitions/service_serial-proxy.xml.in b/interface-definitions/service_serial-proxy.xml.in index ca93fcac3..917af0122 100644 --- a/interface-definitions/service_serial-proxy.xml.in +++ b/interface-definitions/service_serial-proxy.xml.in @@ -73,6 +73,14 @@ + + + SSH remote access to this console + + + #include + + diff --git a/src/conf_mode/service_serial-proxy.py b/src/conf_mode/service_serial-proxy.py index 0dd1cfc6d..5f510d311 100755 --- a/src/conf_mode/service_serial-proxy.py +++ b/src/conf_mode/service_serial-proxy.py @@ -65,11 +65,11 @@ def verify(proxy): for tmp in proxy['device']: device = proxy['device'][tmp] if not device['speed']: - raise ConfigError(f'Speed must be defined!') + raise ConfigError(f'Serial port speed must be defined for "{tmp}"!') - if device['ssh']: - if not device['ssh']['port']: - raise ConfigError(f'SSH port must be defined!') + if 'ssh' in device.keys(): + if 'port' not in device['ssh'].keys(): + raise ConfigError(f'SSH port must be defined for "{tmp}"!') return None @@ -81,13 +81,20 @@ def generate(proxy): return None def apply(proxy): + call('systemctl stop conserver-server.service') + call('systemctl stop dropbear@*.service') + if not proxy: - call('systemctl stop conserver-server.service') if os.path.isfile(config_file): os.unlink(config_file) return None call('systemctl restart conserver-server.service') + + for device in proxy['device']: + if 'ssh' in proxy['device'][device].keys(): + call('systemctl restart dropbear@{device}.service') + return None if __name__ == '__main__': diff --git a/src/systemd/dropbear@.service b/src/systemd/dropbear@.service new file mode 100644 index 000000000..a4df6ad41 --- /dev/null +++ b/src/systemd/dropbear@.service @@ -0,0 +1,14 @@ +[Unit] +Description=Dropbear SSH per-connection server +Requires=dropbearkey.service +Wants=conserver-server.service +After=mongodb.service +After=dropbearkey.service vyos-router.service conserver-server.service + +[Service] +Type=forking +ExecStartPre=/usr/bin/bash -c '/usr/bin/systemctl set-environment PORT=$(cli-shell-api returnValue service serial-proxy device "%I" ssh port)' +ExecStart=-/usr/sbin/dropbear -w -j -k -r /etc/dropbear/dropbear_rsa_host_key -c "/usr/bin/console %I" -P /run/conserver/dropbear.%I.pid -p ${PORT} +PIDFile=/run/conserver/dropbear.%I.pid +KillMode=process + diff --git a/src/systemd/dropbearkey.service b/src/systemd/dropbearkey.service new file mode 100644 index 000000000..770641c8b --- /dev/null +++ b/src/systemd/dropbearkey.service @@ -0,0 +1,11 @@ +[Unit] +Description=Dropbear SSH Key Generation +ConditionPathExists=|!/etc/dropbear/dropbear_rsa_host_key + +[Service] +ExecStart=/usr/bin/dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target + -- cgit v1.2.3 From b509bbf0c0bf33f39e67f0aa8df481ef15d6bae9 Mon Sep 17 00:00:00 2001 From: Christian Poessinger Date: Thu, 18 Jun 2020 23:09:58 +0200 Subject: console-server: T2490: rename CLI to console-server --- data/templates/conserver/conserver.conf.tmpl | 2 +- .../service_console-server.xml.in | 90 +++++++++++++++++ interface-definitions/service_serial-proxy.xml.in | 90 ----------------- op-mode-definitions/connect-disconnect.xml | 6 +- src/conf_mode/service_console-server.py | 108 +++++++++++++++++++++ src/conf_mode/service_serial-proxy.py | 108 --------------------- src/systemd/dropbear@.service | 2 +- 7 files changed, 203 insertions(+), 203 deletions(-) create mode 100644 interface-definitions/service_console-server.xml.in delete mode 100644 interface-definitions/service_serial-proxy.xml.in create mode 100755 src/conf_mode/service_console-server.py delete mode 100755 src/conf_mode/service_serial-proxy.py (limited to 'src') diff --git a/data/templates/conserver/conserver.conf.tmpl b/data/templates/conserver/conserver.conf.tmpl index 329a9b4ae..5fffaf31e 100644 --- a/data/templates/conserver/conserver.conf.tmpl +++ b/data/templates/conserver/conserver.conf.tmpl @@ -1,4 +1,4 @@ -### Autogenerated by service_serial-proxy.py ### +### Autogenerated by service_console-server.py ### # See https://www.conserver.com/docs/conserver.cf.man.html for additional options diff --git a/interface-definitions/service_console-server.xml.in b/interface-definitions/service_console-server.xml.in new file mode 100644 index 000000000..679ea32a2 --- /dev/null +++ b/interface-definitions/service_console-server.xml.in @@ -0,0 +1,90 @@ + + + + + + + Serial Console Server + + + + + System serial interface name (ttyS or ttyUSB) + + + + + + ttySxxx + Regular serial interface + + + usbxbxpx + USB based serial interface + + + ^(ttyS\d+|usb\d+b.*p.*)$ + + + + #include + #include + + + Serial port baud rate + + 300 1200 2400 4800 9600 19200 38400 57600 115200 + + + (300|1200|2400|4800|9600|19200|38400|57600|115200) + + + + + + Serial port data bits (default: 8) + + 7 8 + + + (7|8) + + + + + + Serial port stop bits (default: 1) + + 1 2 + + + (1|2) + + + + + + Parity setting (default: none) + + even odd none + + + (even|odd|none) + + + + + + SSH remote access to this console + + + #include + + + + + + + + + diff --git a/interface-definitions/service_serial-proxy.xml.in b/interface-definitions/service_serial-proxy.xml.in deleted file mode 100644 index 917af0122..000000000 --- a/interface-definitions/service_serial-proxy.xml.in +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - Serial to Network - - - - - System serial interface name (ttyS or ttyUSB) - - - - - - ttySxxx - Regular serial interface - - - usbxbxpx - USB based serial interface - - - ^(ttyS\d+|usb\d+b.*p.*)$ - - - - #include - #include - - - Serial port baud rate - - 300 1200 2400 4800 9600 19200 38400 57600 115200 - - - (300|1200|2400|4800|9600|19200|38400|57600|115200) - - - - - - Serial port data bits (default: 8) - - 7 8 - - - (7|8) - - - - - - Serial port stop bits (default: 1) - - 1 2 - - - (1|2) - - - - - - Parity setting (default: none) - - even odd none - - - (even|odd|none) - - - - - - SSH remote access to this console - - - #include - - - - - - - - - diff --git a/op-mode-definitions/connect-disconnect.xml b/op-mode-definitions/connect-disconnect.xml index a394e9b91..69afe6db0 100644 --- a/op-mode-definitions/connect-disconnect.xml +++ b/op-mode-definitions/connect-disconnect.xml @@ -15,11 +15,11 @@ sudo ${vyos_op_scripts_dir}/connect_disconnect.py --connect "$3" - + - Connect to serial proxy port + Connect to port of serial console server - service serial-proxy device + service console-server device /usr/bin/console "$3" diff --git a/src/conf_mode/service_console-server.py b/src/conf_mode/service_console-server.py new file mode 100755 index 000000000..087b13c04 --- /dev/null +++ b/src/conf_mode/service_console-server.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2018-2020 VyOS maintainers and contributors +# +# 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 + +from sys import exit + +from vyos.config import Config +from vyos.configdict import dict_merge +from vyos.template import render +from vyos.util import call +from vyos import ConfigError + +config_file = r'/run/conserver/conserver.cf' + +# Default values are necessary until the implementation of T2588 is completed +default_values = { + 'data_bits': '8', + 'parity': 'none', + 'stop_bits': '1' +} + +def get_config(): + conf = Config() + base = ['service', 'console-server'] + + if not conf.exists(base): + return None + + # Retrieve CLI representation as dictionary + proxy = conf.get_config_dict(base, key_mangling=('-', '_')) + # The retrieved dictionary will look something like this: + # + # {'device': {'usb0b2.4p1.0': {'speed': '9600'}, + # 'usb0b2.4p1.1': {'data_bits': '8', + # 'parity': 'none', + # 'speed': '115200', + # 'stop_bits': '2'}}} + + # We have gathered the dict representation of the CLI, but there are default + # options which we need to update into the dictionary retrived. + for device in proxy['device'].keys(): + tmp = dict_merge(default_values, proxy['device'][device]) + proxy['device'][device] = tmp + + return proxy + +def verify(proxy): + if not proxy: + return None + + for tmp in proxy['device']: + device = proxy['device'][tmp] + if not device['speed']: + raise ConfigError(f'Serial port speed must be defined for "{tmp}"!') + + if 'ssh' in device.keys(): + if 'port' not in device['ssh'].keys(): + raise ConfigError(f'SSH port must be defined for "{tmp}"!') + + return None + +def generate(proxy): + if not proxy: + return None + + render(config_file, 'conserver/conserver.conf.tmpl', proxy) + return None + +def apply(proxy): + call('systemctl stop conserver-server.service') + call('systemctl stop dropbear@*.service') + + if not proxy: + if os.path.isfile(config_file): + os.unlink(config_file) + return None + + call('systemctl restart conserver-server.service') + + for device in proxy['device']: + if 'ssh' in proxy['device'][device].keys(): + call('systemctl restart dropbear@{device}.service') + + return None + +if __name__ == '__main__': + try: + c = get_config() + verify(c) + generate(c) + apply(c) + except ConfigError as e: + print(e) + exit(1) diff --git a/src/conf_mode/service_serial-proxy.py b/src/conf_mode/service_serial-proxy.py deleted file mode 100755 index 5f510d311..000000000 --- a/src/conf_mode/service_serial-proxy.py +++ /dev/null @@ -1,108 +0,0 @@ -#!/usr/bin/env python3 -# -# Copyright (C) 2018-2020 VyOS maintainers and contributors -# -# 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 - -from sys import exit - -from vyos.config import Config -from vyos.configdict import dict_merge -from vyos.template import render -from vyos.util import call -from vyos import ConfigError - -config_file = r'/run/conserver/conserver.cf' - -# Default values are necessary until the implementation of T2588 is completed -default_values = { - 'data_bits': '8', - 'parity': 'none', - 'stop_bits': '1' -} - -def get_config(): - conf = Config() - base = ['service', 'serial-proxy'] - - if not conf.exists(base): - return None - - # Retrieve CLI representation as dictionary - proxy = conf.get_config_dict(base, key_mangling=('-', '_')) - # The retrieved dictionary will look something like this: - # - # {'device': {'usb0b2.4p1.0': {'speed': '9600'}, - # 'usb0b2.4p1.1': {'data_bits': '8', - # 'parity': 'none', - # 'speed': '115200', - # 'stop_bits': '2'}}} - - # We have gathered the dict representation of the CLI, but there are default - # options which we need to update into the dictionary retrived. - for device in proxy['device'].keys(): - tmp = dict_merge(default_values, proxy['device'][device]) - proxy['device'][device] = tmp - - return proxy - -def verify(proxy): - if not proxy: - return None - - for tmp in proxy['device']: - device = proxy['device'][tmp] - if not device['speed']: - raise ConfigError(f'Serial port speed must be defined for "{tmp}"!') - - if 'ssh' in device.keys(): - if 'port' not in device['ssh'].keys(): - raise ConfigError(f'SSH port must be defined for "{tmp}"!') - - return None - -def generate(proxy): - if not proxy: - return None - - render(config_file, 'conserver/conserver.conf.tmpl', proxy) - return None - -def apply(proxy): - call('systemctl stop conserver-server.service') - call('systemctl stop dropbear@*.service') - - if not proxy: - if os.path.isfile(config_file): - os.unlink(config_file) - return None - - call('systemctl restart conserver-server.service') - - for device in proxy['device']: - if 'ssh' in proxy['device'][device].keys(): - call('systemctl restart dropbear@{device}.service') - - return None - -if __name__ == '__main__': - try: - c = get_config() - verify(c) - generate(c) - apply(c) - except ConfigError as e: - print(e) - exit(1) diff --git a/src/systemd/dropbear@.service b/src/systemd/dropbear@.service index a4df6ad41..a7057ffe1 100644 --- a/src/systemd/dropbear@.service +++ b/src/systemd/dropbear@.service @@ -7,7 +7,7 @@ After=dropbearkey.service vyos-router.service conserver-server.service [Service] Type=forking -ExecStartPre=/usr/bin/bash -c '/usr/bin/systemctl set-environment PORT=$(cli-shell-api returnValue service serial-proxy device "%I" ssh port)' +ExecStartPre=/usr/bin/bash -c '/usr/bin/systemctl set-environment PORT=$(cli-shell-api returnValue service console-server device "%I" ssh port)' ExecStart=-/usr/sbin/dropbear -w -j -k -r /etc/dropbear/dropbear_rsa_host_key -c "/usr/bin/console %I" -P /run/conserver/dropbear.%I.pid -p ${PORT} PIDFile=/run/conserver/dropbear.%I.pid KillMode=process -- cgit v1.2.3 From 587416ef606827c5cbf6ac49834fc65283794fbb Mon Sep 17 00:00:00 2001 From: Christian Poessinger Date: Fri, 19 Jun 2020 16:12:27 +0200 Subject: console-server: T2490: add SSH support for direct device access --- src/conf_mode/service_console-server.py | 17 +++++++++-------- .../system/conserver-server.service.d/override.conf | 3 ++- src/systemd/dropbear@.service | 6 +++--- 3 files changed, 14 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/conf_mode/service_console-server.py b/src/conf_mode/service_console-server.py index 087b13c04..7f6967983 100755 --- a/src/conf_mode/service_console-server.py +++ b/src/conf_mode/service_console-server.py @@ -62,13 +62,14 @@ def verify(proxy): if not proxy: return None - for tmp in proxy['device']: - device = proxy['device'][tmp] - if not device['speed']: + for device in proxy['device']: + keys = proxy['device'][device].keys() + if 'speed' not in keys: raise ConfigError(f'Serial port speed must be defined for "{tmp}"!') - if 'ssh' in device.keys(): - if 'port' not in device['ssh'].keys(): + if 'ssh' in keys: + ssh_keys = proxy['device'][device]['ssh'].keys() + if 'port' not in ssh_keys: raise ConfigError(f'SSH port must be defined for "{tmp}"!') return None @@ -81,8 +82,7 @@ def generate(proxy): return None def apply(proxy): - call('systemctl stop conserver-server.service') - call('systemctl stop dropbear@*.service') + call('systemctl stop dropbear@*.service conserver-server.service') if not proxy: if os.path.isfile(config_file): @@ -93,7 +93,8 @@ def apply(proxy): for device in proxy['device']: if 'ssh' in proxy['device'][device].keys(): - call('systemctl restart dropbear@{device}.service') + port = proxy['device'][device]['ssh']['port'] + call(f'systemctl restart dropbear@{device}.service') return None diff --git a/src/etc/systemd/system/conserver-server.service.d/override.conf b/src/etc/systemd/system/conserver-server.service.d/override.conf index 5301b38ce..828d0bc4b 100644 --- a/src/etc/systemd/system/conserver-server.service.d/override.conf +++ b/src/etc/systemd/system/conserver-server.service.d/override.conf @@ -1,9 +1,10 @@ [Unit] After= After=vyos-router.service +ConditionPathExists=/run/conserver/conserver.cf [Service] Type=simple ExecStart= ExecStart=/usr/sbin/conserver -C /run/conserver/conserver.cf - +Restart=on-failure diff --git a/src/systemd/dropbear@.service b/src/systemd/dropbear@.service index a7057ffe1..606a7ea6d 100644 --- a/src/systemd/dropbear@.service +++ b/src/systemd/dropbear@.service @@ -2,13 +2,13 @@ Description=Dropbear SSH per-connection server Requires=dropbearkey.service Wants=conserver-server.service -After=mongodb.service +ConditionPathExists=/run/conserver/conserver.cf After=dropbearkey.service vyos-router.service conserver-server.service [Service] Type=forking -ExecStartPre=/usr/bin/bash -c '/usr/bin/systemctl set-environment PORT=$(cli-shell-api returnValue service console-server device "%I" ssh port)' +ExecStartPre=/usr/bin/bash -c '/usr/bin/systemctl set-environment PORT=$(cli-shell-api returnActiveValue service console-server device "%I" ssh port)' ExecStart=-/usr/sbin/dropbear -w -j -k -r /etc/dropbear/dropbear_rsa_host_key -c "/usr/bin/console %I" -P /run/conserver/dropbear.%I.pid -p ${PORT} PIDFile=/run/conserver/dropbear.%I.pid KillMode=process - +Restart=on-failure -- cgit v1.2.3 From 647af6c5405e6a3ae89bf96cb20558c581ed83d7 Mon Sep 17 00:00:00 2001 From: Christian Poessinger Date: Fri, 19 Jun 2020 16:38:40 +0200 Subject: console-server: T2490: server must listen only on localhost --- data/templates/conserver/conserver.conf.tmpl | 4 ++-- src/etc/systemd/system/conserver-server.service.d/override.conf | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/data/templates/conserver/conserver.conf.tmpl b/data/templates/conserver/conserver.conf.tmpl index 5fffaf31e..4e7b5d8d7 100644 --- a/data/templates/conserver/conserver.conf.tmpl +++ b/data/templates/conserver/conserver.conf.tmpl @@ -32,6 +32,6 @@ console {{ key }} { ## list of clients we allow ## access * { - trusted 127.0.0.1; - allowed 127.0.0.1; + trusted localhost; + allowed localhost; } diff --git a/src/etc/systemd/system/conserver-server.service.d/override.conf b/src/etc/systemd/system/conserver-server.service.d/override.conf index 828d0bc4b..3c753f572 100644 --- a/src/etc/systemd/system/conserver-server.service.d/override.conf +++ b/src/etc/systemd/system/conserver-server.service.d/override.conf @@ -6,5 +6,5 @@ ConditionPathExists=/run/conserver/conserver.cf [Service] Type=simple ExecStart= -ExecStart=/usr/sbin/conserver -C /run/conserver/conserver.cf +ExecStart=/usr/sbin/conserver -M localhost -C /run/conserver/conserver.cf Restart=on-failure -- cgit v1.2.3