From c360be0d8e49bcf56734563e6a8d7f40b13329ae Mon Sep 17 00:00:00 2001 From: Dryusdan Date: Wed, 9 Dec 2020 19:32:27 +0100 Subject: [PATCH] Add db to send notification one time --- .gitignore | 1 + config/kimsufi.sample.yaml | 40 ++++++++++++++---- config/refToName.yml | 12 ++++++ src/core.py | 47 ++++++++++++++++++--- src/db.py | 84 ++++++++++++++++++++++++++++++++++++++ src/notifications.py | 53 ++++++++++++++++-------- 6 files changed, 206 insertions(+), 31 deletions(-) create mode 100644 config/refToName.yml create mode 100644 src/db.py diff --git a/.gitignore b/.gitignore index 6d7a83d..efc2cde 100644 --- a/.gitignore +++ b/.gitignore @@ -131,3 +131,4 @@ dmypy.json # Ignore config conf/kimsufi.yaml +db.sqlite diff --git a/config/kimsufi.sample.yaml b/config/kimsufi.sample.yaml index 61918a6..a4ba636 100644 --- a/config/kimsufi.sample.yaml +++ b/config/kimsufi.sample.yaml @@ -1,9 +1,31 @@ -config: - - main: - - api_url: https://www.ovh.com/engine/api/dedicated/server/availabilities?country=FR - - id_server: - - 160sk2 - - 160sk3 - - notifications: - - email: - - host: domain.tld +main: + api_url: https://www.ovh.com/engine/api/dedicated/server/availabilities?country=FR + id_server: + - 1801sk14 + - 1801sk15 + datacenter: + - fra + - gra + - sbg + - rbx +log: + level: INFO + path: log/tracker.log +notifications: + email: + user: me%40domain.tld + password: pwd + host: mdomain.tld + port: 587 + from: me@domain.tld + secure: True + to: me@domain.tld + mode: starttls + xmpp: + user: notifier + password: pwd + host: xmpp.domain.tld + port: 5223 + to: me@xmpp.domain.tld + secure: True +db: db.sqlite diff --git a/config/refToName.yml b/config/refToName.yml new file mode 100644 index 0000000..702253f --- /dev/null +++ b/config/refToName.yml @@ -0,0 +1,12 @@ +1801sk12: KS-1 +1801sk13: KS-2 +1801sk14: KS-3 +1801sk15: KS-4 +1801sk16: KS-5 +1801sk17: KS-6 +1801sk18: KS-7 +1801sk19: KS-8 +1801sk20: KS-9 +1801sk21: KS-10 +1801sk22: KS-11 +1801sk23: KS-12 diff --git a/src/core.py b/src/core.py index d532249..c013ac7 100644 --- a/src/core.py +++ b/src/core.py @@ -2,8 +2,9 @@ # coding: utf-8 # -*- coding: utf-8 -*- +import os import requests -import pprint +from src.db import DB from src.logs import Logger from src.notifications import Notifications from src.settings import Settings @@ -15,6 +16,12 @@ class OVHTracker: self.logger = Logger( self.settings["log"]["level"], self.settings["log"]["path"] ) + if os.path.isfile(self.settings["db"]): + self.logger.info("DB already created") + else: + self.logger.warning("DB not created") + DB(self.settings["db"], self.settings).create() + self.db = DB(self.settings["db"], self.settings) self.logger.info("App loaded") self.main() @@ -40,13 +47,43 @@ class OVHTracker: for wantedDatacenter in self.settings["main"]["datacenter"]: if wantedDatacenter in dc["datacenter"]: if dc["availability"] not in ("unavailable", "unknown"): + if ( + self.db.isServerExist( + wantedServer, wantedDatacenter + ) + is False + ): + self.db.insertServer( + wantedServer, wantedDatacenter + ) + self.db.updateAvailable( + wantedServer, wantedDatacenter, 1 + ) + self.logger.info( "{} is available in {}".format( wantedServer, wantedDatacenter ) ) - self.notify(wantedServer) + if self.db.isNotified( + wantedServer, wantedDatacenter + ): + self.logger.info("Already notified") + else: + self.notify(wantedServer, wantedDatacenter) + self.db.updateNotified( + wantedServer, wantedDatacenter, 1 + ) + else: + if self.db.isServerExist( + wantedServer, wantedDatacenter + ): + self.db.updateAvailable( + wantedServer, wantedDatacenter, 0 + ) + self.db.updateNotified( + wantedServer, wantedDatacenter, 0 + ) - def notify(self, server): - self.notification = Notifications(self.settings) - return True + def notify(self, server, datacenter): + Notifications(self.settings).run(server, datacenter) diff --git a/src/db.py b/src/db.py new file mode 100644 index 0000000..ee56dd7 --- /dev/null +++ b/src/db.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python3 +# coding: utf-8 +# -*- coding: utf-8 -*- + +import sqlite3 + +from sqlite3 import Error +from src.logs import Logger + + +class DB: + def __init__(self, db, config): + self.logger = Logger(config["log"]["level"], config["log"]["path"]) + try: + self.connection = sqlite3.connect(db) + except Error as e: + self.logger.error("Can't connect to {}. Error : {}".format(db, e)) + + def create(self): + cursor = self.connection.cursor() + cursor.execute( + """CREATE TABLE IF NOT EXISTS server ( + name VARCHAR(10) NOT NULL, + datacenter VARCHAR(10) NOT NULL, + available int(1) NOT NULL, + notified int(1) NOT NULL + );""" + ) + self.connection.commit() + + def insertServer(self, server, datacenter): + data = (server, datacenter) + cursor = self.connection.cursor() + cursor.execute( + """INSERT INTO server (name, datacenter, available, notified) + VALUES (?,?,0,0)""", + data, + ) + self.connection.commit() + + def updateAvailable(self, server, datacenter, status): + data = (status, server, datacenter) + cursor = self.connection.cursor() + cursor.execute( + """UPDATE server + SET available = ? + WHERE name = ? AND datacenter = ?""", + data, + ) + self.connection.commit() + + def updateNotified(self, server, datacenter, notified): + data = (notified, server, datacenter) + cursor = self.connection.cursor() + cursor.execute( + """UPDATE server + SET notified = ? + WHERE name = ? AND datacenter = ?""", + data, + ) + self.connection.commit() + + def isServerExist(self, server, datacenter): + data = (server, datacenter) + cursor = self.connection.cursor() + cursor.execute( + "SELECT name FROM server WHERE name = ? AND datacenter = ?", data + ) + if len(cursor.fetchall()) == 0: + return False + else: + return True + + def isNotified(self, server, datacenter): + data = (server, datacenter) + cursor = self.connection.cursor() + cursor.execute( + "SELECT name FROM server WHERE name = ? AND datacenter = ? AND notified = 1", + data, + ) + if len(cursor.fetchall()) == 0: + return False + else: + return True diff --git a/src/notifications.py b/src/notifications.py index d146803..c9414fd 100644 --- a/src/notifications.py +++ b/src/notifications.py @@ -3,62 +3,81 @@ # -*- coding: utf-8 -*- import apprise -import pprint from src.logs import Logger +from src.settings import Settings class Notifications: def __init__(self, config): - self.logger = Logger( - config["log"]["level"], config["log"]["path"] - ) + self.logger = Logger(config["log"]["level"], config["log"]["path"]) self.config = config["notifications"] self.apprise = apprise.Apprise() self.allowedNotifyChannel = ["email", "discord", "matrix", "xmpp"] self._notifyChannel = { - "email": self._addEmail(), - "discord": self._addDiscord(), - "xmpp": self._addXmpp(), - "matrix": self._addMatrix(), + "email": self._addEmail, + "discord": self._addDiscord, + "xmpp": self._addXmpp, + "matrix": self._addMatrix, } self.setNotificationsChannel() def setNotificationsChannel(self): - pprint.pprint(self) for key, val in self.config.items(): if key not in self.allowedNotifyChannel: self.logger.error( "{} is not possible".format(self.allowedNotifyChannel) ) else: - pprint.pprint(key) - pprint.pprint(self._notifyChannel) self._notifyChannel[key]() return True + def run(self, server, datacenter): + refOfServer = Settings().get("config/refToName.yml") + self.apprise.notify( + body="{} is available {}".format(refOfServer[server], datacenter), + title="{} is available \o/".format(refOfServer[server], datacenter), + notify_type=apprise.NotifyType.INFO, + ) + def _addEmail(self): - self.logger.info("debug") if self.config["email"]["secure"] is True: mailto = "mailtos" + mode = self.config["email"]["mode"] else: mailto = "mailto" + mode = "" self.apprise.add( - "{}://{}:{}@{}:{}?from={}&name=OVHTracker".format( + "{}://{}:{}@{}:{}?from={}&name=OVHTracker&to={}?mode={}".format( mailto, self.config["email"]["user"], self.config["email"]["password"], self.config["email"]["host"], self.config["email"]["port"], - self.config["email"]["from"] + self.config["email"]["from"], + self.config["email"]["to"], + mode, + ) + ) + + def _addXmpp(self): + if self.config["xmpp"]["secure"] is True: + xmpp = "xmpps" + else: + xmpp = "xmpp" + self.apprise.add( + "{}://{}:{}@{}:{}?to={}".format( + xmpp, + self.config["xmpp"]["user"], + self.config["xmpp"]["password"], + self.config["xmpp"]["host"], + self.config["xmpp"]["port"], + self.config["xmpp"]["to"], ) ) def _addDiscord(self): return True - def _addXmpp(self): - return True - def _addMatrix(self): return True