initial commit

This commit is contained in:
irrelevant 2026-10-05 00:30:04 +01:00
commit 4b982aea08
4 changed files with 148 additions and 0 deletions

14
Dockerfile Normal file
View file

@ -0,0 +1,14 @@
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
EXPOSE 8080
CMD ["gunicorn", "--bind", "0.0.0.0:8080", "app:app"]

114
app.py Normal file
View file

@ -0,0 +1,114 @@
import os
import requests
import urllib3
from requests.auth import HTTPBasicAuth
from flask import Flask, request, Response
# Suppress warnings about self-signed certificates
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
app = Flask(__name__)
api_key = os.getenv("API_KEY")
api_secret = os.getenv("API_SECRET")
API_URL = os.getenv("API_URL")
HEALTHY_STATUS = os.getenv("HEALTHY_STATUS")
JSONROWS = os.getenv("JSONROWS")
@app.route("/check")
def check():
name = request.args.get("name")
if not name:
return Response(
"Missing name parameter\n",
status=400,
mimetype="text/plain"
)
try:
session = requests.Session()
session.auth = HTTPBasicAuth(api_key, api_secret)
session.headers.update({"Accept": "application/json"})
response = session.get(
API_URL,
timeout=10,
verify=False,
)
response.raise_for_status()
data = response.json()
gateway = next(
(
row for row in data.get(JSONROWS, [])
if row.get("name", "").lower() == name.lower()
),
None
)
if gateway is None:
return Response(
f"{name} not found\n",
status=400,
mimetype="text/plain"
)
status = gateway.get("status", "").lower()
if status == HEALTHY_STATUS:
return Response(
"OK\n",
status=200,
mimetype="text/plain"
)
return Response(
f"Status is {status}\n",
status=503,
mimetype="text/plain"
)
except requests.exceptions.RequestException as ex:
return Response(
f"API communication error: {ex}\n",
status=500,
mimetype="text/plain"
)
except ValueError:
return Response(
"Invalid JSON received from API\n",
status=500,
mimetype="text/plain"
)
except Exception as ex:
return Response(
f"Unexpected error: {ex}\n",
status=500,
mimetype="text/plain"
)
@app.route("/health")
def health():
return Response(
"healthy\n",
status=200,
mimetype="text/plain"
)
if __name__ == "__main__":
app.run(
host="0.0.0.0",
port=8080
)

16
docker-compose.yml Normal file
View file

@ -0,0 +1,16 @@
services:
host-check:
build: .
container_name: host-check
restart: unless-stopped
ports:
- "8765:8080"
environment:
API_KEY: 'key'
API_SECRET: 'secret'
# API_URL: "https://192.168.0.23/api/routes/gateway/status"
# HEALTHY_STATUS: "none"
# JSONROWS: "items"
API_URL: "https://192.168.0.23/api/routing/settings/searchGateway" # Requires System: Gateways
JSONROWS: "rows"
HEALTHY_STATUS: "online"

4
requirements.txt Normal file
View file

@ -0,0 +1,4 @@
flask
requests
gunicorn