From: Eric S. Raymond Date: Wed, 4 Jun 2014 00:05:31 +0000 (-0400) Subject: All the tricial cleanups for the new pylint. Some less trivial ones renain. X-Git-Tag: 1.9~2 X-Git-Url: http://thyrsus.com/gitweb/?a=commitdiff_plain;h=af978492e15c1a5848ba34067359ab87b067121a;p=ssh-installkeys.git All the tricial cleanups for the new pylint. Some less trivial ones renain. --- diff --git a/Makefile b/Makefile index fd37d01..c280611 100644 --- a/Makefile +++ b/Makefile @@ -29,9 +29,12 @@ ssh-installkeys-$(VERS).tar.gz: $(SOURCES) ssh-installkeys.1 rm -fr ssh-installkeys-$(VERS) ls -l ssh-installkeys-$(VERS).tar.gz -PYLINTOPTS = --rcfile=/dev/null --reports=n --include-ids=y --disable=C0103,C0301,W0105,W0141,W0401,W0404,W0612,W0611,W0614,W0621,W0702,R0201,R0902,R0904,R0912,R0913,C0111 +PYLINTOPTS = --rcfile=/dev/null --reports=n \ + --msg-template="{path}:{line}: [{msg_id}({symbol}), {obj}] {msg}" \ + --dummy-variables-rgx='^_' +SUPPRESSIONS = --disable=C0103,C0301,C0302,C1001,W0105,W0110,W0141,W0142,W0401,W0404,W0612,W0611,W0614,W0621,W0702,R0201,R0902,R0903,R0904,R0911,R0912,R0913,R0914,R0915,C0111 pylint: - @pylint --output-format=parseable $(PYLINTOPTS) ssh-installkeys + @pylint $(PYLINTOPTS) $(SUPPRESSIONS) ssh-installkeys dist: ssh-installkeys-$(VERS).tar.gz diff --git a/ssh-installkeys b/ssh-installkeys index 3ad8c20..b74e1aa 100755 --- a/ssh-installkeys +++ b/ssh-installkeys @@ -103,7 +103,7 @@ try: import traceback import signal except ImportError, e: - raise ImportError (str(e) + """ + raise ImportError(str(e) + """ A critical module was not found. Probably this operating system does not support it. Pexpect is intended for UNIX-like operating systems.""") @@ -165,7 +165,7 @@ class TIMEOUT(ExceptionPexpect): ##class MAXBUFFER(ExceptionPexpect): ## """Raised when a scan buffer fills before matching an expected pattern.""" -def run (command, timeout=-1, withexitstatus=False, events=None, extra_args=None, logfile=None, cwd=None, env=None): +def run(command, timeout=-1, withexitstatus=False, events=None, _extra_args=None, logfile=None, cwd=None, env=None): """ This function runs the given command; waits for it to finish; then @@ -247,13 +247,13 @@ def run (command, timeout=-1, withexitstatus=False, events=None, extra_args=None patterns = events.keys() responses = events.values() else: - patterns=None # We assume that EOF or TIMEOUT will save us. - responses=None + patterns = None # We assume that EOF or TIMEOUT will save us. + responses = None child_result_list = [] event_count = 0 while 1: try: - index = child.expect (patterns) + index = child.expect(patterns) if type(child.after) in types.StringTypes: child_result_list.append(child.before + child.after) else: # child.after may have been a TIMEOUT or EOF, so don't cat those. @@ -268,7 +268,7 @@ def run (command, timeout=-1, withexitstatus=False, events=None, extra_args=None elif callback_result: break else: - raise TypeError ('The callback must be a string or function type.') + raise TypeError('The callback must be a string or function type.') event_count = event_count + 1 except TIMEOUT, e: child_result_list.append(child.before) @@ -283,7 +283,7 @@ def run (command, timeout=-1, withexitstatus=False, events=None, extra_args=None else: return child_result -class spawn (object): +class spawn(object): """This is the main class interface for Pexpect. Use this class to start and control child applications. """ @@ -360,12 +360,12 @@ class spawn (object): the input from the child and output sent to the child. Sometimes you don't want to see everything you write to the child. You only want to log what the child sends back. For example:: - + child = pexpect.spawn('some_command') child.logfile_read = sys.stdout To separately log output sent to the child use logfile_send:: - + self.logfile_send = fout The delaybeforesend helps overcome a weird behavior that many users @@ -436,9 +436,9 @@ class spawn (object): self.closed = True # File-like object. self.cwd = cwd self.env = env - self.__irix_hack = (sys.platform.lower().find('irix')>=0) # This flags if we are running on irix + self.__irix_hack = (sys.platform.lower().find('irix') >= 0) # This flags if we are running on irix # Solaris uses internal __fork_pty(). All others use pty.fork(). - if (sys.platform.lower().find('solaris')>=0) or (sys.platform.lower().find('sunos5')>=0): + if (sys.platform.lower().find('solaris') >= 0) or (sys.platform.lower().find('sunos5') >= 0): self.use_native_pty_fork = False else: self.use_native_pty_fork = True @@ -450,7 +450,7 @@ class spawn (object): self.args = None self.name = '' else: - self._spawn (command, args) + self._spawn(command, args) def __del__(self): @@ -504,7 +504,7 @@ class spawn (object): s.append('delayafterterminate: ' + str(self.delayafterterminate)) return '\n'.join(s) - def _spawn(self,command,args=[]): + def _spawn(self, command, args=[]): """This starts the given command in a child process. This does all the fork/exec type of stuff for a pty. This is called by __init__. If args @@ -522,26 +522,26 @@ class spawn (object): # If command is an int type then it may represent a file descriptor. if type(command) == type(0): - raise ExceptionPexpect ('Command is an int type. If this is a file descriptor then maybe you want to use fdpexpect.fdspawn which takes an existing file descriptor instead of a command string.') + raise ExceptionPexpect('Command is an int type. If this is a file descriptor then maybe you want to use fdpexpect.fdspawn which takes an existing file descriptor instead of a command string.') - if type (args) != type([]): - raise TypeError ('The argument, args, must be a list.') + if type(args) != type([]): + raise TypeError('The argument, args, must be a list.') if args == []: self.args = split_command_line(command) self.command = self.args[0] else: self.args = args[:] # work with a copy - self.args.insert (0, command) + self.args.insert(0, command) self.command = command command_with_path = which(self.command) if command_with_path is None: - raise ExceptionPexpect ('The command was not found or was not executable: %s.' % self.command) + raise ExceptionPexpect('The command was not found or was not executable: %s.' % self.command) self.command = command_with_path self.args[0] = self.command - self.name = '<' + ' '.join (self.args) + '>' + self.name = '<' + ' '.join(self.args) + '>' assert self.pid is None, 'The pid member should be None.' assert self.command is not None, 'The command member should not be None.' @@ -566,9 +566,9 @@ class spawn (object): pass # Do not allow child to inherit open file descriptors from parent. max_fd = resource.getrlimit(resource.RLIMIT_NOFILE)[0] - for i in range (3, max_fd): + for i in range(3, max_fd): try: - os.close (i) + os.close(i) except OSError: pass @@ -605,11 +605,11 @@ class spawn (object): parent_fd, child_fd = os.openpty() if parent_fd < 0 or child_fd < 0: - raise ExceptionPexpect, "Error! Could not open pty with os.openpty()." + raise ExceptionPexpect("Error! Could not open pty with os.openpty().") pid = os.fork() if pid < 0: - raise ExceptionPexpect, "Error! Failed os.fork()." + raise ExceptionPexpect("Error! Failed os.fork().") elif pid == 0: # Child. os.close(parent_fd) @@ -636,7 +636,7 @@ class spawn (object): child_name = os.ttyname(tty_fd) # Disconnect from controlling tty if still connected. - fd = os.open("/dev/tty", os.O_RDWR | os.O_NOCTTY); + fd = os.open("/dev/tty", os.O_RDWR | os.O_NOCTTY) if fd >= 0: os.close(fd) @@ -644,36 +644,36 @@ class spawn (object): # Verify we are disconnected from controlling tty try: - fd = os.open("/dev/tty", os.O_RDWR | os.O_NOCTTY); + fd = os.open("/dev/tty", os.O_RDWR | os.O_NOCTTY) if fd >= 0: os.close(fd) - raise ExceptionPexpect, "Error! We are not disconnected from a controlling tty." + raise ExceptionPexpect("Error! We are not disconnected from a controlling tty.") except: # Good! We are disconnected from a controlling tty. pass # Verify we can open child pty. - fd = os.open(child_name, os.O_RDWR); + fd = os.open(child_name, os.O_RDWR) if fd < 0: - raise ExceptionPexpect, "Error! Could not open child pty, " + child_name + raise ExceptionPexpect("Error! Could not open child pty, " + child_name) else: os.close(fd) # Verify we now have a controlling tty. fd = os.open("/dev/tty", os.O_WRONLY) if fd < 0: - raise ExceptionPexpect, "Error! Could not open controlling tty, /dev/tty" + raise ExceptionPexpect("Error! Could not open controlling tty, /dev/tty") else: os.close(fd) - def fileno (self): # File-like object. + def fileno(self): # File-like object. """This returns the file descriptor of the pty for the child. """ return self.child_fd - def close (self, force=True): # File-like object. + def close(self, force=True): # File-like object. """This closes the connection with the child application. Note that calling close() more than once is valid. This emulates standard Python @@ -683,30 +683,30 @@ class spawn (object): if not self.closed: self.flush() - os.close (self.child_fd) + os.close(self.child_fd) time.sleep(self.delayafterclose) # Give kernel time to update process status. if self.isalive(): if not self.terminate(force): - raise ExceptionPexpect ('close() could not terminate the child using terminate()') + raise ExceptionPexpect('close() could not terminate the child using terminate()') self.child_fd = -1 self.closed = True #self.pid = None - def flush (self): # File-like object. + def flush(self): # File-like object. """This does nothing. It is here to support the interface for a File-like object. """ pass - def isatty (self): # File-like object. + def isatty(self): # File-like object. """This returns True if the file descriptor is open and connected to a tty(-like) device, else False. """ return os.isatty(self.child_fd) - def waitnoecho (self, timeout=-1): + def waitnoecho(self, timeout=-1): """This waits until the terminal ECHO flag is set False. This returns True if the echo mode is off. This returns False if the ECHO flag was @@ -728,7 +728,7 @@ class spawn (object): if timeout == -1: timeout = self.timeout if timeout is not None: - end_time = time.time() + timeout + end_time = time.time() + timeout while True: if not self.getecho(): return True @@ -738,7 +738,7 @@ class spawn (object): timeout = end_time - time.time() time.sleep(0.1) - def getecho (self): + def getecho(self): """This returns the terminal echo mode. This returns True if echo is on or False if echo is off. Child applications that are expecting you @@ -749,7 +749,7 @@ class spawn (object): return True return False - def setecho (self, state): + def setecho(self, state): """This sets the terminal echo mode on or off. Note that anything the child sent before the echo will be lost, so you should be sure that @@ -780,7 +780,6 @@ class spawn (object): p.expect (['wxyz']) """ - self.child_fd attr = termios.tcgetattr(self.child_fd) if state: attr[3] = attr[3] | termios.ECHO @@ -790,7 +789,7 @@ class spawn (object): # and blocked on some platforms. TCSADRAIN is probably ideal if it worked. termios.tcsetattr(self.child_fd, termios.TCSANOW, attr) - def read_nonblocking (self, size = 1, timeout = -1): + def read_nonblocking(self, size=1, timeout=-1): """This reads at most size characters from the child application. It includes a timeout. If the read does not complete within the timeout @@ -813,7 +812,7 @@ class spawn (object): implement the timeout. """ if self.closed: - raise ValueError ('I/O operation on closed file in read_nonblocking().') + raise ValueError('I/O operation on closed file in read_nonblocking().') if timeout == -1: timeout = self.timeout @@ -824,51 +823,51 @@ class spawn (object): # For this case, I test isalive() before doing any reading. # If isalive() is false, then I pretend that this is the same as EOF. if not self.isalive(): - r,w,e = self.__select([self.child_fd], [], [], 0) # timeout of 0 means "poll" + r, w, e = self.__select([self.child_fd], [], [], 0) # timeout of 0 means "poll" if not r: self.flag_eof = True - raise EOF ('End Of File (EOF) in read_nonblocking(). Braindead platform.') + raise EOF('End Of File (EOF) in read_nonblocking(). Braindead platform.') elif self.__irix_hack: # This is a hack for Irix. It seems that Irix requires a long delay before checking isalive. # This adds a 2 second delay, but only when the child is terminated. r, w, e = self.__select([self.child_fd], [], [], 2) if not r and not self.isalive(): self.flag_eof = True - raise EOF ('End Of File (EOF) in read_nonblocking(). Pokey platform.') + raise EOF('End Of File (EOF) in read_nonblocking(). Pokey platform.') - r,w,e = self.__select([self.child_fd], [], [], timeout) + r, w, e = self.__select([self.child_fd], [], [], timeout) if not r: if not self.isalive(): # Some platforms, such as Irix, will claim that their processes are alive; # then timeout on the select; and then finally admit that they are not alive. self.flag_eof = True - raise EOF ('End of File (EOF) in read_nonblocking(). Very pokey platform.') + raise EOF('End of File (EOF) in read_nonblocking(). Very pokey platform.') else: - raise TIMEOUT ('Timeout exceeded in read_nonblocking().') + raise TIMEOUT('Timeout exceeded in read_nonblocking().') if self.child_fd in r: try: s = os.read(self.child_fd, size) except OSError, e: # Linux does this self.flag_eof = True - raise EOF ('End Of File (EOF) in read_nonblocking(). Exception style platform.') + raise EOF('End Of File (EOF) in read_nonblocking(). Exception style platform.') if s == '': # BSD style self.flag_eof = True - raise EOF ('End Of File (EOF) in read_nonblocking(). Empty string style platform.') + raise EOF('End Of File (EOF) in read_nonblocking(). Empty string style platform.') if self.logfile is not None: - self.logfile.write (s) + self.logfile.write(s) self.logfile.flush() if self.logfile_read is not None: - self.logfile_read.write (s) + self.logfile_read.write(s) self.logfile_read.flush() return s - raise ExceptionPexpect ('Reached an unexpected state in read_nonblocking().') + raise ExceptionPexpect('Reached an unexpected state in read_nonblocking().') - def read (self, size = -1): # File-like object. + def read(self, size=-1): # File-like object. """This reads at most "size" bytes from the file (less if the read hits EOF before obtaining size bytes). If the size argument is negative or @@ -879,7 +878,7 @@ class spawn (object): if size == 0: return '' if size < 0: - self.expect (self.delimiter) # delimiter default is EOF + self.expect(self.delimiter) # delimiter default is EOF return self.before # I could have done this more directly by not using expect(), but @@ -890,12 +889,12 @@ class spawn (object): # Note, it's OK if size==-1 in the regex. That just means it # will never match anything in which case we stop only on EOF. cre = re.compile('.{%d}' % size, re.DOTALL) - index = self.expect ([cre, self.delimiter]) # delimiter default is EOF + index = self.expect([cre, self.delimiter]) # delimiter default is EOF if index == 0: return self.after ### self.before should be ''. Should I assert this? return self.before - def readline (self, size = -1): # File-like object. + def readline(self, size=-1): # File-like object. """This reads and returns one entire line. A trailing newline is kept in the string, but may be absent when a file ends with an incomplete @@ -908,20 +907,20 @@ class spawn (object): if size == 0: return '' - index = self.expect (['\r\n', self.delimiter]) # delimiter default is EOF + index = self.expect(['\r\n', self.delimiter]) # delimiter default is EOF if index == 0: return self.before + '\r\n' else: return self.before - def __iter__ (self): # File-like object. + def __iter__(self): # File-like object. """This is to support iterators over a file-like object. """ return self - def next (self): # File-like object. + def next(self): # File-like object. """This is to support iterators over a file-like object. """ @@ -931,7 +930,7 @@ class spawn (object): raise StopIteration return result - def readlines (self, sizehint = -1): # File-like object. + def readlines(self, _sizehint=-1): # File-like object. """This reads until EOF using readline() and returns a list containing the lines thus read. The optional "sizehint" argument is ignored. """ @@ -949,9 +948,9 @@ class spawn (object): """This is similar to send() except that there is no return value. """ - self.send (s) + self.send(s) - def writelines (self, sequence): # File-like object. + def writelines(self, sequence): # File-like object. """This calls write() for each element in the sequence. The sequence can be any iterable object producing strings, typically a list of @@ -959,7 +958,7 @@ class spawn (object): """ for s in sequence: - self.write (s) + self.write(s) def send(self, s): @@ -969,10 +968,10 @@ class spawn (object): time.sleep(self.delaybeforesend) if self.logfile is not None: - self.logfile.write (s) + self.logfile.write(s) self.logfile.flush() if self.logfile_send is not None: - self.logfile_send.write (s) + self.logfile_send.write(s) self.logfile_send.flush() c = os.write(self.child_fd, s) return c @@ -983,7 +982,7 @@ class spawn (object): returns the number of bytes written. """ n = self.send(s) - n = n + self.send (os.linesep) + n = n + self.send(os.linesep) return n def sendcontrol(self, char): @@ -998,9 +997,9 @@ class spawn (object): char = char.lower() a = ord(char) - if a>=97 and a<=122: + if a >= 97 and a <= 122: a = a - ord('a') + 1 - return self.send (chr(a)) + return self.send(chr(a)) d = {'@':0, '`':0, '[':27, '{':27, '\\':28, '|':28, @@ -1010,7 +1009,7 @@ class spawn (object): '?':127} if char not in d: return 0 - return self.send (chr(d[char])) + return self.send(chr(d[char])) def sendeof(self): @@ -1056,9 +1055,9 @@ class spawn (object): else: # platform does not define VINTR so assume CTRL-C char = chr(3) - self.send (char) + self.send(char) - def eof (self): + def eof(self): """This returns True if the EOF exception was ever raised. """ @@ -1117,20 +1116,20 @@ class spawn (object): if self.isalive(): pid, status = os.waitpid(self.pid, 0) else: - raise ExceptionPexpect ('Cannot wait for dead child process.') + raise ExceptionPexpect('Cannot wait for dead child process.') self.exitstatus = os.WEXITSTATUS(status) - if os.WIFEXITED (status): + if os.WIFEXITED(status): self.status = status self.exitstatus = os.WEXITSTATUS(status) self.signalstatus = None self.terminated = True - elif os.WIFSIGNALED (status): + elif os.WIFSIGNALED(status): self.status = status self.exitstatus = None self.signalstatus = os.WTERMSIG(status) self.terminated = True - elif os.WIFSTOPPED (status): - raise ExceptionPexpect ('Wait was called for a child process that is stopped. This is not supported. Is some other process attempting job control with our child pid?') + elif os.WIFSTOPPED(status): + raise ExceptionPexpect('Wait was called for a child process that is stopped. This is not supported. Is some other process attempting job control with our child pid?') return self.exitstatus def isalive(self): @@ -1156,7 +1155,7 @@ class spawn (object): pid, status = os.waitpid(self.pid, waitpid_options) except OSError, e: # No child processes if e[0] == errno.ECHILD: - raise ExceptionPexpect ('isalive() encountered condition where "terminated" is 0, but there was no child process. Did someone else call waitpid() on our process?') + raise ExceptionPexpect('isalive() encountered condition where "terminated" is 0, but there was no child process. Did someone else call waitpid() on our process?') else: raise e @@ -1168,32 +1167,32 @@ class spawn (object): pid, status = os.waitpid(self.pid, waitpid_options) ### os.WNOHANG) # Solaris! except OSError, e: # This should never happen... if e[0] == errno.ECHILD: - raise ExceptionPexpect ('isalive() encountered condition that should never happen. There was no child process. Did someone else call waitpid() on our process?') + raise ExceptionPexpect('isalive() encountered condition that should never happen. There was no child process. Did someone else call waitpid() on our process?') else: raise e # If pid is still 0 after two calls to waitpid() then # the process really is alive. This seems to work on all platforms, except # for Irix which seems to require a blocking call on waitpid or select, so I let read_nonblocking - # take care of this situation (unfortunately, this requires waiting through the timeout). + # take care of this situation(unfortunately, this requires waiting through the timeout). if pid == 0: return True if pid == 0: return True - if os.WIFEXITED (status): + if os.WIFEXITED(status): self.status = status self.exitstatus = os.WEXITSTATUS(status) self.signalstatus = None self.terminated = True - elif os.WIFSIGNALED (status): + elif os.WIFSIGNALED(status): self.status = status self.exitstatus = None self.signalstatus = os.WTERMSIG(status) self.terminated = True - elif os.WIFSTOPPED (status): - raise ExceptionPexpect ('isalive() encountered condition where child process is stopped. This is not supported. Is some other process attempting job control with our child pid?') + elif os.WIFSTOPPED(status): + raise ExceptionPexpect('isalive() encountered condition where child process is stopped. This is not supported. Is some other process attempting job control with our child pid?') return False def kill(self, sig): @@ -1250,11 +1249,11 @@ class spawn (object): elif type(p) is type(re.compile('')): compiled_pattern_list.append(p) else: - raise TypeError ('Argument must be one of StringTypes, EOF, TIMEOUT, SRE_Pattern, or a list of those type. %s' % str(type(p))) + raise TypeError('Argument must be one of StringTypes, EOF, TIMEOUT, SRE_Pattern, or a list of those type. %s' % str(type(p))) return compiled_pattern_list - def expect(self, pattern, timeout = -1, searchwindowsize=None): + def expect(self, pattern, timeout=-1, searchwindowsize=None): """This seeks through the stream until a pattern is matched. The pattern is overloaded and may take several types. The pattern can be a @@ -1271,14 +1270,14 @@ class spawn (object): the leftmost in the pattern list is chosen. For example:: # the input is 'foobar' - index = p.expect (['bar', 'foo', 'foobar']) + index = p.expect(['bar', 'foo', 'foobar']) # returns 1 ('foo') even though 'foobar' is a "better" match Please note, however, that buffering can affect this behavior, since input arrives in unpredictable chunks. For example:: # the input is 'foobar' - index = p.expect (['foobar', 'foo']) + index = p.expect(['foobar', 'foo']) # returns 0 ('foobar') if all input is available at once, # but returs 1 ('foo') if parts of the final 'bar' arrive late @@ -1297,7 +1296,7 @@ class spawn (object): exception type. The attribute 'match' will be None. This allows you to write code like this:: - index = p.expect (['good', 'bad', pexpect.EOF, pexpect.TIMEOUT]) + index = p.expect(['good', 'bad', pexpect.EOF, pexpect.TIMEOUT]) if index == 0: do_something() elif index == 1: @@ -1310,7 +1309,7 @@ class spawn (object): instead of code like this:: try: - index = p.expect (['good', 'bad']) + index = p.expect(['good', 'bad']) if index == 0: do_something() elif index == 1: @@ -1325,7 +1324,7 @@ class spawn (object): child to finish. For example:: p = pexpect.spawn('/bin/ls') - p.expect (pexpect.EOF) + p.expect(pexpect.EOF) print p.before If you are trying to optimize for speed then see expect_list(). @@ -1334,7 +1333,7 @@ class spawn (object): compiled_pattern_list = self.compile_pattern_list(pattern) return self.expect_list(compiled_pattern_list, timeout, searchwindowsize) - def expect_list(self, pattern_list, timeout = -1, searchwindowsize = -1): + def expect_list(self, pattern_list, timeout=-1, searchwindowsize=-1): """This takes a list of compiled regular expressions and returns the index into the pattern_list that matched the child output. The list may @@ -1348,7 +1347,7 @@ class spawn (object): return self.expect_loop(searcher_re(pattern_list), timeout, searchwindowsize) - def expect_exact(self, pattern_list, timeout = -1, searchwindowsize = -1): + def expect_exact(self, pattern_list, timeout=-1, searchwindowsize=-1): """This is similar to expect(), but uses plain string matching instead of compiled regular expressions in 'pattern_list'. The 'pattern_list' @@ -1366,7 +1365,7 @@ class spawn (object): pattern_list = [pattern_list] return self.expect_loop(searcher_string(pattern_list), timeout, searchwindowsize) - def expect_loop(self, searcher, timeout = -1, searchwindowsize = -1): + def expect_loop(self, searcher, timeout=-1, searchwindowsize=-1): """This is the common loop used inside expect. The 'searcher' should be an instance of searcher_re or searcher_string, which describes how and what @@ -1379,7 +1378,7 @@ class spawn (object): if timeout == -1: timeout = self.timeout if timeout is not None: - end_time = time.time() + timeout + end_time = time.time() + timeout if searchwindowsize == -1: searchwindowsize = self.searchwindowsize @@ -1397,11 +1396,11 @@ class spawn (object): return self.match_index # No match at this point if timeout < 0 and timeout is not None: - raise TIMEOUT ('Timeout exceeded in expect_any().') + raise TIMEOUT('Timeout exceeded in expect_any().') # Still have time left, so read more data - c = self.read_nonblocking (self.maxread, timeout) + c = self.read_nonblocking(self.maxread, timeout) freshlen = len(c) - time.sleep (0.0001) + time.sleep(0.0001) incoming = incoming + c if timeout is not None: timeout = end_time - time.time() @@ -1417,7 +1416,7 @@ class spawn (object): else: self.match = None self.match_index = None - raise EOF (str(e) + '\n' + str(self)) + raise EOF(str(e) + '\n' + str(self)) except TIMEOUT, e: self.buffer = incoming self.before = incoming @@ -1430,7 +1429,7 @@ class spawn (object): else: self.match = None self.match_index = None - raise TIMEOUT (str(e) + '\n' + str(self)) + raise TIMEOUT(str(e) + '\n' + str(self)) except: self.before = incoming self.after = None @@ -1471,7 +1470,7 @@ class spawn (object): s = struct.pack('HHHH', r, c, 0, 0) fcntl.ioctl(self.fileno(), TIOCSWINSZ, s) - def interact(self, escape_character = chr(29), input_filter = None, output_filter = None): + def interact(self, escape_character=chr(29), input_filter=None, output_filter=None): """This gives control of the child process to the interactive user (the human at the keyboard). Keystrokes are sent to the child process, and @@ -1496,7 +1495,7 @@ class spawn (object): something like the following example:: import pexpect, struct, fcntl, termios, signal, sys - def sigwinch_passthrough (sig, data): + def sigwinch_passthrough(sig, data): s = struct.pack("HHHH", 0, 0, 0, 0) a = struct.unpack('hhhh', fcntl.ioctl(sys.stdout.fileno(), termios.TIOCGWINSZ , s)) global p @@ -1507,7 +1506,7 @@ class spawn (object): """ # Flush the buffer. - self.stdout.write (self.buffer) + self.stdout.write(self.buffer) self.stdout.flush() self.buffer = '' mode = tty.tcgetattr(self.STDIN_FILENO) @@ -1533,23 +1532,25 @@ class spawn (object): return os.read(fd, 1000) - def __interact_copy(self, escape_character = None, input_filter = None, output_filter = None): + def __interact_copy(self, escape_character=None, input_filter=None, output_filter=None): """This is used by the interact() method. """ while self.isalive(): - r,w,e = self.__select([self.child_fd, self.STDIN_FILENO], [], []) + r, w, e = self.__select([self.child_fd, self.STDIN_FILENO], [], []) if self.child_fd in r: data = self.__interact_read(self.child_fd) - if output_filter: data = output_filter(data) + if output_filter: + data = output_filter(data) if self.logfile is not None: - self.logfile.write (data) + self.logfile.write(data) self.logfile.flush() os.write(self.STDOUT_FILENO, data) if self.STDIN_FILENO in r: data = self.__interact_read(self.STDIN_FILENO) - if input_filter: data = input_filter(data) + if input_filter: + data = input_filter(data) i = data.rfind(escape_character) if i != -1: data = data[:i] @@ -1557,7 +1558,7 @@ class spawn (object): break self.__interact_writen(self.child_fd, data) - def __select (self, iwtd, owtd, ewtd, timeout=None): + def __select(self, iwtd, owtd, ewtd, timeout=None): """This is a wrapper around select.select() that ignores signals. If select.select raises a select.error exception and errno is an EINTR @@ -1570,39 +1571,39 @@ class spawn (object): end_time = time.time() + timeout while True: try: - return select.select (iwtd, owtd, ewtd, timeout) + return select.select(iwtd, owtd, ewtd, timeout) except select.error, e: if e[0] == errno.EINTR: # if we loop back we have to subtract the amount of time we already waited. if timeout is not None: timeout = end_time - time.time() if timeout < 0: - return ([],[],[]) + return([], [], []) else: # something else caused the select.error, so this really is an exception raise ############################################################################## # The following methods are no longer supported or allowed. - def setmaxread (self, maxread): + def setmaxread(self, _maxread): """This method is no longer supported or allowed. I don't like getters and setters without a good reason. """ - raise ExceptionPexpect ('This method is no longer supported or allowed. Just assign a value to the maxread member variable.') + raise ExceptionPexpect('This method is no longer supported or allowed. Just assign a value to the maxread member variable.') - def setlog (self, fileobject): + def setlog(self, _fileobject): """This method is no longer supported or allowed. """ - raise ExceptionPexpect ('This method is no longer supported or allowed. Just assign a value to the logfile member variable.') + raise ExceptionPexpect('This method is no longer supported or allowed. Just assign a value to the logfile member variable.') ############################################################################## # End of spawn class ############################################################################## -class searcher_string (object): +class searcher_string(object): """This is a plain string search helper for the spawn.expect_any() method. @@ -1641,21 +1642,21 @@ class searcher_string (object): """This returns a human-readable string that represents the state of the object.""" - ss = [ (ns[0],' %d: "%s"' % ns) for ns in self._strings ] - ss.append((-1,'searcher_string:')) + ss = [(ns[0], ' %d: "%s"' % ns) for ns in self._strings] + ss.append((-1, 'searcher_string:')) if self.eof_index >= 0: - ss.append ((self.eof_index,' %d: EOF' % self.eof_index)) + ss.append((self.eof_index, ' %d: EOF' % self.eof_index)) if self.timeout_index >= 0: - ss.append ((self.timeout_index,' %d: TIMEOUT' % self.timeout_index)) + ss.append((self.timeout_index, ' %d: TIMEOUT' % self.timeout_index)) ss.sort() ss = zip(*ss)[1] return '\n'.join(ss) - def search(self, buffer, freshlen, searchwindowsize=None): + def search(self, sbuffer, freshlen, searchwindowsize=None): - """This searches 'buffer' for the first occurence of one of the search + """This searches 'sbuffer' for the first occurence of one of the search strings. 'freshlen' must indicate the number of bytes at the end of - 'buffer' which have not been searched before. It helps to avoid + 'sbuffer' which have not been searched before. It helps to avoid searching the same, possibly big, buffer over and over again. See class spawn for the 'searchwindowsize' argument. @@ -1663,7 +1664,7 @@ class searcher_string (object): If there is a match this returns the index of that string, and sets 'start', 'end' and 'match'. Otherwise, this returns -1. """ - absurd_match = len(buffer) + absurd_match = len(sbuffer) first_match = absurd_match # 'freshlen' helps a lot here. Further optimizations could @@ -1677,7 +1678,6 @@ class searcher_string (object): # rescanning until we've read three more bytes. # # Sadly, I don't know enough about this interesting topic. /grahn - for index, s in self._strings: if searchwindowsize is None: # the match, if any, can only be in the fresh data, @@ -1686,7 +1686,7 @@ class searcher_string (object): else: # better obey searchwindowsize offset = -searchwindowsize - n = buffer.find(s, offset) + n = sbuffer.find(s, offset) if n >= 0 and n < first_match: first_match = n best_index, best_match = index, s @@ -1697,7 +1697,7 @@ class searcher_string (object): self.end = self.start + len(self.match) return best_index -class searcher_re (object): +class searcher_re(object): """This is regular expression string search helper for the spawn.expect_any() method. @@ -1739,37 +1739,37 @@ class searcher_re (object): """This returns a human-readable string that represents the state of the object.""" - ss = [ (n,' %d: re.compile("%s")' % (n,str(s.pattern))) for n,s in self._searches] - ss.append((-1,'searcher_re:')) + ss = [(n, ' %d: re.compile("%s")' % (n, str(s.pattern))) for n, s in self._searches] + ss.append((-1, 'searcher_re:')) if self.eof_index >= 0: - ss.append ((self.eof_index,' %d: EOF' % self.eof_index)) + ss.append((self.eof_index, ' %d: EOF' % self.eof_index)) if self.timeout_index >= 0: - ss.append ((self.timeout_index,' %d: TIMEOUT' % self.timeout_index)) + ss.append((self.timeout_index, ' %d: TIMEOUT' % self.timeout_index)) ss.sort() ss = zip(*ss)[1] return '\n'.join(ss) - def search(self, buffer, freshlen, searchwindowsize=None): + def search(self, sbuffer, _freshlen, searchwindowsize=None): - """This searches 'buffer' for the first occurence of one of the regular + """This searches 'sbuffer' for the first occurence of one of the regular expressions. 'freshlen' must indicate the number of bytes at the end of - 'buffer' which have not been searched before. + 'sbuffer' which have not been searched before. See class spawn for the 'searchwindowsize' argument. - + If there is a match this returns the index of that string, and sets 'start', 'end' and 'match'. Otherwise, returns -1.""" - absurd_match = len(buffer) + absurd_match = len(sbuffer) first_match = absurd_match # 'freshlen' doesn't help here -- we cannot predict the # length of a match, and the re module provides no help. if searchwindowsize is None: searchstart = 0 else: - searchstart = max(0, len(buffer)-searchwindowsize) + searchstart = max(0, len(sbuffer)-searchwindowsize) for index, s in self._searches: - match = s.search(buffer, searchstart) + match = s.search(sbuffer, searchstart) if match is None: continue n = match.start() @@ -1784,7 +1784,7 @@ class searcher_re (object): self.end = self.match.end() return best_index -def which (filename): +def which(filename): """This takes a given filename; tries to find it in the environment path; then checks if it is executable. This returns the full path to the filename @@ -1792,7 +1792,7 @@ def which (filename): # Special case where filename already contains a path. if os.path.dirname(filename) != '': - if os.access (filename, os.X_OK): + if os.access(filename, os.X_OK): return filename if not os.environ.has_key('PATH') or os.environ['PATH'] == '': @@ -1802,8 +1802,8 @@ def which (filename): # Oddly enough this was the one line that made Pexpect # incompatible with Python 1.5.2. - #pathlist = p.split (os.pathsep) - pathlist = string.split (p, os.pathsep) + #pathlist = p.split(os.pathsep) + pathlist = string.split(p, os.pathsep) for path in pathlist: f = os.path.join(path, filename) @@ -1840,7 +1840,7 @@ def split_command_line(command_line): elif c.isspace(): # Add arg to arg_list if we aren't in the middle of whitespace. if state == state_whitespace: - None # Do nothing. + pass # Do nothing. else: arg_list.append(arg) arg = '' @@ -1920,7 +1920,7 @@ class ssh_session: # to recover. if '@@@' in child.before: sys.stdout.write(child.before) - raise SystemExit, 2 + raise SystemExit(2) return child.before def ssh(self, command): "Execute a command on the remote host, returning its output." @@ -1936,7 +1936,7 @@ class ssh_session: seen = self.ssh("/bin/ls -ld %s" % fn) if not seen.strip(): sys.stderr.write("Remote ls returned empty string, bailing out.\n") - raise SystemExit, 2 + raise SystemExit(2) if self.verbose: sys.stderr.write("Existence check on %s gave %s\n" % (fn, repr(seen))) if seen.find("No such file") > -1: @@ -1985,7 +1985,7 @@ def die(msg): "Die quietly." print msg print "Goodbye." - raise SystemExit, 1 + raise SystemExit(1) def fixperms(session, fn, checkonly=False): "Force perms of remote file to user read on, group/other write off." @@ -2015,7 +2015,7 @@ def forcefile(session, fn, command, checkonly=False): print fn, "already exists." return perms -if __name__ == '__main__': +if __name__ == '__main__': # Process options try: (options, arguments) = getopt.getopt(sys.argv[1:], "cdhvp:") @@ -2028,16 +2028,16 @@ if __name__ == '__main__': port = 22 for (switch, val) in options: - if (switch == '-c'): + if switch == '-c': check = 1 - elif (switch == '-d'): + elif switch == '-d': delete = 1 - elif (switch == '-p'): + elif switch == '-p': port = val - elif (switch == '-h'): + elif switch == '-h': print __doc__ - raise SystemExit, 0 - elif (switch == '-v'): + raise SystemExit(0) + elif switch == '-v': verbose = 1 config = KeyConfig() @@ -2045,7 +2045,7 @@ if __name__ == '__main__': if not arguments: print "No remote host specified." print __doc__ - raise SystemExit, 0 + raise SystemExit(0) else: host = arguments[0] if "@" in host: @@ -2053,7 +2053,7 @@ if __name__ == '__main__': else: login = os.environ.get("LOGNAME") or os.environ.get("USER") - # Verify that key pairs are present on the local side + # Verify that key pairs are present on the local side print "Checking your local configuration..." try: os.chdir(os.getenv("HOME")) @@ -2076,7 +2076,7 @@ if __name__ == '__main__': os.chdir(".ssh") except: die("Can't chdir into your .ssh directory!") - public_keys = filter(lambda f: os.access(f, os.R_OK), + public_keys = filter(lambda f: os.access(f, os.R_OK), ("id_dsa.pub", "id_rsa.pub", "identity.pub")) if not public_keys: if check: @@ -2085,14 +2085,14 @@ if __name__ == '__main__': public_keys = [] for (keytype, fn) in (("rsa1", "identity"), ("dsa", "id_dsa")): print "About to generate a %s key. You will be prompted for a passphrase," % keytype - print "Pressing enter at that prompt will create a key with no passphrase" + print "Pressing enter at that prompt will create a key with no passphrase" os.system("ssh-keygen -t %s -f %s" % (keytype, fn)) public_keys.append(fn + ".pub") print "I see the following public keys:", ", ".join(public_keys) for filename in public_keys: private_key = filename[:-4] - legend = private_key + " corresponding to " + filename + " " + legend = private_key + " corresponding to " + filename + " " if os.access(private_key, os.R_OK): print legend + "exists and is readable." else: @@ -2104,7 +2104,7 @@ if __name__ == '__main__': os.system('ssh -l %s %s "rm -fr .ssh"' % (login, host)) config.forget(host) print "Keys for %s@%s have been deleted." % (login, host) - raise SystemExit, 0 + raise SystemExit(0) # Update or check try: