Add bw, dns, and uptime checks.
[myops.git] / web / collect / client / DNS / win32dns.py
1 """
2  $Id: win32dns.py,v 1.3.2.1 2007/05/22 20:26:49 customdesigned Exp $
3
4  Extract a list of TCP/IP name servers from the registry 0.1
5     0.1 Strobl 2001-07-19
6  Usage:
7     RegistryResolve() returns a list of ip numbers (dotted quads), by
8     scouring the registry for addresses of name servers
9
10  Tested on Windows NT4 Server SP6a, Windows 2000 Pro SP2 and
11  Whistler Pro (XP) Build 2462 and Windows ME
12  ... all having a different registry layout wrt name servers :-/
13
14  Todo:
15
16    Program doesn't check whether an interface is up or down
17
18  (c) 2001 Copyright by Wolfgang Strobl ws@mystrobl.de,
19           License analog to the current Python license
20 """
21
22 import string, re
23 import _winreg
24
25 def binipdisplay(s):
26     "convert a binary array of ip adresses to a python list"
27     if len(s)%4!= 0:
28         raise EnvironmentError # well ...
29     ol=[]
30     for i in range(len(s)/4):
31         s1=s[:4]
32         s=s[4:]
33         ip=[]
34         for j in s1:
35             ip.append(str(ord(j)))
36         ol.append(string.join(ip,'.'))
37     return ol
38
39 def stringdisplay(s):
40     '''convert "d.d.d.d,d.d.d.d" to ["d.d.d.d","d.d.d.d"].
41        also handle u'd.d.d.d d.d.d.d', as reporting on SF 
42     '''
43     import re
44     return map(str, re.split("[ ,]",s))
45
46 def RegistryResolve():
47     nameservers=[]
48     x=_winreg.ConnectRegistry(None,_winreg.HKEY_LOCAL_MACHINE)
49     try:
50         y= _winreg.OpenKey(x,
51          r"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters")
52     except EnvironmentError: # so it isn't NT/2000/XP
53         # windows ME, perhaps?
54         try: # for Windows ME
55             y= _winreg.OpenKey(x,
56                  r"SYSTEM\CurrentControlSet\Services\VxD\MSTCP")
57             nameserver,dummytype=_winreg.QueryValueEx(y,'NameServer')
58             if nameserver and not (nameserver in nameservers):
59                 nameservers.extend(stringdisplay(nameserver))
60         except EnvironmentError:
61             pass
62         return nameservers # no idea
63     try:
64         nameserver = _winreg.QueryValueEx(y, "DhcpNameServer")[0].split()
65     except:
66         nameserver = _winreg.QueryValueEx(y, "NameServer")[0].split()
67     if nameserver:
68         nameservers=nameserver
69     nameserver = _winreg.QueryValueEx(y,"NameServer")[0]
70     _winreg.CloseKey(y)
71     try: # for win2000
72         y= _winreg.OpenKey(x,
73          r"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DNSRegisteredAdapters")
74         for i in range(1000):
75             try:
76                 n=_winreg.EnumKey(y,i)
77                 z=_winreg.OpenKey(y,n)
78                 dnscount,dnscounttype=_winreg.QueryValueEx(z,
79                                             'DNSServerAddressCount')
80                 dnsvalues,dnsvaluestype=_winreg.QueryValueEx(z,
81                                             'DNSServerAddresses')
82                 nameservers.extend(binipdisplay(dnsvalues))
83                 _winreg.CloseKey(z)
84             except EnvironmentError:
85                 break
86         _winreg.CloseKey(y)
87     except EnvironmentError:
88         pass
89 #
90     try: # for whistler
91         y= _winreg.OpenKey(x,
92          r"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces")
93         for i in range(1000):
94             try:
95                 n=_winreg.EnumKey(y,i)
96                 z=_winreg.OpenKey(y,n)
97                 try:
98                     nameserver,dummytype=_winreg.QueryValueEx(z,'NameServer')
99                     if nameserver and not (nameserver in nameservers):
100                         nameservers.extend(stringdisplay(nameserver))
101                 except EnvironmentError:
102                     pass
103                 _winreg.CloseKey(z)
104             except EnvironmentError:
105                 break
106         _winreg.CloseKey(y)
107     except EnvironmentError:
108         #print "Key Interfaces not found, just do nothing"
109         pass
110 #
111     _winreg.CloseKey(x)
112     return nameservers
113
114 if __name__=="__main__":
115     print "Name servers:",RegistryResolve()
116
117 #
118 # $Log: win32dns.py,v $
119 # Revision 1.3.2.1  2007/05/22 20:26:49  customdesigned
120 # Fix win32 nameserver discovery.
121 #
122 # Revision 1.3  2002/05/06 06:15:31  anthonybaxter
123 # apparently some versions of windows return servers as unicode
124 # string with space sep, rather than strings with comma sep.
125 # *sigh*
126 #
127 # Revision 1.2  2002/03/19 12:41:33  anthonybaxter
128 # tabnannied and reindented everything. 4 space indent, no tabs.
129 # yay.
130 #
131 # Revision 1.1  2001/08/09 09:22:28  anthonybaxter
132 # added what I hope is win32 resolver lookup support. I'll need to try
133 # and figure out how to get the CVS checkout onto my windows machine to
134 # make sure it works (wow, doing something other than games on the
135 # windows machine :)
136 #
137 # Code from Wolfgang.Strobl@gmd.de
138 # win32dns.py from
139 # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66260
140 #
141 # Really, ParseResolvConf() should be renamed "FindNameServers" or
142 # some such.
143 #
144 #