diff options
author | Christian Breunig <christian@breunig.cc> | 2023-10-14 08:56:44 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-14 08:56:44 +0200 |
commit | 656f9ccad10e61a03f1c206f8596f800e63d9738 (patch) | |
tree | 69a5648fbf212972e82c308ff8ed906dbe8d2c11 /src/system/uacctd_stop.py | |
parent | c4bea386c66259f642f4695f376b4c544903bc7e (diff) | |
parent | e364e9813b6833f6b108e7177ef7ea2d9e7bac33 (diff) | |
download | vyos-1x-656f9ccad10e61a03f1c206f8596f800e63d9738.tar.gz vyos-1x-656f9ccad10e61a03f1c206f8596f800e63d9738.zip |
Merge pull request #2361 from zdc/T5232-circinus
pmacct: T5232: Fixed pmacct service control via systemctl
Diffstat (limited to 'src/system/uacctd_stop.py')
-rwxr-xr-x | src/system/uacctd_stop.py | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/system/uacctd_stop.py b/src/system/uacctd_stop.py new file mode 100755 index 000000000..7fbac0566 --- /dev/null +++ b/src/system/uacctd_stop.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2023 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/>. + +# Control pmacct daemons in a tricky way. +# Pmacct has signal processing in a main loop, together with packet +# processing. Because of this, while it is waiting for packets, it cannot +# handle the control signal. We need to start the systemctl command and then +# send some packets to pmacct to wake it up + +from argparse import ArgumentParser +from socket import socket +from sys import exit +from time import sleep + +from psutil import Process + + +def stop_process(pid: int, timeout: int) -> None: + """Send a signal to uacctd + and then send packets to special address predefined in a firewall + to unlock main loop in uacctd and finish the process properly + + Args: + pid (int): uacctd PID + timeout (int): seconds to wait for a process end + """ + # find a process + uacctd = Process(pid) + uacctd.terminate() + + # create a socket + trigger = socket() + + first_cycle: bool = True + while uacctd.is_running() and timeout: + trigger.sendto(b'WAKEUP', ('127.0.254.0', 0)) + # do not sleep during first attempt + if not first_cycle: + sleep(1) + timeout -= 1 + first_cycle = False + + +if __name__ == '__main__': + parser = ArgumentParser() + parser.add_argument('process_id', + type=int, + help='PID file of uacctd core process') + parser.add_argument('timeout', + type=int, + help='time to wait for process end') + args = parser.parse_args() + stop_process(args.process_id, args.timeout) + exit() |