#! /usr/bin/env python3 from argparse import ArgumentParser from datetime import datetime from multiprocessing import Process, Queue from pathlib import Path from queue import Empty import logging from .mutation import generation, flip, seed_shell def sins(): now = '{0:%Y%m%dT%H%M%S}'.format(datetime.utcnow()) parser = ArgumentParser( description='position independent code (PIC) mutation experiment.') parser.add_argument('-v', '--verbose', action='count') parser.add_argument('-s', '--seed', help='path to PIC image.') parser.add_argument('-o', '--output', help='path to results directory.') parser.add_argument('-l', '--lineage', default=10, help='max count of unsuccessful generation.') args = parser.parse_args() log_level = logging.INFO log_format = logging.Formatter('%(message)s') if args.verbose: log_level = logging.DEBUG log_format = logging.Formatter( '%(levelname)s %(filename)s:%(lineno)d\n%(message)s\n') logger = logging.getLogger('sins') logger.setLevel(log_level) stream_handler = logging.StreamHandler() stream_handler.setLevel(log_level) stream_handler.setFormatter(log_format) logger.addHandler(stream_handler) if args.output: log_path = f'{args.output}/sins-{now}.log' file_handler = logging.FileHandler(log_path) file_handler.setLevel(log_level) file_handler.setFormatter(log_format) logger.addHandler(file_handler) logger.info(now) seed_data = seed_shell if args.seed: seed = Path(args.seed) with seed.open('rb') as seed_file: seed_data = seed_file.read() logger.info(f'seed:\n{seed_data}') queue = Queue() while True: lineage = 0 seed_flipped = flip(seed_data) while lineage < args.lineage: logger.info(f'lineage: {lineage}') result = None proc = Process(target=generation, args=(queue, seed_flipped)) proc.start() try: result = queue.get(timeout=1) except Empty: lineage += 1 continue if not result: lineage += 1 continue logger.info(f'scrap:\n{seed_flipped}') logger.info(f'result: {result}') lineage = 0 seed_flipped = flip(seed_flipped)