gnunet_janitor.py.in 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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 it
  6. # under the terms of the GNU Affero General Public License as published
  7. # by the Free Software Foundation, either version 3 of the License, or
  8. # (at your 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. # Affero General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU Affero General Public License
  16. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. #
  18. # SPDX-License-Identifier: AGPL3.0-or-later
  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. import os
  25. import re
  26. import subprocess
  27. import sys
  28. import shutil
  29. import time
  30. import signal
  31. import terminate
  32. if os.name == 'nt':
  33. from win32com.client import GetObject
  34. WMI = GetObject('winmgmts:')
  35. def get_process_list():
  36. result = []
  37. if os.name == 'nt':
  38. processes = WMI.InstancesOf('Win32_Process')
  39. for p in processes:
  40. result.append((p.Properties_('ProcessId').Value, re.sub(r'(.+)\.exe', r'\1', p.Properties_('Name').Value)))
  41. else:
  42. pids = [pid for pid in os.listdir('/proc') if pid.isdigit()]
  43. for pid in pids:
  44. with open(os.path.join('/proc', pid, 'cmdline'), 'rb') as p:
  45. cmdline = p.read().split('\x00')
  46. if len(cmdline) > 0:
  47. result.append((pid, cmdline[0]))
  48. return result
  49. def main():
  50. procs = get_process_list()
  51. gnunet_procs = []
  52. for p in procs:
  53. if re.match(r'gnunet-.+', p[1]):
  54. gnunet_procs.append(p)
  55. for p in gnunet_procs:
  56. if re.match(r'gnunet-service-arm', p[1]):
  57. print("killing arm process {0:5} {1}".format(p[0], p[1]))
  58. try:
  59. terminate.safe_terminate_process_by_pid(int(p[0]), 1)
  60. except OSError as e:
  61. print("failed: {0}".format(e))
  62. pass
  63. for p in gnunet_procs:
  64. if not re.match(r'gnunet-service-arm', p[1]):
  65. print("killing non-arm process {0:5} {1}".format(p[0], p[1]))
  66. try:
  67. terminate.safe_terminate_process_by_pid(int(p[0]), 1)
  68. except OSError as e:
  69. print("failed: {0}".format(e))
  70. pass
  71. if __name__ == '__main__':
  72. sys.exit(main())