Changeset d1d9884 in trunk
- Timestamp:
- 2016-05-04T23:53:04Z (9 years ago)
- Branches:
- master
- Children:
- 93bb3e9, f57d1e9
- Parents:
- c715e0d
- git-author:
- Brian Warner <warner@…> (2016-04-28 07:05:30)
- git-committer:
- Brian Warner <warner@…> (2016-05-04 23:53:04)
- Files:
-
- 1 added
- 3 deleted
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified docs/configuration.rst ¶
rc715e0d rd1d9884 70 70 ========== 71 71 72 A node can be a client/server, an introducer, a statistics gatherer, or a 73 key generator. 72 A node can be a client/server, an introducer, or a statistics gatherer. 74 73 75 74 Client/server nodes provide one or more of the following services: … … 336 335 for uploads. See :doc:`helper` for details. 337 336 338 ``key_generator.furl = (FURL string, optional)``339 340 If provided, the node will attempt to connect to and use the given341 key-generator service, using RSA keys from the external process rather342 than generating its own.343 344 337 ``stats_gatherer.furl = (FURL string, optional)`` 345 338 … … 612 605 This file is used to construct an introducer, and is created by the 613 606 "``tahoe create-introducer``" command. 614 615 ``tahoe-key-generator.tac``616 617 This file is used to construct a key generator, and is created by the618 "``tahoe create-key-gernerator``" command.619 607 620 608 ``tahoe-stats-gatherer.tac`` -
TabularUnified docs/frontends/CLI.rst ¶
rc715e0d rd1d9884 105 105 node will produce a ``private/introducer.furl`` file, which should be 106 106 published to all clients. 107 108 "``tahoe create-key-generator [NODEDIR]``" is used to create a special109 "key-generation" service, which allows a client to offload their RSA key110 generation to a separate process. Since RSA key generation takes several111 seconds, and must be done each time a directory is created, moving it to a112 separate process allows the first process (perhaps a busy web-API server) to113 continue servicing other requests. The key generator exports a FURL that can114 be copied into a node to enable this functionality.115 107 116 108 "``tahoe run [NODEDIR]``" will start a previously-created node in the foreground. -
TabularUnified docs/man/man1/tahoe.1 ¶
rc715e0d rd1d9884 46 46 .B \f[B]create-introducer\f[] 47 47 Create an introducer node. 48 .TP49 .B \f[B]create-key-generator\f[]50 Create a key generator service.51 48 .TP 52 49 .B \f[B]create-stats-gatherer\f[] -
TabularUnified src/allmydata/client.py ¶
rc715e0d rd1d9884 59 59 with a built-in default of 2048 bits.""" 60 60 def __init__(self): 61 self._remote = None62 61 self.default_keysize = 2048 63 62 64 def set_remote_generator(self, keygen):65 self._remote = keygen66 63 def set_default_keysize(self, keysize): 67 64 """Call this to override the size of the RSA keys created for new … … 81 78 keys.""" 82 79 keysize = keysize or self.default_keysize 83 if self._remote: 84 d = self._remote.callRemote('get_rsa_key_pair', keysize) 85 def make_key_objs((verifying_key, signing_key)): 86 v = rsa.create_verifying_key_from_string(verifying_key) 87 s = rsa.create_signing_key_from_string(signing_key) 88 return v, s 89 d.addCallback(make_key_objs) 90 return d 91 else: 92 # RSA key generation for a 2048 bit key takes between 0.8 and 3.2 93 # secs 94 signer = rsa.generate(keysize) 95 verifier = signer.get_verifying_key() 96 return defer.succeed( (verifier, signer) ) 80 # RSA key generation for a 2048 bit key takes between 0.8 and 3.2 81 # secs 82 signer = rsa.generate(keysize) 83 verifier = signer.get_verifying_key() 84 return defer.succeed( (verifier, signer) ) 97 85 98 86 class Terminator(service.Service): … … 146 134 key_gen_furl = self.get_config("client", "key_generator.furl", None) 147 135 if key_gen_furl: 148 self.init_key_gen(key_gen_furl)136 log.msg("[client]key_generator.furl= is now ignored, see #2783") 149 137 self.init_client() 150 138 self.helper = None … … 443 431 self.tub.registerReference(self.helper, furlFile=helper_furlfile) 444 432 445 def init_key_gen(self, key_gen_furl):446 self.tub.connectTo(key_gen_furl, self._got_key_generator)447 448 def _got_key_generator(self, key_generator):449 self._key_generator.set_remote_generator(key_generator)450 key_generator.notifyOnDisconnect(self._lost_key_generator)451 452 def _lost_key_generator(self):453 self._key_generator.set_remote_generator(None)454 455 433 def set_default_mutable_keysize(self, keysize): 456 434 self._key_generator.set_default_keysize(keysize) -
TabularUnified src/allmydata/interfaces.py ¶
rc715e0d rd1d9884 2809 2809 """ 2810 2810 2811 class RIKeyGenerator(RemoteInterface):2812 __remote_name__ = "RIKeyGenerator.tahoe.allmydata.com"2813 """2814 Provides a service offering to make RSA key pairs.2815 """2816 2817 def get_rsa_key_pair(key_size=int):2818 """2819 @param key_size: the size of the signature key.2820 @return: tuple(verifying_key, signing_key)2821 """2822 return TupleOf(str, str)2823 2824 2825 2811 class FileTooLargeError(Exception): 2826 2812 pass -
TabularUnified src/allmydata/scripts/create_node.py ¶
rc715e0d rd1d9884 110 110 c.write("introducer.furl = %s\n" % config.get("introducer", "")) 111 111 c.write("helper.furl =\n") 112 c.write("#key_generator.furl =\n")113 112 c.write("#stats_gatherer.furl =\n") 114 113 c.write("\n") -
TabularUnified src/allmydata/scripts/runner.py ¶
rc715e0d rd1d9884 6 6 7 7 from allmydata.scripts.common import get_default_nodedir 8 from allmydata.scripts import debug, create_node, startstop_node, cli, keygen,stats_gatherer, admin8 from allmydata.scripts import debug, create_node, startstop_node, cli, stats_gatherer, admin 9 9 from allmydata.util.encodingutil import quote_output, quote_local_unicode_path, get_io_encoding 10 10 … … 37 37 subCommands = ( GROUP("Administration") 38 38 + create_node.subCommands 39 + keygen.subCommands40 39 + stats_gatherer.subCommands 41 40 + admin.subCommands … … 86 85 87 86 create_dispatch = {} 88 for module in (create_node, keygen,stats_gatherer):87 for module in (create_node, stats_gatherer): 89 88 create_dispatch.update(module.dispatch) 90 89 -
TabularUnified src/allmydata/scripts/startstop_node.py ¶
rc715e0d rd1d9884 81 81 return IntroducerNode(self.basedir) 82 82 if self.nodetype == "key-generator": 83 from allmydata.key_generator import KeyGeneratorService 84 return KeyGeneratorService(default_key_size=2048) 83 raise ValueError("key-generator support removed, see #2783") 85 84 if self.nodetype == "stats-gatherer": 86 85 from allmydata.stats import StatsGathererService -
TabularUnified src/allmydata/test/common.py ¶
rc715e0d rd1d9884 23 23 from allmydata.util.consumer import download_to_data 24 24 from allmydata.stats import StatsGathererService 25 from allmydata.key_generator import KeyGeneratorService26 25 import allmydata.test.common_util as testutil 27 26 from allmydata import immutable … … 449 448 self.stats_gatherer = None 450 449 self.stats_gatherer_furl = None 451 self.key_generator_svc = None452 self.key_generator_furl = None453 450 454 451 def tearDown(self): … … 465 462 return s 466 463 467 def set_up_nodes(self, NUMCLIENTS=5, 468 use_stats_gatherer=False, use_key_generator=False): 464 def set_up_nodes(self, NUMCLIENTS=5, use_stats_gatherer=False): 469 465 self.numclients = NUMCLIENTS 470 466 iv_dir = self.getdir("introducer") … … 486 482 if use_stats_gatherer: 487 483 d.addCallback(self._set_up_stats_gatherer) 488 if use_key_generator:489 d.addCallback(self._set_up_key_generator)490 484 d.addCallback(self._set_up_nodes_2) 491 485 if use_stats_gatherer: … … 512 506 def get_furl(junk): 513 507 self.stats_gatherer_furl = file(sgf, 'rb').read().strip() 514 d.addCallback(get_furl)515 return d516 517 def _set_up_key_generator(self, res):518 kgsdir = self.getdir("key_generator")519 fileutil.make_dirs(kgsdir)520 521 self.key_generator_svc = KeyGeneratorService(kgsdir,522 display_furl=False,523 default_key_size=TEST_RSA_KEY_SIZE)524 self.key_generator_svc.key_generator.pool_size = 4525 self.key_generator_svc.key_generator.pool_refresh_delay = 60526 self.add_service(self.key_generator_svc)527 528 d = fireEventually()529 def check_for_furl():530 return os.path.exists(os.path.join(kgsdir, 'key_generator.furl'))531 d.addCallback(lambda junk: self.poll(check_for_furl, timeout=30))532 def get_furl(junk):533 kgf = os.path.join(kgsdir, 'key_generator.furl')534 self.key_generator_furl = file(kgf, 'rb').read().strip()535 508 d.addCallback(get_furl) 536 509 return d … … 564 537 565 538 if i == 0: 566 # clients[0] runs a webserver and a helper , no key_generator539 # clients[0] runs a webserver and a helper 567 540 config += nodeconfig 568 541 config += "web.port = tcp:0:interface=127.0.0.1\n" … … 571 544 config += "enabled = True\n" 572 545 elif i == 3: 573 # clients[3] runs a webserver and uses a helper, uses 574 # key_generator 575 if self.key_generator_furl: 576 config += "key_generator.furl = %s\n" % self.key_generator_furl 546 # clients[3] runs a webserver and uses a helper 577 547 config += nodeconfig 578 548 config += "web.port = tcp:0:interface=127.0.0.1\n" -
TabularUnified src/allmydata/test/no_network.py ¶
rc715e0d rd1d9884 11 11 # This should be useful for tests which want to examine and/or manipulate the 12 12 # uploaded shares, checker/verifier/repairer tests, etc. The clients have no 13 # Tubs, so it is not useful for tests that involve a Helper , a KeyGenerator,14 # or thecontrol.furl .13 # Tubs, so it is not useful for tests that involve a Helper or the 14 # control.furl . 15 15 16 16 import os -
TabularUnified src/allmydata/test/test_cli.py ¶
rc715e0d rd1d9884 18 18 19 19 # Test that the scripts can be imported. 20 from allmydata.scripts import create_node, debug, keygen,startstop_node, \20 from allmydata.scripts import create_node, debug, startstop_node, \ 21 21 tahoe_add_alias, tahoe_backup, tahoe_check, tahoe_cp, tahoe_get, tahoe_ls, \ 22 22 tahoe_manifest, tahoe_mkdir, tahoe_mv, tahoe_put, tahoe_unlink, tahoe_webopen 23 _hush_pyflakes = [create_node, debug, keygen,startstop_node,23 _hush_pyflakes = [create_node, debug, startstop_node, 24 24 tahoe_add_alias, tahoe_backup, tahoe_check, tahoe_cp, tahoe_get, tahoe_ls, 25 25 tahoe_manifest, tahoe_mkdir, tahoe_mv, tahoe_put, tahoe_unlink, tahoe_webopen] -
TabularUnified src/allmydata/test/test_runner.py ¶
rc715e0d rd1d9884 282 282 self.do_create("introducer") 283 283 284 def test_key_generator(self):285 self.do_create("key-generator")286 287 284 def test_stats_gatherer(self): 288 285 self.do_create("stats-gatherer") … … 652 649 d.addCallback(_cb3) 653 650 return d 654 655 def test_keygen(self):656 self.skip_if_cannot_daemonize()657 658 basedir = self.workdir("test_keygen")659 c1 = os.path.join(basedir, "c1")660 twistd_pid_file = os.path.join(c1, "twistd.pid")661 keygen_furl_file = os.path.join(c1, "key_generator.furl")662 663 d = self.run_bintahoe(["--quiet", "create-key-generator", "--basedir", c1])664 def _cb(res):665 out, err, rc_or_sig = res666 self.failUnlessEqual(rc_or_sig, 0)667 d.addCallback(_cb)668 669 def _start(res):670 return self.run_bintahoe(["--quiet", "start", c1])671 d.addCallback(_start)672 673 def _cb2(res):674 out, err, rc_or_sig = res675 errstr = "rc=%d, OUT: '%s', ERR: '%s'" % (rc_or_sig, out, err)676 self.failUnlessEqual(rc_or_sig, 0, errstr)677 self.failUnlessEqual(out, "", errstr)678 # self.failUnlessEqual(err, "", errstr) # See test_client_no_noise -- for now we ignore noise.679 680 # the parent (twistd) has exited. However, twistd writes the pid681 # from the child, not the parent, so we can't expect twistd.pid682 # to exist quite yet.683 684 # the node is running, but it might not have made it past the685 # first reactor turn yet, and if we kill it too early, it won't686 # remove the twistd.pid file. So wait until it does something687 # that we know it won't do until after the first turn.688 d.addCallback(_cb2)689 690 def _node_has_started():691 return os.path.exists(keygen_furl_file)692 d.addCallback(lambda res: self.poll(_node_has_started))693 694 def _started(res):695 self.failUnless(os.path.exists(twistd_pid_file))696 # rm this so we can detect when the second incarnation is ready697 os.unlink(keygen_furl_file)698 return self.run_bintahoe(["--quiet", "restart", c1])699 d.addCallback(_started)700 701 def _cb3(res):702 out, err, rc_or_sig = res703 errstr = "rc=%d, OUT: '%s', ERR: '%s'" % (rc_or_sig, out, err)704 self.failUnlessEqual(rc_or_sig, 0, errstr)705 self.failUnlessEqual(out, "", errstr)706 # self.failUnlessEqual(err, "", errstr) # See test_client_no_noise -- for now we ignore noise.707 d.addCallback(_cb3)708 709 # again, the second incarnation of the node might not be ready yet,710 # so poll until it is711 d.addCallback(lambda res: self.poll(_node_has_started))712 713 # now we can kill it. TODO: On a slow machine, the node might kill714 # itself before we get a chance too, especially if spawning the715 # 'tahoe stop' command takes a while.716 def _stop(res):717 self.failUnless(os.path.exists(twistd_pid_file))718 return self.run_bintahoe(["--quiet", "stop", c1])719 d.addCallback(_stop)720 721 def _cb4(res):722 out, err, rc_or_sig = res723 # the parent has exited by now724 errstr = "rc=%d, OUT: '%s', ERR: '%s'" % (rc_or_sig, out, err)725 self.failUnlessEqual(rc_or_sig, 0, errstr)726 self.failUnlessEqual(out, "", errstr)727 # self.failUnlessEqual(err, "", errstr) # See test_client_no_noise -- for now we ignore noise.728 # the parent was supposed to poll and wait until it sees729 # twistd.pid go away before it exits, so twistd.pid should be730 # gone by now.731 self.failIf(os.path.exists(twistd_pid_file))732 d.addCallback(_cb4)733 return d -
TabularUnified src/allmydata/test/test_system.py ¶
rc715e0d rd1d9884 476 476 NEWERDATA_uploadable = MutableData(NEWERDATA) 477 477 478 d = self.set_up_nodes( use_key_generator=True)478 d = self.set_up_nodes() 479 479 480 480 def _create_mutable(res): … … 674 674 d.addCallback(_created_dirnode) 675 675 676 def wait_for_c3_kg_conn():677 return self.clients[3]._key_generator is not None678 d.addCallback(lambda junk: self.poll(wait_for_c3_kg_conn))679 680 def check_kg_poolsize(junk, size_delta):681 self.failUnlessEqual(len(self.key_generator_svc.key_generator.keypool),682 self.key_generator_svc.key_generator.pool_size + size_delta)683 684 d.addCallback(check_kg_poolsize, 0)685 d.addCallback(lambda junk:686 self.clients[3].create_mutable_file(MutableData('hello, world')))687 d.addCallback(check_kg_poolsize, -1)688 d.addCallback(lambda junk: self.clients[3].create_dirnode())689 d.addCallback(check_kg_poolsize, -2)690 # use_helper induces use of clients[3], which is the using-key_gen client691 d.addCallback(lambda junk:692 self.POST("uri?t=mkdir&name=george", use_helper=True))693 d.addCallback(check_kg_poolsize, -3)694 695 676 return d 696 677
Note: See TracChangeset
for help on using the changeset viewer.