2019-02-26 15:45:38 +01:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
|
|
|
import time, datetime
|
|
|
|
import logging
|
|
|
|
import redis
|
|
|
|
import configparser
|
|
|
|
import argparse
|
|
|
|
import os
|
|
|
|
import subprocess
|
|
|
|
import sys
|
|
|
|
import json
|
|
|
|
import atexit
|
|
|
|
import signal
|
|
|
|
import shlex
|
|
|
|
import pty
|
|
|
|
import threading
|
|
|
|
|
|
|
|
configfile = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'config/config.cfg')
|
|
|
|
cfg = configparser.ConfigParser()
|
|
|
|
cfg.read(configfile)
|
|
|
|
logDir = cfg.get('Log', 'directory')
|
2019-06-21 15:32:59 +02:00
|
|
|
logfilename = cfg.get('Log', 'subscriber_filename')
|
2019-02-26 15:45:38 +01:00
|
|
|
logPath = os.path.join(logDir, logfilename)
|
|
|
|
if not os.path.exists(logDir):
|
|
|
|
os.makedirs(logDir)
|
|
|
|
logging.basicConfig(filename=logPath, filemode='a', level=logging.INFO)
|
|
|
|
logger = logging.getLogger('zmq_subscriber')
|
|
|
|
|
|
|
|
CHANNEL = cfg.get('RedisLog', 'channel')
|
|
|
|
LISTNAME = cfg.get('RedisLIST', 'listName')
|
|
|
|
|
|
|
|
serv_list = redis.StrictRedis(
|
|
|
|
host=cfg.get('RedisGlobal', 'host'),
|
|
|
|
port=cfg.getint('RedisGlobal', 'port'),
|
|
|
|
db=cfg.getint('RedisLIST', 'db'))
|
|
|
|
|
|
|
|
children = []
|
|
|
|
|
|
|
|
def signal_handler(signal, frame):
|
|
|
|
for child in children:
|
|
|
|
# We don't resume as we are already attached
|
|
|
|
cmd = "screen -p"+child+" -X {arg}"
|
|
|
|
argsc = shlex.split(cmd.format(arg = "kill"))
|
|
|
|
print("\n\033[1;31m [-] Terminating {child}\033[0;39m".format(child=child))
|
|
|
|
logger.info('Terminate: {child}'.format(child=child))
|
|
|
|
subprocess.call(argsc) # kill window
|
|
|
|
sys.exit(0)
|
|
|
|
|
|
|
|
###############
|
|
|
|
## MAIN LOOP ##
|
|
|
|
###############
|
|
|
|
|
|
|
|
def main():
|
|
|
|
print("\033[1;31m [+] I am the subscriber's master - kill me to kill'em'all \033[0;39m")
|
|
|
|
# screen needs a shell and I an no fan of shell=True
|
|
|
|
(master, slave) = pty.openpty()
|
|
|
|
try:
|
|
|
|
for item in json.loads(cfg.get('RedisGlobal', 'misp_instances')):
|
|
|
|
name = shlex.quote(item.get("name"))
|
|
|
|
zmq = shlex.quote(item.get("zmq"))
|
|
|
|
print("\033[1;32m [+] Subscribing to "+zmq+"\033[0;39m")
|
|
|
|
logger.info('Launching: {child}'.format(child=name))
|
|
|
|
children.append(name)
|
|
|
|
subprocess.Popen(["screen", "-r", "Misp_Dashboard", "-X", "screen", "-t", name ,sys.executable, "./zmq_subscriber.py", "-n", name, "-u", zmq], close_fds=True, shell=False, stdin=slave, stdout=slave, stderr=slave)
|
|
|
|
except ValueError as error:
|
|
|
|
print("\033[1;31m [!] Fatal exception: {error} \033[0;39m".format(error=error))
|
|
|
|
logger.error("JSON error: %s", error)
|
|
|
|
sys.exit(1)
|
|
|
|
signal.signal(signal.SIGINT, signal_handler)
|
|
|
|
forever = threading.Event()
|
2019-03-14 11:41:07 +01:00
|
|
|
forever.wait() # Wait for SIGINT
|
2019-02-26 15:45:38 +01:00
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
main()
|