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 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 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))
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))
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))
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_valid_msg(): res = valid_announce_msg('deadbeef00') assert res is True
def test_invalid_msg(): msgs = ['deadbeeh00', 'deadbeef0', 'deadbeef000'] for msg in msgs: with pytest.raises(AssertionError): res = valid_announce_msg(msg)