aboutsummaryrefslogtreecommitdiff
path: root/config.py
blob: 9c56add54acbab32dabf4f2ccc6e7f5b0235ad57 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import jsonschema
import os
import yaml
import validators
import sys
import logging
from colorlog import ColoredFormatter

log_level = logging.DEBUG
log_format = (
    "  %(log_color)s%(levelname)-8s%(reset)s |"
    " %(log_color)s%(message)s%(reset)s"
)

logging.root.setLevel(log_level)
formatter = ColoredFormatter(log_format)

stream = logging.StreamHandler()
stream.setLevel(log_level)
stream.setFormatter(formatter)

LOG = logging.getLogger("pythonConfig")
LOG.setLevel(log_level)
LOG.addHandler(stream)

BASE_URL = None
IP_TO_LOCATION = None
API_KEY = None

schema = {
    "type": "object",
    "properties": {
        "config": {
            "type": "object",
            "properties": {
                "base_url": {"type": "string"},
                "ip_to_location": {"type": "boolean"},
                "api_key": {"type": "string"},
            },
            "required": ["base_url", "ip_to_location"],
        }
    },
    "required": ["config"],
}


# Load config file or create new template
def load_config():
    if os.path.exists("/.dockerenv"):
        file_path = "/data/config.yaml"
    else:
        file_path = "config.yaml"

    try:
        with open(file_path, "r") as f:
            file_contents = f.read()
            validate_config(file_contents)

    except FileNotFoundError:
        # Create new config.yaml w/ template
        with open(file_path, "w") as f:
            f.write(
                """
            base_url: ""
            ip_to_location: ""
            api_key: ""
            """
            )
        LOG.critical(
            "`config.yaml` was not found, a template has been created."
            " Please fill out the necessary information and restart."
        )
        sys.exit()


# Validate the options within config.yaml
def validate_config(file_contents):
    global BASE_URL, IP_TO_LOCATION, API_KEY
    config = yaml.safe_load(file_contents)

    try:
        jsonschema.validate(config, schema)
    except jsonschema.ValidationError as e:
        LOG.error(e.message)
        sys.exit()

    # Validate BASE_URL
    if not validators.url(config["config"]["base_url"]):
        LOG.error("BASE_URL is not a valid URL")
    else:
        BASE_URL = config["config"]["base_url"]

    # Make IP_TO_LOCATION a boolean
    IP_TO_LOCATION = bool(config["config"]["ip_to_location"])

    # Validate API_KEY if IP_TO_LOCATION is set to TRUE
    if IP_TO_LOCATION:
        if not config["config"]["api_key"]:
            LOG.error("API_KEY is not set")
        else:
            API_KEY = config["config"]["api_key"]