def vagrant_run(args): """Runs the experiment in the virtual machine. """ target = Path(args.target[0]) use_chroot = read_dict(target / '.reprounzip').get('use_chroot', True) cmdline = args.cmdline check_vagrant_version() # Loads config runs, packages, other_files = load_config(target / 'config.yml', True) selected_runs = get_runs(runs, args.run, cmdline) hostname = runs[selected_runs[0]].get('hostname', 'reprounzip') # X11 handler x11 = X11Handler(args.x11, ('local', hostname), args.x11_display) cmds = [] for run_number in selected_runs: run = runs[run_number] cmd = 'cd %s && ' % shell_escape(run['workingdir']) cmd += '/usr/bin/env -i ' environ = x11.fix_env(run['environ']) cmd += ' '.join('%s=%s' % (k, shell_escape(v)) for k, v in iteritems(environ)) cmd += ' ' # FIXME : Use exec -a or something if binary != argv[0] if cmdline is None: argv = [run['binary']] + run['argv'][1:] else: argv = cmdline cmd += ' '.join(shell_escape(a) for a in argv) uid = run.get('uid', 1000) gid = run.get('gid', 1000) if use_chroot: userspec = '%s:%s' % (uid, gid) cmd = ('chroot --userspec=%s /experimentroot ' '/bin/sh -c %s' % (userspec, shell_escape(cmd))) else: cmd = 'sudo -u \'#%d\' sh -c %s' % (uid, shell_escape(cmd)) cmds.append(cmd) if use_chroot: cmds = [ 'chroot /experimentroot /bin/sh -c %s' % shell_escape(c) for c in x11.init_cmds ] + cmds else: cmds = x11.init_cmds + cmds cmds = ' && '.join(cmds) # Sets the hostname to the original experiment's machine's # FIXME: not reentrant: this restores the Vagrant machine's hostname after # the run, which might cause issues if several "reprounzip vagrant run" are # running at once cmds = ('OLD_HOSTNAME=$(/bin/hostname); /bin/hostname %s; ' % hostname + cmds + '; RES=$?; /bin/hostname "$OLD_HOSTNAME"; exit $RES') cmds = '/usr/bin/sudo /bin/sh -c %s' % shell_escape(cmds) # Gets vagrant SSH parameters info = get_ssh_parameters(target) signals.pre_run(target=target) interactive = not (args.no_stdin or os.environ.get('REPROUNZIP_NON_INTERACTIVE')) retcode = run_interactive(info, interactive, cmds, not args.no_pty, x11.port_forward) sys.stderr.write("\r\n*** Command finished, status: %d\r\n" % retcode) signals.post_run(target=target, retcode=retcode)
def vagrant_run(args): """Runs the experiment in the virtual machine. """ target = Path(args.target[0]) unpacked_info = read_dict(target) use_chroot = unpacked_info.get('use_chroot', True) cmdline = args.cmdline check_vagrant_version() # Loads config config = load_config(target / 'config.yml', True) runs = config.runs selected_runs = get_runs(runs, args.run, cmdline) hostname = runs[selected_runs[0]].get('hostname', 'reprounzip') # X11 handler x11 = X11Handler(args.x11, ('local', hostname), args.x11_display) cmds = [] for run_number in selected_runs: run = runs[run_number] cmd = 'cd %s && ' % shell_escape(run['workingdir']) if use_chroot: cmd += '/busybox env -i ' else: cmd += '/usr/bin/env -i ' environ = x11.fix_env(run['environ']) environ = fixup_environment(environ, args) cmd += ' '.join('%s=%s' % (k, shell_escape(v)) for k, v in iteritems(environ)) cmd += ' ' # FIXME : Use exec -a or something if binary != argv[0] if cmdline is None: argv = [run['binary']] + run['argv'][1:] else: argv = cmdline cmd += ' '.join(shell_escape(a) for a in argv) uid = run.get('uid', 1000) gid = run.get('gid', 1000) if use_chroot: userspec = '%s:%s' % (uid, gid) cmd = ('chroot --userspec=%s /experimentroot ' '/bin/sh -c %s' % ( userspec, shell_escape(cmd))) else: cmd = 'sudo -u \'#%d\' sh -c %s' % (uid, shell_escape(cmd)) cmds.append(cmd) if use_chroot: cmds = ['chroot /experimentroot /bin/sh -c %s' % shell_escape(c) for c in x11.init_cmds] + cmds else: cmds = x11.init_cmds + cmds cmds = ' && '.join(cmds) # Sets the hostname to the original experiment's machine's # FIXME: not reentrant: this restores the Vagrant machine's hostname after # the run, which might cause issues if several "reprounzip vagrant run" are # running at once cmds = ('OLD_HOSTNAME=$(/bin/hostname); /bin/hostname %s; ' % hostname + cmds + '; RES=$?; /bin/hostname "$OLD_HOSTNAME"; exit $RES') cmds = '/usr/bin/sudo /bin/sh -c %s' % shell_escape(cmds) # Gets vagrant SSH parameters info = machine_setup(target, unpacked_info['use_chroot']) signals.pre_run(target=target) interactive = not (args.no_stdin or os.environ.get('REPROUNZIP_NON_INTERACTIVE')) retcode = run_interactive(info, interactive, cmds, not args.no_pty, x11.port_forward) stderr.write("\r\n*** Command finished, status: %d\r\n" % retcode) # Update input file status metadata_update_run(config, unpacked_info, selected_runs) write_dict(target, unpacked_info) signals.post_run(target=target, retcode=retcode)
def vagrant_run(args): """Runs the experiment in the virtual machine. """ target = Path(args.target[0]) unpacked_info = read_dict(target) use_chroot = unpacked_info['use_chroot'] cmdline = args.cmdline check_vagrant_version() # Loads config config = load_config(target / 'config.yml', True) runs = config.runs selected_runs = get_runs(runs, args.run, cmdline) hostname = runs[selected_runs[0]].get('hostname', 'reprounzip') # Port forwarding ports = parse_ports(args.expose_port) # If the requested ports are not a subset of the ones already set on the # VM, we have to update the Vagrantfile and issue `vagrant reload`, which # will reboot the machine req_ports = set(ports) set_ports = set(unpacked_info.get('ports', [])) if not req_ports.issubset(set_ports): # Build new set of forwarded ports: the ones already set + the one just # requested # The ones we request now override the previous config all_ports = dict( (host, (guest, proto)) for host, guest, proto in set_ports) for host, guest, proto in req_ports: all_ports[host] = guest, proto unpacked_info['ports'] = sorted( (host, guest, proto) for host, (guest, proto) in iteritems(all_ports)) write_vagrantfile(target, unpacked_info) logger.info("Some requested ports are not yet forwarded, running " "'vagrant reload'") retcode = subprocess.call(['vagrant', 'reload', '--no-provision'], cwd=target.path) if retcode != 0: logger.critical("vagrant reload failed with code %d, aborting", retcode) sys.exit(1) write_dict(target, unpacked_info) # X11 handler if unpacked_info['gui']: x11 = LocalX11Handler() else: x11 = X11Handler(args.x11, ('local', hostname), args.x11_display) cmds = [] for run_number in selected_runs: run = runs[run_number] cmd = 'cd %s && ' % shell_escape(run['workingdir']) if use_chroot: cmd += '/busybox env -i ' else: cmd += '/usr/bin/env -i ' environ = x11.fix_env(run['environ']) environ = fixup_environment(environ, args) cmd += ' '.join('%s=%s' % (shell_escape(k), shell_escape(v)) for k, v in iteritems(environ)) cmd += ' ' # FIXME : Use exec -a or something if binary != argv[0] if cmdline is None: argv = [run['binary']] + run['argv'][1:] else: argv = cmdline cmd += ' '.join(shell_escape(a) for a in argv) uid = run.get('uid', 1000) gid = run.get('gid', 1000) if use_chroot: userspec = '%s:%s' % (uid, gid) cmd = ('chroot --userspec=%s /experimentroot ' '/bin/sh -c %s' % (userspec, shell_escape(cmd))) else: cmd = 'sudo -u \'#%d\' sh -c %s' % (uid, shell_escape(cmd)) cmds.append(cmd) if use_chroot: cmds = [ 'chroot /experimentroot /bin/sh -c %s' % shell_escape(c) for c in x11.init_cmds ] + cmds else: cmds = x11.init_cmds + cmds cmds = ' && '.join(cmds) # Sets the hostname to the original experiment's machine's # FIXME: not reentrant: this restores the Vagrant machine's hostname after # the run, which might cause issues if several "reprounzip vagrant run" are # running at once cmds = ('OLD_HOSTNAME=$(/bin/hostname); /bin/hostname %s; ' % hostname + cmds + '; RES=$?; /bin/hostname "$OLD_HOSTNAME"; exit $RES') cmds = '/usr/bin/sudo /bin/sh -c %s' % shell_escape(cmds) # Gets vagrant SSH parameters info = machine_setup(target) signals.pre_run(target=target) interactive = not (args.no_stdin or os.environ.get('REPROUNZIP_NON_INTERACTIVE')) retcode = run_interactive(info, interactive, cmds, not args.no_pty, x11.port_forward) stderr.write("\r\n*** Command finished, status: %d\r\n" % retcode) # Update input file status metadata_update_run(config, unpacked_info, selected_runs) write_dict(target, unpacked_info) signals.post_run(target=target, retcode=retcode)