diff --git a/apps/cic-eth/cic_eth/aux/erc20_demurrage_token/__init__.py b/apps/cic-eth/cic_eth/aux/erc20_demurrage_token/__init__.py new file mode 100644 index 00000000..0ce48bfd --- /dev/null +++ b/apps/cic-eth/cic_eth/aux/erc20_demurrage_token/__init__.py @@ -0,0 +1,18 @@ +# standard imports +import celery + +# external imports +from erc20_demurrage_token.demurrage import DemurrageCalculator + +celery_app = celery.current_app + + +class DemurrageCalculationTask(celery.Task): + + demurrage_token_rates = {} + + +@celery_app.task(bind=True, base=DemurrageCalculationTask) +def get_adjusted_balance(self, token_symbol, amount, timestamp): + c = self.demurrage_token_rates[token_symbol] + return c.amount_since(amount, timestamp) diff --git a/apps/cic-eth/cic_eth/runnable/daemons/tasker.py b/apps/cic-eth/cic_eth/runnable/daemons/tasker.py index 874c378b..f38bf484 100644 --- a/apps/cic-eth/cic_eth/runnable/daemons/tasker.py +++ b/apps/cic-eth/cic_eth/runnable/daemons/tasker.py @@ -7,6 +7,8 @@ import tempfile import re import urllib import websocket +import stat +import importlib # external imports import celery @@ -68,6 +70,8 @@ from cic_eth.task import BaseTask logging.basicConfig(level=logging.WARNING) logg = logging.getLogger() +script_dir = os.path.dirname(os.path.realpath(__file__)) + config_dir = os.path.join('/usr/local/etc/cic-eth') argparser = argparse.ArgumentParser() @@ -79,6 +83,8 @@ argparser.add_argument('--default-token-symbol', dest='default_token_symbol', ty argparser.add_argument('--trace-queue-status', default=None, dest='trace_queue_status', action='store_true', help='set to perist all queue entry status changes to storage') argparser.add_argument('-i', '--chain-spec', dest='i', type=str, help='chain spec') argparser.add_argument('--env-prefix', default=os.environ.get('CONFINI_ENV_PREFIX'), dest='env_prefix', type=str, help='environment prefix for variables to overwrite configuration') +argparser.add_argument('--aux-all', action='store_true', help='include tasks from all submodules from the aux module path') +argparser.add_argument('--aux', action='append', type=str, default=[], help='add single submodule from the aux module path') argparser.add_argument('-v', action='store_true', help='be verbose') argparser.add_argument('-vv', action='store_true', help='be more verbose') args = argparser.parse_args() @@ -109,6 +115,45 @@ if len(health_modules) != 0: health_modules = health_modules.split(',') logg.debug('health mods {}'.format(health_modules)) + +# detect aux +aux_dir = os.path.join(script_dir, '..', '..', 'aux') +aux = [] +if args.aux_all: + if len(args.aux) > 0: + logg.warning('--aux-all is set so --aux will have no effect') + for v in os.listdir(aux_dir): + if v[:1] == '.': + logg.debug('dotfile, skip {}'.format(v)) + continue + aux_mod_path = os.path.join(aux_dir, v) + st = os.stat(aux_mod_path) + if not stat.S_ISDIR(st.st_mode): + logg.debug('not a dir, skip {}'.format(v)) + continue + aux_mod_file = os.path.join(aux_dir, v,'__init__.py') + try: + st = os.stat(aux_mod_file) + except FileNotFoundError: + logg.debug('__init__.py not found, skip {}'.format(v)) + continue + aux.append(v) + +elif len(args.aux) > 0: + for v in args.aux: + aux_mod_file = os.path.join(aux_dir, v,'__init__.py') + try: + st = os.stat(aux_mod_file) + except FileNotFoundError: + logg.critical('cannot find explicity requested aux module {}'.format(v)) + sys.exit(1) + logg.info('aux module {} found in path'.format(v)) + aux.append(v) + +for v in aux: + importlib.import_module('cic_eth.aux.' + v) + + # connect to database dsn = dsn_from_config(config) SessionBase.connect(dsn, pool_size=int(config.get('DATABASE_POOL_SIZE')), debug=config.true('DATABASE_DEBUG'))