Add bw, dns, and uptime checks.
[myops.git] / web / collect / client / DNS / win32dns.py
diff --git a/web/collect/client/DNS/win32dns.py b/web/collect/client/DNS/win32dns.py
new file mode 100644 (file)
index 0000000..1552ed7
--- /dev/null
@@ -0,0 +1,144 @@
+"""
+ $Id: win32dns.py,v 1.3.2.1 2007/05/22 20:26:49 customdesigned Exp $
+
+ Extract a list of TCP/IP name servers from the registry 0.1
+    0.1 Strobl 2001-07-19
+ Usage:
+    RegistryResolve() returns a list of ip numbers (dotted quads), by
+    scouring the registry for addresses of name servers
+
+ Tested on Windows NT4 Server SP6a, Windows 2000 Pro SP2 and
+ Whistler Pro (XP) Build 2462 and Windows ME
+ ... all having a different registry layout wrt name servers :-/
+
+ Todo:
+
+   Program doesn't check whether an interface is up or down
+
+ (c) 2001 Copyright by Wolfgang Strobl ws@mystrobl.de,
+          License analog to the current Python license
+"""
+
+import string, re
+import _winreg
+
+def binipdisplay(s):
+    "convert a binary array of ip adresses to a python list"
+    if len(s)%4!= 0:
+        raise EnvironmentError # well ...
+    ol=[]
+    for i in range(len(s)/4):
+        s1=s[:4]
+        s=s[4:]
+        ip=[]
+        for j in s1:
+            ip.append(str(ord(j)))
+        ol.append(string.join(ip,'.'))
+    return ol
+
+def stringdisplay(s):
+    '''convert "d.d.d.d,d.d.d.d" to ["d.d.d.d","d.d.d.d"].
+       also handle u'd.d.d.d d.d.d.d', as reporting on SF 
+    '''
+    import re
+    return map(str, re.split("[ ,]",s))
+
+def RegistryResolve():
+    nameservers=[]
+    x=_winreg.ConnectRegistry(None,_winreg.HKEY_LOCAL_MACHINE)
+    try:
+        y= _winreg.OpenKey(x,
+         r"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters")
+    except EnvironmentError: # so it isn't NT/2000/XP
+        # windows ME, perhaps?
+        try: # for Windows ME
+            y= _winreg.OpenKey(x,
+                 r"SYSTEM\CurrentControlSet\Services\VxD\MSTCP")
+            nameserver,dummytype=_winreg.QueryValueEx(y,'NameServer')
+            if nameserver and not (nameserver in nameservers):
+                nameservers.extend(stringdisplay(nameserver))
+        except EnvironmentError:
+            pass
+        return nameservers # no idea
+    try:
+        nameserver = _winreg.QueryValueEx(y, "DhcpNameServer")[0].split()
+    except:
+        nameserver = _winreg.QueryValueEx(y, "NameServer")[0].split()
+    if nameserver:
+        nameservers=nameserver
+    nameserver = _winreg.QueryValueEx(y,"NameServer")[0]
+    _winreg.CloseKey(y)
+    try: # for win2000
+        y= _winreg.OpenKey(x,
+         r"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DNSRegisteredAdapters")
+        for i in range(1000):
+            try:
+                n=_winreg.EnumKey(y,i)
+                z=_winreg.OpenKey(y,n)
+                dnscount,dnscounttype=_winreg.QueryValueEx(z,
+                                            'DNSServerAddressCount')
+                dnsvalues,dnsvaluestype=_winreg.QueryValueEx(z,
+                                            'DNSServerAddresses')
+                nameservers.extend(binipdisplay(dnsvalues))
+                _winreg.CloseKey(z)
+            except EnvironmentError:
+                break
+        _winreg.CloseKey(y)
+    except EnvironmentError:
+        pass
+#
+    try: # for whistler
+        y= _winreg.OpenKey(x,
+         r"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces")
+        for i in range(1000):
+            try:
+                n=_winreg.EnumKey(y,i)
+                z=_winreg.OpenKey(y,n)
+                try:
+                    nameserver,dummytype=_winreg.QueryValueEx(z,'NameServer')
+                    if nameserver and not (nameserver in nameservers):
+                        nameservers.extend(stringdisplay(nameserver))
+                except EnvironmentError:
+                    pass
+                _winreg.CloseKey(z)
+            except EnvironmentError:
+                break
+        _winreg.CloseKey(y)
+    except EnvironmentError:
+        #print "Key Interfaces not found, just do nothing"
+        pass
+#
+    _winreg.CloseKey(x)
+    return nameservers
+
+if __name__=="__main__":
+    print "Name servers:",RegistryResolve()
+
+#
+# $Log: win32dns.py,v $
+# Revision 1.3.2.1  2007/05/22 20:26:49  customdesigned
+# Fix win32 nameserver discovery.
+#
+# Revision 1.3  2002/05/06 06:15:31  anthonybaxter
+# apparently some versions of windows return servers as unicode
+# string with space sep, rather than strings with comma sep.
+# *sigh*
+#
+# Revision 1.2  2002/03/19 12:41:33  anthonybaxter
+# tabnannied and reindented everything. 4 space indent, no tabs.
+# yay.
+#
+# Revision 1.1  2001/08/09 09:22:28  anthonybaxter
+# added what I hope is win32 resolver lookup support. I'll need to try
+# and figure out how to get the CVS checkout onto my windows machine to
+# make sure it works (wow, doing something other than games on the
+# windows machine :)
+#
+# Code from Wolfgang.Strobl@gmd.de
+# win32dns.py from
+# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66260
+#
+# Really, ParseResolvConf() should be renamed "FindNameServers" or
+# some such.
+#
+#