Exemplo n.º 1
0
 def test_emptyStringArg(self):
     """
     Calling C{cmdLineQuote} with an empty string returns a quoted empty
     string.
     """
     self.assertEqual(win32.cmdLineQuote(""), '""')
Exemplo n.º 2
0
 def test_argWithoutSpaces(self):
     """
     Calling C{cmdLineQuote} with an argument with no spaces returns
     the argument unchanged.
     """
     self.assertEqual(win32.cmdLineQuote("an_argument"), "an_argument")
Exemplo n.º 3
0
 def test_argWithSpaces(self):
     """
     Calling C{cmdLineQuote} with an argument containing spaces returns
     the argument surrounded by quotes.
     """
     self.assertEqual(win32.cmdLineQuote("An Argument"), '"An Argument"')
Exemplo n.º 4
0
 def test_argWithSpaces(self):
     """
     Calling C{cmdLineQuote} with an argument containing spaces should
     return the argument surrounded by quotes.
     """
     self.assertEqual(cmdLineQuote('An Argument'), '"An Argument"')
Exemplo n.º 5
0
 def test_emptyStringArg(self):
     """
     Calling C{cmdLineQuote} with an empty string should return a
     quoted empty string.
     """
     self.assertEqual(cmdLineQuote(''), '""')
 def test_emptyStringArg(self):
     """
     Calling C{cmdLineQuote} with an empty string should return a
     quoted empty string.
     """
     self.assertEquals(cmdLineQuote(''), '""')
Exemplo n.º 7
0
 def test_argWithoutSpaces(self):
     """
     Calling C{cmdLineQuote} with an argument with no spaces should
     return the argument unchanged.
     """
     self.assertEqual(cmdLineQuote('an_argument'), 'an_argument')
 def test_argWithoutSpaces(self):
     """
     Calling C{cmdLineQuote} with an argument with no spaces should
     return the argument unchanged.
     """
     self.assertEquals(cmdLineQuote('an_argument'), 'an_argument')
 def test_argWithSpaces(self):
     """
     Calling C{cmdLineQuote} with an argument containing spaces should
     return the argument surrounded by quotes.
     """
     self.assertEquals(cmdLineQuote('An Argument'), '"An Argument"')
Exemplo n.º 10
0
def run_wget(url, filename):
    cmd = '%s --no-check-certificate -o%s -O%s -T60 %s' % (WGetFilename, cmdLineQuote(WGetLogFilename), cmdLineQuote(filename), url)
    logwrite('%s\n' % cmd)
    return subprocess.call(cmd, shell=True)
Exemplo n.º 11
0
 def __init__(self, reactor, protocol, command, args, environment, path):
     self.reactor = reactor
     self.protocol = protocol
     self.outBuffer = reactor.AllocateReadBuffer(self.bufferSize)
     self.errBuffer = reactor.AllocateReadBuffer(self.bufferSize)
     self.inBuffer = reactor.AllocateReadBuffer(self.bufferSize)
     self.readOutOp = ops.ReadOutOp(self)
     self.readErrOp = ops.ReadErrOp(self)
     self.readInOp = ops.ReadInOp(self)
     self.writeInOp = ops.WriteInOp(self)
     self.writeBuffer = ""
     self.writing = False
     self.finished = False
     self.offset = 0
     self.writeBufferedSize = 0
     self.closingStdin = False
     self.closedStdin = False
     self.closedStdout = False
     self.closedStderr = False
     self.hChildStdinRd = None
     self.hChildStdinWr = None
     self.hChildStdinWrDup = None
     self.hChildStdoutRd = None
     self.hChildStdoutWr = None
     self.hChildStdoutRdDup = None
     self.hChildStderrRd = None
     self.hChildStderrWr = None
     self.hChildStderrRdDup = None
     self.closedNotifies = 0  # increments to 3 (for stdin, stdout, stderr)
     self.closed = False # set to true when all 3 handles close
     self.exited = False # set to true when WFMO thread gets signalled proc handle.  See doWaitForProcessExit.
     saAttr = win32security.SECURITY_ATTRIBUTES()
     saAttr.bInheritHandle = 1
     currentPid = win32api.GetCurrentProcess() # -1 which stands for current process
     self.pid = os.getpid() # unique pid for pipe naming
     self.stdoutPipeName = r"\\.\pipe\twisted-iocp-stdout-%d-%d-%d" % (self.pid, counter.next(), time.time())
     self.hChildStdoutRd = win32pipe.CreateNamedPipe(
             self.stdoutPipeName,
             win32con.PIPE_ACCESS_INBOUND | win32con.FILE_FLAG_OVERLAPPED, # open mode
             win32con.PIPE_TYPE_BYTE, # pipe mode
             1, # max instances
             self.pipeBufferSize, # out buffer size
             self.pipeBufferSize, # in buffer size
             0, # timeout 
             saAttr)
     self.hChildStdoutWr = win32file.CreateFile(
             self.stdoutPipeName,
             win32con.GENERIC_WRITE,
             win32con.FILE_SHARE_READ|win32con.FILE_SHARE_WRITE,
             saAttr,
             win32con.OPEN_EXISTING,
             win32con.FILE_FLAG_OVERLAPPED,
             0);
     self.hChildStdoutRdDup = win32api.DuplicateHandle(
             currentPid, self.hChildStdoutRd,
             currentPid, 0,
             0,
             win32con.DUPLICATE_SAME_ACCESS)
     win32api.CloseHandle(self.hChildStdoutRd);
     self.hChildStdoutRd = self.hChildStdoutRdDup
     self.stderrPipeName = r"\\.\pipe\twisted-iocp-stderr-%d-%d-%d" % (self.pid, counter.next(), time.time())
     self.hChildStderrRd = win32pipe.CreateNamedPipe(
             self.stderrPipeName,
             win32con.PIPE_ACCESS_INBOUND | win32con.FILE_FLAG_OVERLAPPED, # open mode
             win32con.PIPE_TYPE_BYTE, # pipe mode
             1, # max instances
             self.pipeBufferSize, # out buffer size
             self.pipeBufferSize, # in buffer size
             0, # timeout 
             saAttr)
     self.hChildStderrWr = win32file.CreateFile(
             self.stderrPipeName,
             win32con.GENERIC_WRITE,
             win32con.FILE_SHARE_READ|win32con.FILE_SHARE_WRITE,
             saAttr,
             win32con.OPEN_EXISTING,
             win32con.FILE_FLAG_OVERLAPPED,
             0);
     self.hChildStderrRdDup = win32api.DuplicateHandle(
             currentPid, self.hChildStderrRd,
             currentPid, 0,
             0,
             win32con.DUPLICATE_SAME_ACCESS)
     win32api.CloseHandle(self.hChildStderrRd)
     self.hChildStderrRd = self.hChildStderrRdDup
     self.stdinPipeName = r"\\.\pipe\twisted-iocp-stdin-%d-%d-%d" % (self.pid, counter.next(), time.time())
     self.hChildStdinWr = win32pipe.CreateNamedPipe(
             self.stdinPipeName,
             win32con.PIPE_ACCESS_DUPLEX | win32con.FILE_FLAG_OVERLAPPED, # open mode
             win32con.PIPE_TYPE_BYTE, # pipe mode
             1, # max instances
             self.pipeBufferSize, # out buffer size
             self.pipeBufferSize, # in buffer size
             0, # timeout 
             saAttr)
     self.hChildStdinRd = win32file.CreateFile(
             self.stdinPipeName,
             win32con.GENERIC_READ,
             win32con.FILE_SHARE_READ|win32con.FILE_SHARE_WRITE,
             saAttr,
             win32con.OPEN_EXISTING,
             win32con.FILE_FLAG_OVERLAPPED,
             0);
     self.hChildStdinWrDup = win32api.DuplicateHandle(
             currentPid, self.hChildStdinWr, 
             currentPid, 0, 
             0,
             win32con.DUPLICATE_SAME_ACCESS)
     win32api.CloseHandle(self.hChildStdinWr)
     self.hChildStdinWr = self.hChildStdinWrDup
     StartupInfo = win32process.STARTUPINFO()
     StartupInfo.hStdOutput = self.hChildStdoutWr
     StartupInfo.hStdError  = self.hChildStderrWr
     StartupInfo.hStdInput  = self.hChildStdinRd
     StartupInfo.dwFlags = win32process.STARTF_USESTDHANDLES
     cmdline = ' '.join([cmdLineQuote(a) for a in args])
     self.hProcess, hThread, dwPid, dwTid = win32process.CreateProcess(
             command,     # name
             cmdline,     # command line
             None,        # process security attributes
             None,        # primary thread security attributes
             1,           # handles are inherited
             0,           # creation flags
             environment, # if NULL, use parent environment
             path,        # current directory
             StartupInfo) # STARTUPINFO pointer 
     win32file.CloseHandle(self.hChildStderrWr)
     win32file.CloseHandle(self.hChildStdoutWr)
     win32file.CloseHandle(self.hChildStdinRd)
     self.readOutOp.initiateOp(self.hChildStdoutRd, self.outBuffer)
     self.readErrOp.initiateOp(self.hChildStderrRd, self.errBuffer)
     self.readInOp.initiateOp(self.hChildStdinWr, self.inBuffer)
     self.reactor.processWaiter.beginWait(self.reactor, self.hProcess, self)
     self.protocol.makeConnection(self)
Exemplo n.º 12
0
    def __init__(self, reactor, protocol, command, args, environment, path):
        self.reactor = reactor
        self.protocol = protocol
        self.outBuffer = reactor.AllocateReadBuffer(self.bufferSize)
        self.errBuffer = reactor.AllocateReadBuffer(self.bufferSize)
        # This is the buffer for *reading* stdin, which is only done to
        # determine if the other end of the pipe was closed.
        self.inBuffer = reactor.AllocateReadBuffer(self.bufferSize)
        # IO operation classes
        self.readOutOp = ops.ReadOutOp(self)
        self.readErrOp = ops.ReadErrOp(self)
        self.readInOp = ops.ReadInOp(self)
        self.writeInOp = ops.WriteInOp(self)
        
        self.writeBuffer = ""
        self.writing = False
        self.finished = False
        self.offset = 0
        self.writeBufferedSize = 0
        self.closingStdin = False
        self.closedStdin = False
        self.closedStdout = False
        self.closedStderr = False
        # Stdio handles
        self.hChildStdinRd = None
        self.hChildStdinWr = None
        self.hChildStdinWrDup = None
        self.hChildStdoutRd = None
        self.hChildStdoutWr = None
        self.hChildStdoutRdDup = None
        self.hChildStderrRd = None
        self.hChildStderrWr = None
        self.hChildStderrRdDup = None
        
        self.closedNotifies = 0  # increments to 3 (for stdin, stdout, stderr)
        self.closed = False # set to true when all 3 handles close
        self.exited = False # set to true when WFMO thread gets signalled proc handle.  See doWaitForProcessExit.

        # Set the bInheritHandle flag so pipe handles are inherited. 
        saAttr = win32security.SECURITY_ATTRIBUTES()
        saAttr.bInheritHandle = 1
        
        currentPid = win32api.GetCurrentProcess() # -1 which stands for current process
        self.pid = os.getpid() # unique pid for pipe naming
        
        # Create a pipe for the child process's STDOUT. 
        self.stdoutPipeName = r"\\.\pipe\twisted-iocp-stdout-%d-%d-%d" % (self.pid, counter.next(), time.time())
        self.hChildStdoutRd = win32pipe.CreateNamedPipe(
                self.stdoutPipeName,
                win32con.PIPE_ACCESS_INBOUND | win32con.FILE_FLAG_OVERLAPPED, # open mode
                win32con.PIPE_TYPE_BYTE, # pipe mode
                1, # max instances
                self.pipeBufferSize, # out buffer size
                self.pipeBufferSize, # in buffer size
                0, # timeout 
                saAttr)

        self.hChildStdoutWr = win32file.CreateFile(
                self.stdoutPipeName,
                win32con.GENERIC_WRITE,
                win32con.FILE_SHARE_READ|win32con.FILE_SHARE_WRITE,
                saAttr,
                win32con.OPEN_EXISTING,
                win32con.FILE_FLAG_OVERLAPPED,
                0);
 
        # Create noninheritable read handle and close the inheritable read 
        # handle.
        self.hChildStdoutRdDup = win32api.DuplicateHandle(
                currentPid, self.hChildStdoutRd,
                currentPid, 0,
                0,
                win32con.DUPLICATE_SAME_ACCESS)
        win32api.CloseHandle(self.hChildStdoutRd);
        self.hChildStdoutRd = self.hChildStdoutRdDup
        
        # Create a pipe for the child process's STDERR.
        self.stderrPipeName = r"\\.\pipe\twisted-iocp-stderr-%d-%d-%d" % (self.pid, counter.next(), time.time())
        self.hChildStderrRd = win32pipe.CreateNamedPipe(
                self.stderrPipeName,
                win32con.PIPE_ACCESS_INBOUND | win32con.FILE_FLAG_OVERLAPPED, # open mode
                win32con.PIPE_TYPE_BYTE, # pipe mode
                1, # max instances
                self.pipeBufferSize, # out buffer size
                self.pipeBufferSize, # in buffer size
                0, # timeout 
                saAttr)
        self.hChildStderrWr = win32file.CreateFile(
                self.stderrPipeName,
                win32con.GENERIC_WRITE,
                win32con.FILE_SHARE_READ|win32con.FILE_SHARE_WRITE,
                saAttr,
                win32con.OPEN_EXISTING,
                win32con.FILE_FLAG_OVERLAPPED,
                0);

        # Create noninheritable read handle and close the inheritable read 
        # handle.
        self.hChildStderrRdDup = win32api.DuplicateHandle(
                currentPid, self.hChildStderrRd,
                currentPid, 0,
                0,
                win32con.DUPLICATE_SAME_ACCESS)
        win32api.CloseHandle(self.hChildStderrRd)
        self.hChildStderrRd = self.hChildStderrRdDup
        
        # Create a pipe for the child process's STDIN. This one is opened
        # in duplex mode so we can read from it too in order to detect when
        # the child closes their end of the pipe.
        self.stdinPipeName = r"\\.\pipe\twisted-iocp-stdin-%d-%d-%d" % (self.pid, counter.next(), time.time())
        self.hChildStdinWr = win32pipe.CreateNamedPipe(
                self.stdinPipeName,
                win32con.PIPE_ACCESS_DUPLEX | win32con.FILE_FLAG_OVERLAPPED, # open mode
                win32con.PIPE_TYPE_BYTE, # pipe mode
                1, # max instances
                self.pipeBufferSize, # out buffer size
                self.pipeBufferSize, # in buffer size
                0, # timeout 
                saAttr)

        self.hChildStdinRd = win32file.CreateFile(
                self.stdinPipeName,
                win32con.GENERIC_READ,
                win32con.FILE_SHARE_READ|win32con.FILE_SHARE_WRITE,
                saAttr,
                win32con.OPEN_EXISTING,
                win32con.FILE_FLAG_OVERLAPPED,
                0);
        
        # Duplicate the write handle to the pipe so it is not inherited.
        self.hChildStdinWrDup = win32api.DuplicateHandle(
                currentPid, self.hChildStdinWr, 
                currentPid, 0, 
                0,
                win32con.DUPLICATE_SAME_ACCESS)
        win32api.CloseHandle(self.hChildStdinWr)
        self.hChildStdinWr = self.hChildStdinWrDup
        
        # set the info structure for the new process.  This is where
        # we tell the process to use the pipes for stdout/err/in.
        StartupInfo = win32process.STARTUPINFO()
        StartupInfo.hStdOutput = self.hChildStdoutWr
        StartupInfo.hStdError  = self.hChildStderrWr
        StartupInfo.hStdInput  = self.hChildStdinRd
        StartupInfo.dwFlags = win32process.STARTF_USESTDHANDLES
        
        # create the process
        cmdline = ' '.join([cmdLineQuote(a) for a in args])
        self.hProcess, hThread, dwPid, dwTid = win32process.CreateProcess(
                command,     # name
                cmdline,     # command line
                None,        # process security attributes
                None,        # primary thread security attributes
                1,           # handles are inherited
                0,           # creation flags
                environment, # if NULL, use parent environment
                path,        # current directory
                StartupInfo) # STARTUPINFO pointer 

        # close handles which only the child will use
        win32file.CloseHandle(self.hChildStderrWr)
        win32file.CloseHandle(self.hChildStdoutWr)
        win32file.CloseHandle(self.hChildStdinRd)
        
        # Begin reading on stdout and stderr, before we have output on them.
        self.readOutOp.initiateOp(self.hChildStdoutRd, self.outBuffer)
        self.readErrOp.initiateOp(self.hChildStderrRd, self.errBuffer)
        # Read stdin which was opened in duplex mode so we can detect when
        # the child closed their end of the pipe.
        self.readInOp.initiateOp(self.hChildStdinWr, self.inBuffer)

        # When the process is done, call connectionLost().
        # This function returns right away.  Note I call this after
        # protocol.makeConnection to ensure that the protocol doesn't
        # have processEnded called before protocol.makeConnection.
        self.reactor.processWaiter.beginWait(self.reactor, self.hProcess, self)
        
        # notify protocol by calling protocol.makeConnection and specifying
        # ourself as the transport.
        self.protocol.makeConnection(self)
Exemplo n.º 13
0
    def __init__(self, reactor, protocol, command, args, environment, path):
        _pollingfile._PollingTimer.__init__(self, reactor)
        self.protocol = protocol

        # security attributes for pipes
        sAttrs = win32security.SECURITY_ATTRIBUTES()
        sAttrs.bInheritHandle = 1

        # create the pipes which will connect to the secondary process
        self.hStdoutR, hStdoutW = win32pipe.CreatePipe(sAttrs, 0)
        self.hStderrR, hStderrW = win32pipe.CreatePipe(sAttrs, 0)
        hStdinR,  self.hStdinW  = win32pipe.CreatePipe(sAttrs, 0)

        win32pipe.SetNamedPipeHandleState(self.hStdinW,
                                          win32pipe.PIPE_NOWAIT,
                                          None,
                                          None)

        # set the info structure for the new process.
        StartupInfo = win32process.STARTUPINFO()
        StartupInfo.hStdOutput = hStdoutW
        StartupInfo.hStdError  = hStderrW
        StartupInfo.hStdInput  = hStdinR
        StartupInfo.dwFlags = win32process.STARTF_USESTDHANDLES

        # Create new handles whose inheritance property is false
        pid = win32api.GetCurrentProcess()

        tmp = win32api.DuplicateHandle(pid, self.hStdoutR, pid, 0, 0, win32con.DUPLICATE_SAME_ACCESS)
        win32file.CloseHandle(self.hStdoutR)
        self.hStdoutR = tmp

        tmp = win32api.DuplicateHandle(pid, self.hStderrR, pid, 0, 0, win32con.DUPLICATE_SAME_ACCESS)
        win32file.CloseHandle(self.hStderrR)
        self.hStderrR = tmp

        tmp = win32api.DuplicateHandle(pid, self.hStdinW, pid, 0, 0, win32con.DUPLICATE_SAME_ACCESS)
        win32file.CloseHandle(self.hStdinW)
        self.hStdinW = tmp

        # Add the specified environment to the current environment - this is
        # necessary because certain operations are only supported on Windows
        # if certain environment variables are present.
        env = os.environ.copy()
        env.update(environment or {})

        # create the process
        cmdline = ' '.join([cmdLineQuote(a) for a in args])
        # TODO: error detection here.
        self.hProcess, hThread, dwPid, dwTid = win32process.CreateProcess(command, cmdline, None, None, 1, 0, env, path, StartupInfo)
        win32file.CloseHandle(hThread)

        # close handles which only the child will use
        win32file.CloseHandle(hStderrW)
        win32file.CloseHandle(hStdoutW)
        win32file.CloseHandle(hStdinR)

        self.closed = 0
        self.closedNotifies = 0

        # set up everything
        self.stdout = _pollingfile._PollableReadPipe(
            self.hStdoutR,
            lambda data: self.protocol.childDataReceived(1, data),
            self.outConnectionLost)

        self.stderr = _pollingfile._PollableReadPipe(
                self.hStderrR,
                lambda data: self.protocol.childDataReceived(2, data),
                self.errConnectionLost)

        self.stdin = _pollingfile._PollableWritePipe(
            self.hStdinW, self.inConnectionLost)

        for pipewatcher in self.stdout, self.stderr, self.stdin:
            self._addPollableResource(pipewatcher)


        # notify protocol
        self.protocol.makeConnection(self)
Exemplo n.º 14
0
    def __init__(self, reactor, protocol, command, args, environment, path):
        _pollingfile._PollingTimer.__init__(self, reactor)
        self.protocol = protocol

        # security attributes for pipes
        sAttrs = win32security.SECURITY_ATTRIBUTES()
        sAttrs.bInheritHandle = 1

        # create the pipes which will connect to the secondary process
        self.hStdoutR, hStdoutW = win32pipe.CreatePipe(sAttrs, 0)
        self.hStderrR, hStderrW = win32pipe.CreatePipe(sAttrs, 0)
        hStdinR, self.hStdinW = win32pipe.CreatePipe(sAttrs, 0)

        win32pipe.SetNamedPipeHandleState(self.hStdinW, win32pipe.PIPE_NOWAIT,
                                          None, None)

        # set the info structure for the new process.
        StartupInfo = win32process.STARTUPINFO()
        StartupInfo.hStdOutput = hStdoutW
        StartupInfo.hStdError = hStderrW
        StartupInfo.hStdInput = hStdinR
        StartupInfo.dwFlags = win32process.STARTF_USESTDHANDLES

        # Create new handles whose inheritance property is false
        pid = win32api.GetCurrentProcess()

        tmp = win32api.DuplicateHandle(pid, self.hStdoutR, pid, 0, 0,
                                       win32con.DUPLICATE_SAME_ACCESS)
        win32file.CloseHandle(self.hStdoutR)
        self.hStdoutR = tmp

        tmp = win32api.DuplicateHandle(pid, self.hStderrR, pid, 0, 0,
                                       win32con.DUPLICATE_SAME_ACCESS)
        win32file.CloseHandle(self.hStderrR)
        self.hStderrR = tmp

        tmp = win32api.DuplicateHandle(pid, self.hStdinW, pid, 0, 0,
                                       win32con.DUPLICATE_SAME_ACCESS)
        win32file.CloseHandle(self.hStdinW)
        self.hStdinW = tmp

        # Add the specified environment to the current environment - this is
        # necessary because certain operations are only supported on Windows
        # if certain environment variables are present.
        env = os.environ.copy()
        env.update(environment or {})

        # create the process
        cmdline = ' '.join([cmdLineQuote(a) for a in args])
        # TODO: error detection here.
        self.hProcess, hThread, dwPid, dwTid = win32process.CreateProcess(
            command, cmdline, None, None, 1, 0, env, path, StartupInfo)
        win32file.CloseHandle(hThread)

        # close handles which only the child will use
        win32file.CloseHandle(hStderrW)
        win32file.CloseHandle(hStdoutW)
        win32file.CloseHandle(hStdinR)

        self.closed = 0
        self.closedNotifies = 0

        # set up everything
        self.stdout = _pollingfile._PollableReadPipe(
            self.hStdoutR,
            lambda data: self.protocol.childDataReceived(1, data),
            self.outConnectionLost)

        self.stderr = _pollingfile._PollableReadPipe(
            self.hStderrR,
            lambda data: self.protocol.childDataReceived(2, data),
            self.errConnectionLost)

        self.stdin = _pollingfile._PollableWritePipe(self.hStdinW,
                                                     self.inConnectionLost)

        for pipewatcher in self.stdout, self.stderr, self.stdin:
            self._addPollableResource(pipewatcher)

        # notify protocol
        self.protocol.makeConnection(self)