diff options
Diffstat (limited to 'python/deviutil.py')
-rwxr-xr-x | python/deviutil.py | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/python/deviutil.py b/python/deviutil.py new file mode 100755 index 0000000..efbfe8b --- /dev/null +++ b/python/deviutil.py @@ -0,0 +1,229 @@ +#!/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() |