Add db to send notification one time

This commit is contained in:
Dryusdan 2020-12-09 19:32:27 +01:00
parent 70225de846
commit c360be0d8e
6 changed files with 206 additions and 31 deletions

1
.gitignore vendored
View File

@ -131,3 +131,4 @@ dmypy.json
# Ignore config # Ignore config
conf/kimsufi.yaml conf/kimsufi.yaml
db.sqlite

View File

@ -1,9 +1,31 @@
config: main:
- main: api_url: https://www.ovh.com/engine/api/dedicated/server/availabilities?country=FR
- api_url: https://www.ovh.com/engine/api/dedicated/server/availabilities?country=FR id_server:
- id_server: - 1801sk14
- 160sk2 - 1801sk15
- 160sk3 datacenter:
- notifications: - fra
- email: - gra
- host: domain.tld - 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

12
config/refToName.yml Normal file
View File

@ -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

View File

@ -2,8 +2,9 @@
# coding: utf-8 # coding: utf-8
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import os
import requests import requests
import pprint from src.db import DB
from src.logs import Logger from src.logs import Logger
from src.notifications import Notifications from src.notifications import Notifications
from src.settings import Settings from src.settings import Settings
@ -15,6 +16,12 @@ class OVHTracker:
self.logger = Logger( self.logger = Logger(
self.settings["log"]["level"], self.settings["log"]["path"] 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.logger.info("App loaded")
self.main() self.main()
@ -40,13 +47,43 @@ class OVHTracker:
for wantedDatacenter in self.settings["main"]["datacenter"]: for wantedDatacenter in self.settings["main"]["datacenter"]:
if wantedDatacenter in dc["datacenter"]: if wantedDatacenter in dc["datacenter"]:
if dc["availability"] not in ("unavailable", "unknown"): 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( self.logger.info(
"{} is available in {}".format( "{} is available in {}".format(
wantedServer, wantedDatacenter 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): def notify(self, server, datacenter):
self.notification = Notifications(self.settings) Notifications(self.settings).run(server, datacenter)
return True

84
src/db.py Normal file
View File

@ -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

View File

@ -3,62 +3,81 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import apprise import apprise
import pprint
from src.logs import Logger from src.logs import Logger
from src.settings import Settings
class Notifications: class Notifications:
def __init__(self, config): def __init__(self, config):
self.logger = Logger( self.logger = Logger(config["log"]["level"], config["log"]["path"])
config["log"]["level"], config["log"]["path"]
)
self.config = config["notifications"] self.config = config["notifications"]
self.apprise = apprise.Apprise() self.apprise = apprise.Apprise()
self.allowedNotifyChannel = ["email", "discord", "matrix", "xmpp"] self.allowedNotifyChannel = ["email", "discord", "matrix", "xmpp"]
self._notifyChannel = { self._notifyChannel = {
"email": self._addEmail(), "email": self._addEmail,
"discord": self._addDiscord(), "discord": self._addDiscord,
"xmpp": self._addXmpp(), "xmpp": self._addXmpp,
"matrix": self._addMatrix(), "matrix": self._addMatrix,
} }
self.setNotificationsChannel() self.setNotificationsChannel()
def setNotificationsChannel(self): def setNotificationsChannel(self):
pprint.pprint(self)
for key, val in self.config.items(): for key, val in self.config.items():
if key not in self.allowedNotifyChannel: if key not in self.allowedNotifyChannel:
self.logger.error( self.logger.error(
"{} is not possible".format(self.allowedNotifyChannel) "{} is not possible".format(self.allowedNotifyChannel)
) )
else: else:
pprint.pprint(key)
pprint.pprint(self._notifyChannel)
self._notifyChannel[key]() self._notifyChannel[key]()
return True 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): def _addEmail(self):
self.logger.info("debug")
if self.config["email"]["secure"] is True: if self.config["email"]["secure"] is True:
mailto = "mailtos" mailto = "mailtos"
mode = self.config["email"]["mode"]
else: else:
mailto = "mailto" mailto = "mailto"
mode = ""
self.apprise.add( self.apprise.add(
"{}://{}:{}@{}:{}?from={}&name=OVHTracker".format( "{}://{}:{}@{}:{}?from={}&name=OVHTracker&to={}?mode={}".format(
mailto, mailto,
self.config["email"]["user"], self.config["email"]["user"],
self.config["email"]["password"], self.config["email"]["password"],
self.config["email"]["host"], self.config["email"]["host"],
self.config["email"]["port"], 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): def _addDiscord(self):
return True return True
def _addXmpp(self):
return True
def _addMatrix(self): def _addMatrix(self):
return True return True