Bugfixes and Dockerfile

This commit is contained in:
Mike 2023-01-02 21:43:20 +01:00
parent aefde5013a
commit 311a454ab0
4 changed files with 45 additions and 4 deletions

14
Dockerfile Normal file
View File

@ -0,0 +1,14 @@
FROM python3
ENV TZ=Europe/Luxembourg
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN mkdir /app
COPY requirements.txt /app
COPY main.py /app
WORKDIR /app
RUN pip install -r requirements.txt
CMD ['python', "main.py"]

4
README.md Normal file
View File

@ -0,0 +1,4 @@
# Perma Alert
System to forward Alarmdepesche from CGDIS

28
main.py
View File

@ -28,6 +28,9 @@ class PrometheusExporter():
metrics = [] metrics = []
def __init__(self):
self.metrics = []
def append_gauge_metric(self, metric_name, metric, help_text=""): def append_gauge_metric(self, metric_name, metric, help_text=""):
if help_text != "": if help_text != "":
self.metrics.append(f"#HELP {metric_name} {help_text}") self.metrics.append(f"#HELP {metric_name} {help_text}")
@ -35,7 +38,7 @@ class PrometheusExporter():
self.metrics.append(f"{metric_name} {metric}") self.metrics.append(f"{metric_name} {metric}")
def write(self): def write(self):
with open("permalaert.prom", "w") as file: with open("data/permalaert.prom", "w") as file:
for metric in self.metrics: for metric in self.metrics:
file.write(f"{metric}\n") file.write(f"{metric}\n")
self.metrics = [] self.metrics = []
@ -43,6 +46,8 @@ class PrometheusExporter():
class FetchEmail(): class FetchEmail():
metric_success = 0
connection = None connection = None
is_close: bool = False is_close: bool = False
error = None error = None
@ -52,8 +57,10 @@ class FetchEmail():
try: try:
self.connection = imaplib.IMAP4_SSL(mail_server) self.connection = imaplib.IMAP4_SSL(mail_server)
self.connection.login(username, password) self.connection.login(username, password)
self.metric_success = 1
except Exception as err: except Exception as err:
logger.error(f"Couldn't connect to imap server. Got: {err}") logger.error(f"Couldn't connect to imap server. Got: {err}")
self.metric_success = 0
def __del__(self): def __del__(self):
pass pass
@ -145,6 +152,8 @@ class Alarmdepesche():
raw: BeautifulSoup raw: BeautifulSoup
metric_api_up = 0
def get_string(self, td, clean=True): def get_string(self, td, clean=True):
string = td.parent.find_all('td')[-1].string string = td.parent.find_all('td')[-1].string
if clean: if clean:
@ -153,6 +162,7 @@ class Alarmdepesche():
return string return string
def get_members_emails(self): def get_members_emails(self):
self.metric_api_up = 0
logger.info("Getting duty from API") logger.info("Getting duty from API")
members = [] members = []
url = os.environ.get("DUTY_API_URL") + f"?vehicle={self.engine}" url = os.environ.get("DUTY_API_URL") + f"?vehicle={self.engine}"
@ -167,6 +177,7 @@ class Alarmdepesche():
logger.debug(f"Got JSON result: {json_res}") logger.debug(f"Got JSON result: {json_res}")
for member in json_res["vehicles"][0]["contacts"]: for member in json_res["vehicles"][0]["contacts"]:
members.append(member["mail"].lower()) members.append(member["mail"].lower())
self.metric_api_up = 1
except requests.exceptions.JSONDecodeError as e: except requests.exceptions.JSONDecodeError as e:
logger.error(f"Cannot get data from perma api. Got {e}") logger.error(f"Cannot get data from perma api. Got {e}")
@ -250,12 +261,12 @@ class Alarmdepesche():
self.geo_point = json_data["intervention_coordinates"] self.geo_point = json_data["intervention_coordinates"]
def loadFromDisk(self, file_path="last_alarmdepesche.json"): def loadFromDisk(self, file_path="data/last_alarmdepesche.json"):
logger.debug(f"Loading last Alarmdepesche from disk") logger.debug(f"Loading last Alarmdepesche from disk")
with open(file_path, "r") as file: with open(file_path, "r") as file:
self.fromDict(json.load(file)) self.fromDict(json.load(file))
def saveToDisk(self, file_path="last_alarmdepesche.json"): def saveToDisk(self, file_path="data/last_alarmdepesche.json"):
logger.debug(f"Writing {self} to disk") logger.debug(f"Writing {self} to disk")
with open(file_path, "w") as file: with open(file_path, "w") as file:
json.dump(self.toDict(), file, indent=3) json.dump(self.toDict(), file, indent=3)
@ -324,6 +335,8 @@ class Email():
if __name__ == '__main__': if __name__ == '__main__':
os.makedirs('data/', exist_ok=True)
mail_server = os.environ.get('MAIL_SERVER', None) mail_server = os.environ.get('MAIL_SERVER', None)
mail_user = os.environ.get('MAIL_USER', None) mail_user = os.environ.get('MAIL_USER', None)
mail_from = os.environ.get('MAIL_FROM', mail_user) mail_from = os.environ.get('MAIL_FROM', mail_user)
@ -333,13 +346,15 @@ if __name__ == '__main__':
logger.error("Environment variables not set!, exiting...") logger.error("Environment variables not set!, exiting...")
exit(1) exit(1)
metric_api_up = 1
try: try:
while True: while True:
timer_global = Timer() timer_global = Timer()
prometheus = PrometheusExporter() prometheus = PrometheusExporter()
now = datetime.datetime.now() now = datetime.datetime.now()
if os.path.exists("last_alarmdepesche.json"): if os.path.exists("data/last_alarmdepesche.json"):
last_alarmdepsche = Alarmdepesche() last_alarmdepsche = Alarmdepesche()
last_alarmdepsche.loadFromDisk() last_alarmdepsche.loadFromDisk()
last_alarmdepsche_in_seconds = (now - last_alarmdepsche.timestamp).total_seconds() last_alarmdepsche_in_seconds = (now - last_alarmdepsche.timestamp).total_seconds()
@ -353,6 +368,7 @@ if __name__ == '__main__':
current_alarmdepsche = Alarmdepesche() current_alarmdepsche = Alarmdepesche()
current_alarmdepsche.from_html(html_message) current_alarmdepsche.from_html(html_message)
current_alarmdepsche.saveToDisk() current_alarmdepsche.saveToDisk()
metric_api_up = current_alarmdepsche.metric_api_up
members = current_alarmdepsche.get_members_emails() members = current_alarmdepsche.get_members_emails()
sendmail = Email(mail_server, 587, mail_user, mail_pass) sendmail = Email(mail_server, 587, mail_user, mail_pass)
for email_addr in members: for email_addr in members:
@ -363,6 +379,10 @@ if __name__ == '__main__':
timer_global.end() timer_global.end()
prometheus.append_gauge_metric("permaalert_execution_time", timer_global.took, prometheus.append_gauge_metric("permaalert_execution_time", timer_global.took,
help_text="Program execution time in seconds") help_text="Program execution time in seconds")
prometheus.append_gauge_metric("permaalert_duty_api_up", metric_api_up,
help_text="Boolean if api is up")
prometheus.append_gauge_metric("permaalert_mailserver_up", fetchmail.metric_success,
help_text="Boolean if mail server is up")
prometheus.write() prometheus.write()
del prometheus del prometheus

3
requirements.txt Normal file
View File

@ -0,0 +1,3 @@
beautifulsoup4==4.11.1
requests==2.28.1
utm==0.7.0