def test_emptyStringArg(self): """ Calling C{cmdLineQuote} with an empty string returns a quoted empty string. """ self.assertEqual(win32.cmdLineQuote(""), '""')
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")
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"')
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"')
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(''), '""')
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"')
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)
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)
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)
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)
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)