Update Azure Keyvault to use the new plugin API in CheckMK 2.3+
This commit is contained in:
parent
33b5055b62
commit
7fb9a07709
BIN
azure-keyvault/2.3/azure_keyvault-0.4.0.mkp
Executable file
BIN
azure-keyvault/2.3/azure_keyvault-0.4.0.mkp
Executable file
Binary file not shown.
@ -0,0 +1,71 @@
|
||||
#,!/usr/bin/env python3
|
||||
# Copyright (C) 2025 Spearhead Systems SRL - License: GNU General Public License v2
|
||||
|
||||
import json
|
||||
from datetime import datetime, timezone
|
||||
from cmk.agent_based.v2 import Result, Service, State, CheckPlugin, AgentSection
|
||||
|
||||
|
||||
# Convert JSON entries into dictionaries indexed by certificate name.
|
||||
def parse_keyvault(string_table):
|
||||
raw_json = ""
|
||||
cert_data = []
|
||||
|
||||
for row in string_table:
|
||||
line = row[0]
|
||||
raw_json += line
|
||||
if line == "]":
|
||||
cert_data.extend(json.loads(raw_json))
|
||||
raw_json = ""
|
||||
|
||||
lookup = {}
|
||||
for cert in cert_data:
|
||||
lookup[cert["name"]] = cert
|
||||
|
||||
return lookup
|
||||
|
||||
|
||||
# Produce a list of certificates based on the parsed output.
|
||||
def discover_keyvault(section):
|
||||
for name, details in sorted(section.items()):
|
||||
yield Service(item=name)
|
||||
|
||||
|
||||
# Given a specific certificate, look it up in the parsed output, and produce
|
||||
# results on that service based upon the certificate's expiry.
|
||||
def check_keyvault(item, params, section):
|
||||
warn_days = params.get("warn_days")
|
||||
crit_days = params.get("crit_days")
|
||||
|
||||
cert = section.get(item)
|
||||
if cert is None:
|
||||
return
|
||||
|
||||
expires = datetime.fromisoformat(cert["attributes"]["expires"])
|
||||
now = datetime.now(timezone.utc)
|
||||
remaining_days = (expires - now).days
|
||||
|
||||
state = State.OK
|
||||
if crit_days is not None and remaining_days < crit_days:
|
||||
state = State.CRIT
|
||||
elif warn_days is not None and remaining_days < warn_days:
|
||||
state = State.WARN
|
||||
|
||||
yield Result(state=state, summary="Expires in %d days" % remaining_days)
|
||||
|
||||
|
||||
agent_section_azure_keyvault = AgentSection(
|
||||
name="azure_keyvault",
|
||||
parse_function=parse_keyvault,
|
||||
)
|
||||
|
||||
check_plugin_azure_keyvault = CheckPlugin(
|
||||
name="azure_keyvault",
|
||||
service_name="Azure Keyvault Certificate %s",
|
||||
|
||||
check_function=check_keyvault,
|
||||
check_default_parameters={},
|
||||
check_ruleset_name="azure_keyvault",
|
||||
|
||||
discovery_function=discover_keyvault,
|
||||
)
|
@ -0,0 +1,26 @@
|
||||
#!/bin/bash
|
||||
# Copyright (C) 2023 Spearhead Systems SRL - License: GNU General Public License v2
|
||||
|
||||
az=/usr/bin/az
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
if [ "$#" -lt 4 ]; then
|
||||
echo "Usage: $0 <tenant> <user> <password> <vault1> ... [vaultN]" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
tenant="$1"
|
||||
user="$2"
|
||||
password="$3"
|
||||
vaults="${@:4}"
|
||||
|
||||
echo "<<<azure_keyvault:sep(0)>>>"
|
||||
|
||||
"$az" login --service-principal --tenant="$tenant" --user="$user" --password="$password" > /dev/null
|
||||
|
||||
for vault in $vaults; do
|
||||
"$az" keyvault certificate list --vault-name="$vault"
|
||||
done
|
||||
|
||||
"$az" logout
|
@ -0,0 +1,95 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright (C) 2025 Spearhead Systems SRL - License: GNU General Public License v2
|
||||
|
||||
from cmk.rulesets.v1 import Label
|
||||
from cmk.rulesets.v1.form_specs import Dictionary, DictElement, String, Integer, Password, List, DefaultValue
|
||||
from cmk.rulesets.v1.rule_specs import SpecialAgent, CheckParameters, HostCondition, Topic, Title, Help
|
||||
from cmk.rulesets.v1.form_specs.validators import LengthInRange, NumberInRange
|
||||
|
||||
|
||||
def _formspec_azure_keyvault_check():
|
||||
return Dictionary(
|
||||
title = Title("Azure Key Vault Certificate Checks"),
|
||||
elements = {
|
||||
"warn_days": DictElement(
|
||||
parameter_form = Integer(
|
||||
title = Title("Certificate Days to Warn"),
|
||||
help_text = Help("How many days to warn before a certificate in this key vault will expire"),
|
||||
prefill = DefaultValue(30),
|
||||
custom_validate = (NumberInRange(min_value=0),),
|
||||
),
|
||||
),
|
||||
"crit_days": DictElement(
|
||||
parameter_form = Integer(
|
||||
title = Title("Certificate Days to Crit"),
|
||||
help_text = Help("How many days to crit before a certificate in this key vault will expire"),
|
||||
prefill = DefaultValue(3),
|
||||
custom_validate = (NumberInRange(min_value=0),),
|
||||
),
|
||||
),
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
def _formspec_azure_keyvault_discovery():
|
||||
return Dictionary(
|
||||
title = Title("Azure Key Vault Certificate Discovery"),
|
||||
elements = {
|
||||
"tenant": DictElement(
|
||||
required = True,
|
||||
parameter_form = String(
|
||||
title = Title("Tenant ID / Directory ID"),
|
||||
custom_validate = (LengthInRange(min_value=1),),
|
||||
),
|
||||
),
|
||||
"client": DictElement(
|
||||
required = True,
|
||||
parameter_form = String(
|
||||
title = Title("Client ID / Application ID"),
|
||||
custom_validate = (LengthInRange(min_value=1),),
|
||||
),
|
||||
),
|
||||
"secret": DictElement(
|
||||
required = True,
|
||||
parameter_form = Password(
|
||||
title = Title("Client Secret"),
|
||||
custom_validate = (LengthInRange(min_value=1),),
|
||||
),
|
||||
),
|
||||
"vaults": DictElement(
|
||||
required = True,
|
||||
parameter_form = List(
|
||||
title = Title("Keyvaults"),
|
||||
add_element_label = Label("Add new keyvault"),
|
||||
custom_validate = (LengthInRange(min_value=1),),
|
||||
element_template = String(label=Label("Keyvault")),
|
||||
),
|
||||
),
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
rule_spec_agent_config_azure_keyvault = SpecialAgent(
|
||||
topic = Topic.NETWORKING,
|
||||
name = "azure_keyvault",
|
||||
title = Title("Azure Keyvault"),
|
||||
parameter_form = _formspec_azure_keyvault_discovery,
|
||||
)
|
||||
|
||||
|
||||
rule_spec_agent_config_azure_keyvault_check = CheckParameters(
|
||||
topic = Topic.NETWORKING,
|
||||
name = "azure_keyvault",
|
||||
title = Title("Azure Keyvault Check"),
|
||||
parameter_form = _formspec_azure_keyvault_check,
|
||||
condition = HostCondition(),
|
||||
)
|
||||
|
||||
#check_plugin_juniper_trpz_cpu_util = CheckPlugin(
|
||||
# name="juniper_trpz_cpu_util",
|
||||
# service_name="CPU utilization",
|
||||
# discovery_function=discovery_juniper_trpz_cpu_util,
|
||||
# check_function=check_juniper_trpz_cpu_util,
|
||||
# check_ruleset_name="cpu_utilization",
|
||||
# check_default_parameters={"util": (80.0, 90.0)},
|
||||
#)
|
@ -0,0 +1,27 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright (C) 2025 Spearhead Systems SRL - License: GNU General Public License v2
|
||||
|
||||
from cmk.server_side_calls.v1 import noop_parser, SpecialAgentConfig, SpecialAgentCommand
|
||||
|
||||
|
||||
def agent_azure_keyvault(params, hostname):
|
||||
tenant = params["tenant"]
|
||||
client = params["client"]
|
||||
secret = params["secret"]
|
||||
|
||||
if type(secret) != str:
|
||||
secret = secret.unsafe()
|
||||
|
||||
args = [tenant, client, secret]
|
||||
|
||||
for vault in params["vaults"]:
|
||||
args.extend([vault.strip()])
|
||||
|
||||
yield SpecialAgentCommand(command_arguments=args)
|
||||
|
||||
|
||||
special_agent_azure_keyvault = SpecialAgentConfig(
|
||||
name = "azure_keyvault",
|
||||
parameter_parser = noop_parser,
|
||||
commands_function = agent_azure_keyvault,
|
||||
)
|
Loading…
x
Reference in New Issue
Block a user