
On en profite pour mettre le résultat dans /usr/script/var/tv/ à la fois une version textuelle (similaire au fichier anciennement produit par le binaire recup_sap) et un pickle d'un dictionnaire python.
48 lines
1.1 KiB
Python
Executable file
48 lines
1.1 KiB
Python
Executable file
#!/usr/bin/env python
|
|
import socket
|
|
import struct
|
|
import time
|
|
import pickle
|
|
import os
|
|
|
|
MCAST_GRP = '224.2.127.254' # sap.mcast.net
|
|
MCAST_PORT = 9875
|
|
timeout=60
|
|
path='/usr/scripts/var/tv/sap.txt'
|
|
pickeled_path='/usr/scripts/var/tv/sap.pickel'
|
|
|
|
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
|
|
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
sock.bind(('', MCAST_PORT))
|
|
mreq = struct.pack("4sl", socket.inet_aton(MCAST_GRP), socket.INADDR_ANY)
|
|
|
|
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
|
|
|
|
service={}
|
|
|
|
start=time.time()
|
|
while True:
|
|
msg=sock.recv(10240).split('\r\n')
|
|
# print msg
|
|
s=None
|
|
ip=None
|
|
for line in msg[:-1]:
|
|
(tag, value) = line.split('=', 1)
|
|
if tag=='s':
|
|
s=value
|
|
if tag=='c':
|
|
ip=value.split(' ')[2].split('/')[0]
|
|
service[s]=ip
|
|
print "%s: %s" % (s, ip)
|
|
if time.time() - start > timeout:
|
|
break
|
|
|
|
f=open(path, 'w')
|
|
l=service.items()
|
|
l.sort()
|
|
for (name, ip) in l:
|
|
f.write("%s:%s\n" % (name, ip))
|
|
f.close()
|
|
|
|
pickle.dump(service, open(pickeled_path + '.tmp', 'w'))
|
|
os.rename(pickeled_path + '.tmp', pickeled_path)
|