diff options
Diffstat (limited to 'src')
5 files changed, 139 insertions, 136 deletions
diff --git a/src/com.gluster.storage.management.server.scripts/src/DiskUtils.py b/src/com.gluster.storage.management.server.scripts/src/DiskUtils.py index 69417f88..03c5019e 100644 --- a/src/com.gluster.storage.management.server.scripts/src/DiskUtils.py +++ b/src/com.gluster.storage.management.server.scripts/src/DiskUtils.py @@ -18,9 +18,10 @@ import os import glob import dbus - +import syslog import Globals -from Utils import * +import Common +import Utils ONE_MB_SIZE = 1048576 @@ -240,3 +241,68 @@ def getMountPointByUuid(partitionUuid): if entry.split()[0] == "UUID=" + partitionUuid: return entry.split()[1] return None + + +def getDiskSizeInfo(partition): + # get values from df output + total = None + used = None + free = None + command = "df -kl -t ext3 -t ext4 -t xfs" + rv = Utils.runCommandFG(command, stdout=True, root=True) + message = Common.stripEmptyLines(rv["Stdout"]) + if rv["Stderr"]: + Common.log(syslog.LOG_ERR, "failed to get disk details. %s" % Common.stripEmptyLines(rv["Stdout"])) + return None, None, None + for line in rv["Stdout"].split("\n"): + tokens = line.split() + if len(tokens) < 4: + continue + if tokens[0] == partition: + total = int(tokens[1]) / 1024.0 + used = int(tokens[2]) / 1024.0 + free = int(tokens[3]) / 1024.0 + break + + if total: + return total, used, free + + # get total size from parted output + for i in range(len(partition), 0, -1): + pos = i - 1 + if not partition[pos].isdigit(): + break + disk = partition[:pos+1] + partitionNumber = partition[pos+1:] + if not partitionNumber.isdigit(): + return None, None, None + + number = int(partitionNumber) + command = "parted -ms %s unit kb print" % disk + rv = Utils.runCommandFG(command, stdout=True, root=True) + message = Common.stripEmptyLines(rv["Stdout"]) + if rv["Stderr"]: + Common.log(syslog.LOG_ERR, "failed to get disk details. %s" % Common.stripEmptyLines(rv["Stdout"])) + return None, None, None + + lines = rv["Stdout"].split(";\n") + if len(lines) < 3: + return None,None,None + + for line in lines[2:]: + tokens = line.split(':') + if len(tokens) < 4: + continue + if tokens[0] == str(number): + total = int(tokens[3].split('kB')[0]) / 1024.0 + break + return total, used, free + + +def refreshHal(): + rv = Utils.runCommandFG(["lshal"], stdout=True, root=True) + if rv["Stderr"]: + error = Common.stripEmptyLines(rv["Stderr"]) + Common.log(syslog.LOG_ERR, "failed to execute lshal command. Error: %s" % error) + return False + return True diff --git a/src/com.gluster.storage.management.server.scripts/src/Utils.py b/src/com.gluster.storage.management.server.scripts/src/Utils.py index f9b3254b..6e33af0b 100644 --- a/src/com.gluster.storage.management.server.scripts/src/Utils.py +++ b/src/com.gluster.storage.management.server.scripts/src/Utils.py @@ -369,6 +369,7 @@ def getMeminfo(): continue # skip lines that don't parse key, value = match.groups(['key', 'value']) result[key] = int(value) + result['MemUsed'] = (result['MemTotal'] - result['MemFree']) return result @@ -397,7 +398,12 @@ def getLoadavg(): - Number of threads/processes that exist on the system (int) - The PID of the most recently-created process on the system (int) """ - loadavgstr = open('/proc/loadavg', 'r').readline().strip() + try: + loadavgstr = open('/proc/loadavg', 'r').readline().strip() + except IOError: + syslog.syslog(syslog.LOG_ERR, "failed to find cpu load") + return None + data = loadavgstr.split() avg1, avg5, avg15 = map(float, data[:3]) threads_and_procs_running, threads_and_procs_total = map(int, @@ -410,7 +416,7 @@ def getLoadavg(): # Linux ncpus = os.sysconf("SC_NPROCESSORS_ONLN") if isinstance(ncpus, int) and ncpus > 0: - final_avg = "%.2f" % (1.0 * avg1 / ncpus) + final_avg = "%.4f" % (1.0 * avg1 / ncpus) # Future return everything when needed # Commenting this for the time being @@ -703,3 +709,6 @@ def removeFile(fileName, root=False): def isLiveMode(): return os.path.exists(Globals.LIVE_MODE_FILE) + +def convertKbToMb(kb): + return kb / 1024.0 diff --git a/src/com.gluster.storage.management.server.scripts/src/get_server_details.py b/src/com.gluster.storage.management.server.scripts/src/get_server_details.py index aac1e5e1..079c5f5b 100755 --- a/src/com.gluster.storage.management.server.scripts/src/get_server_details.py +++ b/src/com.gluster.storage.management.server.scripts/src/get_server_details.py @@ -22,6 +22,8 @@ import socket import Globals import Commands import re +import Common +import DiskUtils from ServerUtils import * from Protocol import * from NetworkUtils import * @@ -29,107 +31,41 @@ from Disk import * from XmlHandler import ResponseXml from optparse import OptionParser -def getDiskSizeInfo(partition): - # get values from df output - total = None - used = None - free = None - commandList = ['df', '-kl', '-t', 'ext3', '-t', 'ext4'] - commandOutput = "" - try: - process = subprocess.Popen(commandList, - stdout=subprocess.PIPE, - stdin=subprocess.PIPE, - stderr=subprocess.PIPE, - close_fds=True) - status = process.wait() - if status == 0: - commandOutput = process.communicate() - except OSError: - return None,None,None - - for line in commandOutput[0].split("\n"): - tokens = line.split() - if len(tokens) < 4: - continue - if tokens[0] == partition: - total = int(tokens[1]) / (1024.0 * 1024.0) - used = int(tokens[2]) / (1024.0 * 1024.0) - free = int(tokens[3]) / (1024.0 * 1024.0) - break - - if total: - return total, used, free - - # get total size from parted output - for i in range(len(partition), 0, -1): - pos = i - 1 - if not partition[pos].isdigit(): - break - disk = partition[:pos+1] - number = int(partition[pos+1:]) - - commandList = ['parted', '-ms', disk, 'unit', 'kb', 'print'] - commandOutput = "" - try: - process = subprocess.Popen(commandList, - stdout=subprocess.PIPE, - stdin=subprocess.PIPE, - stderr=subprocess.PIPE, - close_fds=True) - status = process.wait() - if status == 0: - commandOutput = process.communicate() - except OSError: - return None,None,None - - lines = commandOutput[0].split(";\n") - if len(lines) < 3: - return None,None,None - - for line in lines[2:]: - tokens = line.split(':') - if len(tokens) < 4: - continue - if tokens[0] == str(number): - total = int(tokens[3].split('kB')[0]) / (1024.0 * 1024.0) - break - - return total, used, free def getServerDetails(listall): + serverName = socket.gethostname() + meminfo = getMeminfo() + cpu = 100 * float(getLoadavg()) + nameServerList, domain, searchDomain = readResolvConfFile() + if not domain: + domain = [None] + responseDom = ResponseXml() - #responseDom.appendTagRoute("status.code", "0") - #responseDom.appendTagRoute("status.message", "success") serverTag = responseDom.appendTagRoute("server") serverTag.appendChild(responseDom.createTag("name", serverName)) + serverTag.appendChild(responseDom.createTag("domainname", domain[0])) - nameServerList, domain, searchDomain = readResolvConfFile() - if domain: - domainName = domain[0] - else: - domainName = None - serverTag.appendChild(responseDom.createTag("domainname", domainName)) - i = 1 for dns in nameServerList: - serverTag.appendChild(responseDom.createTag("dns%s" % i, dns)) - i += 1 - #TODO: probe and retrieve timezone, ntp-server, preferred-network details and update the tags + serverTag.appendChild(responseDom.createTag("dns%s" % str(nameServerList.index(dns) +1) , dns)) + + #TODO: probe and retrieve timezone, ntp-server details and update the tags deviceList = {} interfaces = responseDom.createTag("networkInterfaces", None) for device in getNetDeviceList(): + if device["model"] in ['LOCAL', 'IPV6-IN-IPV4']: + continue deviceList[device["device"]] = device try: macAddress = open("/sys/class/net/%s/address" % device["device"]).read().strip() except IOError: continue interfaceTag = responseDom.createTag("networkInterface", None) - interfaceTag.appendChild(responseDom.createTag("name", device["device"])) - interfaceTag.appendChild(responseDom.createTag("hwAddr", macAddress)) - interfaceTag.appendChild(responseDom.createTag("speed", device["speed"])) - interfaceTag.appendChild(responseDom.createTag("model", device["model"])) + interfaceTag.appendChild(responseDom.createTag("name", device["device"])) + interfaceTag.appendChild(responseDom.createTag("hwAddr",macAddress)) + interfaceTag.appendChild(responseDom.createTag("speed", device["speed"])) + interfaceTag.appendChild(responseDom.createTag("model", device["model"])) if deviceList[device["device"]]: if deviceList[device["device"]]["onboot"]: interfaceTag.appendChild(responseDom.createTag("onboot", "yes")) @@ -154,31 +90,11 @@ def getServerDetails(listall): responseDom.appendTag(serverTag) serverTag.appendChild(responseDom.createTag("numOfCPUs", int(os.sysconf('SC_NPROCESSORS_ONLN')))) - try: - meminfo = getMeminfo() - mem_total = meminfo['MemTotal'] - mem_free = meminfo['MemFree'] - mem_used = (mem_total - mem_free) - value = "%.2f" % (1.0 * mem_used / mem_total) - mem_percent = 100 * float(value) - cpu = 100 * float(getLoadavg()) - - except IOError: - print "Error" - responseDom.appendTagRoute("server.name", serverName) - syslog.syslog(syslog.LOG_ERR, "Error finding memory information of server:%s" % serverName) - return None # refreshing hal data - rv = Utils.runCommandFG(["lshal"], stdout=True, root=True) - if rv["Stderr"]: - error = Common.stripEmptyLines(rv["Stderr"]) - Common.log(syslog.LOG_ERR, "failed to execute lshal command. Error: %s" % error) - print "failed to get disk details" - return None + DiskUtils.refreshHal() diskObj = Disk() - ## disks = diskObj.getDiskList() disks = diskObj.getMountableDiskList() if disks is None: @@ -187,9 +103,8 @@ def getServerDetails(listall): return None serverTag.appendChild(responseDom.createTag("cpuUsage", str(cpu))) - #serverTag.appendChild(responseDom.createTag("totalMemory", str(mem_percent))) - serverTag.appendChild(responseDom.createTag("totalMemory", str(mem_total))) - serverTag.appendChild(responseDom.createTag("memoryInUse", str(mem_used))) + serverTag.appendChild(responseDom.createTag("totalMemory", str(convertKbToMb(meminfo['MemTotal'])))) + serverTag.appendChild(responseDom.createTag("memoryInUse", str(convertKbToMb(meminfo['MemUsed'])))) serverTag.appendChild(responseDom.createTag("status", "ONLINE")) serverTag.appendChild(responseDom.createTag("uuid", None)) @@ -209,7 +124,7 @@ def getServerDetails(listall): partitionTag.appendChild(responseDom.createTag("description", disk['description'])) total, used, free = 0, 0, 0 if disk['size']: - total, used, free = getDiskSizeInfo(disk['device']) + total, used, free = DiskUtils.getDiskSizeInfo(disk['device']) if total: partitionTag.appendChild(responseDom.createTag("space", str(total))) totalDiskSpace += total @@ -237,8 +152,10 @@ def main(): help="List only data disks") (options, args) = parser.parse_args() - print getServerDetails(options.listall).toxml() - + responseXml = getServerDetails(options.listall) + if responseXml: + print responseXml.toxml() + sys.exit(0) if __name__ == "__main__": diff --git a/src/com.gluster.storage.management.server.scripts/src/multicast_response.py b/src/com.gluster.storage.management.server.scripts/src/multicast_response.py index 3d8125d8..86cb064f 100644 --- a/src/com.gluster.storage.management.server.scripts/src/multicast_response.py +++ b/src/com.gluster.storage.management.server.scripts/src/multicast_response.py @@ -23,8 +23,9 @@ import Utils import socket
import struct
import Globals
+from XmlHandler import *
-def isinpeer():
+def isInPeer():
command = "gluster peer status"
status = Utils.runCommand(command, output=True, root=True)
if status["Status"] == 0:
@@ -48,13 +49,23 @@ def response(multiCastGroup, port): #TODO: Remove infinite loop and make this as a deamon (service)
while True:
request = socketRequest.recvfrom(1024)
- if request and request[0].upper() == "SERVERDISCOVERY":
- if isinpeer():
- time.sleep(5)
- continue
- socketSend.sendto("<response><servername>%s</servername><time>%s</time></response>" % (socket.gethostname(), time.time()),
- (multiCastGroup, port))
- request = None
+ if not request:
+ continue
+ dom = XDOM()
+ dom.parseString(request[0])
+ if not dom:
+ continue
+ if not dom.getTextByTagRoute("request.name"):
+ continue
+ requesttime = dom.getTextByTagRoute("request.time")
+ if not requesttime:
+ continue
+ if isinpeer():
+ time.sleep(5)
+ continue
+ socketSend.sendto("<response><servername>%s</servername><time>%s</time></response>" % (socket.gethostname(), requesttime),
+ (multiCastGroup, port))
+ request = None
def main():
response(Globals.MULTICAST_GROUP, Globals.MULTICAST_PORT)
diff --git a/src/com.gluster.storage.management.server/WebContent/scripts/vmware-discover-servers.py b/src/com.gluster.storage.management.server/WebContent/scripts/vmware-discover-servers.py index 80e6101c..e9ae8666 100755 --- a/src/com.gluster.storage.management.server/WebContent/scripts/vmware-discover-servers.py +++ b/src/com.gluster.storage.management.server/WebContent/scripts/vmware-discover-servers.py @@ -46,18 +46,24 @@ def serverDiscoveryRequest(multiCastGroup, port): mreq = struct.pack("4sl", socket.inet_aton(multiCastGroup), socket.INADDR_ANY) socketReceive.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) - socketSend.sendto("ServerDiscovery", (multiCastGroup, port)) + sendtime = time.time() + socketSend.sendto("<request><name>ServerDiscovery</name><time>%s</time></request>" % (sendtime), (multiCastGroup, port)) try: while True: response = socketReceive.recvfrom(200) - if response and response[0].upper() != "SERVERDISCOVERY": - dom = XDOM() - dom.parseString(response[0]) - responsetime = dom.getTextByTagRoute("response.time") - servername = dom.getTextByTagRoute("response.servername") - if time.time() - float(responsetime) < 60: - servers.append(servername) + if not response: + continue + dom = XDOM() + dom.parseString(response[0]) + if not dom: + continue + if dom.getTextByTagRoute("request.name"): + 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: @@ -73,17 +79,11 @@ def main(): servers = set(servers) try: - #fp = open(Globals.DISCOVERED_SERVER_LIST_FILENAME, "w") - #fp.writelines(list(servers)) - #fp.close() for server in servers: print server except IOError: Common.log(syslog.LOG_ERR, "Unable to open file %s" % Globals.DISCOVERED_SERVER_LIST_FILENAME) sys.exit(-1) - - #for serverName in servers: - # print serverName sys.exit(0) if __name__ == "__main__": |
