107 lines
3.2 KiB
Python
Executable file
107 lines
3.2 KiB
Python
Executable file
#!/usr/bin/python3
|
|
"""
|
|
Icinga/Nagios plugin to check Forgejo instance upgrade status.
|
|
|
|
Copyright (c) 2023 Benjamin Renard <brenard@zionetrix.net>
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License version 3
|
|
as published by the Free Software Foundation.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
"""
|
|
|
|
import argparse
|
|
import logging
|
|
import re
|
|
import subprocess
|
|
import sys
|
|
|
|
import requests
|
|
import xmltodict
|
|
|
|
parser = argparse.ArgumentParser()
|
|
|
|
parser.add_argument("-d", "--debug", action="store_true")
|
|
parser.add_argument("-p", "--path", type=str, help="Forgejo bin path", default="forgejo")
|
|
parser.add_argument(
|
|
"-U",
|
|
"--url",
|
|
type=str,
|
|
help="Forgejo releases RSS URL",
|
|
default="https://forgejo.org/releases/rss.xml",
|
|
)
|
|
parser.add_argument(
|
|
"--rc",
|
|
action="store_true",
|
|
dest="include_rc",
|
|
help=("Allow release candidate (default: only stable release are " "considered)"),
|
|
)
|
|
|
|
options = parser.parse_args()
|
|
|
|
logging.basicConfig(level=logging.DEBUG if options.debug else logging.WARNING)
|
|
|
|
CURRENT = None
|
|
|
|
cmd = [options.path, "--version"]
|
|
logging.debug("Command use to retreive current version of Forgejo: %s", " ".join(cmd))
|
|
OUTPUT = None
|
|
EXCEPTION = None
|
|
try:
|
|
OUTPUT = subprocess.check_output(cmd)
|
|
logging.debug("Output:\n%s", OUTPUT)
|
|
m = re.search("version ([^ ]+) built", OUTPUT.decode("utf8", errors="ignore"))
|
|
if m:
|
|
CURRENT = m.group(1)
|
|
except Exception as err: # pylint: disable=broad-except
|
|
EXCEPTION = err
|
|
logging.debug("Current version: %s", CURRENT)
|
|
|
|
if not CURRENT:
|
|
print("UNKNOWN - Fail to retreive current Forgejo")
|
|
print(f'Command: {" ".join(cmd)}')
|
|
print("Output:")
|
|
print(OUTPUT if OUTPUT else "")
|
|
print("Exception:")
|
|
print(EXCEPTION if EXCEPTION else "")
|
|
sys.exit(3)
|
|
|
|
LATEST = None
|
|
try:
|
|
logging.debug("Get releases RSS feed from %s...", options.url)
|
|
r = requests.get(options.url)
|
|
logging.debug("Data retreive:\n%s", r.text)
|
|
data = xmltodict.parse(r.text)
|
|
for item in data["rss"]["channel"]["item"]:
|
|
version = re.sub("^v", "", item["title"])
|
|
if not options.include_rc and "-rc" in version:
|
|
logging.debug("Ignore release candidate %s", version)
|
|
continue
|
|
LATEST = version
|
|
break
|
|
except Exception: # pylint: disable=broad-except
|
|
pass
|
|
logging.debug("Latest version: %s", LATEST)
|
|
|
|
if not LATEST:
|
|
print("UNKNOWN - Fail to retreive latest Forgejo release from the project " "RSS feed")
|
|
print(f"Current version: {CURRENT}")
|
|
sys.exit(3)
|
|
|
|
if LATEST == CURRENT:
|
|
print(f"OK - The latest release of Forgejo is currently used ({LATEST})")
|
|
sys.exit(0)
|
|
|
|
print(
|
|
"WARNING - The version of Forgejo currently used is not the latest " f"({CURRENT} vs {LATEST})"
|
|
)
|
|
sys.exit(1)
|