summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael P. Soulier <msoulier@digitaltorque.ca>2010-07-14 13:28:53 -0400
committerMichael P. Soulier <msoulier@digitaltorque.ca>2010-07-14 13:28:53 -0400
commite35cd2d60c857d3d85350993606149f5622aab18 (patch)
treec5f2ee9197de3b38198811aecfab929255c54959
parent74f67566715d367b829a6a58ecb24369c0721b5a (diff)
downloadtftpy-e35cd2d60c857d3d85350993606149f5622aab18.tar.gz
Added simple doc examples and install info.
-rw-r--r--ChangeLog432
-rwxr-xr-xbin/tftpy_client.py8
-rw-r--r--doc/index.rst28
-rw-r--r--html/sphinx/_sources/index.txt28
-rw-r--r--html/sphinx/_static/default.css12
-rw-r--r--html/sphinx/genindex.html2
-rw-r--r--html/sphinx/index.html28
-rw-r--r--html/sphinx/modindex.html2
-rw-r--r--html/sphinx/search.html2
-rw-r--r--html/sphinx/searchindex.js2
-rw-r--r--setup.py2
11 files changed, 335 insertions, 211 deletions
diff --git a/ChangeLog b/ChangeLog
index ae7f618..057b5c7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,214 +1,244 @@
-2010-05-10 Michael P. Soulier <msoulier@digitaltorque.ca>
- * Fixing buffering issue in upload. Uploads work now.
- * Updated README
- * First working upload with new state machine. Not usable yet, upload fails to always send all data for some reason.
- * Fixed an obvious error introduced with the dyn_file_func merge
-2010-04-24 Michael P. Soulier <msoulier@digitaltorque.ca>
- * Merge commit 'angry-elf/master' into merge
+2010-07-12 Michael P. Soulier
+ 74f6756: Playing with sphinx formatting
-2010-02-18 Michael P. Soulier <msoulier@digitaltorque.ca>
- * Taking patch from "Mike C. Fletcher" <mcfletch@vrplumber.com>, fixing a bad reference to dyn_func_file from a state object.
+2010-07-11 Michael P. Soulier
+ 1caa220: Latest doc updates
+ ad94976: Replacing epydoc output on website.
+ 402b2ae: Adding initial Sphinx docs
-2010-02-18 Alexey Loshkarev <elf2001@gmail.com>
- * Fix dyn_file_func (was broken?) Fix error message (filename was not displayed)
+2010-05-25 Michael P. Soulier
+ 0b54068: Fixing typo in unit test
+ 58623df: Adding support for input/output as stdin/stdout
-2009-10-24 Michael P. Soulier <msoulier@digitaltorque.ca>
- * Updated epydoc output for website.
+2010-05-24 Michael P. Soulier
+ f4a3ff6: Fixing failure to set default blocksize if options were provided but blksize was not one of them.
-2009-09-24 Michael P. Soulier <msoulier@digitaltorque.ca>
- * Changed licenses to the MIT License
- * Fixing some log messages and bad variable references.
+2010-05-12 Patrick Oppenlander
+ 1a2b556: fix incorrectly assigned state transition
+ 360b0b9: fix divide by zero in speed calculation for short transfers
-2009-08-18 Michael P. Soulier <msoulier@digitaltorque.ca>
- * Updated resent_data in metrics.
- * Fixed server metrics summary.
+2010-05-10 Michael P. Soulier
+ 3c40546: Updated site html formatting
+ 9ed42a8: Website update
+ 5f0e405: Updating notes
+ d4c15e1: Fixing the license in the setup.py
+ 2f0c0db: Updated website
+ becb299: Updating metadata for 0.5.0 release
+ faebd44: Fixing buffering issue in upload. Uploads work now.
+ a071549: Updated README
+ 2bb8326: First working upload with new state machine. Not usable yet, upload fails to always send all data for some reason.
+ 4a4f53a: Fixed an obvious error introduced with the dyn_file_func merge
-2009-08-16 Michael P. Soulier <msoulier@digitaltorque.ca>
- * First successful download with both client and server.
- * Did some rework for the state machine in a server context. Removed the handler framework in favour of a TftpContextServer used as the session.
- * Fixing up some of the upload code.
+2010-04-24 Michael P. Soulier
+ 8a56d94: Merge commit 'angry-elf/master' into merge
-2009-07-21 Michael P. Soulier <msoulier@digitaltorque.ca>
- * Adding patch for dynamic content from Alex ? <yix@ya.ru>
+2010-02-18 Michael P. Soulier
+ 8343ccf: Taking patch from "Mike C. Fletcher" <mcfletch@vrplumber.com>, fixing a bad reference to dyn_func_file from a state object.
-2009-04-10 Michael P. Soulier <msoulier@digitaltorque.ca>
- * Fixing a merge error in rebase
- * Fixed bug in tidport handling, and lack of OACK response.
- * Fixing OACK handling with new state machine.
- * Fixed TftpClient with new state machine.
- * Started overhaul of state machine.
- * Improving sample client output on error and fixing default blocksize when server ignores options.
- * Merged upload patch.
+2010-02-18 Alexey Loshkarev
+ 72c4769: Fix dyn_file_func (was broken?) Fix error message (filename was not displayed)
-2009-04-09 Michael P. Soulier <msoulier@digitaltorque.ca>
- * Updating version in setup
+2009-10-24 Michael P. Soulier
+ badf18f: Updated epydoc output for website.
-2009-04-08 Michael P. Soulier <msoulier@digitaltorque.ca>
- * Website update
-
-2009-04-07 Michael P. Soulier <msoulier@digitaltorque.ca>
- * Fixing bogus warnings in options handling.
- * Merge branch 'master' of git@github.com:msoulier/tftpy
- * Fixing tftproot configured for server as a relative path.
-
-2009-03-15 Michael P. Soulier <msoulier@digitaltorque.ca>
- * Updated site with stylesheet
- * Website update
+2009-09-24 Michael P. Soulier
+ a80639c: Changed licenses to the MIT License
+ ce7fc32: Fixing some log messages and bad variable references.
-2009-03-14 Michael P. Soulier <msoulier@digitaltorque.ca>
- * Adding website
-
-2008-10-08 Michael P. Soulier <msoulier@digitaltorque.ca>
- * Fixed the use of the tsize option in RRQ packets.
-
-2008-10-05 Michael P. Soulier <msoulier@digitaltorque.ca>
- * Rolling 0.4.6
-
-2008-10-04 Michael P. Soulier <msoulier@digitaltorque.ca>
- * Rebased tsize branch and added a --tsize option to the client. Now sending all packets to the progresshook, not just DAT packets, so that the client can see the OACK. Not yet making use of the returned tsize. Need to test this on a server that supports tsize.
- * Adding transfer size option patch from Kuba Kończyk. Patch 2018609 in SF tracker.
-
-2008-10-03 Michael P. Soulier <msoulier@digitaltorque.ca>
- * Merged from SVN trunk after register to PyPi
-
-2008-10-04 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Updated for PyPi
-
-2008-07-30 Michael P. Soulier <msoulier@digitaltorque.ca>
- * Adding upload patch from Lorenz Schori - patch 1897344 in SF tracker
-
-2008-05-28 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Tagging 0.4.5.
- * Updated for v0.4.5 release.
- * Fix for bug 1967647, referencing self.sock instead of sock.
-
-2008-05-20 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Fix for [ 1932310 ] security check always fail for windows.
- * Fixed division by zero error in rate calculations in download function of client. Thanks to Stefaan Vanheesbeke for the report.
- * Fix for bug [ 1932330 ] binary downloads fail in Windows.
-
-2008-01-31 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Updated README.
- * Updated ChangeLog
- * Updating version to 0.4.4
-
-2007-12-16 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Fixing 1851544 - server not tolerant of unsupported options Thanks to Landon Jurgens for the report.
-
-2007-07-17 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Updated for 0.4.3 release.
-
-2007-07-16 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Removed redundant comparison.
- * Fixing string/integer comparison. Thanks to Simon P. Ditner, bug #1755146.
-
-2007-06-05 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Updated for 0.4.2
- * Fixed unit test for factory
-
-2007-03-31 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Updating docs for epydoc.
- * Updated build process.
- * Adding epydoc target.
-
-2007-03-15 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Updated ChangeLog
-
-2007-02-23 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Simplifying use of optparse. Thanks to Steven Bethard for the suggestions.
-
-2007-02-17 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Removed mention of sorceror's apprentice problem.
- * Rearranged packaging a bit to fix an importing problem.
- * Supplying a default blksize options in the server. Fix for 1633625.
-
-2007-02-10 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Added a check for rogue packets in the server.
-
-2007-02-09 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Making the lib backwards-compatible to Python 2.3.
-
-2006-12-17 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Rolling to version 0.4.1.
- * Restructuring single lib into a package.
- * Restructuring single lib into a package.
- * Restructuring single lib into a package.
- * Restructuring single lib into a package.
- * Fixing install location of library.
-
-2006-12-16 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Added server to package.
- * Updated ChangeLog, and rolled version to 0.4
-
-2006-12-15 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Making server exit gracefully.
- * Tweak to EOF handling in server.
- * First working server tests with two clients.
- * Added lots in the server to support a download, with timeouts. Not yet tested with a client, but the damn thing runs.
- * Fixed a bug in handling block number rollovers.
-
-2006-12-14 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Got handling of file not found working in server.
- * Starting on sample server.
- * Successful test on basic select loop
-
-2006-12-11 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Added some security checks around the tftproot. Further fleshed-out the handler. Still not actually starting the transfer.
-
-2006-12-10 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Fleshing out server handler implementation.
- * Started on the server
-
-2006-12-09 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Added --debug option to sample client.
- * Adding license
- * Adding ChangeLog
- * Bumped the version.
- * Changed the port variables to something more intelligent.
- * Fixing poor TID implementation.
-
-2006-10-25 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Added testcase for TftpPacketFactory.
-
-2006-10-13 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Implemented retries on download timeouts.
- * Added some info statements regarding option negotiation.
- * Updated testcases, fixed one error in decode_options
-
-2006-10-11 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Updated testcases
- * Updated makefile
- * Adding makefile
-
-2006-10-10 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Moved LICENSE to COPYING
-
-2006-10-09 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Added test for WRQ packet
- * Fixed broken decode, and adjusted the client options.
-
-2006-10-08 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Starting on unit tests
-
-2006-10-05 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Fixed handling of port
- * Updating for production
- * Freezing 0.2
- * Fixed poor EOF detection
- * Got variable blocksizes working.
-
-2006-10-04 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Added confirmation of incoming traffic to known remote host.
- * Restructured in preparation for tftp options
- * Updated README
- * Updated README
- * Added seconds to logs
- * Upping version to 0.2
- * Added OACK packet, and factored-out client code.
-
-2006-10-03 msoulier <msoulier@63283fd4-ec1e-0410-9879-cb7f675518da>
- * Updated a comment
- * Restructuring
- * Restructuring
+2009-08-18 Michael P. Soulier
+ 781072b: Updated resent_data in metrics.
+ 3ae3b31: Fixed server metrics summary.
+2009-08-16 Michael P. Soulier
+ a6a18c1: First successful download with both client and server.
+
+2009-08-15 Michael P. Soulier
+ 62b22fb: Did some rework for the state machine in a server context. Removed the handler framework in favour of a TftpContextServer used as the session.
+
+2009-06-20 Michael P. Soulier
+ 03e4e74: Fixing up some of the upload code.
+
+2009-07-21 Michael P. Soulier
+ 5ee5f63: Adding patch for dynamic content from Alex ? <yix@ya.ru>
+
+2009-04-10 Michael P. Soulier
+ c61ca17: Fixing a merge error in rebase
+ 410e14c: Fixed bug in tidport handling, and lack of OACK response.
+ 874fef5: Fixing OACK handling with new state machine.
+ 5072f6d: Fixed TftpClient with new state machine.
+
+2009-04-08 Michael P. Soulier
+ e7a63bb: Started overhaul of state machine.
+
+2009-04-10 Michael P. Soulier
+ 41bf3a2: Improving sample client output on error and fixing default blocksize when server ignores options.
+ bd2e195: Merged upload patch.
+
+2009-04-09 Michael P. Soulier
+ 449f10a: Updating version in setup
+
+2009-04-08 Michael P. Soulier
+ 40185e5: Website update
+
+2009-04-07 Michael P. Soulier
+ bc55a17: Fixing bogus warnings in options handling.
+ 74c68b1: Merge branch 'master' of git@github.com:msoulier/tftpy
+ d058642: Fixing tftproot configured for server as a relative path.
+
+2009-03-15 Michael P. Soulier
+ 23b32d0: Updated site with stylesheet
+ 0cfcea2: Website update
+
+2009-03-14 Michael P. Soulier
+ abf0f1f: Adding website
+
+2008-10-08 Michael P. Soulier
+ ca7a06a: Fixed the use of the tsize option in RRQ packets.
+
+2008-10-05 Michael P. Soulier
+ 0a5df33: Rolling 0.4.6
+
+2008-10-04 Michael P. Soulier
+ 07416bf: Rebased tsize branch and added a --tsize option to the client. Now sending all packets to the progresshook, not just DAT packets, so that the client can see the OACK. Not yet making use of the returned tsize. Need to test this on a server that supports tsize.
+
+2008-07-30 Michael P. Soulier
+ 8a0162b: Adding transfer size option patch from Kuba Kończyk. Patch 2018609 in SF tracker.
+
+2008-10-03 Michael P. Soulier
+ c408389: Merged from SVN trunk after register to PyPi
+
+2008-10-04 msoulier
+ 65ef2d9: Updated for PyPi
+
+2008-07-30 Michael P. Soulier
+ 6730280: Adding upload patch from Lorenz Schori - patch 1897344 in SF tracker
+
+2008-05-28 msoulier
+ 33b1353: Tagging 0.4.5.
+ 936e4df: Updated for v0.4.5 release.
+ caff30d: Fix for bug 1967647, referencing self.sock instead of sock.
+
+2008-05-20 msoulier
+ 70f22b1: Fix for [ 1932310 ] security check always fail for windows.
+ 596af40: Fixed division by zero error in rate calculations in download function of client. Thanks to Stefaan Vanheesbeke for the report.
+ 3b1bae3: Fix for bug [ 1932330 ] binary downloads fail in Windows.
+
+2008-01-31 msoulier
+ 648564c: Updated README.
+ 792df2d: Updated ChangeLog
+ 941f5bf: Updating version to 0.4.4
+
+2007-12-16 msoulier
+ f8af287: Fixing 1851544 - server not tolerant of unsupported options Thanks to Landon Jurgens for the report.
+
+2007-07-17 msoulier
+ 89a8382: Updated for 0.4.3 release.
+
+2007-07-16 msoulier
+ 2a98d72: Removed redundant comparison.
+ 955ced3: Fixing string/integer comparison. Thanks to Simon P. Ditner, bug #1755146.
+
+2007-06-05 msoulier
+ 493dcac: Updated for 0.4.2
+ bb47795: Fixed unit test for factory
+
+2007-03-31 msoulier
+ d9665e1: Updating docs for epydoc.
+ b68ceca: Updated build process.
+ d8730c7: Adding epydoc target.
+
+2007-03-15 msoulier
+ 0b41ffb: Updated ChangeLog
+
+2007-02-23 msoulier
+ 8f5595c: Simplifying use of optparse. Thanks to Steven Bethard for the suggestions.
+
+2007-02-17 msoulier
+ 5c52975: Removed mention of sorceror's apprentice problem.
+ c8df0fd: Rearranged packaging a bit to fix an importing problem.
+ c7d86d3: Supplying a default blksize options in the server. Fix for 1633625.
+
+2007-02-10 msoulier
+ 07906cd: Added a check for rogue packets in the server.
+
+2007-02-09 msoulier
+ f53e68b: Making the lib backwards-compatible to Python 2.3.
+
+2006-12-17 msoulier
+ efd248f: Rolling to version 0.4.1.
+ 95b6a72: Restructuring single lib into a package.
+ a1ad552: Restructuring single lib into a package.
+ c43a24c: Restructuring single lib into a package.
+ 5e6d8fe: Restructuring single lib into a package.
+ 6eb1501: Fixing install location of library.
+
+2006-12-16 msoulier
+ 15023eb: Added server to package.
+ ac2faa3: Updated ChangeLog, and rolled version to 0.4
+
+2006-12-15 msoulier
+ f79a1e9: Making server exit gracefully.
+ 16ebbf2: Tweak to EOF handling in server.
+ 7723705: First working server tests with two clients.
+ 5cfbae3: Added lots in the server to support a download, with timeouts. Not yet tested with a client, but the damn thing runs.
+ d5b7276: Fixed a bug in handling block number rollovers.
+
+2006-12-14 msoulier
+ 7441f0a: Got handling of file not found working in server.
+ 3b4d177: Starting on sample server.
+ 94ef067: Successful test on basic select loop
+
+2006-12-11 msoulier
+ 6f186f2: Added some security checks around the tftproot. Further fleshed-out the handler. Still not actually starting the transfer.
+
+2006-12-10 msoulier
+ b5a96ec: Fleshing out server handler implementation.
+ fc2a587: Started on the server
+
+2006-12-09 msoulier
+ aece5aa: Added --debug option to sample client.
+ 204cce4: Adding license
+ 4fc510b: Adding ChangeLog
+ 07e2976: Bumped the version.
+ 104dfe0: Changed the port variables to something more intelligent.
+ 15c5a0f: Fixing poor TID implementation.
+
+2006-10-25 msoulier
+ 8e6cd77: Added testcase for TftpPacketFactory.
+
+2006-10-13 msoulier
+ 7486502: Implemented retries on download timeouts.
+ 0528b1b: Added some info statements regarding option negotiation.
+ 4c73041: Updated testcases, fixed one error in decode_options
+
+2006-10-11 msoulier
+ f2b7d5d: Updated testcases
+ 837344c: Updated makefile
+ 08af50a: Adding makefile
+
+2006-10-10 msoulier
+ 99b3bbd: Moved LICENSE to COPYING
+
+2006-10-09 msoulier
+ 2e42f99: Added test for WRQ packet
+ 6ebd6fc: Fixed broken decode, and adjusted the client options.
+
+2006-10-08 msoulier
+ 6db1b2c: Starting on unit tests
+
+2006-10-05 msoulier
+ e771f67: Fixed handling of port
+ cb75a4b: Updating for production
+ 19e8f0f: Freezing 0.2
+ 0a13eb5: Fixed poor EOF detection
+ ed15161: Got variable blocksizes working.
+
+2006-10-04 msoulier
+ c24bba2: Added confirmation of incoming traffic to known remote host.
+ c11ac3a: Restructured in preparation for tftp options
+ 2827cf1: Updated README
+ c6094b0: Updated README
+ 09de253: Added seconds to logs
+ 82821e5: Upping version to 0.2
+ 88c387b: Added OACK packet, and factored-out client code.
diff --git a/bin/tftpy_client.py b/bin/tftpy_client.py
index 98758b6..53ad5f9 100755
--- a/bin/tftpy_client.py
+++ b/bin/tftpy_client.py
@@ -98,14 +98,14 @@ def main():
if not options.output:
options.output = os.path.basename(options.download)
tclient.download(options.download,
- options.output,
- progresshook)
+ options.output,
+ progresshook)
elif options.upload:
if not options.input:
options.input = os.path.basename(options.upload)
tclient.upload(options.upload,
- options.input,
- progresshook)
+ options.input,
+ progresshook)
except tftpy.TftpException, err:
sys.stderr.write("%s\n" % str(err))
sys.exit(1)
diff --git a/doc/index.rst b/doc/index.rst
index d9dec00..50e0d4d 100644
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -22,9 +22,37 @@ still work. Let me know if it doesn't.
Installation
============
+If you download the source distribution, you can simply use distutils to
+install, via::
+
+ python setup.py build
+ python setup.py install
+
+Or, as this has been uploaded to pypi, you can use easy_install or pip::
+
+ easy_install tftpy
+ pip install tftpy
+
+Once installed you should have the sample client and server scripts in bin,
+and you should be able to import the `tftpy` module.
Examples
========
+The simplest tftp client::
+
+ import tftpy
+
+ client = tftpy.TftpClient('tftp.digitaltorque.ca', 69)
+ client.download('remote_filename', 'local_filename')
+
+The simplest tftp server::
+
+ import tftpy
+
+ server = tftpy.TftpServer('/tftpboot')
+ server.listen('0.0.0.0', 69)
+
+See the sample client and server for slightly more complex examples.
API Documentation
=================
diff --git a/html/sphinx/_sources/index.txt b/html/sphinx/_sources/index.txt
index d9dec00..50e0d4d 100644
--- a/html/sphinx/_sources/index.txt
+++ b/html/sphinx/_sources/index.txt
@@ -22,9 +22,37 @@ still work. Let me know if it doesn't.
Installation
============
+If you download the source distribution, you can simply use distutils to
+install, via::
+
+ python setup.py build
+ python setup.py install
+
+Or, as this has been uploaded to pypi, you can use easy_install or pip::
+
+ easy_install tftpy
+ pip install tftpy
+
+Once installed you should have the sample client and server scripts in bin,
+and you should be able to import the `tftpy` module.
Examples
========
+The simplest tftp client::
+
+ import tftpy
+
+ client = tftpy.TftpClient('tftp.digitaltorque.ca', 69)
+ client.download('remote_filename', 'local_filename')
+
+The simplest tftp server::
+
+ import tftpy
+
+ server = tftpy.TftpServer('/tftpboot')
+ server.listen('0.0.0.0', 69)
+
+See the sample client and server for slightly more complex examples.
API Documentation
=================
diff --git a/html/sphinx/_static/default.css b/html/sphinx/_static/default.css
index 42ed6ec..3725744 100644
--- a/html/sphinx/_static/default.css
+++ b/html/sphinx/_static/default.css
@@ -166,6 +166,18 @@ div.admonition p.admonition-title + p {
display: inline;
}
+div.admonition p {
+ margin-bottom: 5px;
+}
+
+div.admonition pre {
+ margin-bottom: 5px;
+}
+
+div.admonition ul, div.admonition ol {
+ margin-bottom: 5px;
+}
+
div.note {
background-color: #eee;
border: 1px solid #ccc;
diff --git a/html/sphinx/genindex.html b/html/sphinx/genindex.html
index 67b8f85..fdda253 100644
--- a/html/sphinx/genindex.html
+++ b/html/sphinx/genindex.html
@@ -255,7 +255,7 @@
</div>
<div class="footer">
&copy; Copyright 2010, Michael P. Soulier.
- Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.4.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.5.
</div>
</body>
</html> \ No newline at end of file
diff --git a/html/sphinx/index.html b/html/sphinx/index.html
index 25a437a..0d74271 100644
--- a/html/sphinx/index.html
+++ b/html/sphinx/index.html
@@ -58,9 +58,35 @@ still work. Let me know if it doesn&#8217;t.</p>
</div>
<div class="section" id="installation">
<h1>Installation<a class="headerlink" href="#installation" title="Permalink to this headline">¶</a></h1>
+<p>If you download the source distribution, you can simply use distutils to
+install, via:</p>
+<div class="highlight-python"><pre>python setup.py build
+python setup.py install</pre>
+</div>
+<p>Or, as this has been uploaded to pypi, you can use easy_install or pip:</p>
+<div class="highlight-python"><pre>easy_install tftpy
+pip install tftpy</pre>
+</div>
+<p>Once installed you should have the sample client and server scripts in bin,
+and you should be able to import the <cite>tftpy</cite> module.</p>
</div>
<div class="section" id="examples">
<h1>Examples<a class="headerlink" href="#examples" title="Permalink to this headline">¶</a></h1>
+<p>The simplest tftp client:</p>
+<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">tftpy</span>
+
+<span class="n">client</span> <span class="o">=</span> <span class="n">tftpy</span><span class="o">.</span><span class="n">TftpClient</span><span class="p">(</span><span class="s">&#39;tftp.digitaltorque.ca&#39;</span><span class="p">,</span> <span class="mi">69</span><span class="p">)</span>
+<span class="n">client</span><span class="o">.</span><span class="n">download</span><span class="p">(</span><span class="s">&#39;remote_filename&#39;</span><span class="p">,</span> <span class="s">&#39;local_filename&#39;</span><span class="p">)</span>
+</pre></div>
+</div>
+<p>The simplest tftp server:</p>
+<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">tftpy</span>
+
+<span class="n">server</span> <span class="o">=</span> <span class="n">tftpy</span><span class="o">.</span><span class="n">TftpServer</span><span class="p">(</span><span class="s">&#39;/tftpboot&#39;</span><span class="p">)</span>
+<span class="n">server</span><span class="o">.</span><span class="n">listen</span><span class="p">(</span><span class="s">&#39;0.0.0.0&#39;</span><span class="p">,</span> <span class="mi">69</span><span class="p">)</span>
+</pre></div>
+</div>
+<p>See the sample client and server for slightly more complex examples.</p>
</div>
<div class="section" id="api-documentation">
<h1>API Documentation<a class="headerlink" href="#api-documentation" title="Permalink to this headline">¶</a></h1>
@@ -732,7 +758,7 @@ will commit to one of them once we interpret the initial packet.</p>
</div>
<div class="footer">
&copy; Copyright 2010, Michael P. Soulier.
- Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.4.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.5.
</div>
</body>
</html> \ No newline at end of file
diff --git a/html/sphinx/modindex.html b/html/sphinx/modindex.html
index 18e890b..119f7f7 100644
--- a/html/sphinx/modindex.html
+++ b/html/sphinx/modindex.html
@@ -118,7 +118,7 @@
</div>
<div class="footer">
&copy; Copyright 2010, Michael P. Soulier.
- Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.4.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.5.
</div>
</body>
</html> \ No newline at end of file
diff --git a/html/sphinx/search.html b/html/sphinx/search.html
index 59767e8..ff110ae 100644
--- a/html/sphinx/search.html
+++ b/html/sphinx/search.html
@@ -89,7 +89,7 @@
<div class="footer">
&copy; Copyright 2010, Michael P. Soulier.
- Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.4.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.5.
</div>
<script type="text/javascript" src="searchindex.js"></script>
diff --git a/html/sphinx/searchindex.js b/html/sphinx/searchindex.js
index a41fd75..39613ac 100644
--- a/html/sphinx/searchindex.js
+++ b/html/sphinx/searchindex.js
@@ -1 +1 @@
-Search.setIndex({desctypes:{"0":"method","1":"exception","2":"class","3":"attribute","4":"function"},terms:{all:0,concept:0,chain:0,tftpclient:0,code:0,last_upd:0,inaddr_ani:0,disk:0,readabl:0,send:0,fatal:0,sent:0,string:0,fals:0,faq:0,tftpstateserverstart:0,util:0,tri:0,tftpshare:0,tftpstateexpectdat:0,tftpexcept:0,setloglevel:0,list:0,upload:0,blocknumb:0,sync:0,pass:0,download:0,port:0,rrq:0,index:0,compar:0,section:0,tftppacketiniti:0,current:0,version:[],"new":0,method:0,next_block:0,full:0,gener:0,here:0,let:0,address:0,path:0,sinc:0,valu:0,wait:0,search:0,serveriniti:0,amount:0,loop:0,permit:0,action:0,chang:0,tftppacketdat:0,via:0,modul:0,filenam:0,"boolean":0,sendack:0,opcod:0,instal:0,from:0,two:0,next:0,call:0,value1:0,handl:0,msg:0,type:0,until:0,more:0,diamond:0,desir:0,tftpstateserverrecvrrq:0,indic:0,hold:0,must:0,none:0,valuen:0,setup:0,work:0,tftpsession:0,can:0,root:0,listenip:0,overrid:0,share:0,accept:0,alwai:0,end:0,goal:0,add_dup:0,write:0,pure:0,instead:0,negoti:0,opt1:0,updat:0,haven:0,after:0,mai:0,tftppacketrrq:0,data:0,alloc:0,optn:0,stdin:0,explicit:0,correspond:0,caus:0,receiv:0,callabl:0,order:0,tftpy:0,over:0,through:0,still:0,dynam:0,paramet:0,tftppackettyp:0,better:0,wrq:0,main:0,them:0,"return":0,thei:0,python:0,initi:0,dat:0,packethook:0,front:0,now:0,name:0,simpl:0,level:0,mode:0,timeout:0,each:0,found:0,mean:0,michael:[],tftpcontextclientdownload:0,expect:0,out:0,variabl:0,network:0,content:0,suitabl:0,tftppacketack:0,tftppacketwrq:0,tftpcontextclientupload:0,standard:0,base:0,dictionari:0,put:0,org:0,"byte":0,unwant:0,tftppacketwithopt:0,think:0,first:0,oper:0,directli:0,onc:0,number:0,alreadi:0,done:0,tftppacket:0,size:0,differ:0,unknown:0,messag:0,transitori:0,illeg:0,conveni:0,listen:0,udp:0,option:0,copi:0,specifi:0,part:0,pars:0,than:0,serv:0,keyword:0,remot:0,tftpstateserverrecvwrq:0,cleaner:0,rfc1350:0,argument:0,raw:0,tftppacketoack:0,tabl:[],need:0,self:0,violat:0,note:0,also:0,exampl:0,take:0,which:0,notset:0,singl:0,unless:0,buffer:0,object:0,reach:0,"class":0,don:0,request:0,doe:0,getter:0,pkt:0,session:0,find:0,setter:0,access:0,onli:0,configur:0,releas:[],should:0,dict:0,local:0,tftpassert:0,senddat:0,gethost:0,requir:0,resend:0,rfc:0,provid:0,common:0,contain:0,senderror:0,set:0,packet:0,see:0,result:0,respons:0,fail:0,tftpcontext:0,wire:0,hopefulli:0,someth:0,state:0,"import":0,parent:0,cycl:0,entir:0,popul:0,tftpmetric:0,handleoack:0,instanc:0,context:0,tftp:0,point:0,instanti:0,hyphen:0,arriv:0,dispatch:0,suppli:0,tftpstatesentrrq:0,throughout:0,quit:0,compos:0,been:0,destructor:0,interpret:0,dup:0,"abstract":0,soulier:[],ani:0,those:0,"case":0,ident:0,listenport:0,properti:0,defin:0,"while":0,error:0,errmsg:0,pack:0,decode_opt:0,stdout:0,metric:0,itself:0,rport:0,welcom:[],author:[],perform:0,make:0,same:0,binari:0,html:0,decod:0,document:0,complet:0,finish:0,http:0,tftpcontextserv:0,moment:0,rais:0,user:0,implement:0,ackd:0,appropri:0,off:0,checktimeout:0,inherit:0,client:0,thi:0,unchang:0,protocol:0,just:0,tftproot:0,easi:0,handledat:0,dyn_file_func:0,except:0,add:0,other:0,input:0,save:0,match:0,read:0,tftperror:0,know:0,opc:0,bit:0,like:0,specif:0,server:0,api:0,either:0,output:0,page:0,www:0,some:0,back:0,intern:0,librari:0,subclass:0,condit:0,run:0,host:0,oack:0,"throw":0,socket:0,ack:0,tftpstatesentwrq:0,manag:0,datagram:0,commit:0,block:0,own:0,encod:0,exceed:0,log:0,transfer:0,support:0,start:0,tftpstateexpectack:0,interfac:0,includ:0,"function":0,form:0,regard:0,tftppacketfactori:0,sethost:0,raddress:0,sendoack:0,match_opt:0,whether:0,tftppacketerr:0,creat:0,dure:0,doesn:0,repres:0,exist:0,file:0,check:0,when:0,refactor:0,"default":0,cleanup:0,sock_timeout:0,test:0,you:0,tftpstate:0,returnsupportedopt:0,directori:0,tftpboot:0,tftpserver:0,time:0,errorcod:0},titles:["TFTPy"],modules:{"tftpy.TftpServer":0,tftpy:0,"tftpy.TftpShared":0,"tftpy.TftpPacketTypes":0,"tftpy.TftpStates":0,"tftpy.TftpClient":0,"tftpy.TftpPacketFactory":0},descrefs:{"tftpy.TftpPacketFactory.TftpPacketFactory":{parse:[0,0]},"tftpy.TftpShared":{tftpassert:[0,4],setLogLevel:[0,4],TftpException:[0,1],TftpErrors:[0,2]},"tftpy.TftpStates.TftpContextServer":{start:[0,0],end:[0,0]},"tftpy.TftpStates":{TftpContextClientUpload:[0,2],TftpMetrics:[0,2],TftpContextServer:[0,2],TftpState:[0,2],TftpContextClientDownload:[0,2],TftpStateServerStart:[0,2],TftpStateServerRecvRRQ:[0,2],TftpStateExpectACK:[0,2],TftpStateSentWRQ:[0,2],TftpStateSentRRQ:[0,2],TftpStateExpectDAT:[0,2],TftpContext:[0,2],TftpStateServerRecvWRQ:[0,2]},"tftpy.TftpPacketFactory":{TftpPacketFactory:[0,2]},"tftpy.TftpServer":{TftpServer:[0,2]},"tftpy.TftpPacketTypes.TftpPacket":{encode:[0,0],decode:[0,0]},"tftpy.TftpStates.TftpContext":{end:[0,0],checkTimeout:[0,0],sethost:[0,0],host:[0,3],gethost:[0,0],cycle:[0,0]},"tftpy.TftpStates.TftpContextClientDownload":{start:[0,0],end:[0,0]},"tftpy.TftpServer.TftpServer":{listen:[0,0]},"tftpy.TftpStates.TftpMetrics":{add_dup:[0,0]},"tftpy.TftpStates.TftpStateServerRecvRRQ":{handle:[0,0]},"tftpy.TftpClient":{TftpClient:[0,2]},"tftpy.TftpStates.TftpStateExpectDAT":{handle:[0,0]},"tftpy.TftpStates.TftpStateExpectACK":{handle:[0,0]},"tftpy.TftpStates.TftpStateSentRRQ":{handle:[0,0]},"tftpy.TftpStates.TftpState":{sendError:[0,0],handle:[0,0],handleOACK:[0,0],handleDat:[0,0],serverInitial:[0,0],returnSupportedOptions:[0,0],sendACK:[0,0],sendOACK:[0,0],sendDAT:[0,0]},"tftpy.TftpStates.TftpStateServerStart":{handle:[0,0]},"tftpy.TftpStates.TftpStateSentWRQ":{handle:[0,0]},"tftpy.TftpStates.TftpContextClientUpload":{end:[0,0]},"tftpy.TftpPacketTypes.TftpPacketERR":{decode:[0,0],encode:[0,0]},"tftpy.TftpPacketTypes.TftpPacketInitial":{encode:[0,0]},"tftpy.TftpClient.TftpClient":{download:[0,0],upload:[0,0]},"tftpy.TftpPacketTypes":{TftpPacketDAT:[0,2],TftpPacketWRQ:[0,2],TftpPacketERR:[0,2],TftpSession:[0,2],TftpPacketWithOptions:[0,2],TftpPacketOACK:[0,2],TftpPacketACK:[0,2],TftpPacketRRQ:[0,2],TftpPacketInitial:[0,2],TftpPacket:[0,2]},"tftpy.TftpPacketTypes.TftpPacketWithOptions":{decode_options:[0,0]},"tftpy.TftpStates.TftpStateServerRecvWRQ":{handle:[0,0]},"tftpy.TftpPacketTypes.TftpPacketDAT":{encode:[0,0],decode:[0,0]},"tftpy.TftpPacketTypes.TftpPacketOACK":{match_options:[0,0]}},filenames:["index"]}) \ No newline at end of file
+Search.setIndex({desctypes:{"0":"method","1":"exception","2":"class","3":"attribute","4":"function"},terms:{all:0,code:0,chain:0,tftpclient:0,concept:0,last_upd:0,inaddr_ani:0,disk:0,local_filenam:0,readabl:0,send:0,fatal:0,sent:0,sourc:0,string:0,fals:0,faq:0,tftpstateserverstart:0,util:0,tri:0,tftpshare:0,tftpstateexpectdat:0,tftpexcept:0,setloglevel:0,list:0,upload:0,blocknumb:0,sync:0,pass:0,download:0,port:0,rrq:0,index:0,compar:0,section:0,abl:0,tftppacketiniti:0,current:0,"new":0,method:0,next_block:0,full:0,gener:0,here:0,let:0,address:0,path:0,sinc:0,valu:0,wait:0,search:0,serveriniti:0,amount:0,loop:0,permit:0,action:0,implement:0,tftppacketdat:0,via:0,modul:0,filenam:0,api:0,sendack:0,opcod:0,instal:0,from:0,two:0,next:0,call:0,value1:0,msg:0,type:0,until:0,more:0,diamond:0,desir:0,tftpstateserverrecvrrq:0,indic:0,hold:0,must:0,none:0,valuen:0,setup:0,work:0,tftpsession:0,can:0,root:0,listenip:0,overrid:0,share:0,accept:0,alwai:0,end:0,goal:0,add_dup:0,write:0,pure:0,instead:0,negoti:0,simpl:0,updat:0,haven:0,after:0,mai:0,tftppacketrrq:0,data:0,alloc:0,optn:0,stdin:0,explicit:0,correspond:0,caus:0,receiv:0,callabl:0,order:0,tftpy:0,over:0,through:0,still:0,dynam:0,paramet:0,remote_filenam:0,binari:0,tftppackettyp:0,better:0,complex:0,wrq:0,main:0,them:0,"return":0,thei:0,python:0,initi:0,dat:0,packethook:0,front:0,now:0,name:0,opt1:0,level:0,mode:0,timeout:0,each:0,found:0,mean:0,tftpcontextclientdownload:0,expect:0,out:0,variabl:0,network:0,content:0,suitabl:0,tftppacketack:0,tftppacketwrq:0,tftpcontextclientupload:0,standard:0,base:0,dictionari:0,put:0,org:0,"byte":0,unwant:0,tftppacketwithopt:0,think:0,first:0,oper:0,directli:0,onc:0,number:0,alreadi:0,done:0,tftppacket:0,size:0,differ:0,script:0,unknown:0,messag:0,transitori:0,illeg:0,conveni:0,listen:0,udp:0,option:0,copi:0,specifi:0,part:0,pars:0,than:0,serv:0,keyword:0,remot:0,tftpstateserverrecvwrq:0,cleaner:0,rfc1350:0,argument:0,raw:0,have:0,need:0,self:0,violat:0,note:0,also:0,client:0,take:0,which:0,notset:0,singl:0,unless:0,distribut:0,buffer:0,object:0,reach:0,"class":0,don:0,request:0,doe:0,getter:0,pkt:0,session:0,find:0,setter:0,access:0,onli:0,configur:0,should:0,dict:0,local:0,tftpassert:0,senddat:0,pypi:0,gethost:0,requir:0,resend:0,rfc:0,provid:0,common:0,contain:0,senderror:0,set:0,packet:0,see:0,result:0,respons:0,fail:0,tftpcontext:0,wire:0,hopefulli:0,someth:0,state:0,simplest:0,"import":0,parent:0,cycl:0,entir:0,popul:0,tftpmetric:0,handleoack:0,instanc:0,context:0,tftp:0,simpli:0,point:0,instanti:0,hyphen:0,arriv:0,dispatch:0,suppli:0,tftpstatesentrrq:0,throughout:0,quit:0,compos:0,been:0,destructor:0,interpret:0,dup:0,dure:0,ani:0,those:0,"case":0,ident:0,listenport:0,properti:0,defin:0,"while":0,error:0,errmsg:0,pack:0,tftppacketoack:0,stdout:0,metric:0,itself:0,rport:0,perform:0,make:0,same:0,handl:0,html:0,decod:0,document:0,complet:0,finish:0,http:0,tftpcontextserv:0,moment:0,rais:0,user:0,distutil:0,chang:0,ackd:0,appropri:0,off:0,checktimeout:0,inherit:0,exampl:0,thi:0,unchang:0,protocol:0,just:0,file:0,tftproot:0,easi:0,handledat:0,dyn_file_func:0,except:0,add:0,cleanup:0,input:0,save:0,match:0,build:0,bin:0,read:0,tftperror:0,know:0,opc:0,bit:0,like:0,specif:0,server:0,"boolean":0,either:0,output:0,page:0,www:0,some:0,back:0,intern:0,sampl:0,librari:0,subclass:0,condit:0,run:0,host:0,oack:0,"throw":0,socket:0,ack:0,tftpstatesentwrq:0,slightli:0,manag:0,datagram:0,commit:0,block:0,own:0,encod:0,easy_instal:0,log:0,transfer:0,support:0,start:0,tftpstateexpectack:0,interfac:0,includ:0,exceed:0,digitaltorqu:0,"function":0,form:0,regard:0,tftppacketfactori:0,sethost:0,raddress:0,sendoack:0,match_opt:0,whether:0,tftppacketerr:0,creat:0,"abstract":0,doesn:0,repres:0,exist:0,decode_opt:0,pip:0,check:0,when:0,refactor:0,"default":0,other:0,sock_timeout:0,test:0,you:0,tftpstate:0,returnsupportedopt:0,directori:0,tftpboot:0,tftpserver:0,time:0,errorcod:0},titles:["TFTPy"],modules:{"tftpy.TftpServer":0,tftpy:0,"tftpy.TftpShared":0,"tftpy.TftpPacketTypes":0,"tftpy.TftpStates":0,"tftpy.TftpClient":0,"tftpy.TftpPacketFactory":0},descrefs:{"tftpy.TftpPacketFactory.TftpPacketFactory":{parse:[0,0]},"tftpy.TftpShared":{tftpassert:[0,4],setLogLevel:[0,4],TftpException:[0,1],TftpErrors:[0,2]},"tftpy.TftpStates.TftpContextServer":{start:[0,0],end:[0,0]},"tftpy.TftpStates":{TftpContextClientUpload:[0,2],TftpMetrics:[0,2],TftpContextServer:[0,2],TftpState:[0,2],TftpContextClientDownload:[0,2],TftpStateServerStart:[0,2],TftpStateServerRecvRRQ:[0,2],TftpStateExpectACK:[0,2],TftpStateSentWRQ:[0,2],TftpStateSentRRQ:[0,2],TftpStateExpectDAT:[0,2],TftpContext:[0,2],TftpStateServerRecvWRQ:[0,2]},"tftpy.TftpPacketFactory":{TftpPacketFactory:[0,2]},"tftpy.TftpServer":{TftpServer:[0,2]},"tftpy.TftpPacketTypes.TftpPacket":{encode:[0,0],decode:[0,0]},"tftpy.TftpStates.TftpContext":{end:[0,0],checkTimeout:[0,0],sethost:[0,0],host:[0,3],gethost:[0,0],cycle:[0,0]},"tftpy.TftpStates.TftpContextClientDownload":{start:[0,0],end:[0,0]},"tftpy.TftpServer.TftpServer":{listen:[0,0]},"tftpy.TftpStates.TftpMetrics":{add_dup:[0,0]},"tftpy.TftpStates.TftpStateServerRecvRRQ":{handle:[0,0]},"tftpy.TftpClient":{TftpClient:[0,2]},"tftpy.TftpStates.TftpStateExpectDAT":{handle:[0,0]},"tftpy.TftpStates.TftpStateExpectACK":{handle:[0,0]},"tftpy.TftpStates.TftpStateSentRRQ":{handle:[0,0]},"tftpy.TftpStates.TftpState":{sendError:[0,0],handle:[0,0],handleOACK:[0,0],handleDat:[0,0],serverInitial:[0,0],returnSupportedOptions:[0,0],sendACK:[0,0],sendOACK:[0,0],sendDAT:[0,0]},"tftpy.TftpStates.TftpStateServerStart":{handle:[0,0]},"tftpy.TftpStates.TftpStateSentWRQ":{handle:[0,0]},"tftpy.TftpStates.TftpContextClientUpload":{end:[0,0]},"tftpy.TftpPacketTypes.TftpPacketERR":{decode:[0,0],encode:[0,0]},"tftpy.TftpPacketTypes.TftpPacketInitial":{encode:[0,0]},"tftpy.TftpClient.TftpClient":{download:[0,0],upload:[0,0]},"tftpy.TftpPacketTypes":{TftpPacketDAT:[0,2],TftpPacketWRQ:[0,2],TftpPacketERR:[0,2],TftpSession:[0,2],TftpPacketWithOptions:[0,2],TftpPacketOACK:[0,2],TftpPacketACK:[0,2],TftpPacketRRQ:[0,2],TftpPacketInitial:[0,2],TftpPacket:[0,2]},"tftpy.TftpPacketTypes.TftpPacketWithOptions":{decode_options:[0,0]},"tftpy.TftpStates.TftpStateServerRecvWRQ":{handle:[0,0]},"tftpy.TftpPacketTypes.TftpPacketDAT":{encode:[0,0],decode:[0,0]},"tftpy.TftpPacketTypes.TftpPacketOACK":{match_options:[0,0]}},filenames:["index"]}) \ No newline at end of file
diff --git a/setup.py b/setup.py
index e67fe82..974ada1 100644
--- a/setup.py
+++ b/setup.py
@@ -3,7 +3,7 @@
from distutils.core import setup
setup(name='tftpy',
- version='0.5.0',
+ version='0.5.1',
description='Python TFTP library',
author='Michael P. Soulier',
author_email='msoulier@digitaltorque.ca',