Add a Nagios check to monitor IPA ID ranges

Signed-off-by: Aurélien Bompard <aurelien@bompard.org>
This commit is contained in:
Aurélien Bompard 2025-07-09 17:26:27 +02:00
parent 4272c8aa77
commit cf00289c06
No known key found for this signature in database
GPG key ID: 31584CFEB9BF64AD
4 changed files with 100 additions and 1 deletions

View file

@ -0,0 +1,89 @@
#!/usr/bin/env python3
"""
Check for available IDs in IPA's ID ranges.
See pagure.io/fedora-infrastructure/issue/12641
Author: abompard@fedoraproject.org
"""
import sys
from configparser import ConfigParser
import ldap
def get_config():
config = ConfigParser(interpolation=None)
config.read("/etc/ipa/default.conf")
return {key: config.get("global", key) for key in ("host", "basedn")}
def get_free_ids(config):
ldap.set_option(ldap.OPT_REFERRALS, 0)
conn = ldap.ldapobject.SimpleLDAPObject(f"ldaps://{config['host']}")
conn.protocol_version = 3
conn.timeout = 10
conn.sasl_gssapi_bind_s()
results = conn.search_s(
base=f"cn=posix-ids,cn=dna,cn=ipa,cn=etc,{config['basedn']}",
scope=ldap.SCOPE_ONELEVEL,
filterstr="(dnaPortNum=389)",
attrlist=["dnaHostname", "dnaRemainingValues"],
)
free_ids = {}
for dn, attrs in results:
hostname = attrs["dnaHostname"][0].decode("ascii")
value = int(attrs["dnaRemainingValues"][0].decode("ascii"))
free_ids[hostname] = value
return free_ids
def main():
config = get_config()
free_ids = get_free_ids(config)
# Testcases:
# free_ids={"host1": 0, "host2": 0, "host3": 20}
# free_ids={"host1": 10, "host2": 0, "host3": 20}
# free_ids={"host1": 10000, "host2": 10000, "host3": 20}
perfdata = " ".join(f"{host}={free_ids[host]}" for host in sorted(free_ids))
if set(free_ids.values()) == {0}:
msg = "CRITICAL: no free ID left"
exit_code = 2
elif 0 in set(free_ids.values()):
full_servers = [host for host in sorted(free_ids) if free_ids[host] == 0]
msg = " ".join(
[
"WARNING:",
str(len(full_servers)),
"server has" if len(full_servers) == 1 else "servers have",
"no free ID left:",
", ".join(full_servers),
]
)
exit_code = 1
elif any(value < 1000 for value in free_ids.values()):
full_servers = [host for host in sorted(free_ids) if free_ids[host] < 1000]
msg = " ".join(
[
"WARNING:",
str(len(full_servers)),
"server has" if len(full_servers) == 1 else "servers have",
"almost no free ID left:",
", ".join(full_servers),
]
)
exit_code = 1
else:
msg = "OK: there are free IDs left"
exit_code = 0
return f"{msg}|{perfdata}", exit_code
if __name__ == "__main__":
output, exit_code = main()
print(output)
sys.exit(exit_code)

View file

@ -56,6 +56,7 @@
- check_lock_file_age
- check_testcloud
- check_ipa_replication
- check_ipa_free_ids.py
- check_redis_queue.sh
- check_timestamp_from_file
- check_crl_next_update

View file

@ -1 +1,2 @@
command[check_ipa_replication]={{ libdir }}/nagios/plugins/check_ipa_replication -u ldaps://localhost/
command[check_ipa_free_ids]={{ libdir }}/nagios/plugins/check_ipa_free_ids.py

View file

@ -4,5 +4,13 @@ define service {
service_description IPA Replication Status
check_command check_by_nrpe!check_ipa_replication
use lighttemplate
servicegroups ipa
servicegroups ipa
}
define service {
host_name {{ groups['ipa'][0] }}
service_description IPA Free IDs
check_command check_by_nrpe!check_ipa_free_ids
use lighttemplate
servicegroups ipa
}