File: cmdresult.py

package info (click to toggle)
zeekctl 2.2.0%2Bds1-2
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 2,544 kB
  • sloc: python: 5,639; sh: 1,374; makefile: 71; awk: 24
file content (107 lines) | stat: -rw-r--r-- 3,204 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# Store results of a zeekctl command.

from ZeekControl import node as node_mod

class CmdResult:
    """Class representing the result of a zeekctl command."""

    def __init__(self, ok=True, unknowncmd=False):
        # Command succeeded (True), or error occurred (False)
        self.ok = ok

        # If True, then the requested command does not exist.
        self.unknowncmd = unknowncmd

        # Number of Zeek nodes that command succeeded, and number that failed
        self.success_count = 0
        self.fail_count = 0

        # List of results for each node
        self.nodes = []

        # Results in the "nodes" list have been sorted (True), or not (False)
        self._sorted = False

        # List of arbitrary (key, value) pairs.
        self.keyval = []

    def to_dict(self):
        return {
            "success_count": self.success_count,
            "fail_count": self.fail_count,
            "nodes": self.get_node_data(),
        }

    def get_node_counts(self):
        """Return tuple (success, fail) of success and fail node counts."""

        return self.success_count, self.fail_count

    def get_node_data(self):
        """Return a list of tuples (node, success, data), where node is a
        Zeek node, success is a boolean, and data is a dictionary.
        """

        results = self.nodes

        if not self._sorted:
            results.sort(key=node_mod.sorttuple)
            self._sorted = True

        return results

    def get_node_output(self):
        """Return a list of tuples (node, success, output), where node is a
        Zeek node, success is a boolean, and output is a string.
        """

        results = []
        for node, success, out in self.nodes:
            output = out.get("_output", "")
            results.append((node, success, output))

        if not self._sorted:
            results.sort(key=node_mod.sorttuple)
            self._sorted = True

        return results

    def set_node_fail(self, node):
        """Records the fact that the given node failed."""

        self.nodes.append((node, False, {}))
        self.fail_count += 1
        self.ok = False

    def set_node_success(self, node):
        """Records the fact that the given node succeeded."""

        self.nodes.append((node, True, {}))
        self.success_count += 1

    def set_node_output(self, node, success, output):
        """Records the success status of the given node, and stores some
        output messages.  The node parameter is a Zeek node, success is a
        boolean, and output is a string.
        """

        self.nodes.append((node, success, {"_output": output}))
        if success:
            self.success_count += 1
        else:
            self.fail_count += 1
            self.ok = False

    def set_node_data(self, node, success, data):
        """Records the success status of the given node, and stores some data.
        The node parameter is a Zeek node, success is a boolean, and data is a
        dictionary.
        """

        self.nodes.append((node, success, data))
        if success:
            self.success_count += 1
        else:
            self.fail_count += 1
            self.ok = False