def execute(self,
                session,
                consolemode,
                interactive,
                scripted,
                globalvars={},
                runMode=''):
        self.lastsession = session
        baseDir, logDir = session.get_dirs()
        waitmode, newconsole = self.get_runflags(consolemode, interactive,
                                                 scripted)

        # save history
        session.history = self.getParameters()

        timestamp = util.formattime()
        exeBaseName = os.path.basename(self.executable)

        logName = "%s-%s.log" % (exeBaseName, timestamp)
        logFile = os.path.join(logDir, logName)
        try:
            os.remove(logFile)
        except:
            pass

        # Touch the logfile
        tmpFile = open(logFile, "w")
        tmpFile.close()

        # Create InConfig and write to the logdir
        inConfName = "%s-%s-InConfig.xml" % (exeBaseName, timestamp)
        inConfFile = os.path.join(logDir, inConfName)
        self.write_interpreted_xml_file(inConfFile, globalvars=globalvars)

        # Create the pipe that we will use for the --OutConfig parameter
        pipeName = edfexecution.generate_pipename()
        pipe = edfexecution.create_pipe(pipeName)

        cwd = os.getcwd()
        os.chdir(logDir)
        try:
            #
            # This is the sneaky bit for the output.  We call launch_plugin,
            # which does two things.  First, it passes stdin,stdout, and stderr
            # to the call to subprocess.Popen so that output is duplicated to
            # the console.  Second, it passes --OutConfig a pipe so that, when we
            # later call write_outconfig, this contains only the data we want
            #
            proc = edfexecution.launch_plugin(self.executable, inConfFile,
                                              pipeName, logFile, self.io,
                                              newconsole)
            self.procs.append(proc)
        except KeyboardInterrupt:
            self.io.print_error("Stopping plugin")
            try:
                self.procs.remove(proc)
                proc.kill()
            except:
                pass
            # Create the output param for the contract
            session.contract = [
                util.oParam("Status", "Failed", "String", "Scalar"),
                util.oParam("ReturnCode", "User Abort", "String", "Scalar")
            ]
            session.mark_fail()
            raise exception.CmdErr, "Canceled by User"

        os.chdir(cwd)

        try:
            # Wait for the spawned process to connect to our named pipe
            pipe = edfexecution.connect_pipe(pipe, pipeName)
        except edfexecution.PipeError, err:
            self.io.print_error(str(err))
            pipe = None
    def execute(self,
                session,
                consolemode,
                interactive,
                scripted,
                globalvars={},
                runMode='',
                archOs='x86-Windows',
                listenPort=0):
        self.lastsession = session
        baseDir, logDir = session.get_dirs()
        waitmode, newconsole = self.get_runflags(consolemode, interactive,
                                                 scripted)
        timestamp = util.formattime()

        # Save history
        session.history = self.getParameters()

        # Prompt for run mode
        if runMode in ("DANE", "DAVE"):

            # TODO: prompt operator to verify remote callback tunnel exists for localhost comms

            if runMode == "DANE":
                # Build package
                packagePath = self.build_package(logDir,
                                                 archOs,
                                                 listenPort,
                                                 globalvars=globalvars)

                # Print package info
                self.io.print_success("DANE Package: %s" % packagePath)
            # elif runMode == "DAVE":
            # # Marshal params (and get core module name)
            # modulePath, inputPath = self.marshal_params(logDir, archOs, globalvars=globalvars)

            # # Build up DAVE commandline
            # dvcmds = 'daringveteran -module "%s" -input "%s" -run %s' % (
            # modulePath,
            # inputPath,
            # 'interactive' if (listenPort) else 'batch')
            # if listenPort:
            # dvcmds += " -homeport %d" % listenPort

            # # Print core module and marshaled data info
            # self.io.print_success('DAVE Pastable:\n\t' + dvcmds)
            else:
                raise NotImplementedError(
                    "No such option '%s'; what happened??" % (runMode))

            # Set "DaveProxyPort" hidden parameter in current config
            if listenPort:
                #self.set("DaveProxyPort", str(listenPort))
                self.io.print_msg("Proxy listening on localhost:%d" %
                                  listenPort)
            else:
                # Bail right now--gracefully...
                return newconsole, None
        elif runMode == 'FB':
            # Make sure the proxy port is zeroed
            self.set("DaveProxyPort", "0")
        else:
            raise NotImplementedError("No such option '%s'; what happened??" %
                                      (runMode))

        exeBaseName = os.path.basename(self.executable)

        logName = "%s-%s.log" % (exeBaseName, timestamp)
        logFile = os.path.join(logDir, logName)
        try:
            os.remove(logFile)
        except:
            pass

        # Touch the logfile
        tmpFile = open(logFile, "w")
        tmpFile.close()

        # Create InConfig and write to the logdir
        inConfName = "%s-%s-InConfig.xml" % (exeBaseName, timestamp)
        inConfFile = os.path.join(logDir, inConfName)
        self.write_interpreted_xml_file(inConfFile, globalvars=globalvars)

        # Create the pipe that we will use for the --OutConfig parameter
        pipeName = edfexecution.generate_pipename()
        pipe = edfexecution.create_pipe(pipeName)

        cwd = os.getcwd()
        os.chdir(logDir)
        try:
            #
            # This is the sneaky bit for the output.  We call launch_plugin,
            # which does two things.  First, it passes stdin,stdout, and stderr
            # to the call to subprocess.Popen so that output is duplicated to
            # the console.  Second, it passes --OutConfig a pipe so that, when we
            # later call write_outconfig, this contains only the data we want
            #
            proc = edfexecution.launch_plugin(self.executable, inConfFile,
                                              pipeName, logFile, self.io,
                                              newconsole)
            self.procs.append(proc)
        except KeyboardInterrupt:
            self.io.print_error("Stopping plugin")
            try:
                self.procs.remove(proc)
                proc.kill()
            except:
                pass
            # Create the output param for the contract
            session.contract = [
                util.oParam("Status", "Failed", "String", "Scalar"),
                util.oParam("ReturnCode", "User Abort", "String", "Scalar")
            ]
            session.mark_fail()
            raise exception.CmdErr, "Canceled by User"

        os.chdir(cwd)

        try:
            # Wait for the spawned process to connect to our named pipe
            pipe = edfexecution.connect_pipe(pipe, pipeName)
        except edfexecution.PipeError, err:
            self.io.print_error(str(err))
            pipe = None