From 0f543c80e9ab2e9fb0e3f12ff0f0a21da1afbdd1 Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Thu, 12 Aug 2021 13:07:57 -0400 Subject: [PATCH] Add a more specific error if we have a guess about nodename If a manual add procedure has not specified a mac or uuid, but the discovery framework has a guess about it, have that guess appear in events with suggestion on how to proceed. --- confluent_server/confluent/discovery/core.py | 9 ++++- .../confluent/discovery/protocols/pxe.py | 34 +++++++++++++++---- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/confluent_server/confluent/discovery/core.py b/confluent_server/confluent/discovery/core.py index 10e646b7..d1bc65d7 100644 --- a/confluent_server/confluent/discovery/core.py +++ b/confluent_server/confluent/discovery/core.py @@ -912,6 +912,13 @@ def get_nodename_from_chained_smms(cfg, handler, info): nodename = newnodename return nodename +def get_node_guess_by_uuid(uuid): + for mac in known_uuids.get(uuid, {}): + nodename = known_uuids[uuid][mac].get('nodename', None) + if nodename: + return nodename + return None + def get_node_by_uuid_or_mac(uuidormac): node = pxe.macmap.get(uuidormac, None) if node is not None: @@ -1326,7 +1333,7 @@ def stop_autosense(): def start_autosense(): autosensors.add(eventlet.spawn(slp.snoop, safe_detected, slp)) - autosensors.add(eventlet.spawn(pxe.snoop, safe_detected, pxe)) + autosensors.add(eventlet.spawn(pxe.snoop, safe_detected, pxe, get_node_guess_by_uuid)) nodes_by_fprint = {} diff --git a/confluent_server/confluent/discovery/protocols/pxe.py b/confluent_server/confluent/discovery/protocols/pxe.py index 5e1d41be..49321042 100644 --- a/confluent_server/confluent/discovery/protocols/pxe.py +++ b/confluent_server/confluent/discovery/protocols/pxe.py @@ -301,7 +301,7 @@ def start_proxydhcp(): eventlet.spawn_n(proxydhcp) -def snoop(handler, protocol=None): +def snoop(handler, protocol=None, nodeguess=None): #TODO(jjohnson2): ipv6 socket and multicast for DHCPv6, should that be #prominent #TODO(jjohnson2): enable unicast replies. This would suggest either @@ -399,7 +399,7 @@ def snoop(handler, protocol=None): and time.time() > ignoredisco.get(netaddr, 0) + 60): ignoredisco[netaddr] = time.time() handler(info) - consider_discover(info, rqinfo, net4, cfg, rqv) + consider_discover(info, rqinfo, net4, cfg, rqv, nodeguess) except Exception as e: tracelog.log(traceback.format_exc(), ltype=log.DataTypes.event, event=log.Events.stacktrace) @@ -638,7 +638,7 @@ def ack_request(pkt, rq, info): repview[26:28] = struct.pack('!H', datasum) send_raw_packet(repview, len(rply), rq, info) -def consider_discover(info, packet, sock, cfg, reqview): +def consider_discover(info, packet, sock, cfg, reqview, nodeguess): if info.get('hwaddr', None) in macmap and info.get('uuid', None): check_reply(macmap[info['hwaddr']], info, packet, sock, cfg, reqview) elif info.get('uuid', None) in uuidmap: @@ -648,10 +648,30 @@ def consider_discover(info, packet, sock, cfg, reqview): elif info.get('uuid', None) and info.get('hwaddr', None): if time.time() > ignoremacs.get(info['hwaddr'], 0) + 90: ignoremacs[info['hwaddr']] = time.time() - log.log( - {'info': 'No node matches boot attempt from uuid {0} or hardware address {1}'.format( - info['uuid'], info['hwaddr'] - )}) + maybenode = None + if nodeguess: + maybenode = nodeguess(info['uuid']) + if maybenode: + # originally was going to just offer up the node (the likely + # scenario is that it was manually added, autodiscovery picked + # up the TLS match, and correlated) + # However, since this is technically unverified data, we shouldn't + # act upon it until confirmed by process or user + # So instead, offer a hint about what is probably the case, but + # hasn't yet been approved by anything + log.log( + {'info': 'Boot attempt from uuid {0} or hardware ' + 'address {1}, which is not confirmed to be a ' + 'node, but seems to be {2}. To confirm node ' + 'identity, \'nodediscover reassign -n {2}\' or ' + '\'nodeattrib {2} id.uuid={0}\''.format( + info['uuid'], info['hwaddr'], maybenode + )}) + else: + log.log( + {'info': 'No node matches boot attempt from uuid {0} or hardware address {1}'.format( + info['uuid'], info['hwaddr'] + )}) if __name__ == '__main__':