Module onionr.config

Onionr - Private P2P Communication

This file deals with configuration management.

Source code
'''
    Onionr - Private P2P Communication

    This file deals with configuration management.
'''
'''
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
'''

import os, json, logger
import filepaths

_configfile = filepaths.config_file
_config = {}

def get(key, default = None, save = False):
    '''
        Gets the key from configuration, or returns `default`
    '''

    key = str(key).split('.')
    data = _config

    last = key.pop()

    for item in key:
        if (not item in data) or (not type(data[item]) == dict):
            return default
        data = data[item]

    if not last in data:
        if save:
            set(key, default, savefile = True)
        return default

    return data[last]

def set(key, value = None, savefile = False):
    '''
        Sets the key in configuration to `value`
    '''

    global _config

    key = str(key).split('.')
    data = _config

    last = key.pop()

    for item in key:
        if (not item in data) or (not type(data[item]) == dict):
            data[item] = dict()
        data = data[item]

    if value is None:
        del data[last]
    else:
        data[last] = value

    if savefile:
        save()

def is_set(key):
    key = str(key).split('.')
    data = _config

    last = key.pop()

    for item in key:
        if (not item in data) or (not type(data[item]) == dict):
            return False
        data = data[item]

    if not last in data:
        return False

    return True

def check():
    '''
        Checks if the configuration file exists, creates it if not
    '''

    if not os.path.exists(os.path.dirname(get_config_file())):
        os.makedirs(os.path.dirname(get_config_file()))

def save():
    '''
        Saves the configuration data to the configuration file
    '''

    check()
    try:
        with open(get_config_file(), 'w', encoding="utf8") as configfile:
            json.dump(get_config(), configfile, indent=2)
    except json.JSONDecodeError:
        logger.warn('Failed to write to configuration file.')

def reload():
    '''
        Reloads the configuration data in memory from the file
    '''
    check()
    try:
        with open(get_config_file(), 'r', encoding="utf8") as configfile:
            set_config(json.loads(configfile.read()))
    except (FileNotFoundError, json.JSONDecodeError) as e:
        pass
        #logger.debug('Failed to parse configuration file.')

def get_config():
    '''
        Gets the entire configuration as an array
    '''
    return _config

def set_config(config):
    '''
        Sets the configuration to the array in arguments
    '''
    global _config
    _config = config

def get_config_file():
    '''
        Returns the absolute path to the configuration file
    '''
    return _configfile

def set_config_file(configfile):
    '''
        Sets the path to the configuration file
    '''
    global _configfile
    _configfile = os.abs.abspath(configfile)

Functions

def check()

Checks if the configuration file exists, creates it if not

Source code
def check():
    '''
        Checks if the configuration file exists, creates it if not
    '''

    if not os.path.exists(os.path.dirname(get_config_file())):
        os.makedirs(os.path.dirname(get_config_file()))
def get(key, default=None, save=False)

Gets the key from configuration, or returns default

Source code
def get(key, default = None, save = False):
    '''
        Gets the key from configuration, or returns `default`
    '''

    key = str(key).split('.')
    data = _config

    last = key.pop()

    for item in key:
        if (not item in data) or (not type(data[item]) == dict):
            return default
        data = data[item]

    if not last in data:
        if save:
            set(key, default, savefile = True)
        return default

    return data[last]
def get_config()

Gets the entire configuration as an array

Source code
def get_config():
    '''
        Gets the entire configuration as an array
    '''
    return _config
def get_config_file()

Returns the absolute path to the configuration file

Source code
def get_config_file():
    '''
        Returns the absolute path to the configuration file
    '''
    return _configfile
def is_set(key)
Source code
def is_set(key):
    key = str(key).split('.')
    data = _config

    last = key.pop()

    for item in key:
        if (not item in data) or (not type(data[item]) == dict):
            return False
        data = data[item]

    if not last in data:
        return False

    return True
def reload()

Reloads the configuration data in memory from the file

Source code
def reload():
    '''
        Reloads the configuration data in memory from the file
    '''
    check()
    try:
        with open(get_config_file(), 'r', encoding="utf8") as configfile:
            set_config(json.loads(configfile.read()))
    except (FileNotFoundError, json.JSONDecodeError) as e:
        pass
def save()

Saves the configuration data to the configuration file

Source code
def save():
    '''
        Saves the configuration data to the configuration file
    '''

    check()
    try:
        with open(get_config_file(), 'w', encoding="utf8") as configfile:
            json.dump(get_config(), configfile, indent=2)
    except json.JSONDecodeError:
        logger.warn('Failed to write to configuration file.')
def set(key, value=None, savefile=False)

Sets the key in configuration to value

Source code
def set(key, value = None, savefile = False):
    '''
        Sets the key in configuration to `value`
    '''

    global _config

    key = str(key).split('.')
    data = _config

    last = key.pop()

    for item in key:
        if (not item in data) or (not type(data[item]) == dict):
            data[item] = dict()
        data = data[item]

    if value is None:
        del data[last]
    else:
        data[last] = value

    if savefile:
        save()
def set_config(config)

Sets the configuration to the array in arguments

Source code
def set_config(config):
    '''
        Sets the configuration to the array in arguments
    '''
    global _config
    _config = config
def set_config_file(configfile)

Sets the path to the configuration file

Source code
def set_config_file(configfile):
    '''
        Sets the path to the configuration file
    '''
    global _configfile
    _configfile = os.abs.abspath(configfile)