def main(argv=None): """ A simple command-line interface for the containerexecutor module of BenchExec. """ if argv is None: argv = sys.argv # parse options parser = argparse.ArgumentParser( fromfile_prefix_chars='@', description= """Execute a command inside a simple container, i.e., partially isolated from the host. Command-line parameters can additionally be read from a file if file name prefixed with '@' is given as argument. Part of BenchExec: https://github.com/sosy-lab/benchexec/""") parser.add_argument("--dir", metavar="DIR", help="working directory for executing the command (default is current directory)") parser.add_argument("--root", action="store_true", help="use UID 0 and GID 0 (i.e., fake root account) within container") parser.add_argument("--uid", metavar="UID", type=int, default=None, help="use given UID within container (default: current UID)") parser.add_argument("--gid", metavar="GID", type=int, default=None, help="use given GID within container (default: current UID)") add_basic_container_args(parser) add_container_output_args(parser) baseexecutor.add_basic_executor_options(parser) options = parser.parse_args(argv[1:]) baseexecutor.handle_basic_executor_options(options, parser) container_options = handle_basic_container_args(options, parser) container_output_options = handle_container_output_args(options, parser) if options.root: if options.uid is not None or options.gid is not None: parser.error("Cannot combine option --root with --uid/--gid") options.uid = 0 options.gid = 0 formatted_args = " ".join(map(util.escape_string_shell, options.args)) logging.info('Starting command %s', formatted_args) executor = ContainerExecutor(uid=options.uid, gid=options.gid, **container_options) # ensure that process gets killed on interrupt/kill signal def signal_handler_kill(signum, frame): executor.stop() signal.signal(signal.SIGTERM, signal_handler_kill) signal.signal(signal.SIGINT, signal_handler_kill) # actual run execution try: result = executor.execute_run(options.args, workingDir=options.dir, **container_output_options) except (BenchExecException, OSError) as e: if options.debug: logging.exception(e) sys.exit("Cannot execute {0}: {1}".format(util.escape_string_shell(options.args[0]), e)) return result.signal or result.value
def main(argv=None): """ A simple command-line interface for the containerexecutor module of BenchExec. """ if argv is None: argv = sys.argv # parse options parser = argparse.ArgumentParser( fromfile_prefix_chars='@', description= """Execute a command inside a simple container, i.e., partially isolated from the host. Command-line parameters can additionally be read from a file if file name prefixed with '@' is given as argument. Part of BenchExec: https://github.com/sosy-lab/benchexec/""") parser.add_argument("--dir", metavar="DIR", help="working directory for executing the command (default is current directory)") parser.add_argument("--root", action="store_true", help="use UID 0 and GID 0 (i.e., fake root account) within container") parser.add_argument("--uid", metavar="UID", type=int, default=None, help="use given UID within container (default: current UID)") parser.add_argument("--gid", metavar="GID", type=int, default=None, help="use given GID within container (default: current UID)") add_basic_container_args(parser) add_container_output_args(parser) baseexecutor.add_basic_executor_options(parser) options = parser.parse_args(argv[1:]) baseexecutor.handle_basic_executor_options(options, parser) container_options = handle_basic_container_args(options, parser) container_output_options = handle_container_output_args(options, parser) if options.root: if options.uid is not None or options.gid is not None: parser.error("Cannot combine option --root with --uid/--gid") options.uid = 0 options.gid = 0 formatted_args = " ".join(map(util.escape_string_shell, options.args)) logging.info('Starting command %s', formatted_args) executor = ContainerExecutor(uid=options.uid, gid=options.gid, **container_options) # ensure that process gets killed on interrupt/kill signal def signal_handler_kill(signum, frame): executor.stop() signal.signal(signal.SIGTERM, signal_handler_kill) signal.signal(signal.SIGINT, signal_handler_kill) # actual run execution try: result = executor.execute_run(options.args, workingDir=options.dir, **container_output_options) except (BenchExecException, OSError) as e: if options.debug: logging.exception(e) sys.exit("Cannot execute {0}: {1}.".format(util.escape_string_shell(options.args[0]), e)) return result.signal or result.value
def main(argv=None): """ A simple command-line interface for the containerexecutor module of BenchExec. """ if argv is None: argv = sys.argv # parse options parser = argparse.ArgumentParser( fromfile_prefix_chars="@", description="""Execute a command inside a simple container, i.e., partially isolated from the host. Command-line parameters can additionally be read from a file if file name prefixed with '@' is given as argument. Part of BenchExec: https://github.com/sosy-lab/benchexec/""", ) parser.add_argument( "--dir", metavar="DIR", help="working directory for executing the command" " (default is current directory)", ) parser.add_argument( "--root", action="store_true", help="Use UID 0 and GID 0 (i.e., fake root account) within container. " "This is mostly safe, but processes can use this to circumvent some file system" " restrictions of the container and access otherwise hidden directories.", ) parser.add_argument( "--uid", metavar="UID", type=int, default=None, help="use given UID within container (default: current UID)", ) parser.add_argument( "--gid", metavar="GID", type=int, default=None, help="use given GID within container (default: current UID)", ) add_basic_container_args(parser) add_container_output_args(parser) baseexecutor.add_basic_executor_options(parser) options = parser.parse_args(argv[1:]) baseexecutor.handle_basic_executor_options(options, parser) logging.debug("This is containerexec %s.", __version__) container_options = handle_basic_container_args(options, parser) container_output_options = handle_container_output_args(options, parser) if options.root: if options.uid is not None or options.gid is not None: parser.error("Cannot combine option --root with --uid/--gid") options.uid = 0 options.gid = 0 formatted_args = " ".join(map(util.escape_string_shell, options.args)) logging.info("Starting command %s", formatted_args) executor = ContainerExecutor(uid=options.uid, gid=options.gid, **container_options) # Ensure that process gets killed on interrupt/kill signal, # and avoid KeyboardInterrupt because it could occur anywhere. def signal_handler_kill(signum, frame): executor.stop() signal.signal(signal.SIGTERM, signal_handler_kill) signal.signal(signal.SIGQUIT, signal_handler_kill) signal.signal(signal.SIGINT, signal_handler_kill) # actual run execution try: result = executor.execute_run( options.args, workingDir=options.dir, **container_output_options ) except (BenchExecException, OSError) as e: if options.debug: logging.exception(e) sys.exit(f"Cannot execute {util.escape_string_shell(options.args[0])}: {e}.") return result.signal or result.value