2019-08-06 10:04:02 +02:00
|
|
|
# -*- encoding: utf-8 -*-
|
|
|
|
import os
|
|
|
|
from pprint import pprint
|
|
|
|
import typing as T
|
|
|
|
|
|
|
|
import yaml
|
|
|
|
|
|
|
|
from api import DEBUG, BASE_URI
|
|
|
|
|
|
|
|
|
|
|
|
def read_conf(path: T.Optional[T.Text]) -> T.Dict:
|
|
|
|
"""
|
|
|
|
Read the configuration from the provided path.
|
|
|
|
Such configuration may provide the following information:
|
|
|
|
---
|
|
|
|
base_uri: <base uri of the target instance>
|
|
|
|
debug: <bool, set debug on, defaults to false>
|
|
|
|
headless: <bool, use headless mode, defaults to true>
|
|
|
|
log:
|
|
|
|
level: <may be DEBUG, INFO, WARN, ..., defaults at INFO>
|
|
|
|
syslog: <bool, whether to redirect to standard syslog, defaults to false>
|
|
|
|
http:
|
|
|
|
bind_addr: <a list of addresses to bind to>
|
|
|
|
port: <int, the port to bind to>
|
|
|
|
cookie_name: <defaults to BOTZ_SESSION>
|
|
|
|
cookie_secure: <bool, whether to set Secure cookie flag, defaults to true>
|
2019-09-05 17:57:40 +02:00
|
|
|
session_timeout: <int, the expiration time of the session ins secs, defaults to 300>
|
2019-08-06 10:04:02 +02:00
|
|
|
cors_allow: <an optional single allowed Cross Origin domain>
|
|
|
|
"""
|
|
|
|
if path is None:
|
|
|
|
path = seek_path()
|
|
|
|
if path is not None:
|
|
|
|
with open(path) as f:
|
|
|
|
conf = yaml.safe_load(f)
|
|
|
|
else:
|
|
|
|
conf = {}
|
|
|
|
if "base_uri" not in conf:
|
|
|
|
if BASE_URI is None:
|
|
|
|
raise RuntimeError("Missing base_uri")
|
|
|
|
conf["base_uri"] = BASE_URI
|
|
|
|
if "debug" not in conf:
|
|
|
|
conf["debug"] = DEBUG
|
|
|
|
if "headless" not in conf:
|
|
|
|
conf["headless"] = True
|
|
|
|
conf = validate_log_conf(conf)
|
|
|
|
conf = validate_http_log(conf)
|
|
|
|
pprint(conf)
|
|
|
|
return conf
|
|
|
|
|
|
|
|
|
|
|
|
def seek_path() -> T.Optional[T.Text]:
|
|
|
|
"""
|
|
|
|
Seeks the path to a config file, in the following order:
|
|
|
|
- $BOTZ_CONFIG
|
|
|
|
- $PWD/.botz.yaml
|
|
|
|
- ~/.botz.yaml
|
|
|
|
- /etc/botz/conf.yaml
|
|
|
|
"""
|
|
|
|
paths = [
|
|
|
|
os.path.join(os.path.curdir, ".botz.yaml"),
|
|
|
|
os.path.expanduser("~/.botz.yaml"),
|
|
|
|
"/etc/botz/conf.yaml",
|
|
|
|
]
|
|
|
|
env = os.environ.get("BOTZ_CONFIG")
|
|
|
|
if env is not None:
|
|
|
|
paths.insert(0, env)
|
|
|
|
for path in paths:
|
|
|
|
if os.path.exists(path):
|
|
|
|
return path
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
|
|
def validate_log_conf(conf: T.Dict[T.Text, T.Any]) -> T.Dict[T.Text, T.Any]:
|
|
|
|
if "log" not in conf:
|
|
|
|
conf["log"] = {}
|
|
|
|
if conf["log"].get("level") is None:
|
|
|
|
conf["log"]["level"] = "INFO"
|
|
|
|
if conf["log"].get("syslog") is None:
|
|
|
|
conf["log"]["syslog"] = False
|
|
|
|
return conf
|
|
|
|
|
|
|
|
|
|
|
|
def validate_http_log(conf: T.Dict[T.Text, T.Any]) -> T.Dict[T.Text, T.Any]:
|
|
|
|
if "http" not in conf:
|
|
|
|
conf["http"] = {}
|
|
|
|
if conf["http"].get("bind_addr") is None:
|
|
|
|
conf["http"]["bind_addr"] = ["127.0.0.1"]
|
|
|
|
if conf["http"].get("port") is None:
|
|
|
|
conf["http"]["port"] = 3003
|
|
|
|
if conf["http"].get("cookie_name") is None:
|
|
|
|
conf["http"]["cookie_name"] = "BOTZ_SESSION"
|
|
|
|
if conf["http"].get("cookie_secure") is None:
|
|
|
|
conf["http"]["cookie_secure"] = True
|
2019-09-05 17:57:40 +02:00
|
|
|
if conf["http"].get("session_timeout") is None:
|
|
|
|
conf["http"]["session_timeout"] = 300
|
|
|
|
elif isinstance(conf["http"]["session_timeout"], str):
|
|
|
|
conf["http"]["session_timeout"] = int(conf["http"]["session_timeout"])
|
|
|
|
|
2019-08-06 10:04:02 +02:00
|
|
|
return conf
|