bf821cea8621e667e95986969ba4eb1e311dc2f6
[ossec-hids.git] / debian / ossec-hids / usr / share / doc / ossec-hids / contrib / ossec-testing / runtests.py
1 #!/usr/bin/env python
2 import ConfigParser
3 import subprocess
4 import os
5 import sys
6 import os.path
7
8
9 class OssecTester(object):
10     def __init__(self):
11         self._error = False
12         self._debug = False
13         self._quiet = False
14         self._ossec_conf = "/var/ossec/etc/ossec.conf"
15         self._base_dir = "/var/ossec/"
16         self._ossec_path = "/var/ossec/bin/"
17         self._test_path = "./tests"
18
19     def buildCmd(self, rule, alert, decoder):
20         cmd = ['%s/ossec-logtest' % (self._ossec_path), ]
21         cmd += ['-q']
22         if self._ossec_conf:
23             cmd += ["-c", self._ossec_conf]
24         if self._base_dir:
25             cmd += ["-D", self._base_dir]
26         cmd += ['-U', "%s:%s:%s" % (rule, alert, decoder)]
27         return cmd
28
29     def runTest(self, log, rule, alert, decoder, section, name, negate=False):
30         #print self.buildCmd(rule, alert, decoder)
31         p = subprocess.Popen(
32                 self.buildCmd(rule, alert, decoder),
33                 stdout=subprocess.PIPE,
34                 stderr=subprocess.STDOUT,
35                 stdin=subprocess.PIPE,
36                 shell=False)
37         std_out = p.communicate(log)[0]
38         if (p.returncode != 0 and not negate) or (p.returncode == 0 and negate):
39             self._error = True
40             print ""
41             print "-" * 60
42             print "Failed: Exit code = %s" % (p.returncode)
43             print "        Alert     = %s" % (alert)
44             print "        Rule      = %s" % (rule)
45             print "        Decoder   = %s" % (decoder)
46             print "        Section   = %s" % (section)
47             print "        line name = %s" % (name)
48             print " "
49             print std_out
50         elif self._debug:
51             print "Exit code= %s" % (p.returncode)
52             print std_out
53         else:
54             sys.stdout.write(".")
55
56     def run(self, selective_test=False):
57         for aFile in os.listdir(self._test_path):
58             aFile = os.path.join(self._test_path, aFile)
59             if aFile.endswith(".ini"):
60                 if selective_test and not aFile.endswith(selective_test):
61                     continue
62                 print "- [ File = %s ] ---------" % (aFile)
63                 tGroup = ConfigParser.ConfigParser()
64                 tGroup.read([aFile])
65                 tSections = tGroup.sections()
66                 for t in tSections:
67                     rule = tGroup.get(t, "rule")
68                     alert = tGroup.get(t, "alert")
69                     decoder = tGroup.get(t, "decoder")
70                     for (name, value) in tGroup.items(t):
71                         if name.startswith("log "):
72                             if self._debug:
73                                 print "-" * 60
74                             if name.endswith("pass"):
75                                 neg = False
76                             elif name.endswith("fail"):
77                                 neg = True
78                             else:
79                                 neg = False
80                             self.runTest(value, rule, alert, decoder,
81                                          t, name, negate=neg)
82                 print ""
83         if self._error:
84             sys.exit(1)
85
86 if __name__ == "__main__":
87     if len(sys.argv) == 2:
88         selective_test = sys.argv[1]
89         if not selective_test.endswith('.ini'):
90             selective_test += '.ini'
91     else:
92         selective_test = False
93     OT = OssecTester()
94     OT.run(selective_test)