1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
import Pyro.core, Pyro.naming, Pyro.errors
import os, socket, string
server_script = '~/mmtk2/Tools/TrajectoryViewer/TrajectoryServer.py'
class TrajectoryManager:
def __init__(self):
Pyro.core.initClient(0)
locator = Pyro.naming.NameServerLocator()
self.pyro_ns = locator.getNS()
self.my_name = socket.gethostname()
self.my_address = socket.gethostbyname(self.my_name)
def server(self):
try:
uri = self.pyro_ns.resolve(self.my_address+':MMTK:server')
except Pyro.errors.NamingError:
return None
return Pyro.core.getProxyForURI(uri)
def startServer(self):
import time
os.system('python ' + server_script + ' > /dev/null 2>&1 &')
time.sleep(2)
def stopServer(self):
server = self.server()
server.stop()
def serverList(self):
servers = []
for name in self.pyro_ns.status().keys():
fields = string.split(name, ':')
if len(fields) == 3 and fields[1] == 'MMTK' \
and fields[2] == 'server':
ip_address = fields[0]
hostname = socket.gethostbyaddr(ip_address)[0]
servers.append(hostname)
return servers
def publish(self, filename):
filename = os.path.abspath(filename)
server = self.server()
if server is None:
self.startServer()
server = self.server()
if server is None:
raise OSError("couldn't start server")
server.publishTrajectory(filename)
def unpublish(self, filename):
filename = os.path.abspath(filename)
server = self.server()
if server is None:
raise OSError("no server available")
server.unpublishTrajectory(filename)
def trajectoryList(self):
trajectories = []
for name in self.pyro_ns.status().keys():
fields = string.split(name, ':')
if len(fields) == 4 and fields[1] == 'MMTK' \
and fields[2] == 'trajectory':
ip_address = fields[0]
filename = fields[3]
hostname = socket.gethostbyaddr(ip_address)[0]
trajectories.append("%s:%s" % (hostname, filename))
return trajectories
def trajectoryInspector(self, name):
colon = string.find(name, ':')
if colon < 0:
raise ValueError("not a remote trajectory name")
ip_address = socket.gethostbyname(name[:colon])
pyro_name = ip_address+':MMTK:trajectory:'+name[colon+1:]
uri = self.pyro_ns.resolve(pyro_name)
return Pyro.core.getProxyForURI(uri)
|