def decorated(*args, **kwargs): w3 = dbot.get_server().web3 signature = request.headers.get('signature') if signature is None: return "DBot owner's signature is required to start an DBot service", 401 payload = request.data msg_hash = defunct_hash_message(payload) sig_address = w3.eth.account.recoverHash(msg_hash, signature=signature) server_owner = dbot.get_server().account.address if not is_same_address(sig_address, server_owner): return "Only the server's owner({}) can change dbot services on it".format(server_owner), 401 dbot_address = kwargs.get('dbot_address') if request.method != 'DELETE': len = request.headers.get('len') if len: data_len = int(len) else: return "Bad Request, data length is require in headers", 404 dbot_data = json.loads(payload[:data_len].decode('utf-8')) if dbot_address is None: dbot_address = dbot_data['info']['addr'] dbot_contract = dbot.make_contract(w3, dbot_address) dbot_owner = dbot_contract.functions.getOwner().call() logger.debug("Signer's address is {}, Dbot(address = {}) owner is {}.".format( sig_address, dbot_address, dbot_owner)) if not is_same_address(sig_address, dbot_owner): return "Signature mismatch with DBot owner, signer is {}, dbot owner is {}".format( sig_address, dbot_owner ), 401 return f(*args, **kwargs)
def handle_quit(sig, frame): logging.info("handle_quit called with signal {}".format(sig)) logging.info("Stop Dbot Server ...") import dbot dbot_server = dbot.get_server() dbot_server.stop() exit(0)
def decorated(*args, **kwargs): metric = dbot.get_server().metric endpoint = request.url caller = request.remote_addr apiinfo = metric.CallBegin(endpoint, caller) response = f(*args, **kwargs) metric.CallEnd(apiinfo, response.status_code) return response
def run_server(host, port, pk_file, pw_file, http_provider): private_key = get_private_key(pk_file, pw_file) import dbot dbot_server = dbot.get_server() dbot_server.init(app, private_key, http_provider) # save dbot backend info for dbot-service tool to operate dbot-service app_dir = os.path.join(os.path.expanduser('~'), '.dbot-server') if not os.path.exists(app_dir): os.makedirs(app_dir) with open(os.path.join(app_dir, '.backend'), 'w') as fh: json.dump( { 'backend': 'http://{}:{}'.format(host, port), 'pk_file': os.path.abspath(pk_file), 'pw_file': os.path.abspath(pw_file), 'http_provider': http_provider }, fh, indent=2) app.run(host=host, port=port, debug=app.config['DEBUG'], use_reloader=False)
import os import json import logging import logging.config from app import create_app from utils import get_private_key from log import DBotLogger app_name = 'dbot_server' logging.config.dictConfig(DBotLogger(app_name).config()) app = create_app(app_name, os.environ.get('APP_ENV', 'Production')) pk_file = './keystore/keyfile' pw_file = './password/passwd' private_key = get_private_key(pk_file, pw_file) # import dbot module after logging config import dbot dbot_server = dbot.get_server() logging.info('Start dbot server ...') http_provider = os.environ.get('WEB3_PROVIDER', app.config['WEB3_PROVIDER_DEFAULT']) dbot_server.init(app, private_key, http_provider) logging.info('waiting for all dbot service sync info with block chain') host = app.config['HOST'] port = os.environ.get('LISTEN_PORT', app.config['PORT']) if __name__ == "__main__": app.run(host=host, port=port, debug=app.config['DEBUG'], use_reloader=False)