summaryrefslogtreecommitdiff
path: root/src/system/vrrp-script-wrapper.py
diff options
context:
space:
mode:
authorDaniil Baturin <daniil@baturin.org>2018-07-27 01:17:25 +0200
committerDaniil Baturin <daniil@baturin.org>2018-07-27 01:17:25 +0200
commit3dba2d13e6ba7ced2a032b9fbb98984a44370f5f (patch)
tree6299bf0e5ff9d71285480ba1376804a07386eab5 /src/system/vrrp-script-wrapper.py
parentf9f1333e4c741451a8b53031812fcbdb167b4731 (diff)
downloadvyos-1x-3dba2d13e6ba7ced2a032b9fbb98984a44370f5f.tar.gz
vyos-1x-3dba2d13e6ba7ced2a032b9fbb98984a44370f5f.zip
T666, T616: new implementation of the VRRP CLI.
Diffstat (limited to 'src/system/vrrp-script-wrapper.py')
-rwxr-xr-xsrc/system/vrrp-script-wrapper.py77
1 files changed, 77 insertions, 0 deletions
diff --git a/src/system/vrrp-script-wrapper.py b/src/system/vrrp-script-wrapper.py
new file mode 100755
index 000000000..5d6aa6c55
--- /dev/null
+++ b/src/system/vrrp-script-wrapper.py
@@ -0,0 +1,77 @@
+#!/usr/bin/env python3
+#
+# Copyright (C) 2018 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 <http://www.gnu.org/licenses/>.
+#
+#
+
+import os
+import sys
+import subprocess
+import argparse
+import syslog
+
+import vyos.util
+import vyos.keepalived
+
+
+parser = argparse.ArgumentParser()
+parser.add_argument("-s", "--script", type=str, help="Script to run")
+parser.add_argument("-t", "--state", type=str, help="VRRP state")
+parser.add_argument("-g", "--group", type=str, help="VRRP group")
+parser.add_argument("-i", "--interface", type=str, help="Network interface")
+
+syslog.openlog('vyos-vrrp-wrapper')
+
+args = parser.parse_args()
+if not args.script or not args.state or not args.group \
+ or not args.interface:
+ parser.print_usage()
+ sys.exit(1)
+
+# 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([args.script, args.state, args.interface, args.group])
+ 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))
+
+syslog.closelog()
+sys.exit(exitcode)