diff --git a/README.txt b/README.txt index c8c78699c..8280ba320 100644 --- a/README.txt +++ b/README.txt @@ -2,7 +2,6 @@ The py lib is a Python development support library featuring the following tools and modules: * py.test: tool for distributed automated testing -* py.execnet: ad-hoc distributed execution * py.code: dynamic code generation and introspection * py.path: uniform local and svn path objects diff --git a/contrib/svn-sync-repo.py b/contrib/svn-sync-repo.py deleted file mode 100644 index 1d1fb775d..000000000 --- a/contrib/svn-sync-repo.py +++ /dev/null @@ -1,116 +0,0 @@ -#!/usr/bin/env python - -""" - -small utility for hot-syncing a svn repository through ssh. -uses execnet. - -""" - -import py -import sys, os - -def usage(): - arg0 = sys.argv[0] - print """%s [user@]remote-host:/repo/location localrepo [identity keyfile]""" % (arg0,) - - -def main(args): - remote = args[0] - localrepo = py.path.local(args[1]) - if not localrepo.check(dir=1): - raise SystemExit("localrepo %s does not exist" %(localrepo,)) - if len(args) == 3: - keyfile = py.path.local(args[2]) - else: - keyfile = None - remote_host, path = remote.split(':', 1) - print "ssh-connecting to", remote_host - gw = getgateway(remote_host, keyfile) - - local_rev = get_svn_youngest(localrepo) - - # local protocol - # 1. client sends rev/repo -> server - # 2. server checks for newer revisions and sends dumps - # 3. client receives dumps, updates local repo - # 4. client goes back to step 1 - c = gw.remote_exec(""" - import py - import os - remote_rev, repopath = channel.receive() - while 1: - rev = py.process.cmdexec('svnlook youngest "%s"' % repopath) - rev = int(rev) - if rev > remote_rev: - revrange = (remote_rev+1, rev) - dumpchannel = channel.gateway.newchannel() - channel.send(revrange) - channel.send(dumpchannel) - - f = os.popen( - "svnadmin dump -q --incremental -r %s:%s %s" - % (revrange[0], revrange[1], repopath), 'r') - try: - maxcount = dumpchannel.receive() - count = maxcount - while 1: - s = f.read(8192) - if not s: - raise EOFError - dumpchannel.send(s) - count = count - 1 - if count <= 0: - ack = dumpchannel.receive() - count = maxcount - - except EOFError: - dumpchannel.close() - remote_rev = rev - else: - # using svn-hook instead would be nice here - py.std.time.sleep(30) - """) - - c.send((local_rev, path)) - print "checking revisions from %d in %s" %(local_rev, remote) - while 1: - revstart, revend = c.receive() - dumpchannel = c.receive() - print "receiving revisions", revstart, "-", revend, "replaying..." - svn_load(localrepo, dumpchannel) - print "current revision", revend - -def svn_load(repo, dumpchannel, maxcount=100): - # every maxcount we will send an ACK to the other - # side in order to synchronise and avoid our side - # growing buffers (py.execnet does not control - # RAM usage or receive queue sizes) - dumpchannel.send(maxcount) - f = os.popen("svnadmin load -q %s" %(repo, ), "w") - count = maxcount - for x in dumpchannel: - sys.stdout.write(".") - sys.stdout.flush() - f.write(x) - count = count - 1 - if count <= 0: - dumpchannel.send(maxcount) - count = maxcount - print >>sys.stdout - f.close() - -def get_svn_youngest(repo): - rev = py.process.cmdexec('svnlook youngest "%s"' % repo) - return int(rev) - -def getgateway(host, keyfile=None): - return execnet.SshGateway(host, identity=keyfile) - -if __name__ == '__main__': - if len(sys.argv) < 3: - usage() - raise SystemExit(1) - - main(sys.argv[1:]) - diff --git a/contrib/sysinfo.py b/contrib/sysinfo.py deleted file mode 100644 index a4c44dd98..000000000 --- a/contrib/sysinfo.py +++ /dev/null @@ -1,139 +0,0 @@ -""" -sysinfo.py [host1] [host2] [options] - -obtain system info from remote machine. -""" - -import py -import sys - - -parser = py.std.optparse.OptionParser(usage=__doc__) -parser.add_option("-f", "--sshconfig", action="store", dest="ssh_config", default=None, - help="use given ssh config file, and add info all contained hosts for getting info") -parser.add_option("-i", "--ignore", action="store", dest="ignores", default=None, - help="ignore hosts (useful if the list of hostnames come from a file list)") - -def parsehosts(path): - path = py.path.local(path) - l = [] - rex = py.std.re.compile(r'Host\s*(\S+)') - for line in path.readlines(): - m = rex.match(line) - if m is not None: - sshname, = m.groups() - l.append(sshname) - return l - -class RemoteInfo: - def __init__(self, gateway): - self.gw = gateway - self._cache = {} - - def exreceive(self, execstring): - if execstring not in self._cache: - channel = self.gw.remote_exec(execstring) - self._cache[execstring] = channel.receive() - return self._cache[execstring] - - def getmodattr(self, modpath): - module = modpath.split(".")[0] - return self.exreceive(""" - import %s - channel.send(%s) - """ %(module, modpath)) - - def islinux(self): - return self.getmodattr('sys.platform').find("linux") != -1 - - def getfqdn(self): - return self.exreceive(""" - import socket - channel.send(socket.getfqdn()) - """) - - def getmemswap(self): - if self.islinux(): - return self.exreceive(""" - import commands, re - out = commands.getoutput("free") - mem = re.search(r"Mem:\s+(\S*)", out).group(1) - swap = re.search(r"Swap:\s+(\S*)", out).group(1) - channel.send((mem, swap)) - """) - - def getcpuinfo(self): - if self.islinux(): - return self.exreceive(""" - # a hyperthreaded cpu core only counts as 1, although it - # is present as 2 in /proc/cpuinfo. Counting it as 2 is - # misleading because it is *by far* not as efficient as - # two independent cores. - cpus = {} - cpuinfo = {} - f = open("/proc/cpuinfo") - lines = f.readlines() - f.close() - for line in lines + ['']: - if line.strip(): - key, value = line.split(":", 1) - cpuinfo[key.strip()] = value.strip() - else: - corekey = (cpuinfo.get("physical id"), - cpuinfo.get("core id")) - cpus[corekey] = 1 - numcpus = len(cpus) - model = cpuinfo.get("model name") - channel.send((numcpus, model)) - """) - -def debug(*args): - print >>sys.stderr, " ".join(map(str, args)) -def error(*args): - debug("ERROR", args[0] + ":", *args[1:]) - -def getinfo(sshname, ssh_config=None, loginfo=sys.stdout): - debug("connecting to", sshname) - try: - gw = execnet.SshGateway(sshname, ssh_config=ssh_config) - except IOError: - error("could not get sshagteway", sshname) - else: - ri = RemoteInfo(gw) - #print "%s info:" % sshname - prefix = sshname.upper() + " " - print >>loginfo, prefix, "fqdn:", ri.getfqdn() - for attr in ( - "sys.platform", - "sys.version_info", - ): - loginfo.write("%s %s: " %(prefix, attr,)) - loginfo.flush() - value = ri.getmodattr(attr) - loginfo.write(str(value)) - loginfo.write("\n") - loginfo.flush() - memswap = ri.getmemswap() - if memswap: - mem,swap = memswap - print >>loginfo, prefix, "Memory:", mem, "Swap:", swap - cpuinfo = ri.getcpuinfo() - if cpuinfo: - numcpu, model = cpuinfo - print >>loginfo, prefix, "number of cpus:", numcpu - print >>loginfo, prefix, "cpu model", model - return ri - -if __name__ == '__main__': - options, args = parser.parse_args() - hosts = list(args) - ssh_config = options.ssh_config - if ssh_config: - hosts.extend(parsehosts(ssh_config)) - ignores = options.ignores or () - if ignores: - ignores = ignores.split(",") - for host in hosts: - if host not in ignores: - getinfo(host, ssh_config=ssh_config) - diff --git a/doc/confrest.py b/doc/confrest.py index f6d19a4da..ba12885c3 100644 --- a/doc/confrest.py +++ b/doc/confrest.py @@ -73,7 +73,6 @@ pageTracker._trackPageview(); html.div( html.h3("supporting APIs:"), self.a_docref("pylib index", "index.html"), - self.a_docref("py.execnet", "execnet.html"), self.a_docref("py.path", "path.html"), self.a_docref("py.code", "code.html"), )