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

Annotation of /FigKernelPackages/FIG.py

Parent Directory Parent Directory | Revision Log Revision Log


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

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

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3