1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
#!/usr/bin/python
# Copyright (C) 2011 Gluster, Inc. <http://www.gluster.com>
# This file is part of Gluster Management Gateway.
#
import os
import sys
p1 = os.path.abspath(os.path.dirname(sys.argv[0]))
p2 = "%s/common" % os.path.dirname(p1)
if not p1 in sys.path:
sys.path.append(p1)
if not p2 in sys.path:
sys.path.append(p2)
import socket
import select
import signal
import random
import string
import Utils
import Globals
running = True
def exitHandler(signum, frame):
running = False
def sendMulticastRequest(idString):
multicastSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
multicastSocket.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
multicastSocket.sendto("%s,%s,%s\n" % (Globals.GLUSTER_PROBE_STRING, Globals.GLUSTER_PROBE_VERSION, idString),
(Globals.MULTICAST_GROUP, Globals.MULTICAST_PORT))
return multicastSocket
def openServerSocket():
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('', Globals.SERVER_PORT))
server.listen(Globals.DEFAULT_BACKLOG)
return server
def main():
signal.signal(signal.SIGINT, exitHandler)
signal.signal(signal.SIGTERM, exitHandler)
signal.signal(signal.SIGALRM, exitHandler)
idString = ''.join(random.choice(string.ascii_lowercase +
string.ascii_uppercase +
string.digits) for x in range(Globals.DEFAULT_ID_LENGTH))
multicastSocket = sendMulticastRequest(idString)
serverInfoDict = {}
serverSocket = openServerSocket()
rlist = [serverSocket]
signal.alarm(Globals.DEFAULT_TIMEOUT)
while running:
try:
ilist,olist,elist = select.select(rlist, [], [], 0.25)
except select.error, e:
break
for sock in ilist:
# handle new connection
if sock == serverSocket:
clientSocket, address = serverSocket.accept()
#print "connection from %s on %s" % (address, clientSocket)
rlist.append(clientSocket)
continue
# handle all other sockets
data = sock.recv(Globals.DEFAULT_BUFSIZE)
if not data:
#print "closing socket %s" % sock
sock.close()
rlist.remove(sock)
tokens = data.strip().split(",")
if len(tokens) != 6:
continue
if not (tokens[0] == Globals.GLUSTER_PROBE_STRING and \
tokens[1] == Globals.GLUSTER_PROBE_VERSION and \
tokens[2] == idString):
continue
serverInfoDict[tokens[3]] = [tokens[4], tokens[5]]
#print "closing socket %s" % sock
sock.close()
rlist.remove(sock)
for sock in rlist:
sock.close()
for k, v in serverInfoDict.iteritems():
if v[0]:
print v[0]
else:
print k
sys.exit(0)
if __name__ == "__main__":
main()
|