diff options
author | Daniil Baturin <daniil@baturin.org> | 2018-07-27 01:17:25 +0200 |
---|---|---|
committer | Daniil Baturin <daniil@baturin.org> | 2018-07-27 01:17:25 +0200 |
commit | 3dba2d13e6ba7ced2a032b9fbb98984a44370f5f (patch) | |
tree | 6299bf0e5ff9d71285480ba1376804a07386eab5 /src/system | |
parent | f9f1333e4c741451a8b53031812fcbdb167b4731 (diff) | |
download | vyos-1x-3dba2d13e6ba7ced2a032b9fbb98984a44370f5f.tar.gz vyos-1x-3dba2d13e6ba7ced2a032b9fbb98984a44370f5f.zip |
T666, T616: new implementation of the VRRP CLI.
Diffstat (limited to 'src/system')
-rwxr-xr-x | src/system/vrrp-script-wrapper.py | 77 |
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) |