From e303e39c78476fd140bf615b1eb631e44c332b80 Mon Sep 17 00:00:00 2001 From: Claudio-Daniel Freire Date: Wed, 28 Sep 2011 19:46:08 -0300 Subject: [PATCH] =?utf8?q?Several=20fixes:=20=20-=20Add=20specific=20hostn?= =?utf8?q?ame=20to=20application=20deployment=20logging=20=20-=20Use=20os.?= =?utf8?q?urandom=20instead=20of=20random.SystemRandom=20(more=20appropria?= =?utf8?q?te)=20=20-=20Fix=20fuckminsterf=C3=BClerene-style=20deadlock=20i?= =?utf8?q?n=20spanning=20deployment=20by=20including=20=20=20=20the=20appl?= =?utf8?q?ication=20class=20when=20defining=20deployment=20groups.=20This?= =?utf8?q?=20ensures=20=20=20=20ordered=20dependencies=20(which=20are=20im?= =?utf8?q?plemented=20as=20thread=20synchronization),=20=20=20=20and=20avo?= =?utf8?q?ids=20deadlocks.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/nepi/testbeds/planetlab/application.py | 20 +++++++++----------- src/nepi/testbeds/planetlab/execute.py | 5 ++--- src/nepi/testbeds/planetlab/interfaces.py | 6 +----- src/nepi/testbeds/planetlab/multicast.py | 2 +- src/nepi/util/tunchannel_impl.py | 6 +----- 5 files changed, 14 insertions(+), 25 deletions(-) diff --git a/src/nepi/testbeds/planetlab/application.py b/src/nepi/testbeds/planetlab/application.py index 8fa3271b..3d680ea9 100644 --- a/src/nepi/testbeds/planetlab/application.py +++ b/src/nepi/testbeds/planetlab/application.py @@ -77,9 +77,7 @@ class Dependency(object): self._master_passphrase = None self._master_prk = None self._master_puk = None - self._master_token = ''.join(map(chr,[rng.randint(0,255) - for rng in (random.SystemRandom(),) - for i in xrange(8)] )).encode("hex") + self._master_token = os.urandom(8).encode("hex") self._build_pid = None self._build_ppid = None @@ -190,7 +188,7 @@ class Dependency(object): else: raise RuntimeError, "Failed to setup application" else: - self._logger.info("Setup ready: %s", self) + self._logger.info("Setup ready: %s at %s", self, self.node.hostname) else: self.setup() @@ -238,7 +236,7 @@ class Dependency(object): buildscript = self._do_build_master() if buildscript is not None: - self._logger.info("Building %s", self) + self._logger.info("Building %s at %s", self, self.node.hostname) # upload build script try: @@ -293,8 +291,8 @@ class Dependency(object): waitmaster = ( "{ . ./.ssh-agent.sh ; " - "while [[ $(ssh -q -o UserKnownHostsFile=%(hostkey)s %(sshopts)s %(master)s cat %(token_path)s.retcode || /bin/true) != %(token)s ]] ; do sleep 5 ; done ; " - "if [[ $(ssh -q -o UserKnownHostsFile=%(hostkey)s %(sshopts)s %(master)s cat %(token_path)s || /bin/true) != %(token)s ]] ; then echo BAD TOKEN ; exit 1 ; fi ; " + "while [[ $(. ./.ssh-agent.sh > /dev/null ; ssh -q -o UserKnownHostsFile=%(hostkey)s %(sshopts)s %(master)s cat %(token_path)s.retcode || /bin/true) != %(token)s ]] ; do sleep 5 ; done ; " + "if [[ $(. ./.ssh-agent.sh > /dev/null ; ssh -q -o UserKnownHostsFile=%(hostkey)s %(sshopts)s %(master)s cat %(token_path)s || /bin/true) != %(token)s ]] ; then echo BAD TOKEN ; exit 1 ; fi ; " "}" ) % { 'hostkey' : 'master_known_hosts', @@ -304,7 +302,7 @@ class Dependency(object): 'sshopts' : sshopts, } - syncfiles = "scp -p -o UserKnownHostsFile=%(hostkey)s %(sshopts)s %(files)s ." % { + syncfiles = ". ./.ssh-agent.sh && scp -p -o UserKnownHostsFile=%(hostkey)s %(sshopts)s %(files)s ." % { 'hostkey' : 'master_known_hosts', 'files' : ' '.join(files), 'sshopts' : sshopts, @@ -384,7 +382,7 @@ class Dependency(object): else: raise RuntimeError, "Failed to set up build slave %s: cannot get pid" % (self.home_path,) - self._logger.info("Deploying %s", self) + self._logger.info("Deploying %s at %s", self, self.node.hostname) def _do_wait_build(self): pid = self._build_pid @@ -410,7 +408,7 @@ class Dependency(object): break elif status is not rspawn.RUNNING: bustspin += 1 - time.sleep(5) + time.sleep(delay*(5.5+random.random())) if bustspin > 12: self._build_pid = self._build_ppid = None break @@ -534,7 +532,7 @@ class Dependency(object): def _do_install(self): if self.install: - self._logger.info("Installing %s", self) + self._logger.info("Installing %s at %s", self, self.node.hostname) # Install application try: diff --git a/src/nepi/testbeds/planetlab/execute.py b/src/nepi/testbeds/planetlab/execute.py index 1aed9f45..69abd71c 100644 --- a/src/nepi/testbeds/planetlab/execute.py +++ b/src/nepi/testbeds/planetlab/execute.py @@ -387,6 +387,7 @@ class TestbedController(testbed_impl.TestbedController): app.node.architecture, app.node.operatingSystem, app.node.pl_distro, + app.__class__, ) depgroups = collections.defaultdict(list) @@ -469,9 +470,7 @@ class TestbedController(testbed_impl.TestbedController): suffix = ".pub") # Create secure 256-bits temporary passphrase - passphrase = ''.join(map(chr,[rng.randint(0,255) - for rng in (random.SystemRandom(),) - for i in xrange(32)] )).encode("hex") + passphrase = os.urandom(32).encode("hex") # Copy keys oprk = open(self.sliceSSHKey, "rb") diff --git a/src/nepi/testbeds/planetlab/interfaces.py b/src/nepi/testbeds/planetlab/interfaces.py index 42cfd239..552360d3 100644 --- a/src/nepi/testbeds/planetlab/interfaces.py +++ b/src/nepi/testbeds/planetlab/interfaces.py @@ -170,11 +170,7 @@ class TunIface(object): # Generate an initial random cryptographic key to use for tunnelling # Upon connection, both endpoints will agree on a common one based on # this one. - self.tun_key = ( ''.join(map(chr, [ - r.getrandbits(8) - for i in xrange(32) - for r in (random.SystemRandom(),) ]) - ).encode("base64").strip() ) + self.tun_key = os.urandom(32).encode("base64").strip() def __str__(self): diff --git a/src/nepi/testbeds/planetlab/multicast.py b/src/nepi/testbeds/planetlab/multicast.py index 71df64cf..ffb25d44 100644 --- a/src/nepi/testbeds/planetlab/multicast.py +++ b/src/nepi/testbeds/planetlab/multicast.py @@ -144,7 +144,7 @@ class MulticastRouter(application.Application): # download rpms and pack into a tar archive return command % { - 'nonifaces' : ' '.join([iface.if_name for iface in self.nonifaces]), + 'nonifaces' : ' '.join([iface.if_name for iface in self.nonifaces if iface.if_name]), 'debugbit' : (debugbit if self.stderr else ""), } command = property(_command_get, _non_set) diff --git a/src/nepi/util/tunchannel_impl.py b/src/nepi/util/tunchannel_impl.py index d543c947..ec74181f 100644 --- a/src/nepi/util/tunchannel_impl.py +++ b/src/nepi/util/tunchannel_impl.py @@ -84,11 +84,7 @@ class TunChannel(object): # Generate an initial random cryptographic key to use for tunnelling # Upon connection, both endpoints will agree on a common one based on # this one. - self.tun_key = ( ''.join(map(chr, [ - r.getrandbits(8) - for i in xrange(32) - for r in (random.SystemRandom(),) ]) - ).encode("base64").strip() ) + self.tun_key = os.urandom(32).encode("base64").strip() def __str__(self): -- 2.45.2