New patches: [New credit file entry francois@ctrlaltdel.ch**20081114140548] { hunk ./CREDITS 54 +N: François Deppierraz +D: bug fix, testing +E: francois@ctrlaltdel.ch + } Context: [CLI: add 'tahoe stats', to run start-deep-stats and print the results warner@allmydata.com**20081114014350] [test_system.py: fix new 'tahoe manifest' tests to not break on windows, by providing --node-directory instead of --node-url warner@allmydata.com**20081113212748] [test for bug #534, unicode filenames francois@ctrlaltdel.ch**20081113111951 This test assure that uploading a file whose name contains unicode character doesn't prevent further uploads in the same directory. ] [Fix an filename encoding issue with "tahoe cp" francois@ctrlaltdel.ch**20081111200803] [web/info.py: use 128-bit ophandles instead of 64-bit warner@allmydata.com**20081113021842] [CLI: add 'tahoe manifest', which takes a directory and returns a list of things you can reach from it warner@allmydata.com**20081113021725] [create_node.py: also remove now-unused import of pkg_resources warner@allmydata.com**20081113004716] [tahoe.cfg: add tub.location, to override the location hints we include in our FURL. This replaces advertised_ip_addresses, which doesn't remain useful enough to retain it. Helps with #517 (Tor). warner@allmydata.com**20081113004458] [setup: remove pkg_resources.require() from create_node.py and add it to runner.py zooko@zooko.com**20081112212503 Ignore-this: 763324202456a59b833b14eb4027171 Brian correctly points out that the latter is an entry point. ] [docs: fix cutnpasto in source:docs/logging.txt zooko@zooko.com**19700105140422 Ignore-this: de0f9ceb8e0ca4c158492ad2f9a6ba6f ] [tests: fix comment zooko@zooko.com**19700105101055 Ignore-this: fabedea917895568b1fca75a480111b9 ] [tests: add tahoe_cp to the list of scripts that we don't actually have tests for yet zooko@zooko.com**19700105100058 Ignore-this: ac89583992fb1b48d9a4680344569d91 ] [setup: the .tac files created by create_node.py call pkg_resources.require() so that they can load tahoe and twisted packages which were installed with setuptools multi-version mode zooko@zooko.com**19700101235005 Ignore-this: e1db03f86e0407a91087d8ada6b477fd Also the create_node.py script itself uses pkg_resources.require() for the same reason. ] [web/info: don't let an unrecoverable file break the page (show ? instead of a size) warner@allmydata.com**20081107045117] [checker: add is_recoverable() to checker results, make our stub immutable-verifier not throw an exception on unrecoverable files, add tests warner@allmydata.com**20081107043547] [monitor: update interface definition: get_status() can return a Failure warner@allmydata.com**20081107035452] [web/operations.py: if the operation failed, render the Failure warner@allmydata.com**20081107035309] [undoing test change for native_client.php secorp@allmydata.com**20081106220310] [NEWS: more minor edits warner@allmydata.com**20081106223517] [NEWS: minor edits warner@allmydata.com**20081106223356] [NEWS: mention SFTP server warner@allmydata.com**20081106014153] [client.py: oops, update FTP/SFTP config names to match current docs warner@allmydata.com**20081106013442] [remove duplicate+old docs/NEWS. The top-level NEWS file is the canonical one. warner@allmydata.com**20081106013224] [SFTP/FTP: merge user/account code, merge docs warner@allmydata.com**20081106012558] [docs: move webapi/ftp/sftp into a new frontends/ directory warner@allmydata.com**20081105233050] [ftp/sftp: move to a new frontends/ directory in preparation for factoring out password-auth component warner@allmydata.com**20081105200733] [sftpd: minor debug-logging tweak warner@allmydata.com**20081105194511] [confwiz.py - trying out a new configuration site secorp@allmydata.com**20081105011830] [ftpd: include an (unused) avatar logout callback warner@allmydata.com**20081105000104] [#531: implement an SFTP frontend. Mostly works, still lots of debug messages. Still needs tests and auth-by-pubkey in accounts.file warner@allmydata.com**20081105000022] [docs/ftp.txt: correct Twisted dependency: we don't need VFS, we can use a release, as long as you apply the patch warner@allmydata.com**20081104235840] [shebang: replace "/usr/bin/python" with "/usr/bin/env python" zooko@zooko.com**20081105000306 Ignore-this: 8ae33a8a7828fa7423422e252f2cfd74 ] [misc/fixshebangs.py zooko@zooko.com**20081105000130 Ignore-this: 13b03ea2d2ed8982f8346a827b46bd2e ] [util: copy in pyutil.fileutil.ReopenableNamedTemporaryFile zooko@zooko.com**20081104234715 Ignore-this: f1131e9b8f249b5f10be4cba2aeb6118 ] [immutable: tolerate filenode.read() with a size= that's too big, rather than hanging warner@allmydata.com**20081104212919] [util: copy in nummedobj from pyutil zooko@zooko.com**20081104195550] [util: copy in dictutil from pyutil zooko@zooko.com**20081104195327] [rollback change... move allmydatacontextmenu registration to installer.tmpl in tahoe-w32-client\installer booker@allmydata.com**20081103213647] [register the AllmydataContextMenu.dll for the context menu handler file sharing shell extension booker@allmydata.com**20081103200027] [debug catalog-shares: tolerate even more errors on bad files/directories warner@allmydata.com**20081030215447] [NEWS: update with all user-visible changes since the last update warner@allmydata.com**20081030213604] [#527: expire the cached files that are used to support Range: headers, every hour, when the file is unused and older than an hour warner@allmydata.com**20081030203909] [util/cachedir.py: add a cache-directory manager class, which expires+deletes unused files after a while warner@allmydata.com**20081030200120] [test_cli: try to fix windows again warner@allmydata.com**20081030193204] [debug/test_cli: fix error handling for catalog-shares, to make the test stop failing on windows warner@allmydata.com**20081030190651] [web: add 'Repair' button to checker results when they indicate unhealthyness. Also add the object's uri to the CheckerResults instance. warner@allmydata.com**20081030010917] [create_node.py: add 'web.static = public_html' to the initial tahoe.cfg warner@allmydata.com**20081030001336] [webapi: serve the /static URL tree from /public_html (configurable) warner@allmydata.com**20081029223431] [catalog-shares command: tolerate errors, log them to stderr, handle v2-immutable shares warner@allmydata.com**20081029221010] [test_web.py: one more line of test coverage warner@allmydata.com**20081029050015] [test_web: improve test coverage of PUT DIRURL t=uri replace=false warner@allmydata.com**20081029045744] [web: test (and fix) PUT DIRURL t=uri, which replaces a directory in-place with some other cap warner@allmydata.com**20081029045446] [web/directory.py: slight shuffle to improve test coverage warner@allmydata.com**20081029045406] [test_client.py: improve test coverage a bit warner@allmydata.com**20081029044335] [node.py: remove unused old_log() function warner@allmydata.com**20081029043558] [node.py: remove support for the old BASEDIR/authorized_keys.PORT file warner@allmydata.com**20081029043420] [move testutil into test/common_util.py, since it doesn't count as 'code under test' for our pyflakes numbers warner@allmydata.com**20081029042831] [util: move PollMixin to a separate file (pollmixin.py), so testutil can be moved into test/ warner@allmydata.com**20081029041548] [control.py: removed unused testutil.PollMixin warner@allmydata.com**20081029040359] [web/filenode: oops, fix test failures, not everything has a storage index warner@allmydata.com**20081029011720] [web/filenode: add Accept-Ranges and ETag (for immutable files) headers to GET responses warner@allmydata.com**20081029010103] [#527: respond to GETs with early ranges quickly, without waiting for the whole file to download. Fixes the alacrity problems with the earlier code. Still needs cache expiration. warner@allmydata.com**20081029005618] [#527: support HTTP 'Range:' requests, using a cachefile. Adds filenode.read(consumer, offset, size) method. Still needs: cache expiration, reduced alacrity. warner@lothar.com**20081028204104] [iputil.py: avoid a DNS lookup at startup (which may timeout tests when run on a partially-offline host) by using 198.41.0.4 instead of A.ROOT-SERVERS.NET warner@lothar.com**20081028203646] [interfaces.py: promote immutable.encode.NotEnoughSharesError.. it isn't just for immutable files any more warner@lothar.com**20081027203449] [interfaces.IMutableFileNode.download_best_version(): fix return value warner@lothar.com**20081027202046] [dirnode lookup: use distinct NoSuchChildError instead of the generic KeyError when a child can't be found warner@lothar.com**20081027201525] [storage: don't use colons in the corruption-advisory filename, since windows can't tolerate them warner@lothar.com**20081026024633] [mutable: call remove_advise_corrupt_share when we see share corruption in mapupdate/download/check, tolerate servers that do not implement it warner@lothar.com**20081024202128] [storage: add remote_advise_corrupt_share, for clients to tell storage servers about share corruption that they've discovered. The server logs the report. warner@lothar.com**20081024185248] [mutable/servermap.py: fix needs_merge(), it was incorrectly claiming that mixed shares with distinct seqnums needed a merge, causing repair(force=False) to fail warner@lothar.com**20081024040024] [test_web.test_POST_DIRURL_deepcheck: confirm that /operations/HANDLE/ works with or without the slash warner@lothar.com**20081024021759] [web/checker_results.py: remove dead code warner@lothar.com**20081024001717] [test_web: more test coverage warner@lothar.com**20081024001118] [webapi: fix t=rename from==to, it used to delete the file warner@lothar.com**20081023233236] [test_system: update test to match web checker results warner@lothar.com**20081023233202] [webapi deep-check: show the root as , rather than an empty path string warner@lothar.com**20081023230359] [mutable/checker: announce the mapupdate op on the 'recent uploads+downloads' page warner@lothar.com**20081023230319] [scripts/create_node.py: remove empty-string defaults for --introducer= and --nickname= warner@lothar.com**20081023230235] [deep-check: add webapi links to detailed per-file/dir results warner@lothar.com**20081023230031] [interface.py: fix typo warner@lothar.com**20081023225936] [webapi: make the /operations/ 't=status' qualifier optional, remove it from examples warner@lothar.com**20081023225658] [setup: require the latest version of the setuptools bootstrap egg zooko@zooko.com**20081025152858 Ignore-this: c0c9923ba3008f410d5cc56f2236edb9 ] [setup: include _pkgutil.py in setuptools bootstrap egg so that it will work on Python 2.4 zooko@zooko.com**20081025152839 Ignore-this: 38d81a037c1a3413d69d580ccb13fd67 ] [setup: pretend the tahoe requires twisted to set up, so that twisted will be there for nevow zooko@zooko.com**20081025135042 Ignore-this: 4e6c7e580f7e30df571e2e63be663734 ] [setup: require the SVN snapshot of setuptools to build zooko@zooko.com**20081025134959 Ignore-this: f68077dd10d85a71a1e06678365e6753 ] [setup: remove old bundled setuptools-0.6c9 zooko@zooko.com**20081025134947 Ignore-this: 3a95dd72346a60b39ffd6ddfadd1b3a8 ] [setup: bundle an SVN snapshot of setuptools instead of the most recent stable release of setuptools zooko@zooko.com**20081025134837 Ignore-this: 9a0c9a34b186b972650cf9455edb0d28 This SVN snapshot fixes a problem that prevents the setting up of nevow: http://bugs.python.org/setuptools/issue20 ] [setup: reorder dependencies to be sort of increasing order of how much they depend on other stuff zooko@zooko.com**20081025134739 Ignore-this: 6d636aaf5deb37cbf18172824b0bbf87 Not that the order makes any different to how it gets installed, as far as I can tell. ] [docs: add a note that when you make a new tahoe release, you should send the announcement to fuse-devel@lists.sourceforge.net zooko@zooko.com**20081023213658] [web/info.py: fix 'Check This Object' link, for files it was checking the parent directory by mistake warner@lothar.com**20081022171056] [#514: add meta-refresh=60 tag to t=status page for incomplete operations warner@lothar.com**20081022164842] [test_dirnode.py: oops, missed a Monitor(), unbreak tests warner@lothar.com**20081022085054] [immutable/filenode.py: add TODO note about the #514 monitor to check(), rather than going through the checker/verifier code and adding it, since Zooko is currently working on that code warner@lothar.com**20081022084237] [more #514: pass a Monitor to all checker operations, make mutable-checker honor the cancel flag warner@lothar.com**20081022083818] [dirnode.py: check for cancel during deep-traverse operations, and don't initiate any new ones if we've been cancelled. Gets us closer to #514. warner@lothar.com**20081022075552] [more #514 log-webop status/cancel: add handle-expiration, test coverage warner@lothar.com**20081022051354] [webapi.txt: improve t=deep-size output docs warner@lothar.com**20081022005331] [#514: improve test coverage warner@lothar.com**20081022005256] [Change deep-size/stats/check/manifest to a start+poll model instead of a single long-running synchronous operation. No cancel or handle-expiration yet. #514. warner@lothar.com**20081022000307] [setup: change ez_setup.py to install setuptools-0.6c9 zooko@zooko.com**20080930200502] [setup: bundle setuptools-0.6c9 zooko@zooko.com**20080930200448] [setup: remove bundled setuptools-0.6c8 zooko@zooko.com**20080930200336] [setup: remove the developer note about doing without GNU make (the GNU make requirement is about to hurt Peter if he tries to follow this doc, by the way) zooko@zooko.com**20081021163200 add classifiers showing with which versions of Python it is known to work. ] [* fuse/runtests: added --catch-up-pause option robk-tahoe@allmydata.com**20081021002902 On linux, write tests are failing because data written to fuse isn't showing up in tahoe by the time it's checked. it's not clear where this is originating, since the fuse implementation [should be] waiting for completion of tahoe operations before returning from its calls. This adds an option to control the duration of a pause between the fuse write and the check of tahoe, which is by default set to 2s on linux, which - somewhat inexplicably - seems to 'fix' the problem, in as far as it allows tests to complete. ] [fuse/runtests: include length in drepr() output robk-tahoe@allmydata.com**20081021000159] [fuse/runtests: make exceptions in 'read_in_random_order' into TestFailures robk-tahoe@allmydata.com**20081020235235] [fuse/blackmatch: added asynchronous (background) file download robk-tahoe@allmydata.com**20081020233333 previously, upon opening a file for reading, the open() call would block while the entire file was retrieved from tahoe into the cache directory. This change adds a DownloaderWithReadQueue class, and associated plumbing, such that an open() will return promptly with the download initiated 'in the background'. Subsequent read() operations will block until enough data has been downloaded to satisfy that request. This provides a behaviour similar to streaming, i.e. the client application will be able to read data from the fuse interface while the remainder of the file is still being downloaded. ] [fuse/runtests: added 'read_in_random_order' test robk-tahoe@allmydata.com**20081020232427 this test uploads a test file to tahoe, and then reads the file from fuse, but reads the blocks of the file in a random order; this is designed to exercise the asynchronous download feature of blackmatch - where the file is downloaded from tahoe asynchronously, and rather than blocking open() for the entirety of the download, instead individual read() calls are blocked until enough of the file has been downloaded to satisfy them ] [fuse/runtests: added a --no-cleanup option robk-tahoe@allmydata.com**20081020155120 the code had a 'fullcleanup' flag internally which controlled whether working directories were cleaned up. this promotes that to a command line option (negated) '--no-cleanup' defaulting to False, i.e. do cleanup ] [fuse/runtests: truncate expected file contents in reported error message robk-tahoe@allmydata.com**20081020144523 this avoids dumping the repr of 1Mb of random data to stdout in the event of a test failure, but rather just dumps the start/end of the errant strings if the amount of data is > 200 chars repr'd ] [fuse/blackmatch: fix platform specific problems in repr_flags robk-tahoe@allmydata.com**20081020143052 the repr_flags debug/logging function had a list of fields from the os module that might be passed into an open() call, but it included at least one which was available on the mac but not on linux. symmetrically linux has numerous flags which are not present on the mac. the repr_flags function is now tolerant of flags not being present, and has an expanded list of flags ] [makefile: added 'fuse-test' target to makefile, to run 'runtests' robk-tahoe@allmydata.com**20081019132518] [fuse/runtests: added a 'todo' flag, surpressing failure for implementations not expected to pass robk-tahoe@allmydata.com**20081019131600 since the current tests assume that the implementation responds to changes made to tahoe after mount, and impl_b prefetches and cached directory data, impl_b fails the current 'read' test suite. rather than reflect that problem in the overall failure of the runtests exit code, this adds a 'todo' flag to the implementations table, and sets the todo flag for impl_b. Thus errors will therein be reported in output, but not cause a failing exit code. ] [fuse/runtests: made runtests exit code depend on success robk-tahoe@allmydata.com**20081017180058 return an exit code of 0 only if no tests failed, and 1 in the case of linkage error, test setup failure, or individual test case failure ] [storage.py: assert that immutable share size will fit in the 4-byte v1 container (see #346). The struct module in py2.4 raises an error on overflow, but py2.5 merely emits a warning warner@lothar.com**20081020172208] [NEWS: update to summarize all changes since the last update warner@lothar.com**20081020164047] [fuse/runtest: make removal of webport file soft robk-tahoe@allmydata.com**20081017030154 previously the runtests suite removed the webport file created by tahoe create-client in all but the first node. now that the node config is in tahoe.cfg by default this file might not exist. ] [fuse/blackmatch: update json handling to support simplejson v2 robk-tahoe@allmydata.com**20081017025931 simplejson v2 returns strings as either unicode or str, depending upon its mood. thus the interpretation of the node's json repr of a directory, and the serialisation of strings in the json based rpc both exploded when built against simplejson v2. this makes both of these places liberal in their acceptance of either str or unicode. ] [fuse/blackmatch: log exception in server startup robk-tahoe@allmydata.com**20081017014650 humphf. my build runs the fuse stuff fine, but the build from the buildslave doesn't seem to start up properly. hopefully this will elicit some useful info ] [fuse/blackmatch: add readability to some logging, fix a permissions problem robk-tahoe@allmydata.com**20081017004421 adds a couple of functions to unpack 'mode' and 'flags' for open() calls, to facilitate debugging. adds a fix to ensure that all tmp files created for writing are opened with permissions 0600 - one problem I had with testing with the Finder was that files were being opened write only (0200) and were then failing to upload to tahoe due to internal permission denied errors. there remain a variety of problems with finder access which I'm unable to comprehend at this time. sometimes copies to tahoe will work fine, sometimes they yield "the finder cannot complete the operation because some data ... could not be read or written. (Error code -36)" sometimes "You may need to enter the name and password for an administrator on this computer to change the item" sometimes "The operation cannot be completed because an item with the name ... already exists." and sometimes "The operation cannot be completed because the item ... is locked." What seems to be absent is rhyme or reason. unix operations (cp, mv) work fine, rsync works fine. ] [fuse/blackmatch: fix linkage problems with daemonize robk-tahoe@allmydata.com**20081016163637 the daemonize() function imported from twisted was causing problems when run from a frozen (py2app) build. I simply copied the daemonize function into this file, and that fixes the problem. also removed a couple of lines of debugging spam that slipped through. ] [gui/macapp: minor bugfixes robk-tahoe@allmydata.com**20081016163052 though it seemed to work before the 'fstype' passed to fuse of 'allmydata' was today throwing errors that len(fstype) must be at most 7. fixed a typo in changes to 'mount_filesystem()' args bumped the delay between mounting a filesystem and 'open'ing it in Finder to 4s, as it seems to take a little longer to mount now the client and server fuse processes need to coordinate. ] [fuse/blackmatch: split into client/server (twisted server) robk-tahoe@allmydata.com**20081016150846 This implements a client/server split for blackmatch, where the client implements the fuse_main bindings and a simple blocking rpc client mechanism. The server implements the other half of that rpc mechanism, and contains all the actual logic for interpreting fuse requests in the context of the on disk cache and requests to the tahoe node. The server is based on a twisted reactor. The rpc mechanism implements a simple method dispatch including marshalling, using json, of basic inert data types, in a flat namespace (no objects). The client side is written in a blocking idiom, to interface with the threading model used by the fuse_main bindings, whereas the server side is written for a twisted reactor-based environment, intended to facilitate implementing more sophisticated logic in that paradigm. The two communicate over a unix domain socket, allocated within the nodedir. Command line usage is unchanged; the server is launched automatically by the client. The server daemonizes itself, to avoid preventing the original parent process (e.g. 'runtests') from waiting upon the server exiting. The client keeps open a 'keepalive' connection to the server; upon loss thereof the server will exit. This addresses the fact that the python-fuse bindings provide no notification of exit of the client process upon unmount. The client thus provides a relatively thin 'shim' proxying requests from the fuse_main bindings across the rpc to the server process, which handles the logic behind each request. For the time being, a '--no-split' option is provided to surpress the splitting into client/server, yielding the prior behaviour. Once the server logic gets more complex and more entrenched in a twisted idiom, this might be removed. The 'runtests' test harness currently tests both modes, as 'impl_c' and 'impl_c_no_split' ] [fuse/blackmatch: 'flatten' the fuse api implementation robk-tahoe@allmydata.com**20081016143547 the previous revision of blackmatch used a file_class to delegate all fuse api operations on files to a specific per-file class, which is an option given by the python-fuse bindings. this is a pre-cursor to the 'split' client/server version, which uses a simple, moreover flat, rpc mechanism to broker access to methods. ] [fuse/runtests: disable impl_a/impl_b on mac, as they don't actually work. robk-tahoe@allmydata.com**20081016143232] [fuse/runtests: added write_partial_overwrite test robk-tahoe@allmydata.com**20081016142926 this tests opening a file for update, overwriting a small part of it, and ensuring that the end result constitutes an overwrite of the original file. This tests, e.g. the implementation doesn' open a 'fresh' file but does in fact initialise the file to be uploaded with the contents of any extant file before applying updates ] [fuse/runtests: added --tests, renamed --suites robk-tahoe@allmydata.com**20081016142836 changed the --tests option to be --suites, as it takes a prefix, e.g. 'read' 'write' (or 'all', the default) and runs those suites which are applicable to each implementation being tested. added a --tests option, which takes a list of tests, e.g. 'read_file_contents' 'write_overlapping_large_writes' and runs all tests specified without regard to whether the implementation(s) under test are declared to support them. this is basically to allow a specific test or two to be run, saving time during development and debugging by not running the entire suite ] [fuse/runtests: added 'random scatter' write test robk-tahoe@allmydata.com**20081003233436 this writes the test file in a randomised order, with randomly sized writes. also for each 'slice' of the file written, a randomly chosen overlapping write is also made to the file. this ensures that the file will be written in its entirety in a thoroughly random order, with many overlapping writes. ] [fuse/runtests: add overlapping write tests robk-tahoe@allmydata.com**20081003224833 using both small and large blocksizes for writes, write a 1Mb file to fuse where every write overlaps another. This serves a useful purpose - in manual testing of blackmatch some time ago most operations e.g. bulk copies, worked fine, but using rsync caused data corruption on most files. it turned out to be that rsync writes in 64K blocks, but rather than making the last block short, the last block instead overlaps the preceding (already written) block. This revealed a problem where cache files were being opened 'append' rather than 'write' and hence the overlapping write to the fuse layer caused the overlapping portion of the file to be duplicated in cache, leading to oversized and corrupt files being uploaded. ] [fuse/runtests: remove write small file test, as it's subsumed by the tiny_file test robk-tahoe@allmydata.com**20081003223944] [fuse/runtests: added linear write tests for various block sizes robk-tahoe@allmydata.com**20081003223550 unit tests to test writing contiguous blocks linearly through the file, for a variety of block sizes; 'tiny_file' is an entire file fitting within a single io block / write operation. 'linear_{small,large}_writes' test a 1Mb file written with each write operation containing significantly less or more, respecitvely, data than fuse will pass into the implementation as a single operation (which on the mac at least is 64Kib) ] [fuse/runtests: add a very simple 'write' test robk-tahoe@allmydata.com**20081003172044 this performs a very simple write through the fuse layer and confirms that the file is stored correctly into the tahoe mesh. ('simple' in the sense that the entire file body fits trivially in a single write() operation, disk block etc) ] [fuse/runtests: added a --web-open option robk-tahoe@allmydata.com**20081003172026 similar to the --debug-wait option which causes the test harness to pause at various stages of the process to facilitate debugging, this option simplifies that debugging by automatically opening a web browser to the root dir of that implementation's tests when tests are commenced. in addition, if --web-open is specfied but --debug-wait is not, the harness will still pause after running tests but before tearing down the tahoe grid - this allows all tests to run to completion, but provide a debugging hook to investigate the end state of the grid's contents thereafter. ] [fuse/impl_a: fix a suspected bug in caching robk-tahoe@allmydata.com**20081003171309 from my examination of the tahoe_fuse ('impl_a') code, it looks like the intention is to cache the file contents in memory while it's open, since it does in fact do that. however it looks like it also ignored that cache entirely, and made an individual tahoe webapi GET request for each and every read() operation regardless of the relative size of the read block and the file in question. this changes that to make read() use the data in memory rather than fetch the data over again. if there's something more subtle going on, please let me know. ] [gui/macapp: slew of code cleanup; unmount filesystems on quit robk-tahoe@allmydata.com**20080925233235 a handful of code cleanup, renaming and refactoring. basically consolidating 'application logic' (mount/unmount fs) into the 'MacGuiApp' class (the wx.App) and cleaning up various scoping things around that. renamed all references to 'app' to refer more clearly to the 'AppContainer' or to the guiapp. globally renamed basedir -> nodedir also made the guiapp keep a note of each filesystem it mounts, and unmount them upon 'quit' so as to cleanup the user's environment before the tahoe node vanishes from out underneath the orphaned tahoe fuse processes ] [gui/macapp: make submenu of aliases for 'webopen' robk-tahoe@allmydata.com**20080925163919 this changes the 'open webroot' menu item to be a submenu listing all aliases defined in ~/.tahoe. Note that the dock menu does not support submenus, so it only offers a single 'open webroot' option for the default tahoe: alias. I had trouble with this at first and concluded that the submenus didn't work, and made it a distinct 'WebUI' menu in it's own right. on further inspection, there are still problems but they seem to be something like once the dock menu has been used, sometimes the app's main menubar menus will cease to function, and this happens regardless of whether submenus or plain simple menus are used. I have no idea what the peoblem is, but it's not submenu specific. ] [repairer: fix flaw in testutil.flip_one_bit() that Brian pointed out zooko@zooko.com**20081016194848] [misc/incident-gatherer: add classify_tahoe.py: a foolscap incident-gatherer classification plugin warner@allmydata.com**20081015220940] [repairer: test all different kinds of corruption that can happen to share files on disk zooko@zooko.com**20081014230920] [util/time_format.py: accept space separator, add unit tests warner@allmydata.com**20081013225258] [test_storage: use different filenames, poor stupid windows warner@allmydata.com**20081010021139] [scripts/debug.py: emit the immutable-share version number, tolerate v2 warner@allmydata.com**20081010013422] [storage.py: improve some precondition() error messages warner@allmydata.com**20081010011425] [storage: introduce v2 immutable shares, with 8-byte offsets fields, to remove two of the three size limitations in #346. This code handles v2 shares but does not generate them. We'll make a release with this v2-tolerance, wait a while, then make a second release that actually generates v2 shares, to avoid compatibility problems. warner@allmydata.com**20081010011327] [debug.py: oops, add missing import for ReadBucketProxy warner@allmydata.com**20081010002922] [storage: split WriteBucketProxy and ReadBucketProxy out into immutable/layout.py . No behavioral changes. warner@allmydata.com**20081010000800] [interfaces: loosen a few max-size constraints which would limit us to a mere 1.09 TB maximum file size zooko@zooko.com**20081009191357 These constraints were originally intended to protect against attacks on the storage server protocol layer which exhaust memory in the peer. However, defending against that sort of DoS is hard -- probably it isn't completely achieved -- and it costs development time to think about it, and it sometimes imposes limits on legitimate users which we don't necessarily want to impose. So, for now we forget about limiting the amount of RAM that a foolscap peer can cause you to start using. ] [util/limiter: add a repr warner@allmydata.com**20081007201945] [dirnode.build_manifest: include node.list in the limiter, that's the most important thing to slow down warner@allmydata.com**20081007201929] [web/directory: t=manifest output=html: make the caps into clickable hrefs warner@allmydata.com**20081007201845] [web/directory: factor out the get_root function warner@allmydata.com**20081007201742] [web/directory.py: remove unused imports warner@allmydata.com**20081007194820] [test_web: deep-size is more variable than I thought, so assert less warner@allmydata.com**20081007051147] [web: change t=manifest to return a list of (path,read/writecap) tuples, instead of a list of verifycaps. Add output=html,text,json. warner@allmydata.com**20081007043618] [web: rewrite t=deep-size in terms of deep-stats, update test to match inclusion of directory sizes warner@allmydata.com**20081007043539] [ftpd: hush pyflakes warner@allmydata.com**20081007014513] [ftpd: make sure we're using a patched/fixed Twisted, to avoid confusion later warner@allmydata.com**20081007011411] [ftp: change the twisted hack necessary for async-write-close, to one more agreeable to the twisted-dev folks, add a copy of the necessary patch to docs/ftp.txt warner@allmydata.com**20081007010605] [ftpd: remove debug messages warner@allmydata.com**20081006231620] [ftpd: add native_client.php -based HTTP authentication scheme warner@allmydata.com**20081006231511] [ftpd: add ftp.accounts checker, remove InMemoryPasswordChecker warner@allmydata.com**20081006225124] [test_system: add test coverage for immutable download.ConsumerAdapter, remove debug messages warner@allmydata.com**20081006225037] [ftp server: initial implementation. Still needs unit tests, custom Twisted patches. For #512 warner@allmydata.com**20081006195236] [test_cli.py: remove unused imports warner@allmydata.com**20081007004204] [CLI: remove 'tahoe admin generate-keypair', since the pycryptopp ecdsa API is about to change incompatibly. We'll undo this once pycryptopp is updated warner@allmydata.com**20081007002320] [docs: update architecture.txt 's section on the vdrive a.k.a. filesystem layer zooko@zooko.com**20081006210500 Remove some obsolete parts (correct at the time, now incorrect), change terminology to reflect my preference: s/vdrive/filesystem/ and s/dirnode/directory/, and make a few other small changes. ] [dirnode: fix my remarkably-consistent 'metdadata' typo warner@allmydata.com**20081003010845] [interfaces: fix minor typo warner@allmydata.com**20081003005249] [dirnode: add get_child_and_metadata_at_path warner@allmydata.com**20081003005203] [stop using 'as' as an identifier: as with 'with', 'as' has become a reserved word in python 2.6 warner@allmydata.com**20081003002749] [scripts/admin: split up generate_keypair code so that unit tests can use it more easily warner@allmydata.com**20081001235238] [docs: add some notes about things to do for a Tahoe release on pypi, freshmeat, and launchpad zooko@zooko.com**20081001210703] [misc/cpu-watcher.tac: use writeaside-and-rename for the history.pickle file warner@allmydata.com**20081001003053] [misc/spacetime: use async polling so we can add a 60-second timeout, add an index to the 'url' Axiom column for 2x speedup warner@allmydata.com**20080930233448] [#518: replace various BASEDIR/* config files with a single BASEDIR/tahoe.cfg, with backwards-compatibility of course warner@allmydata.com**20080930232149] [tolerate simplejson-2.0.0 and newer, which frequently return bytestrings instead of unicode objects. Closes #523 warner@allmydata.com**20080930222106] [munin/tahoe_doomsday: oops, tolerate 'null' in the timeleft results, to unbreak the 2wk/4wk graphs warner@allmydata.com**20080930202051] [test_node: improve coverage of advertised_ip_addresses a bit warner@allmydata.com**20080930060816] [testutil.PollMixin: set default timeout (to 100s), emit a more helpful error when the timeout is hit warner@allmydata.com**20080930052309] [repair: fix test to map from storage index to directory structure properly (thanks, cygwin buildbot, for being so kloodgey that you won't accept random binary filenames and thus making me notice this bug) zooko@zooko.com**20080926224913] [repairer: assert that the test code isn't accidentally allowing the repairer code which is being tested to do impossible things zooko@zooko.com**20080926222353] [repairer: enhance the repairer tests zooko@zooko.com**20080926174719 Make sure the file can actually be downloaded afterward, that it used one of the deleted and then repaired shares to do so, and that it repairs from multiple deletions at once (without using more than a reasonable amount of calls to storage server allocate). ] [netstring: add required_trailer= argument warner@allmydata.com**20080926165754] [test_netstring.py: move netstring tests to a separate file warner@allmydata.com**20080926165526] [move netstring() and split_netstring() into a separate util.netstring module warner@allmydata.com**20080926043824] [repairer: remove a test that doesn't apply to the repair-from-corruption case zooko@zooko.com**20080925220954] [repairer: add a test that repairer fixes corrupted shares (in addition to the test that it fixes deleted shares) zooko@zooko.com**20080925220712] [docs: proposed mutable file crypto design with ECDSA, 96-bit private keys, and semi-private keys (from http://allmydata.org/~zooko/lafs.pdf ) zooko@zooko.com**20080925213457] [docs: mutable file crypto design (from http://allmydata.org/~zooko/lafs.pdf ) zooko@zooko.com**20080925213433] [repairer: fix swapped docstrings; thanks Brian zooko@zooko.com**20080925182436] [trivial: remove unused imports; thanks, pyflakes zooko@zooko.com**20080925180422] [trivial: remove unused imports -- thanks, pyflakes zooko@zooko.com**20080925173453] [repairer: add basic test of repairer, move tests of immutable checker/repairer from test_system to test_immutable_checker, remove obsolete test helper code from test_filenode zooko@zooko.com**20080925171653 Hm... "Checker" ought to be renamed to "CheckerRepairer" or "Repairer" at some point... ] [setup: remove a few minimal unit tests from test_filenode which have been obviated by much better tests in test_mutable and test_system zooko@zooko.com**20080925161544] [gui/macapp: rough cut of ui tweaks; configurability, auto-mount robk-tahoe@allmydata.com**20080925141224 chatting with peter, two things the mac gui needed were the ability to mount the 'allmydata drive' automatically upon launching the app, and open the Finder to reveal it. (also a request to hide the debug 'open webroot' stuff) this (somewhat rough) patch implements all the above as default behaviour it also contains a quick configuration mechanism for the gui - rather than a preferences gui, running with a more 'tahoe' styled mechanism, the contents of a few optional files can modify the default behaviour, specifically file in ~/.tahoe/gui.conf control behaviour as follows: auto-mount (bool): if set (the default) then the mac app will, upon launch automatically mount the 'tahoe:' alias with the display name 'Allmydata' using a mountpoint of ~/.tahoe/mnt/__auto__ auto-open (bool): if set (the default) then upon mounting a file system (including the auto-mount if set) finder will be opened to the mountpoint of the filesystem, which essentially reveals the newly mounted drive in a Finder window show-webopen (bool): if set (false by default) then the 'open webroot' action will be made available in both the dock and file menus of the app daemon-timout (int): sets the daemon-timeout option passed into tahoe fuse when a filesystem is mounted. this defaults to 5 min files of type (int) much, naturally contain a parsable int representation. files of type (bool) are considered true if their (case-insensitive) contents are any of ['y', 'yes', 'true', 'on', '1'] and considered false otherwise. ] [gui/macapp: improve 'about' box robk-tahoe@allmydata.com**20080925135415 adds exactly 1 metric dollop of professionalism to the previously rather amateurish looking about box. ] [fuse/impl_c: UNDO --auto-fsid option robk-tahoe@allmydata.com**20080925134730 rolling back: Thu Sep 25 14:42:23 BST 2008 robk-tahoe@allmydata.com * fuse/impl_c: add --auto-fsid option this was inspired by reading the fuse docs and discovering the 'fsid' option to fuse_main, and was _intended_ to support a sort of 'stability' to the filesystem (specifically derived from the root-uri mounted, whether directly or via an alias) to support mac aliases across unmount/remount etc. some experimentation shows that that doesn't actually work, and that, at least for mac aliases in my testing, they're tied to path-to-mountpoint and not to the fsid - which seems to have no bearing. perhaps the 'local' flag is causing weirdness therein. at any rate, I'm recording it simply for posterity, in case it turns out to be useful after all somewhere down the road. M ./contrib/fuse/impl_c/blackmatch.py +13 ] [fuse/impl_c: add --auto-fsid option robk-tahoe@allmydata.com**20080925134223 this was inspired by reading the fuse docs and discovering the 'fsid' option to fuse_main, and was _intended_ to support a sort of 'stability' to the filesystem (specifically derived from the root-uri mounted, whether directly or via an alias) to support mac aliases across unmount/remount etc. some experimentation shows that that doesn't actually work, and that, at least for mac aliases in my testing, they're tied to path-to-mountpoint and not to the fsid - which seems to have no bearing. perhaps the 'local' flag is causing weirdness therein. at any rate, I'm recording it simply for posterity, in case it turns out to be useful after all somewhere down the road. ] [manhole: be more tolerant of authorized_keys. files in .tahoe robk-tahoe@allmydata.com**20080925031149 both peter and I independently tried to do the same thing to eliminate the authorized_keys file which was causing problems with the broken mac build (c.f. #522) namely mv authorized_keys.8223{,.bak} but the node is, ahem, let's say 'intolerant' of the trailing .bak - rather than disable the manhole as one might expect, it instead causes the node to explode on startup. this patch makes it skip over anything that doesn't pass the 'parse this trailing stuff as an int' test. ] [fuse/impl_c: move mac tahoefuse impl out into contrib/fuse robk-tahoe@allmydata.com**20080925014214 For a variety of reasons, high amongst them the fact that many people interested in fuse support for tahoe seem to have missed its existence, the existing fuse implementation for tahoe, previously 'mac/tahoefuse.py' has been renamed and moved. It was suggested that, even though the mac build depends upon it, that the mac/tahoefuse implementation be moved into contrib/fuse along with the other fuse implementations. The fact that it's not as extensively covered by unit tests as mainline tahoe was given as corroboration. In a bid to try and stem the confusion inherent in having tahoe_fuse, tfuse and tahoefuse jumbled together (not necessarily helped by referring to them as impl_a, b and c respectively) I'm hereby renaming tahoefuse as 'blackmatch' (black match is, per wikipedia "a type of crude fuse" hey, I'm a punny guy) Maybe one day it'll be promoted to be 'quickmatch' instead... Anyway, this patch moves mac/tahoefuse.py out to contrib/fuse/impl_c/ as blackmatch.py, and makes appropriate changes to the mac build process to transclude blackmatch therein. this leaves the extant fuse.py and fuseparts business in mac/ as-is and doesn't attempt to address such issues in contrib/fuse/impl_c. it is left as an exercise to the reader (or the reader of a message to follow) as to how to deal with the 'fuse' python module on the mac. as of this time, blackmatch should work on both mac and linux, and passes the four extant tests in runtests. (fwiw neither impl_a nor impl_b have I managed to get working on the mac yet) since blackmatch supports a read-write and caching fuse interface to tahoe, some write tests obviously need to be added to runtests. ] [macapp: changes to support aliases, updated tahoefuse command line options robk-tahoe@allmydata.com**20080925010128 the tahoefuse command line options changed to support the runtests harness, and as part of that gained support for named aliases via --alias this changes the mac app's invocation of tahoefuse to match that, and also changes the gui to present the list of defined aliases as valid mounts this replaces the previous logic which examined the ~/.tahoe/private directory looking for files ending in '.cap' - an ad-hoc alias mechanism. if a file is found matching ~/.tahoe/private/ALIASNAME.icns then that will still be passed to tahoefuse as the icon to display for that filesystem. if no such file is found, the allmydata icon will be used by default. the '-olocal' option is passed to tahoefuse. this is potentially contentious. specifically this is telling the OS that this is a 'local' filesystem, which is intended to be used to locally attached devices. however leopard (OSX 10.5) will only display non-local filesystems in the Finder's side bar if they are of fs types specifically known by Finder to be network file systems (nfs, cifs, webdav, afp) hence the -olocal flag is the only way on leopard to cause finder to display the mounted filesystem in the sidebar, but it displays as a 'device'. there is a potential (i.e. the fuse docs carry warnings) that this may cause vague and unspecified undesirable behaviour. (c.f. http://code.google.com/p/macfuse/wiki/FAQ specifically Q4.3 and Q4.1) ] [fuse/impl_c: reworking of mac/tahoefuse, command line options, test integration robk-tahoe@allmydata.com**20080925001535 a handful of changes to the tahoefuse implementation used by the mac build, to make command line option parsing more flexible and robust, and moreover to facilitate integration of this implementation with the 'runtests' test harness used to test the other two implementations. this patch includes; - improvements to command line option parsing [ see below ] - support for 'aliases' akin to other tahoe tools - tweaks to support linux (ubuntu hardy) the linux support tweaks are, or at least seem to be, a result of the fact that hardy ships with fuse 0.2pre3, as opposed to the fuse0.2 that macfuse is based upon. at least the versions I was working with have discrepencies in their interfaces, but on reflection this is probably a 'python-fuse' version issue rather than fuse per se. At any rate, the fixes to handling the Stat objects should be safe against either version, it's just that the bindings on hardy lacked code that was in the 'fuse' python module on the mac... command line options: the need for more flexible invocation in support of the runtests harness led me to rework the argument parsing from some simple positional hacks with a pass-through of the remainder to the fuse binding's 'fuse_main' to a system using twisted.usage to parse arguments, and having just one option '-o' being explicitly a pass-through for -o options to fuse_main. the options are now: --node-directory NODEDIR : this is used to look up the node-url to connect to if that's not specified concretely on the command line, and also used to determine the location of the cache directory used by the implementation, specifically '_cache' within the nodedir. default value: ~/.tahoe --node-url NODEURL : specify a node-url taking precendence over that found in the node.url file within the nodedir --alias ALIAS : specifies the named alias should be mounted. a lookup is performed in the alias table within 'nodedir' to find the root dir cap the named alias must exist in the alias table of the specified nodedir --root-uri ROOTURI : specifies that the given directory uri should be mounted at least one of --alias and --root-uri must be given (which directory to mount must be specified somehow) if both are given --alias takes precedence. --cache-timeout TIMEOUTSECS : specifies the number of seconds that cached directory data should be considered valid for. this tahoefuse implementation implements directory caching for a limited time; largely because the mac (i.e. the Finder in particular) tends to make a large number of requests in quick successsion when browsing the filesystem. on the flip side, the 'runtests' unit tests fail in the face of such caching because the changes made to the underlying tahoe directories are not reflected in the fuse presentation. by specifying a cache-timeout of 0 seconds, runtests can force the fuse layer into refetching directory data upon each request. any number of -oname=value options may be specified on the command line, and they will all be passed into the underlying fuse_main call. a single non-optional argument, the mountpoint, must also be given. ] [fuse/tests: slew of changes to fuse 'runtests' robk-tahoe@allmydata.com**20080924183601 This patch makes a significant number of changes to the fuse 'runtests' script which stem from my efforts to integrate the third fuse implementation into this framework. Perhaps not all were necessary to that end, and I beg nejucomo's forebearance if I got too carried away. - cleaned up the blank lines; imho blank lines should be empty - made the unmount command switch based on platform, since macfuse just uses 'umount' not the 'fusermount' command (which doesn't exist) - made the expected working dir for runtests the contrib/fuse dir, not the top-level tahoe source tree - see also discussion of --path-to-tahoe below - significantly reworked the ImplProcManager class. rather than subclassing for each fuse implementation to be tested, the new version is based on instantiating objects and providing relevant config info to the constructor. this was motivated by a desire to eliminate the duplication of similar but subtly different code between instances, framed by consideration of increasing the number of platforms and implementations involved. each implementation to test is thus reduced to the pertinent import and an entry in the 'implementations' table defining how to handle that implementation. this also provides a way to specify which sets of tests to run for each implementation, more on that below. - significantly reworked the command line options parsing, using twisted.usage; what used to be a single optional argument is now represented by the --test-type option which allows one to choose between running unittests, the system tests, or both. the --implementations option allows for a specific (comma-separated) list of implemenations to be tested, or the default 'all' the --tests option allows for a specific (comma-separated) list of tests sets to be run, or the default 'all'. note that only the intersection of tests requested on the command line and tests relevant to each implementation will be run. see below for more on tests sets. the --path-to-tahoe open allows for the path to the 'tahoe' executable to be specified. it defaults to '../../bin/tahoe' which is the location of the tahoe script in the source tree relative to the contrib/fuse dir by default. the --tmp-dir option controls where temporary directories (and hence mountpoints) are created during the test. this defaults to /tmp - a change from the previous behaviour of using the system default dir for calls to tempfile.mkdtemp(), a behaviour which can be obtained by providing an empty value, e.g. "--tmp-dir=" the --debug-wait flag causes the test runner to pause waiting upon user input at various stages through the testing, which facilitates debugging e.g. by allowing the user to open a browser and explore or modify the contents of the ephemeral grid after it has been instantiated but before tests are run, or make environmental adjustments before actually triggering fuse mounts etc. note that the webapi url for the first client node is printed out upon its startup to facilitate this sort of debugging also. - the default tmp dir was changed, and made configurable. previously the default behaviour of tempfile.mkdtemp() was used. it turns out that, at least on the mac, that led to temporary directories to be created in a location which ultimately led to mountpoint paths longer than could be handled by macfuse - specifically mounted filesystems could not be unmounted and would 'leak'. by changing the default location to be rooted at /tmp this leads to mountpoint paths short enough to be supported without problems. - tests are now grouped into 'sets' by method name prefix. all the existing tests have been moved into the 'read' set, i.e. with method names starting 'test_read_'. this is intended to facilitate the fact that some implementations are read-only, and some support write, so the applicability of tests will vary by implementation. the 'implementations' table, which governs the configuration of the ImplProcManager responsible for a given implementation, provides a list of 'test' (i.e test set names) which are applicable to that implementation. note no 'write' tests yet exist, this is merely laying the groundwork. - the 'expected output' of the tahoe command, which is checked for 'surprising' output by regex match, can be confused by spurious output from libraries. specfically, testing on the mac produced a warning message about zope interface resolution various multiple eggs. the 'check_tahoe_output()' function now has a list of 'ignorable_lines' (each a regex) which will be discarded before the remainder of the output of the tahoe script is matched against expectation. - cleaned up a typo, and a few spurious imports caught by pyflakes ] [fuse/impl_{a,b}: improve node-url handling robk-tahoe@allmydata.com**20080924182854 specifically change the expectation of the code to be such that the node-url (self.url) always includes the trailing slash to be a correctly formed url moreover read the node-url from the 'node.url' file found in the node 'basedir' and only if that doesn't exist, then fall back to reading the 'webport' file from therein and assuming localhost. This then supports the general tahoe pattern that tools needing only a webapi server can be pointed at a directory containing the node.url file, which can optionally point to another server, rather than requiring a complete node dir and locally running node instance. ] [fuse/impl_b: tweaks from testing on hardy robk-tahoe@allmydata.com**20080924180738 from testing on linux (specifically ubuntu hardy) the libfuse dll has a different name, specifically libfuse.so.2. this patch tries libfuse.so and then falls back to trying .2 if the former fails. it also changes the unmount behaviour, to simply return from the handler's loop_forever() loop upon being unmounted, rather than raising an EOFError, since none of the client code I looked at actually handled that exception, but did seem to expect to fall off of main() when loop_forever() returned. Additionally, from my testing unmount typically led to an OSError from the fuse fd read, rather than an empty read, as the code seemed to expect. also removed a spurious import pyflakes quibbled about. ] [setup: fix site-dirs to find system installed twisted on mac. robk-tahoe@allmydata.com**20080924174255 zooko helped me unravel a build weirdness today. somehow the system installed twisted (/System/Library) was pulling in parts of the other twisted (/Library) which had been installed by easy_install, and exploding. getting rid of the latter helped, but it took this change to get the tahoe build to stop trying to rebuild twisted and instead use the one that was already installed. c.f. tkt #229 ] [CLI: rework webopen, and moreover its tests w.r.t. path handling robk-tahoe@allmydata.com**20080924164523 in the recent reconciliation of webopen patches, I wound up adjusting webopen to 'pass through' the state of the trailing slash on the given argument to the resultant url passed to the browser. this change removes the requirement that arguments must be directories, and allows webopen to be used with files. it also broke the tests that assumed that webopen would always normalise the url to have a trailing slash. in fixing the tests, I realised that, IMHO, there's something deeply awry with the way tahoe handles paths; specifically in the combination of '/' being the name of the root path within an alias, but a leading slash on paths, e.g. 'alias:/path', is catagorically incorrect. i.e. 'tahoe:' == 'tahoe:/' == '/' but 'tahoe:/foo' is an invalid path, and must be 'tahoe:foo' I wound up making the internals of webopen simply spot a 'path' of '/' and smash it to '', which 'fixes' webopen to match the behaviour of tahoe's path handling elsewhere, but that special case sort of points to the weirdness. (fwiw, I personally found the fact that the leading / in a path was disallowed to be weird - I'm just used to seeing paths qualified by the leading / I guess - so in a debate about normalising path handling I'd vote to include the /) ] [CLI: reconcile webopen changes robk-tahoe@allmydata.com**20080924152002 I think this is largely attributable to a cleanup patch I'd made which never got committed upstream somehow, but at any rate various conflicting changes to webopen had been made. This cleans up the conflicts therein, and hopefully brings 'tahoe webopen' in line with other cli commands. ] [cli: cleanup webopen command robk-tahoe@allmydata.com**20080618201940 moved the body of webopen out of cli.py into tahoe_webopen.py made its invocation consistent with the other cli commands, most notably replacing its 'vdrive path' with the same alias parsing, allowing usage such as 'tahoe webopen private:Pictures/xti' ] [macapp: changed to remove 'Tahoe' from .app name robk-tahoe@allmydata.com**20080611003145 Change the build product from 'Allmydata Tahoe' to 'Allmydata' more inkeeping with the branding of the Allmydata product ] [add --syslog argument to 'tahoe start' and 'tahoe restart', used to pass --syslog to twistd for non-Tahoe nodes (like cpu-watcher) warner@allmydata.com**20080925010302] [misc/make-canary-files.py: tool to create 'canary files', explained in the docstring warner@allmydata.com**20080925004716] [webapi: survive slashes in filenames better: make t=info and t=delete to work, and let t=rename fix the problem warner@allmydata.com**20080924203505] [setup: when detecting platform, ask the Python Standard Library's platform.dist() before executing lsb_release, and cache the result in global (module) variables zooko@zooko.com**20080924180922 This should make it sufficiently fast, while still giving a better answer on Ubuntu than platform.dist() currently does, and also falling back to lsb_release if platform.dist() says that it doesn't know. ] [node.py: add BASEDIR/keepalive_timeout and BASEDIR/disconnect_timeout, to set/enable the foolscap timers, for #521 warner@allmydata.com**20080924175112] [setup: stop catching EnvironmentError when attempting to copy ./_auto_deps.py to ./src/allmydata/_auto_deps.py zooko@zooko.com**20080924000402 It is no longer the case that we can run okay without _auto_deps.py being in place in ./src/allmydata, so if that cp fails then the build should fail. ] [immutable: remove unused imports (thanks, pyflakes) zooko@zooko.com**20080923192610] [immutable: refactor immutable filenodes and comparison thereof zooko@zooko.com**20080923185249 * the two kinds of immutable filenode now have a common base class * they store only an instance of their URI, not both an instance and a string * they delegate comparison to that instance ] [setup: try parsing /etc/lsb-release first, then invoking lsb_release, because the latter takes half-a-second on my workstation, which is too long zooko@zooko.com**20080923171431 Also because in some cases the former will work and the latter won't. This patch also tightens the regexes so it won't match random junk. ] [setup: fix a cut-and-paste error in the fallback to parsing /etc/lsb-release zooko@zooko.com**20080923165551] [setup: if executing lsb_release doesn't work, fall back to parsing /etc/lsb-release before falling back to platform.dist() zooko@zooko.com**20080923162858 An explanatio of why we do it this way is in the docstring. ] [setup: if invoking lsb_release doesn't work (which it doesn't on our etch buildslave), then fall back to the Python Standard Library's platform.dist() function zooko@zooko.com**20080923154820] [setup: fix bug in recent patch to use allmydata.get_package_versions() to tell the foolscap app-version-tracking what's what zooko@zooko.com**20080923001347] [setup: when using the foolscap "what versions are here?" feature, use allmydata.get_package_versions() instead of specifically importing allmydata, pycryptopp, and zfec zooko@zooko.com**20080923000351] [setup: simplify the implementation of allmydata.get_package_versions() and add "platform" which is a human-oriented summary of the underlying operating system and machine zooko@zooko.com**20080922235354] [misc/make_umid: change docs, make elisp code easier to grab warner@lothar.com**20080920183933] [use foolscap's new app_versions API, require foolscap-0.3.1 warner@lothar.com**20080920183853] [BASEDIR/nickname is now UTF-8 encoded warner@lothar.com**20080920183713] [various: use util.log.err instead of twisted.log.err, so we get both Incidents and trial-test-flunking warner@lothar.com**20080920173545] [logging.txt: explain how to put log.err at the end of Deferred chains, explain FLOGTOTWISTED=1 warner@lothar.com**20080920173500] [util.log: send log.err to Twisted too, so that Trial tests are flunked warner@lothar.com**20080920173427] [setup.py trial: improve --verbose suggestion a bit warner@lothar.com**20080919193922] [test_cli: disable generate-keypair test on OS-X, pycryptopp still has a bug warner@lothar.com**20080919193855] [NEWS: finish editing for the upcoming 1.3.0 release warner@lothar.com**20080919193053] [NEWS: more edits, almost done warner@lothar.com**20080919010036] [NEWS: describe all changes since the last release. Still needs editing. warner@lothar.com**20080919002755] [CLI: add 'tahoe admin generate-keypair' command warner@lothar.com**20080919001133] [web: add 'more info' pages for files and directories, move URI/checker-buttons/deep-size/etc off to them warner@lothar.com**20080918050041] [setup.py: remove unused 'Extension' import warner@lothar.com**20080917230829] [setup.py,Makefile: move the 'chmod +x bin/tahoe' into setup.py warner@lothar.com**20080917230756] [docs/install.html: reference InstallDetails instead of debian-specific stuff warner@lothar.com**20080917225742] [Makefile,docs: tahoe-deps.tar.gz now lives in separate source/deps/ directory on http://allmydata.org warner@lothar.com**20080917204452] [docs: mention -SUMO tarballs, point users at release tarballs instead of development ones warner@lothar.com**20080917203631] [setup.py,Makefile: teat sdist --sumo about tahoe-deps/, use -SUMO suffix on tarballs, add sumo to 'make tarballs' target warner@lothar.com**20080917200119] [.darcs-boringfile ignore tahoe-deps and tahoe-deps.tar.gz warner@lothar.com**20080917195938] [docs: add a note about the process of making a new Tahoe release zooko@zooko.com**20080917170839] [Makefile: pyutil from a dependent lib causes a #455-ish problem, the workaround is to run build-once *three* times warner@lothar.com**20080917053643] [Makefile: desert-island: don't re-fetch tahoe-deps.tar.gz if it's already there, remove the tahoe-deps/ before untarring directory to avoid unpacking weirdness warner@lothar.com**20080917052204] [misc/check-build.py: ignore the 'Downloading file:..' line that occurs for the setup_requires= -triggered handling of the setuptools egg warner@lothar.com**20080917051725] [#249: add 'test-desert-island', to assert that a tahoe-deps.tar.gz -enabled build does not download anything warner@lothar.com**20080917013702] [#249: get dependent libs from tahoe-deps and ../tahoe-deps warner@lothar.com**20080917013627] [#249: move dependent libs out of misc/dependencies/, get them from tahoe-deps.tar.gz instead warner@allmydata.com**20080917012545] [conf_wiz.py - updating version numbers in file, should really get these from a TAG or conf file secorp@allmydata.com**20080917004547] [webish: add an extra newline to JSON output warner@lothar.com**20080915204314] [windows/Makefile: fix dependencies: windows-installer must cause windows-exe to run warner@allmydata.com**20080912052151] [Makefile: fix windows issues warner@allmydata.com**20080912050919] [Makefile: use run_with_pythonpath, move windows targets into a separate Makefile warner@allmydata.com**20080912044508] [setup.py: add 'setup.py run_with_pythonpath', to run other commands with PYTHONPATH set usefully warner@allmydata.com**20080912044418] [Makefile: convert check-auto-deps target into 'setup.py check_auto_deps' warner@allmydata.com**20080912035904] [startstop_node.py: find twistd in our supportlib if we had to build Twisted as a setuptools dependency. This is a form of cgalvan's #505 patch, simplified because now 'setup.py trial' takes care of sys.path and PYTHONPATH warner@allmydata.com**20080912025138] [rewrite parts of the Makefile in setup.py. Add 'build_tahoe' and 'trial' subcommands. warner@allmydata.com**20080912010321 The 'make build' target now runs 'setup.py build_tahoe', which figures out where the target 'supportlib' directory should go, and invokes 'setup.py develop' with the appropriate arguments. The 'make test' target now runs 'setup.py trial', which manages sys.path and runs trial as a subroutine instead of spawning an external process. This simplifies the case where Twisted was built as a dependent library (and thus the 'trial' executable is not on PATH). setup.py now manages sys.path and PYTHONPATH for its internal subcommands, so the $(PP) prefix was removed from all Makefile targets that invoke setup.py . For the remaining ones, the 'setup.py -q show_pythonpath' subcommand was added to compute this prefix with python rather than with fragile shell/Makefile syntax. ] [bin/tahoe: reflow error messages warner@allmydata.com**20080912010225] [mac/Makefile: remove the verbose hdiutil diagnostics now that we resolved the problem warner@allmydata.com**20080912004622] [Makefile: give setup.py develop a '--site-dirs' arg to work around the #249 setuptools bug which causes us to unnecessarily rebuild pyopenssl and other support libs installed via debian's python-support. Should be harmless on other platforms. warner@allmydata.com**20080910233432] [web: fix output=JSON, add buttons for repair/json to the 'run deep-check' form warner@allmydata.com**20080910211137] [disallow deep-check on non-directories, simplifies the code a bit warner@allmydata.com**20080910204458] [dirnode: refactor recursive-traversal methods, add stats to deep_check() method results and t=deep-check webapi warner@lothar.com**20080910084504] [dirnode: cleanup, make get_verifier() always return a URI instance, not a string warner@lothar.com**20080910083755] [test_system: check t=deep-stats too warner@lothar.com**20080910065457] [test_system: add deep-check-JSON tests, fix a bug warner@lothar.com**20080910061416] [test_system: oops, re-enable some tests that got bypassed warner@lothar.com**20080910060245] [test_system: add deep-stats test warner@lothar.com**20080910055634] [hush pyflakes warner@allmydata.com**20080910025017] [checker results: add output=JSON to webapi, add tests, clean up APIs warner@allmydata.com**20080910024517 to make the internal ones use binary strings (nodeid, storage index) and the web/JSON ones use base32-encoded strings. The immutable verifier is still incomplete (it returns imaginary healty results). ] [immutable verifier: provide some dummy results so deep-check works, make the tests ignore these results until we finish it off warner@allmydata.com**20080910010827] [mutable checker: even more tests. Everything in ICheckerResults should be covered now, except for immutable-verify which is incomplete warner@allmydata.com**20080910005706] [checker results: more tests, update interface docs warner@allmydata.com**20080910003010] [mutable checker: oops, fix redefinition of 'healthy' (numshares < N, not numshares < k, which is 'recoverable' not 'healthy') warner@allmydata.com**20080910002853] [checker results: more tests, more results. immutable verifier tests are disabled until they emit more complete results warner@allmydata.com**20080910001546] [checker: add tests, add stub for immutable check_and_repair warner@allmydata.com**20080909233449] [interfaces.py: minor improvement to IDirectoryNode.set_node warner@allmydata.com**20080909233416] [mac/Makefile: upload the .dmg file with foolscap xfer-client.py instead of scp warner@allmydata.com**20080908231943] [misc/xfer-client.py: small foolscap utility to transfer a file to a waiting server warner@allmydata.com**20080908231903] [setup: add excited DEVELOPER NOTE to install.html zooko@zooko.com**20080908215603 It should be removed before 1.3.0 release, of course... ] [setup: edit the text of install.html zooko@zooko.com**20080908215549] [setup: add link to the DownloadDebianPackages page zooko@zooko.com**20080908215451 Because I want that link off of the front page of the wiki... ] [setup: change URL from which to get source tarballs zooko@zooko.com**20080908215409 So that when you look at that directory you won't see distracting other things such as darcs repositories. ] [test_system: make log() tolerate the format= form warner@lothar.com**20080908030336] [immutable/checker: make log() tolerate the format= form warner@lothar.com**20080908030308] [checker: overhaul checker results, split check/check_and_repair into separate methods, improve web displays warner@allmydata.com**20080907194456] [webapi.txt: explain that t=manifest gives verifycaps warner@allmydata.com**20080907192950] [introducer: add get_nickname_for_peerid warner@allmydata.com**20080906050700] [docs/logging.txt: explain tahoe/foolscap logging. Addresses #239. warner@allmydata.com**20080904002531] [setup: don't assert that trial is present when the Makefile is evaluated zooko@zooko.com**20080903171837 This should fix #506, but it means that if (for some weird reason) Twisted can't be auto-installed and the find_trial.py script doesn't work, the user will get a weird failure message instead of a clean failure message explaining that trial couldn't be found. Oh well. Chris Galvan is working on a much nicer fix to all these issues -- see #505. ] [testutil.PollMixin: use a custom exception (and convert it) to avoid the ugly 'stash' cycle warner@allmydata.com**20080903033251] [mac/Makefile: more attempts to debug the buildslave failure warner@allmydata.com**20080829220614] [mac: add -verbose to the hdiutil call, to figure out why it's failing on the buildslave warner@allmydata.com**20080829205243] [setup: simplify parsing of python version number zooko@zooko.com**20080829000045] [setup: emit the version of python in the list of versions zooko@zooko.com**20080828220454] [munin: add tahoe_diskleft plugin, update spacetime/diskwatcher.tac to support it warner@allmydata.com**20080828203236] [docs: how_to_make_a_tahoe_release.txt zooko@zooko.com**20080828202109 Just some cryptic notes to self, but if I get hit by a truck then someone else might be able to decode them. ] [debian: include misc/cpu-watcher.tac in the debian package warner@allmydata.com**20080827223026] [munin/tahoe_doomsday: change the graph title, 'time predictor' is more accurate than 'space predictor' warner@allmydata.com**20080827213013] [munin/tahoe_diskusage: clip the graph at zero, to prevent transient negative excursions (such as when a lot of old logfiles are deleted from a storage server's disk) from scaling the graph into unusability warner@allmydata.com**20080827193543] [CREDITS: thanks to Chris Galvan zooko@zooko.com**20080827183950] [setup: patch from Chris Galvan to build sdists with no deps in them normally, but include deps if --sumo zooko@zooko.com**20080827182644] [servermap: don't log late arrivals, and don't log DeadReferenceError at log.WEIRD warner@allmydata.com**20080827003729] [mutable: make mutable-repair work for non-verifier runs, add tests warner@allmydata.com**20080826233454] [mutable: remove work-around for a flaw in an older version of foolscap zooko@zooko.com**20080826155055 We now require "foolscap[secure_connections] >= 0.3.0", per [source:_auto_deps.py]. ] [docs: edit install.html a tad zooko@zooko.com**20080826154929] [misc/make_umid: little script and elisp fragment to insert umid= arguments warner@allmydata.com**20080826015918] [logging: add 'unique-message-ids' (or 'umids') to each WEIRD-or-higher log.msg call, to make it easier to correlate log message with source code warner@allmydata.com**20080826015759] [logging cleanups: lower DeadReferenceError from WEIRD (which provokes Incidents) to merely UNUSUAL, don't pre-format Failures in others warner@allmydata.com**20080826005155] [checker: make the log() function of SimpleCHKFileVerifier compatible with the log() function of its superclasses and subclasses zooko@zooko.com**20080825214407] [docs: warn that the "garbage-collection and accounting" section of architecture.txt is out of date, and clarify that "deleted" therein means ciphertext getting garbage-collected zooko@zooko.com**20080822154605] [docs/filesystem-notes.txt: add notes about enabling the 'directory index' feature on ext3 filesystems for storage server lookup speed warner@allmydata.com**20080821205901] [setup: doc string describing what the require_auto_deps() function is for zooko@zooko.com**20080815172234] [mutable/checker: log a WEIRD-level event when we see a hash failure, to trigger an Incident warner@allmydata.com**20080813035020] [immutable checker: add a status_report field warner@allmydata.com**20080813033530] [mutable/servermap: lower the priority of many log messages warner@allmydata.com**20080813033506] [web/deep-check: show the webapi runtime at the bottom of the page warner@allmydata.com**20080813033426] [CLI: tolerate blank lines in the aliases file warner@allmydata.com**20080813025050] [test_web: workaround broken HEAD behavior in twisted-2.5.0 and earlier warner@allmydata.com**20080813024520] [test_web: oops, actually use HEAD (instead of GET) in the HEAD test warner@allmydata.com**20080813020451] [web: use get_size_of_best_version for HEAD requests, provide correct content-type warner@allmydata.com**20080813020410] [mutable: add get_size_of_best_version to the interface, to simplify the web HEAD code, and tests warner@allmydata.com**20080813020252] [CLI: add 'tahoe debug corrupt-share', and use it for deep-verify tests, and fix non-deep web checker API to pass verify=true into node warner@allmydata.com**20080813000501] [IFilesystemNode: add get_storage_index(), it makes tests easier warner@allmydata.com**20080812231407] [test_system: rename Checker to ImmutableChecker, to make room for a mutable one warner@allmydata.com**20080812225932] ['tahoe debug dump-share': add --offsets, to show section offsets warner@allmydata.com**20080812214656] [test_cli: oops, fix tests after recent stdout/stderr cleanup warner@allmydata.com**20080812214634] [scripts/debug: split out dump_immutable_share warner@allmydata.com**20080812205517] [scripts/debug: clean up use of stdout/stderr warner@allmydata.com**20080812205242] [CLI: move the 'repl' command to 'tahoe debug repl' warner@allmydata.com**20080812204017] [CLI: move all debug commands (dump-share, dump-cap, find-shares, catalog-shares) into a 'debug' subcommand, and improve --help output warner@allmydata.com**20080812203732] [hush a pyflakes warning warner@allmydata.com**20080812042423] [web/directory: enable verify=true in t=deep-check warner@allmydata.com**20080812042409] [dirnode: add some deep-check logging warner@allmydata.com**20080812042338] [checker_results.problems: don't str the whole Failure, just extract the reason string warner@allmydata.com**20080812042306] [checker: add information to results, add some deep-check tests, fix a bug in which unhealthy files were not counted warner@allmydata.com**20080812040326] [mutable/checker: rearrange a bit, change checker-results to have a status_report string warner@allmydata.com**20080812032033] [mutable/servermap: add summarize_version warner@allmydata.com**20080812031930] [CLI: make 'tahoe webopen' command accept aliases like 'tahoe ls' warner@allmydata.com**20080812012023] [munin diskusage/doomsday: oops, fix labels, everything was reported in the 1hr column warner@allmydata.com**20080811203431] [munin/tahoe_overhead: don't emit non-sensicial numbers warner@lothar.com**20080807214008] [munin: add tahoe_overhead plugin, to measure effectiveness of GC and deleting data from inactive accounts warner@lothar.com**20080807203925] [diskwatcher.tac: include total-bytes-used warner@lothar.com**20080807201214] [setup: remove accidentally duplicated lines from Makefile zooko@zooko.com**20080807193029] [misc/dependencies: remove the no-longer-useful foolscap-0.2.5 tarball warner@lothar.com**20080807184546] [Makefile: avoid bare quotes, since the emacs syntax-highlighter gets confused by them warner@lothar.com**20080807183001] [diskwatcher.tac: don't report negative timeleft warner@lothar.com**20080807173433] [diskwatcher.tac: reduce the polling rate to once per hour warner@lothar.com**20080807062021] [misc/spacetime: add munin plugins, add everything to .deb warner@lothar.com**20080807060003] [diskwatcher.tac: hush pyflakes warner@lothar.com**20080807050427] [diskwatcher.tac: add async-GET code, but leave it commented out: urlopen() seems to work better for now warner@lothar.com**20080807050327] [cpu-watcher.tac: improve error message warner@lothar.com**20080807043801] [disk-watcher: first draft of a daemon to use the HTTP stats interface and its new storage_server.disk_avail feature, to track changes in disk space over time warner@lothar.com**20080807042222] [misc/cpu-watcher.tac: tolerate missing pidfiles, just skip over that sample warner@lothar.com**20080807041705] [setup: don't attempt to escape quote marks, just delete them. Ugly, but it works okay. zooko@zooko.com**20080806232742] [setup: escape any double-quote chars in the PATH before using the PATH to find and invoke trial zooko@zooko.com**20080806231143] [storage: include disk-free information in the stats-gatherer output warner@lothar.com**20080806210602] [mutable: more repair tests, one with force=True to check out merging warner@lothar.com**20080806190607] [test/common: add ShouldFailMixin warner@lothar.com**20080806190552] [test_mutable: add comment about minimal-bandwidth repairer, comma lack of warner@lothar.com**20080806173850] [test_mutable: factor out common setup code warner@lothar.com**20080806173804] [mutable: start adding Repair tests, fix a simple bug warner@lothar.com**20080806061239] [mutable.txt: add warning about out-of-date section warner@lothar.com**20080806061219] [test_system: factor out find_shares/replace_shares to a common class, so they can be used by other tests warner@lothar.com**20080806014958] [debian/control: update dependencies to match _auto_deps: foolscap-0.3.0, pycryptopp-0.5 warner@lothar.com**20080806013222] [bump foolscap dependency to 0.3.0, for the new incident-gathering interfaces warner@lothar.com**20080805235828] [web: add 'report incident' button at the bottom of the welcome page warner@lothar.com**20080805190921] [test_cli: more coverage for 'tahoe put' modifying a mutable file in-place, by filename, closes #441 warner@lothar.com**20080804202643] [check_grid.py: update to match new CLI: 'put - TARGET' instead of 'put TARGET' warner@lothar.com**20080802024856] [test_cli: remove windows-worrying newlines from test data warner@lothar.com**20080802024734] [test_cli.py: factor out CLITestMixin warner@lothar.com**20080802022938] [CLI: change one-arg forms of 'tahoe put' to make an unlinked file, fix replace-mutable #441 warner@lothar.com**20080802022729] [CLI: add create-alias command, to merge mkdir and add-alias into a single (secure-from-argv-snooping) step warner@lothar.com**20080802021041] [test_cli: add system-based tests for PUT, including a mutable put that fails/todo (#441) warner@lothar.com**20080801221009] [tests: simplify CLI tests that use stdin, now that runner supports it warner@lothar.com**20080801220514] [CLI: simplify argument-passing, use options= for everthing, including stdout warner@lothar.com**20080801184624] [tests: add test that verifier notices any (randomly chosen) bit flipped in the verifiable part of any (randomly chosen) share zooko@zooko.com**20080731002015 The currently verifier doesn't (usually) pass this randomized test, hence the TODO. ] [tests: test that checker doesn't cause reads on the storage servers zooko@zooko.com**20080730235420 It would still pass the test if it noticed a corrupted share. (It won't notice, of course.) But it is required to do its work without causing storage servers to read blocks from the filesystem. ] [storage: make storage servers declare oldest supported version == 1.0, and storage clients declare oldest supported version == 1.0 zooko@zooko.com**20080730225107 See comments in patch for intended semantics. ] [tests: use the handy dandy TestCase.mktemp() function from trial to give unique and nicely named directories for each testcase zooko@zooko.com**20080730224920] [tests: don't use SignalMixin zooko@zooko.com**20080730223536 It seems like we no longer need it, and it screws up something internal in trial which causes trial's TestCase.mktemp() method to exhibit wrong behavior (always using a certain test method name instead of using the current test method name), and I wish to use TestCase.mktemp(). Of course, it is possible that the buildbot is about to tell me that we do still require SignalMixin on some of our platforms... ] [setup: if the user passes a TRIALOPT env var then pass that on to trial zooko@zooko.com**20080730205806 This is useful for --reporter=bwverbose, for example. ] [setup: turn back on reactor=poll for cygwin trial (else it runs out of fds) zooko@zooko.com**20080730181217] [setup: fix bug in Makefile -- ifeq, not ifneq -- so that now it sets poll reactor only if the user hasn't specified a REACTOR variable, instead of setting poll reactor only if the user has specified a REACTOR variable zooko@zooko.com**20080730160429] [setup: whoops, really remove the default reactor=poll this time zooko@zooko.com**20080730032358] [setup: instead of setting --reactor=poll for trial in all cases (which fails on platforms that don't have poll reactor, such as Windows and some Mac OS X), just set --reactor=poll for linux2. zooko@zooko.com**20080730031656 ] [setup: pass --reactor=poll to trial unless REACTOR variable is set, in which case pass --reactor=$(REACTOR) zooko@zooko.com**20080730023906 This hopefully works around the problem that Twisted v8.1.0 has a bug when used with pyOpenSSL v0.7 which bug causes some unit tests to spuriously fail -- see known_issues.txt r2788: http://allmydata.org/trac/tahoe/browser/docs/known_issues.txt?rev=2788#L122 Also it matches with the fact that --reactor=poll is required on cygwin. ] [setup: require secure_connections from foolscap zooko@zooko.com**20080730021041 This causes a problem on debian sid, since the pyOpenSSL v0.6 .deb doesn't come with .egg-info, so setuptools will not know that it is already installed and will try to install pyOpenSSL, and if it installs pyOpenSSL v0.7, then this will trigger the bug in Twisted v8.1.0 when used with pyOpenSSL v0.7. http://twistedmatrix.com/trac/ticket/3218 Now the comments in twisted #3218 suggest that it happens only with the select reactor, so maybe using --reactor=poll will avoid it. ] [tests: add test_system.Checker which tests basic checking (without verification) functionality zooko@zooko.com**20080728234317] [test: add testutil.flip_one_bit which flips a randomly chosen bit of the input string zooko@zooko.com**20080728234217] [tests: make it so that you can use common.py's SystemTestMixin.set_up_nodes() more than once with the same introducer zooko@zooko.com**20080728234029] [download.py: set up self._paused before registering the producer, since they might call pauseProducing right away warner@lothar.com**20080728215731] [test/common.py: use pre-computed Tub certificates for the system-test mixin, to speed such tests up by maybe 15%. The goal is to encourage more full-grid tests. warner@allmydata.com**20080728194421] [munin/tahoe_spacetime: show 2wk data even if 4wk data is unavailable warner@allmydata.com**20080728194233] [web: add /status/?t=json, with active upload/download ops. Addresses #493. warner@allmydata.com**20080726004110] [web: make t=json stats pages use text/plain, instead of leaving it at text/html warner@allmydata.com**20080726002427] [test_system.py: factor SystemTestMixin out of SystemTest warner@allmydata.com**20080725223349] [test_system.py: modify system-test setup code in preparation for merge with common.SystemTestMixin warner@allmydata.com**20080725222931] [test_system.py: move SystemTestMixin out into common.py, where further improvements will occur warner@allmydata.com**20080725221758] [test_system.py: create SystemTestMixin, with less cruft, for faster system-like tests warner@allmydata.com**20080725221300] [TAG allmydata-tahoe-1.2.0 zooko@zooko.com**20080722014608] Patch bundle hash: 18de68f402677061070f4e2980fa146860351ec9