diff options
Diffstat (limited to 'tftpy/TftpServer.py')
-rw-r--r-- | tftpy/TftpServer.py | 62 |
1 files changed, 26 insertions, 36 deletions
diff --git a/tftpy/TftpServer.py b/tftpy/TftpServer.py index 69adb1b..fe505c3 100644 --- a/tftpy/TftpServer.py +++ b/tftpy/TftpServer.py @@ -5,19 +5,22 @@ instance of the server, and then run the listen() method to listen for client requests. Logging is performed via a standard logging object set in TftpShared.""" - -import socket, os, time +import logging +import os import select +import socket import threading -import logging +import time from errno import EINTR -from .TftpShared import * -from .TftpPacketTypes import * -from .TftpPacketFactory import TftpPacketFactory + from .TftpContexts import TftpContextServer +from .TftpPacketFactory import TftpPacketFactory +from .TftpPacketTypes import * +from .TftpShared import * log = logging.getLogger('tftpy.TftpServer') + class TftpServer(TftpSession): """This class implements a tftp server object. Run the listen() method to listen for client requests. @@ -85,7 +88,8 @@ class TftpServer(TftpSession): # Don't use new 2.5 ternary operator yet # listenip = listenip if listenip else '0.0.0.0' - if not listenip: listenip = '0.0.0.0' + if not listenip: + listenip = '0.0.0.0' log.info("Server requested on ip %s, port %s" % (listenip, listenport)) try: # FIXME - sockets should be non-blocking @@ -103,8 +107,7 @@ class TftpServer(TftpSession): log.debug("shutdown_immediately is %s" % self.shutdown_immediately) log.debug("shutdown_gracefully is %s" % self.shutdown_gracefully) if self.shutdown_immediately: - log.warning("Shutting down now. Session count: %d" % - len(self.sessions)) + log.warning("Shutting down now. Session count: %d" % len(self.sessions)) self.sock.close() for key in self.sessions: self.sessions[key].end() @@ -113,22 +116,19 @@ class TftpServer(TftpSession): elif self.shutdown_gracefully: if not self.sessions: - log.warning("In graceful shutdown mode and all " - "sessions complete.") + log.warning("In graceful shutdown mode and all sessions complete.") self.sock.close() break # Build the inputlist array of sockets to select() on. - inputlist = [] - inputlist.append(self.sock) + inputlist = [self.sock] for key in self.sessions: inputlist.append(self.sessions[key].sock) # Block until some socket has input on it. log.debug("Performing select on this inputlist: %s", inputlist) try: - readyinput, readyoutput, readyspecial = \ - select.select(inputlist, [], [], timeout) + readyinput, readyoutput, readyspecial = select.select(inputlist, [], [], timeout) except select.error as err: if err[0] == EINTR: # Interrupted system call @@ -149,17 +149,15 @@ class TftpServer(TftpSession): log.debug("Read %d bytes", len(buffer)) if self.shutdown_gracefully: - log.warning("Discarding data on main port, " - "in graceful shutdown mode") + log.warning("Discarding data on main port, in graceful shutdown mode") continue # Forge a session key based on the client's IP and port, # which should safely work through NAT. key = "%s:%s" % (raddress, rport) - if not key in self.sessions: - log.debug("Creating new server context for " - "session key = %s" % key) + if key not in self.sessions: + log.debug("Creating new server context for session key = %s" % key) self.sessions[key] = TftpContextServer(raddress, rport, timeout, @@ -171,11 +169,9 @@ class TftpServer(TftpSession): self.sessions[key].start(buffer) except TftpException as err: deletion_list.append(key) - log.error("Fatal exception thrown from " - "session %s: %s" % (key, str(err))) + log.error("Fatal exception thrown from session %s: %s" % (key, str(err))) else: - log.warning("received traffic on main socket for " - "existing session??") + log.warning("received traffic on main socket for existing session??") log.info("Currently handling these sessions:") for session_key, session in list(self.sessions.items()): log.info(" %s" % session) @@ -184,18 +180,15 @@ class TftpServer(TftpSession): # Must find the owner of this traffic. for key in self.sessions: if readysock == self.sessions[key].sock: - log.debug("Matched input to session key %s" - % key) + log.debug("Matched input to session key %s" % key) try: self.sessions[key].cycle() - if self.sessions[key].state == None: + if self.sessions[key].state is None: log.info("Successful transfer.") deletion_list.append(key) except TftpException as err: deletion_list.append(key) - log.error("Fatal exception thrown from " - "session %s: %s" - % (key, str(err))) + log.error("Fatal exception thrown from session %s: %s" % (key, str(err))) # Break out of for loop since we found the correct # session. break @@ -212,8 +205,7 @@ class TftpServer(TftpSession): log.error(str(err)) self.sessions[key].retry_count += 1 if self.sessions[key].retry_count >= self.sessions[key].retries: - log.debug("hit max retries on %s, giving up" % - self.sessions[key]) + log.debug("hit max retries on %s, giving up" % self.sessions[key]) deletion_list.append(key) else: log.debug("resending on session %s" % self.sessions[key]) @@ -230,8 +222,7 @@ class TftpServer(TftpSession): if metrics.duration == 0: log.info("Duration too short, rate undetermined") else: - log.info("Transferred %d bytes in %.2f seconds" - % (metrics.bytes, metrics.duration)) + log.info("Transferred %d bytes in %.2f seconds" % (metrics.bytes, metrics.duration)) log.info("Average rate: %.2f kbps" % metrics.kbps) log.info("%.2f bytes in resent data" % metrics.resent_bytes) log.info("%d duplicate packets" % metrics.dupcount) @@ -239,8 +230,7 @@ class TftpServer(TftpSession): del self.sessions[key] log.debug("Session list is now %s" % self.sessions) else: - log.warning( - "Strange, session %s is not on the deletion list" % key) + log.warning("Strange, session %s is not on the deletion list" % key) self.is_running.clear() |