msoulier / tftpy

Pure Python TFTP library
http://tftpy.sf.net
MIT License
172 stars 120 forks source link

Add netascii support #4

Open msoulier opened 14 years ago

msoulier commented 14 years ago

Currently we only support octet mode. While mail support is likely pointless, netascii could be helpful for transferring text files, although I doubt it. It's likely just worth doing to be a more complete implementation.

msoulier commented 13 years ago

Scheduling for 1.0.

EraYaN commented 8 years ago

This is especially helpful for use with network gear with this library.

For example (older) HP ProCurve Switches use netascii.

Although when I remove the check where the octet only error is raised, it seems to work.

Log below: (Maybe there was something I missed, but it all seems okay, although the listen method refuses to stop looping after the transfer.)

Spawing TFTP server (push)...
DEBUG:tftpy:tftproot F:\Users\Erwin\OneDrive\ClaraNet\ClaraNetScripts\SendConfig does exist
DEBUG:tftpy:tftproot F:\Users\Erwin\OneDrive\ClaraNet\ClaraNetScripts\SendConfig is a directory
DEBUG:tftpy:tftproot F:\Users\Erwin\OneDrive\ClaraNet\ClaraNetScripts\SendConfig is readable
DEBUG:tftpy:tftproot F:\Users\Erwin\OneDrive\ClaraNet\ClaraNetScripts\SendConfig is writable
Connecting (netmiko)...
SSH connection established to 192.168.178.3:22
Interactive SSH session established
Connected!
Getting switch time...
Mon Aug 15 01:44:30 2016
Entered config mode.
Enabling tftp client switch side...
Output:
Output:
Downloading config and reloading switch...
Output: Device may be rebooted, do you want to continue [y/n]?
Output:
INFO:tftpy:Server requested on ip 0.0.0.0, port 69
INFO:tftpy:Starting receive loop...
DEBUG:tftpy:shutdown_immediately is False
DEBUG:tftpy:shutdown_gracefully is False
DEBUG:tftpy:Performing select on this inputlist: [<socket._socketobject object at 0x0396F0D8>]
DEBUG:tftpy:Looping on all sessions to check for timeouts
DEBUG:tftpy:Iterating deletion list.
DEBUG:tftpy:shutdown_immediately is False
DEBUG:tftpy:shutdown_gracefully is False
DEBUG:tftpy:Performing select on this inputlist: [<socket._socketobject object at 0x0396F0D8>]
DEBUG:tftpy:Data ready on our main socket
DEBUG:tftpy:Read 26 bytes
DEBUG:tftpy:Creating new server context for session key = 192.168.178.3:1025
DEBUG:tftpy:In TftpContextServer.start
DEBUG:tftpy:Set metrics.start_time to 1471218357.55
DEBUG:tftpy:parsing a 26 byte packet
DEBUG:tftpy:opcode is 1
DEBUG:tftpy:in TftpPacketWithOptions.setoptions
DEBUG:tftpy:options: {}
DEBUG:tftpy:setting options hash to: {}
DEBUG:tftpy:in decode: about to iterate buffer counting nulls
DEBUG:tftpy:found a null at length 14, now have 1
DEBUG:tftpy:found a null at length 8, now have 2
DEBUG:tftpy:hopefully found end of mode at length 23
DEBUG:tftpy:about to unpack buffer with format: 14sx8sx
DEBUG:tftpy:unpacking buffer: 'mainconfig.pcc\x00netascii\x00'
DEBUG:tftpy:set filename to mainconfig.pcc
DEBUG:tftpy:set mode to netascii
DEBUG:tftpy:decode_options: buffer is: ''
DEBUG:tftpy:size of buffer is 0 bytes
DEBUG:tftpy:size of buffer is zero, returning empty hash
DEBUG:tftpy:in TftpPacketWithOptions.setoptions
DEBUG:tftpy:options: {}
DEBUG:tftpy:setting options hash to: {}
DEBUG:tftpy:in TftpPacketWithOptions.getoptions
DEBUG:tftpy:TftpContextServer.start() - factory returned a RRQ packet: filename = mainconfig.pcc mode = netascii
DEBUG:tftpy:In TftpStateServerStart.handle
DEBUG:tftpy:Handling an RRQ packet
DEBUG:tftpy:In TftpStateServerRecvRRQ.handle
DEBUG:tftpy:in TftpPacketWithOptions.getoptions
INFO:tftpy:Setting tidport to 1025
DEBUG:tftpy:Setting default options, blksize
DEBUG:tftpy:Requested filename is mainconfig.pcc
DEBUG:tftpy:full_path is F:\Users\Erwin\OneDrive\ClaraNet\ClaraNetScripts\SendConfig\mainconfig.pcc
INFO:tftpy:requested file is in the server root - good
INFO:tftpy:Opening file F:\Users\Erwin\OneDrive\ClaraNet\ClaraNetScripts\SendConfig\mainconfig.pcc for reading
DEBUG:tftpy:No requested options, starting send...
DEBUG:tftpy:Read 512 bytes into buffer
DEBUG:tftpy:Sending DAT packet 1
INFO:tftpy:Currently handling these sessions:
INFO:tftpy:    192.168.178.3:1025 <tftpy.TftpStates.TftpStateExpectACK object at 0x03968290>
DEBUG:tftpy:Looping on all sessions to check for timeouts
DEBUG:tftpy:checking for timeout on session 192.168.178.3:1025 <tftpy.TftpStates.TftpStateExpectACK object at 0x03968290>
DEBUG:tftpy:Iterating deletion list.
DEBUG:tftpy:shutdown_immediately is False
DEBUG:tftpy:shutdown_gracefully is False
DEBUG:tftpy:Performing select on this inputlist: [<socket._socketobject object at 0x0396F0D8>, <socket._socketobject object at 0x0396F0A0>]
INFO:tftpy:Matched input to session key 192.168.178.3:1025
DEBUG:tftpy:Received 4 bytes from 192.168.178.3:1025
DEBUG:tftpy:parsing a 4 byte packet
DEBUG:tftpy:opcode is 4
DEBUG:tftpy:decoded ACK packet: opcode = 4, block = 1
INFO:tftpy:Received ACK for packet 1
DEBUG:tftpy:Good ACK, sending next DAT
DEBUG:tftpy:Incremented next_block to 2
DEBUG:tftpy:Read 512 bytes into buffer
DEBUG:tftpy:Sending DAT packet 2
DEBUG:tftpy:Looping on all sessions to check for timeouts
DEBUG:tftpy:checking for timeout on session 192.168.178.3:1025 <tftpy.TftpStates.TftpStateExpectACK object at 0x03968290>
DEBUG:tftpy:Iterating deletion list.
DEBUG:tftpy:shutdown_immediately is False
DEBUG:tftpy:shutdown_gracefully is False
DEBUG:tftpy:Performing select on this inputlist: [<socket._socketobject object at 0x0396F0D8>, <socket._socketobject object at 0x0396F0A0>]
INFO:tftpy:Matched input to session key 192.168.178.3:1025
DEBUG:tftpy:Received 4 bytes from 192.168.178.3:1025
DEBUG:tftpy:parsing a 4 byte packet
DEBUG:tftpy:opcode is 4
DEBUG:tftpy:decoded ACK packet: opcode = 4, block = 2
INFO:tftpy:Received ACK for packet 2
DEBUG:tftpy:Good ACK, sending next DAT
DEBUG:tftpy:Incremented next_block to 3
DEBUG:tftpy:Read 512 bytes into buffer
DEBUG:tftpy:Sending DAT packet 3
DEBUG:tftpy:Looping on all sessions to check for timeouts
DEBUG:tftpy:checking for timeout on session 192.168.178.3:1025 <tftpy.TftpStates.TftpStateExpectACK object at 0x03968290>
DEBUG:tftpy:Iterating deletion list.
DEBUG:tftpy:shutdown_immediately is False
DEBUG:tftpy:shutdown_gracefully is False
DEBUG:tftpy:Performing select on this inputlist: [<socket._socketobject object at 0x0396F0D8>, <socket._socketobject object at 0x0396F0A0>]
INFO:tftpy:Matched input to session key 192.168.178.3:1025
DEBUG:tftpy:Received 4 bytes from 192.168.178.3:1025
DEBUG:tftpy:parsing a 4 byte packet
DEBUG:tftpy:opcode is 4
DEBUG:tftpy:decoded ACK packet: opcode = 4, block = 3
INFO:tftpy:Received ACK for packet 3
DEBUG:tftpy:Good ACK, sending next DAT
DEBUG:tftpy:Incremented next_block to 4
DEBUG:tftpy:Read 512 bytes into buffer
DEBUG:tftpy:Sending DAT packet 4
DEBUG:tftpy:Looping on all sessions to check for timeouts
DEBUG:tftpy:checking for timeout on session 192.168.178.3:1025 <tftpy.TftpStates.TftpStateExpectACK object at 0x03968290>
DEBUG:tftpy:Iterating deletion list.
DEBUG:tftpy:shutdown_immediately is False
DEBUG:tftpy:shutdown_gracefully is False
DEBUG:tftpy:Performing select on this inputlist: [<socket._socketobject object at 0x0396F0D8>, <socket._socketobject object at 0x0396F0A0>]
INFO:tftpy:Matched input to session key 192.168.178.3:1025
DEBUG:tftpy:Received 4 bytes from 192.168.178.3:1025
DEBUG:tftpy:parsing a 4 byte packet
DEBUG:tftpy:opcode is 4
DEBUG:tftpy:decoded ACK packet: opcode = 4, block = 4
INFO:tftpy:Received ACK for packet 4
DEBUG:tftpy:Good ACK, sending next DAT
DEBUG:tftpy:Incremented next_block to 5
DEBUG:tftpy:Read 512 bytes into buffer
DEBUG:tftpy:Sending DAT packet 5
DEBUG:tftpy:Looping on all sessions to check for timeouts
DEBUG:tftpy:checking for timeout on session 192.168.178.3:1025 <tftpy.TftpStates.TftpStateExpectACK object at 0x03968290>
DEBUG:tftpy:Iterating deletion list.
DEBUG:tftpy:shutdown_immediately is False
DEBUG:tftpy:shutdown_gracefully is False
DEBUG:tftpy:Performing select on this inputlist: [<socket._socketobject object at 0x0396F0D8>, <socket._socketobject object at 0x0396F0A0>]
INFO:tftpy:Matched input to session key 192.168.178.3:1025
DEBUG:tftpy:Received 4 bytes from 192.168.178.3:1025
DEBUG:tftpy:parsing a 4 byte packet
DEBUG:tftpy:opcode is 4
DEBUG:tftpy:decoded ACK packet: opcode = 4, block = 5
INFO:tftpy:Received ACK for packet 5
DEBUG:tftpy:Good ACK, sending next DAT
DEBUG:tftpy:Incremented next_block to 6
DEBUG:tftpy:Read 512 bytes into buffer
DEBUG:tftpy:Sending DAT packet 6
DEBUG:tftpy:Looping on all sessions to check for timeouts
DEBUG:tftpy:checking for timeout on session 192.168.178.3:1025 <tftpy.TftpStates.TftpStateExpectACK object at 0x03968290>
DEBUG:tftpy:Iterating deletion list.
DEBUG:tftpy:shutdown_immediately is False
DEBUG:tftpy:shutdown_gracefully is False
DEBUG:tftpy:Performing select on this inputlist: [<socket._socketobject object at 0x0396F0D8>, <socket._socketobject object at 0x0396F0A0>]
INFO:tftpy:Matched input to session key 192.168.178.3:1025
DEBUG:tftpy:Received 4 bytes from 192.168.178.3:1025
DEBUG:tftpy:parsing a 4 byte packet
DEBUG:tftpy:opcode is 4
DEBUG:tftpy:decoded ACK packet: opcode = 4, block = 6
INFO:tftpy:Received ACK for packet 6
DEBUG:tftpy:Good ACK, sending next DAT
DEBUG:tftpy:Incremented next_block to 7
DEBUG:tftpy:Read 512 bytes into buffer
DEBUG:tftpy:Sending DAT packet 7
DEBUG:tftpy:Looping on all sessions to check for timeouts
DEBUG:tftpy:checking for timeout on session 192.168.178.3:1025 <tftpy.TftpStates.TftpStateExpectACK object at 0x03968290>
DEBUG:tftpy:Iterating deletion list.
DEBUG:tftpy:shutdown_immediately is False
DEBUG:tftpy:shutdown_gracefully is False
DEBUG:tftpy:Performing select on this inputlist: [<socket._socketobject object at 0x0396F0D8>, <socket._socketobject object at 0x0396F0A0>]
INFO:tftpy:Matched input to session key 192.168.178.3:1025
DEBUG:tftpy:Received 4 bytes from 192.168.178.3:1025
DEBUG:tftpy:parsing a 4 byte packet
DEBUG:tftpy:opcode is 4
DEBUG:tftpy:decoded ACK packet: opcode = 4, block = 7
INFO:tftpy:Received ACK for packet 7
DEBUG:tftpy:Good ACK, sending next DAT
DEBUG:tftpy:Incremented next_block to 8
DEBUG:tftpy:Read 512 bytes into buffer
DEBUG:tftpy:Sending DAT packet 8
DEBUG:tftpy:Looping on all sessions to check for timeouts
DEBUG:tftpy:checking for timeout on session 192.168.178.3:1025 <tftpy.TftpStates.TftpStateExpectACK object at 0x03968290>
DEBUG:tftpy:Iterating deletion list.
DEBUG:tftpy:shutdown_immediately is False
DEBUG:tftpy:shutdown_gracefully is False
DEBUG:tftpy:Performing select on this inputlist: [<socket._socketobject object at 0x0396F0D8>, <socket._socketobject object at 0x0396F0A0>]
INFO:tftpy:Matched input to session key 192.168.178.3:1025
DEBUG:tftpy:Received 4 bytes from 192.168.178.3:1025
DEBUG:tftpy:parsing a 4 byte packet
DEBUG:tftpy:opcode is 4
DEBUG:tftpy:decoded ACK packet: opcode = 4, block = 8
INFO:tftpy:Received ACK for packet 8
DEBUG:tftpy:Good ACK, sending next DAT
DEBUG:tftpy:Incremented next_block to 9
DEBUG:tftpy:Read 512 bytes into buffer
DEBUG:tftpy:Sending DAT packet 9
DEBUG:tftpy:Looping on all sessions to check for timeouts
DEBUG:tftpy:checking for timeout on session 192.168.178.3:1025 <tftpy.TftpStates.TftpStateExpectACK object at 0x03968290>
DEBUG:tftpy:Iterating deletion list.
DEBUG:tftpy:shutdown_immediately is False
DEBUG:tftpy:shutdown_gracefully is False
DEBUG:tftpy:Performing select on this inputlist: [<socket._socketobject object at 0x0396F0D8>, <socket._socketobject object at 0x0396F0A0>]
INFO:tftpy:Matched input to session key 192.168.178.3:1025
DEBUG:tftpy:Received 4 bytes from 192.168.178.3:1025
DEBUG:tftpy:parsing a 4 byte packet
DEBUG:tftpy:opcode is 4
DEBUG:tftpy:decoded ACK packet: opcode = 4, block = 9
INFO:tftpy:Received ACK for packet 9
DEBUG:tftpy:Good ACK, sending next DAT
DEBUG:tftpy:Incremented next_block to 10
DEBUG:tftpy:Read 512 bytes into buffer
DEBUG:tftpy:Sending DAT packet 10
DEBUG:tftpy:Looping on all sessions to check for timeouts
DEBUG:tftpy:checking for timeout on session 192.168.178.3:1025 <tftpy.TftpStates.TftpStateExpectACK object at 0x03968290>
DEBUG:tftpy:Iterating deletion list.
DEBUG:tftpy:shutdown_immediately is False
DEBUG:tftpy:shutdown_gracefully is False
DEBUG:tftpy:Performing select on this inputlist: [<socket._socketobject object at 0x0396F0D8>, <socket._socketobject object at 0x0396F0A0>]
INFO:tftpy:Matched input to session key 192.168.178.3:1025
DEBUG:tftpy:Received 4 bytes from 192.168.178.3:1025
DEBUG:tftpy:parsing a 4 byte packet
DEBUG:tftpy:opcode is 4
DEBUG:tftpy:decoded ACK packet: opcode = 4, block = 10
INFO:tftpy:Received ACK for packet 10
DEBUG:tftpy:Good ACK, sending next DAT
DEBUG:tftpy:Incremented next_block to 11
DEBUG:tftpy:Read 512 bytes into buffer
DEBUG:tftpy:Sending DAT packet 11
DEBUG:tftpy:Looping on all sessions to check for timeouts
DEBUG:tftpy:checking for timeout on session 192.168.178.3:1025 <tftpy.TftpStates.TftpStateExpectACK object at 0x03968290>
DEBUG:tftpy:Iterating deletion list.
DEBUG:tftpy:shutdown_immediately is False
DEBUG:tftpy:shutdown_gracefully is False
DEBUG:tftpy:Performing select on this inputlist: [<socket._socketobject object at 0x0396F0D8>, <socket._socketobject object at 0x0396F0A0>]
INFO:tftpy:Matched input to session key 192.168.178.3:1025
DEBUG:tftpy:Received 4 bytes from 192.168.178.3:1025
DEBUG:tftpy:parsing a 4 byte packet
DEBUG:tftpy:opcode is 4
DEBUG:tftpy:decoded ACK packet: opcode = 4, block = 11
INFO:tftpy:Received ACK for packet 11
DEBUG:tftpy:Good ACK, sending next DAT
DEBUG:tftpy:Incremented next_block to 12
DEBUG:tftpy:Read 512 bytes into buffer
DEBUG:tftpy:Sending DAT packet 12
DEBUG:tftpy:Looping on all sessions to check for timeouts
DEBUG:tftpy:checking for timeout on session 192.168.178.3:1025 <tftpy.TftpStates.TftpStateExpectACK object at 0x03968290>
DEBUG:tftpy:Iterating deletion list.
DEBUG:tftpy:shutdown_immediately is False
DEBUG:tftpy:shutdown_gracefully is False
DEBUG:tftpy:Performing select on this inputlist: [<socket._socketobject object at 0x0396F0D8>, <socket._socketobject object at 0x0396F0A0>]
INFO:tftpy:Matched input to session key 192.168.178.3:1025
DEBUG:tftpy:Received 4 bytes from 192.168.178.3:1025
DEBUG:tftpy:parsing a 4 byte packet
DEBUG:tftpy:opcode is 4
DEBUG:tftpy:decoded ACK packet: opcode = 4, block = 12
INFO:tftpy:Received ACK for packet 12
DEBUG:tftpy:Good ACK, sending next DAT
DEBUG:tftpy:Incremented next_block to 13
DEBUG:tftpy:Read 512 bytes into buffer
DEBUG:tftpy:Sending DAT packet 13
DEBUG:tftpy:Looping on all sessions to check for timeouts
DEBUG:tftpy:checking for timeout on session 192.168.178.3:1025 <tftpy.TftpStates.TftpStateExpectACK object at 0x03968290>
DEBUG:tftpy:Iterating deletion list.
DEBUG:tftpy:shutdown_immediately is False
DEBUG:tftpy:shutdown_gracefully is False
DEBUG:tftpy:Performing select on this inputlist: [<socket._socketobject object at 0x0396F0D8>, <socket._socketobject object at 0x0396F0A0>]
INFO:tftpy:Matched input to session key 192.168.178.3:1025
DEBUG:tftpy:Received 4 bytes from 192.168.178.3:1025
DEBUG:tftpy:parsing a 4 byte packet
DEBUG:tftpy:opcode is 4
DEBUG:tftpy:decoded ACK packet: opcode = 4, block = 13
INFO:tftpy:Received ACK for packet 13
DEBUG:tftpy:Good ACK, sending next DAT
DEBUG:tftpy:Incremented next_block to 14
DEBUG:tftpy:Read 512 bytes into buffer
DEBUG:tftpy:Sending DAT packet 14
DEBUG:tftpy:Looping on all sessions to check for timeouts
DEBUG:tftpy:checking for timeout on session 192.168.178.3:1025 <tftpy.TftpStates.TftpStateExpectACK object at 0x03968290>
DEBUG:tftpy:Iterating deletion list.
DEBUG:tftpy:shutdown_immediately is False
DEBUG:tftpy:shutdown_gracefully is False
DEBUG:tftpy:Performing select on this inputlist: [<socket._socketobject object at 0x0396F0D8>, <socket._socketobject object at 0x0396F0A0>]
INFO:tftpy:Matched input to session key 192.168.178.3:1025
DEBUG:tftpy:Received 4 bytes from 192.168.178.3:1025
DEBUG:tftpy:parsing a 4 byte packet
DEBUG:tftpy:opcode is 4
DEBUG:tftpy:decoded ACK packet: opcode = 4, block = 14
INFO:tftpy:Received ACK for packet 14
DEBUG:tftpy:Good ACK, sending next DAT
DEBUG:tftpy:Incremented next_block to 15
DEBUG:tftpy:Read 512 bytes into buffer
DEBUG:tftpy:Sending DAT packet 15
DEBUG:tftpy:Looping on all sessions to check for timeouts
DEBUG:tftpy:checking for timeout on session 192.168.178.3:1025 <tftpy.TftpStates.TftpStateExpectACK object at 0x03968290>
DEBUG:tftpy:Iterating deletion list.
DEBUG:tftpy:shutdown_immediately is False
DEBUG:tftpy:shutdown_gracefully is False
DEBUG:tftpy:Performing select on this inputlist: [<socket._socketobject object at 0x0396F0D8>, <socket._socketobject object at 0x0396F0A0>]
INFO:tftpy:Matched input to session key 192.168.178.3:1025
DEBUG:tftpy:Received 4 bytes from 192.168.178.3:1025
DEBUG:tftpy:parsing a 4 byte packet
DEBUG:tftpy:opcode is 4
DEBUG:tftpy:decoded ACK packet: opcode = 4, block = 15
INFO:tftpy:Received ACK for packet 15
DEBUG:tftpy:Good ACK, sending next DAT
DEBUG:tftpy:Incremented next_block to 16
DEBUG:tftpy:Read 472 bytes into buffer
INFO:tftpy:Reached EOF on file mainconfig.pcc
DEBUG:tftpy:Sending DAT packet 16
DEBUG:tftpy:Looping on all sessions to check for timeouts
DEBUG:tftpy:checking for timeout on session 192.168.178.3:1025 <tftpy.TftpStates.TftpStateExpectACK object at 0x03968290>
DEBUG:tftpy:Iterating deletion list.
DEBUG:tftpy:shutdown_immediately is False
DEBUG:tftpy:shutdown_gracefully is False
DEBUG:tftpy:Performing select on this inputlist: [<socket._socketobject object at 0x0396F0D8>, <socket._socketobject object at 0x0396F0A0>]
INFO:tftpy:Matched input to session key 192.168.178.3:1025
DEBUG:tftpy:Received 4 bytes from 192.168.178.3:1025
DEBUG:tftpy:parsing a 4 byte packet
DEBUG:tftpy:opcode is 4
DEBUG:tftpy:decoded ACK packet: opcode = 4, block = 16
INFO:tftpy:Received ACK for packet 16
INFO:tftpy:Received ACK to final DAT, we're done.
INFO:tftpy:Successful transfer.
DEBUG:tftpy:Looping on all sessions to check for timeouts
DEBUG:tftpy:checking for timeout on session 192.168.178.3:1025 None
DEBUG:tftpy:Iterating deletion list.
INFO:tftpy:
INFO:tftpy:Session 192.168.178.3:1025 complete
DEBUG:tftpy:Gathering up metrics from session before deleting
DEBUG:tftpy:in TftpContext.end
DEBUG:tftpy:self.fileobj is open - closing
DEBUG:tftpy:Set metrics.end_time to 1471218358.61
DEBUG:tftpy:TftpMetrics.compute: duration is 1.05900001526
DEBUG:tftpy:TftpMetrics.compute: kbps is 60.1392814753
INFO:tftpy:Transferred 8152 bytes in 1.06 seconds
INFO:tftpy:Average rate: 60.14 kbps
INFO:tftpy:0.00 bytes in resent data
INFO:tftpy:0 duplicate packets
DEBUG:tftpy:Deleting session 192.168.178.3:1025
DEBUG:tftpy:Session list is now {}
DEBUG:tftpy:shutdown_immediately is False
DEBUG:tftpy:shutdown_gracefully is False
DEBUG:tftpy:Performing select on this inputlist: [<socket._socketobject object at 0x0396F0D8>]
DEBUG:tftpy:Looping on all sessions to check for timeouts
DEBUG:tftpy:Iterating deletion list.
DEBUG:tftpy:shutdown_immediately is False
DEBUG:tftpy:shutdown_gracefully is False
DEBUG:tftpy:Performing select on this inputlist: [<socket._socketobject object at 0x0396F0D8>]
DEBUG:tftpy:Looping on all sessions to check for timeouts
DEBUG:tftpy:Iterating deletion list.
DEBUG:tftpy:shutdown_immediately is False
DEBUG:tftpy:shutdown_gracefully is False
DEBUG:tftpy:Performing select on this inputlist: [<socket._socketobject object at 0x0396F0D8>]
DEBUG:tftpy:Looping on all sessions to check for timeouts
DEBUG:tftpy:Iterating deletion list.
DEBUG:tftpy:shutdown_immediately is False
DEBUG:tftpy:shutdown_gracefully is False
DEBUG:tftpy:Performing select on this inputlist: [<socket._socketobject object at 0x0396F0D8>]
JFC-MC commented 8 years ago

Good news! It seems netascii transfer mode(RFC 764 as it's stated on the https://en.wikipedia.org/wiki/Trivial_File_Transfer_Protocol) is already implemented in another python-based tftp server. So I guess it can be easily integrated in tftpy. https://github.com/shylent/python-tx-tftp/blob/master/tftp/netascii.py (about 150 lines of code, MIT License allows free copying/modification of code AFAIK).

I can perform tests on this new and long-awaited feature of tftpy! )

Thanks in advance!