You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
3.9 KiB
140 lines
3.9 KiB
#! /usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
# S.D.G
|
|
|
|
"""
|
|
:mod:`lugito.config`
|
|
======================================
|
|
|
|
Module to manage lugito configuration
|
|
|
|
.. currentmodule:: lugito.config
|
|
"""
|
|
|
|
# Imports
|
|
import os
|
|
import logging
|
|
import configparser
|
|
|
|
DEFAULT_CONFIG_FILE = os.path.join(
|
|
os.getcwd(), '.lugitorc')
|
|
|
|
logger = logging.getLogger('lugito.config')
|
|
|
|
# Add log level
|
|
ch = logging.StreamHandler()
|
|
|
|
formatter = logging.Formatter(
|
|
'%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
|
|
|
ch.setFormatter(formatter)
|
|
logger.addHandler(ch)
|
|
logger.setLevel(logging.DEBUG)
|
|
|
|
CONFIG = {}
|
|
|
|
|
|
def update_config(config_file=DEFAULT_CONFIG_FILE):
|
|
"""
|
|
Update the system config from a config file
|
|
|
|
Parameters
|
|
----------
|
|
|
|
config_file: str
|
|
The path of the lugito config file
|
|
|
|
Returns
|
|
-------
|
|
|
|
config: dictionary
|
|
A dictionary of config parameters
|
|
|
|
"""
|
|
config = configparser.ConfigParser()
|
|
config.read(config_file)
|
|
|
|
# Make some basic assertions for minimum functionality
|
|
if 'phabricator' not in config:
|
|
raise ValueError('phabricator section missing from config file: %s' %\
|
|
config_file)
|
|
|
|
if 'host' not in config['phabricator']:
|
|
raise ValueError('host value missing from phabricator section in'\
|
|
' config file: %s' % config_file)
|
|
|
|
if 'token' not in config['phabricator']:
|
|
raise ValueError('token value missing from phabricator section in'\
|
|
' config file: %s' % config_file)
|
|
|
|
CONFIG['phabricator'] = {}
|
|
CONFIG['phabricator']['host'] = config['phabricator']['host']
|
|
CONFIG['phabricator']['token'] = config['phabricator']['token']
|
|
|
|
CONFIG['phabricator']['hooks'] = {}
|
|
CONFIG['phabricator']['package_names'] = {}
|
|
|
|
# Iterate through hooks for HMAC keys
|
|
if 'phabricator.hooks' in config:
|
|
for key, value in config['phabricator.hooks'].items():
|
|
CONFIG['phabricator']['hooks'][key] = value
|
|
|
|
if 'phabricator.package_names' in config:
|
|
for key, value in config['phabricator.package_names'].items():
|
|
CONFIG['phabricator']['package_names'][key] = value
|
|
|
|
CONFIG['connectors'] = {}
|
|
|
|
# Iterate through available connectors
|
|
for key in config.keys():
|
|
|
|
# Is a connector section
|
|
if ('connector.' in key) and (key.count('.') == 1) :
|
|
connector = key.split('.')[1]
|
|
|
|
if 'connectors' not in CONFIG:
|
|
CONFIG['connectors'] = {}
|
|
|
|
if connector not in CONFIG['connectors']:
|
|
CONFIG['connectors'][connector] = {}
|
|
|
|
for param, value in config[key].items():
|
|
|
|
# Check for multiple values for a parameter
|
|
if value.find('\n') >= 0:
|
|
value = value[1:].split('\n')
|
|
|
|
CONFIG['connectors'][connector][param] = value
|
|
|
|
# Is a connector sub-section
|
|
elif ('connector.' in key) and (key.count('.') > 1) :
|
|
sections = key.split('.')
|
|
connector = sections[1]
|
|
subsection = sections[-1]
|
|
|
|
if 'connectors' not in CONFIG:
|
|
CONFIG['connectors'] = {}
|
|
|
|
if connector not in CONFIG['connectors']:
|
|
CONFIG['connectors'][connector] = {}
|
|
|
|
CONFIG['connectors'][connector][subsection] = {}
|
|
|
|
for param, value in config[key].items():
|
|
|
|
# Check for multiple values for a parameter
|
|
if value.find('\n') >= 0:
|
|
value = value[1:].split('\n')
|
|
|
|
# configparser reads the parameters as lower case
|
|
# convert all but first character to upper case
|
|
param = 'r{}'.format(param[1:].upper())
|
|
CONFIG['connectors'][connector][subsection][param] = value
|
|
|
|
|
|
try:
|
|
update_config()
|
|
except ValueError:
|
|
# The config file is not present
|
|
logging.warning('Default config file: %s not found' % DEFAULT_CONFIG_FILE)
|