summaryrefslogtreecommitdiffstats
path: root/src/com.gluster.storage.management.gateway/WebContent/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'src/com.gluster.storage.management.gateway/WebContent/scripts')
-rw-r--r--src/com.gluster.storage.management.gateway/WebContent/scripts/Globals.py10
-rwxr-xr-xsrc/com.gluster.storage.management.gateway/WebContent/scripts/multicast-discover-servers.py158
2 files changed, 91 insertions, 77 deletions
diff --git a/src/com.gluster.storage.management.gateway/WebContent/scripts/Globals.py b/src/com.gluster.storage.management.gateway/WebContent/scripts/Globals.py
index f8a07c25..89d3d098 100644
--- a/src/com.gluster.storage.management.gateway/WebContent/scripts/Globals.py
+++ b/src/com.gluster.storage.management.gateway/WebContent/scripts/Globals.py
@@ -16,7 +16,15 @@
# <http://www.gnu.org/licenses/>.
MULTICAST_GROUP = '224.224.1.1'
-MULTICAST_PORT = 5353
+MULTICAST_PORT = 24729
+GLUSTER_PROBE_STRING = "GLUSTERPROBE"
+GLUSTER_PROBE_VERSION = "1.0.0"
+DEFAULT_BUFSIZE = 1024
+SERVER_PORT = 24731
+DEFAULT_BACKLOG = 5
+DEFAULT_TIMEOUT = 3
+DEFAULT_ID_LENGTH = 16
+
GLUSTER_PLATFORM_VERSION = "3.2"
## System configuration constants
diff --git a/src/com.gluster.storage.management.gateway/WebContent/scripts/multicast-discover-servers.py b/src/com.gluster.storage.management.gateway/WebContent/scripts/multicast-discover-servers.py
index 3c281f34..3c0dfcc4 100755
--- a/src/com.gluster.storage.management.gateway/WebContent/scripts/multicast-discover-servers.py
+++ b/src/com.gluster.storage.management.gateway/WebContent/scripts/multicast-discover-servers.py
@@ -1,20 +1,7 @@
#!/usr/bin/python
-# Copyright (C) 2009 Gluster, Inc. <http://www.gluster.com>
-# This file is part of Gluster Storage Platform.
-#
-# Gluster Storage Platform is free software; you can redistribute it
-# and/or modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 3 of
-# the License, or (at your option) any later version.
-#
-# Gluster Storage Platform is distributed in the hope that it will be
-# useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see
-# <http://www.gnu.org/licenses/>.
+# Copyright (C) 2011 Gluster, Inc. <http://www.gluster.com>
+# This file is part of Gluster Management Gateway.
+#
import os
import sys
@@ -25,73 +12,92 @@ if not p1 in sys.path:
if not p2 in sys.path:
sys.path.append(p2)
import socket
+import select
import signal
-import struct
-import syslog
-import Globals
-import time
+import random
+import string
import Utils
-from XmlHandler import *
-
-class TimeoutException(Exception):
- pass
-
-def timeoutSignal(signum, frame):
- raise TimeoutException, "Timed out"
-
-def serverDiscoveryRequest(multiCastGroup, port):
- servers = []
- # Sending request to all the servers
- socketSend = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
- socketSend.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
- socketSend.sendto("ServerDiscovery", (multiCastGroup, port))
-
- # Waiting for the response
- socketReceive = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
- socketReceive.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- socketReceive.bind(('', port))
- mreq = struct.pack("4sl", socket.inet_aton(multiCastGroup), socket.INADDR_ANY)
-
- socketReceive.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
- sendtime = time.time()
- socketSend.sendto("<request><name>ServerDiscovery</name><time>%s</time></request>" % (sendtime), (multiCastGroup, port))
-
- try:
- while True:
- response = socketReceive.recvfrom(200)
- if not response:
+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
- dom = XDOM()
- dom.parseString(response[0])
- if not dom:
+
+ # 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 dom.getTextByTagRoute("request.name"):
+ if not (tokens[0] == Globals.GLUSTER_PROBE_STRING and \
+ tokens[1] == Globals.GLUSTER_PROBE_VERSION and \
+ tokens[2] == idString):
continue
- responsetime = dom.getTextByTagRoute("response.time")
- servername = dom.getTextByTagRoute("response.servername")
- if responsetime == str(sendtime):
- servers.append(servername)
- signal.signal(signal.SIGALRM, timeoutSignal)
- signal.alarm(3)
- except TimeoutException:
- return servers
- return None
+ 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
-def main():
- syslog.openlog("discovery server request")
- servers = serverDiscoveryRequest(Globals.MULTICAST_GROUP, Globals.MULTICAST_PORT)
- if not servers:
- Utils.log(syslog.LOG_ERR, "Failed to discover new servers")
- sys.exit(-1)
-
- servers = set(servers)
- try:
- for server in servers:
- print server
- except IOError:
- Utils.log(syslog.LOG_ERR, "Unable to open file %s" % Globals.DISCOVERED_SERVER_LIST_FILENAME)
- sys.exit(-1)
sys.exit(0)
+
if __name__ == "__main__":
main()