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

Annotation of /FigKernelPackages/FIG.py

Parent Directory Parent Directory | Revision Log Revision Log


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

1 : olson 1.1 import urlparse
2 :     import socket
3 :     import os
4 :     import sys
5 :     import re
6 :     import FIG_Config
7 :    
8 : olson 1.8 import Clearinghouse
9 :    
10 :     def get_clearinghouse(url = None):
11 :     return Clearinghouse.Clearinghouse(url)
12 :    
13 : olson 1.1 def get_local_hostname():
14 :     #
15 : olson 1.7 # See if there is a FIGdisk/config/hostname file. If there
16 :     # is, force the hostname to be that.
17 :     #
18 :    
19 :     try:
20 :     fh = open(os.path.join(FIG_Config.fig_disk, "config", "hostname"))
21 :     host = fh.readline()
22 :     return host.strip()
23 :     except:
24 :     pass
25 :    
26 :     #
27 : olson 1.1 # First check to see if we our hostname is correct.
28 :     #
29 :     # Map it to an IP address, and try to bind to that ip.
30 :     #
31 :    
32 :     hostname = socket.getfqdn()
33 : olson 1.3
34 : olson 1.1 #
35 : olson 1.3 # See if hostname is something.local., which is what
36 :     # a Mac will return if it didn't get a name via some
37 :     # other mechanism (DHCP or static config). We have to
38 :     # check here because otherwise it will pass the fqdn and
39 :     # local binding test.
40 : olson 1.1 #
41 :    
42 : olson 1.4 if not re.search(r"\.local\.?$", hostname):
43 : olson 1.3
44 :     #
45 :     # First check that hostname is a fqdn, and that we can bind to it.
46 :     #
47 :    
48 :     if hostname.find('.') >= 0:
49 :     if try_bind(hostname):
50 :     return hostname
51 :    
52 : olson 1.1 #
53 :     # Otherwise, do a hostname lookup and try to bind to the IP address.
54 :     #
55 :    
56 :     try:
57 :     ip = socket.gethostbyname(hostname)
58 :    
59 :     except socket.error:
60 :     return get_hostname_by_adapter()
61 :    
62 :     if not try_bind(ip):
63 :    
64 :     return get_hostname_by_adapter()
65 :    
66 :     #
67 :     # It worked. Reverse-map back to a hopefully fqdn.
68 :     #
69 :    
70 :     try:
71 :     rev = socket.gethostbyaddr(ip)
72 :    
73 :     except socket.error:
74 :    
75 :     #
76 :     # Failed, return bare IP address.
77 :     #
78 :    
79 :     return ip
80 :    
81 :     host = rev[0]
82 :     #
83 :     # Check to see if we have a FQDN.
84 :     #
85 :     if host.find(".") >= 0:
86 :     return host
87 :     else:
88 :     return ip
89 :    
90 :     def try_bind(host):
91 :     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
92 :     try:
93 :     sock.bind((host, 0))
94 :     return 1
95 :     except socket.error:
96 :     return 0
97 :    
98 :     def get_hostname_by_adapter():
99 :     #
100 :     # Attempt to determine our local hostname based on the
101 :     # network environment.
102 :     #
103 :     # This implementation reads the routing table for the default route.
104 :     # We then look at the interface config for the interface that holds the default.
105 :     #
106 :     #
107 :     # Linux routing table:
108 :     # [olson@yips 0.0.0]$ netstat -rn
109 :     # Kernel IP routing table
110 :     # Destination Gateway Genmask Flags MSS Window irtt Iface
111 :     # 140.221.34.32 0.0.0.0 255.255.255.224 U 0 0 0 eth0
112 :     # 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
113 :     # 127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
114 :     # 0.0.0.0 140.221.34.61 0.0.0.0 UG 0 0 0 eth0
115 :     #
116 :     # Mac routing table:
117 :     #
118 :     # bash-2.05a$ netstat -rn
119 :     # Routing tables
120 :     #
121 :     # Internet:
122 :     # Destination Gateway Flags Refs Use Netif Expire
123 :     # default 140.221.11.253 UGSc 12 120 en0
124 :     # 127.0.0.1 127.0.0.1 UH 16 8415486 lo0
125 :     # 140.221.8/22 link#4 UCS 12 0 en0
126 :     # 140.221.8.78 0:6:5b:f:51:c4 UHLW 0 183 en0 408
127 :     # 140.221.8.191 0:3:93:84:ab:e8 UHLW 0 92 en0 622
128 :     # 140.221.8.198 0:e0:98:8e:36:e2 UHLW 0 5 en0 691
129 :     # 140.221.9.6 0:6:5b:f:51:d6 UHLW 1 63 en0 1197
130 :     # 140.221.10.135 0:d0:59:34:26:34 UHLW 2 2134 en0 1199
131 :     # 140.221.10.152 0:30:1b:b0:ec:dd UHLW 1 137 en0 1122
132 :     # 140.221.10.153 127.0.0.1 UHS 0 0 lo0
133 :     # 140.221.11.37 0:9:6b:53:4e:4b UHLW 1 624 en0 1136
134 :     # 140.221.11.103 0:30:48:22:59:e6 UHLW 3 973 en0 1016
135 :     # 140.221.11.224 0:a:95:6f:7:10 UHLW 1 1 en0 605
136 :     # 140.221.11.237 0:1:30:b8:80:c0 UHLW 0 0 en0 1158
137 :     # 140.221.11.250 0:1:30:3:1:0 UHLW 0 0 en0 1141
138 :     # 140.221.11.253 0:d0:3:e:70:a UHLW 13 0 en0 1199
139 :     # 169.254 link#4 UCS 0 0 en0
140 :     #
141 :     # Internet6:
142 :     # Destination Gateway Flags Netif Expire
143 :     # UH lo0
144 :     # fe80::%lo0/64 Uc lo0
145 :     # link#1 UHL lo0
146 :     # fe80::%en0/64 link#4 UC en0
147 :     # 0:a:95:a8:26:68 UHL lo0
148 :     # ff01::/32 U lo0
149 :     # ff02::%lo0/32 UC lo0
150 :     # ff02::%en0/32 link#4 UC en0
151 :    
152 :     try:
153 :     fh = os.popen("netstat -rn", "r")
154 :     except:
155 :     return "localhost"
156 :    
157 :     interface_name = None
158 :     for l in fh:
159 :     cols = l.strip().split()
160 :    
161 : olson 1.2 if len(cols) > 0 and (cols[0] == "default" or cols[0] == "0.0.0.0"):
162 : olson 1.1 interface_name = cols[-1]
163 :     break
164 :    
165 :     fh.close()
166 :    
167 : olson 1.2 # print "Default route on ", interface_name
168 : olson 1.1
169 :     #
170 :     # Find ifconfig.
171 :     #
172 :    
173 :     ifconfig = None
174 :    
175 :     path = os.environ["PATH"].split(":")
176 :     path.extend(["/sbin", "/usr/sbin"])
177 :     for p in path:
178 :     i = os.path.join(p, "ifconfig")
179 :     if os.access(i, os.X_OK):
180 :     ifconfig = i
181 :     break
182 :    
183 :     if ifconfig is None:
184 :     print >> sys.stderr, "Ifconfig not found"
185 :     return "localhost"
186 :    
187 : olson 1.2 # print >> sys.stderr, "found ifconfig ", ifconfig
188 : olson 1.1
189 :     try:
190 :     fh = os.popen(ifconfig+ " " + interface_name, "r")
191 :     except:
192 :     print >> sys.stderr, "Could not run ", ifconfig
193 :     return "localhost"
194 :    
195 :     ip = None
196 :    
197 :     linux_re = re.compile("inet\s+addr:(\d+\.\d+\.\d+\.\d+)\s+")
198 :     mac_re = re.compile("inet\s+(\d+\.\d+\.\d+\.\d+)\s+")
199 :    
200 :     for l in fh:
201 :     #
202 :     # Mac:
203 :     # inet 140.221.10.153 netmask 0xfffffc00 broadcast 140.221.11.255
204 :     # Linux:
205 :     # inet addr:140.221.34.37 Bcast:140.221.34.63 Mask:255.255.255.224
206 :     #
207 :    
208 :     l = l.strip()
209 :    
210 :     m = linux_re.search(l)
211 :     if m:
212 :     #
213 :     # Linux hit.
214 :     #
215 :     ip = m.group(1)
216 :     break
217 :    
218 :     m = mac_re.search(l)
219 :    
220 :     if m:
221 :     #
222 :     # Mac hit.
223 :     #
224 :     ip = m.group(1)
225 :     break
226 :     fh.close()
227 :    
228 :     if ip is None:
229 :     print >> sys.stderr, "Didn't find an IP"
230 :     return "localhost"
231 :    
232 :     return ip
233 :    
234 :     def cgi_url():
235 :     return plug_url(FIG_Config.cgi_url)
236 :    
237 :     def temp_url():
238 :     return plug_url(FIG_Config.temp_url)
239 :    
240 :     def plug_url(url):
241 :    
242 :     name = get_local_hostname()
243 :    
244 :     if not name:
245 :     return url
246 :    
247 :     p = urlparse.urlparse(url)
248 :    
249 :     p = list(p)
250 :    
251 :     p[1] = name
252 :    
253 :     new_url = urlparse.urlunparse(p)
254 :     return new_url
255 :    
256 : olson 1.5 def get_seed_id():
257 :     #
258 :     # Retrieve the seed identifer from FIGdisk/config/seed_id.
259 :     #
260 :     # If it's not there, create one, and make it readonly.
261 :     #
262 :    
263 :     id_file = os.path.join(FIG_Config.fig_disk, "config", "seed_id")
264 :     if not os.path.isfile(id_file):
265 :    
266 :     fh = os.popen("uuidgen", "r")
267 :    
268 :     newid = fh.readline()
269 : olson 1.6 newid = newid.strip()
270 : olson 1.5
271 :     fh.close()
272 :    
273 :     fh = open(id_file, "w")
274 :     print >>fh, newid
275 :     fh.close()
276 :    
277 :     os.chmod(id_file, 0444)
278 :    
279 :     fh = open(id_file)
280 :     id = fh.readline()
281 :     fh.close()
282 :     id = id.strip()
283 :     return id
284 :    
285 : olson 1.1 if __name__ == "__main__":
286 :    
287 :     print get_local_hostname()
288 :     print cgi_url()
289 :     print temp_url()
290 : olson 1.5
291 :     print get_seed_id()

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3