diff options
| author | Christian Poessinger <christian@poessinger.com> | 2019-10-03 11:56:18 +0200 | 
|---|---|---|
| committer | Christian Poessinger <christian@poessinger.com> | 2019-10-03 11:56:18 +0200 | 
| commit | 08b60ba1ccbb12d398a184f0303f2c150a15b918 (patch) | |
| tree | 222290e6512826ed5738c0491bfc926777b6997e | |
| parent | cf499f958423919264884e9f1c5c1b593fd9de0e (diff) | |
| download | vyos-1x-08b60ba1ccbb12d398a184f0303f2c150a15b918.tar.gz vyos-1x-08b60ba1ccbb12d398a184f0303f2c150a15b918.zip | |
OpenVPN: T1689: Add full restart on 'reset openvpn interface <interface>'
| -rw-r--r-- | op-mode-definitions/openvpn.xml | 2 | ||||
| -rwxr-xr-x | src/op_mode/reset_openvpn.py | 72 | 
2 files changed, 73 insertions, 1 deletions
| diff --git a/op-mode-definitions/openvpn.xml b/op-mode-definitions/openvpn.xml index 368cc9115..d7c4fc101 100644 --- a/op-mode-definitions/openvpn.xml +++ b/op-mode-definitions/openvpn.xml @@ -68,7 +68,7 @@                  <script>sudo ${vyos_completion_dir}/list_interfaces.py --type openvpn</script>                </completionHelp>              </properties> -            <command>sudo kill -SIGUSR1 $(cat /var/run/openvpn/$4.pid)</command> +            <command>sudo ${vyos_op_scripts_dir}/reset_openvpn.py $4</command>            </tagNode>          </children>        </node> diff --git a/src/op_mode/reset_openvpn.py b/src/op_mode/reset_openvpn.py new file mode 100755 index 000000000..7043ac261 --- /dev/null +++ b/src/op_mode/reset_openvpn.py @@ -0,0 +1,72 @@ +#!/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 sys +import os + +from psutil import pid_exists +from subprocess import Popen, PIPE +from time import sleep +from netifaces import interfaces + +def get_config_name(intf): +    cfg_file = r'/opt/vyatta/etc/openvpn/openvpn-{}.conf'.format(intf) +    return cfg_file + +def get_pid_file(intf): +    pid_file = r'/var/run/openvpn/{}.pid'.format(intf) +    return pid_file + +def subprocess_cmd(command): +    p = Popen(command, stdout=PIPE, shell=True) +    p.communicate() + +if __name__ == '__main__': +    if (len(sys.argv) < 1): +        print("Must specify OpenVPN interface name!") +        sys.exit(1) + +    interface = sys.argv[1] +    if os.path.isfile(get_config_name(interface)): +        pidfile = '/var/run/openvpn/{}.pid'.format(interface) +        if os.path.isfile(pidfile): +            pid = 0 +            with open(pidfile, 'r') as f: +                pid = int(f.read()) + +            if pid_exists(pid): +                cmd  = 'start-stop-daemon --stop --quiet' +                cmd += ' --pidfile ' + pidfile +                subprocess_cmd(cmd) + +        # When stopping OpenVPN we need to wait for the 'old' interface to +        # vanish from the Kernel, if it is not gone, OpenVPN will report: +        # ERROR: Cannot ioctl TUNSETIFF vtun10: Device or resource busy (errno=16) +        while interface in interfaces(): +            sleep(0.250) # 250ms + +        # re-start OpenVPN process +        cmd  = 'start-stop-daemon --start --quiet' +        cmd += ' --pidfile ' + get_pid_file(interface) +        cmd += ' --exec /usr/sbin/openvpn' +        # now pass arguments to openvpn binary +        cmd += ' --' +        cmd += ' --config ' + get_config_name(interface) + +        subprocess_cmd(cmd) +    else: +        print("OpenVPN interface {} does not exist!".format(interface)) +        sys.exit(1) | 
