Passed
Pull Request — master (#7)
by
unknown
04:02
created

config._check_url()   A

Complexity

Conditions 3

Size

Total Lines 9
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 9
dl 0
loc 9
rs 9.95
c 0
b 0
f 0
cc 3
nop 1
1
import logging
2
import os
3
from urllib.parse import urlsplit
4
5
from requests.utils import get_netrc_auth
6
7
from _version import VERSION
8
9
DEFAULT_PORT = 9563
10
11
LOG_LEVELS = ["DEBUG", "INFO", "WARN", "WARNING", "ERROR", "CRITICAL", "FATAL"]
12
13
14
class Config:
15
    def __init__(self):
16
        kibana_url = os.getenv("KIBANA_URL")
17
        listen_port = os.getenv("LISTEN_PORT", DEFAULT_PORT)
18
        log_level = os.getenv("LOG_LEVEL", "INFO")
19
        kibana_login = os.getenv("KIBANA_LOGIN")
20
        kibana_password = os.getenv("KIBANA_PASSWORD")
21
22
        self.version = VERSION
23
        self.log_level = _check_log_level(log_level)
24
        logging.basicConfig(level=self.log_level)
25
        self.kibana_url = _check_url(kibana_url)
26
        self.listen_port = _check_port(listen_port)
27
        self.kibana_login = kibana_login
28
        self.kibana_password = kibana_password
29
30
        if not self.kibana_url:
31
            raise ValueError("The Kibana URL cannot be empty.")
32
33
    def description(self):
34
        config_list = [
35
            ("Listen port:", self.listen_port),
36
            ("Log level:", self.log_level),
37
            ("Kibana URL:", self.kibana_url),
38
        ]
39
        # check if netrc is available
40
        netrc_auth = get_netrc_auth(self.kibana_url)
41
        if netrc_auth:
42
            config_list.append(("Kibana login (from netrc):", netrc_auth[0]))
43
            config_list.append(("Kibana password (from netrc):", "***"))
44
        elif self.kibana_login:
45
            config_list.append(("Kibana login:", self.kibana_login))
46
            config_list.append(("Kibana password:", "***"))
47
48
        max_length = max(map(lambda x: len(x[0]), config_list))
49
        desc = "== CONFIGURATION ==\n"
50
        line_template = "%-" + str(max_length) + "s\t%s\n"
51
        for line in config_list:
52
            desc += line_template % line
53
        return desc
54
55
56
def _check_url(url: str) -> str:
57
    split_url = urlsplit(url)
58
    if not all(split_url[:2]):
59
        raise ValueError("URL is malformed.")
60
    try:
61
        split_url.port
62
    except ValueError as e:
63
        raise ValueError("URL is malformed: %s" % e)
64
    return url
65
66
67
def _check_port(port: str) -> int:
68
    if type(port) not in (str, int):
69
        raise ValueError("Listen port must be an integer. Got: %s" % (port,))
70
    try:
71
        # Avoid converting types that can be represented as an int but are not int-like, such as IPs
72
        port = int(port)
73
    except (OverflowError, TypeError, ValueError) as e:
74
        raise ValueError("Listen port must be an integer: %s" % e)
75
    if 0 <= port <= 65535:
76
        return port
77
    else:
78
        raise ValueError("Listen port must be between 1 and 65535")
79
80
81
def _check_log_level(log_level: str) -> int:
82
    try:
83
        return getattr(logging, log_level.upper())
84
    except (AttributeError, TypeError):
85
        raise ValueError("Invalid log level: %s. Must be one of %s." % (", ".join(LOG_LEVELS), log_level))
86