Use Codeberg API to retreive latest release info
All checks were successful
Run tests / test-precommit (push) Successful in 1m15s

This commit is contained in:
Benjamin Renard 2024-03-24 08:26:02 +01:00
parent be72d13cc0
commit 50fa7c3bf5
4 changed files with 44 additions and 41 deletions

View file

@ -16,6 +16,6 @@ jobs:
DEBIAN_FRONTEND: noninteractive DEBIAN_FRONTEND: noninteractive
run: | run: |
apt-get update apt-get update
apt-get -y install --no-install-recommends python3-requests python3-xmltodict apt-get -y install --no-install-recommends python3-requests
- name: Run pre-commit - name: Run pre-commit
run: pre-commit run --all-files run: pre-commit run --all-files

View file

@ -5,7 +5,7 @@ This Icinga/Nagios check plugin permit to check Forgejo instance upgrade status
## Installation ## Installation
``` ```
apt install git python3-requests python3-xmltodict apt install git python3-requests
git clone https://gitea.zionetrix.net/bn8/check_forgejo_upgrade.git /usr/local/src/check_forgejo_upgrade git clone https://gitea.zionetrix.net/bn8/check_forgejo_upgrade.git /usr/local/src/check_forgejo_upgrade
mkdir -p /usr/local/lib/nagios/plugins mkdir -p /usr/local/lib/nagios/plugins
ln -s /usr/local/src/check_forgejo_upgrade/check_forgejo_upgrade /usr/local/lib/nagios/plugins/ ln -s /usr/local/src/check_forgejo_upgrade/check_forgejo_upgrade /usr/local/lib/nagios/plugins/
@ -18,20 +18,22 @@ service nagios-nrpe-server reload
## Usage ## Usage
``` ```
usage: check_forgejo_upgrade [-h] [-d] [-p PATH] [-U URL] [--rc] usage: check_forgejo_upgrade [-h] [-d] [-p PATH] [-U URL] [--pre-release] [--draft] [-t TIMEOUT]
optional arguments: options:
-h, --help show this help message and exit -h, --help show this help message and exit
-d, --debug -d, --debug
-p PATH, --path PATH Forgejo bin path -p PATH, --path PATH Forgejo bin path
-U URL, --url URL Forgejo releases RSS URL -U URL, --url URL Forgejo releases URL
--rc Allow release candidate (default: only stable release are --pre-release Allow pre-release (default: only stable release are considered)
considered) --draft Allow draft release (default: only stable release are considered)
-t TIMEOUT, --timeout TIMEOUT
Specify timeout for HTTP requests (default: 20)
``` ```
## Copyright ## Copyright
Copyright (c) 2023 Benjamin Renard <brenard@zionetrix.net> Copyright (c) 2023-2024 Benjamin Renard <brenard@zionetrix.net>
## License ## License

View file

@ -25,7 +25,6 @@ import subprocess # nosec
import sys import sys
import requests import requests
import xmltodict
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
@ -35,14 +34,18 @@ parser.add_argument(
"-U", "-U",
"--url", "--url",
type=str, type=str,
help="Forgejo releases RSS URL", help="Forgejo releases URL",
default="https://forgejo.org/releases/rss.xml", default="https://codeberg.org/api/v1/repos/forgejo/forgejo/releases",
) )
parser.add_argument( parser.add_argument(
"--rc", "--pre-release",
action="store_true", action="store_true",
dest="include_rc", help="Allow pre-release (default: only stable release are considered)",
help="Allow release candidate (default: only stable release are considered)", )
parser.add_argument(
"--draft",
action="store_true",
help="Allow draft release (default: only stable release are considered)",
) )
parser.add_argument( parser.add_argument(
"-t", "--timeout", type=int, help="Specify timeout for HTTP requests (default: 20)", default=20 "-t", "--timeout", type=int, help="Specify timeout for HTTP requests (default: 20)", default=20
@ -81,45 +84,43 @@ CURRENT = CURRENT.replace("+", "-")
logging.debug("Cleaned current version: %s", CURRENT) logging.debug("Cleaned current version: %s", CURRENT)
LATEST = None LATEST = None
LATEST_INT = None LATEST_NAME = None
try: try:
logging.debug("Get releases RSS feed from %s...", options.url) logging.debug("Get releases from %s...", options.url)
r = requests.get(options.url, timeout=options.timeout) r = requests.get(options.url, timeout=options.timeout)
logging.debug("Data retrieve:\n%s", r.text) data = r.json()
data = xmltodict.parse(r.text) logging.debug("Data retrieve:\n%s", data)
versions = {} for item in data:
for item in data["rss"]["channel"]["item"]: if not options.pre_release and item["prerelease"]:
version = re.sub("^v", "", item["title"]) logging.debug("Ignore pre-release %s", item["name"])
if not options.include_rc and "-rc" in version:
logging.debug("Ignore release candidate %s", version)
continue continue
version_int = int(re.sub(r"[\.-]", "000", version)) if not options.draft and item["draft"]:
logging.debug("Found version %s (%s)", version, version_int) logging.debug("Ignore draft release %s", item["name"])
if not LATEST_INT or LATEST_INT < version_int: continue
if LATEST: LATEST = item
logging.debug( LATEST_NAME = re.sub("^v", "", item["name"])
"Version %s considered as newer than %s, override latest version", break
version,
LATEST,
)
LATEST = version
LATEST_INT = version_int
else:
logging.debug("Version %s considered as oldest than %s", version, LATEST)
except Exception: # pylint: disable=broad-except # nosec except Exception: # pylint: disable=broad-except # nosec
pass pass
logging.debug("Latest version: %s", LATEST)
if not LATEST: if not LATEST:
print("UNKNOWN - Fail to retrieve latest Forgejo release from the project RSS feed") print("UNKNOWN - Fail to retrieve latest Forgejo release from the project RSS feed")
print(f"Current version: {CURRENT}") print(f"Current version: {CURRENT}")
sys.exit(3) sys.exit(3)
if LATEST == CURRENT: logging.debug("Latest version is %s", LATEST_NAME)
print(f"OK - The latest release of Forgejo is currently used ({LATEST})")
if LATEST_NAME == CURRENT:
print(
f"OK - The latest release of Forgejo is currently used "
f"({LATEST_NAME}, published on {LATEST['published_at']})"
)
sys.exit(0) sys.exit(0)
print( print(
"WARNING - The version of Forgejo currently used is not the latest " f"({CURRENT} vs {LATEST})" "WARNING - The version of Forgejo currently used is not the latest "
f"({CURRENT} vs {LATEST_NAME}), published on {LATEST['published_at']})"
) )
print(LATEST["body"])
print(f"URL: {LATEST['html_url']}")
sys.exit(1) sys.exit(1)

2
debian/control vendored
View file

@ -7,7 +7,7 @@ Standards-Version: 3.9.6
Package: check-forgejo-upgrade Package: check-forgejo-upgrade
Architecture: all Architecture: all
Depends: ${misc:Depends}, python3, python3-requests, python3-xmltodict Depends: ${misc:Depends}, python3, python3-requests
Description: Monitoring plugin to check Forgejo instance upgrade status Description: Monitoring plugin to check Forgejo instance upgrade status
This Icinga/Nagios check plugin permit to check Forgejo instance upgrade This Icinga/Nagios check plugin permit to check Forgejo instance upgrade
status by comparing the local forgejo binary version against the latest status by comparing the local forgejo binary version against the latest