#!/usr/local/bin/python
#    This file is part of GNUnet.
#    (C) 2011 Christian Grothoff (and other contributing authors)
#
#    GNUnet is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published
#    by the Free Software Foundation; either version 2, or (at your
#    option) any later version.
#
#    GNUnet 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 GNUnet; see the file COPYING.  If not, write to the
#    Free Software Foundation, Inc., 59 Temple Place - Suite 330,
#    Boston, MA 02111-1307, USA.
#
# Finds any gnunet processes still running in the system and kills them
#
# gnunet janitor can be used by invoking `make' like this:
# TESTS_ENVIRONMENT='${top_srcdir}/contrib/gnunet_janitor.py &&' make check

from __future__ import print_function
import os
import re
import subprocess
import sys
import shutil
import time
import signal

if os.name == 'nt':
  from win32com.client import GetObject
  WMI = GetObject('winmgmts:')
  killsignal = signal.SIGTERM # any valid value will result in TerminateProcess()
else:
  killsignal = signal.SIGKILL  

def get_process_list ():
  result = []
  if os.name == 'nt':
    processes = WMI.InstancesOf('Win32_Process')
    for p in processes:
      result.append ((p.Properties_('ProcessId').Value, re.sub (r'(.+)\.exe', r'\1', p.Properties_('Name').Value)))
  else:
    pids = [pid for pid in os.listdir('/proc') if pid.isdigit ()]
    for pid in pids:
      with open (os.path.join ('/proc', pid, 'cmdline'), 'rb') as p:
        cmdline = p.read ().split ('\x00')
        if len (cmdline) > 0:
          result.append ((pid, cmdline[0]))
  return result

def main ():
  procs = get_process_list ()
  gnunet_procs = []
  for p in procs:
    if re.match (r'gnunet-.+', p[1]):
      gnunet_procs.append (p)
  for p in gnunet_procs:
    if re.match (r'gnunet-service-arm', p[1]):
      print ("killing arm process {0:5} {1}".format (p[0], p[1]))
      try:
        os.kill (int (p[0]), killsignal)
      except OSError as e:
        print ("failed: {0}".format (e))
        pass
  for p in gnunet_procs:
    if not re.match (r'gnunet-service-arm', p[1]):
      print ("killing non-arm process {0:5} {1}".format (p[0], p[1]))
      try:
        os.kill (int (p[0]), killsignal)
      except OSError as e:
        print ("failed: {0}".format (e))
        pass

if __name__ == '__main__':
  sys.exit (main ())
