The Tahoe-LAFS decentralized secure filesystem.

Related tags

Storagetahoe-lafs
Overview

Free and Open decentralized data store

image0

Tahoe-LAFS (Tahoe Least-Authority File Store) is the first free software / open-source storage technology that distributes your data across multiple servers. Even if some servers fail or are taken over by an attacker, the entire file store continues to function correctly, preserving your privacy and security.

code of conduct documentation status build status circleci code coverage

Table of contents

💡 About Tahoe-LAFS

Tahoe-LAFS helps you to store files while granting confidentiality, integrity, and availability of your data.

How does it work? You run a client program on your computer, which talks to one or more storage servers on other computers. When you tell your client to store a file, it will encrypt that file, encode it into multiple pieces, then spread those pieces out among various servers. The pieces are all encrypted and protected against modifications. Later, when you ask your client to retrieve the file, it will find the necessary pieces, make sure they haven’t been corrupted, reassemble them, and decrypt the result.

image2
The image is taken from meejah's blog post at Torproject.org.

The client creates pieces (“shares”) that have a configurable amount of redundancy, so even if some servers fail, you can still get your data back. Corrupt shares are detected and ignored so that the system can tolerate server-side hard-drive errors. All files are encrypted (with a unique key) before uploading, so even a malicious server operator cannot read your data. The only thing you ask of the servers is that they can (usually) provide the shares when you ask for them: you aren’t relying upon them for confidentiality, integrity, or absolute availability.

Tahoe-LAFS was first designed in 2007, following the "principle of least authority", a security best practice requiring system components to only have the privilege necessary to complete their intended function and not more.

Please read more about Tahoe-LAFS architecture here.

Installation

For more detailed instructions, read docs/INSTALL.rst .

Once tahoe --version works, see docs/running.rst to learn how to set up your first Tahoe-LAFS node.

🤖 Issues

Tahoe-LAFS uses the Trac instance to track issues. Please email jean-paul plus tahoe-lafs at leastauthority dot com for an account.

📑 Documentation

You can find the full Tahoe-LAFS documentation at our documentation site.

💬 Community

Get involved with the Tahoe-LAFS community:

  • Chat with Tahoe-LAFS developers at #tahoe-lafs chat on irc.freenode.net or Slack.
  • Join our weekly conference calls with core developers and interested community members.
  • Subscribe to the tahoe-dev mailing list, the community forum for discussion of Tahoe-LAFS design, implementation, and usage.

🤗 Contributing

As a community-driven open source project, Tahoe-LAFS welcomes contributions of any form:

Before authoring or reviewing a patch, please familiarize yourself with the Coding Standard and the Contributor Code of Conduct.

FAQ

Need more information? Please check our FAQ page.

📄 License

Copyright 2006-2020 The Tahoe-LAFS Software Foundation

You may use this package under the GNU General Public License, version 2 or, at your option, any later version. You may use this package under the Transitive Grace Period Public Licence, version 1.0, or at your choice, any later version. (You may choose to use this package under the terms of either license, at your option.) See the file COPYING.GPL for the terms of the GNU General Public License, version 2. See the file COPYING.TGPPL for the terms of the Transitive Grace Period Public Licence, version 1.0.

See TGPPL.PDF for why the TGPPL exists, graphically illustrated on three slides.

Comments
  • Tahoe invite.3

    Tahoe invite.3

    As per https://github.com/gridsync/gridsync/issues/42 this branch updates tahoe-invite.2 to use a "bare" wormhole object and do the client and server "abilities" messages before exchanging the actual configuration.

    Note that this actually depends on wormhole "master" as that includes the new wormhole.wormhole.create() method among others.

    Before merging:

    • [x] make wormhole.tahoe-lafs.org a CNAME to wormhole.leastauthority.com
    • [x] depend on a new release of magic-wormhole (with .get_welcome() etc)
    opened by meejah 20
  • Set total/needed/happy from command-line

    Set total/needed/happy from command-line

    This allows you to specify values on the CLI for needed/happy/total shares configuration parameters. This eases scripts that are creating nodes (so they don't have to know how to edit tahoe.cfg immediately after creating a node).

    opened by meejah 18
  • Port humanreadable.py to Python 3

    Port humanreadable.py to Python 3

    Fixes ticket:3324

    I did the port by using futurize --unicode-literals --both-stages and then deleting the bits that were wrong or unnecessary.

    Basic steps:

    1. Port the test module.
    2. Make sure tests still pass on Python 2.
    3. Port the code module.
    4. Make sure tests pass on Python 3.
    5. Add both modules to the list of ported modules in _python3.py.
    6. Didn't actually do this, but once there's a ratcheting Python 3 CI runner the newly passing tests will be added to the required-to-pass list.

    Open questions:

    1. Is unicode literals by default a good idea? In this particular module it definitely seems fine, later on I expect to do some policy decisions about interfaces that are explicitly bytes or explicitly unicode.
    2. Do we want to use the from builtins import * idiom from future? That will make e.g. map() always lazy on both Python 2 and Python 3.
    Python 3 Porting 
    opened by itamarst 16
  • Installation Guide Revamp

    Installation Guide Revamp

    The PR is still in progress. Please go ahead and review the changes I have made:

    • I have created a new installation guide which is focused on new users who just want to user tahoe: docs/Installation/install-tahoe.rst
    • This article will redirect to "Building on <__> OS" guides such as docs/Installation/install-on-linux.rst where we are catering to the user personas who are looking to hack on Tahoe's source code.

    Some questions:

    1. The installation is now geared for two user personas: (I just want to use Tahoe to store my data securely, I want to hack on Tahoe's source code). Are there other user personas, specific for installation, that I am missing?
    2. After a chat with @exarkun on the Tahoe IRC, I will come up with a list of pages we no longer need to have online. For now, I have removed references to the OS Packages and OS X Packages articles. Is this okay?
    3. Where does the " docs/Installation/install-on-desert-island.rst fit in the user story?
    4. I have a bunch of indentation errors, specifically with commands. Can anyone help me with those errors?
    5. I ran the tox test, but I am unable to decipher the result. It says:

    ERROR integration/test_tor.py::test_onion_service_storage - twisted.internet.... ============= 24 passed, 10 warnings, 1 error in 78.85s (0:01:18) ============== ERROR: InvocationError for command /home/yash/OpenSource/tahoe-lafs/.tox/integration3/bin/python3 -b -m pytest --timeout=1800 --coverage -v integration (exited with code 1) ___________________________________ summary ____________________________________ ERROR: typechecks: commands failed codechecks: commands succeeded codechecks3: commands succeeded py27-coverage: commands succeeded ERROR: py36-coverage: InterpreterNotFound: python3.6 ERROR: py37-coverage: InterpreterNotFound: python3.7 py38-coverage: commands succeeded ERROR: py39-coverage: InterpreterNotFound: python3.9 ERROR: pypy27: InterpreterNotFound: pypy2.7 ERROR: pypy3: InterpreterNotFound: pypy3 ERROR: integration: commands failed ERROR: integration3: commands failed

    Some notes:

    Users usually don't like reading docs. Users who do come to docs are flustered because they couldn't make stuff work. Given that is the user's perspective, the best way to deal is to get to the point (single purpose articles with clear instructions). I have removed a bunch of stuff from the original articles like signatures because:

    • I don't know their exact purpose or usecase.
    • A lot of information will overwhelm the user.

    For the stuff I have omitted, please let me know the user we are targeting or where the usecase fits in the user journey and we can make the changes.

    PS: This is my first ever PR. So please let me know if I can fix something I have done wrong.

    opened by YashNRam13 13
  • Add redirect_to_index_html boolean to [client]

    Add redirect_to_index_html boolean to [client]

    It True, when web api has to display a directory node, it first looks whether that directory contains an index.html file. If so - it redirects to it. If not - it shows the folder view. Useful for public gateways: some folders you want browsable, but if you have a blog with "draft" posts, index.html protects the folder from browsing.

    opened by thedod 13
  • Use non-fully-qualified path for ifconfig on linux

    Use non-fully-qualified path for ifconfig on linux

    That way, actual path should be resolved through $PATH.

    It's /bin/ifconfig on exherbo and should be /usr/sbin/ifconfig on fedora after "/usr migration", and quick internet search reveals /usr/bin/ifconfig in ubuntu forums.

    Filed ~1y ago as #1536 in trac.

    opened by mk-fg 13
  • 3455: Round 1 of porting `allmydata.node`

    3455: Round 1 of porting `allmydata.node`

    First set of changes porting ./src/allmydata/node.py to Python 3 with Python 2 compatibility. I've been comparing test output between commits and including those details as well as discussion in each commit message, so it's probably best to review commit by commit. There are still failures and errors coming out of allmydata.node and allmydata.test.test_node under Python 3 that are definitely related to porting but I'm reasonably confident that these changes are correct and leave us better off than before them and I didn't want to stack too much for review.


    For reference, here's the net difference in the Python 3 test output between the feat(py3): Fix test runner exception commit (needed for apples-to-apples diffs) and this PR at the time of writing.

    TL;DR:

    -FAILED (skips=42, expectedFailures=1, failures=34, errors=532, successes=707)
    +FAILED (skips=42, expectedFailures=1, failures=45, errors=476, successes=753)
    

    Full diff:

    --- ../../.tox/make-test-py3-all-old.log	2020-10-04 22:36:00.468995771 -0700
    +++ ../../.tox/make-test-py3-all-new.log	2020-10-04 22:38:51.405473485 -0700
    @@ -1,5 +1,6 @@
     + make VIRTUAL_ENV=./.tox/py36-coverage TEST_SUITE=allmydata test-venv-coverage
     make[#]: Entering directory '/home/rpatterson/src/work/sfu/tahoe-lafs'
    ++ rm -f './.coverage.*'
     + test_exit=
     + ./.tox/py36-coverage/bin/coverage run -m twisted.trial allmydata
     allmydata.test.cli.test_alias
    @@ -312,7 +313,7 @@
     ####-##-##T##:##:##-###0 [twisted.scripts._twistd_unix.UnixAppLogger#info] twistd 20.3.0 (/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/bin/python 3.6.12) starting up.
     ####-##-##T##:##:##-###0 [twisted.scripts._twistd_unix.UnixAppLogger#info] reactor class: mock.mock.MagicMock.
     ####-##-##T##:##:##-###0 [twisted.scripts._twistd_unix.UnixAppLogger#info] Server Shut Down.
    -                                         [FAIL]
    +                                           [OK]
     allmydata.test
       cli
         test_status ...                                                     [ERROR]
    @@ -596,37 +597,38 @@
         test_reserved_4 ...                                                 [ERROR]
         test_reserved_bad ...                                               [ERROR]
         test_secrets ...                                                    [ERROR]
    -    test_storage_anonymous_disabled_by_storage ...                      [ERROR]
    -    test_storage_anonymous_disabled_explicitly ...                      [ERROR]
    -    test_storage_anonymous_enabled_by_default ...                       [ERROR]
    -    test_storage_anonymous_enabled_explicitly ...                       [ERROR]
    +    test_storage_anonymous_disabled_by_storage ...                       [FAIL]
    +    test_storage_anonymous_disabled_explicitly ...                       [FAIL]
    +    test_storage_anonymous_enabled_by_default ...                          [OK]
    +    test_storage_anonymous_enabled_explicitly ...                          [OK]
         test_unreadable_config ...                                          [ERROR]
         test_unreadable_introducers ...                                        [OK]
         test_versions ...                                                   [ERROR]
         test_web_apiauthtoken ...                                           [ERROR]
         test_web_staticdir ...                                              [ERROR]
       IntroducerClients
    -    test_invalid_introducer_furl ...                                    [ERROR]
    +    test_invalid_introducer_furl ...                                       [OK]
       NodeMaker
         test_maker ...                                                      [ERROR]
       Run
         test_loadable ...                                                   [ERROR]
         test_reloadable ...                                                 [ERROR]
       StorageAnnouncementTests
    -    test_anonymous_storage_announcement ...                             [ERROR]
    -    test_broken_storage_plugin ...                                      [ERROR]
    -    test_multiple_storage_plugin_announcements ...                      [ERROR]
    -    test_no_announcement ...                                            [ERROR]
    -    test_single_storage_plugin_announcement ...                         [ERROR]
    -    test_stable_storage_server_furl ...                                 [ERROR]
    -    test_storage_plugin_not_found ...                                   [ERROR]
    -    test_storage_plugin_without_configuration ...                       [ERROR]
    +    test_anonymous_storage_announcement ...                              [FAIL]
    +    test_broken_storage_plugin ...                                         [OK]
    +    test_multiple_storage_plugin_announcements ...                       [FAIL]
    +    test_no_announcement ...                                             [FAIL]
    +    test_single_storage_plugin_announcement ...                          [FAIL]
    +    test_stable_storage_server_furl ...                                  [FAIL]
    +    test_storage_plugin_not_found ...                                    [FAIL]
    +    test_storage_plugin_without_configuration ...                        [FAIL]
       StorageClients
         test_invalid_static_server ...                                       [FAIL]
         test_static_servers ...                                              [FAIL]
     allmydata.test.test_codec
       T
    -    test_encode ...                                                        [OK]
    +    test_encode ...                                                     [ERROR]
    +                                                    [ERROR]
         test_encode1 ...                                                       [OK]
         test_encode2 ...                                                       [OK]
     allmydata.test.test_common_util
    @@ -652,42 +654,42 @@
         test_reconnector_waiting ...                                           [OK]
     allmydata.test.test_connections
       Connections
    -    test_default ...                                                    [ERROR]
    -    test_tcp_disabled ...                                               [ERROR]
    -    test_tor ...                                                        [ERROR]
    -    test_tor_unimportable ...                                           [ERROR]
    -    test_unknown ...                                                    [ERROR]
    +    test_default ...                                                       [OK]
    +    test_tcp_disabled ...                                                  [OK]
    +    test_tor ...                                                           [OK]
    +    test_tor_unimportable ...                                              [OK]
    +    test_unknown ...                                                       [OK]
       I2P
    -    test_configdir ...                                                  [ERROR]
    -    test_default ...                                                    [ERROR]
    -    test_disabled ...                                                   [ERROR]
    -    test_launch ...                                                     [ERROR]
    -    test_launch_configdir ...                                           [ERROR]
    -    test_launch_configdir_and_executable ...                            [ERROR]
    -    test_launch_executable ...                                          [ERROR]
    -    test_samport ...                                                    [ERROR]
    -    test_samport_and_launch ...                                         [ERROR]
    -    test_unimportable ...                                               [ERROR]
    +    test_configdir ...                                                     [OK]
    +    test_default ...                                                       [OK]
    +    test_disabled ...                                                      [OK]
    +    test_launch ...                                                        [OK]
    +    test_launch_configdir ...                                              [OK]
    +    test_launch_configdir_and_executable ...                               [OK]
    +    test_launch_executable ...                                             [OK]
    +    test_samport ...                                                       [OK]
    +    test_samport_and_launch ...                                            [OK]
    +    test_unimportable ...                                                  [OK]
       Privacy
    -    test_connections ...                                                [ERROR]
    -    test_connections_tcp_disabled ...                                   [ERROR]
    -    test_tub_location_auto ...                                          [ERROR]
    -    test_tub_location_legacy_tcp ...                                    [ERROR]
    -    test_tub_location_tcp ...                                           [ERROR]
    +    test_connections ...                                                   [OK]
    +    test_connections_tcp_disabled ...                                      [OK]
    +    test_tub_location_auto ...                                             [OK]
    +    test_tub_location_legacy_tcp ...                                     [FAIL]
    +    test_tub_location_tcp ...                                            [FAIL]
       TCP
    -    test_default ...                                                    [ERROR]
    +    test_default ...                                                       [OK]
       Tor
    -    test_controlport ...                                                [ERROR]
    -    test_default ...                                                    [ERROR]
    -    test_disabled ...                                                   [ERROR]
    -    test_launch ...                                                     [ERROR]
    -    test_launch_executable ...                                          [ERROR]
    -    test_socksport_bad_endpoint ...                                     [ERROR]
    -    test_socksport_endpoint ...                                         [ERROR]
    -    test_socksport_endpoint_otherhost ...                               [ERROR]
    -    test_socksport_not_integer ...                                      [ERROR]
    -    test_socksport_unix_endpoint ...                                    [ERROR]
    -    test_unimportable ...                                               [ERROR]
    +    test_controlport ...                                                   [OK]
    +    test_default ...                                                       [OK]
    +    test_disabled ...                                                      [OK]
    +    test_launch ...                                                        [OK]
    +    test_launch_executable ...                                             [OK]
    +    test_socksport_bad_endpoint ...                                        [OK]
    +    test_socksport_endpoint ...                                            [OK]
    +    test_socksport_endpoint_otherhost ...                                  [OK]
    +    test_socksport_not_integer ...                                         [OK]
    +    test_socksport_unix_endpoint ...                                       [OK]
    +    test_unimportable ...                                                  [OK]
     allmydata.test.test_crawler
       Basic
         test_empty_subclass ...                                                [OK]
    @@ -1190,7 +1192,7 @@
         test_disabled_but_helper ...                                         [FAIL]
         test_disabled_but_storage ...                                        [FAIL]
       Configuration
    -    test_create_client_invalid_config ...                                [FAIL]
    +    test_create_client_invalid_config ...                                  [OK]
         test_read_invalid_config ...                                           [OK]
       IntroducerNotListening
         test_port_none_introducer ...                                        [FAIL]
    @@ -1201,12 +1203,12 @@
       TestCase
         test_config_items ...                                                [FAIL]
         test_config_required ...                                               [OK]
    -    test_location1 ...                                                  [ERROR]
    +    test_location1 ...                                                     [OK]
         test_location2 ...                                                  [ERROR]
    -    test_location_auto_and_explicit ...                                 [ERROR]
    -    test_location_not_set ...                                           [ERROR]
    -    test_logdir_is_str ...                                              [ERROR]
    -    test_private_config ...                                             [ERROR]
    +    test_location_auto_and_explicit ...                                    [OK]
    +    test_location_not_set ...                                              [OK]
    +    test_logdir_is_str ...                                               [FAIL]
    +    test_private_config ...                                              [FAIL]
         test_private_config_missing ...                                        [OK]
         test_private_config_unreadable ...                                  [ERROR]
         test_private_config_unreadable_preexisting ...                         [OK]
    @@ -1215,16 +1217,16 @@
         test_tahoe_cfg_hash_in_name ...                                        [OK]
         test_tahoe_cfg_utf8 ...                                             [ERROR]
         test_timestamp ...                                                     [OK]
    -    test_write_config_unwritable_file ...                               [ERROR]
    +    test_write_config_unwritable_file ...                                  [OK]
       TestMissingPorts
    -    test_disabled_port_not_tub ...                                      [ERROR]
    -    test_disabled_tub_not_port ...                                      [ERROR]
    -    test_empty_tub_location ...                                         [ERROR]
    -    test_empty_tub_port ...                                             [ERROR]
    -    test_parsing_all_disabled ...                                       [ERROR]
    -    test_parsing_defaults ...                                           [ERROR]
    +    test_disabled_port_not_tub ...                                         [OK]
    +    test_disabled_tub_not_port ...                                         [OK]
    +    test_empty_tub_location ...                                            [OK]
    +    test_empty_tub_port ...                                                [OK]
    +    test_parsing_all_disabled ...                                          [OK]
    +    test_parsing_defaults ...                                              [OK]
         test_parsing_location_complex ...                                   [ERROR]
    -    test_parsing_tcp ...                                                [ERROR]
    +    test_parsing_tcp ...                                                   [OK]
     allmydata.test.test_observer
       Observer
         test_lazy_oneshot ...                                                  [OK]
    @@ -1834,7 +1836,7 @@
         raise self.failureException(msg)
     twisted.trial.unittest.FailTest: ['allmydata', 'allmydata.__main__', 'allm[5873 chars]try'] != set() : Some unported modules remain: 
     Ported files: 96 / 292
    -Ported lines: 27978 / 93480
    +Ported lines: 27978 / 93486
     
     
     allmydata.test.test_python3.Python3PortingEffortTests.test_finished_porting
    @@ -2023,18 +2025,6 @@
     ===============================================================================
     [FAIL]
     Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/mock/mock.py", line 1369, in patched
    -    return func(*newargs, **newkeywargs)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/cli/test_start.py", line 265, in test_run_invalid_config
    -    output,
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/trial/_synctest.py", line 494, in assertIn
    -    % (containee, container))
    -twisted.trial.unittest.FailTest: 'invalid section' not in '\nUnknown error\nTraceback (most recent call last):\n  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/cli/test_start.py", line 232, in cwr\n    fn()\n  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/scripts/run_common.py", line 155, in start\n    d = service_factory()\n  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/scripts/run_common.py", line 136, in <lambda>\n    u"client": lambda: maybeDeferred(namedAny("allmydata.client.create_client"), self.basedir),\n  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 151, in maybeDeferred\n    result = f(*args, **kw)\n--- <exception caught here> ---\n  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/client.py", line 243, in create_client\n    config = read_config(basedir, u"client.port")\n  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/client.py", line 219, in read_config\n    _valid_config=_valid_config(),\n  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 192, in read_config\n    configutil.validate_config(config_fname, parser, _valid_config)\n  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/util/configutil.py", line 72, in validate_config\n    if not valid_config.is_valid_section(section):\n  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/util/configutil.py", line 113, in is_valid_section\n    self._is_valid_section(section_name)\n  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/util/configutil.py", line 141, in <lambda>\n    return lambda *a, **kw: f(*a, **kw) or g(*a, **kw)\n  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/client.py", line 72, in _is_valid_section\n    section_name.startswith(b"storageserver.plugins.") or\nbuiltins.TypeError: startswith first arg must be str or a tuple of str, not bytes\n'
    -
    -allmydata.test.cli.test_start.RunTests.test_run_invalid_config
    -===============================================================================
    -[FAIL]
    -Traceback (most recent call last):
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/trial/_asynctest.py", line 75, in _eb
         raise self.failureException(output)
     twisted.trial.unittest.FailTest: 
    @@ -2047,6 +2037,255 @@
     ===============================================================================
     [FAIL]
     Traceback (most recent call last):
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 310, in test_storage_anonymous_disabled_by_storage
    +    self.assertFalse(client.anonymous_storage_enabled(config))
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/trial/_synctest.py", line 386, in assertFalse
    +    super(_Assertions, self).assertFalse(condition, msg)
    +  File "/usr/lib/python3.6/unittest/case.py", line 676, in assertFalse
    +    raise self.failureException(msg)
    +twisted.trial.unittest.FailTest: True is not false
    +
    +allmydata.test.test_client.Basic.test_storage_anonymous_disabled_by_storage
    +===============================================================================
    +[FAIL]
    +Traceback (most recent call last):
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 294, in test_storage_anonymous_disabled_explicitly
    +    self.assertFalse(client.anonymous_storage_enabled(config))
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/trial/_synctest.py", line 386, in assertFalse
    +    super(_Assertions, self).assertFalse(condition, msg)
    +  File "/usr/lib/python3.6/unittest/case.py", line 676, in assertFalse
    +    raise self.failureException(msg)
    +twisted.trial.unittest.FailTest: True is not false
    +
    +allmydata.test.test_client.Basic.test_storage_anonymous_disabled_explicitly
    +===============================================================================
    +[FAIL]
    +Traceback (most recent call last):
    +Failure: testtools.testresult.real._StringException: traceback-1: {{{
    +Traceback (most recent call last):
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 151, in maybeDeferred
    +    result = f(*args, **kw)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/testtools/testcase.py", line 723, in _run_test_method
    +    return self._get_test_method()()
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 1204, in test_anonymous_storage_announcement
    +    matches_storage_announcement(self.basedir),
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/testtools/testcase.py", line 502, in assertThat
    +    raise mismatch_error
    +testtools.matchers._impl.MismatchError: Success result expected on <Deferred at 0x############ current result: None>, found failure result instead: <twisted.python.failure.Failure builtins.TypeError: can't concat str to bytes>
    +}}}
    +
    +Traceback (most recent call last):
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 1418, in _inlineCallbacks
    +    result = g.send(result)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/client.py", line 298, in create_client_from_config
    +    storage_broker,
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/client.py", line 676, in __init__
    +    node.Node.__init__(self, config, main_tub, control_tub, i2p_provider, tor_provider)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 745, in __init__
    +    self.config.write_config_file("my_nodeid", b32encode(self.nodeid).lower() + "\n")
    +TypeError: can't concat str to bytes
    +
    +
    +allmydata.test.test_client.StorageAnnouncementTests.test_anonymous_storage_announcement
    +===============================================================================
    +[FAIL]
    +Traceback (most recent call last):
    +Failure: testtools.testresult.real._StringException: traceback-1: {{{
    +Traceback (most recent call last):
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 151, in maybeDeferred
    +    result = f(*args, **kw)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/testtools/testcase.py", line 723, in _run_test_method
    +    return self._get_test_method()()
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 1290, in test_multiple_storage_plugin_announcements
    +    u"thing-2",
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/testtools/testcase.py", line 502, in assertThat
    +    raise mismatch_error
    +testtools.matchers._impl.MismatchError: Success result expected on <Deferred at 0x############ current result: None>, found failure result instead: <twisted.python.failure.Failure builtins.TypeError: cannot use a string pattern on a bytes-like object>
    +}}}
    +
    +Traceback (most recent call last):
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 1418, in _inlineCallbacks
    +    result = g.send(result)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/client.py", line 281, in create_client_from_config
    +    foolscap_connection_handlers, i2p_provider, tor_provider,
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 669, in create_main_tub
    +    portlocation = _tub_portlocation(config)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 596, in _tub_portlocation
    +    tubport = _convert_tub_port(file_tubport)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 552, in _convert_tub_port
    +    if re.search(r'^\d+$', s):
    +  File "/usr/lib/python3.6/re.py", line 182, in search
    +    return _compile(pattern, flags).search(string)
    +TypeError: cannot use a string pattern on a bytes-like object
    +
    +
    +allmydata.test.test_client.StorageAnnouncementTests.test_multiple_storage_plugin_announcements
    +===============================================================================
    +[FAIL]
    +Traceback (most recent call last):
    +Failure: testtools.testresult.real._StringException: traceback-1: {{{
    +Traceback (most recent call last):
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 151, in maybeDeferred
    +    result = f(*args, **kw)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/testtools/testcase.py", line 723, in _run_test_method
    +    return self._get_test_method()()
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 1176, in test_no_announcement
    +    Equals([]),
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/testtools/testcase.py", line 502, in assertThat
    +    raise mismatch_error
    +testtools.matchers._impl.MismatchError: Success result expected on <Deferred at 0x############ current result: None>, found failure result instead: <twisted.python.failure.Failure builtins.TypeError: cannot use a string pattern on a bytes-like object>
    +}}}
    +
    +Traceback (most recent call last):
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 1418, in _inlineCallbacks
    +    result = g.send(result)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/client.py", line 281, in create_client_from_config
    +    foolscap_connection_handlers, i2p_provider, tor_provider,
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 669, in create_main_tub
    +    portlocation = _tub_portlocation(config)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 596, in _tub_portlocation
    +    tubport = _convert_tub_port(file_tubport)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 552, in _convert_tub_port
    +    if re.search(r'^\d+$', s):
    +  File "/usr/lib/python3.6/re.py", line 182, in search
    +    return _compile(pattern, flags).search(string)
    +TypeError: cannot use a string pattern on a bytes-like object
    +
    +
    +allmydata.test.test_client.StorageAnnouncementTests.test_no_announcement
    +===============================================================================
    +[FAIL]
    +Traceback (most recent call last):
    +Failure: testtools.testresult.real._StringException: traceback-1: {{{
    +Traceback (most recent call last):
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 151, in maybeDeferred
    +    result = f(*args, **kw)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/testtools/testcase.py", line 723, in _run_test_method
    +    return self._get_test_method()()
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 1243, in test_single_storage_plugin_announcement
    +    value,
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/testtools/testcase.py", line 502, in assertThat
    +    raise mismatch_error
    +testtools.matchers._impl.MismatchError: Success result expected on <Deferred at 0x############ current result: None>, found failure result instead: <twisted.python.failure.Failure builtins.TypeError: cannot use a string pattern on a bytes-like object>
    +}}}
    +
    +Traceback (most recent call last):
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 1418, in _inlineCallbacks
    +    result = g.send(result)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/client.py", line 281, in create_client_from_config
    +    foolscap_connection_handlers, i2p_provider, tor_provider,
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 669, in create_main_tub
    +    portlocation = _tub_portlocation(config)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 596, in _tub_portlocation
    +    tubport = _convert_tub_port(file_tubport)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 552, in _convert_tub_port
    +    if re.search(r'^\d+$', s):
    +  File "/usr/lib/python3.6/re.py", line 182, in search
    +    return _compile(pattern, flags).search(string)
    +TypeError: cannot use a string pattern on a bytes-like object
    +
    +
    +allmydata.test.test_client.StorageAnnouncementTests.test_single_storage_plugin_announcement
    +===============================================================================
    +[FAIL]
    +Traceback (most recent call last):
    +Failure: testtools.testresult.real._StringException: traceback-1: {{{
    +Traceback (most recent call last):
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 151, in maybeDeferred
    +    result = f(*args, **kw)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/testtools/testcase.py", line 723, in _run_test_method
    +    return self._get_test_method()()
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 1332, in test_stable_storage_server_furl
    +    MatchesSameElements(),
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/testtools/testcase.py", line 502, in assertThat
    +    raise mismatch_error
    +testtools.matchers._impl.MismatchError: Success result expected on <DeferredList at 0x############ current result: None>, found failure result instead: <twisted.python.failure.Failure twisted.internet.defer.FirstError: FirstError[#0, [Failure instance: Traceback: <class 'TypeError'>: cannot use a string pattern on a bytes-like object
    +/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/testtools/testcase.py:723:_run_test_method
    +/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py:1321:test_stable_storage_server_furl
    +/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py:1613:unwindGenerator
    +/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py:1529:_cancellableInlineCallbacks
    +--- <exception caught here> ---
    +/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py:1418:_inlineCallbacks
    +/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/client.py:281:create_client_from_config
    +/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py:669:create_main_tub
    +/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py:596:_tub_portlocation
    +/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py:552:_convert_tub_port
    +/usr/lib/python3.6/re.py:182:search
    +]]>
    +}}}
    +
    +Traceback (most recent call last):
    +twisted.internet.defer.FirstError: FirstError[#0, [Failure instance: Traceback: <class 'TypeError'>: cannot use a string pattern on a bytes-like object
    +/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/testtools/testcase.py:723:_run_test_method
    +/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py:1321:test_stable_storage_server_furl
    +/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py:1613:unwindGenerator
    +/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py:1529:_cancellableInlineCallbacks
    +--- <exception caught here> ---
    +/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py:1418:_inlineCallbacks
    +/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/client.py:281:create_client_from_config
    +/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py:669:create_main_tub
    +/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py:596:_tub_portlocation
    +/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py:552:_convert_tub_port
    +/usr/lib/python3.6/re.py:182:search
    +]]
    +
    +
    +allmydata.test.test_client.StorageAnnouncementTests.test_stable_storage_server_furl
    +===============================================================================
    +[FAIL]
    +Traceback (most recent call last):
    +Failure: testtools.testresult.real._StringException: Traceback (most recent call last):
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 151, in maybeDeferred
    +    result = f(*args, **kw)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/testtools/testcase.py", line 723, in _run_test_method
    +    return self._get_test_method()()
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 1424, in test_storage_plugin_not_found
    +    Equals(configutil.UnknownConfigError),
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/testtools/testcase.py", line 502, in assertThat
    +    raise mismatch_error
    +testtools.matchers._impl.MismatchError: !=:
    +reference = <class 'allmydata.util.configutil.UnknownConfigError'>
    +actual    = <class 'TypeError'>
    +: after <function <lambda>> on <twisted.python.failure.Failure builtins.TypeError: cannot use a string pattern on a bytes-like object>
    +
    +
    +allmydata.test.test_client.StorageAnnouncementTests.test_storage_plugin_not_found
    +===============================================================================
    +[FAIL]
    +Traceback (most recent call last):
    +Failure: testtools.testresult.real._StringException: traceback-1: {{{
    +Traceback (most recent call last):
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 151, in maybeDeferred
    +    result = f(*args, **kw)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/testtools/testcase.py", line 723, in _run_test_method
    +    return self._get_test_method()()
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 1364, in test_storage_plugin_without_configuration
    +    u"default-value",
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/testtools/testcase.py", line 502, in assertThat
    +    raise mismatch_error
    +testtools.matchers._impl.MismatchError: Success result expected on <Deferred at 0x############ current result: None>, found failure result instead: <twisted.python.failure.Failure builtins.TypeError: cannot use a string pattern on a bytes-like object>
    +}}}
    +
    +Traceback (most recent call last):
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 1418, in _inlineCallbacks
    +    result = g.send(result)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/client.py", line 281, in create_client_from_config
    +    foolscap_connection_handlers, i2p_provider, tor_provider,
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 669, in create_main_tub
    +    portlocation = _tub_portlocation(config)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 596, in _tub_portlocation
    +    tubport = _convert_tub_port(file_tubport)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 552, in _convert_tub_port
    +    if re.search(r'^\d+$', s):
    +  File "/usr/lib/python3.6/re.py", line 182, in search
    +    return _compile(pattern, flags).search(string)
    +TypeError: cannot use a string pattern on a bytes-like object
    +
    +
    +allmydata.test.test_client.StorageAnnouncementTests.test_storage_plugin_without_configuration
    +===============================================================================
    +[FAIL]
    +Traceback (most recent call last):
     Failure: testtools.testresult.real._StringException: traceback-1: {{{
     Traceback (most recent call last):
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/fixtures/fixture.py", line 197, in setUp
    @@ -2141,6 +2380,66 @@
     ===============================================================================
     [FAIL]
     Traceback (most recent call last):
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 459, in test_tub_location_legacy_tcp
    +    _tub_portlocation(config)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/trial/_synctest.py", line 355, in __exit__
    +    self._expectedName, reason.getTraceback()),
    +twisted.trial.unittest.FailTest: builtins.TypeError raised instead of PrivacyError:
    + Traceback (most recent call last):
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/trial/_asynctest.py", line 112, in _run
    +    utils.runWithWarningsSuppressed, self._getSuppress(), method)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 151, in maybeDeferred
    +    result = f(*args, **kw)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/utils.py", line 217, in runWithWarningsSuppressed
    +    result = f(*a, **kw)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 459, in test_tub_location_legacy_tcp
    +    _tub_portlocation(config)
    +--- <exception caught here> ---
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 459, in test_tub_location_legacy_tcp
    +    _tub_portlocation(config)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 596, in _tub_portlocation
    +    tubport = _convert_tub_port(file_tubport)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 552, in _convert_tub_port
    +    if re.search(r'^\d+$', s):
    +  File "/usr/lib/python3.6/re.py", line 182, in search
    +    return _compile(pattern, flags).search(string)
    +builtins.TypeError: cannot use a string pattern on a bytes-like object
    +
    +
    +allmydata.test.test_connections.Privacy.test_tub_location_legacy_tcp
    +===============================================================================
    +[FAIL]
    +Traceback (most recent call last):
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 445, in test_tub_location_tcp
    +    _tub_portlocation(config)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/trial/_synctest.py", line 355, in __exit__
    +    self._expectedName, reason.getTraceback()),
    +twisted.trial.unittest.FailTest: builtins.TypeError raised instead of PrivacyError:
    + Traceback (most recent call last):
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/trial/_asynctest.py", line 112, in _run
    +    utils.runWithWarningsSuppressed, self._getSuppress(), method)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 151, in maybeDeferred
    +    result = f(*args, **kw)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/utils.py", line 217, in runWithWarningsSuppressed
    +    result = f(*a, **kw)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 445, in test_tub_location_tcp
    +    _tub_portlocation(config)
    +--- <exception caught here> ---
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 445, in test_tub_location_tcp
    +    _tub_portlocation(config)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 596, in _tub_portlocation
    +    tubport = _convert_tub_port(file_tubport)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 552, in _convert_tub_port
    +    if re.search(r'^\d+$', s):
    +  File "/usr/lib/python3.6/re.py", line 182, in search
    +    return _compile(pattern, flags).search(string)
    +builtins.TypeError: cannot use a string pattern on a bytes-like object
    +
    +
    +allmydata.test.test_connections.Privacy.test_tub_location_tcp
    +===============================================================================
    +[FAIL]
    +Traceback (most recent call last):
     Failure: testtools.testresult.real._StringException: Traceback (most recent call last):
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 151, in maybeDeferred
         result = f(*args, **kw)
    @@ -2165,11 +2464,11 @@
         result = result.throwExceptionIntoGenerator(g)
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/python/failure.py", line 512, in throwExceptionIntoGenerator
         return g.throw(self.type, self.value, self.tb)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 685, in test_disabled_but_helper
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 687, in test_disabled_but_helper
         yield client.create_client(basedir)
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/trial/_synctest.py", line 355, in __exit__
         self._expectedName, reason.getTraceback()),
    -twisted.trial.unittest.FailTest: configparser.DuplicateSectionError raised instead of ValueError:
    +twisted.trial.unittest.FailTest: builtins.NameError raised instead of ValueError:
      Traceback (most recent call last):
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 1529, in _cancellableInlineCallbacks
         _inlineCallbacks(None, g, status)
    @@ -2177,12 +2476,12 @@
         result = result.throwExceptionIntoGenerator(g)
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/python/failure.py", line 512, in throwExceptionIntoGenerator
         return g.throw(self.type, self.value, self.tb)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 685, in test_disabled_but_helper
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 687, in test_disabled_but_helper
         yield client.create_client(basedir)
     --- <exception caught here> ---
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 685, in test_disabled_but_helper
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 687, in test_disabled_but_helper
         yield client.create_client(basedir)
    -configparser.DuplicateSectionError: While reading from '/home/rpatterson/src/work/sfu/tahoe-lafs/_trial_temp/test_node/test_disabled_but_helper/tahoe.cfg' [line 10]: section 'node' already exists
    +builtins.NameError: name 'unicode' is not defined
     
     
     allmydata.test.test_node.ClientNotListening.test_disabled_but_helper
    @@ -2193,11 +2492,11 @@
         result = result.throwExceptionIntoGenerator(g)
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/python/failure.py", line 512, in throwExceptionIntoGenerator
         return g.throw(self.type, self.value, self.tb)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 668, in test_disabled_but_storage
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 670, in test_disabled_but_storage
         yield client.create_client(basedir)
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/trial/_synctest.py", line 355, in __exit__
         self._expectedName, reason.getTraceback()),
    -twisted.trial.unittest.FailTest: configparser.DuplicateSectionError raised instead of ValueError:
    +twisted.trial.unittest.FailTest: builtins.NameError raised instead of ValueError:
      Traceback (most recent call last):
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 1529, in _cancellableInlineCallbacks
         _inlineCallbacks(None, g, status)
    @@ -2205,12 +2504,12 @@
         result = result.throwExceptionIntoGenerator(g)
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/python/failure.py", line 512, in throwExceptionIntoGenerator
         return g.throw(self.type, self.value, self.tb)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 668, in test_disabled_but_storage
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 670, in test_disabled_but_storage
         yield client.create_client(basedir)
     --- <exception caught here> ---
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 668, in test_disabled_but_storage
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 670, in test_disabled_but_storage
         yield client.create_client(basedir)
    -configparser.DuplicateSectionError: While reading from '/home/rpatterson/src/work/sfu/tahoe-lafs/_trial_temp/test_node/test_disabled_but_storage/tahoe.cfg' [line 10]: section 'node' already exists
    +builtins.NameError: name 'unicode' is not defined
     
     
     allmydata.test.test_node.ClientNotListening.test_disabled_but_storage
    @@ -2221,39 +2520,11 @@
         result = result.throwExceptionIntoGenerator(g)
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/python/failure.py", line 512, in throwExceptionIntoGenerator
         return g.throw(self.type, self.value, self.tb)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 739, in test_create_client_invalid_config
    -    yield client.create_client(self.basedir)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/trial/_synctest.py", line 355, in __exit__
    -    self._expectedName, reason.getTraceback()),
    -twisted.trial.unittest.FailTest: builtins.TypeError raised instead of UnknownConfigError:
    - Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 1529, in _cancellableInlineCallbacks
    -    _inlineCallbacks(None, g, status)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 1416, in _inlineCallbacks
    -    result = result.throwExceptionIntoGenerator(g)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/python/failure.py", line 512, in throwExceptionIntoGenerator
    -    return g.throw(self.type, self.value, self.tb)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 739, in test_create_client_invalid_config
    -    yield client.create_client(self.basedir)
    ---- <exception caught here> ---
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 739, in test_create_client_invalid_config
    -    yield client.create_client(self.basedir)
    -builtins.TypeError: startswith first arg must be str or a tuple of str, not bytes
    -
    -
    -allmydata.test.test_node.Configuration.test_create_client_invalid_config
    -===============================================================================
    -[FAIL]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 1416, in _inlineCallbacks
    -    result = result.throwExceptionIntoGenerator(g)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/python/failure.py", line 512, in throwExceptionIntoGenerator
    -    return g.throw(self.type, self.value, self.tb)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 702, in test_port_none_introducer
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 704, in test_port_none_introducer
         yield create_introducer(basedir)
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/trial/_synctest.py", line 355, in __exit__
         self._expectedName, reason.getTraceback()),
    -twisted.trial.unittest.FailTest: builtins.AttributeError raised instead of ValueError:
    +twisted.trial.unittest.FailTest: builtins.TypeError raised instead of ValueError:
      Traceback (most recent call last):
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 1529, in _cancellableInlineCallbacks
         _inlineCallbacks(None, g, status)
    @@ -2261,20 +2532,18 @@
         result = result.throwExceptionIntoGenerator(g)
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/python/failure.py", line 512, in throwExceptionIntoGenerator
         return g.throw(self.type, self.value, self.tb)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 702, in test_port_none_introducer
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 704, in test_port_none_introducer
         yield create_introducer(basedir)
     --- <exception caught here> ---
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 702, in test_port_none_introducer
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 704, in test_port_none_introducer
         yield create_introducer(basedir)
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/introducer/server.py", line 76, in create_introducer
         tor_provider,
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/introducer/server.py", line 87, in __init__
         node.Node.__init__(self, config, main_tub, control_tub, i2p_provider, tor_provider)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 734, in __init__
    -    self.setup_logging()
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 824, in setup_logging
    -    ob = o.im_self
    -builtins.AttributeError: 'function' object has no attribute 'im_self'
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 745, in __init__
    +    self.config.write_config_file("my_nodeid", b32encode(self.nodeid).lower() + "\n")
    +builtins.TypeError: can't concat str to bytes
     
     
     allmydata.test.test_node.IntroducerNotListening.test_port_none_introducer
    @@ -2306,6 +2575,44 @@
     ===============================================================================
     [FAIL]
     Traceback (most recent call last):
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 340, in test_logdir_is_str
    +    yield client.create_client(basedir)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 1418, in _inlineCallbacks
    +    result = g.send(result)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/client.py", line 298, in create_client_from_config
    +    storage_broker,
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/client.py", line 676, in __init__
    +    node.Node.__init__(self, config, main_tub, control_tub, i2p_provider, tor_provider)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 739, in __init__
    +    self.setup_logging()
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 847, in setup_logging
    +    foolscap.logging.log.setLogDir(incident_dir.encode(get_filesystem_encoding()))
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 336, in call_setLogDir
    +    self.failUnless(isinstance(logdir, str), logdir)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/trial/_synctest.py", line 397, in assertTrue
    +    super(_Assertions, self).assertTrue(condition, msg)
    +  File "/usr/lib/python3.6/unittest/case.py", line 682, in assertTrue
    +    raise self.failureException(msg)
    +twisted.trial.unittest.FailTest: False is not true : b'/home/rpatterson/src/work/sfu/tahoe-lafs/_trial_temp/test_node/test_logdir_is_str/logs/incidents'
    +
    +allmydata.test.test_node.TestCase.test_logdir_is_str
    +===============================================================================
    +[FAIL]
    +Traceback (most recent call last):
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 261, in test_private_config
    +    self.assertEqual(config.get_private_config("already"), "secret")
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/trial/_synctest.py", line 434, in assertEqual
    +    super(_Assertions, self).assertEqual(first, second, msg)
    +  File "/usr/lib/python3.6/unittest/case.py", line 829, in assertEqual
    +    assertion_func(first, second, msg=msg)
    +  File "/usr/lib/python3.6/unittest/case.py", line 822, in _baseAssertEqual
    +    raise self.failureException(msg)
    +twisted.trial.unittest.FailTest: b'secret' != 'secret'
    +
    +allmydata.test.test_node.TestCase.test_private_config
    +===============================================================================
    +[FAIL]
    +Traceback (most recent call last):
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 1418, in _inlineCallbacks
         result = g.send(result)
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_runner.py", line 192, in test_eliot_destination
    @@ -5870,38 +6177,6 @@
     ===============================================================================
     [ERROR]
     Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 305, in test_storage_anonymous_disabled_by_storage
    -    b"[storage]\n"
    -builtins.TypeError: must be str, not bytes
    -
    -allmydata.test.test_client.Basic.test_storage_anonymous_disabled_by_storage
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 289, in test_storage_anonymous_disabled_explicitly
    -    b"[storage]\n"
    -builtins.TypeError: must be str, not bytes
    -
    -allmydata.test.test_client.Basic.test_storage_anonymous_disabled_explicitly
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 258, in test_storage_anonymous_enabled_by_default
    -    b"[storage]\n"
    -builtins.TypeError: must be str, not bytes
    -
    -allmydata.test.test_client.Basic.test_storage_anonymous_enabled_by_default
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 273, in test_storage_anonymous_enabled_explicitly
    -    b"[storage]\n"
    -builtins.TypeError: must be str, not bytes
    -
    -allmydata.test.test_client.Basic.test_storage_anonymous_enabled_explicitly
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 150, in test_unreadable_config
         fileutil.write(fn, BASECONFIG)
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/util/fileutil.py", line 275, in write
    @@ -5932,11 +6207,9 @@
         storage_broker,
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/client.py", line 676, in __init__
         node.Node.__init__(self, config, main_tub, control_tub, i2p_provider, tor_provider)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 734, in __init__
    -    self.setup_logging()
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 824, in setup_logging
    -    ob = o.im_self
    -builtins.AttributeError: 'function' object has no attribute 'im_self'
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 745, in __init__
    +    self.config.write_config_file("my_nodeid", b32encode(self.nodeid).lower() + "\n")
    +builtins.TypeError: can't concat str to bytes
     
     allmydata.test.test_client.Basic.test_web_apiauthtoken
     ===============================================================================
    @@ -5954,16 +6227,6 @@
     ===============================================================================
     [ERROR]
     Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 803, in test_invalid_introducer_furl
    -    config = client.config_from_string("basedir", "client.port", cfg)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_client.IntroducerClients.test_invalid_introducer_furl
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 1418, in _inlineCallbacks
         result = g.send(result)
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 1007, in test_maker
    @@ -6000,417 +6263,22 @@
     ===============================================================================
     [ERROR]
     Traceback (most recent call last):
    -Failure: testtools.testresult.real._StringException: Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 151, in maybeDeferred
    -    result = f(*args, **kw)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/testtools/testcase.py", line 723, in _run_test_method
    -    return self._get_test_method()()
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 1189, in test_anonymous_storage_announcement
    -    self.get_config(storage_enabled=True),
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 1153, in get_config
    -    """.format(
    -AttributeError: 'bytes' object has no attribute 'format'
    -
    -
    -allmydata.test.test_client.StorageAnnouncementTests.test_anonymous_storage_announcement
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -Failure: testtools.testresult.real._StringException: Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 151, in maybeDeferred
    -    result = f(*args, **kw)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/testtools/testcase.py", line 723, in _run_test_method
    -    return self._get_test_method()()
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 1388, in test_broken_storage_plugin
    -    b"[storageserver.plugins.tahoe-lafs-dummy-v1]\n"
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 1153, in get_config
    -    """.format(
    -AttributeError: 'bytes' object has no attribute 'format'
    -
    -
    -allmydata.test.test_client.StorageAnnouncementTests.test_broken_storage_plugin
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -Failure: testtools.testresult.real._StringException: Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 151, in maybeDeferred
    -    result = f(*args, **kw)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/testtools/testcase.py", line 723, in _run_test_method
    -    return self._get_test_method()()
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 1266, in test_multiple_storage_plugin_announcements
    -    b"[storageserver.plugins.tahoe-lafs-dummy-v1]\n"
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 1153, in get_config
    -    """.format(
    -AttributeError: 'bytes' object has no attribute 'format'
    -
    -
    -allmydata.test.test_client.StorageAnnouncementTests.test_multiple_storage_plugin_announcements
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -Failure: testtools.testresult.real._StringException: Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 151, in maybeDeferred
    -    result = f(*args, **kw)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/testtools/testcase.py", line 723, in _run_test_method
    -    return self._get_test_method()()
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 1167, in test_no_announcement
    -    self.get_config(storage_enabled=False),
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 1153, in get_config
    -    """.format(
    -AttributeError: 'bytes' object has no attribute 'format'
    -
    -
    -allmydata.test.test_client.StorageAnnouncementTests.test_no_announcement
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -Failure: testtools.testresult.real._StringException: Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 151, in maybeDeferred
    -    result = f(*args, **kw)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/testtools/testcase.py", line 723, in _run_test_method
    -    return self._get_test_method()()
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 1225, in test_single_storage_plugin_announcement
    -    b"[storageserver.plugins.tahoe-lafs-dummy-v1]\n"
    -AttributeError: 'bytes' object has no attribute 'format'
    -
    -
    -allmydata.test.test_client.StorageAnnouncementTests.test_single_storage_plugin_announcement
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -Failure: testtools.testresult.real._StringException: Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 151, in maybeDeferred
    -    result = f(*args, **kw)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/testtools/testcase.py", line 723, in _run_test_method
    -    return self._get_test_method()()
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 1314, in test_stable_storage_server_furl
    -    b"[storageserver.plugins.tahoe-lafs-dummy-v1]\n"
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 1153, in get_config
    -    """.format(
    -AttributeError: 'bytes' object has no attribute 'format'
    -
    -
    -allmydata.test.test_client.StorageAnnouncementTests.test_stable_storage_server_furl
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -Failure: testtools.testresult.real._StringException: Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 151, in maybeDeferred
    -    result = f(*args, **kw)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/testtools/testcase.py", line 723, in _run_test_method
    -    return self._get_test_method()()
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 1413, in test_storage_plugin_not_found
    -    more_storage=b"plugins=tahoe-lafs-dummy-vX",
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 1153, in get_config
    -    """.format(
    -AttributeError: 'bytes' object has no attribute 'format'
    -
    -
    -allmydata.test.test_client.StorageAnnouncementTests.test_storage_plugin_not_found
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -Failure: testtools.testresult.real._StringException: Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 151, in maybeDeferred
    -    result = f(*args, **kw)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/testtools/testcase.py", line 723, in _run_test_method
    -    return self._get_test_method()()
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 1348, in test_storage_plugin_without_configuration
    -    more_storage=b"plugins=tahoe-lafs-dummy-v1",
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_client.py", line 1153, in get_config
    -    """.format(
    -AttributeError: 'bytes' object has no attribute 'format'
    -
    -
    -allmydata.test.test_client.StorageAnnouncementTests.test_storage_plugin_without_configuration
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 337, in setUp
    -    self.config = config_from_string("fake.port", self.basedir, BASECONFIG)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_connections.Connections.test_default
    -allmydata.test.test_connections.Connections.test_tcp_disabled
    -allmydata.test.test_connections.Connections.test_tor
    -allmydata.test.test_connections.Connections.test_tor_unimportable
    -allmydata.test.test_connections.Connections.test_unknown
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 322, in test_configdir
    -    BASECONFIG + "[i2p]\ni2p.configdir = cfg\n",
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_connections.I2P.test_configdir
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 216, in test_default
    -    config = config_from_string("fake.port", "no-basedir", BASECONFIG)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_connections.I2P.test_default
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 197, in test_disabled
    -    BASECONFIG + "[i2p]\nenabled = false\n",
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_connections.I2P.test_disabled
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 261, in test_launch
    -    BASECONFIG + "[i2p]\nlaunch = true\n",
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_connections.I2P.test_launch
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 291, in test_launch_configdir
    -    BASECONFIG + "[i2p]\nlaunch = true\n" + "i2p.configdir = cfg\n",
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_connections.I2P.test_launch_configdir
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 307, in test_launch_configdir_and_executable
    -    "i2p.executable = i2p\n" + "i2p.configdir = cfg\n",
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_connections.I2P.test_launch_configdir_and_executable
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 276, in test_launch_executable
    -    BASECONFIG + "[i2p]\nlaunch = true\n" + "i2p.executable = i2p\n",
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_connections.I2P.test_launch_executable
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 229, in test_samport
    -    BASECONFIG + "[i2p]\nsam.port = tcp:localhost:1234\n",
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_connections.I2P.test_samport
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 247, in test_samport_and_launch
    -    "sam.port = tcp:localhost:1234\n" + "launch = true\n",
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_connections.I2P.test_samport_and_launch
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 207, in test_unimportable
    -    BASECONFIG,
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_connections.I2P.test_unimportable
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 403, in test_connections
    -    BASECONFIG + "[node]\nreveal-IP-address = false\n",
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_connections.Privacy.test_connections
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 419, in test_connections_tcp_disabled
    -    "[node]\nreveal-IP-address = false\n",
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_connections.Privacy.test_connections_tcp_disabled
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 428, in test_tub_location_auto
    -    BASECONFIG + "[node]\nreveal-IP-address = false\n",
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_connections.Privacy.test_tub_location_auto
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 455, in test_tub_location_legacy_tcp
    -    BASECONFIG + "[node]\nreveal-IP-address = false\ntub.location=hostname:1234\n",
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_connections.Privacy.test_tub_location_legacy_tcp
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 442, in test_tub_location_tcp
    -    BASECONFIG + "[node]\nreveal-IP-address = false\ntub.location=tcp:hostname:1234\n",
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_connections.Privacy.test_tub_location_tcp
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 23, in test_default
    -    BASECONFIG,
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_connections.TCP.test_default
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 182, in test_controlport
    -    BASECONFIG + "[tor]\ncontrol.port = tcp:localhost:1234\n",
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_connections.Tor.test_controlport
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 57, in test_default
    -    config = config_from_string("fake.port", "no-basedir", BASECONFIG)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_connections.Tor.test_default
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 38, in test_disabled
    -    BASECONFIG + "[tor]\nenabled = false\n",
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_connections.Tor.test_disabled
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 100, in test_launch
    -    self._do_test_launch(None)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 72, in _do_test_launch
    -    config = config_from_string("fake.port", ".", config)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_connections.Tor.test_launch
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 103, in test_launch_executable
    -    self._do_test_launch("/special/tor")
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 72, in _do_test_launch
    -    config = config_from_string("fake.port", ".", config)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_connections.Tor.test_launch_executable
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 151, in test_socksport_bad_endpoint
    -    BASECONFIG + "[tor]\nsocks.port = meow:unsupported\n",
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_connections.Tor.test_socksport_bad_endpoint
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 126, in test_socksport_endpoint
    -    BASECONFIG + "[tor]\nsocks.port = tcp:127.0.0.1:1234\n",
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_connections.Tor.test_socksport_endpoint
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 140, in test_socksport_endpoint_otherhost
    -    BASECONFIG + "[tor]\nsocks.port = tcp:otherhost:1234\n",
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_connections.Tor.test_socksport_endpoint_otherhost
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 165, in test_socksport_not_integer
    -    BASECONFIG + "[tor]\nsocks.port = tcp:localhost:kumquat\n",
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_connections.Tor.test_socksport_not_integer
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 112, in test_socksport_unix_endpoint
    -    BASECONFIG + "[tor]\nsocks.port = unix:/var/lib/fw-daemon/tor_socks.socket\n",
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_connections.Tor.test_socksport_unix_endpoint
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_connections.py", line 47, in test_unimportable
    -    config = config_from_string("fake.port", "no-basedir", BASECONFIG)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 1418, in _inlineCallbacks
    +    result = g.send(result)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/client.py", line 281, in create_client_from_config
    +    foolscap_connection_handlers, i2p_provider, tor_provider,
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 669, in create_main_tub
    +    portlocation = _tub_portlocation(config)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 596, in _tub_portlocation
    +    tubport = _convert_tub_port(file_tubport)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 552, in _convert_tub_port
    +    if re.search(r'^\d+$', s):
    +  File "/usr/lib/python3.6/re.py", line 182, in search
    +    return _compile(pattern, flags).search(string)
    +builtins.TypeError: cannot use a string pattern on a bytes-like object
     
    -allmydata.test.test_connections.Tor.test_unimportable
    +allmydata.test.test_codec.T.test_encode
    +allmydata.test.test_codec.T.test_encode
     ===============================================================================
     [ERROR]
     Traceback (most recent call last):
    @@ -7129,8 +6997,12 @@
     ===============================================================================
     [ERROR]
     Traceback (most recent call last):
    -Failure: testtools.testresult.real._StringException: Empty attachments:
    -  twisted-log
    +Failure: testtools.testresult.real._StringException: twisted-log: {{{
    +####-##-## ##:##:##.###Z [-] Foolscap logging initialized
    +####-##-## ##:##:##.###Z [-] Note to developers: twistd.log does not receive very much.
    +####-##-## ##:##:##.###Z [-] Use 'flogtool tail -c NODEDIR/private/logport.furl' instead
    +####-##-## ##:##:##.###Z [-] and read docs/logging.rst
    +}}}
     
     Traceback (most recent call last):
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 1416, in _inlineCallbacks
    @@ -7143,19 +7015,21 @@
         tor_provider,
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/introducer/server.py", line 87, in __init__
         node.Node.__init__(self, config, main_tub, control_tub, i2p_provider, tor_provider)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 734, in __init__
    -    self.setup_logging()
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 824, in setup_logging
    -    ob = o.im_self
    -AttributeError: 'function' object has no attribute 'im_self'
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 745, in __init__
    +    self.config.write_config_file("my_nodeid", b32encode(self.nodeid).lower() + "\n")
    +TypeError: can't concat str to bytes
     
     
     allmydata.test.test_introducer.Node.test_create
     ===============================================================================
     [ERROR]
     Traceback (most recent call last):
    -Failure: testtools.testresult.real._StringException: Empty attachments:
    -  twisted-log
    +Failure: testtools.testresult.real._StringException: twisted-log: {{{
    +####-##-## ##:##:##.###Z [-] Foolscap logging initialized
    +####-##-## ##:##:##.###Z [-] Note to developers: twistd.log does not receive very much.
    +####-##-## ##:##:##.###Z [-] Use 'flogtool tail -c NODEDIR/private/logport.furl' instead
    +####-##-## ##:##:##.###Z [-] and read docs/logging.rst
    +}}}
     
     Traceback (most recent call last):
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 1416, in _inlineCallbacks
    @@ -7168,11 +7042,9 @@
         tor_provider,
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/introducer/server.py", line 87, in __init__
         node.Node.__init__(self, config, main_tub, control_tub, i2p_provider, tor_provider)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 734, in __init__
    -    self.setup_logging()
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 824, in setup_logging
    -    ob = o.im_self
    -AttributeError: 'function' object has no attribute 'im_self'
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 745, in __init__
    +    self.config.write_config_file("my_nodeid", b32encode(self.nodeid).lower() + "\n")
    +TypeError: can't concat str to bytes
     
     
     allmydata.test.test_introducer.Node.test_furl
    @@ -7431,23 +7303,17 @@
     ===============================================================================
     [ERROR]
     Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 655, in test_disabled
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 657, in test_disabled
         n = yield client.create_client(basedir)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/client.py", line 243, in create_client
    -    config = read_config(basedir, u"client.port")
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/client.py", line 219, in read_config
    -    _valid_config=_valid_config(),
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 187, in read_config
    -    parser = configutil.get_config(config_fname)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/util/configutil.py", line 50, in get_config
    -    config.readfp(f)
    -  File "/usr/lib/python3.6/configparser.py", line 764, in readfp
    -    self.read_file(fp, source=filename)
    -  File "/usr/lib/python3.6/configparser.py", line 718, in read_file
    -    self._read(f, source)
    -  File "/usr/lib/python3.6/configparser.py", line 1067, in _read
    -    lineno)
    -configparser.DuplicateSectionError: While reading from '/home/rpatterson/src/work/sfu/tahoe-lafs/_trial_temp/test_node/test_disabled/tahoe.cfg' [line 10]: section 'node' already exists
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 1418, in _inlineCallbacks
    +    result = g.send(result)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/client.py", line 285, in create_client_from_config
    +    introducer_clients = create_introducer_clients(config, main_tub, _introducer_factory)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/client.py", line 519, in create_introducer_clients
    +    introducer_cache_filepath,
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/introducer/client.py", line 29, in __init__
    +    assert type(nickname) is unicode
    +builtins.NameError: name 'unicode' is not defined
     
     allmydata.test.test_node.ClientNotListening.test_disabled
     ===============================================================================
    @@ -7455,7 +7321,7 @@
     Traceback (most recent call last):
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 577, in test_listen_on_zero
         t = FakeTub()
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 549, in __init__
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 548, in __init__
         self.tubID = base64.b32encode("foo")
       File "/usr/lib/python3.6/base64.py", line 154, in b32encode
         s = memoryview(s).tobytes()
    @@ -7465,9 +7331,9 @@
     ===============================================================================
     [ERROR]
     Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 605, in test_multiple_ports
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 606, in test_multiple_ports
         t = FakeTub()
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 549, in __init__
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 548, in __init__
         self.tubID = base64.b32encode("foo")
       File "/usr/lib/python3.6/base64.py", line 154, in b32encode
         s = memoryview(s).tobytes()
    @@ -7477,9 +7343,9 @@
     ===============================================================================
     [ERROR]
     Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 624, in test_tor_i2p_listeners
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 626, in test_tor_i2p_listeners
         t = FakeTub()
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 549, in __init__
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 548, in __init__
         self.tubID = base64.b32encode("foo")
       File "/usr/lib/python3.6/base64.py", line 154, in b32encode
         s = memoryview(s).tobytes()
    @@ -7489,93 +7355,29 @@
     ===============================================================================
     [ERROR]
     Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 112, in test_location1
    -    tub_location="192.0.2.0:1234")
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 99, in _test_location
    -    tub = testing_tub(config_data)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 53, in testing_tub
    -    config = config_from_string(basedir, 'DEFAULT_PORTNUMFILE_BLANK', config_data)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_node.TestCase.test_location1
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 117, in test_location2
         tub_location="192.0.2.0:1234,example.org:8091")
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 99, in _test_location
         tub = testing_tub(config_data)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 53, in testing_tub
    -    config = config_from_string(basedir, 'DEFAULT_PORTNUMFILE_BLANK', config_data)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 65, in testing_tub
    +    cert_filename='DEFAULT_CERTFILE_BLANK'
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 669, in create_main_tub
    +    portlocation = _tub_portlocation(config)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 596, in _tub_portlocation
    +    tubport = _convert_tub_port(file_tubport)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 552, in _convert_tub_port
    +    if re.search(r'^\d+$', s):
    +  File "/usr/lib/python3.6/re.py", line 182, in search
    +    return _compile(pattern, flags).search(string)
    +builtins.TypeError: cannot use a string pattern on a bytes-like object
     
     allmydata.test.test_node.TestCase.test_location2
     ===============================================================================
     [ERROR]
     Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 142, in test_location_auto_and_explicit
    -    local_addresses=["127.0.0.1", "192.0.2.0", "example.com:4321"],
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 99, in _test_location
    -    tub = testing_tub(config_data)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 53, in testing_tub
    -    config = config_from_string(basedir, 'DEFAULT_PORTNUMFILE_BLANK', config_data)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_node.TestCase.test_location_auto_and_explicit
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 128, in test_location_not_set
    -    local_addresses=["127.0.0.1", "192.0.2.0"],
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 99, in _test_location
    -    tub = testing_tub(config_data)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 53, in testing_tub
    -    config = config_from_string(basedir, 'DEFAULT_PORTNUMFILE_BLANK', config_data)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_node.TestCase.test_location_not_set
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 340, in test_logdir_is_str
    -    yield client.create_client(basedir)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/twisted/internet/defer.py", line 1418, in _inlineCallbacks
    -    result = g.send(result)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/client.py", line 298, in create_client_from_config
    -    storage_broker,
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/client.py", line 676, in __init__
    -    node.Node.__init__(self, config, main_tub, control_tub, i2p_provider, tor_provider)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 734, in __init__
    -    self.setup_logging()
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 824, in setup_logging
    -    ob = o.im_self
    -builtins.AttributeError: 'function' object has no attribute 'im_self'
    -
    -allmydata.test.test_node.TestCase.test_logdir_is_str
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 259, in test_private_config
    -    config = config_from_string(basedir, "", "")
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_node.TestCase.test_private_config
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 213, in test_private_config_unreadable
         config.get_or_create_private_config("foo", "contents")
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 369, in get_or_create_private_config
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 374, in get_or_create_private_config
         fileutil.write(privname, value)
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/util/fileutil.py", line 275, in write
         f.write(data)
    @@ -7593,96 +7395,20 @@
     ===============================================================================
     [ERROR]
     Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 288, in test_write_config_unwritable_file
    -    config = config_from_string(basedir, "", "")
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_node.TestCase.test_write_config_unwritable_file
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 488, in test_disabled_port_not_tub
    -    config = config_from_string(self.basedir, "portnum", config_data)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_node.TestMissingPorts.test_disabled_port_not_tub
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 506, in test_disabled_tub_not_port
    -    config = config_from_string(self.basedir, "portnum", config_data)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_node.TestMissingPorts.test_disabled_tub_not_port
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 470, in test_empty_tub_location
    -    config = config_from_string(self.basedir, "portnum", config_data)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_node.TestMissingPorts.test_empty_tub_location
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 453, in test_empty_tub_port
    -    config = config_from_string(self.basedir, "portnum", config_data)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_node.TestMissingPorts.test_empty_tub_port
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 439, in test_parsing_all_disabled
    -    config = config_from_string(self.basedir, "portnum", config_data)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_node.TestMissingPorts.test_parsing_all_disabled
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 392, in test_parsing_defaults
    -    config = config_from_string(self.basedir, "portnum", config_data)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_node.TestMissingPorts.test_parsing_defaults
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 415, in test_parsing_location_complex
    -    config = config_from_string(self.basedir, "portnum", config_data)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 418, in test_parsing_location_complex
    +    tubport, tublocation = _tub_portlocation(config)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 596, in _tub_portlocation
    +    tubport = _convert_tub_port(file_tubport)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 552, in _convert_tub_port
    +    if re.search(r'^\d+$', s):
    +  File "/usr/lib/python3.6/re.py", line 182, in search
    +    return _compile(pattern, flags).search(string)
    +builtins.TypeError: cannot use a string pattern on a bytes-like object
     
     allmydata.test.test_node.TestMissingPorts.test_parsing_location_complex
     ===============================================================================
     [ERROR]
     Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_node.py", line 370, in test_parsing_tcp
    -    config = config_from_string(self.basedir, "portnum", config_data)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    -
    -allmydata.test.test_node.TestMissingPorts.test_parsing_tcp
    -===============================================================================
    -[ERROR]
    -Traceback (most recent call last):
     Failure: testtools.testresult.real._StringException: Traceback (most recent call last):
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/test_python2_regressions.py", line 53, in test_new_style_classes
         mod.load()
    @@ -8306,9 +8032,19 @@
         raise exc_obj.with_traceback(exc_tb)
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/testtools/testcase.py", line 735, in useFixture
         fixture.setUp()
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/common.py", line 261, in setUp
    -    """.format(
    -AttributeError: 'bytes' object has no attribute 'format'
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/common.py", line 265, in setUp
    +    plugin_config_section=plugin_config_section,
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 214, in config_from_string
    +    parser.readfp(StringIO(config_str))
    +  File "/usr/lib/python3.6/configparser.py", line 764, in readfp
    +    self.read_file(fp, source=filename)
    +  File "/usr/lib/python3.6/configparser.py", line 718, in read_file
    +    self._read(f, source)
    +  File "/usr/lib/python3.6/configparser.py", line 1112, in _read
    +    raise e
    +configparser.ParsingError: Source contains parsing errors: '<???>'
    +	[line  3]: "b''\n"
    +	[line  8]: "b''\n"
     
     
     allmydata.test.test_storage_client.PluginMatchedAnnouncement.test_enabled_no_configuration_plugin
    @@ -8350,9 +8086,19 @@
         raise exc_obj.with_traceback(exc_tb)
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/py36-coverage/lib/python3.6/site-packages/testtools/testcase.py", line 735, in useFixture
         fixture.setUp()
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/common.py", line 261, in setUp
    -    """.format(
    -AttributeError: 'bytes' object has no attribute 'format'
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/common.py", line 265, in setUp
    +    plugin_config_section=plugin_config_section,
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 214, in config_from_string
    +    parser.readfp(StringIO(config_str))
    +  File "/usr/lib/python3.6/configparser.py", line 764, in readfp
    +    self.read_file(fp, source=filename)
    +  File "/usr/lib/python3.6/configparser.py", line 718, in read_file
    +    self._read(f, source)
    +  File "/usr/lib/python3.6/configparser.py", line 1112, in _read
    +    raise e
    +configparser.ParsingError: Source contains parsing errors: '<???>'
    +	[line  3]: "b''\n"
    +	[line  8]: "b''\n"
     
     
     allmydata.test.test_storage_client.PluginMatchedAnnouncement.test_ignored_non_enabled_plugin
    @@ -8451,11 +8197,9 @@
         tor_provider,
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/introducer/server.py", line 87, in __init__
         node.Node.__init__(self, config, main_tub, control_tub, i2p_provider, tor_provider)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 734, in __init__
    -    self.setup_logging()
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 824, in setup_logging
    -    ob = o.im_self
    -builtins.AttributeError: 'function' object has no attribute 'im_self'
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 745, in __init__
    +    self.config.write_config_file("my_nodeid", b32encode(self.nodeid).lower() + "\n")
    +builtins.TypeError: can't concat str to bytes
     
     allmydata.test.test_system.Connections.test_rref
     allmydata.test.test_system.SystemTest.test_filesystem
    @@ -8548,11 +8292,13 @@
     ===============================================================================
     [ERROR]
     Traceback (most recent call last):
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/web/test_introducer.py", line 187, in test_json
    -    config = node.config_from_string(self.mktemp(), "", "")
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 209, in config_from_string
    -    parser.readfp(BytesIO(config_str))
    -builtins.TypeError: a bytes-like object is required, not 'str'
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/test/web/test_introducer.py", line 192, in test_json
    +    introducer_node = _IntroducerNode(config, main_tub, None, None, None)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/introducer/server.py", line 87, in __init__
    +    node.Node.__init__(self, config, main_tub, control_tub, i2p_provider, tor_provider)
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 745, in __init__
    +    self.config.write_config_file("my_nodeid", b32encode(self.nodeid).lower() + "\n")
    +builtins.TypeError: can't concat str to bytes
     
     allmydata.test.web.test_introducer.IntroducerRootTests.test_json
     ===============================================================================
    @@ -8570,11 +8316,9 @@
         tor_provider,
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/introducer/server.py", line 87, in __init__
         node.Node.__init__(self, config, main_tub, control_tub, i2p_provider, tor_provider)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 734, in __init__
    -    self.setup_logging()
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 824, in setup_logging
    -    ob = o.im_self
    -builtins.AttributeError: 'function' object has no attribute 'im_self'
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 745, in __init__
    +    self.config.write_config_file("my_nodeid", b32encode(self.nodeid).lower() + "\n")
    +builtins.TypeError: can't concat str to bytes
     
     allmydata.test.web.test_introducer.IntroducerWeb.test_basic_information
     ===============================================================================
    @@ -8592,11 +8336,9 @@
         tor_provider,
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/introducer/server.py", line 87, in __init__
         node.Node.__init__(self, config, main_tub, control_tub, i2p_provider, tor_provider)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 734, in __init__
    -    self.setup_logging()
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 824, in setup_logging
    -    ob = o.im_self
    -builtins.AttributeError: 'function' object has no attribute 'im_self'
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 745, in __init__
    +    self.config.write_config_file("my_nodeid", b32encode(self.nodeid).lower() + "\n")
    +builtins.TypeError: can't concat str to bytes
     
     allmydata.test.web.test_introducer.IntroducerWeb.test_json_front_page
     ===============================================================================
    @@ -8614,11 +8356,9 @@
         tor_provider,
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/introducer/server.py", line 87, in __init__
         node.Node.__init__(self, config, main_tub, control_tub, i2p_provider, tor_provider)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 734, in __init__
    -    self.setup_logging()
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 824, in setup_logging
    -    ob = o.im_self
    -builtins.AttributeError: 'function' object has no attribute 'im_self'
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 745, in __init__
    +    self.config.write_config_file("my_nodeid", b32encode(self.nodeid).lower() + "\n")
    +builtins.TypeError: can't concat str to bytes
     
     allmydata.test.web.test_introducer.IntroducerWeb.test_tahoe_css
     ===============================================================================
    @@ -8636,11 +8376,9 @@
         tor_provider,
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/introducer/server.py", line 87, in __init__
         node.Node.__init__(self, config, main_tub, control_tub, i2p_provider, tor_provider)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 734, in __init__
    -    self.setup_logging()
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 824, in setup_logging
    -    ob = o.im_self
    -builtins.AttributeError: 'function' object has no attribute 'im_self'
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 745, in __init__
    +    self.config.write_config_file("my_nodeid", b32encode(self.nodeid).lower() + "\n")
    +builtins.TypeError: can't concat str to bytes
     
     allmydata.test.web.test_introducer.IntroducerWeb.test_welcome
     ===============================================================================
    @@ -8726,7 +8464,7 @@
     -------------------------------------------------------------------------------
     Ran 1300 tests in ###.###s
     
    -FAILED (skips=42, expectedFailures=1, failures=34, errors=532, successes=707)
    +FAILED (skips=42, expectedFailures=1, failures=45, errors=476, successes=753)
     
     Unknown error
     Traceback (most recent call last):
    @@ -8745,11 +8483,9 @@
         storage_broker,
       File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/client.py", line 676, in __init__
         node.Node.__init__(self, config, main_tub, control_tub, i2p_provider, tor_provider)
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 734, in __init__
    -    self.setup_logging()
    -  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 824, in setup_logging
    -    ob = o.im_self
    -builtins.AttributeError: 'function' object has no attribute 'im_self'
    +  File "/home/rpatterson/src/work/sfu/tahoe-lafs/src/allmydata/node.py", line 745, in __init__
    +    self.config.write_config_file("my_nodeid", b32encode(self.nodeid).lower() + "\n")
    +builtins.TypeError: can't concat str to bytes
     + test_exit=1
     + ./.tox/py36-coverage/bin/coverage combine
     + ./.tox/py36-coverage/bin/coverage html
    @@ -8760,7 +8496,7 @@
     src/allmydata/__main__.py                                4      1      2      1    67%   6, 5->6
     src/allmydata/blacklist.py                             110     51     10      1    52%   16-17, 34-48, 55, 64-66, 69, 72, 75, 78, 81, 84, 87, 91, 94, 97, 100, 103, 106, 109, 112, 115, 118, 121, 124, 127, 132, 135, 138, 141, 144, 147, 150, 153, 156, 159, 53->55
     src/allmydata/check_results.py                         208    109     62      7    44%   27-30, 33, 51, 55, 64-65, 70, 72, 74, 77, 79, 82, 90, 92, 95, 98, 101, 104, 107, 109, 112, 115-138, 141, 143, 145, 147, 153-154, 157, 159, 161, 163-165, 167, 169, 177, 181-188, 191, 194, 197, 200, 203, 206, 213-226, 229, 242-248, 251-279, 282, 297, 24->29, 26->27, 32->33, 50->51, 54->55, 63->64, 176->177
    -src/allmydata/client.py                                472    197    107     14    52%   165, 311-322, 350-364, 373, 384, 400, 427-433, 444-451, 474-482, 493, 501, 521, 547, 562, 585-598, 615-617, 631, 643, 692, 697-700, 709-712, 727, 753-754, 757, 763, 766-785, 798-857, 861-893, 902, 910-911, 917-931, 936, 964, 989-993, 1004, 1021-1024, 1027-1036, 1042-1049, 1053-1062, 1066-1078, 1081-1089, 1095, 1098, 1101, 1104, 1111-1115, 1130, 1133, 77->exit, 270->273, 463->467, 492->493, 500->501, 561->562, 691->692, 696->697, 708->709, 717->exit, 935->936, 1003->1004, 1052->1053, 1065->1066
    +src/allmydata/client.py                                472    192    107     10    54%   165, 311-322, 350-364, 373, 384, 400, 427-433, 444-451, 474-482, 493, 547, 585-598, 615-617, 692, 697-700, 709-712, 727, 753-754, 757, 763, 766-785, 798-857, 861-893, 902, 910-911, 917-931, 936, 964, 989-993, 1004, 1021-1024, 1027-1036, 1042-1049, 1053-1062, 1066-1078, 1081-1089, 1095, 1098, 1101, 1104, 1111-1115, 1130, 1133, 270->273, 492->493, 691->692, 696->697, 708->709, 717->exit, 935->936, 1003->1004, 1052->1053, 1065->1066
     src/allmydata/codec.py                                  60      2     12      1    96%   13, 74, 12->13
     src/allmydata/control.py                               227    186     62      0    16%   16-33, 36-37, 44-45, 47-51, 53, 55-56, 62, 65-84, 87-99, 102-106, 109, 115-121, 123-145, 149-154, 157-162, 165-178, 181-220, 223-242, 245-248, 253, 255-259, 261, 263
     src/allmydata/crypto/__init__.py                         7      1      2      1    78%   19, 18->19
    @@ -8807,7 +8543,7 @@
     src/allmydata/mutable/repairer.py                       57     37     18      0    29%   13, 15, 17, 19, 29-34, 65-71, 74-126, 129-131
     src/allmydata/mutable/retrieve.py                      489    123    120     33    71%   46, 48, 50, 52, 56, 58, 60, 62, 64, 89-90, 133, 186-193, 204-208, 211-212, 224-226, 231, 240, 251, 312, 318, 344-354, 377, 385-386, 399-400, 425-434, 490, 501, 515-516, 529-540, 564-578, 591-592, 629-630, 653-654, 674-675, 681-682, 698, 712-729, 758-760, 765, 772-774, 790-792, 871, 883, 909-910, 919-941, 965-966, 981-994, 999-1005, 129->133, 167->169, 169->171, 201->204, 223->224, 230->231, 237->239, 239->240, 243->247, 249->251, 309->312, 317->318, 376->377, 381->385, 391->394, 396->399, 424->425, 489->490, 499->501, 514->515, 590->591, 628->629, 652->653, 673->674, 677->687, 680->681, 687->694, 694->698, 755->764, 764->765, 868->871, 880->883, 964->965
     src/allmydata/mutable/servermap.py                     612    240    186     26    56%   45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 74, 130-139, 142, 148, 159-161, 175, 177, 183, 186-199, 206, 213, 217-220, 231, 234-238, 243-252, 255-259, 315, 328-350, 358-363, 370-372, 379, 429, 433, 443-447, 495, 498, 506-508, 514-516, 569-570, 603-611, 623-638, 718-721, 732-741, 792, 796, 803-804, 850-851, 872-874, 911-915, 929-945, 961-975, 982-999, 1003-1013, 1043-1045, 1050-1052, 1060-1064, 1069-1070, 1093-1100, 1106-1186, 1214-1215, 1232-1233, 313->315, 427->429, 432->433, 439->443, 459->461, 493->495, 497->498, 504->506, 509->514, 566->569, 597->603, 687->exit, 702->exit, 710->exit, 717->718, 727->732, 759->exit, 791->792, 795->796, 869->872, 1039->1043, 1047->1050, 1059->1060, 1066->1069, 1092->1093, 1213->1214
    -src/allmydata/node.py                                  388     84    146     34    75%   120, 132, 190, 241, 243-245, 278, 284, 294-295, 303-306, 315, 320, 339, 341, 361, 393-396, 422, 449, 453, 490, 493, 500, 511-512, 548, 566, 574, 581, 583, 590-591, 601, 612, 629-633, 679, 681, 738-741, 747, 756, 764, 792-805, 808-809, 814-815, 825-846, 189->190, 240->241, 242->243, 277->278, 314->315, 319->320, 338->339, 340->341, 360->361, 391->393, 421->422, 448->449, 451->453, 489->490, 492->493, 499->500, 510->511, 537->535, 547->548, 565->566, 573->574, 580->581, 582->583, 589->590, 600->601, 611->612, 622->629, 673->679, 680->681, 737->738, 746->747, 763->764, 821->830, 823->821
    +src/allmydata/node.py                                  391     52    148     23    85%   20, 125, 137, 195, 246, 248-250, 283, 289, 308-311, 320, 325, 344, 346, 366, 398-401, 427, 454, 458, 606, 634-638, 684, 686, 746, 752, 761, 769, 797-810, 813-814, 819-820, 837, 842, 19->20, 194->195, 245->246, 247->248, 282->283, 319->320, 324->325, 343->344, 345->346, 365->366, 396->398, 426->427, 453->454, 456->458, 605->606, 627->634, 678->684, 685->686, 751->752, 768->769, 828->826, 836->837, 840->842
     src/allmydata/nodemaker.py                              97     23     38     10    70%   49, 61, 66, 70, 81, 94, 107-115, 130-138, 141-150, 57->61, 65->66, 69->70, 79->81, 86->95, 90->94, 104->107, 124->exit, 129->130, 129->133
     src/allmydata/scripts/admin.py                          51     20      2      1    60%   9-14, 25, 28, 31-37, 40-46, 57, 59, 61-66, 56->57
     src/allmydata/scripts/backupdb.py                      146     91     14      1    36%   84-91, 94-96, 99, 103, 106, 111-114, 117-119, 122, 125, 128, 176-221, 231-242, 245-263, 266-272, 308-324, 327-333, 336-341, 306->308
    @@ -8817,7 +8553,7 @@
     src/allmydata/scripts/create_node.py                   302     98    114     10    66%   224-229, 235, 257-260, 262-265, 268-269, 289-292, 295-298, 329, 339, 347-380, 391-445, 461-477, 223->224, 234->235, 256->257, 261->262, 266->277, 267->268, 288->289, 294->295, 328->329, 338->339
     src/allmydata/scripts/debug.py                         719    638    202      0     9%   14, 31-32, 35-49, 52-60, 63-142, 146-154, 157-164, 168-217, 220-304, 307-401, 407, 417, 437-465, 468-485, 488-602, 606, 609-611, 637-648, 653-656, 659, 683-689, 692-810, 813-842, 845-848, 851-865, 869, 888, 891-940, 946, 949-950, 957, 960-961, 967-972, 984-985, 999-1000, 1003-1004, 1020-1021, 1025-1031, 1046-1050
     src/allmydata/scripts/default_nodedir.py                15      5      6      2    57%   10-14, 9->10, 16->exit
    -src/allmydata/scripts/run_common.py                    135     18     24      6    85%   37, 41-46, 59-60, 149, 158, 192-193, 216-220, 226-227, 55->62, 135->exit, 135->exit, 148->149, 191->192, 225->226
    +src/allmydata/scripts/run_common.py                    135     17     24      5    86%   37, 41-46, 59-60, 158, 192-193, 216-220, 226-227, 55->62, 135->exit, 135->exit, 191->192, 225->226
     src/allmydata/scripts/runner.py                        138     49     42      5    61%   84-85, 91, 97-99, 150, 153-160, 174-181, 188-192, 202-232, 237-252, 255, 31->36, 149->150, 151->153, 185->188, 254->255
     src/allmydata/scripts/slow_operation.py                 69     56     22      0    14%   15-44, 47-52, 55-61, 64-83
     src/allmydata/scripts/stats_gatherer.py                 44     16     12      3    59%   8, 30, 75-79, 84-93, 7->8, 29->30, 74->75
    @@ -8869,9 +8605,9 @@
     src/allmydata/util/happinessutil.py                     77      1     42      1    98%   15, 13->15
     src/allmydata/util/hashutil.py                         157      3      8      1    98%   14, 236, 278, 12->14
     src/allmydata/util/humanreadable.py                     80     16     28      7    73%   14, 35, 38-41, 44-51, 74, 80, 83, 13->14, 32->35, 68->74, 79->80, 82->83, 91->exit, 106->exit
    -src/allmydata/util/i2p_provider.py                     121      5     36      4    94%   93, 177, 206, 219, 226, 62->65, 92->93, 176->177, 205->206
    +src/allmydata/util/i2p_provider.py                     121      4     36      3    96%   93, 206, 219, 226, 62->65, 92->93, 205->206
     src/allmydata/util/iputil.py                           172     25     56      7    83%   14, 65-67, 73-102, 153-166, 181-184, 242, 246, 13->14, 69->73, 125->128, 220->242, 245->246, 249->259, 265->261
    -src/allmydata/util/log.py                               52      2     16      2    94%   13, 40, 12->13, 39->40
    +src/allmydata/util/log.py                               52      1     16      1    97%   13, 12->13
     src/allmydata/util/mathutil.py                          12      1      2      1    86%   16, 15->16
     src/allmydata/util/netstring.py                         35      1     12      1    96%   13, 12->13
     src/allmydata/util/observer.py                          91      3     20      5    93%   14, 139, 145, 13->14, 96->exit, 138->139, 142->145, 156->exit
    @@ -8904,7 +8640,7 @@
     src/allmydata/windows/fixups.py                        133    133     54      0     0%   1-237
     src/allmydata/windows/registry.py                       42     42     12      0     0%   1-77
     ------------------------------------------------------------------------------------------------
    -TOTAL                                                27477  11800   8244    606    54%
    +TOTAL                                                27480  11760   8246    588    54%
     
     18 files skipped due to complete coverage.
     + '[' '!' -z 1 ']'
    
    Python 3 Porting 
    opened by rpatterson 12
  • 3382 Remove web.common.MultiFormatPage

    3382 Remove web.common.MultiFormatPage

    Fixes 3382.

    PR #780 removed the last remaining use of web.common.MultiFormatPage, and was merged. This was originally stacked on top of PR #780, and it has been updated against changes in master.

    Nevow Removal 
    opened by sajith 12
  • Add py38 to CI

    Add py38 to CI

    I've got tox barely running under Python 3.8 locally, making a PR so I can start seeing what CI does with it.

    (I don't have perms on Trac yet to make a new ticket, so my branch name uses the old mega-ticket 2065.)

    Punchlist

    • [x] get py38 to run to completion
    • [x] think through tor_requires/i2p_requires
    • [x] work around pip 19.0.3-related bug: https://github.com/tahoe-lafs/tahoe-lafs/pull/732#issuecomment-652983675
    • [x] make a Trac ticket: https://tahoe-lafs.org/trac/tahoe-lafs/ticket/3325
    • [ ] fix anything else outside of py38
    • [x] add ratchet.py and configure tox.ini to work with it
    • [x] redo the branch & PR
    • [ ] satisfy towncrier
    opened by chadwhitacre 12
  • Make pypy work

    Make pypy work

    Make the unit-test suite run under PyPy. All the integration tests run and manual testing seems to confirm "it works" (for whatever things I happened to test).


    This change is Reviewable

    opened by meejah 12
  • Base Dockerfile initial version.

    Base Dockerfile initial version.

    I'm Dockerizing Tahoe-LAFS and working to set up public Docker images on Docker Hub. I think that providing Docker images for Tahoe-LAFS would ease installation and deployment and enhance Tahoe-LAFS' visibility. Also, with composition tools in the Docker ecosystem such as Docker Compose, you will be able to start an entire grid with a single command by crafting an appropiate docker-compose.yml file. I've created Tahoe-LAFS organization repos and set up automated builds linked to my personal github account, by now. Happily will hand the organization ownership to maintainers and/or link the automated builds to upstream github repos. Now I'm working on specific -node and -introducer Docker images, based on tahoelafs/base.

    opened by pataquets 12
  • Speed up that one RSA test

    Speed up that one RSA test

    See https://tahoe-lafs.org/trac/tahoe-lafs/ticket/3914

    CI job timings pre-cryptography 39:

    • https://app.circleci.com/pipelines/github/tahoe-lafs/tahoe-lafs/4182/workflows/c2814ff0-fc9a-4ae4-8f04-e47ddd39c8ed
    • Ubuntu 20.04 - 13m57s
    • Oracle Linux 8 - 15m26s
    • Debian 11 - 14m29s
    • Debian 10 - 14m51s
    • c-locale - 13m24s

    CI job timings with cryptography 39:

    • https://app.circleci.com/pipelines/github/tahoe-lafs/tahoe-lafs/4226/workflows/95ce9f6f-47e1-4a76-8d99-319c8580d4d5
    • Ubuntu 20.04 - 9m9s (34% faster)
    • Oracle Linux 8 - 9m28s (38% faster)
    • Debian 11 - 9m19s (35% faster)
    • Debian 10 - 10m2s (32% faster)
    • c-locale - 9m20s (30% faster)
    opened by exarkun 1
  • Refactor test_storage.py to use base test classes

    Refactor test_storage.py to use base test classes

    There are base test classes namely SyncTestCase and AsyncTestCase which we would like all test classes in this code base to extend.

    This commit extends the listed classes in test_storage.py to extend the above mentioned base classes:

    • UtilTests
    • BucketProxy
    • Server
    opened by Fenn-CS 5
  • Grid manager proposal, updated to latest code and Python 3

    Grid manager proposal, updated to latest code and Python 3

    Remaining steps:

    • [x] @meejah reviews the merge forward
    • [x] Get integration testing running against this version, to see if it works end-to-end (see #1208 for results)
    • [ ] Any other review needed
    opened by itamarst 5
Releases(tahoe-lafs-1.17.0)
  • tahoe-lafs-1.17.0(Dec 6, 2021)

    -----BEGIN PGP SIGNED MESSAGE-----
    Hash: SHA512
    
    ANNOUNCING Tahoe, the Least-Authority File Store, v1.17.0
    
    The Tahoe-LAFS team is pleased to announce version 1.17.0 of
    Tahoe-LAFS, an extremely reliable decentralized storage
    system. Get it with "pip install tahoe-lafs", or download a
    tarball here:
    
      https://tahoe-lafs.org/downloads
    
    Tahoe-LAFS is the first distributed storage system to offer
    "provider-independent security" — meaning that not even the
    operators of your storage servers can read or alter your data
    without your consent. Here is the one-page explanation of its
    unique security and fault-tolerance properties:
    
      https://tahoe-lafs.readthedocs.org/en/latest/about.html
    
    The previous stable release of Tahoe-LAFS was v1.16.0, released on
    October 19, 2021.
    
    This release fixes several security issues raised as part of an audit
    by Cure53. We developed fixes for these issues in a private
    repository. Shortly after this release, public tickets will be updated
    with further information (along with, of course, all the code).
    
    There is also OpenMetrics support now and several bug fixes.
    
    In all, 46 issues have been fixed since the last release.
    
    Please see ``NEWS.rst`` for a more complete list of changes.
    
    
    WHAT IS IT GOOD FOR?
    
    With Tahoe-LAFS, you distribute your data across multiple
    servers. Even if some of the servers fail or are taken over
    by an attacker, the entire file store continues to function
    correctly, preserving your privacy and security. You can
    easily share specific files and directories with other people.
    
    In addition to the core storage system itself, volunteers
    have built other projects on top of Tahoe-LAFS and have
    integrated Tahoe-LAFS with existing systems, including
    Windows, JavaScript, iPhone, Android, Hadoop, Flume, Django,
    Puppet, bzr, mercurial, perforce, duplicity, TiddlyWiki, and
    more. See the Related Projects page on the wiki [3].
    
    We believe that strong cryptography, Free and Open Source
    Software, erasure coding, and principled engineering practices
    make Tahoe-LAFS safer than RAID, removable drive, tape,
    on-line backup or cloud storage.
    
    This software is developed under test-driven development, and
    there are no known bugs or security flaws which would
    compromise confidentiality or data integrity under recommended
    use. (For all important issues that we are currently aware of
    please see the known_issues.rst file [2].)
    
    
    COMPATIBILITY
    
    This release should be compatible with the version 1 series of
    Tahoe-LAFS. Clients from this release can write files and
    directories in the format used by clients of all versions back
    to v1.0 (which was released March 25, 2008). Clients from this
    release can read files and directories produced by clients of
    all versions since v1.0.
    
    Network connections are limited by the Introducer protocol in
    use. If the Introducer is running v1.10 or v1.11, then servers
    from this release (v1.12) can serve clients of all versions
    back to v1.0 . If it is running v1.12, then they can only
    serve clients back to v1.10. Clients from this release can use
    servers back to v1.10, but not older servers.
    
    Except for the new optional MDMF format, we have not made any
    intentional compatibility changes. However we do not yet have
    the test infrastructure to continuously verify that all new
    versions are interoperable with previous versions. We intend
    to build such an infrastructure in the future.
    
    This is the twenty-first release in the version 1 series. This
    series of Tahoe-LAFS will be actively supported and maintained
    for the foreseeable future, and future versions of Tahoe-LAFS
    will retain the ability to read and write files compatible
    with this series.
    
    
    LICENCE
    
    You may use this package under the GNU General Public License,
    version 2 or, at your option, any later version. See the file
    "COPYING.GPL" [4] for the terms of the GNU General Public
    License, version 2.
    
    You may use this package under the Transitive Grace Period
    Public Licence, version 1 or, at your option, any later
    version. (The Transitive Grace Period Public Licence has
    requirements similar to the GPL except that it allows you to
    delay for up to twelve months after you redistribute a derived
    work before releasing the source code of your derived work.)
    See the file "COPYING.TGPPL.rst" [5] for the terms of the
    Transitive Grace Period Public Licence, version 1.
    
    (You may choose to use this package under the terms of either
    licence, at your option.)
    
    
    INSTALLATION
    
    Tahoe-LAFS works on Linux, Mac OS X, Windows, Solaris, *BSD,
    and probably most other systems. Start with "docs/INSTALL.rst"
    [6].
    
    
    HACKING AND COMMUNITY
    
    Please join us on the mailing list [7]. Patches are gratefully
    accepted -- the Roadmap page [8] shows the next improvements
    that we plan to make and CREDITS [9] lists the names of people
    who've contributed to the project. The Dev page [10] contains
    resources for hackers.
    
    
    SPONSORSHIP
    
    A special thanks goes out to Least Authority Enterprises [12],
    which employs several Tahoe-LAFS developers, for their
    continued support.
    
    HACK TAHOE-LAFS!
    
    If you can find a security flaw in Tahoe-LAFS which is serious
    enough that we feel compelled to warn our users and issue a fix,
    then we will award you with a customized t-shirt with your
    exploit printed on it and add you to the "Hack Tahoe-LAFS Hall
    Of Fame" [13].
    
    
    ACKNOWLEDGEMENTS
    
    This is the eighteenth release of Tahoe-LAFS to be created
    solely as a labor of love by volunteers. Thank you very much
    to the team of "hackers in the public interest" who make
    Tahoe-LAFS possible.
    
    meejah
    on behalf of the Tahoe-LAFS team
    
    December 6, 2021
    Planet Earth
    
    
    [1] https://github.com/tahoe-lafs/tahoe-lafs/blob/tahoe-lafs-1.17.0/NEWS.rst
    [2] https://github.com/tahoe-lafs/tahoe-lafs/blob/master/docs/known_issues.rst
    [3] https://tahoe-lafs.org/trac/tahoe-lafs/wiki/RelatedProjects
    [4] https://github.com/tahoe-lafs/tahoe-lafs/blob/tahoe-lafs-1.17.0/COPYING.GPL
    [5] https://github.com/tahoe-lafs/tahoe-lafs/blob/tahoe-lafs-1.17.0/COPYING.TGPPL.rst
    [6] https://tahoe-lafs.readthedocs.org/en/tahoe-lafs-1.17.0/INSTALL.html
    [7] https://lists.tahoe-lafs.org/mailman/listinfo/tahoe-dev
    [8] https://tahoe-lafs.org/trac/tahoe-lafs/roadmap
    [9] https://github.com/tahoe-lafs/tahoe-lafs/blob/master/CREDITS
    [10] https://tahoe-lafs.org/trac/tahoe-lafs/wiki/Dev
    [12] https://leastauthority.com/
    [13] https://tahoe-lafs.org/hacktahoelafs/
    [14] https://github.com/warner/magic-wormhole
    -----BEGIN PGP SIGNATURE-----
    
    iQEzBAEBCgAdFiEEnVor1WiOy4id680/wmAoAxKAaacFAmGuWnsACgkQwmAoAxKA
    aaecbwgA6IXrKZVo+LjNkGQERzblr+ElTxmH4n1h3yScx5qtzVmhw+Jxl+QyVy3u
    oudf1MFLlvV6JGdYXc0uRrBk0xifNgNEcvIIyEbP2A0xhyDw4tQno/In/isU9pXI
    5eN4j+Cb7CJPO4Fpq0TGbDZchE3/5nwthaw3iMUCr3yXTM3m7gX/qv5ttmmiR2pg
    rGi+bkm8XmefqUeR6M0+8liQsNyQgO7I1ehbfRoYMhrAzO0sPVtBIr799kC9HDnZ
    T5bc/FEKDSIrQ+pJHf+XnUru99xe4dZAfPKqKUVvKcKaqKR39XRJqb+Fb6zbK5Jc
    WzbHOGiKC4dvFegAN/c7rKChWgmM5g==
    =oqN7
    -----END PGP SIGNATURE-----
    
    
    Source code(tar.gz)
    Source code(zip)
    tahoe-lafs-1.17.0.tar.gz(12.23 MB)
    tahoe-lafs-1.17.0.tar.gz.asc(488 bytes)
    tahoe_lafs-1.17.0-py2.py3-none-any.whl(1.17 MB)
    tahoe_lafs-1.17.0-py2.py3-none-any.whl.asc(488 bytes)
Barman - Backup and Recovery Manager for PostgreSQL

Barman, Backup and Recovery Manager for PostgreSQL Barman (Backup and Recovery Manager) is an open-source administration tool for disaster recovery of

EDB 1.5k Dec 30, 2022
The command-line tool that gives easy access to all of the capabilities of B2 Cloud Storage

B2 Command Line Tool The command-line tool that gives easy access to all of the capabilities of B2 Cloud Storage. This program provides command-line a

Backblaze 467 Dec 08, 2022
ZFS, in Python, without reading the original C.

ZFSp What? ZFS, in Python, without reading the original C. What?! That's right. How? Many hours spent staring at hexdumps, and asking friends to searc

Colin Valliant 569 Oct 28, 2022
The Tahoe-LAFS decentralized secure filesystem.

Free and Open decentralized data store Tahoe-LAFS (Tahoe Least-Authority File Store) is the first free software / open-source storage technology that

Tahoe-LAFS 1.2k Jan 01, 2023
Synchronize local directories with Tahoe-LAFS storage grids

Gridsync Gridsync aims to provide a cross-platform, graphical user interface for Tahoe-LAFS, the Least Authority File Store. It is intended to simplif

171 Dec 16, 2022
ZODB Client-Server framework

ZEO - Single-server client-server database server for ZODB ZEO is a client-server storage for ZODB for sharing a single storage among many clients. Wh

Zope 40 Nov 04, 2022
The next generation relational database.

What is EdgeDB? EdgeDB is an open-source object-relational database built on top of PostgreSQL. The goal of EdgeDB is to empower its users to build sa

EdgeDB 9.9k Dec 31, 2022
Automatic SQL injection and database takeover tool

sqlmap sqlmap is an open source penetration testing tool that automates the process of detecting and exploiting SQL injection flaws and taking over of

sqlmapproject 25.7k Jan 02, 2023
TrueNAS CORE/Enterprise/SCALE Middleware Git Repository

TrueNAS CORE/Enterprise/SCALE main source repo Want to contribute or collaborate? Join our Slack instance. IMPORTANT NOTE: This is the master branch o

TrueNAS 2k Jan 07, 2023
Continuous Archiving for Postgres

WAL-E Continuous archiving for Postgres WAL-E is a program designed to perform continuous archiving of PostgreSQL WAL files and base backups. To corre

3.4k Dec 30, 2022
A Terminal Client for MySQL with AutoCompletion and Syntax Highlighting.

mycli A command line client for MySQL that can do auto-completion and syntax highlighting. HomePage: http://mycli.net Documentation: http://mycli.net/

dbcli 10.7k Jan 07, 2023
Postgres CLI with autocompletion and syntax highlighting

A REPL for Postgres This is a postgres client that does auto-completion and syntax highlighting. Home Page: http://pgcli.com MySQL Equivalent: http://

dbcli 10.8k Dec 30, 2022
A generic JSON document store with sharing and synchronisation capabilities.

Kinto Kinto is a minimalist JSON storage service with synchronisation and sharing abilities. Online documentation Tutorial Issue tracker Contributing

Kinto 4.2k Dec 26, 2022
The web end of seafile server.

Introduction Seahub is the web frontend for Seafile. Preparation Build and deploy Seafile server from source. See http://manual.seafile.com/build_seaf

476 Dec 29, 2022
Cross-platform desktop synchronization client for the Nuxeo platform.

Nuxeo Drive Desktop Synchronization Client for Nuxeo This is an ongoing development project for desktop synchronization of local folders with remote N

Nuxeo 63 Dec 16, 2022
An open source multi-tool for exploring and publishing data

Datasette An open source multi-tool for exploring and publishing data Datasette is a tool for exploring and publishing data. It helps people take data

Simon Willison 6.8k Jan 01, 2023
a full featured file system for online data storage

S3QL S3QL is a file system that stores all its data online using storage services like Google Storage, Amazon S3, or OpenStack. S3QL effectively provi

917 Dec 25, 2022
Nerd-Storage is a simple web server for sharing files on the local network.

Nerd-Storage is a simple web server for sharing files on the local network. It supports the download of files and directories, the upload of multiple files at once, making a directory, updates and de

ハル 68 Jun 07, 2022