removing some py.execnet references and moving scripts to execnet repo
--HG-- branch : trunk
This commit is contained in:
		
							parent
							
								
									6c2b1c4363
								
							
						
					
					
						commit
						fb159b0d40
					
				|  | @ -2,7 +2,6 @@ The py lib is a Python development support library featuring | ||||||
| the following tools and modules: | the following tools and modules: | ||||||
| 
 | 
 | ||||||
| * py.test: tool for distributed automated testing | * py.test: tool for distributed automated testing | ||||||
| * py.execnet: ad-hoc distributed execution |  | ||||||
| * py.code: dynamic code generation and introspection | * py.code: dynamic code generation and introspection | ||||||
| * py.path:  uniform local and svn path objects  | * py.path:  uniform local and svn path objects  | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -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:]) |  | ||||||
| 
 |  | ||||||
|  | @ -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) |  | ||||||
|          |  | ||||||
|  | @ -73,7 +73,6 @@ pageTracker._trackPageview(); | ||||||
|             html.div( |             html.div( | ||||||
|                 html.h3("supporting APIs:"),  |                 html.h3("supporting APIs:"),  | ||||||
|                 self.a_docref("pylib index", "index.html"), |                 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.path", "path.html"), | ||||||
|                 self.a_docref("py.code", "code.html"), |                 self.a_docref("py.code", "code.html"), | ||||||
|             ) |             ) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue