79 lines
2.2 KiB
Python
79 lines
2.2 KiB
Python
# Copyright (c) 2017, Neil Booth
|
|||
|
|
#
|
||
|
|
# All rights reserved.
|
||
|
|
#
|
||
|
|
# See the file "LICENCE" for information about the copyright
|
||
|
|
# and warranty status of this software.
|
||
|
|
|
||
|
|
'''Class for server environment configuration and defaults.'''
|
||
|
|
|
||
|
|
|
||
|
|
from os import environ
|
||
|
|
|
||
|
|
from electrumx.lib.util import class_logger
|
||
|
|
|
||
|
|
|
||
|
|
class EnvBase:
|
||
|
|
'''Wraps environment configuration.'''
|
||
|
|
|
||
|
|
class Error(Exception):
|
||
|
|
pass
|
||
|
|
|
||
|
|
def __init__(self):
|
||
|
|
self.logger = class_logger(__name__, self.__class__.__name__)
|
||
|
|
self.allow_root = self.boolean('ALLOW_ROOT', False)
|
||
|
|
self.loop_policy = self.event_loop_policy()
|
||
|
|
|
||
|
|
@classmethod
|
||
|
|
def default(cls, envvar, default):
|
||
|
|
return environ.get(envvar, default)
|
||
|
|
|
||
|
|
@classmethod
|
||
|
|
def boolean(cls, envvar, default):
|
||
|
|
default = 'Yes' if default else ''
|
||
|
|
return bool(cls.default(envvar, default).strip())
|
||
|
|
|
||
|
|
@classmethod
|
||
|
|
def required(cls, envvar):
|
||
|
|
value = environ.get(envvar)
|
||
|
|
if value is None:
|
||
|
|
raise cls.Error(f'required envvar {envvar} not set')
|
||
|
|
return value
|
||
|
|
|
||
|
|
@classmethod
|
||
|
|
def integer(cls, envvar, default):
|
||
|
|
value = environ.get(envvar)
|
||
|
|
if value is None:
|
||
|
|
return default
|
||
|
|
try:
|
||
|
|
return int(value)
|
||
|
|
except Exception:
|
||
|
|
raise cls.Error(f'cannot convert envvar {envvar} value {value} to '
|
||
|
|
f'an integer')
|
||
|
|
|
||
|
|
@classmethod
|
||
|
|
def custom(cls, envvar, default, parse):
|
||
|
|
value = environ.get(envvar)
|
||
|
|
if value is None:
|
||
|
|
return default
|
||
|
|
try:
|
||
|
|
return parse(value)
|
||
|
|
except Exception as e:
|
||
|
|
raise cls.Error(
|
||
|
|
f'cannot parse envvar {envvar} value {value}'
|
||
|
|
) from e
|
||
|
|
|
||
|
|
@classmethod
|
||
|
|
def obsolete(cls, envvars):
|
||
|
|
bad = [envvar for envvar in envvars if environ.get(envvar)]
|
||
|
|
if bad:
|
||
|
|
raise cls.Error(f'remove obsolete environment variables {bad}')
|
||
|
|
|
||
|
|
def event_loop_policy(self):
|
||
|
|
policy = self.default('EVENT_LOOP_POLICY', None)
|
||
|
|
if policy is None:
|
||
|
|
return None
|
||
|
|
if policy == 'uvloop':
|
||
|
|
import uvloop
|
||
|
|
return uvloop.EventLoopPolicy()
|
||
|
|
raise self.Error(f'unknown event loop policy "{policy}"')
|