Source code for bbc_config

# -*- coding: utf-8 -*-
"""
Copyright (c) 2017 beyond-blockchain.org.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
"""
import os
import json
import copy

import sys
sys.path.extend(["../../"])
from bbc1.common import bbclib
from bbc1.common.bbclib import StorageType


DEFAULT_WORKING_DIR = '.bbc1'
DEFAULT_CONFIG_FILE = 'config.json'
DEFAULT_CORE_PORT = 9000
DEFAULT_P2P_PORT = 6641
DEFAULT_ETHEREUM_LOG_FILE = 'geth.log'
DEFAULT_ETHEREUM_CHAIN_ID = 15
DEFAULT_ETHEREUM_GETH_PORT = 30303

TIMEOUT_TIMER = 3

current_config = {
    'workingdir': DEFAULT_WORKING_DIR,
    'client': {
        'port': DEFAULT_CORE_PORT,
    },
    'ledger': {
        'type': "sqlite3",
        'transaction_db': "bbc_transaction.sqlite3",
        'auxiliary_db': "bbc_aux.sqlite3",
        'merkle_db': "bbc_merkle.sqlite3",
    },
    'storage': {
        #'path': "path/to/somewhere",
        #'path': "/path/to/somewhere",
    },
    'network': {
        'p2p_port': DEFAULT_P2P_PORT,
        'max_connections': 100,
        'modules': {
            'simple_cluster': {
                'test': 1,
            },
            'p2p_kademlia': {
                'concurrent_lookup_num': 3,
                'redundancy': 3,
                'k_value': 10,
            },
        },
    },
    'domains': {
        '0000000000000000000000000000000000000000000000000000000000000000': {
            'module': 'p2p_domain0',
            'static_nodes': {
                # id : [ipv4, ipv6, port]
            },
            'peer_list': {
                # id : [ipv4, ipv6, port]
            },
        },
    },
    'use_ledger_subsystem': False,
    'ethereum': {
        'chain_id': DEFAULT_ETHEREUM_CHAIN_ID,
        'port': DEFAULT_ETHEREUM_GETH_PORT,
        'log': DEFAULT_ETHEREUM_LOG_FILE,
        'account': '',
        'passphrase': '',
        'contract': 'BBcAnchor',
        'contract_address': '',
    },
    'ledger_subsystem': {
        'subsystem': 'ethereum',
        'max_transactions': 4096,
        'max_seconds': 60 * 60,
    },
}


[docs]class BBcConfig: def __init__(self, directory=None, file=None): self.config = copy.deepcopy(current_config) self.config_file = DEFAULT_CONFIG_FILE self.working_dir = self.config['workingdir'] if directory is not None: self.working_dir = directory self.config['workingdir'] = self.working_dir if file is not None: self.config_file = file if not os.path.exists(self.working_dir): os.mkdir(self.working_dir) if os.path.isfile(os.path.join(self.working_dir, self.config_file)): with open(os.path.join(self.working_dir, self.config_file), "r") as f: try: self.config.update(json.load(f)) except: print("config file must be in JSON format") os._exit(1) self.update_config()
[docs] def update_config(self): try: with open(os.path.join(self.working_dir, self.config_file), "w") as f: json.dump(self.config, f, indent=4) return True except: import traceback traceback.print_exc() return False
[docs] def get_json_config(self): self.update_config() return json.dumps(self.config, indent=2)
[docs] def get_config(self): return self.config
[docs] def get_domain_config(self, domain_id, create_if_new=False): domain_id_str = bbclib.convert_id_to_string(domain_id) if create_if_new and domain_id_str not in self.config['domains']: self.config['domains'][domain_id_str] = { 'module': 'simple_cluster', 'static_nodes': { # id : [ipv4, ipv6, port] }, 'peer_list': { # id : [ipv4, ipv6, port] }, } if domain_id_str in self.config['domains']: return self.config['domains'][domain_id_str] return None