File: TrajectoryManager.py

package info (click to toggle)
mmtk 2.7.9-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 11,788 kB
  • ctags: 6,600
  • sloc: python: 18,050; ansic: 12,400; makefile: 129; csh: 3
file content (80 lines) | stat: -rw-r--r-- 2,703 bytes parent folder | download
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)