mirror of
https://github.com/hrfee/jellyfin-accounts.git
synced 2024-12-22 09:00:14 +00:00
Harvey Tindall
d5ce6d31c5
I'm guessing watchdog's behaviour changed in an update, as the error thrown when the watched directory doesn't exist is now "FileNotFoundError" instead of "NotADirectoryError". It'll handle either one now.
70 lines
2.4 KiB
Python
Executable File
70 lines
2.4 KiB
Python
Executable File
# Watches Jellyfin for password resets and sends emails.
|
|
import time
|
|
import json
|
|
from watchdog.observers import Observer
|
|
from watchdog.events import FileSystemEventHandler
|
|
from jellyfin_accounts.email import Mailgun, Smtp
|
|
from jellyfin_accounts.web_api import jf
|
|
from jellyfin_accounts import config, data_store
|
|
from jellyfin_accounts import email_log as log
|
|
|
|
|
|
class Watcher:
|
|
def __init__(self, dir):
|
|
self.observer = Observer()
|
|
self.dir = str(dir)
|
|
|
|
def run(self):
|
|
event_handler = Handler()
|
|
self.observer.schedule(event_handler, self.dir, recursive=True)
|
|
try:
|
|
self.observer.start()
|
|
except (NotADirectoryError,
|
|
FileNotFoundError):
|
|
log.error(f"Directory {self.dir} does not exist")
|
|
try:
|
|
while True:
|
|
time.sleep(5)
|
|
except:
|
|
self.observer.stop()
|
|
log.info("Watchdog stopped")
|
|
|
|
|
|
class Handler(FileSystemEventHandler):
|
|
@staticmethod
|
|
def on_any_event(event):
|
|
if event.is_directory:
|
|
return None
|
|
elif event.event_type == "modified" and "passwordreset" in event.src_path:
|
|
log.debug(f"Password reset file: {event.src_path}")
|
|
time.sleep(1)
|
|
with open(event.src_path, "r") as f:
|
|
reset = json.load(f)
|
|
log.info(f'New password reset for {reset["UserName"]}')
|
|
try:
|
|
id = jf.getUsers(reset["UserName"], public=False)["Id"]
|
|
address = data_store.emails[id]
|
|
if address != "":
|
|
method = config["email"]["method"]
|
|
if method == "mailgun":
|
|
email = Mailgun(address)
|
|
elif method == "smtp":
|
|
email = Smtp(address)
|
|
if email.construct_reset(reset):
|
|
email.send()
|
|
else:
|
|
raise IndexError
|
|
except (
|
|
FileNotFoundError,
|
|
json.decoder.JSONDecodeError,
|
|
IndexError,
|
|
) as e:
|
|
err = f"{address}: Failed: " + type(e).__name__
|
|
log.error(err)
|
|
|
|
|
|
def start():
|
|
log.info(f'Monitoring {config["password_resets"]["watch_directory"]}')
|
|
w = Watcher(config["password_resets"]["watch_directory"])
|
|
w.run()
|