summaryrefslogtreecommitdiff
path: root/tftpy/TftpServer.py
diff options
context:
space:
mode:
Diffstat (limited to 'tftpy/TftpServer.py')
-rw-r--r--tftpy/TftpServer.py62
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()