PHP 7.4.33
Preview: unbound_dns.py Size: 4.62 KB
//lib/fm-agent/plugins/unbound_dns.py

import os

try:
    import json
except ImportError:
    import simplejson as json
import agent_util
import datetime


def get_unbound_stats():
    unbound_stats = {}
    unbound_binary = agent_util.which("unbound-control")
    ret, out = agent_util.execute_command("%s stats" % unbound_binary)
    if ret != 0:
        print("ERROR RUNNING UNBOUND: %s" % out)
        return {"error": str(out)}, False
    tmp = out.strip().split("\n")
    for line in tmp:
        k, v = line.split("=")
        unbound_stats[k] = float(v)
    return unbound_stats, True


def get_unbound_options(unbound_stats):
    options = []
    for opt in unbound_stats.keys():
        name = opt.split(".")[0]
        if name == "time":
            continue
        options.append(name)
    return list(set(options))


class UnboundDNS(agent_util.Plugin):
    """
    WARNING:
        You MUST SET AT LEAST 755 ON '/etc/unbound/unbound_control.*'
        AND '/etc/unbound/unbound_server.*' FOR THIS PLUGIN TO WORK PROPERLY
    """

    textkey = "unbound_dns"
    label = "Unbound DNS Resolver"

    @classmethod
    def get_metadata(self, config):
        status = agent_util.SUPPORTED
        msg = None
        unbound_options = ["total"]

        # check to confirm unbound is installed
        unbound_installed = agent_util.which("unbound-control")
        if not unbound_installed:
            status = agent_util.UNSUPPORTED
            msg = "Command unbound-control not installed"
            return {}
        else:
            unbound_stats, passed = get_unbound_stats()
            if passed is False:
                self.log.error("ERROR with Unbound:\n%s" % unbound_stats["error"])
                stats = agent_util.MISCONFIGURED
                msg = unbound_stats["error"]
            else:
                self.log.debug("Found unbound stats!\n%s" % unbound_stats)
                unbound_options = get_unbound_options(unbound_stats)
                self.log.error(
                    "Found %s unbound DNS keys: %s"
                    % (len(unbound_options), unbound_options)
                )

        metadata = {
            "num.queries": {
                "label": "Number of queries",
                "options": unbound_options,
                "status": status,
                "error_message": msg,
                "unit": "",
            },
            "num.cachehits": {
                "label": "Number of cache hits",
                "options": unbound_options,
                "status": status,
                "error_message": msg,
                "unit": "",
            },
            "num.cachemiss": {
                "label": "Cache misses",
                "options": unbound_options,
                "status": status,
                "error_message": msg,
                "unit": "",
            },
            "num.recursivereplies": {
                "label": "Recursive replies",
                "options": unbound_options,
                "status": status,
                "error_message": msg,
                "unit": "",
            },
            "requestlist.avg": {
                "label": "Average queued queries",
                "options": unbound_options,
                "status": status,
                "error_message": msg,
                "unit": "",
            },
            "requestlist.max": {
                "label": "Max queued queries",
                "options": unbound_options,
                "status": status,
                "error_message": msg,
                "unit": "",
            },
            "recursion.time.avg": {
                "label": "Average recursion time",
                "options": unbound_options,
                "status": status,
                "error_message": msg,
                "unit": "seconds",
            },
            "recursion.time.median": {
                "label": "Median recursion time",
                "options": unbound_options,
                "status": status,
                "error_message": msg,
                "unit": "seconds",
            },
            "time.up": {
                "label": "Service uptime",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "seconds",
            },
        }
        return metadata

    def check(self, textkey, data, config):
        unbound_stats, passed = get_unbound_stats()
        self.log.debug(unbound_stats)
        if data is None:
            key = textkey
        else:
            key = "%s.%s" % (str(data), str(textkey))
        self.log.debug(str(agent_util.which("unbound-control")))
        self.log.debug("Checking for Unbound key %s" % key)
        return unbound_stats.get(key, None)

Directory Contents

Dirs: 1 × Files: 55

Name Size Perms Modified Actions
- drwxr-xr-x 2025-06-19 05:08:01
Edit Download
20.07 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
13.66 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
6.34 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
22.59 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
9.46 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
2.89 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
9.56 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
32.09 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
7.33 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
16.80 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
38.95 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
2.90 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
930 B lrw-r--r-- 2025-06-18 20:44:50
Edit Download
1.00 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
5.07 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
4.68 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
13.46 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
13.21 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
13.58 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
8.39 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
3.34 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
2.54 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
1.64 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
6.04 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
26.56 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
16.61 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
20.40 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
5.58 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
12.33 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
6.44 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
1.98 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
2.30 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
15.51 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
8.88 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
5.61 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
2.60 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
1.99 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
21.37 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
17.23 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
19.85 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
11.31 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
2.42 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
1.42 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
6.59 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
3.28 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
7.09 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
19.11 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
4.62 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
3.61 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
1.09 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
4.73 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
4.91 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
13.84 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
19.20 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
0 B lrw-r--r-- 2025-06-18 20:44:50
Edit Download

If ZipArchive is unavailable, a .tar will be created (no compression).