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

Annotation of /FigKernelPackages/FIG.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.12 - (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 : overbeek 1.12 def top_link():
257 :    
258 :     #
259 :     # Determine if this is a toplevel cgi or one in one of the subdirs (currently
260 :     # just /p2p).
261 :     #
262 :    
263 :     sname = os.getenv("SCRIPT_NAME")
264 :    
265 :     if sname is not None:
266 :     parts = os.getenv("SCRIPT_NAME").split('/');
267 :    
268 :     if len(parts) > 2 and parts[-2] == 'FIG':
269 :     top = '.'
270 :     elif len(parts) > 3 and parts[-3] == 'FIG':
271 :     top = '..'
272 :     else:
273 :     top = FIG_Config.cgi_base
274 :     else:
275 :     top = FIG_Config.cgi_base
276 :    
277 :    
278 :    
279 :     return top
280 :    
281 : olson 1.1 def cgi_url():
282 : overbeek 1.12 return top_link()
283 :     # return plug_url(FIG_Config.cgi_url)
284 : olson 1.1
285 :     def temp_url():
286 :     return plug_url(FIG_Config.temp_url)
287 :    
288 :     def plug_url(url):
289 :    
290 :     name = get_local_hostname()
291 :    
292 :     if not name:
293 :     return url
294 :    
295 :     p = urlparse.urlparse(url)
296 :    
297 :     p = list(p)
298 :    
299 :     p[1] = name
300 :    
301 :     new_url = urlparse.urlunparse(p)
302 :     return new_url
303 :    
304 : olson 1.5 def get_seed_id():
305 :     #
306 :     # Retrieve the seed identifer from FIGdisk/config/seed_id.
307 :     #
308 :     # If it's not there, create one, and make it readonly.
309 :     #
310 :    
311 :     id_file = os.path.join(FIG_Config.fig_disk, "config", "seed_id")
312 :     if not os.path.isfile(id_file):
313 :    
314 :     fh = os.popen("uuidgen", "r")
315 :    
316 :     newid = fh.readline()
317 : olson 1.6 newid = newid.strip()
318 : olson 1.5
319 :     fh.close()
320 :    
321 :     fh = open(id_file, "w")
322 :     print >>fh, newid
323 :     fh.close()
324 :    
325 :     os.chmod(id_file, 0444)
326 :    
327 :     fh = open(id_file)
328 :     id = fh.readline()
329 :     fh.close()
330 :     id = id.strip()
331 :     return id
332 :    
333 : olson 1.9 #
334 :     # Define a FIG class; this is analagous to the FIG class used in FIG.pm
335 :     #
336 :     # It also lets us cache stuff, and use __call__ to map calls to
337 :     # an XMLRPC server for the perl stuff we don't implement locally.
338 :     #
339 :    
340 :     class FIG:
341 :    
342 :     def __init__(self):
343 :     self.xmlrpc_proxy = None
344 :     self.xmlrpc_proc = None
345 :    
346 :     def __repr__(self):
347 :     return "FIG instance %s" % ( self)
348 :    
349 :     def __str__(self):
350 :     return "FIG instance %s" % (id(self))
351 :    
352 :     def __getattr__(self, name):
353 :     g = globals()
354 :     if g.has_key(name) and callable(g[name]):
355 :     return g[name]
356 :    
357 :     if name.startswith("_"):
358 :     return None
359 :    
360 :     #
361 :     # Not accessible in globals. Return an XMLRPC calling proxy.
362 :     #
363 :    
364 :     return XMLRPCCaller(self, name)
365 :    
366 :     def foo(self):
367 :     print "FOO"
368 :    
369 :    
370 :     def call_xmlrpc(self, name, args):
371 :    
372 :     try:
373 :     if self.xmlrpc_proxy is None:
374 :     self.start_xmlrpc_server()
375 :    
376 :     except Exception, e:
377 :     print "Got exception ... ", e
378 :     return
379 :    
380 :     proc = getattr(self.xmlrpc_proxy, name)
381 :     retval = apply(proc, args)
382 :     return retval
383 :    
384 :     def start_xmlrpc_server(self):
385 : olson 1.10 server_path = os.path.join(FIG_Config.bin, "fig_xmlrpc_server")
386 : olson 1.9
387 :     if not os.access(server_path, os.X_OK):
388 :     raise Exception, "XMLRPC server path %s not found" % (server_path)
389 :    
390 :    
391 :     proc = self.xmlrpc_proc = popen2.Popen3(server_path, 0)
392 :    
393 :     print "Server started ", proc.pid
394 :    
395 :     url = proc.fromchild.readline()
396 :     url = url.strip()
397 :     print "Read url ", url
398 :    
399 :     proc.fromchild.close()
400 :    
401 :     self.xmlrpc_proxy = xmlrpclib.ServerProxy(url)
402 :    
403 :     class XMLRPCCaller:
404 :     def __init__(self, fig, name):
405 :     self.fig = fig
406 :     self.name = name
407 :    
408 :     def __call__(self, *args):
409 :     return self.fig.call_xmlrpc(self.name, args)
410 :    
411 : olson 1.11 class Subsystem:
412 :     def __init__(self, name):
413 :     self.dir = os.path.join(FIG_Config.data, "Subsystems", name.replace(" ","_"))
414 :    
415 :     if not os.path.isdir(self.dir):
416 :     raise NoSubsystemException("Subsystem %s not found" % (name))
417 :    
418 :     def get_version(self):
419 :     try:
420 :     fh = open(os.path.join(self.dir, "VERSION"))
421 :     version = fh.readline().strip()
422 :     try:
423 :     local_version = int(version)
424 :     except TypeError:
425 :     local_version = -1
426 :     fh.close()
427 :     except:
428 :     local_version = -1
429 :    
430 :     return local_version;
431 :    
432 :     def get_curator(self):
433 :     curator = None
434 :     try:
435 :     fh = open(os.path.join(self.dir, "curation.log"))
436 :     l = fh.readline().strip()
437 :     fh.close()
438 :     m = re.match(r"^\d+\t(\S+)\s+started", l)
439 :     if m:
440 :     curator = m.group(1)
441 :     except:
442 :     pass
443 :    
444 :     return curator
445 :    
446 : olson 1.1 if __name__ == "__main__":
447 :    
448 :     print get_local_hostname()
449 :     print cgi_url()
450 :     print temp_url()
451 : olson 1.5
452 :     print get_seed_id()

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3