cordarr/code/validate_config.py

236 lines
8.2 KiB
Python

import configparser
import sqlite3
import requests
from global_variables import LOG, YES_VALUES, NO_VALUES
"""
Validate all of the options passed into the config.ini file
"""
def validate_config(file_contents):
config = configparser.ConfigParser()
config.read_string(file_contents)
errors = 0
try:
# Validate BOT_TOKEN
if not config["REQUIRED"]["BOT_TOKEN"]:
LOG.error("BOT_TOKEN has not been set.")
errors += 1
# Validate RADARR_HOST_URL
if not config["REQUIRED"]["RADARR_HOST_URL"]:
LOG.error("RADARR_HOST_URL has not been set.")
errors += 1
# Validate RADARR_API_KEY
if not config["REQUIRED"]["RADARR_API_KEY"]:
LOG.error("RADARR_API_KEY has not been set.")
errors += 1
radarr_headers = {
"Content-Type": "application/json",
"X-Api-Key": config["REQUIRED"]["RADARR_API_KEY"],
}
# Make sure connection to Radarr API can be established
try:
requests.get(
config["REQUIRED"]["RADARR_HOST_URL"], headers=radarr_headers
)
except requests.exceptions.ConnectionError:
LOG.error(
"Could not connect to Radarr API. Please check your"
" RADARR_HOST_URL and RADARR_API_KEY"
)
errors += 1
# Validate ROOT_FOLDER_PATH
if not config["REQUIRED"]["ROOT_FOLDER_PATH"]:
LOG.error("ROOT_FOLDER_PATH has not been set.")
errors += 1
# Validate QUALITY_PROFILE_ID
data = requests.get(
f'{config["REQUIRED"]["RADARR_HOST_URL"]}/api/v3/qualityprofile',
headers=radarr_headers,
).json()
all_ids = []
for entry in data:
all_ids.append(str(entry["id"]))
if (
not config["REQUIRED"]["QUALITY_PROFILE_ID"]
or config["REQUIRED"]["QUALITY_PROFILE_ID"] not in all_ids
):
available_ids = {}
for entry in data:
available_ids[str(entry["id"])] = entry["name"]
LOG.info("Available QUALITY_PROFILE_IDs:")
for key, value in available_ids.items():
LOG.info(f"ID: {key} - Name: {value}")
LOG.error(
"Empty or invalid QUALITY_PROFILE_ID passed. Pass one of the"
" valid IDs which are now logged above."
)
errors += 1
# Validate ENABLE_JELLYFIN_TEMP_ACCOUNTS
if not config["REQUIRED"]["ENABLE_JELLYFIN_TEMP_ACCOUNTS"]:
LOG.error("ENABLE_JELLYFIN_TEMP_ACCOUNTS has not been set.")
errors += 1
else:
# Validate the value of ENABLE_JELLYFIN_TEMP_ACCOUNTS
if (
config["REQUIRED"]["ENABLE_JELLYFIN_TEMP_ACCOUNTS"].lower()
not in YES_VALUES + NO_VALUES
):
LOG.error(
"Invalid value passed to ENABLE_JELLYFIN_TEMP_ACCOUNTS."
" Pass a true/false value."
)
errors += 1
if (
config["REQUIRED"]["ENABLE_JELLYFIN_TEMP_ACCOUNTS"].lower()
in YES_VALUES
):
# Validate JELLYFIN_URL
if not config["JELLYFIN_ACCOUNTS"]["JELLYFIN_URL"]:
LOG.error(
"Empty URL passed to JELLYFIN_URL. Pass a valid URL"
" (e.g. http://localhost:8096)"
)
errors += 1
# Validate JELLYFIN_API_KEY
if not config["JELLYFIN_ACCOUNTS"]["JELLYFIN_API_KEY"]:
LOG.error(
"Empty JELLYFIN_API_KEY passed. Create a Jellyfin API"
" key in your Jellyfin dashboard and pass it here."
)
errors += 1
# Validate ACCOUNT_TIME
if not config["JELLYFIN_ACCOUNTS"]["ACCOUNT_TIME"]:
LOG.error(
"Empty ACCOUNT_TIME passed. Pass a valid time in the"
" format of HH:MM:SS (e.g. 00:30:00)"
)
errors += 1
try:
time = int(config["JELLYFIN_ACCOUNTS"]["ACCOUNT_TIME"])
except ValueError:
LOG.error(
"Invalid value passed to ACCOUNT_TIME. Pass a valid"
" integer value (e.g. 24)"
)
errors += 1
# Validate SIMPLE_PASSWORDS
if not config["JELLYFIN_ACCOUNTS"]["SIMPLE_PASSWORDS"]:
LOG.error(
"Empty SIMPLE_PASSWORDS passed. Pass a true/false"
" value."
)
errors += 1
else:
if (
config["JELLYFIN_ACCOUNTS"]["SIMPLE_PASSWORDS"].lower()
not in YES_VALUES + NO_VALUES
):
LOG.error(
"Invalid value passed to SIMPLE_PASSWORDS. Pass a"
" true/false value."
)
errors += 1
# Make sure connection to Jellyfin API can be established
jellyfin_headers = {
"Content-Type": "application/json",
"Authorization": (
'MediaBrowser Client="other", device="CordArr",'
' DeviceId="cordarr-device-id", Version="0.0.0",'
f' Token="{config["JELLYFIN_ACCOUNTS"]["JELLYFIN_API_KEY"]}"'
),
}
response = requests.get(
f"{config['JELLYFIN_ACCOUNTS']['JELLYFIN_URL']}/Users",
headers=jellyfin_headers,
)
if response.status_code != 200:
LOG.error(
"Could not connect to Jellyfin API. Please check your"
" JELLYFIN_URL and JELLYFIN_API_KEY"
)
errors += 1
if errors > 0:
LOG.info(
f"Found {errors} error(s) in the configuration file. Please"
" fix them before restarting the application."
)
exit()
except KeyError:
LOG.critical(
"You are missing at least one of the configuration options in your"
" config.ini file. In order to regenerate all options, delete the"
" config.ini file and restart the application."
)
exit()
"""
This method is called before starting the application - to make and validate the configuration
"""
def create_config():
# While here, we can begin by making the database
db = sqlite3.connect("cordarr.db")
cursor = db.cursor()
cursor.execute(
"CREATE TABLE IF NOT EXISTS movies (user_id, movie_id, movie_title)"
)
cursor.execute(
"CREATE TABLE IF NOT EXISTS jellyfin_accounts (user_id,"
" jellyfin_user_id, deletion_time, PRIMARY KEY (user_id))"
)
db.commit()
db.close()
# Attempt to open and validate the configuration file
try:
with open("config.ini", "r") as config:
file_contents = config.read()
validate_config(file_contents)
except FileNotFoundError:
try:
with open("/data/config.ini", "r") as config:
file_contents = config.read()
validate_config(file_contents)
except FileNotFoundError:
# Create the config.ini file
config = configparser.ConfigParser()
config["REQUIRED"] = {
"BOT_TOKEN": "",
"RADARR_HOST_URL": "http://",
"RADARR_API_KEY": "",
"ROOT_FOLDER_PATH": "",
"QUALITY_PROFILE_ID": "",
"ENABLE_JELLYFIN_TEMP_ACCOUNTS": "",
}
config["JELLYFIN_ACCOUNTS"] = {
"JELLYFIN_URL": "",
"JELLYFIN_API_KEY": "",
"ACCOUNT_TIME": "",
"SIMPLE_PASSWORDS": "",
}