示例#1
0
    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)
示例#2
0
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)
示例#3
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
示例#4
0
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)
示例#5
0
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)