From d8f91b9e5445c7cdb03eeb7dd641edf082d3fb40 Mon Sep 17 00:00:00 2001
From: Per Cederqvist <ceder@lysator.liu.se>
Date: Mon, 12 Feb 2007 11:08:37 +0000
Subject: [PATCH] Added a configuration file that can list hosts that should
 have the port open.

---
 check_no_server | 74 ++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 67 insertions(+), 7 deletions(-)

diff --git a/check_no_server b/check_no_server
index 7ffddaa..e496dee 100755
--- a/check_no_server
+++ b/check_no_server
@@ -2,6 +2,7 @@
 
 import socket
 import errno
+import sys
 
 def unknown(hostname, msg):
     print "UNKNOWN - %s: %s" % (hostname, msg)
@@ -19,7 +20,7 @@ def ok(hostname, msg):
     print "OK - %s: %s" % (hostname, msg)
     sys.exit(0)
 
-def check_no_server(hostname, port):
+def check_no_server(hostname, port, cfg):
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     s.settimeout(7)
     try:
@@ -27,15 +28,74 @@ def check_no_server(hostname, port):
     except socket.gaierror, err:
         warning(hostname, err[1])
     except socket.timeout:
-        ok(hostname, "timeout connecting to server")
+        if cfg.require(hostname):
+            critical(hostname, "timeout connecting to server")
+        else:
+            ok(hostname, "timeout connecting to server")
     except socket.error, e:
         if e[0] == errno.ECONNREFUSED:
-            ok(hostname, e[1])
+            if cfg.require(hostname):
+                critical(hostname, e[1])
+            else:
+                ok(hostname, e[1])
         unknown(hostname, e[1])
 
-    critical(hostname, "connection succeeded")
+    if cfg.allowed(hostname):
+        ok(hostname, "connection succeeded")
+    else:
+        critical(hostname, "connection succeeded")
 
-if __name__ == '__main__':
-    import sys
+class CfgFile(object):
+    def __init__(self, fn=None):
+        self.__allowed = {}
+        if fn is not None:
+            for line in file(fn):
+                if line[0] == "#":
+                    continue
+                cmd, host, comment = line.split(None, 2)
+                self.__allowed[host] = cmd
+
+    def allowed(self, host):
+        return self.__allowed.get(host) in ["allow", "require"]
+
+    def require(self, host):
+        return self.__allowed.get(host) in ["require"]
+
+def usage():
+    sys.stderr.write("usage: check_no_server -H host -p port [ -c cfgfile ]\n")
+    sys.stderr.write("or: check_no_server [ -c cfgfile ] host port\n")
+    sys.exit(1)
+
+def main():
+    import getopt
 
-    check_no_server(sys.argv[1], int(sys.argv[2]))
+    host = None
+    port = None
+    cfg = None
+
+    opts, args = getopt.getopt(sys.argv[1:], "H:p:c:",
+                               ["host=", "port=", "cfg="])
+    for opt, val in opts:
+        if opt in ("-H", "--host"):
+            host = val
+        elif opt in ("-p", "--port"):
+            port = int(val)
+        elif opt in ("-c", "--cfg"):
+            cfg = val
+
+    if host is None and port is None and len(args) == 2:
+        host = args[0]
+        port = int(args[1])
+
+    if host is None or port is None:
+        usage()
+
+    if cfg is not None:
+        cfg_data = CfgFile(cfg)
+    else:
+        cfg_data = CfgFile()
+    
+    check_no_server(host, port, cfg_data)
+
+if __name__ == '__main__':
+    main()
-- 
GitLab