Files
Stéphan Sainléger 51d3d42491
Some checks failed
pre-commit / pre-commit (pull_request) Failing after 1m33s
[NEW] maintenance_service_http_monitoring: create add-on
2026-02-26 15:49:48 +01:00

70 lines
2.3 KiB
Python

import logging
from datetime import datetime
from odoo import models, fields, api
try:
import requests
except ImportError:
requests = None
_logger = logging.getLogger(__name__)
HTTP_CHECK_TIMEOUT = 10 # seconds
class ServiceInstance(models.Model):
_inherit = 'service.instance'
last_http_status_code = fields.Integer(
string="Last HTTP Status Code",
readonly=True,
default=0,
)
last_http_check_date = fields.Datetime(
string="Last HTTP Check Date",
readonly=True,
)
http_status_ok = fields.Boolean(
string="HTTP Status OK",
readonly=True,
default=True,
)
def check_http_status(self):
for rec in self:
if not rec.service_url or not rec.equipment_id:
continue
equipment = rec.equipment_id
if getattr(equipment, 'maintenance_mode', False):
continue
status_ok = False
status_code = -1
now = fields.Datetime.now()
url = rec.service_url
if not url.lower().startswith("https://"):
url = "https://" + url.lstrip("http://")
try:
response = requests.get(url, timeout=HTTP_CHECK_TIMEOUT)
status_code = response.status_code
status_ok = (status_code == 200)
except requests.exceptions.RequestException as e:
_logger.warning(f"HTTP check failed for %s: %s", rec.service_url, e)
rec.write({
'last_http_status_code': status_code,
'last_http_check_date': now,
'http_status_ok': status_ok,
})
if not status_ok:
# Delegate maintenance.request creation to equipment
if hasattr(equipment, 'create_http_maintenance_request'):
equipment.create_http_maintenance_request([rec])
@api.model
def cron_check_http_services(self):
domain = [('active', '=', True), ('service_url', '!=', False), ('equipment_id', '!=', False)]
services = self.search(domain)
for service in services:
equipment = service.equipment_id
if getattr(equipment, 'maintenance_mode', False):
continue
service.check_http_status()