summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/conf_mode/interfaces-vxlan.py8
-rwxr-xr-xsrc/conf_mode/ipsec-settings.py3
-rwxr-xr-xsrc/conf_mode/system-syslog.py13
-rwxr-xr-xsrc/conf_mode/vrrp.py6
-rwxr-xr-xsrc/op_mode/powerctrl.py38
-rwxr-xr-xsrc/op_mode/vrrp.py3
-rwxr-xr-xsrc/system/vrrp-script-wrapper.py49
7 files changed, 59 insertions, 61 deletions
diff --git a/src/conf_mode/interfaces-vxlan.py b/src/conf_mode/interfaces-vxlan.py
index 7f1ac6c31..efdc21f89 100755
--- a/src/conf_mode/interfaces-vxlan.py
+++ b/src/conf_mode/interfaces-vxlan.py
@@ -189,13 +189,13 @@ def apply(vxlan):
# configure ARP cache timeout in milliseconds
v.set_arp_cache_tmo(vxlan['ip_arp_cache_tmo'])
# configure ARP filter configuration
- v.set_arp_filter(bond['ip_disable_arp_filter'])
+ v.set_arp_filter(vxlan['ip_disable_arp_filter'])
# configure ARP accept
- v.set_arp_accept(bond['ip_enable_arp_accept'])
+ v.set_arp_accept(vxlan['ip_enable_arp_accept'])
# configure ARP announce
- v.set_arp_announce(bond['ip_enable_arp_announce'])
+ v.set_arp_announce(vxlan['ip_enable_arp_announce'])
# configure ARP ignore
- v.set_arp_ignore(bond['ip_enable_arp_ignore'])
+ v.set_arp_ignore(vxlan['ip_enable_arp_ignore'])
# Enable proxy-arp on this interface
v.set_proxy_arp(vxlan['ip_proxy_arp'])
diff --git a/src/conf_mode/ipsec-settings.py b/src/conf_mode/ipsec-settings.py
index aab3e9734..e80c6caf0 100755
--- a/src/conf_mode/ipsec-settings.py
+++ b/src/conf_mode/ipsec-settings.py
@@ -248,7 +248,8 @@ def generate(data):
write_ipsec_ra_conn(data)
append_ipsec_conf(data)
else:
- remove_confs(delim_ipsec_l2tp_begin, delim_ipsec_l2tp_end, ipsec_ra_conn_file)
+ if os.path.exists(ipsec_ra_conn_file):
+ remove_confs(delim_ipsec_l2tp_begin, delim_ipsec_l2tp_end, ipsec_ra_conn_file)
remove_confs(delim_ipsec_l2tp_begin, delim_ipsec_l2tp_end, ipsec_secrets_flie)
remove_confs(delim_ipsec_l2tp_begin, delim_ipsec_l2tp_end, ipsec_conf_flie)
diff --git a/src/conf_mode/system-syslog.py b/src/conf_mode/system-syslog.py
index 15533afab..2d47cc061 100755
--- a/src/conf_mode/system-syslog.py
+++ b/src/conf_mode/system-syslog.py
@@ -19,6 +19,7 @@
import sys
import os
import re
+import subprocess
import jinja2
from vyos.config import Config
@@ -313,15 +314,11 @@ def verify(c):
def apply(c):
- if not c and os.path.exists('/var/run/rsyslogd.pid'):
- os.system("sudo systemctl stop syslog.socket")
- os.system("sudo systemctl stop rsyslog")
- else:
- if not os.path.exists('/var/run/rsyslogd.pid'):
- os.system("sudo systemctl start rsyslog >/dev/null")
- else:
- os.system("sudo systemctl restart rsyslog >/dev/null")
+ if not c:
+ subprocess.call(['sudo', 'systemctl', 'stop', 'syslog'])
+ return 0
+ subprocess.call(['sudo', 'systemctl', 'restart', 'syslog'])
if __name__ == '__main__':
try:
diff --git a/src/conf_mode/vrrp.py b/src/conf_mode/vrrp.py
index d31be4cfb..1d8477769 100755
--- a/src/conf_mode/vrrp.py
+++ b/src/conf_mode/vrrp.py
@@ -37,6 +37,7 @@ config_tmpl = """
global_defs {
dynamic_interfaces
+ script_user root
}
{% for group in groups -%}
@@ -117,6 +118,10 @@ vrrp_instance {{ group.name }} {
{% if group.fault_script -%}
notify_fault "/usr/libexec/vyos/system/vrrp-script-wrapper.py --state fault --group {{ group.name }} --interface {{ group.interface }} {{ group.fault_script }}"
{% endif -%}
+
+ {% if group.stop_script -%}
+ notify_stop "/usr/libexec/vyos/system/vrrp-script-wrapper.py --state stop --group {{ group.name }} --interface {{ group.interface }} {{ group.stop_script }}"
+ {% endif -%}
}
{% endfor -%}
@@ -178,6 +183,7 @@ def get_config():
group["master_script"] = config.return_value("transition-script master")
group["backup_script"] = config.return_value("transition-script backup")
group["fault_script"] = config.return_value("transition-script fault")
+ group["stop_script"] = config.return_value("transition-script stop")
if config.exists("no-preempt"):
group["preempt"] = False
diff --git a/src/op_mode/powerctrl.py b/src/op_mode/powerctrl.py
index a6188ec74..54fc12be3 100755
--- a/src/op_mode/powerctrl.py
+++ b/src/op_mode/powerctrl.py
@@ -24,6 +24,7 @@ from datetime import datetime, timedelta, time as type_time, date as type_date
from subprocess import check_output, CalledProcessError, STDOUT
from vyos.util import ask_yes_no
+systemd_sched_file = "/run/systemd/shutdown/scheduled"
def parse_time(s):
try:
@@ -45,33 +46,40 @@ def parse_date(s):
def get_shutdown_status():
try:
- output = check_output(["/bin/systemctl", "status", "systemd-shutdownd.service"]).decode()
- return output
+ if os.path.exists(systemd_sched_file):
+ # Get scheduled from systemd file
+ with open(systemd_sched_file, 'r') as f:
+ data = f.read().rstrip('\n')
+ r_data = {}
+ for line in data.splitlines():
+ tmp_split = line.split("=")
+ if tmp_split[0] == "USEC":
+ # Convert USEC to human readable format
+ r_data['DATETIME'] = datetime.utcfromtimestamp(int(tmp_split[1])/1000000).strftime('%Y-%m-%d %H:%M:%S')
+ else:
+ r_data[tmp_split[0]] = tmp_split[1]
+ return r_data
+ return None
except CalledProcessError:
return None
def check_shutdown():
output = get_shutdown_status()
- if output:
- r = re.findall(r'Status: \"(.*)\"\n', output)
- if r:
- # When available, that line is like
- # Status: "Shutting down at Thu 1970-01-01 00:00:00 UTC (poweroff)..."
- print(r[0])
- else:
- # Sometimes status string is not available immediately
- # after service startup
- print("Poweroff or reboot is scheduled")
+ if output and 'MODE' in output:
+ if output['MODE'] == 'reboot':
+ print("Reboot is scheduled", output['DATETIME'])
+ elif output['MODE'] == 'poweroff':
+ print("Poweroff is scheduled", output['DATETIME'])
else:
- print("Poweroff or reboot is not scheduled")
+ print("Reboot or poweroff is not scheduled")
def cancel_shutdown():
output = get_shutdown_status()
- if output:
+ if output and 'MODE' in output:
try:
timenow = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
cmd = check_output(["/sbin/shutdown","-c","--no-wall"])
- message = "Scheduled reboot or poweroff has been cancelled %s" % timenow
+ message = "Scheduled %s has been cancelled %s" % (output['MODE'], timenow)
os.system("wall %s" % message)
except CalledProcessError as e:
sys.exit("Could not cancel a reboot or poweroff: %s" % e)
diff --git a/src/op_mode/vrrp.py b/src/op_mode/vrrp.py
index 54e1bfb57..8d1369823 100755
--- a/src/op_mode/vrrp.py
+++ b/src/op_mode/vrrp.py
@@ -32,6 +32,7 @@ def print_summary():
# Replace with inotify or similar if it proves problematic
time.sleep(0.2)
json_data = vyos.keepalived.get_json_data()
+ vyos.keepalived.remove_vrrp_data("json")
except:
print("VRRP information is not available")
sys.exit(1)
@@ -63,6 +64,7 @@ def print_statistics():
time.sleep(0.2)
output = vyos.keepalived.get_statistics()
print(output)
+ vyos.keepalived.remove_vrrp_data("stats")
except:
print("VRRP statistics are not available")
sys.exit(1)
@@ -73,6 +75,7 @@ def print_state_data():
time.sleep(0.2)
output = vyos.keepalived.get_state_data()
print(output)
+ vyos.keepalived.remove_vrrp_data("state")
except:
print("VRRP information is not available")
sys.exit(1)
diff --git a/src/system/vrrp-script-wrapper.py b/src/system/vrrp-script-wrapper.py
index ccd640128..c28ecba55 100755
--- a/src/system/vrrp-script-wrapper.py
+++ b/src/system/vrrp-script-wrapper.py
@@ -23,7 +23,6 @@ import argparse
import syslog
import vyos.util
-import vyos.keepalived
parser = argparse.ArgumentParser()
@@ -44,38 +43,22 @@ if not args.script or not args.state or not args.group \
# to pass arguments to the script
args.script = " ".join(args.script)
-# Get the old state if it exists and compare it to the current state received
-# in command line options to avoid executing scripts if no real transition occured.
-# This is necessary because keepalived does not keep persistent state data even between
-# config reloads and will cheerfully execute everything whether it's required or not.
-
-old_state = vyos.keepalived.get_old_state(args.group)
-
-if (old_state is None) or (old_state != args.state):
- exitcode = 0
-
- # Run the script and save the new state
-
- # Change the process GID to the config owners group to avoid screwing up
- # running config permissions
- os.setgid(vyos.util.get_cfg_group_id())
-
- syslog.syslog(syslog.LOG_NOTICE, 'Running transition script {0} for VRRP group {1}'.format(args.script, args.group))
- try:
- ret = subprocess.call("%s %s %s %s" % ( args.script, args.state, args.interface, args.group), shell=True)
- if ret != 0:
- syslog.syslog(syslog.LOG_ERR, "Transition script {0} failed, exit status: {1}".format(args.script, ret))
- exitcode = ret
- except Exception as e:
- syslog.syslog(syslog.LOG_ERR, "Failed to execute transition script {0}: {1}".format(args.script, e))
- exitcode = 1
-
- if exitcode == 0:
- syslog.syslog(syslog.LOG_NOTICE, "Transition script {0} executed successfully".format(args.script))
-
- vyos.keepalived.save_state(args.group, args.state)
-else:
- syslog.syslog(syslog.LOG_NOTICE, "State of the group {0} has not changed, not running transition script".format(args.group))
+exitcode = 0
+# Change the process GID to the config owners group to avoid screwing up
+# running config permissions
+os.setgid(vyos.util.get_cfg_group_id())
+syslog.syslog(syslog.LOG_NOTICE, 'Running transition script {0} for VRRP group {1}'.format(args.script, args.group))
+try:
+ ret = subprocess.call("%s %s %s %s" % ( args.script, args.state, args.interface, args.group), shell=True)
+ if ret != 0:
+ syslog.syslog(syslog.LOG_ERR, "Transition script {0} failed, exit status: {1}".format(args.script, ret))
+ exitcode = ret
+except Exception as e:
+ syslog.syslog(syslog.LOG_ERR, "Failed to execute transition script {0}: {1}".format(args.script, e))
+ exitcode = 1
+
+if exitcode == 0:
+ syslog.syslog(syslog.LOG_NOTICE, "Transition script {0} executed successfully".format(args.script))
syslog.closelog()
sys.exit(exitcode)