#!/usr/bin/python3 import argparse import code import signal import sys import socket from abc import ABCMeta, abstractmethod class Colors: purple = '\033[95m' blue = '\033[94m' green = '\033[92m' yellow = '\033[93m' red = '\033[91m' grey = '\033[1;37m' darkgrey = '\033[1;30m' cyan = '\033[1;36m' ENDC = '\033[0m' BOLD = '\033[1m' UNDERLINE = '\033[4m' def SigHandler_SIGINT(signum, frame): print() sys.exit(0) class Argparser(object): def __init__(self): parser = argparse.ArgumentParser() parser.add_argument("--string", type=str, help="string") parser.add_argument("--bool", action="store_true", help="bool", default=False) parser.add_argument("--dbg", action="store_true", help="debug", default=False) self.args = parser.parse_args() def ffs(offset, header_list, numbered, *args): cn = Colors.green ch = Colors.cyan cd = Colors.blue cb = Colors.BOLD ci = Colors.red ce = Colors.ENDC max_column_width = [] lines = [] numbers_f = [] dummy = [] if numbered: numbers_f.extend(range(1, len(args[-1])+1)) max_column_width.append( max([len(repr(number)) for number in numbers_f])) header_list.insert(0, "idx") for arg in args: max_column_width.append(max([len(repr(argette)) for argette in arg])) index = range(0, len(header_list)) for header, width, i in zip(header_list, max_column_width, index): max_column_width[i] = max(len(header), width) + offset for i in index: dummy.append(ch + cb + header_list[i].ljust(max_column_width[i]) + ce) lines.append("".join(dummy)) dummy.clear() index2 = range(0, len(args[-1])) for i in index2: if numbered: dummy.append(ci+cb+repr(i).ljust(max_column_width[0])+ce) for arg, width in zip(args, max_column_width[1:]): dummy.append(cd+repr(arg[i]).ljust(width)+ce) else: for arg, width in zip(args, max_column_width): dummy.append(cd+repr(arg[i]).ljust(width)+ce) lines.append("".join(dummy)) dummy.clear() return lines class Demon_Father: __metalclass__ = ABCMeta def __init__(self, pidfile): self.pidfile = pidfile self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.server_address = ('localhost', 10000) def daemonize(self): try: pid = os.fork() if pid > 0: sys.exit(0) except OSError as err: sys.stderr.write('fork #1 failed: {0}\n'.format(err)) sys.exit(1) os.chdir('/') os.setsid() os.umask(0) try: pid = os.fork() if pid > 0: sys.exit(0) except OSError as err: sys.stderr.write('fork #2 failed: {0}\n'.format(err)) sys.exit(1) sys.stdout.flush() sys.stderr.flush() si = open(os.devnull, 'r') so = open(os.devnull, 'a+') se = open(os.devnull, 'a+') os.dup2(si.fileno(), sys.stdin.fileno()) os.dup2(so.fileno(), sys.stdout.fileno()) os.dup2(se.fileno(), sys.stderr.fileno()) atexit.register(self.delpid) pid = str(os.getpid()) with open(self.pidfile, 'w+') as f: f.write(pid + '\n') def delpid(self): self.pidfile.close() os.remove(self.pidfile) def start(self): self.daemonize() try: with open(self.pidfile, 'r') as pf: pid = int(pf.read().strip()) except IOError: pid = None ''' if pid: message = "pidfile {0} already exist. " + "Daemon already running?\n" sys.stderr.write(message.format(self.pidfile)) sys.exit(1) ''' self.run() def stop(self): try: with open(self.pidfile, 'r') as pf: pid = int(pf.read().strip()) except IOError: pid = None if not pid: message = "pidfile {0} does not exist. " + "Daemon not running?\n" sys.stderr.write(message.format(self.pidfile)) return try: while 1: os.kill(pid, signal.SIGTERM) time.sleep(0.1) except OSError as err: e = str(err.args) if e.find("No such process") > 0: if os.path.exists(self.pidfile): os.remove(self.pidfile) else: print(str(err.args)) sys.exit(1) def restart(self): self.stop() self.start() @abstractmethod def run(self): pass def hexdump(obj): count = int() strrep = [] for byte in obj: if count % 16 == 0: for ch in strrep: if ord(ch) > 32 and ord(ch) < 127: print(ch, end='') else: pass print() strrep = [] print(format(count, "06x"), ': ', end='') strrep.append(str(chr(byte))) print(format(byte, '02x') + ' ', end='') else: pass strrep += str(chr(byte)) print(format(byte, '02x') + ' ', end='') count += 1 for i in range(0, 16-count % 16): print(" ", end="") for ch in strrep: if ord(ch) > 32 and ord(ch) < 127: print(ch, end='') else: pass print() # write code here def premain(argparser): signal.signal(signal.SIGINT, SigHandler_SIGINT) # here a = [0x2f, 0x6c, 0x69, 0x62, 0x36, 0x34, 0x2f, 0x6c, 0x64, 0x2d, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2d, 0x78, 0x38, 0x36, 0x2d, 0x36, 0x34, 0x2e, 0x73, 0x6f, 0x2e, 0x32, 0x00] hexdump(a) def main(): argparser = Argparser() if argparser.args.dbg: try: premain(argparser) except: variables = globals().copy() variables.update(locals()) shell = code.InteractiveConsole(variables) shell.interact(banner="DEBUG REPL") else: premain(argparser) if __name__ == "__main__": main()