Files
decluttarr/config/parser.py
Benjamin Harder 93a3ca165e Log refinements
2024-05-24 20:11:59 +02:00

81 lines
3.1 KiB
Python

#!/usr/bin/env python
import sys
import os
import configparser
import json
from config.env_vars import *
# Configures how to parse configuration file
config_file_name = 'config.conf'
config_file_full_path = os.path.join(os.path.abspath(os.path.dirname(__file__)), config_file_name)
sys.tracebacklimit = 0 # dont show stack traces in prod mode
config = configparser.ConfigParser()
config.optionxform = str # maintain capitalization of config keys
config.read(config_file_full_path)
def config_section_map(section):
'Load the config file into a dictionary'
dict1 = {}
options = config.options(section)
for option in options:
try:
dict1[option] = config.get(section, option)
except:
print("exception on %s!" % option)
dict1[option] = None
return dict1
def cast(value, type_):
return type_(value)
def get_config_value(key, config_section, is_mandatory, datatype, default_value = None):
'Return for each key the corresponding value from the Docker Environment or the Config File'
if IS_IN_DOCKER:
config_value = os.environ.get(key)
if config_value is not None:
# print(f'The value retrieved for [{config_section}]: {key} is "{config_value}"')
config_value = config_value
# return config_value
elif is_mandatory:
print(f'[ ERROR ]: Variable not specified in Docker environment: {key}' )
sys.exit(0)
else:
# return default_value
# print(f'The default value used for [{config_section}]: {key} is "{default_value}" (data type: {type(default_value).__name__})')
config_value = default_value
else:
try:
config_value = config_section_map(config_section).get(key)
except configparser.NoSectionError:
config_value = None
if config_value is not None:
# print(f'The value retrieved for [{config_section}]: {key} is "{config_value}"')
config_value = config_value
# return config_value
elif is_mandatory:
print(f'[ ERROR ]: Mandatory variable not specified in config file, section [{config_section}]: {key} (data type: {datatype.__name__})')
sys.exit(0)
else:
# return default_value
# print(f'The default value used for [{config_section}]: {key} is "{default_value}" (data type: {type(default_value).__name__})')
config_value = default_value
# Apply data type
try:
if datatype == bool:
config_value = eval(str(config_value).capitalize())
elif datatype == list:
if type(config_value) != list: # Default value is already a list, doesn't need to be pushed through json.loads
config_value = json.loads(config_value)
elif config_value is not None:
config_value = cast(config_value, datatype)
except Exception as e:
print(f'[ ERROR ]: The value retrieved for [{config_section}]: {key} is "{config_value}" and cannot be converted to data type {datatype}')
print(e)
sys.exit(0)
return config_value