From 6a0dc03b9d468b13d2101f6a7582080a89dacab6 Mon Sep 17 00:00:00 2001 From: UpstreamData <75442874+UpstreamData@users.noreply.github.com> Date: Mon, 18 Jul 2022 11:44:22 -0600 Subject: [PATCH] update to a better way to handle settings --- pyasic/API/btminer.py | 9 ++- pyasic/logger/__init__.py | 6 +- pyasic/miners/_backends/bmminer.py | 4 +- pyasic/miners/_backends/bosminer.py | 9 +-- pyasic/miners/_backends/btminer.py | 4 +- pyasic/miners/_backends/cgminer.py | 4 +- .../miners/avalonminer/cgminer/A10X/A1026.py | 4 +- .../miners/avalonminer/cgminer/A10X/A1047.py | 4 +- .../miners/avalonminer/cgminer/A10X/A1066.py | 4 +- pyasic/miners/avalonminer/cgminer/A7X/A721.py | 4 +- pyasic/miners/avalonminer/cgminer/A7X/A741.py | 4 +- pyasic/miners/avalonminer/cgminer/A7X/A761.py | 4 +- pyasic/miners/avalonminer/cgminer/A8X/A821.py | 4 +- pyasic/miners/avalonminer/cgminer/A8X/A841.py | 4 +- pyasic/miners/avalonminer/cgminer/A8X/A851.py | 4 +- pyasic/miners/avalonminer/cgminer/A9X/A921.py | 4 +- pyasic/miners/miner_factory.py | 7 +- pyasic/network/__init__.py | 18 ++--- pyasic/settings/__init__.py | 67 ++++++------------- pyasic/settings/settings.toml | 22 ------ 20 files changed, 70 insertions(+), 120 deletions(-) delete mode 100644 pyasic/settings/settings.toml diff --git a/pyasic/API/btminer.py b/pyasic/API/btminer.py index 073ef69e..6b30c396 100644 --- a/pyasic/API/btminer.py +++ b/pyasic/API/btminer.py @@ -10,7 +10,7 @@ from passlib.handlers.md5_crypt import md5_crypt from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from pyasic.API import BaseMinerAPI, APIError -from pyasic.settings import WHATSMINER_PWD +from pyasic.settings import PyasicSettings ### IMPORTANT ### @@ -161,7 +161,12 @@ class BTMinerAPI(BaseMinerAPI): pwd: The admin password of the miner. Default is admin. """ - def __init__(self, ip: str, port: int = 4028, pwd: str = WHATSMINER_PWD): + def __init__( + self, + ip: str, + port: int = 4028, + pwd: str = PyasicSettings().global_whatsminer_password, + ): super().__init__(ip, port) self.admin_pwd = pwd self.current_token = None diff --git a/pyasic/logger/__init__.py b/pyasic/logger/__init__.py index 39e7eeaf..c1229ed2 100644 --- a/pyasic/logger/__init__.py +++ b/pyasic/logger/__init__.py @@ -1,9 +1,9 @@ import logging -from pyasic.settings import DEBUG, LOGFILE +from pyasic.settings import PyasicSettings def init_logger(): - if LOGFILE: + if PyasicSettings().logfile: logging.basicConfig( filename="logfile.txt", filemode="a", @@ -18,7 +18,7 @@ def init_logger(): _logger = logging.getLogger() - if DEBUG: + if PyasicSettings().debug: _logger.setLevel(logging.DEBUG) logging.getLogger("asyncssh").setLevel(logging.DEBUG) else: diff --git a/pyasic/miners/_backends/bmminer.py b/pyasic/miners/_backends/bmminer.py index d5d573ef..563f07ce 100644 --- a/pyasic/miners/_backends/bmminer.py +++ b/pyasic/miners/_backends/bmminer.py @@ -8,7 +8,7 @@ from pyasic.miners import BaseMiner from pyasic.data import MinerData -from pyasic.settings import MINER_FACTORY_GET_VERSION_RETRIES as DATA_RETRIES +from pyasic.settings import PyasicSettings class BMMiner(BaseMiner): @@ -165,7 +165,7 @@ class BMMiner(BaseMiner): data.mac = mac miner_data = None - for i in range(DATA_RETRIES): + for i in range(PyasicSettings().miner_get_data_retries): miner_data = await self.api.multicommand( "summary", "pools", "stats", ignore_x19_error=True ) diff --git a/pyasic/miners/_backends/bosminer.py b/pyasic/miners/_backends/bosminer.py index cc5d6c4d..38ef6070 100644 --- a/pyasic/miners/_backends/bosminer.py +++ b/pyasic/miners/_backends/bosminer.py @@ -15,7 +15,7 @@ from pyasic.data import MinerData from pyasic.config import MinerConfig -from pyasic.settings import MINER_FACTORY_GET_VERSION_RETRIES as DATA_RETRIES +from pyasic.settings import PyasicSettings class BOSMiner(BaseMiner): @@ -97,7 +97,7 @@ class BOSMiner(BaseMiner): return True return False - async def get_config(self) -> str: + async def get_config(self) -> MinerConfig: """Gets the config for the miner and sets it as `self.config`. Returns: @@ -217,13 +217,14 @@ class BOSMiner(BaseMiner): .as_bos(model=self.model.replace(" (BOS)", "")) ) async with (await self._get_ssh_connection()) as conn: + await conn.run("/etc/init.d/bosminer stop") logging.debug(f"{self}: Opening SFTP connection.") async with conn.start_sftp_client() as sftp: logging.debug(f"{self}: Opening config file.") async with sftp.open("/etc/bosminer.toml", "w+") as file: await file.write(toml_conf) logging.debug(f"{self}: Restarting BOSMiner") - await conn.run("/etc/init.d/bosminer restart") + await conn.run("/etc/init.d/bosminer start") async def get_data(self) -> MinerData: """Get data from the miner. @@ -250,7 +251,7 @@ class BOSMiner(BaseMiner): data.mac = mac miner_data = None - for i in range(DATA_RETRIES): + for i in range(PyasicSettings().miner_get_data_retries): try: miner_data = await self.api.multicommand( "summary", diff --git a/pyasic/miners/_backends/btminer.py b/pyasic/miners/_backends/btminer.py index c0e4e0eb..ae0a9004 100644 --- a/pyasic/miners/_backends/btminer.py +++ b/pyasic/miners/_backends/btminer.py @@ -10,7 +10,7 @@ from pyasic.API import APIError from pyasic.data import MinerData from pyasic.data.error_codes import WhatsminerError -from pyasic.settings import MINER_FACTORY_GET_VERSION_RETRIES as DATA_RETRIES +from pyasic.settings import PyasicSettings class BTMiner(BaseMiner): @@ -116,7 +116,7 @@ class BTMiner(BaseMiner): data.hostname = hostname miner_data = None - for i in range(DATA_RETRIES): + for i in range(PyasicSettings().miner_get_data_retries): try: miner_data = await self.api.multicommand("summary", "devs", "pools") if miner_data: diff --git a/pyasic/miners/_backends/cgminer.py b/pyasic/miners/_backends/cgminer.py index bcbd51e7..c4e872f5 100644 --- a/pyasic/miners/_backends/cgminer.py +++ b/pyasic/miners/_backends/cgminer.py @@ -9,7 +9,7 @@ from pyasic.API import APIError from pyasic.data import MinerData -from pyasic.settings import MINER_FACTORY_GET_VERSION_RETRIES as DATA_RETRIES +from pyasic.settings import PyasicSettings class CGMiner(BaseMiner): @@ -162,7 +162,7 @@ class CGMiner(BaseMiner): data.mac = mac miner_data = None - for i in range(DATA_RETRIES): + for i in range(PyasicSettings().miner_get_data_retries): miner_data = await self.api.multicommand( "summary", "pools", "stats", ignore_x19_error=True ) diff --git a/pyasic/miners/avalonminer/cgminer/A10X/A1026.py b/pyasic/miners/avalonminer/cgminer/A10X/A1026.py index 41218822..87fd9f2b 100644 --- a/pyasic/miners/avalonminer/cgminer/A10X/A1026.py +++ b/pyasic/miners/avalonminer/cgminer/A10X/A1026.py @@ -2,7 +2,7 @@ from pyasic.miners._backends import CGMiner # noqa - Ignore access to _module from pyasic.miners._types import Avalon1026 # noqa - Ignore access to _module from pyasic.data import MinerData -from pyasic.settings import MINER_FACTORY_GET_VERSION_RETRIES as DATA_RETRIES +from pyasic.settings import PyasicSettings import re from pyasic.config import MinerConfig import logging @@ -67,7 +67,7 @@ class CGMinerAvalon1026(CGMiner, Avalon1026): data.model = model miner_data = None - for i in range(DATA_RETRIES): + for i in range(PyasicSettings().miner_get_data_retries): miner_data = await self.api.multicommand( "version", "summary", "pools", "stats" ) diff --git a/pyasic/miners/avalonminer/cgminer/A10X/A1047.py b/pyasic/miners/avalonminer/cgminer/A10X/A1047.py index ce6d1bb0..2ae043da 100644 --- a/pyasic/miners/avalonminer/cgminer/A10X/A1047.py +++ b/pyasic/miners/avalonminer/cgminer/A10X/A1047.py @@ -2,7 +2,7 @@ from pyasic.miners._backends import CGMiner # noqa - Ignore access to _module from pyasic.miners._types import Avalon1047 # noqa - Ignore access to _module from pyasic.data import MinerData -from pyasic.settings import MINER_FACTORY_GET_VERSION_RETRIES as DATA_RETRIES +from pyasic.settings import PyasicSettings import re from pyasic.config import MinerConfig import logging @@ -67,7 +67,7 @@ class CGMinerAvalon1047(CGMiner, Avalon1047): data.model = model miner_data = None - for i in range(DATA_RETRIES): + for i in range(PyasicSettings().miner_get_data_retries): miner_data = await self.api.multicommand( "version", "summary", "pools", "stats" ) diff --git a/pyasic/miners/avalonminer/cgminer/A10X/A1066.py b/pyasic/miners/avalonminer/cgminer/A10X/A1066.py index 51f85a90..456b8564 100644 --- a/pyasic/miners/avalonminer/cgminer/A10X/A1066.py +++ b/pyasic/miners/avalonminer/cgminer/A10X/A1066.py @@ -2,7 +2,7 @@ from pyasic.miners._backends import CGMiner # noqa - Ignore access to _module from pyasic.miners._types import Avalon1066 # noqa - Ignore access to _module from pyasic.data import MinerData -from pyasic.settings import MINER_FACTORY_GET_VERSION_RETRIES as DATA_RETRIES +from pyasic.settings import PyasicSettings import re from pyasic.config import MinerConfig import logging @@ -67,7 +67,7 @@ class CGMinerAvalon1066(CGMiner, Avalon1066): data.model = model miner_data = None - for i in range(DATA_RETRIES): + for i in range(PyasicSettings().miner_get_data_retries): miner_data = await self.api.multicommand( "version", "summary", "pools", "stats" ) diff --git a/pyasic/miners/avalonminer/cgminer/A7X/A721.py b/pyasic/miners/avalonminer/cgminer/A7X/A721.py index c3490651..65ed2fcf 100644 --- a/pyasic/miners/avalonminer/cgminer/A7X/A721.py +++ b/pyasic/miners/avalonminer/cgminer/A7X/A721.py @@ -2,7 +2,7 @@ from pyasic.miners._backends import CGMiner # noqa - Ignore access to _module from pyasic.miners._types import Avalon721 # noqa - Ignore access to _module from pyasic.data import MinerData -from pyasic.settings import MINER_FACTORY_GET_VERSION_RETRIES as DATA_RETRIES +from pyasic.settings import PyasicSettings import re from pyasic.config import MinerConfig import logging @@ -67,7 +67,7 @@ class CGMinerAvalon721(CGMiner, Avalon721): data.model = model miner_data = None - for i in range(DATA_RETRIES): + for i in range(PyasicSettings().miner_get_data_retries): miner_data = await self.api.multicommand( "version", "summary", "pools", "stats" ) diff --git a/pyasic/miners/avalonminer/cgminer/A7X/A741.py b/pyasic/miners/avalonminer/cgminer/A7X/A741.py index 270c2cc7..8b6db170 100644 --- a/pyasic/miners/avalonminer/cgminer/A7X/A741.py +++ b/pyasic/miners/avalonminer/cgminer/A7X/A741.py @@ -2,7 +2,7 @@ from pyasic.miners._backends import CGMiner # noqa - Ignore access to _module from pyasic.miners._types import Avalon741 # noqa - Ignore access to _module from pyasic.data import MinerData -from pyasic.settings import MINER_FACTORY_GET_VERSION_RETRIES as DATA_RETRIES +from pyasic.settings import PyasicSettings import re from pyasic.config import MinerConfig import logging @@ -67,7 +67,7 @@ class CGMinerAvalon741(CGMiner, Avalon741): data.model = model miner_data = None - for i in range(DATA_RETRIES): + for i in range(PyasicSettings().miner_get_data_retries): miner_data = await self.api.multicommand( "version", "summary", "pools", "stats" ) diff --git a/pyasic/miners/avalonminer/cgminer/A7X/A761.py b/pyasic/miners/avalonminer/cgminer/A7X/A761.py index d18b9e09..7370ef2d 100644 --- a/pyasic/miners/avalonminer/cgminer/A7X/A761.py +++ b/pyasic/miners/avalonminer/cgminer/A7X/A761.py @@ -2,7 +2,7 @@ from pyasic.miners._backends import CGMiner # noqa - Ignore access to _module from pyasic.miners._types import Avalon761 # noqa - Ignore access to _module from pyasic.data import MinerData -from pyasic.settings import MINER_FACTORY_GET_VERSION_RETRIES as DATA_RETRIES +from pyasic.settings import PyasicSettings import re from pyasic.config import MinerConfig import logging @@ -67,7 +67,7 @@ class CGMinerAvalon761(CGMiner, Avalon761): data.model = model miner_data = None - for i in range(DATA_RETRIES): + for i in range(PyasicSettings().miner_get_data_retries): miner_data = await self.api.multicommand( "version", "summary", "pools", "stats" ) diff --git a/pyasic/miners/avalonminer/cgminer/A8X/A821.py b/pyasic/miners/avalonminer/cgminer/A8X/A821.py index b42e33f5..1c919218 100644 --- a/pyasic/miners/avalonminer/cgminer/A8X/A821.py +++ b/pyasic/miners/avalonminer/cgminer/A8X/A821.py @@ -2,7 +2,7 @@ from pyasic.miners._backends import CGMiner # noqa - Ignore access to _module from pyasic.miners._types import Avalon821 # noqa - Ignore access to _module from pyasic.data import MinerData -from pyasic.settings import MINER_FACTORY_GET_VERSION_RETRIES as DATA_RETRIES +from pyasic.settings import PyasicSettings import re from pyasic.config import MinerConfig import logging @@ -67,7 +67,7 @@ class CGMinerAvalon821(CGMiner, Avalon821): data.model = model miner_data = None - for i in range(DATA_RETRIES): + for i in range(PyasicSettings().miner_get_data_retries): miner_data = await self.api.multicommand( "version", "summary", "pools", "stats" ) diff --git a/pyasic/miners/avalonminer/cgminer/A8X/A841.py b/pyasic/miners/avalonminer/cgminer/A8X/A841.py index 0956951a..3c7df7a1 100644 --- a/pyasic/miners/avalonminer/cgminer/A8X/A841.py +++ b/pyasic/miners/avalonminer/cgminer/A8X/A841.py @@ -2,7 +2,7 @@ from pyasic.miners._backends import CGMiner # noqa - Ignore access to _module from pyasic.miners._types import Avalon841 # noqa - Ignore access to _module from pyasic.data import MinerData -from pyasic.settings import MINER_FACTORY_GET_VERSION_RETRIES as DATA_RETRIES +from pyasic.settings import PyasicSettings import re from pyasic.config import MinerConfig import logging @@ -67,7 +67,7 @@ class CGMinerAvalon841(CGMiner, Avalon841): data.model = model miner_data = None - for i in range(DATA_RETRIES): + for i in range(PyasicSettings().miner_get_data_retries): miner_data = await self.api.multicommand( "version", "summary", "pools", "stats" ) diff --git a/pyasic/miners/avalonminer/cgminer/A8X/A851.py b/pyasic/miners/avalonminer/cgminer/A8X/A851.py index 3706071d..deaf2d7a 100644 --- a/pyasic/miners/avalonminer/cgminer/A8X/A851.py +++ b/pyasic/miners/avalonminer/cgminer/A8X/A851.py @@ -2,7 +2,7 @@ from pyasic.miners._backends import CGMiner # noqa - Ignore access to _module from pyasic.miners._types import Avalon851 # noqa - Ignore access to _module from pyasic.data import MinerData -from pyasic.settings import MINER_FACTORY_GET_VERSION_RETRIES as DATA_RETRIES +from pyasic.settings import PyasicSettings import re from pyasic.config import MinerConfig import logging @@ -67,7 +67,7 @@ class CGMinerAvalon851(CGMiner, Avalon851): data.model = model miner_data = None - for i in range(DATA_RETRIES): + for i in range(PyasicSettings().miner_get_data_retries): miner_data = await self.api.multicommand( "version", "summary", "pools", "stats" ) diff --git a/pyasic/miners/avalonminer/cgminer/A9X/A921.py b/pyasic/miners/avalonminer/cgminer/A9X/A921.py index 240747ca..d9e64bb3 100644 --- a/pyasic/miners/avalonminer/cgminer/A9X/A921.py +++ b/pyasic/miners/avalonminer/cgminer/A9X/A921.py @@ -2,7 +2,7 @@ from pyasic.miners._backends import CGMiner # noqa - Ignore access to _module from pyasic.miners._types import Avalon921 # noqa - Ignore access to _module from pyasic.data import MinerData -from pyasic.settings import MINER_FACTORY_GET_VERSION_RETRIES as DATA_RETRIES +from pyasic.settings import PyasicSettings import re from pyasic.config import MinerConfig import logging @@ -67,7 +67,7 @@ class CGMinerAvalon921(CGMiner, Avalon921): data.model = model miner_data = None - for i in range(DATA_RETRIES): + for i in range(PyasicSettings().miner_get_data_retries): miner_data = await self.api.multicommand( "version", "summary", "pools", "stats" ) diff --git a/pyasic/miners/miner_factory.py b/pyasic/miners/miner_factory.py index 62b2b53e..dc90359c 100644 --- a/pyasic/miners/miner_factory.py +++ b/pyasic/miners/miner_factory.py @@ -23,10 +23,7 @@ import ipaddress import json import logging -from pyasic.settings import ( - MINER_FACTORY_GET_VERSION_RETRIES as GET_VERSION_RETRIES, - NETWORK_PING_TIMEOUT as PING_TIMEOUT, -) +from pyasic.settings import PyasicSettings import asyncssh @@ -284,7 +281,7 @@ class MinerFactory(metaclass=Singleton): ver = None # try to get the API multiple times based on retries - for i in range(GET_VERSION_RETRIES): + for i in range(PyasicSettings().miner_factory_get_version_retries): try: # get the API type, should be BOSMiner, CGMiner, BMMiner, BTMiner, or None new_model, new_api, new_ver = await asyncio.wait_for( diff --git a/pyasic/network/__init__.py b/pyasic/network/__init__.py index 0f2abb74..80407441 100644 --- a/pyasic/network/__init__.py +++ b/pyasic/network/__init__.py @@ -5,11 +5,7 @@ from typing import Union from pyasic.network.net_range import MinerNetworkRange from pyasic.miners.miner_factory import MinerFactory, AnyMiner -from pyasic.settings import ( - NETWORK_PING_RETRIES as PING_RETRIES, - NETWORK_PING_TIMEOUT as PING_TIMEOUT, - NETWORK_SCAN_THREADS as SCAN_THREADS, -) +from pyasic.settings import PyasicSettings class MinerNetwork: @@ -91,7 +87,7 @@ class MinerNetwork: for host in local_network.hosts(): # make sure we don't exceed the allowed async tasks - if len(scan_tasks) < SCAN_THREADS: + if len(scan_tasks) < PyasicSettings().network_scan_threads: # add the task to the list scan_tasks.append(self.ping_and_get_miner(host)) else: @@ -130,7 +126,7 @@ class MinerNetwork: # for each ip on the network, loop through and scan it for host in local_network.hosts(): # make sure we don't exceed the allowed async tasks - if len(scan_tasks) >= SCAN_THREADS: + if len(scan_tasks) >= PyasicSettings().network_scan_threads: # scanned is a loopable list of awaitables scanned = asyncio.as_completed(scan_tasks) # when we scan, empty the scan tasks @@ -180,12 +176,12 @@ class MinerNetwork: async def ping_miner( ip: ipaddress.ip_address, port=4028 ) -> None or ipaddress.ip_address: - for i in range(PING_RETRIES): + for i in range(PyasicSettings().network_ping_retries): connection_fut = asyncio.open_connection(str(ip), port) try: # get the read and write streams from the connection reader, writer = await asyncio.wait_for( - connection_fut, timeout=PING_TIMEOUT + connection_fut, timeout=PyasicSettings().network_ping_timeout ) # immediately close connection, we know connection happened writer.close() @@ -207,12 +203,12 @@ async def ping_miner( async def ping_and_get_miner(ip: ipaddress.ip_address, port=4028) -> None or AnyMiner: - for i in range(PING_RETRIES): + for i in range(PyasicSettings().network_ping_retries): connection_fut = asyncio.open_connection(str(ip), port) try: # get the read and write streams from the connection reader, writer = await asyncio.wait_for( - connection_fut, timeout=PING_TIMEOUT + connection_fut, timeout=PyasicSettings().network_ping_timeout ) # immediately close connection, we know connection happened writer.close() diff --git a/pyasic/settings/__init__.py b/pyasic/settings/__init__.py index bfdb2236..a3f50a81 100644 --- a/pyasic/settings/__init__.py +++ b/pyasic/settings/__init__.py @@ -1,53 +1,26 @@ -import toml -import os - -NETWORK_PING_RETRIES: int = 3 -NETWORK_PING_TIMEOUT: int = 5 -NETWORK_SCAN_THREADS: int = 300 - -CFG_UTIL_REBOOT_THREADS: int = 300 -CFG_UTIL_CONFIG_THREADS: int = 300 - -MINER_FACTORY_GET_VERSION_RETRIES: int = 3 - -WHATSMINER_PWD = "admin" - -DEBUG = False -LOGFILE = False - -settings_keys = {} - -try: - with open( - os.path.join(os.path.dirname(__file__), "settings.toml"), "r" - ) as settings_file: - settings = toml.loads(settings_file.read()) - settings_keys = settings.keys() -except: - pass - -if "ping_retries" in settings_keys: - NETWORK_PING_RETRIES: int = settings["ping_retries"] -if "ping_timeout" in settings_keys: - NETWORK_PING_TIMEOUT: int = settings["ping_timeout"] -if "scan_threads" in settings_keys: - NETWORK_SCAN_THREADS: int = settings["scan_threads"] - -if "reboot_threads" in settings_keys: - CFG_UTIL_REBOOT_THREADS: int = settings["reboot_threads"] -if "config_threads" in settings_keys: - CFG_UTIL_CONFIG_THREADS: int = settings["config_threads"] +from dataclasses import dataclass -if "get_version_retries" in settings_keys: - MINER_FACTORY_GET_VERSION_RETRIES: int = settings["get_version_retries"] +class Singleton(type): + _instances = {} + + def __call__(cls, *args, **kwargs): + if cls not in cls._instances: + cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) + return cls._instances[cls] -if "whatsminer_pwd" in settings_keys: - WHATSMINER_PWD: str = settings["whatsminer_pwd"] +@dataclass +class PyasicSettings(metaclass=Singleton): + network_ping_retries: int = 3 + network_ping_timeout: int = 5 + network_scan_threads: int = 300 -if "debug" in settings_keys: - DEBUG: int = settings["debug"] + miner_factory_get_version_retries: int = 1 -if "logfile" in settings_keys: - LOGFILE: bool = settings["logfile"] + miner_get_data_retries: int = 1 + + global_whatsminer_password = "admin" + + debug: bool = False + logfile: bool = False diff --git a/pyasic/settings/settings.toml b/pyasic/settings/settings.toml deleted file mode 100644 index 8131b3a9..00000000 --- a/pyasic/settings/settings.toml +++ /dev/null @@ -1,22 +0,0 @@ -get_version_retries = 3 -ping_retries = 3 -ping_timeout = 3 # Seconds -scan_threads = 300 -config_threads = 300 -reboot_threads = 300 - - -### IMPORTANT ### -# You need to change the password of the miners using the whatsminer -# tool or the privileged API will not work using admin as the password. -# If you change the password, you can pass that password here. - -whatsminer_pwd = "admin" - -logfile = true - -### DEBUG MODE ### -# change this to debug = true -# to enable debug mode. -debug = false -# debug = true