diff --git a/misc/ssdpscan.py b/misc/ssdpscan.py new file mode 100644 index 00000000..c296f91c --- /dev/null +++ b/misc/ssdpscan.py @@ -0,0 +1,42 @@ + +from select import select +import socket +import sys +import socket + +def scan_nicname(nicname): + idx = int(open('/sys/class/net/{}/ifindex'.format(nicname)).read()) + return scan_nic(idx) + +def scan_nic(nicidx): + known_peers = {} + srvs = {} + s6 = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM) + s6.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 1) + s6.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) + s6.bind(('::', 0)) + msg = b'M-SEARCH * HTTP/1.1\r\nHOST: [ff02::c]:1900\r\nMAN: "ssdp:discover"\r\nST: urn:dmtf-org:service:redfish-rest:1\r\nMX: 3\r\n\r\n' + s6.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, nicidx) + x = [False,] + tries=5 + s6.sendto(msg, ('ff02::c', 1900)) + x = select((s6,), (), (), 3.0) + while x[0]: + (rsp, peer) = s6.recvfrom(9000) + x = select((s6,), (), (), 0.5) + if peer in known_peers: + continue + known_peers[peer] = 1 + if '%' not in peer[0]: + peer = list(peer) + peer[0] = '{}%{}'.format(peer[0], nicidx) + print("Received Redfish response from {}".format(peer[0])) + + + +def main(): + scan_nicname(sys.argv[1]) + + +if __name__ == '__main__': + main()