示例#1
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))
示例#2
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))
示例#3
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))
示例#4
0
def test_populate_leaf_list():
    import diskcache as dc
    from node_tools import state_data as st

    node_q = dc.Deque(directory='/tmp/test-nq')
    wait_q = dc.Deque(directory='/tmp/test-wq')
    tmp_q = dc.Deque(directory='/tmp/test-tq')
    node_q.clear()
    wait_q.clear()
    tmp_q.clear()
    node_q.append('beef9f73c6')

    peers = get_peer_status(cache)
    # print(peers)
    for peer in peers:
        if peer['role'] == 'LEAF':
            populate_leaf_list(node_q, wait_q, tmp_q, peer)
            assert len(st.leaf_nodes) == 1
            assert st.leaf_nodes[0]['beef9f73c6'] == '134.47.250.137'

    node_q.clear()
    wait_q.append('beef9f73c6')
    for peer in peers:
        if peer['role'] == 'LEAF':
            populate_leaf_list(node_q, wait_q, tmp_q, peer)
            assert len(st.leaf_nodes) == 1
            assert st.leaf_nodes[0]['beef9f73c6'] == '134.47.250.137'

    res = lookup_node_id('beef9f73c6', tmp_q)
    assert res['beef9f73c6'] == '134.47.250.137'
    assert len(tmp_q) == 1

    node_update = dict({'beef9f73c6': '134.47.250.42'})
    avoid_and_update('beef9f73c6', node_update, tmp_q)

    res = lookup_node_id('beef9f73c6', tmp_q)
    assert res['beef9f73c6'] == '134.47.250.42'
    assert len(tmp_q) == 1

    wait_q.clear()
    tmp_q.clear()
    st.leaf_nodes = []
示例#5
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))
示例#6
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))
示例#7
0
    def test_clean_from_queue(self):
        self.node_q.append(self.node1)
        self.node_q.append(self.node2)
        self.node_q.append(self.node3)
        self.node_q.append(self.node1)

        clean_from_queue(self.node1, self.node_q)
        self.assertNotIn(self.node1, list(self.node_q))
        # print(list(self.node_q))

        self.dict1 = {self.node1: '127.0.0.1'}
        self.dict2 = {self.node2: '127.0.0.1'}
        self.node_q.append(self.dict1)
        self.node_q.append(self.dict2)
        self.node_q.append(self.dict1)
        self.node_q.append(self.dict2)
        res = lookup_node_id(self.node1, self.node_q)
        self.assertEqual(res, self.dict1)
        clean_from_queue(self.dict1, self.node_q)
        # print(list(self.node_q))
        res = lookup_node_id(self.node1, self.node_q)
        self.assertIsNone(res)
        self.assertNotIn(self.dict1, list(self.node_q))
        self.assertIn(self.dict2, list(self.node_q))