Example #1
0
def main(argv=sys.argv):
    def usage(argv):
        cmd = os.path.basename(argv[0])
        print('usage: %s <config_uri> <network name>\n'
              '(example: "%s conf/production.ini testnet")' % (cmd, cmd))
        sys.exit(1)

    if len(argv) < 2:
        usage(argv)

    config_uri = argv[1]
    network_name = argv[2]

    # console_app sets up colored log output
    from websauna.system.devop.cmdline import init_websauna
    request = init_websauna(config_uri, sanity_check=True)

    services = ServiceCore.parse_network_config(request)
    one_shot = OneShot(request,
                       network_name,
                       services[network_name],
                       require_unlock=False)
    one_shot.setup()

    coinbase = one_shot.web3.eth.coinbase

    pw = getpass("Give password to unlock {} on {}:".format(
        coinbase, network_name))

    one_shot.web3.personal.unlockAccount(coinbase, pw, 30 * 24 * 3600)

    print("Unlock complete")
    sys.exit(0)
Example #2
0
def main(argv=sys.argv):

    def usage(argv):
        cmd = os.path.basename(argv[0])
        print('usage: %s <config_uri> <network name>\n'
              '(example: "%s conf/production.ini testnet")' % (cmd, cmd))
        sys.exit(1)

    if len(argv) < 2:
        usage(argv)

    config_uri = argv[1]
    network_name = argv[2]

    # console_app sets up colored log output
    from websauna.system.devop.cmdline import init_websauna
    request = init_websauna(config_uri, sanity_check=True)

    services = ServiceCore.parse_network_config(request)
    one_shot = OneShot(request, network_name, services[network_name], require_unlock=False)
    one_shot.setup()

    coinbase = one_shot.web3.eth.coinbase

    pw = getpass("Give password to unlock {} on {}:".format(coinbase, network_name))

    one_shot.web3.personal.unlockAccount(coinbase, pw, 30*24*3600)

    print("Unlock complete")
    sys.exit(0)
Example #3
0
def update_networks(self: Task):
    """Update all incoming and outgoing events from a network through Celery.

    Offer an alternative for runnign standalone ethereum-service.
    """

    request = self.request.request
    redis = get_redis(request)

    # Get list of configured networks
    services = ServiceCore.parse_network_config(request)

    for network_name in services.keys():
        # Update each network separately and have a lock to ensure we don't
        # accidentally do two overlapping update runs
        # https://pypi.python.org/pypi/python-redis-lock
        lock = redis_lock.Lock(redis, "network-update-lock-{}".format(network_name))

        if not lock.acquire(blocking=False):
            # This network is still procesing pending operations from the previous task run

            lock_acquired_at = redis.get("network-update-lock-started-{}".format(network_name))
            lock_acquired_by = redis.get("network-update-lock-started-by-{}".format(network_name))

            if lock_acquired_by:
                lock_acquired_by = lock_acquired_by.decode("utf-8")

            if lock_acquired_at:
                try:
                    friendly_at = datetime.datetime.utcfromtimestamp(lock_acquired_at)
                except:
                    friendly_at = 0

                diff = time.time() - float(lock_acquired_at)
                if diff > BAD_LOCK_TIMEOUT:
                    logger.warn("Failed to get wallet update lock on %s network when doing update_networks for %f seconds, originally acquired by %s at %s", network_name, diff, friendly_at, lock_acquired_by)

            continue

        lock.release()

        with lock:
            redis.set("network-update-lock-started-{}".format(network_name), time.time())
            redis.set("network-update-lock-started-by-{}".format(network_name), "process: {} thread:{}".format(os.getpid(), threading.current_thread()))

            logger.info("Updating network %s", network_name)
            start = time.time()
            one_shot = OneShot(request, network_name, services[network_name])
            one_shot.run_shot()
            logger.info("Updated network %s in %d seconds", network_name, time.time() - start)

            redis.delete("network-update-lock-started-{}".format(network_name))
            redis.delete("network-update-lock-started-by-{}".format(network_name))

            request.registry.notify(ServiceUpdated(request, network_name, time.time() - start))
Example #4
0
def update_networks(self: Task):
    """Update all incoming and outgoing events from a network through Celery.

    Offer an alternative for runnign standalone ethereum-service.
    """

    request = self.request.request
    redis = get_redis(request)

    # Get list of configured networks
    services = ServiceCore.parse_network_config(request)

    for network_name in services.keys():
        # Update each network separately and have a lock to ensure we don't
        # accidentally do two overlapping update runs
        # https://pypi.python.org/pypi/python-redis-lock
        lock = redis_lock.Lock(redis, "network-update-lock-{}".format(network_name))

        if not lock.acquire(blocking=False):
            # This network is still procesing pending operations from the previous task run

            lock_acquired_at = redis.get("network-update-lock-started-{}".format(network_name))
            lock_acquired_by = redis.get("network-update-lock-started-by-{}".format(network_name))

            if lock_acquired_by:
                lock_acquired_by = lock_acquired_by.decode("utf-8")

            if lock_acquired_at:
                try:
                    friendly_at = datetime.datetime.utcfromtimestamp(lock_acquired_at)
                except:
                    friendly_at = 0

                diff = time.time() - float(lock_acquired_at)
                if diff > BAD_LOCK_TIMEOUT:
                    logger.warn(
                        "Failed to get wallet update lock on %s network when doing update_networks for %f seconds, originally acquired by %s at %s",
                        network_name,
                        diff,
                        friendly_at,
                        lock_acquired_by,
                    )

            continue

        lock.release()

        with lock:
            redis.set("network-update-lock-started-{}".format(network_name), time.time())
            redis.set(
                "network-update-lock-started-by-{}".format(network_name),
                "process: {} thread:{}".format(os.getpid(), threading.current_thread()),
            )

            logger.info("Updating network %s", network_name)
            start = time.time()
            one_shot = OneShot(request, network_name, services[network_name])
            one_shot.run_shot()
            logger.info("Updated network %s in %d seconds", network_name, time.time() - start)

            request.registry.notify(ServiceUpdated(request, network_name, time.time() - start))