From a37a8c33b1196608b7716f364b4c1c44c0a40d05 Mon Sep 17 00:00:00 2001 From: Marsell Kukuljevic Date: Wed, 9 Apr 2025 18:50:46 +0200 Subject: [PATCH] Add plugin that performs various checks on domain names. --- check_mk-domains/domain_checks-0.1.0.mkp | Bin 0 -> 3777 bytes .../plugins/agent_based/domains_expiry.py | 80 ++++++++++++++ .../agent_based/domains_nameservers.py | 100 +++++++++++++++++ .../agents/special/agent_domains_expiry | 8 ++ .../agents/special/agent_domains_nameservers | 8 ++ .../check_mk/checks/agent_domains_expiry | 7 ++ .../check_mk/checks/agent_domains_nameservers | 7 ++ .../web/plugins/wato/domains_expiry.py | 82 ++++++++++++++ .../web/plugins/wato/domains_nameservers.py | 103 ++++++++++++++++++ 9 files changed, 395 insertions(+) create mode 100755 check_mk-domains/domain_checks-0.1.0.mkp create mode 100644 check_mk-domains/local/lib/check_mk/base/plugins/agent_based/domains_expiry.py create mode 100644 check_mk-domains/local/lib/check_mk/base/plugins/agent_based/domains_nameservers.py create mode 100755 check_mk-domains/local/share/check_mk/agents/special/agent_domains_expiry create mode 100755 check_mk-domains/local/share/check_mk/agents/special/agent_domains_nameservers create mode 100644 check_mk-domains/local/share/check_mk/checks/agent_domains_expiry create mode 100644 check_mk-domains/local/share/check_mk/checks/agent_domains_nameservers create mode 100644 check_mk-domains/local/share/check_mk/web/plugins/wato/domains_expiry.py create mode 100644 check_mk-domains/local/share/check_mk/web/plugins/wato/domains_nameservers.py diff --git a/check_mk-domains/domain_checks-0.1.0.mkp b/check_mk-domains/domain_checks-0.1.0.mkp new file mode 100755 index 0000000000000000000000000000000000000000..d00816cec230986d5499363a2ccb0ef7930417d7 GIT binary patch literal 3777 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 iws+ELSf3po${>>" +for domain in "$@"; do + echo "$domain:" + whois "$domain" | grep 'Expir.*' | head -1 | grep -Eo '[0-9]{4}-[0-9]{2}-[0-9]{2}' +done diff --git a/check_mk-domains/local/share/check_mk/agents/special/agent_domains_nameservers b/check_mk-domains/local/share/check_mk/agents/special/agent_domains_nameservers new file mode 100755 index 0000000..df3141b --- /dev/null +++ b/check_mk-domains/local/share/check_mk/agents/special/agent_domains_nameservers @@ -0,0 +1,8 @@ +#!/bin/bash +# Copyright (C) 2025 Spearhead Systems SRL + +echo "<<>>" +for domain in "$@"; do + echo "$domain:" + dig +short NS "$domain" +done diff --git a/check_mk-domains/local/share/check_mk/checks/agent_domains_expiry b/check_mk-domains/local/share/check_mk/checks/agent_domains_expiry new file mode 100644 index 0000000..3674278 --- /dev/null +++ b/check_mk-domains/local/share/check_mk/checks/agent_domains_expiry @@ -0,0 +1,7 @@ +#!/usr/bin/env python3 +# Copyright (C) 2025 Spearhead Systems SRL + +def agent_domains_expiry_args(params, hostname, ipaddress): + return params["domains"] + +special_agent_info["domains_expiry"] = agent_domains_expiry_args diff --git a/check_mk-domains/local/share/check_mk/checks/agent_domains_nameservers b/check_mk-domains/local/share/check_mk/checks/agent_domains_nameservers new file mode 100644 index 0000000..8794c43 --- /dev/null +++ b/check_mk-domains/local/share/check_mk/checks/agent_domains_nameservers @@ -0,0 +1,7 @@ +#!/usr/bin/env python3 +# Copyright (C) 2025 Spearhead Systems SRL + +def agent_domains_nameservers_args(params, hostname, ipaddress): + return params["domains"] + +special_agent_info["domains_nameservers"] = agent_domains_nameservers_args diff --git a/check_mk-domains/local/share/check_mk/web/plugins/wato/domains_expiry.py b/check_mk-domains/local/share/check_mk/web/plugins/wato/domains_expiry.py new file mode 100644 index 0000000..da09bde --- /dev/null +++ b/check_mk-domains/local/share/check_mk/web/plugins/wato/domains_expiry.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python3 +# Copyright (C) 2025 Spearhead Systems SRL + +import copy +from cmk.base.plugins.agent_based.agent_based_api.v1 import State +from cmk.gui.i18n import _ +from cmk.gui.plugins.wato.utils import ( + rulespec_registry, + HostRulespec, + RulespecGroupCheckParametersNetworking, +) +from cmk.gui.watolib.rulespecs import Rulespec +from cmk.gui.valuespec import ( + Dictionary, + Integer, + ListOfStrings, + Tuple, +) + + +def _valuespec_special_agents_domains_expiry_query(): + return Dictionary( + title=_("Domains Expiry Query"), + required_keys=["domains"], + elements=[ + ( + "domains", + ListOfStrings( + title=_("Domain names"), + help=_("List of domain names to check"), + allow_empty=False, + ), + ), + ] + ) + +def _valuespec_special_agents_domains_expiry_checks(): + return Dictionary( + title=_("Domains Expiry"), + required_keys=["days_remaining"], + elements=[ + ( + "days_remaining", + Tuple( + title=_("Days Remaining"), + help=_("If there are fewer days until one of the above domains expires, issue an alert"), + elements=[ + Integer( + title=_("Warn if fewer days than"), + minvalue=0, + default_value=30 + ), + Integer( + title=_("Crit if fewer days than"), + minvalue=0, + default_value=7 + ) + ] + ) + ), + ], + ) + + +rulespec_registry.register( + HostRulespec( + name="special_agents:domains_expiry", + group=RulespecGroupCheckParametersNetworking, + match_type='dict', + valuespec=_valuespec_special_agents_domains_expiry_query, + ) +) +rulespec_registry.register( + CheckParameterRulespecWithItem( + check_group_name="domains_expiry", + group=RulespecGroupCheckParametersNetworking, + match_type="dict", + parameter_valuespec=_valuespec_special_agents_domains_expiry_checks, + item_spec=lambda: TextInput(title=_("Expiry")), + title=lambda: _("Domains Expiry Checks"), + ) +) diff --git a/check_mk-domains/local/share/check_mk/web/plugins/wato/domains_nameservers.py b/check_mk-domains/local/share/check_mk/web/plugins/wato/domains_nameservers.py new file mode 100644 index 0000000..6a78d9a --- /dev/null +++ b/check_mk-domains/local/share/check_mk/web/plugins/wato/domains_nameservers.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +# Copyright (C) 2025 Spearhead Systems SRL + +import copy +from cmk.base.plugins.agent_based.agent_based_api.v1 import State +from cmk.gui.i18n import _ +from cmk.gui.plugins.wato.utils import ( + rulespec_registry, + HostRulespec, + RulespecGroupCheckParametersNetworking, +) +from cmk.gui.watolib.rulespecs import Rulespec +from cmk.gui.valuespec import ( + Dictionary, + Integer, + ListOfStrings, + DropdownChoice, + Tuple, + ListOf, +) + + +def _valuespec_special_agents_domains_nameservers_query(): + return Dictionary( + title=_("Domains Nameservers Query"), + required_keys=["domains"], + elements=[ + ( + "domains", + ListOfStrings( + title=_("Domain names"), + help=_("List of domain names to check"), + allow_empty=False, + ), + ), + ] + ) + +def _valuespec_special_agents_domains_nameservers_checks(): + return Dictionary( + title=_("Domains Nameservers Checks"), + required_keys=["domain_nameservers", "alert_level"], + elements=[ + ( + "domain_nameservers", + ListOf( + valuespec=Dictionary( + required_keys=["domains", "nameservers"], + elements=[ + ( + "domains", + ListOfStrings( + title=_("Domain names"), + help=_("List of domain names the below nameservers apply to"), + allow_empty=False, + ) + ), + ( + "nameservers", + ListOfStrings( + title=_("Nameservers"), + help=_("List of nameservers that all of the above domain names should have"), + allow_empty=False, + ) + ), + ] + ) + ) + ), + ( + "alert_level", + DropdownChoice( + title=_("Alert level used on mismatch"), + help=_("Alert level used when there is a mismatch in domain name servers for a domain"), + default_value=State.WARN.value, + choices=[ + (State.CRIT.value, _(State.CRIT.name)), + (State.WARN.value, _(State.WARN.name)), + (State.OK.value, _(State.OK.name)), + ], + ), + ), + ], + ) + +rulespec_registry.register( + HostRulespec( + name="special_agents:domains_nameservers", + group=RulespecGroupCheckParametersNetworking, + match_type='dict', + valuespec=_valuespec_special_agents_domains_nameservers_query, + ) +) +rulespec_registry.register( + CheckParameterRulespecWithItem( + check_group_name="domains_nameservers", + group=RulespecGroupCheckParametersNetworking, + match_type="dict", + parameter_valuespec=_valuespec_special_agents_domains_nameservers_checks, + item_spec=lambda: TextInput(title=_("Nameserver")), + title=lambda: _("Domains Nameservers Checks"), + ) +)