2
0
mirror of https://github.com/xcat2/confluent.git synced 2026-09-12 04:26:26 +00:00

Have rescan -a find generic-ssh, generic-https, and generic-redfish

Going from generic-redfish as most specific, then generic-https, and generic-ssh being for ssh-only targets.

For generic-https and generic-ssh, the available ports are specified so code can know if https *also* has port 22 available.
This commit is contained in:
Jarrod Johnson
2026-09-11 14:06:16 -04:00
parent fc1790ed80
commit 4f4eeefddb
3 changed files with 39 additions and 9 deletions
+32 -6
View File
@@ -130,6 +130,9 @@ nodehandlers = {
'onie-switch': None,
'cumulus-switch': None,
'affluent-switch': None,
'generic-redfish': None,
'generic-https': None,
'generic-ssh': None,
#'openbmc': None,
'service:io-device.Lenovo:management-module': None,
'service:thinkagile-storage': cpstorage,
@@ -148,6 +151,9 @@ servicenames = {
'lenovo-xcc3': 'lenovo-xcc3',
'megarac-bmc': 'megarac-bmc',
'megware-chassis': 'megware-chassis',
'generic-redfish': 'generic-redfish',
'generic-https': 'generic-https',
'generic-ssh': 'generic-ssh',
#'openbmc': 'openbmc',
'service:management-hardware.IBM:integrated-management-module2': 'lenovo-imm2',
'service:io-device.Lenovo:management-module': 'lenovo-switch',
@@ -166,6 +172,9 @@ servicebyname = {
'lenovo-xcc': 'lenovo-xcc',
'lenovo-xcc3': 'lenovo-xcc3',
'megarac-bmc': 'megarac-bmc',
'generic-redfish': 'generic-redfish',
'generic-https': 'generic-https',
'generic-ssh': 'generic-ssh',
'megware-chassis': 'megware-chassis',
'lenovo-imm2': 'service:management-hardware.IBM:integrated-management-module2',
'lenovo-switch': 'service:io-device.Lenovo:management-module',
@@ -1714,18 +1723,35 @@ async def blocking_scan(aggressive=False):
continue
if hwaddr in known_info:
continue
gencheckers.append(generic_eval(ipa))
gencheckers.append(generic_eval(ipa, hwaddr))
if gencheckers:
await asyncio.gather(*gencheckers, return_exceptions=True)
scanner = None
async def generic_eval(address):
peerdata = {'addresses': [(address, 443)]}
resdata = await ssdp.check_fish(('/redfish/v1/', peerdata))
if not resdata:
async def generic_eval(address, hwaddr):
ports = await netutil.peer_reachable(address)
if not ports:
return None
safe_detected(resdata)
cloop = asyncio.get_running_loop()
addrinfo = await cloop.getaddrinfo(
address, 443, family=socket.AF_INET6, type=socket.SOCK_STREAM)
if not addrinfo:
return None
sockaddr = addrinfo[0][4]
peerdata = {'addresses': [sockaddr], 'hwaddr': hwaddr, 'openports': ports}
if 443 in ports:
resdata = await ssdp.check_fish(('/redfish/v1/', peerdata))
if resdata:
return safe_detected(resdata)
peerdata['services'] = ['generic-https']
if 'services' not in peerdata and 22 in ports:
sockaddr = (sockaddr[0], 22) + tuple(sockaddr[2:])
peerdata['addresses'] = [sockaddr]
peerdata['services'] = ['generic-ssh']
if 'services' in peerdata:
safe_detected(peerdata)
def start_detection():
@@ -534,7 +534,7 @@ async def check_fish(urldata, port=443, verifycallback=None):
url, data, targtype = urldata
except ValueError:
url, data = urldata
targtype = 'service:redfish-bmc'
targtype = 'generic-redfish'
try:
wc = webclient.WebConnection(_get_svrip(data), port, verifycallback=verifycallback, timeout=3)
peerinfo = await wc.grab_json_response(url, headers={'Accept': 'application/json', 'Host': 'credible-bmc'})
+6 -2
View File
@@ -92,7 +92,7 @@ async def peer_reachable(address):
try:
conn = await asyncio.wait_for(
asyncio.open_connection(address, port), timeout=0.5)
return True
return port
except Exception:
return False
finally:
@@ -101,7 +101,11 @@ async def peer_reachable(address):
await conn[1].wait_closed()
testtasks.append(check_port(port))
results = await asyncio.gather(*testtasks, return_exceptions=True)
return any(not isinstance(r, Exception) and r for r in results)
reachable_ports = []
for res in results:
if not isinstance(res, Exception) and res:
reachable_ports.append(res)
return reachable_ports
async def add_zone(lla):