Esempio n. 1
0
def offline(msg):
    """
    Process offline node msg (validate and add to offline_q).
    :param str node ID: zerotier node identity
    :return: str node ID
    """
    if valid_announce_msg(msg):
        clean_stale_cfgs(msg, cfg_q)
        node_data = lookup_node_id(msg, tmp_q)
        if node_data:
            logger.info('Got valid offline msg from host {} (node {})'.format(
                node_data[msg], msg))
        with off_q.transact():
            add_one_only(msg, off_q)
        with cln_q.transact():
            add_one_only(msg, cln_q)  # track offline node id for cleanup
        with pub_q.transact():
            clean_from_queue(msg, pub_q)
        logger.debug('Node ID {} cleaned from pub_q'.format(msg))
        return msg
    else:
        node_data = lookup_node_id(msg, tmp_q)
        if node_data:
            logger.warning('Bad offline msg from host {} (node {})'.format(
                node_data[msg], msg))
        else:
            logger.warning('Bad offline msg: {}'.format(msg))
Esempio n. 2
0
def echo(ver_msg):
    """
    Process valid node msg/queues, ie, msg must contain a valid node ID
    and version (where "valid" version is >= minimum baseline version).
    Old format conatins only the node ID string, new format is JSON msg
    with node ID and `fpnd` version string.
    :param ver_msg: node ID or json
    :return: parsed msg if version is valid, else UPGRADE msg
    """
    msg = parse_version_msg(ver_msg)
    min_ver = '0.9.6'

    if msg != []:
        if valid_announce_msg(msg[0]):
            logger.debug('Got valid announce msg: {}'.format(msg))
            clean_stale_cfgs(msg[0], cfg_q)
            node_data = lookup_node_id(msg[0], tmp_q)
            if node_data:
                logger.info('Got valid announce msg from host {} (node {})'.format(node_data[msg[0]], msg))
            if valid_version(min_ver, msg[1]):
                handle_announce_msg(node_q, reg_q, wait_q, msg[0])
                reply = make_version_msg(msg[0])
                logger.info('Got valid node version: {}'.format(msg))
            else:
                reply = make_version_msg(msg[0], 'UPGRADE_REQUIRED')
                logger.error('Invalid version from host {} is: {} < {}'.format(node_data[msg[0]], msg, min_ver))
            return reply
        else:
            node_data = lookup_node_id(msg, tmp_q)
            if node_data:
                logger.warning('Bad announce msg from host {} (node {})'.format(node_data[msg[0]], msg))
            else:
                logger.warning('Bad announce msg: {}'.format(msg))
    else:
        logger.error('Could not parse version msg: {}'.format(msg))
Esempio n. 3
0
def get_node_cfg(msg):
    """
    Process valid cfg msg, ie, msg must be a valid node ID.
    :param str node ID: zerotier node identity
    :return: str JSON object with node ID and network ID(s)
    """
    import json

    if valid_announce_msg(msg):
        node_data = lookup_node_id(msg, tmp_q)
        if node_data:
            logger.info(
                'Got valid cfg request msg from host {} (node {})'.format(
                    node_data[msg], msg))
        res = wait_for_cfg_msg(cfg_q, hold_q, reg_q, msg)
        logger.debug('hold_q size: {}'.format(len(list(hold_q))))
        if res:
            logger.info('Got cfg result: {}'.format(res))
            return res
        else:
            logger.debug('Null result for ID: {}'.format(msg))
            # raise ServiceError
    else:
        node_data = lookup_node_id(msg, tmp_q)
        if node_data:
            logger.warning('Bad cfg msg from host {} (node {})'.format(
                node_data[msg], msg))
        else:
            logger.warning('Bad cfg msg: {}'.format(msg))
Esempio n. 4
0
def handle_msg(msg):
    if valid_announce_msg(msg):
        logger.debug('Got valid node ID: {}'.format(msg))
        with node_q.transact():
            node_q.append(msg)
        logger.debug('Adding node id: {}'.format(msg))
        logger.info('{} nodes in node queue'.format(len(node_q)))
    else:
        logger.warning('Bad node msg is {}'.format(msg))
Esempio n. 5
0
def wedged(msg):
    """
    Process wedged node msg (validate and add to wedge_q).
    """
    if valid_announce_msg(msg):
        logger.debug('Got valid wedged msg: {}'.format(msg))
        with wdg_q.transact():
            add_one_only(msg, wdg_q)
        logger.debug('Added node id: {}'.format(msg))
        logger.info('{} nodes in wedged queue'.format(len(wdg_q)))
    else:
        logger.warning('Bad wedged msg is {}'.format(msg))
Esempio n. 6
0
def offline(msg):
    """
    Process offline node msg (validate and add to offline_q).
    """
    if valid_announce_msg(msg):
        logger.debug('Got valid offline msg: {}'.format(msg))
        with off_q.transact():
            add_one_only(msg, off_q)
        logger.debug('Added node id: {}'.format(msg))
        logger.info('{} nodes in offline queue'.format(len(off_q)))
    else:
        logger.warning('Bad offline msg is {}'.format(msg))
Esempio n. 7
0
def wedged(msg):
    """
    Process wedged node msg (validate and add to wedge_q). Note these
    are currently disabled for testing.
    :param str node ID: zerotier node identity
    :return: str node ID
    """
    if valid_announce_msg(msg):
        node_data = lookup_node_id(msg, tmp_q)
        if node_data:
            logger.info('Got valid wedged msg from host {} (node {})'.format(node_data[msg], msg))
        with wdg_q.transact():
            # re-enable msg processing for testing
            add_one_only(msg, wdg_q)
        return msg
    else:
        node_data = lookup_node_id(msg, tmp_q)
        if node_data:
            logger.info('Bad wedged msg from host {} (node {})'.format(node_data[msg], msg))
        else:
            logger.warning('Bad wedged msg: {}'.format(msg))
Esempio n. 8
0
def echo(msg):
    """
    Process valid node msg/queues, ie, msg must be a valid node ID.
    :param str node ID: zerotier node identity
    :return: str node ID
    """
    if valid_announce_msg(msg):
        logger.debug('Got valid announce msg: {}'.format(msg))
        clean_stale_cfgs(msg, cfg_q)
        handle_announce_msg(node_q, reg_q, wait_q, msg)
        node_data = lookup_node_id(msg, tmp_q)
        if node_data:
            logger.info('Got valid announce msg from host {} (node {})'.format(
                node_data[msg], msg))
        return msg
    else:
        node_data = lookup_node_id(msg, tmp_q)
        if node_data:
            logger.info('Bad announce msg from host {} (node {})'.format(
                node_data[msg], msg))
        else:
            logger.warning('Bad announce msg: {}'.format(msg))
Esempio n. 9
0
def test_valid_msg():
    res = valid_announce_msg('deadbeef00')
    assert res is True
Esempio n. 10
0
def test_invalid_msg():
    msgs = ['deadbeeh00', 'deadbeef0', 'deadbeef000']
    for msg in msgs:
        with pytest.raises(AssertionError):
            res = valid_announce_msg(msg)