reduce loop counters to more practical levels
[oweals/gnunet.git] / contrib / scripts / gnunet_janitor.py.in
1 #!@PYTHON@
2 #    This file is part of GNUnet.
3 #    (C) 2011, 2018 Christian Grothoff (and other contributing authors)
4 #
5 #    GNUnet is free software; you can redistribute it and/or modify
6 #    it under the terms of the GNU General Public License as published
7 #    by the Free Software Foundation; either version 2, or (at your
8 #    option) any later version.
9 #
10 #    GNUnet is distributed in the hope that it will be useful, but
11 #    WITHOUT ANY WARRANTY; without even the implied warranty of
12 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 #    General Public License for more details.
14 #
15 #    You should have received a copy of the GNU General Public License
16 #    along with GNUnet; see the file COPYING.  If not, write to the
17 #    Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 #    Boston, MA 02110-1301, USA.
19 #
20 # Finds any gnunet processes still running in the system and kills them
21 #
22 # gnunet janitor can be used by invoking `make' like this:
23 # TESTS_ENVIRONMENT='${top_srcdir}/contrib/scripts/gnunet_janitor.py &&' make check
24
25 from __future__ import print_function
26 import os
27 import re
28 import subprocess
29 import sys
30 import shutil
31 import time
32 import signal
33 import terminate
34
35 if os.name == 'nt':
36     from win32com.client import GetObject
37     WMI = GetObject('winmgmts:')
38
39
40 def get_process_list():
41     result = []
42     if os.name == 'nt':
43         processes = WMI.InstancesOf('Win32_Process')
44         for p in processes:
45             result.append((p.Properties_('ProcessId').Value, re.sub(r'(.+)\.exe', r'\1', p.Properties_('Name').Value)))
46     else:
47         pids = [pid for pid in os.listdir('/proc') if pid.isdigit()]
48         for pid in pids:
49             with open(os.path.join('/proc', pid, 'cmdline'), 'rb') as p:
50                 cmdline = p.read().split('\x00')
51                 if len(cmdline) > 0:
52                     result.append((pid, cmdline[0]))
53     return result
54
55
56 def main():
57     procs = get_process_list()
58     gnunet_procs = []
59     for p in procs:
60         if re.match(r'gnunet-.+', p[1]):
61             gnunet_procs.append(p)
62     for p in gnunet_procs:
63         if re.match(r'gnunet-service-arm', p[1]):
64             print("killing arm process {0:5} {1}".format(p[0], p[1]))
65             try:
66                 terminate.safe_terminate_process_by_pid(int(p[0]), 1)
67             except OSError as e:
68                 print("failed: {0}".format(e))
69                 pass
70     for p in gnunet_procs:
71         if not re.match(r'gnunet-service-arm', p[1]):
72             print("killing non-arm process {0:5} {1}".format(p[0], p[1]))
73             try:
74                 terminate.safe_terminate_process_by_pid(int(p[0]), 1)
75             except OSError as e:
76                 print("failed: {0}".format(e))
77                 pass
78
79
80 if __name__ == '__main__':
81     sys.exit(main())