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

Annotation of /FigKernelPackages/FIG.py

Parent Directory Parent Directory | Revision Log Revision Log


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

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3