summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile4
-rw-r--r--data/templates/dhcp-client/daemon-options.tmpl2
-rw-r--r--data/templates/dhcp-client/ipv4.tmpl20
-rw-r--r--data/templates/dhcp-client/ipv6.tmpl53
-rw-r--r--data/templates/dhcp-client/ipv6_new.tmpl47
-rw-r--r--data/templates/ssh/override.conf.tmpl3
-rw-r--r--interface-definitions/lldp.xml.in3
-rw-r--r--op-mode-definitions/configure.xml9
-rw-r--r--op-mode-definitions/lldp.xml2
-rw-r--r--op-mode-definitions/monitor-bandwidth-test.xml (renamed from op-mode-definitions/bandwidth-test.xml)0
-rw-r--r--op-mode-definitions/monitor-bandwidth.xml (renamed from op-mode-definitions/bandwidth-monitor.xml)0
-rw-r--r--op-mode-definitions/monitor-log.xml13
-rw-r--r--op-mode-definitions/ping.xml23
-rw-r--r--python/vyos/ifconfig/dhcp.py82
-rw-r--r--python/vyos/ifconfig/interface.py41
-rwxr-xr-xsrc/conf_mode/interfaces-pppoe.py2
-rwxr-xr-xsrc/conf_mode/ssh.py4
-rwxr-xr-xsrc/op_mode/enter_config_mode.sh18
-rwxr-xr-xsrc/op_mode/lldp_op.py21
19 files changed, 176 insertions, 171 deletions
diff --git a/Makefile b/Makefile
index 2773642d0..5b7e4da63 100644
--- a/Makefile
+++ b/Makefile
@@ -105,6 +105,10 @@ op_mode_definitions:
rm -f $(OP_TMPL_DIR)/delete/node.def
rm -f $(OP_TMPL_DIR)/reset/vpn/node.def
+ # XXX: ping must be able to recursivly call itself as the
+ # options are provided from the script itself
+ ln -s ../node.tag $(OP_TMPL_DIR)/ping/node.tag/node.tag/
+
.PHONY: component_versions
.ONESHELL:
component_versions: $(BUILD_DIR) $(obj)
diff --git a/data/templates/dhcp-client/daemon-options.tmpl b/data/templates/dhcp-client/daemon-options.tmpl
index 12786b777..a0ba2c9ef 100644
--- a/data/templates/dhcp-client/daemon-options.tmpl
+++ b/data/templates/dhcp-client/daemon-options.tmpl
@@ -1 +1 @@
-DHCLIENT_OPTS="-nw -cf {{ conf_file }} -pf {{ pid_file }} -lf {{ lease_file }} {{ '-S' if dhcpv6_prm_only }} {{ '-T' if dhcpv6_temporary }} {{ ifname }}"
+DHCLIENT_OPTS="-nw -cf /var/lib/dhcp/dhclient_{{ifname}}.conf -pf /var/lib/dhcp/dhclient_{{ifname}}.pid -lf /var/lib/dhcp/dhclient_{{ifname}}.leases {{ifname}}"
diff --git a/data/templates/dhcp-client/ipv4.tmpl b/data/templates/dhcp-client/ipv4.tmpl
index ab772b5f6..fe2a67f08 100644
--- a/data/templates/dhcp-client/ipv4.tmpl
+++ b/data/templates/dhcp-client/ipv4.tmpl
@@ -4,14 +4,14 @@ timeout 60;
retry 300;
interface "{{ ifname }}" {
- send host-name "{{ hostname }}";
- {% if client_id -%}
- send dhcp-client-identifier "{{ client_id }}";
- {% endif -%}
- {% if vendor_class_id -%}
- send vendor-class-identifier "{{ vendor_class_id }}";
- {% endif -%}
- request subnet-mask, broadcast-address, routers, domain-name-servers,
- rfc3442-classless-static-routes, domain-name, interface-mtu;
- require subnet-mask;
+ send host-name "{{ dhcp_options.host_name }}";
+{% if dhcp_options.client_id is defined and dhcp_options.client_id is not none %}
+ send dhcp-client-identifier "{{ dhcp_options.client_id }}";
+{% endif %}
+{% if dhcp_options.vendor_class_id is defined and dhcp_options.vendor_class_id is not none %}
+ send vendor-class-identifier "{{ dhcp_options.vendor_class_id }}";
+{% endif %}
+ request subnet-mask, broadcast-address, routers, domain-name-servers,
+ rfc3442-classless-static-routes, domain-name, interface-mtu;
+ require subnet-mask;
}
diff --git a/data/templates/dhcp-client/ipv6.tmpl b/data/templates/dhcp-client/ipv6.tmpl
index 490f14726..112431c5f 100644
--- a/data/templates/dhcp-client/ipv6.tmpl
+++ b/data/templates/dhcp-client/ipv6.tmpl
@@ -4,41 +4,44 @@
interface {{ ifname }} {
request domain-name-servers;
request domain-name;
-{% if dhcpv6_prm_only %}
+{% if dhcpv6_options is defined %}
+{% if dhcpv6_options.parameters_only is defined %}
information-only;
-{% endif %}
-{% if not dhcpv6_temporary %}
+{% endif %}
+{% if dhcpv6_options.temporary is not defined %}
send ia-na 1; # non-temporary address
-{% endif %}
-{% if dhcpv6_pd_interfaces %}
+{% endif %}
+{% if dhcpv6_options.prefix_delegation is defined %}
send ia-pd 2; # prefix delegation
+{% endif %}
{% endif %}
};
-{% if not dhcpv6_temporary %}
+{% if dhcpv6_options is defined %}
+{% if dhcpv6_options.temporary is not defined %}
id-assoc na 1 {
# Identity association NA
};
-{% endif %}
+{% endif %}
-{% if dhcpv6_pd_interfaces %}
+{% if dhcpv6_options.prefix_delegation is defined %}
id-assoc pd 2 {
-{% if dhcpv6_pd_length %}
- prefix ::/{{ dhcpv6_pd_length }} infinity;
-{% endif %}
-{% for intf in dhcpv6_pd_interfaces %}
- prefix-interface {{ intf.ifname }} {
-{% if intf.sla_id %}
- sla-id {{ intf.sla_id }};
-{% endif %}
-{% if intf.sla_len %}
- sla-len {{ intf.sla_len }};
-{% endif %}
-{% if intf.if_id %}
- ifid {{ intf.if_id }};
-{% endif %}
+{% if dhcpv6_options.prefix_delegation.length is defined %}
+ prefix ::/{{ dhcpv6_options.prefix_delegation.length }} infinity;
+{% endif %}
+{% for interface in dhcpv6_options.prefix_delegation.interface %}
+ prefix-interface {{ interface }} {
+{% if dhcpv6_options.prefix_delegation.interface[interface].sla_id is defined %}
+ sla-id {{ dhcpv6_options.prefix_delegation.interface[interface].sla_id }};
+{% endif %}
+{% if dhcpv6_options.prefix_delegation.interface[interface].sla_len is defined %}
+ sla-len {{ dhcpv6_options.prefix_delegation.interface[interface].sla_len }};
+{% endif %}
+{% if dhcpv6_options.prefix_delegation.interface[interface].address is defined %}
+ ifid {{ dhcpv6_options.prefix_delegation.interface[interface].address }};
+{% endif %}
};
-{% endfor %}
+{% endfor %}
};
-{% endif %}
-
+{% endif %}
+{% endif %}
diff --git a/data/templates/dhcp-client/ipv6_new.tmpl b/data/templates/dhcp-client/ipv6_new.tmpl
deleted file mode 100644
index 112431c5f..000000000
--- a/data/templates/dhcp-client/ipv6_new.tmpl
+++ /dev/null
@@ -1,47 +0,0 @@
-# generated by dhcp.py
-# man https://www.unix.com/man-page/debian/5/dhcp6c.conf/
-
-interface {{ ifname }} {
- request domain-name-servers;
- request domain-name;
-{% if dhcpv6_options is defined %}
-{% if dhcpv6_options.parameters_only is defined %}
- information-only;
-{% endif %}
-{% if dhcpv6_options.temporary is not defined %}
- send ia-na 1; # non-temporary address
-{% endif %}
-{% if dhcpv6_options.prefix_delegation is defined %}
- send ia-pd 2; # prefix delegation
-{% endif %}
-{% endif %}
-};
-
-{% if dhcpv6_options is defined %}
-{% if dhcpv6_options.temporary is not defined %}
-id-assoc na 1 {
- # Identity association NA
-};
-{% endif %}
-
-{% if dhcpv6_options.prefix_delegation is defined %}
-id-assoc pd 2 {
-{% if dhcpv6_options.prefix_delegation.length is defined %}
- prefix ::/{{ dhcpv6_options.prefix_delegation.length }} infinity;
-{% endif %}
-{% for interface in dhcpv6_options.prefix_delegation.interface %}
- prefix-interface {{ interface }} {
-{% if dhcpv6_options.prefix_delegation.interface[interface].sla_id is defined %}
- sla-id {{ dhcpv6_options.prefix_delegation.interface[interface].sla_id }};
-{% endif %}
-{% if dhcpv6_options.prefix_delegation.interface[interface].sla_len is defined %}
- sla-len {{ dhcpv6_options.prefix_delegation.interface[interface].sla_len }};
-{% endif %}
-{% if dhcpv6_options.prefix_delegation.interface[interface].address is defined %}
- ifid {{ dhcpv6_options.prefix_delegation.interface[interface].address }};
-{% endif %}
- };
-{% endfor %}
-};
-{% endif %}
-{% endif %}
diff --git a/data/templates/ssh/override.conf.tmpl b/data/templates/ssh/override.conf.tmpl
index 4276366ae..843aa927b 100644
--- a/data/templates/ssh/override.conf.tmpl
+++ b/data/templates/ssh/override.conf.tmpl
@@ -2,9 +2,10 @@
[Unit]
StartLimitIntervalSec=0
After=vyos-router.service
+ConditionPathExists={{config_file}}
[Service]
ExecStart=
-ExecStart={{vrf_command}}/usr/sbin/sshd -D $SSHD_OPTS
+ExecStart={{vrf_command}}/usr/sbin/sshd -f {{config_file}} -D $SSHD_OPTS
RestartSec=10
diff --git a/interface-definitions/lldp.xml.in b/interface-definitions/lldp.xml.in
index 3a2899b57..8f6629d81 100644
--- a/interface-definitions/lldp.xml.in
+++ b/interface-definitions/lldp.xml.in
@@ -21,6 +21,7 @@
</valueHelp>
<completionHelp>
<script>${vyatta_sbindir}/vyatta-interfaces.pl --show all</script>
+ <list>all</list>
</completionHelp>
</properties>
<children>
@@ -73,7 +74,7 @@
</completionHelp>
<constraintErrorMessage>Datum should be WGS84, NAD83, or MLLW</constraintErrorMessage>
<constraint>
- <regex>(WGS84|NAD83|MLLW)$</regex>
+ <regex>^(WGS84|NAD83|MLLW)$</regex>
</constraint>
</properties>
</leafNode>
diff --git a/op-mode-definitions/configure.xml b/op-mode-definitions/configure.xml
new file mode 100644
index 000000000..dc534d586
--- /dev/null
+++ b/op-mode-definitions/configure.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<interfaceDefinition>
+ <node name="configure">
+ <properties>
+ <help>Enter configure mode</help>
+ </properties>
+ <command>${vyos_op_scripts_dir}/enter_config_mode.sh</command>
+ </node>
+</interfaceDefinition>
diff --git a/op-mode-definitions/lldp.xml b/op-mode-definitions/lldp.xml
index 105bfe237..e954fb8cf 100644
--- a/op-mode-definitions/lldp.xml
+++ b/op-mode-definitions/lldp.xml
@@ -17,7 +17,7 @@
<properties>
<help>Show LLDP neighbor details</help>
</properties>
- <command>/usr/sbin/lldpctl -f plain</command>
+ <command>${vyos_op_scripts_dir}/lldp_op.py --detail</command>
</node>
<tagNode name="interface">
<properties>
diff --git a/op-mode-definitions/bandwidth-test.xml b/op-mode-definitions/monitor-bandwidth-test.xml
index d1e459b17..d1e459b17 100644
--- a/op-mode-definitions/bandwidth-test.xml
+++ b/op-mode-definitions/monitor-bandwidth-test.xml
diff --git a/op-mode-definitions/bandwidth-monitor.xml b/op-mode-definitions/monitor-bandwidth.xml
index 9af0a9e70..9af0a9e70 100644
--- a/op-mode-definitions/bandwidth-monitor.xml
+++ b/op-mode-definitions/monitor-bandwidth.xml
diff --git a/op-mode-definitions/monitor-log.xml b/op-mode-definitions/monitor-log.xml
new file mode 100644
index 000000000..99efe5306
--- /dev/null
+++ b/op-mode-definitions/monitor-log.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<interfaceDefinition>
+ <node name="monitor">
+ <children>
+ <node name="log">
+ <properties>
+ <help>Monitor last lines of messages file</help>
+ </properties>
+ <command>tail --follow=name /var/log/messages</command>
+ </node>
+ </children>
+ </node>
+</interfaceDefinition>
diff --git a/op-mode-definitions/ping.xml b/op-mode-definitions/ping.xml
new file mode 100644
index 000000000..4c25a59ab
--- /dev/null
+++ b/op-mode-definitions/ping.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<interfaceDefinition>
+ <tagNode name="ping">
+ <properties>
+ <help>Send Internet Control Message Protocol (ICMP) echo request</help>
+ <completionHelp>
+ <list>&lt;hostname&gt; &lt;x.x.x.x&gt; &lt;h:h:h:h:h:h:h:h&gt;</list>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/ping.py ${@:2}</command>
+ <children>
+ <leafNode name="node.tag">
+ <properties>
+ <help>Ping options</help>
+ <completionHelp>
+ <script>${vyos_op_scripts_dir}/ping.py --get-options "${COMP_WORDS[@]}"</script>
+ </completionHelp>
+ </properties>
+ <command>${vyos_op_scripts_dir}/ping.py ${@:2}</command>
+ </leafNode>
+ </children>
+ </tagNode>
+</interfaceDefinition>
diff --git a/python/vyos/ifconfig/dhcp.py b/python/vyos/ifconfig/dhcp.py
index a8b9a2a87..5f99a0b7e 100644
--- a/python/vyos/ifconfig/dhcp.py
+++ b/python/vyos/ifconfig/dhcp.py
@@ -14,25 +14,22 @@
# License along with this library. If not, see <http://www.gnu.org/licenses/>.
import os
+import jmespath
-from vyos.dicts import FixedDict
+from vyos.configdict import dict_merge
+from vyos.configverify import verify_dhcpv6
from vyos.ifconfig.control import Control
from vyos.template import render
class _DHCPv4 (Control):
def __init__(self, ifname):
super().__init__()
- config_base = r'/var/lib/dhcp/dhclient_'
- self.options = FixedDict(**{
- 'ifname': ifname,
- 'hostname': '',
- 'client_id': '',
- 'vendor_class_id': '',
- 'conf_file': config_base + f'{ifname}.conf',
- 'options_file': config_base + f'{ifname}.options',
- 'pid_file': config_base + f'{ifname}.pid',
- 'lease_file': config_base + f'{ifname}.leases',
- })
+ config_base = r'/var/lib/dhcp/dhclient'
+ self._conf_file = f'{config_base}_{ifname}.conf'
+ self._options_file = f'{config_base}_{ifname}.options'
+ self._pid_file = f'{config_base}_{ifname}.pid'
+ self._lease_file = f'{config_base}_{ifname}.leases'
+ self.options = {'ifname' : ifname}
# replace dhcpv4/v6 with systemd.networkd?
def set(self):
@@ -41,19 +38,24 @@ class _DHCPv4 (Control):
started in background!
Example:
-
>>> from vyos.ifconfig import Interface
>>> j = Interface('eth0')
>>> j.dhcp.v4.set()
"""
- if not self.options['hostname']:
+
+ if jmespath.search('dhcp_options.host_name', self.options) == None:
# read configured system hostname.
# maybe change to vyos hostd client ???
+ hostname = 'vyos'
with open('/etc/hostname', 'r') as f:
- self.options['hostname'] = f.read().rstrip('\n')
+ hostname = f.read().rstrip('\n')
+ tmp = {'dhcp_options' : { 'host_name' : hostname}}
+ self.options = dict_merge(tmp, self.options)
- render(self.options['options_file'], 'dhcp-client/daemon-options.tmpl', self.options)
- render(self.options['conf_file'], 'dhcp-client/ipv4.tmpl', self.options)
+ render(self._options_file, 'dhcp-client/daemon-options.tmpl',
+ self.options, trim_blocks=True)
+ render(self._conf_file, 'dhcp-client/ipv4.tmpl',
+ self.options, trim_blocks=True)
return self._cmd('systemctl restart dhclient@{ifname}.service'.format(**self.options))
@@ -63,62 +65,53 @@ class _DHCPv4 (Control):
pid, config and lease will be removed.
Example:
-
>>> from vyos.ifconfig import Interface
>>> j = Interface('eth0')
>>> j.dhcp.v4.delete()
"""
- if not os.path.isfile(self.options['pid_file']):
+ if not os.path.isfile(self._pid_file):
self._debug_msg('No DHCP client PID found')
return None
self._cmd('systemctl stop dhclient@{ifname}.service'.format(**self.options))
# cleanup old config files
- for name in ('conf_file', 'options_file', 'pid_file', 'lease_file'):
- if os.path.isfile(self.options[name]):
- os.remove(self.options[name])
+ for file in [self._conf_file, self._options_file, self._pid_file, self._lease_file]:
+ if os.path.isfile(file):
+ os.remove(file)
class _DHCPv6 (Control):
def __init__(self, ifname):
super().__init__()
- self.options = FixedDict(**{
- 'ifname': ifname,
- 'dhcpv6_prm_only': False,
- 'dhcpv6_temporary': False,
- 'dhcpv6_pd_interfaces': [],
- 'dhcpv6_pd_length': ''
- })
- self._conf_file = f'/run/dhcp6c/dhcp6c.{ifname}.conf'
+ self.options = {'ifname' : ifname}
+ self._config = f'/run/dhcp6c/dhcp6c.{ifname}.conf'
def set(self):
"""
- Configure interface as DHCPv6 client. The dhclient binary is automatically
- started in background!
+ Configure interface as DHCPv6 client. The client is automatically
+ started in background when address is configured as DHCP.
Example:
-
>>> from vyos.ifconfig import Interface
>>> j = Interface('eth0')
>>> j.dhcp.v6.set()
"""
- # better save then sorry .. should be checked in interface script
- # but if you missed it we are safe!
- if self.options['dhcpv6_prm_only'] and self.options['dhcpv6_temporary']:
- raise Exception(
- 'DHCPv6 temporary and parameters-only options are mutually exclusive!')
+ # better save then sorry .. should be checked in interface script but if you
+ # missed it we are safe!
+ verify_dhcpv6(self.options)
- render(self._conf_file, 'dhcp-client/ipv6.tmpl', self.options, trim_blocks=True)
- return self._cmd('systemctl restart dhcp6c@{ifname}.service'.format(**self.options))
+ render(self._config, 'dhcp-client/ipv6.tmpl',
+ self.options, trim_blocks=True)
+ return self._cmd('systemctl restart dhcp6c@{ifname}.service'.format(
+ **self.options))
def delete(self):
"""
- De-configure interface as DHCPv6 clinet. All auto generated files like
+ De-configure interface as DHCPv6 client. All auto generated files like
pid, config and lease will be removed.
Example:
-
>>> from vyos.ifconfig import Interface
>>> j = Interface('eth0')
>>> j.dhcp.v6.delete()
@@ -126,9 +119,8 @@ class _DHCPv6 (Control):
self._cmd('systemctl stop dhcp6c@{ifname}.service'.format(**self.options))
# cleanup old config files
- if os.path.isfile(self._conf_file):
- os.remove(self._conf_file)
-
+ if os.path.isfile(self._config):
+ os.remove(self._config)
class DHCP(object):
def __init__(self, ifname):
diff --git a/python/vyos/ifconfig/interface.py b/python/vyos/ifconfig/interface.py
index d477153e8..214ece8cd 100644
--- a/python/vyos/ifconfig/interface.py
+++ b/python/vyos/ifconfig/interface.py
@@ -822,6 +822,14 @@ class Interface(Control):
value = '2' if 'disable_link_detect' in config else '1'
self.set_link_detect(value)
+ # DHCP options
+ if 'dhcp_options' in config:
+ self.dhcp.v4.options = config
+
+ # DHCPv6 options
+ if 'dhcpv6_options' in config:
+ self.dhcp.v6.options = config
+
# Configure assigned interface IP addresses. No longer
# configured addresses will be removed first
new_addr = config.get('address', [])
@@ -849,35 +857,6 @@ class Interface(Control):
# checked before
self.set_vrf(config.get('vrf', ''))
- # DHCP options
- if 'dhcp_options' in config:
- dhcp_options = config.get('dhcp_options')
- if 'client_id' in dhcp_options:
- self.dhcp.v4.options['client_id'] = dhcp_options.get('client_id')
-
- if 'host_name' in dhcp_options:
- self.dhcp.v4.options['hostname'] = dhcp_options.get('host_name')
-
- if 'vendor_class_id' in dhcp_options:
- self.dhcp.v4.options['vendor_class_id'] = dhcp_options.get('vendor_class_id')
-
- # DHCPv6 options
- if 'dhcpv6_options' in config:
- dhcpv6_options = config.get('dhcpv6_options')
- if 'parameters_only' in dhcpv6_options:
- self.dhcp.v6.options['dhcpv6_prm_only'] = True
-
- if 'temporary' in dhcpv6_options:
- self.dhcp.v6.options['dhcpv6_temporary'] = True
-
- if 'prefix_delegation' in dhcpv6_options:
- prefix_delegation = dhcpv6_options.get('prefix_delegation')
- if 'length' in prefix_delegation:
- self.dhcp.v6.options['dhcpv6_pd_length'] = prefix_delegation.get('length')
-
- if 'interface' in prefix_delegation:
- self.dhcp.v6.options['dhcpv6_pd_interfaces'] = prefix_delegation.get('interface')
-
# Configure ARP cache timeout in milliseconds - has default value
tmp = jmespath.search('ip.arp_cache_timeout', config)
value = tmp if (tmp != None) else '30'
@@ -982,9 +961,11 @@ class Interface(Control):
self.del_vlan(vif_s_id)
# create/update 802.1ad (Q-in-Q VLANs)
+ ifname = config['ifname']
for vif_s_id, vif_s in config.get('vif_s', {}).items():
tmp=get_ethertype(vif_s.get('ethertype', '0x88A8'))
s_vlan = self.add_vlan(vif_s_id, ethertype=tmp)
+ vif_s['ifname'] = f'{ifname}.{vif_s_id}'
s_vlan.update(vif_s)
# remove no longer required client VLAN (vif-c)
@@ -994,6 +975,7 @@ class Interface(Control):
# create/update client VLAN (vif-c) interface
for vif_c_id, vif_c in vif_s.get('vif_c', {}).items():
c_vlan = s_vlan.add_vlan(vif_c_id)
+ vif_c['ifname'] = f'{ifname}.{vif_s_id}.{vif_c_id}'
c_vlan.update(vif_c)
# remove no longer required 802.1q VLAN interfaces
@@ -1003,4 +985,5 @@ class Interface(Control):
# create/update 802.1q VLAN interfaces
for vif_id, vif in config.get('vif', {}).items():
vlan = self.add_vlan(vif_id)
+ vif['ifname'] = f'{ifname}.{vif_id}'
vlan.update(vif)
diff --git a/src/conf_mode/interfaces-pppoe.py b/src/conf_mode/interfaces-pppoe.py
index b9a88a949..928113b49 100755
--- a/src/conf_mode/interfaces-pppoe.py
+++ b/src/conf_mode/interfaces-pppoe.py
@@ -108,7 +108,7 @@ def generate(pppoe):
if tmp and len(tmp) > 0:
# ipv6.tmpl relies on ifname - this should be made consitent in the
# future better then double key-ing the same value
- render(config_wide_dhcp6c, 'dhcp-client/ipv6_new.tmpl', pppoe, trim_blocks=True)
+ render(config_wide_dhcp6c, 'dhcp-client/ipv6.tmpl', pppoe, trim_blocks=True)
return None
diff --git a/src/conf_mode/ssh.py b/src/conf_mode/ssh.py
index ffb0b700d..7b262565a 100755
--- a/src/conf_mode/ssh.py
+++ b/src/conf_mode/ssh.py
@@ -28,7 +28,7 @@ from vyos.xml import defaults
from vyos import airbag
airbag.enable()
-config_file = r'/etc/ssh/sshd_config'
+config_file = r'/run/ssh/sshd_config'
systemd_override = r'/etc/systemd/system/ssh.service.d/override.conf'
def get_config():
@@ -42,6 +42,8 @@ def get_config():
# options which we need to update into the dictionary retrived.
default_values = defaults(base)
ssh = dict_merge(default_values, ssh)
+ # pass config file path - used in override template
+ ssh['config_file'] = config_file
return ssh
diff --git a/src/op_mode/enter_config_mode.sh b/src/op_mode/enter_config_mode.sh
new file mode 100755
index 000000000..082800ce4
--- /dev/null
+++ b/src/op_mode/enter_config_mode.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+if [ `id -u` == 0 ]; then
+ echo "You are attempting to enter configuration mode as root."
+ echo "It may have unintended consequences and render your system"
+ echo "unusable until restart."
+ echo "Please do it as an administrator level VyOS user instead."
+else
+ if grep -q -e '^overlay.*/filesystem.squashfs' /proc/mounts; then
+ echo "WARNING: You are currently configuring a live-ISO environment, changes will not persist until installed"
+ fi
+ history -w
+ export _OFR_CONFIGURE=ok
+ newgrp vyattacfg
+ unset _OFR_CONFIGURE
+ _vyatta_op_do_key_bindings
+ history -r
+fi
diff --git a/src/op_mode/lldp_op.py b/src/op_mode/lldp_op.py
index 5d48e3210..0df6749aa 100755
--- a/src/op_mode/lldp_op.py
+++ b/src/op_mode/lldp_op.py
@@ -14,19 +14,19 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
import argparse
import jinja2
-from xml.dom import minidom
from sys import exit
from tabulate import tabulate
+from xml.dom import minidom
-from vyos.util import popen
+from vyos.util import cmd
from vyos.config import Config
parser = argparse.ArgumentParser()
parser.add_argument("-a", "--all", action="store_true", help="Show LLDP neighbors on all interfaces")
+parser.add_argument("-d", "--detail", action="store_true", help="Show detailes LLDP neighbor information on all interfaces")
parser.add_argument("-i", "--interface", action="store", help="Show LLDP neighbors on specific interface")
# Please be careful if you edit the template.
@@ -40,10 +40,8 @@ Device ID Local Proto Cap Platform Port ID
{% endfor -%}
"""
-def _get_neighbors():
- command = '/usr/sbin/lldpcli -f xml show neighbors'
- out,_ = popen(command)
- return out
+def get_neighbors():
+ return cmd('/usr/sbin/lldpcli -f xml show neighbors')
def extract_neighbor(neighbor):
"""
@@ -148,12 +146,17 @@ if __name__ == '__main__':
exit(0)
if args.all:
- neighbors = minidom.parseString(_get_neighbors())
+ neighbors = minidom.parseString(get_neighbors())
for neighbor in neighbors.getElementsByTagName('interface'):
tmp['neighbors'].append( extract_neighbor(neighbor) )
+ elif args.detail:
+ out = cmd('/usr/sbin/lldpctl -f plain')
+ print(out)
+ exit(0)
+
elif args.interface:
- neighbors = minidom.parseString(_get_neighbors())
+ neighbors = minidom.parseString(get_neighbors())
for neighbor in neighbors.getElementsByTagName('interface'):
# check if neighbor appeared on proper interface
if neighbor.getAttribute('name') == args.interface: