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))
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))
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))
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 = []
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))
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))
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))