[Bio] / FigKernelPackages / FIG.py Repository:
ViewVC logotype

Annotation of /FigKernelPackages/FIG.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.11 - (view) (download) (as text)

1 : olson 1.1 import urlparse
2 :     import socket
3 :     import os
4 : olson 1.9 import popen2
5 : olson 1.1 import sys
6 :     import re
7 : olson 1.9 import xmlrpclib
8 :    
9 : olson 1.1 import FIG_Config
10 :    
11 : olson 1.8 import Clearinghouse
12 :    
13 : olson 1.11 class NoSubsystemException(Exception):
14 :     pass
15 :    
16 : olson 1.8 def get_clearinghouse(url = None):
17 :     return Clearinghouse.Clearinghouse(url)
18 :    
19 : olson 1.11 def get_ss_hierarchy(url = None):
20 :     return Clearinghouse.SSHierarchy(url)
21 :    
22 :     #
23 :     # Subsystem helper code.
24 :     #
25 :    
26 :     def get_subsystem(name):
27 :     try:
28 :     sub = Subsystem(name)
29 :     except NoSubsystemException:
30 :     sub = None
31 :    
32 :     return sub
33 :    
34 :    
35 : olson 1.1 def get_local_hostname():
36 :     #
37 : olson 1.7 # See if there is a FIGdisk/config/hostname file. If there
38 :     # is, force the hostname to be that.
39 :     #
40 :    
41 :     try:
42 :     fh = open(os.path.join(FIG_Config.fig_disk, "config", "hostname"))
43 :     host = fh.readline()
44 :     return host.strip()
45 :     except:
46 :     pass
47 :    
48 :     #
49 : olson 1.1 # First check to see if we our hostname is correct.
50 :     #
51 :     # Map it to an IP address, and try to bind to that ip.
52 :     #
53 :    
54 :     hostname = socket.getfqdn()
55 : olson 1.3
56 : olson 1.1 #
57 : olson 1.3 # See if hostname is something.local., which is what
58 :     # a Mac will return if it didn't get a name via some
59 :     # other mechanism (DHCP or static config). We have to
60 :     # check here because otherwise it will pass the fqdn and
61 :     # local binding test.
62 : olson 1.1 #
63 :    
64 : olson 1.4 if not re.search(r"\.local\.?$", hostname):
65 : olson 1.3
66 :     #
67 :     # First check that hostname is a fqdn, and that we can bind to it.
68 :     #
69 :    
70 :     if hostname.find('.') >= 0:
71 :     if try_bind(hostname):
72 :     return hostname
73 :    
74 : olson 1.1 #
75 :     # Otherwise, do a hostname lookup and try to bind to the IP address.
76 :     #
77 :    
78 :     try:
79 :     ip = socket.gethostbyname(hostname)
80 :    
81 :     except socket.error:
82 :     return get_hostname_by_adapter()
83 :    
84 :     if not try_bind(ip):
85 :    
86 :     return get_hostname_by_adapter()
87 :    
88 :     #
89 :     # It worked. Reverse-map back to a hopefully fqdn.
90 :     #
91 :    
92 :     try:
93 :     rev = socket.gethostbyaddr(ip)
94 :    
95 :     except socket.error:
96 :    
97 :     #
98 :     # Failed, return bare IP address.
99 :     #
100 :    
101 :     return ip
102 :    
103 :     host = rev[0]
104 :     #
105 :     # Check to see if we have a FQDN.
106 :     #
107 :     if host.find(".") >= 0:
108 :     return host
109 :     else:
110 :     return ip
111 :    
112 :     def try_bind(host):
113 :     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
114 :     try:
115 :     sock.bind((host, 0))
116 :     return 1
117 :     except socket.error:
118 :     return 0
119 :    
120 :     def get_hostname_by_adapter():
121 :     #
122 :     # Attempt to determine our local hostname based on the
123 :     # network environment.
124 :     #
125 :     # This implementation reads the routing table for the default route.
126 :     # We then look at the interface config for the interface that holds the default.
127 :     #
128 :     #
129 :     # Linux routing table:
130 :     # [olson@yips 0.0.0]$ netstat -rn
131 :     # Kernel IP routing table
132 :     # Destination Gateway Genmask Flags MSS Window irtt Iface
133 :     # 140.221.34.32 0.0.0.0 255.255.255.224 U 0 0 0 eth0
134 :     # 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
135 :     # 127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
136 :     # 0.0.0.0 140.221.34.61 0.0.0.0 UG 0 0 0 eth0
137 :     #
138 :     # Mac routing table:
139 :     #
140 :     # bash-2.05a$ netstat -rn
141 :     # Routing tables
142 :     #
143 :     # Internet:
144 :     # Destination Gateway Flags Refs Use Netif Expire
145 :     # default 140.221.11.253 UGSc 12 120 en0
146 :     # 127.0.0.1 127.0.0.1 UH 16 8415486 lo0
147 :     # 140.221.8/22 link#4 UCS 12 0 en0
148 :     # 140.221.8.78 0:6:5b:f:51:c4 UHLW 0 183 en0 408
149 :     # 140.221.8.191 0:3:93:84:ab:e8 UHLW 0 92 en0 622
150 :     # 140.221.8.198 0:e0:98:8e:36:e2 UHLW 0 5 en0 691
151 :     # 140.221.9.6 0:6:5b:f:51:d6 UHLW 1 63 en0 1197
152 :     # 140.221.10.135 0:d0:59:34:26:34 UHLW 2 2134 en0 1199
153 :     # 140.221.10.152 0:30:1b:b0:ec:dd UHLW 1 137 en0 1122
154 :     # 140.221.10.153 127.0.0.1 UHS 0 0 lo0
155 :     # 140.221.11.37 0:9:6b:53:4e:4b UHLW 1 624 en0 1136
156 :     # 140.221.11.103 0:30:48:22:59:e6 UHLW 3 973 en0 1016
157 :     # 140.221.11.224 0:a:95:6f:7:10 UHLW 1 1 en0 605
158 :     # 140.221.11.237 0:1:30:b8:80:c0 UHLW 0 0 en0 1158
159 :     # 140.221.11.250 0:1:30:3:1:0 UHLW 0 0 en0 1141
160 :     # 140.221.11.253 0:d0:3:e:70:a UHLW 13 0 en0 1199
161 :     # 169.254 link#4 UCS 0 0 en0
162 :     #
163 :     # Internet6:
164 :     # Destination Gateway Flags Netif Expire
165 :     # UH lo0
166 :     # fe80::%lo0/64 Uc lo0
167 :     # link#1 UHL lo0
168 :     # fe80::%en0/64 link#4 UC en0
169 :     # 0:a:95:a8:26:68 UHL lo0
170 :     # ff01::/32 U lo0
171 :     # ff02::%lo0/32 UC lo0
172 :     # ff02::%en0/32 link#4 UC en0
173 :    
174 :     try:
175 :     fh = os.popen("netstat -rn", "r")
176 :     except:
177 :     return "localhost"
178 :    
179 :     interface_name = None
180 :     for l in fh:
181 :     cols = l.strip().split()
182 :    
183 : olson 1.2 if len(cols) > 0 and (cols[0] == "default" or cols[0] == "0.0.0.0"):
184 : olson 1.1 interface_name = cols[-1]
185 :     break
186 :    
187 :     fh.close()
188 :    
189 : olson 1.2 # print "Default route on ", interface_name
190 : olson 1.1
191 :     #
192 :     # Find ifconfig.
193 :     #
194 :    
195 :     ifconfig = None
196 :    
197 :     path = os.environ["PATH"].split(":")
198 :     path.extend(["/sbin", "/usr/sbin"])
199 :     for p in path:
200 :     i = os.path.join(p, "ifconfig")
201 :     if os.access(i, os.X_OK):
202 :     ifconfig = i
203 :     break
204 :    
205 :     if ifconfig is None:
206 :     print >> sys.stderr, "Ifconfig not found"
207 :     return "localhost"
208 :    
209 : olson 1.2 # print >> sys.stderr, "found ifconfig ", ifconfig
210 : olson 1.1
211 :     try:
212 :     fh = os.popen(ifconfig+ " " + interface_name, "r")
213 :     except:
214 :     print >> sys.stderr, "Could not run ", ifconfig
215 :     return "localhost"
216 :    
217 :     ip = None
218 :    
219 :     linux_re = re.compile("inet\s+addr:(\d+\.\d+\.\d+\.\d+)\s+")
220 :     mac_re = re.compile("inet\s+(\d+\.\d+\.\d+\.\d+)\s+")
221 :    
222 :     for l in fh:
223 :     #
224 :     # Mac:
225 :     # inet 140.221.10.153 netmask 0xfffffc00 broadcast 140.221.11.255
226 :     # Linux:
227 :     # inet addr:140.221.34.37 Bcast:140.221.34.63 Mask:255.255.255.224
228 :     #
229 :    
230 :     l = l.strip()
231 :    
232 :     m = linux_re.search(l)
233 :     if m:
234 :     #
235 :     # Linux hit.
236 :     #
237 :     ip = m.group(1)
238 :     break
239 :    
240 :     m = mac_re.search(l)
241 :    
242 :     if m:
243 :     #
244 :     # Mac hit.
245 :     #
246 :     ip = m.group(1)
247 :     break
248 :     fh.close()
249 :    
250 :     if ip is None:
251 :     print >> sys.stderr, "Didn't find an IP"
252 :     return "localhost"
253 :    
254 :     return ip
255 :    
256 :     def cgi_url():
257 :     return plug_url(FIG_Config.cgi_url)
258 :    
259 :     def temp_url():
260 :     return plug_url(FIG_Config.temp_url)
261 :    
262 :     def plug_url(url):
263 :    
264 :     name = get_local_hostname()
265 :    
266 :     if not name:
267 :     return url
268 :    
269 :     p = urlparse.urlparse(url)
270 :    
271 :     p = list(p)
272 :    
273 :     p[1] = name
274 :    
275 :     new_url = urlparse.urlunparse(p)
276 :     return new_url
277 :    
278 : olson 1.5 def get_seed_id():
279 :     #
280 :     # Retrieve the seed identifer from FIGdisk/config/seed_id.
281 :     #
282 :     # If it's not there, create one, and make it readonly.
283 :     #
284 :    
285 :     id_file = os.path.join(FIG_Config.fig_disk, "config", "seed_id")
286 :     if not os.path.isfile(id_file):
287 :    
288 :     fh = os.popen("uuidgen", "r")
289 :    
290 :     newid = fh.readline()
291 : olson 1.6 newid = newid.strip()
292 : olson 1.5
293 :     fh.close()
294 :    
295 :     fh = open(id_file, "w")
296 :     print >>fh, newid
297 :     fh.close()
298 :    
299 :     os.chmod(id_file, 0444)
300 :    
301 :     fh = open(id_file)
302 :     id = fh.readline()
303 :     fh.close()
304 :     id = id.strip()
305 :     return id
306 :    
307 : olson 1.9 #
308 :     # Define a FIG class; this is analagous to the FIG class used in FIG.pm
309 :     #
310 :     # It also lets us cache stuff, and use __call__ to map calls to
311 :     # an XMLRPC server for the perl stuff we don't implement locally.
312 :     #
313 :    
314 :     class FIG:
315 :    
316 :     def __init__(self):
317 :     self.xmlrpc_proxy = None
318 :     self.xmlrpc_proc = None
319 :    
320 :     def __repr__(self):
321 :     return "FIG instance %s" % ( self)
322 :    
323 :     def __str__(self):
324 :     return "FIG instance %s" % (id(self))
325 :    
326 :     def __getattr__(self, name):
327 :     g = globals()
328 :     if g.has_key(name) and callable(g[name]):
329 :     return g[name]
330 :    
331 :     if name.startswith("_"):
332 :     return None
333 :    
334 :     #
335 :     # Not accessible in globals. Return an XMLRPC calling proxy.
336 :     #
337 :    
338 :     return XMLRPCCaller(self, name)
339 :    
340 :     def foo(self):
341 :     print "FOO"
342 :    
343 :    
344 :     def call_xmlrpc(self, name, args):
345 :    
346 :     try:
347 :     if self.xmlrpc_proxy is None:
348 :     self.start_xmlrpc_server()
349 :    
350 :     except Exception, e:
351 :     print "Got exception ... ", e
352 :     return
353 :    
354 :     proc = getattr(self.xmlrpc_proxy, name)
355 :     retval = apply(proc, args)
356 :     return retval
357 :    
358 :     def start_xmlrpc_server(self):
359 : olson 1.10 server_path = os.path.join(FIG_Config.bin, "fig_xmlrpc_server")
360 : olson 1.9
361 :     if not os.access(server_path, os.X_OK):
362 :     raise Exception, "XMLRPC server path %s not found" % (server_path)
363 :    
364 :    
365 :     proc = self.xmlrpc_proc = popen2.Popen3(server_path, 0)
366 :    
367 :     print "Server started ", proc.pid
368 :    
369 :     url = proc.fromchild.readline()
370 :     url = url.strip()
371 :     print "Read url ", url
372 :    
373 :     proc.fromchild.close()
374 :    
375 :     self.xmlrpc_proxy = xmlrpclib.ServerProxy(url)
376 :    
377 :     class XMLRPCCaller:
378 :     def __init__(self, fig, name):
379 :     self.fig = fig
380 :     self.name = name
381 :    
382 :     def __call__(self, *args):
383 :     return self.fig.call_xmlrpc(self.name, args)
384 :    
385 : olson 1.11 class Subsystem:
386 :     def __init__(self, name):
387 :     self.dir = os.path.join(FIG_Config.data, "Subsystems", name.replace(" ","_"))
388 :    
389 :     if not os.path.isdir(self.dir):
390 :     raise NoSubsystemException("Subsystem %s not found" % (name))
391 :    
392 :     def get_version(self):
393 :     try:
394 :     fh = open(os.path.join(self.dir, "VERSION"))
395 :     version = fh.readline().strip()
396 :     try:
397 :     local_version = int(version)
398 :     except TypeError:
399 :     local_version = -1
400 :     fh.close()
401 :     except:
402 :     local_version = -1
403 :    
404 :     return local_version;
405 :    
406 :     def get_curator(self):
407 :     curator = None
408 :     try:
409 :     fh = open(os.path.join(self.dir, "curation.log"))
410 :     l = fh.readline().strip()
411 :     fh.close()
412 :     m = re.match(r"^\d+\t(\S+)\s+started", l)
413 :     if m:
414 :     curator = m.group(1)
415 :     except:
416 :     pass
417 :    
418 :     return curator
419 :    
420 : olson 1.1 if __name__ == "__main__":
421 :    
422 :     print get_local_hostname()
423 :     print cgi_url()
424 :     print temp_url()
425 : olson 1.5
426 :     print get_seed_id()

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3