diff options
17 files changed, 399 insertions, 2557 deletions
diff --git a/src/com.gluster.storage.management.gateway.scripts/src/backend/Disk.py b/src/com.gluster.storage.management.gateway.scripts/src/backend/Disk.py index ff994731..3b44e3a8 100755 --- a/src/com.gluster.storage.management.gateway.scripts/src/backend/Disk.py +++ b/src/com.gluster.storage.management.gateway.scripts/src/backend/Disk.py @@ -44,7 +44,7 @@ class Disk: try: if dev.GetProperty('storage.removable'): disk_size = str(int(dev.GetProperty('storage.removable.media_size')) / 1024**2) - except: + except: # TODO: Add appropriated exception on property error. return self.disks.append({ diff --git a/src/com.gluster.storage.management.gateway.scripts/src/backend/DiskUtils.py b/src/com.gluster.storage.management.gateway.scripts/src/backend/DiskUtils.py index deebb388..5d7b0b4a 100644 --- a/src/com.gluster.storage.management.gateway.scripts/src/backend/DiskUtils.py +++ b/src/com.gluster.storage.management.gateway.scripts/src/backend/DiskUtils.py @@ -90,23 +90,12 @@ def getDeviceByLabel(label): def getDiskPartitionLabel(device): - rv = Utils.runCommandFG(["sudo", "e2label", device], stdout=True) + rv = Utils.runCommand("e2label %s" % device, output=True, root=True) if rv["Status"] == 0: return rv["Stdout"].strip() return False -def readFile(fileName): - lines = None - try: - fp = open(fileName) - lines = fp.readlines() - fp.close() - except IOError, e: - Utils.log("failed to read file %s: %s" % (file, str(e))) - return lines - - def getRootPartition(fsTabFile=Globals.FSTAB_FILE): fsTabEntryList = FsTabUtils.readFsTab(fsTabFile) for fsTabEntry in fsTabEntryList: @@ -120,26 +109,6 @@ def getRootPartition(fsTabFile=Globals.FSTAB_FILE): return getDeviceName(fsTabEntry["Device"]) return None -def getMounts(): - mounts = {} - for line in readFile("/proc/mounts"): - str = line.strip() - if str.startswith("/dev/"): - tokens = str.split() - device = {} - mountPoint = tokens[1].strip() - device["MountPoint"] = mountPoint - device["FsType"] = tokens[2].strip() - device["Uuid"] = getDiskPartitionUuid(tokens[0].strip()) - device["Status"] = "INITIALIZED" - if mountPoint: - if mountPoint in ["/", "/boot"]: - device["Type"] = "BOOT" - else: - device["Type"] = "DATA" - mounts[tokens[0].strip()] = device - return mounts - def getRaidDisk(): array = [] arrayList = [] @@ -199,182 +168,76 @@ def getOsDisk(): Utils.log("WARNING: getOsDisk() is deprecated by getRootPartition()") return getRootPartition() +def getDiskInfo(diskNameList=None): + procPartitionsDict = getProcPartitions() + diskDict = {} + for name, values in procPartitionsDict.iteritems(): + values["Description"] = None + values["Uuid"] = None + values["FsType"] = None + values["MountPoint"] = None + values["SpaceInUse"] = None + values["Member"] = None + ## extras ?!?! + values["Init"] = False + values["Status"] = None + values["Interface"] = None + values["DriveType"] = None + values["Type"] = None + values["FsVersion"] = None + values["ReadOnlyAccess"] = None + + device = getDevice(name) + values["Uuid"] = getUuidByDiskPartition(device) + rv = Utils.runCommand("blkid -c /dev/null -o value %s" % device, output=True, root=True) + if rv["Status"] == 0: + lines = rv["Stdout"].strip().split("\n") + values["FsType"] = lines[-1].strip() + values["MountPoint"] = getDeviceMountPoint(device) + if values["FsType"]: + values["Init"] = True + if values["MountPoint"]: + rv = Utils.runCommand(["df", values["MountPoint"]], output=True) + if rv["Status"] == 0: + try: + values["SpaceInUse"] = long(rv["Stdout"].split("\n")[1].split()[2]) + except IndexError, e: + pass + except ValueError, e: + pass + if os.path.isdir("/sys/block/%s" % name): + model = Utils.readFile("/sys/block/%s/device/model" % name) + vendor = Utils.readFile("/sys/block/%s/device/vendor" % name) + values["Description"] = "%s %s" % (model.strip(), vendor.strip()) + values["Partitions"] = {} + diskDict[name] = values + + for diskName in diskDict.keys(): + del procPartitionsDict[diskName] + for partName, values in procPartitionsDict.iteritems(): + if os.path.isdir("/sys/block/%s/%s" % (diskName, partName)): + diskDict[diskName]["Partitions"][partName] = values + + procMdstatDict = getProcMdstat() + for name, values in procMdstatDict.iteritems(): + try: + diskDict[name]["Description"] = "Software Raid Array - %s - %s" % (values["Type"], values["Status"]) + diskDict[name]["Member"] = values["Member"] + except KeyError, e: + pass + + diskNameList = getDeviceName(diskNameList) + if Utils.isString(diskNameList): + diskNameList = [diskNameList] + + if not diskNameList: + return diskDict + + outputDict = {} + for diskName in list(set(diskDict.keys()).intersection(set(diskNameList))): + outputDict[diskName] = diskDict[diskName] + return outputDict -def getDiskInfo(diskDeviceList=None): - diskDeviceList = getDevice(diskDeviceList) - if Utils.isString(diskDeviceList): - diskDeviceList = [diskDeviceList] - - mounts = getMounts() - if Utils.runCommand("/usr/bin/lshal") != 0: - Utils.log("failed running /usr/bin/lshal") - - dbusSystemBus = dbus.SystemBus() - halObj = dbusSystemBus.get_object("org.freedesktop.Hal", - "/org/freedesktop/Hal/Manager") - halManager = dbus.Interface(halObj, "org.freedesktop.Hal.Manager") - storageUdiList = halManager.FindDeviceByCapability("storage") - - diskInfo = {} - diskList = [] - for udi in storageUdiList: - halDeviceObj = dbusSystemBus.get_object("org.freedesktop.Hal", udi) - halDevice = dbus.Interface(halDeviceObj, - "org.freedesktop.Hal.Device") - if halDevice.GetProperty("storage.drive_type") in ["cdrom", "floppy"] or \ - halDevice.GetProperty("block.is_volume"): - continue - disk = {} - disk["Device"] = str(halDevice.GetProperty('block.device')) - if diskDeviceList and disk["Device"] not in diskDeviceList: - continue - disk["Description"] = str(halDevice.GetProperty('storage.vendor')) + " " + str(halDevice.GetProperty('storage.model')) - if halDevice.GetProperty('storage.removable'): - disk["Size"] = long(halDevice.GetProperty('storage.removable.media_size')) - else: - disk["Size"] = long(halDevice.GetProperty('storage.size')) / 1024**2 - disk["Interface"] = str(halDevice.GetProperty('storage.bus')) - disk["DriveType"] = str(halDevice.GetProperty('storage.drive_type')) - disk["Status"] = None - disk["Uuid"] = None - disk["Init"] = False - disk["Type"] = None - disk["FsType"] = None - disk["FsVersion"] = None - disk["MountPoint"] = None - disk["ReadOnlyAccess"] = None - - partitionUdiList = halManager.FindDeviceStringMatch("info.parent", udi) - if isDiskInFormatting(disk["Device"]): - disk["Status"] = "INITIALIZING" - else: - if partitionUdiList: - disk["Status"] = "INITIALIZED" - else: - disk["Status"] = "UNINITIALIZED" - disk["Type"] = "UNKNOWN" - - if mounts and mounts.has_key(disk["Device"]): - disk["Uuid"] = mounts[disk["Device"]]["Uuid"] - disk["Type"] = mounts[disk["Device"]]["Type"] - disk["Status"] = mounts[disk["Device"]]["Status"] - disk["FsType"] = mounts[disk["Device"]]["FsType"] - disk["MountPoint"] = mounts[disk["Device"]]["MountPoint"] - - if disk["MountPoint"]: - disk["SpaceInUse"] = getDeviceUsedSpace(disk["Device"]) - else: - disk["SpaceInUse"] = None - - partitionList = [] - diskSpaceInUse = 0 - for partitionUdi in partitionUdiList: - used = 0 - partitionHalDeviceObj = dbusSystemBus.get_object("org.freedesktop.Hal", - partitionUdi) - partitionHalDevice = dbus.Interface(partitionHalDeviceObj, - "org.freedesktop.Hal.Device") - if not partitionHalDevice.GetProperty("block.is_volume"): - continue - partitionDevice = str(partitionHalDevice.GetProperty('block.device')) - if partitionHalDevice.GetProperty("volume.is_mounted"): - rv = Utils.runCommandFG(["df", str(partitionHalDevice.GetProperty('volume.mount_point'))], stdout=True) - if rv["Status"] == 0: - try: - used = long(rv["Stdout"].split("\n")[1].split()[2]) / 1024 - diskSpaceInUse += used - except IndexError: - pass - except ValueError: - pass - - if disk["Device"] == partitionDevice: - disk["Uuid"] = str(partitionHalDevice.GetProperty('volume.uuid')) - disk["Init"] = True # TODO: use isDataDiskPartitionFormatted function to cross verify this - disk["Status"] = "INITIALIZED" - mountPoint = str(partitionHalDevice.GetProperty('volume.mount_point')) - if mountPoint: - if mountPoint in ["/", "/boot"]: - disk["Type"] = "BOOT" - else: - disk["Type"] = "DATA" - disk["FsType"] = str(partitionHalDevice.GetProperty('volume.fstype')) - if disk["FsType"] and "UNINITIALIZED" == disk["Status"]: - disk["Status"] = "INITIALIZED" - disk["FsVersion"] = str(partitionHalDevice.GetProperty('volume.fsversion')) - disk["MountPoint"] = str(partitionHalDevice.GetProperty('volume.mount_point')) - disk["ReadOnlyAccess"] = str(partitionHalDevice.GetProperty('volume.is_mounted_read_only')) - if not disk["Size"]: - disk["Size"] = long(partitionHalDevice.GetProperty('volume.size')) / 1024**2 - #disk["SpaceInUse"] = used - continue - - partition = {} - partition["Init"] = False - partition["Type"] = "UNKNOWN" - partition["Device"] = partitionDevice - partition["Uuid"] = str(partitionHalDevice.GetProperty('volume.uuid')) - partition["Size"] = long(partitionHalDevice.GetProperty('volume.size')) / 1024**2 - partition["FsType"] = str(partitionHalDevice.GetProperty('volume.fstype')) - partition["FsVersion"] = str(partitionHalDevice.GetProperty('volume.fsversion')) - partition["Label"] = str(partitionHalDevice.GetProperty('volume.label')) - partition["MountPoint"] = str(partitionHalDevice.GetProperty('volume.mount_point')) - partition["Size"] = long(partitionHalDevice.GetProperty('volume.size')) / 1024**2 - - if isDiskInFormatting(partitionDevice): - partition["Status"] = "INITIALIZING" - else: - if partition["FsType"]: - partition["Status"] = "INITIALIZED" - else: - partition["Status"] = "UNINITIALIZED" - - partition["SpaceInUse"] = used - if partition["MountPoint"] or isDataDiskPartitionFormatted(partitionDevice): - partition["Init"] = True - partition["Status"] = "INITIALIZED" - if partition["MountPoint"]: - if partition["MountPoint"] in ["/", "/boot"]: - partition["Type"] = "BOOT" - else: - partition["Type"] = "DATA" - else: - if "SWAP" == partition["FsType"].strip().upper(): - partition["Type"] = "SWAP" - partition["ReadOnlyAccess"] = str(partitionHalDevice.GetProperty('volume.is_mounted_read_only')) - partitionList.append(partition) - disk["Partitions"] = partitionList - if not disk["SpaceInUse"]: - disk["SpaceInUse"] = diskSpaceInUse - diskList.append(disk) - diskInfo["disks"] = diskList - if diskList: - return diskInfo - for line in readFile("/proc/partitions")[2:]: - disk = {} - tokens = line.split() - if tokens[3].startswith("md"): - continue - disk["Device"] = tokens[3] - ## if diskDeviceList and disk["Device"] not in diskDeviceList: - ## continue - disk["Description"] = None - disk["Size"] = long(tokens[2]) / 1024 - disk["Status"] = None - disk["Interface"] = None - disk["DriveType"] = None - disk["Uuid"] = None - disk["Init"] = False - disk["Type"] = None - disk["FsType"] = None - disk["FsVersion"] = None - disk["MountPoint"] = None - disk["ReadOnlyAccess"] = None - disk["SpaceInUse"] = None - disk["Partitions"] = [] - diskList.append(disk) - diskInfo["disks"] = diskList - return diskInfo def getDiskList(diskDeviceList=None): return diskInfo["disks"] @@ -383,8 +246,9 @@ def getDiskList(diskDeviceList=None): def checkDiskMountPoint(diskMountPoint): try: fstabEntries = open(Globals.FSTAB_FILE).readlines() - except IOError: + except IOError, e: fstabEntries = [] + Utils.log("failed to read file %s: %s" % (Globals.FSTAB_FILE, str(e))) found = False for entry in fstabEntries: entry = entry.strip() @@ -400,8 +264,9 @@ def getMountPointByUuid(partitionUuid): # check uuid in etc/fstab try: fstabEntries = open(Globals.FSTAB_FILE).readlines() - except IOError: + except IOError, e: fstabEntries = [] + Utils.log("failed to read file %s: %s" % (Globals.FSTAB_FILE, str(e))) found = False for entry in fstabEntries: entry = entry.strip() @@ -416,9 +281,9 @@ def getDeviceUsedSpace(device): if rv["Status"] == 0: try: return long(rv["Stdout"].split("\n")[1].split()[2]) / 1024 - except IndexError: + except IndexError, e: pass - except ValueError: + except ValueError, e: pass def getDiskSizeInfo(partition): @@ -427,10 +292,10 @@ def getDiskSizeInfo(partition): used = None free = None command = "df -kl -t ext3 -t ext4 -t xfs" - rv = Utils.runCommandFG(command, stdout=True, root=True) + rv = Utils.runCommand(command, output=True, root=True) message = Utils.stripEmptyLines(rv["Stdout"]) - if rv["Stderr"]: - Utils.log("failed to get disk details. %s" % Utils.stripEmptyLines(rv["Stdout"])) + if rv["Status"] != 0: + Utils.log("failed to get disk partition details") return None, None, None for line in rv["Stdout"].split("\n"): tokens = line.split() @@ -457,10 +322,9 @@ def getDiskSizeInfo(partition): number = int(partitionNumber) command = "parted -ms %s unit kb print" % disk - rv = Utils.runCommandFG(command, stdout=True, root=True) - message = Utils.stripEmptyLines(rv["Stdout"]) - if rv["Stderr"]: - Utils.log("failed to get disk details. %s" % Utils.stripEmptyLines(rv["Stdout"])) + rv = Utils.runCommand(command, output=True, root=True) + if rv["Status"] != 0: + Utils.log("failed to get disk partition details") return None, None, None lines = rv["Stdout"].split(";\n") @@ -478,7 +342,6 @@ def getDiskSizeInfo(partition): def isDataDiskPartitionFormatted(device): - #Todo: Proper label needs to be added for data partition #if getDiskPartitionLabel(device) != Globals.DATA_PARTITION_LABEL: # return False device = getDeviceName(device) @@ -501,239 +364,6 @@ def isDataDiskPartitionFormatted(device): return False -def getDiskDom(diskDeviceList=None, bootPartition=None, skipDisk=None): - diskDeviceList = getDevice(diskDeviceList) - if Utils.isString(diskDeviceList): - diskDeviceList = [diskDeviceList] - - if skipDisk: - skipDisk = getDevice(skipDisk) - if Utils.isString(skipDisk): - skipDisk = [skipDisk] - - diskInfo = getDiskInfo(diskDeviceList) - diskList = diskInfo["disks"] - if not diskList: - return None - - raidPartitions = {} - raidDisk = getRaidDisk() - - for k, v in raidDisk.iteritems(): - for i in v['Disks']: - raidPartitions[i] = k - - #for partition in raidDisk.values(): - # raidDiskPartitions += partition['disks'] - - diskDom = Protocol.XDOM() - disksTag = diskDom.createTag("disks", None) - raidDisks = {} - if not bootPartition: - bootPartition = getRootPartition() - for disk in diskList: - if skipDisk and disk["Device"] in skipDisk: - continue - diskTag = diskDom.createTag("disk", None) - diskDevice = getDeviceName(disk["Device"]) - diskTag.appendChild(diskDom.createTag("name", diskDevice)) - diskTag.appendChild(diskDom.createTag("description", disk["Description"])) - diskTag.appendChild(diskDom.createTag("uuid", disk["Uuid"])) - diskTag.appendChild(diskDom.createTag("status", disk["Status"])) - diskTag.appendChild(diskDom.createTag("interface", disk["Interface"])) - - #if not disk["Partitions"]: - diskTag.appendChild(diskDom.createTag("type", disk["Type"])) - #diskTag.appendChild(diskDom.createTag("init", str(disk["Init"]).lower())) - diskTag.appendChild(diskDom.createTag("fsType", disk["FsType"])) - diskTag.appendChild(diskDom.createTag("fsVersion", disk["FsVersion"])) - diskTag.appendChild(diskDom.createTag("mountPoint", disk["MountPoint"])) - - diskTag.appendChild(diskDom.createTag("size", disk["Size"])) - diskTag.appendChild(diskDom.createTag("spaceInUse", disk["SpaceInUse"])) - partitionsTag = diskDom.createTag("partitions", None) - if raidPartitions.has_key(diskDevice): - rdList = {} - rdList[diskDevice] = [deepcopy(diskTag)] - if not raidDisks.has_key(raidPartitions[diskDevice]): - raidDisks[raidPartitions[diskDevice]] = [] - raidDisks[raidPartitions[diskDevice]] += [rdList] - continue - for partition in disk["Partitions"]: - partitionTag = diskDom.createTag("partition", None) - device = getDeviceName(partition["Device"]) - partitionTag.appendChild(diskDom.createTag("name", device)) - if partition["Uuid"]: #TODO: Move this verification and findings to getDiskInfo function - partitionTag.appendChild(diskDom.createTag("uuid", partition["Uuid"])) - else: - partitionTag.appendChild(diskDom.createTag("uuid", getUuidByDiskPartition("/dev/" + device))) - partitionTag.appendChild(diskDom.createTag("status", partition["Status"])) - #partitionTag.appendChild(diskDom.createTag("init", str(partition["Init"]).lower())) - partitionTag.appendChild(diskDom.createTag("type", str(partition["Type"]))) - partitionTag.appendChild(diskDom.createTag("fsType", partition["FsType"])) - partitionTag.appendChild(diskDom.createTag("mountPoint", partition['MountPoint'])) - partitionTag.appendChild(diskDom.createTag("size", partition["Size"])) - partitionTag.appendChild(diskDom.createTag("spaceInUse", partition["SpaceInUse"])) - if raidPartitions.has_key(device): - tempPartitionTag = diskDom.createTag("partitions", None) - if raidDisks.has_key(raidPartitions[device]): - rdList = raidDisks[raidPartitions[device]] - for rdItem in rdList: - if not rdItem.has_key(diskDevice): - rdItem[diskDevice] = [deepcopy(diskTag), tempPartitionTag] - rdItem[diskDevice][0].appendChild(tempPartitionTag) - rdItem[diskDevice][-1].appendChild(partitionTag) - continue - rdList = {} - rdList[diskDevice] = [deepcopy(diskTag), tempPartitionTag] - tempPartitionTag.appendChild(partitionTag) - rdList[diskDevice][0].appendChild(tempPartitionTag) - raidDisks[raidPartitions[device]] = [rdList] - continue - partitionsTag.appendChild(partitionTag) - diskTag.appendChild(partitionsTag) - disksTag.appendChild(diskTag) - - for rdisk in raidDisk.keys(): - raidDiskTag = diskDom.createTag("disk", None) - raidDiskTag.appendChild(diskDom.createTag("name", rdisk)) - raidDiskTag.appendChild(diskDom.createTag("description")) - raidDiskTag.appendChild(diskDom.createTag("uuid", raidDisk[rdisk]['Uuid'])) - raidDiskTag.appendChild(diskDom.createTag("type", raidDisk[rdisk]['Type'])) - raidDiskTag.appendChild(diskDom.createTag("mountPoint", raidDisk[rdisk]['MountPoint'])) - raidDiskTag.appendChild(diskDom.createTag("status", raidDisk[rdisk]['Status'])) - raidDiskTag.appendChild(diskDom.createTag("interface", raidDisk[rdisk]['Interface'])) - raidDiskTag.appendChild(diskDom.createTag("fsType", raidDisk[rdisk]['FsType'])) - raidDiskTag.appendChild(diskDom.createTag("fsVersion")) - raidDiskTag.appendChild(diskDom.createTag("size", raidDisk[rdisk]['Size'])) - raidDiskTag.appendChild(diskDom.createTag("spaceInUse", raidDisk[rdisk]['SpaceInUse'])) - raidDisksTag = diskDom.createTag("raidDisks", None) - if raidDisks.has_key(rdisk): - for item in raidDisks[rdisk]: - for diskTag in item.values(): - raidDisksTag.appendChild(diskTag[0]) - raidDiskTag.appendChild(raidDisksTag) - disksTag.appendChild(raidDiskTag) - diskDom.addTag(disksTag) - return diskDom - - -def initializeDisk(disk, boot=False, startSize=0, sudo=False): - if boot and startSize > 0: - return False - - disk = getDevice(disk) - diskObj = getDiskList(disk)[0] - - if boot or startSize == 0: - command = "dd if=/dev/zero of=%s bs=1024K count=1" % diskObj["Device"] - if runCommandFG(command, root=sudo) != 0: - if boot: - Utils.log("failed to clear boot sector of disk %s" % diskObj["Device"]) - return False - Utils.log("failed to clear boot sector of disk %s. ignoring" % diskObj["Device"]) - - command = "parted -s %s mklabel gpt" % diskObj["Device"] - if runCommandFG(command, root=sudo) != 0: - return False - - if boot: - command = "parted -s %s mkpart primary ext3 0MB %sMB" % (diskObj["Device"], Globals.OS_PARTITION_SIZE) - if runCommandFG(command, root=sudo) != 0: - return False - command = "parted -s %s set 1 boot on" % (diskObj["Device"]) - if runCommandFG(command, root=sudo) != 0: - return False - startSize = Globals.OS_PARTITION_SIZE - - size = (diskObj["Size"] / ONE_MB_SIZE) - startSize - while size > Globals.MAX_PARTITION_SIZE: - endSize = startSize + Globals.MAX_PARTITION_SIZE - command = "parted -s %s mkpart primary ext3 %sMB %sMB" % (diskObj["Device"], startSize, endSize) - if runCommandFG(command, root=sudo) != 0: - return False - size -= Globals.MAX_PARTITION_SIZE - startSize = endSize - - if size: - command = "parted -s %s mkpart primary ext3 %sMB 100%%" % (diskObj["Device"], startSize) - if runCommandFG(command, root=sudo) != 0: - return False - - if runCommandFG("udevadm settle", root=sudo) != 0: - if runCommandFG("udevadm settle", root=sudo) != 0: - Utils.log("udevadm settle for disk %s failed. ignoring" % diskObj["Device"]) - time.sleep(1) - - if runCommandFG("partprobe %s" % diskObj["Device"], root=sudo) != 0: - Utils.log("partprobe %s failed" % diskObj["Device"]) - return False - - if runCommandFG("gptsync %s" % diskObj["Device"], root=sudo) != 0: - Utils.log("gptsync %s failed. ignoring" % diskObj["Device"]) - - # wait forcefully to appear devices in /dev - time.sleep(2) - return True - - -def initializeOsDisk(diskObj): - Utils.log("WARNING: initializeOsDisk() is deprecated by initializeDisk(boot=True)") - return initializeDisk(diskObj, boot=True) - - -def initializeDataDisk(diskObj): - Utils.log("WARNING: initializeDataDisk() is deprecated by initializeDisk()") - return initializeDisk(diskObj) - -def getBootPartition(serverName): - diskDom = XDOM() - diskDom.parseFile("%s/%s/disk.xml" % (Globals.SERVER_VOLUME_CONF_DIR, serverName)) - if not diskDom: - return None - partitionDom = XDOM() - partitionUuid = None - partitionName = None - for partitionTag in diskDom.getElementsByTagRoute("disk.partition"): - partitionDom.setDomObj(partitionTag) - boot = partitionDom.getTextByTagRoute("boot") - if boot and boot.strip().upper() == 'YES': - partitionUuid = partitionDom.getTextByTagRoute("uuid") - partitionName = partitionDom.getTextByTagRoute("device") - break - if not (partitionUuid and partitionName): - return None - - # check device label name - deviceBaseName = os.path.basename(partitionName) - process = runCommandBG(['sudo', 'e2label', partitionName]) - if type(process) == type(True): - return None - if process.wait() != 0: - return None - output = process.communicate() - deviceLabel = output[0].split()[0] - if deviceLabel != Globals.BOOT_PARTITION_LABEL: - return None - - # check uuid in etc/fstab - try: - fstabEntries = open(Globals.FSTAB_FILE).readlines() - except IOError: - fstabEntries = [] - found = False - for entry in fstabEntries: - entry = entry.strip() - if not entry: - continue - if entry.split()[0] == "UUID=" + partitionUuid: - found = True - break - if not found: - return None - return partitionName - - def isDiskInFormatting(device): DEVICE_FORMAT_LOCK_FILE = "/var/lock/%s.lock" % device return os.path.exists(DEVICE_FORMAT_LOCK_FILE) @@ -745,12 +375,29 @@ def isDiskInFormat(device): def getDeviceMountPoint(device): - try: - fp = open("/proc/mounts") - for token in [line.strip().split() for line in fp.readlines()]: - if token and len(token) > 2 and token[0] == device: - return token[1] - fp.close() - except IOError, e: - return None + lines = Utils.readFile("/proc/mounts", lines=True) + uuid = getUuidByDiskPartition(device) + for line in lines: + tokens = line.split() + if tokens[0] == device or (uuid and tokens[0].endswith(uuid)): + return tokens[1] + return None +def getProcPartitions(): + procPartitionsDict = {} + s = Utils.readFile("/proc/partitions", lines=True) + for line in s[2:]: + tokens = line.strip().split() + procPartitionsDict[tokens[3]] = {"Size" : long(tokens[2])} + return procPartitionsDict + +def getProcMdstat(): + raidArrayDict = {} + lines = Utils.readFile("/proc/mdstat", lines=True) + for line in lines[1:]: + tokens = line.strip().split() + if not tokens: + continue + if tokens[0].startswith("md"): + raidArrayDict[tokens[0]] = {"Status" : tokens[2], "Type" : tokens[3], "Member" : [token.split('[')[0] for token in tokens[4:]]} + return raidArrayDict diff --git a/src/com.gluster.storage.management.gateway.scripts/src/backend/FsTabUtils.py b/src/com.gluster.storage.management.gateway.scripts/src/backend/FsTabUtils.py index a9adf4de..368b7a15 100644 --- a/src/com.gluster.storage.management.gateway.scripts/src/backend/FsTabUtils.py +++ b/src/com.gluster.storage.management.gateway.scripts/src/backend/FsTabUtils.py @@ -39,7 +39,7 @@ def readFsTab(fsTabFile=Globals.FSTAB_FILE): fsTabEntry["Options"] = tokens[3] fsTabEntry["DumpOption"] = tokens[4] fsTabEntry["fsckOrder"] = tokens[5] - except IndexError: + except IndexError, e: pass if fsTabEntry["Device"] and fsTabEntry["MountPoint"] and fsTabEntry["FsType"] and fsTabEntry["Options"]: fsTabEntryList.append(fsTabEntry) @@ -81,7 +81,7 @@ def removeFsTabEntry(fsTabEntry, fsTabFile=Globals.FSTAB_FILE): try: fsTabEntryList.remove(fsTabEntry) - except ValueError: + except ValueError, e: return False return writeFsTab(fsTabEntryList, fsTabFile) diff --git a/src/com.gluster.storage.management.gateway.scripts/src/backend/GlusterdUtils.py b/src/com.gluster.storage.management.gateway.scripts/src/backend/GlusterdUtils.py deleted file mode 100644 index 9295d83b..00000000 --- a/src/com.gluster.storage.management.gateway.scripts/src/backend/GlusterdUtils.py +++ /dev/null @@ -1,237 +0,0 @@ -# Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com> -# This file is part of Gluster Storage Platform. -# - -import os -import Utils - -import ServerUtils - - -def getGlusterVolumeInfo(volumeName=None): - volumeNameList = None - if Utils.isString(volumeName): - volumeNameList = [volumeName] - if type(volumeName) == type([]): - volumeNameList = volumeName - - status = Utils.runCommand("gluster volume info", output=True, root=True) - if status["Status"] != 0: - Utils.log("Failed to execute 'gluster volume info' command") - return None - - volumeInfoDict = {} - volumeInfo = {} - volumeName = None - brickList = [] - for line in status['Stdout'].split("\n"): - if not line: - if volumeName and volumeInfo: - volumeInfo["Bricks"] = brickList - volumeInfoDict[volumeName] = volumeInfo - volumeInfo = {} - volumeName = None - brickList = [] - continue - - tokens = line.split(":") - if tokens[0].strip().upper() == "BRICKS": - continue - elif tokens[0].strip().upper() == "VOLUME NAME": - volumeName = tokens[1].strip() - volumeInfo["VolumeName"] = volumeName - elif tokens[0].strip().upper() == "TYPE": - volumeInfo["VolumeType"] = tokens[1].strip() - elif tokens[0].strip().upper() == "STATUS": - volumeInfo["VolumeStatus"] = tokens[1].strip() - elif tokens[0].strip().upper() == "TRANSPORT-TYPE": - volumeInfo["TransportType"] = tokens[1].strip() - elif tokens[0].strip().upper().startswith("BRICK"): - brickList.append(":".join(tokens[1:]).strip()) - - if volumeName and volumeInfo: - volumeInfoDict[volumeName] = volumeInfo - - if not volumeNameList: - return volumeInfoDict - - # remove unwanted volume info - for volumeName in list(set(volumeInfoDict.keys()) - set(volumeNameList)): - del volumeInfoDict[volumeName] - - return volumeInfoDict - - -def isVolumeRunning(volumeName): - if not volumeName: - return False - volumeInfo = getGlusterVolumeInfo(volumeName) - if not volumeInfo: - return False - status = volumeInfo[volumeName]["VolumeStatus"] - if not status: - return False - if status.upper() == "STARTED": - return True - return False - - -def isVolumeExist(volumeName): - if not volumeName: - return False - if getGlusterVolumeInfo(volumeName): - return True - return False - - -def peerProbe(serverName): - command = "gluster peer probe %s" % serverName - status = Utils.runCommand(command, output=True, root=True) - if status["Status"] == 0: - return True - Utils.log("command [%s] failed with [%d:%s]" % (command, status["Status"], os.strerror(status["Status"]))) - return False - - -def setAuthAllow(volumeName, authList, includeServers=True): - if not (volumeName and authList): - return False - vacl = [] - if includeServers: - for serverName in ServerUtils.getAllServerList(): - vacl += ServerUtils.getServerIpList(serverName) - vacl += authList - - command = "gluster volume set %s auth.allow %s" % (volumeName, ",".join(list(set(vacl)))) - status = Utils.runCommand(command, output=True, root=True) - if status["Status"] == 0: - return True - Utils.log("command [%s] failed with [%d:%s]" % (command, status["Status"], os.strerror(status["Status"]))) - return False - - -def volumeCreate(volumeName, volumeType, transportTypeList, brickList): - command = "gluster volume create %s" % volumeName - - if volumeType.upper() == "MIRROR": - command += " replica 2" - elif volumeType.upper() == "STRIPE": - command += " stripe 4" - - if "RDMA" in transportTypeList: - command += " transport rdma" - - command += " " + " ".join(brickList) - - status = Utils.runCommand(command, output=True, root=True) - if status["Status"] == 0: - return True - Utils.log("command [%s] failed with [%d:%s]" % (command, status["Status"], os.strerror(status["Status"]))) - return False - - -def volumeDelete(volumeName): - command = "gluster --mode=script volume delete %s" % volumeName - status = Utils.runCommand(command, output=True, root=True) - if status["Status"] == 0: - return True - Utils.log("command [%s] failed with [%d:%s]" % (command, status["Status"], os.strerror(status["Status"]))) - return False - - -def volumeLogFileName(volumeName, brick, logDir): - command = "gluster volume log filename %s %s %s" % (volumeName, brick, logDir) - status = Utils.runCommand(command, output=True, root=True) - if status["Status"] == 0: - return True - Utils.log("command [%s] failed with [%d:%s]" % (command, status["Status"], os.strerror(status["Status"]))) - return False - - -def startVolumeMigration(volumeName, sourcePath, destinationPath): - command = "gluster volume replace-brick %s %s %s start" % (volumeName, sourcePath, destinationPath) - status = Utils.runCommand(command, output=True, root=True) - if status["Status"] == 0: - lines = status["Stdout"].split("\n") - if lines[0].split()[-1] == "successfully": - return True - Utils.log("command [%s] failed with [%d:%s]" % (command, status["Status"], os.strerror(status["Status"]))) - return False - - -def stopVolumeMigration(volumeName, sourcePath, destinationPath): - command = "gluster volume replace-brick %s %s %s abort" % (volumeName, sourcePath, destinationPath) - status = Utils.runCommand(command, output=True, root=True) - if status["Status"] == 0: - lines = status["Stdout"].split("\n") - if lines[0].split()[-1] == "successful": - return True - Utils.log("command [%s] failed with [%d:%s]" % (command, status["Status"], os.strerror(status["Status"]))) - return False - - -def commitVolumeMigration(volumeName, sourcePath, destinationPath): - command = "gluster volume replace-brick %s %s %s commit" % (volumeName, sourcePath, destinationPath) - status = Utils.runCommand(command, output=True, root=True) - if status["Status"] == 0: - lines = status["Stdout"].split("\n") - if lines[0].split()[-1] == "successful": - return True - Utils.log("command [%s] failed with [%d:%s]" % (command, status["Status"], os.strerror(status["Status"]))) - return False - - -def getMigrationStatus(volumeName, sourcePath, destinationPath): - command = "gluster volume replace-brick %s %s %s status" % (volumeName, sourcePath, destinationPath) - status = Utils.runCommand(command, output=True, root=True) - if status['Status'] == 0 and status['Stdout']: - lines = status["Stdout"].split("\n") - if "Current file" in lines[0]: - return "started" - if "Migration complete" in lines[0]: - return "completed" - Utils.log("command [%s] returns unknown status:%s" % (command, lines[0])) - return "failed" - #if status['Status'] == 0 and status['Stdout']: - # for line in status['Stdout'].split('\n'): - # words = line.split() - # if words and words[0].upper() == "STATUS:": - # return " ".join(words[1:]).upper() - Utils.log("command [%s] failed with [%d:%s]" % (command, status["Status"], os.strerror(status["Status"]))) - return None - - -def volumeRebalanceStart(volumeName): - command = "gluster volume rebalance %s start" % volumeName - status = Utils.runCommand(command, output=True, root=True) - if status["Status"] == 0: - lines = status["Stdout"].split("\n") - if lines[0].split()[-1] == "successful": - return True - Utils.log("command [%s] failed with [%d:%s]" % (command, status["Status"], os.strerror(status["Status"]))) - return False - - -def volumeRebalanceStop(volumeName): - command = "gluster volume rebalance %s stop" % volumeName - status = Utils.runCommand(command, output=True, root=True) - if status["Status"] == 0: - lines = status["Stdout"].split("\n") - if lines[0].split()[0] == "stopped": - return True - Utils.log("command [%s] failed with [%d:%s]" % (command, status["Status"], os.strerror(status["Status"]))) - return False - - -def volumeRebalanceStatus(volumeName): - command = "gluster volume rebalance %s status" % volumeName - status = Utils.runCommand(command, output=True, root=True) - if status["Status"] == 0: - lines = status["Stdout"].split("\n") - if "rebalance not started" in lines[0]: - return "not started" - if "rebalance completed" in lines[0]: - return "completed" - return "running" - Utils.log("command [%s] failed with [%d:%s]" % (command, status["Status"], os.strerror(status["Status"]))) - return False diff --git a/src/com.gluster.storage.management.gateway.scripts/src/backend/NetworkUtils.py b/src/com.gluster.storage.management.gateway.scripts/src/backend/NetworkUtils.py index 2c3f38e0..27a9c056 100755 --- a/src/com.gluster.storage.management.gateway.scripts/src/backend/NetworkUtils.py +++ b/src/com.gluster.storage.management.gateway.scripts/src/backend/NetworkUtils.py @@ -32,8 +32,8 @@ def readHostFile(fileName=None): continue hostEntryList.append({tokens[0] : tokens[1:]}) return hostEntryList - except IOError: - log("failed to read %s file" % fileName) + except IOError, e: + log("failed to read %s file: %s" % (fileName, str(e))) return None @@ -49,10 +49,10 @@ def writeHostFile(hostEntryList, fileName=None): fp.close() if hostFile == fileName: return True - except IOError: - log("failed to write %s file" % hostFile) + except IOError, e: + log("failed to write %s file: %s" % (hostFile, str(e))) return False - if runCommandFG("mv -f %s /etc/hosts" % hostFile, root=True) != 0: + if runCommand("mv -f %s /etc/hosts" % hostFile, root=True) != 0: log("failed to rename file %s to /etc/hosts" % hostFile) return False return True @@ -81,8 +81,8 @@ def readResolvConfFile(fileName=None, includeLocalHost=False): searchDomain = tokens[1:] continue return nameServerList, domain, searchDomain - except IOError: - log("failed to read %s file" % fileName) + except IOError, e: + log("failed to read %s file: %s" % (fileName, str(e))) return None, None, None @@ -104,10 +104,10 @@ def writeResolvConfFile(nameServerList, domain, searchDomain, fileName=None, app fp.close() if resolvConfFile == fileName: return True - except IOError: - log("failed to write %s file" % resolvConfFile) + except IOError, e: + log("failed to write %s file: %s" % (resolvConfFile, str(e))) return False - if runCommandFG("mv -f %s %s" % (resolvConfFile, Globals.RESOLV_CONF_FILE), root=True) != 0: + if runCommand("mv -f %s %s" % (resolvConfFile, Globals.RESOLV_CONF_FILE), root=True) != 0: log("failed to rename file %s to %s" % (resolvConfFile, Globals.RESOLV_CONF_FILE)) return False return True @@ -123,8 +123,8 @@ def readIfcfgConfFile(deviceName, root=""): continue conf[tokens[0].strip().lower()] = tokens[1].strip() return conf - except IOError: - log("failed to read %s file" % fileName) + except IOError, e: + log("failed to read %s file: %s" % (fileName, str(e))) return None @@ -162,10 +162,10 @@ def writeIfcfgConfFile(deviceName, conf, root="", deviceFile=None): fp.close() if ifcfgConfFile == deviceFile: return True - except IOError: - log("failed to write %s file" % ifcfgConfFile) + except IOError, e: + log("failed to write %s file" % (ifcfgConfFile, str(e))) return False - if runCommandFG("mv -f %s %s" % (ifcfgConfFile, deviceFile), root=True) != 0: + if runCommand("mv -f %s %s" % (ifcfgConfFile, deviceFile), root=True) != 0: log("failed to rename file %s to %s" % (ifcfgConfFile, deviceFile)) return False return True @@ -173,7 +173,7 @@ def writeIfcfgConfFile(deviceName, conf, root="", deviceFile=None): def getNetDeviceDetail(deviceName): deviceDetail = {} deviceDetail['Name'] = deviceName - rv = runCommandFG("ifconfig %s" % deviceName, stdout=True, root=True) + rv = runCommand("ifconfig %s" % deviceName, output=True, root=True) if rv["Status"] != 0: return False for line in rv["Stdout"].split(): @@ -189,7 +189,7 @@ def getNetDeviceDetail(deviceName): try: deviceDetail['Ip'] = tokens[1].strip().split()[0] deviceDetail['Mask'] = tokens[-1].strip() - except IndexError: + except IndexError, e: pass break return deviceDetail @@ -209,7 +209,7 @@ def getNetDeviceGateway(deviceName): return None def getNetSpeed(deviceName): - rv = runCommandFG("ethtool %s" % deviceName, stdout=True, root=True) + rv = runCommand("ethtool %s" % deviceName, output=True, root=True) if rv["Status"] != 0: return False for line in rv["Stdout"].split("\n"): @@ -221,7 +221,7 @@ def getNetSpeed(deviceName): def getLinkStatus(deviceName): return True ## ethtool takes very long time to respond. So its disabled now - rv = runCommandFG("ethtool %s" % deviceName, stdout=True, root=True) + rv = runCommand("ethtool %s" % deviceName, output=True, root=True) if rv["Status"] != 0: return False for line in rv["Stdout"].split("\n"): @@ -252,8 +252,8 @@ def getBondMode(deviceName, fileName=None): if tokens[5].startswith("mode="): return tokens[5].split("=")[1] return None - except IOError: - log("failed to read %s file" % fileName) + except IOError, e: + log("failed to read %s file: %s" % (fileName, str(e))) return None @@ -264,8 +264,8 @@ def setBondMode(deviceName, mode, fileName=None): try: fp = open(tempFileName, "w") lines = open(fileName).readlines() - except IOError: - log("unable to open file %s" % Globals.MODPROBE_CONF_FILE) + except IOError, e: + log("unable to open file %s: %s" % (Globals.MODPROBE_CONF_FILE, str(e))) return False for line in lines: tokens = line.split() @@ -278,7 +278,7 @@ def setBondMode(deviceName, mode, fileName=None): fp.write("alias %s bonding\n" % deviceName) fp.write("options %s max_bonds=2 mode=%s miimon=100\n" % (deviceName, mode)) fp.close() - if runCommandFG(["mv", "-f", tempFileName, fileName], root=True) != 0: + if runCommand(["mv", "-f", tempFileName, fileName], root=True) != 0: log("unable to move file from %s to %s" % (tempFileName, fileName)) return False return True @@ -329,7 +329,7 @@ def getNetDeviceList(root=""): netDevice["speed"] = getNetSpeed(deviceName) try: netDevice["hwaddr"] = open("/sys/class/net/%s/address" % deviceName).read().strip() - except IOError: + except IOError, e: pass netDeviceList.append(netDevice) @@ -339,17 +339,17 @@ def getNetDeviceList(root=""): continue try: netDevice["onboot"] = conf["onboot"] - except KeyError: + except KeyError, e: pass try: netDevice["bootproto"] = conf["bootproto"] - except KeyError: + except KeyError, e: pass if conf.has_key("ipaddr") and conf["ipaddr"]: netDevice["ipaddr"] = conf["ipaddr"] try: netDevice["netmask"] = conf["netmask"] - except KeyError: + except KeyError, e: pass if conf.has_key("gateway") and conf["gateway"]: netDevice["gateway"] = conf["gateway"] @@ -357,35 +357,35 @@ def getNetDeviceList(root=""): netDevice["gateway"] = getNetDeviceGateway(deviceName) try: netDevice["peerdns"] = conf["peerdns"] - except KeyError: + except KeyError, e: pass try: netDevice["autodns"] = conf["autodns"] - except KeyError: + except KeyError, e: pass try: netDevice["dns1"] = conf["dns1"] - except KeyError: + except KeyError, e: pass try: netDevice["dns2"] = conf["dns2"] - except KeyError: + except KeyError, e: pass try: netDevice["dns3"] = conf["dns3"] - except KeyError: + except KeyError, e: pass try: netDevice["master"] = conf["master"] - except KeyError: + except KeyError, e: pass try: netDevice["slave"] = conf["slave"] - except KeyError: + except KeyError, e: pass try: netDevice["nmcontrolled"] = conf["nmcontrolled"] - except KeyError: + except KeyError, e: pass return netDeviceList @@ -414,12 +414,12 @@ def configureDhcpServer(serverIpAddress, dhcpIpAddress): if token[0] == "dhcp": serverPortString = token[1] break - except IOError: - log(syslog.LOG_ERR, "Failed to read /proc/cmdline. Continuing with default port 68") + except IOError, e: + log(syslog.LOG_ERR, "Failed to read /proc/cmdline. Continuing with default port 68: %s" % str(e)) try: serverPort = int(serverPortString) - except ValueError: - log(syslog.LOG_ERR, "Invalid dhcp port '%s' in /proc/cmdline. Continuing with default port 68" % serverPortString) + except ValueError, e: + log(syslog.LOG_ERR, "Invalid dhcp port '%s' in /proc/cmdline. Continuing with default port 68: %s" % (serverPortString, str(e))) serverPort = 68 try: @@ -433,10 +433,10 @@ def configureDhcpServer(serverIpAddress, dhcpIpAddress): #fp.write("server=%s\n" % serverIpAddress) #fp.write("dhcp-script=/usr/sbin/server-info\n") fp.close() - except IOError: - log(syslog.LOG_ERR, "unable to write dnsmasq dhcp configuration %s" % tmpDhcpConfFile) + except IOError, e: + log(syslog.LOG_ERR, "unable to write dnsmasq dhcp configuration %s: %s" % (tmpDhcpConfFile, str(e))) return False - if runCommandFG("mv -f %s %s" % (tmpDhcpConfFile, Globals.DNSMASQ_DHCP_CONF_FILE), root=True) != 0: + if runCommand("mv -f %s %s" % (tmpDhcpConfFile, Globals.DNSMASQ_DHCP_CONF_FILE), root=True) != 0: log(syslog.LOG_ERR, "unable to copy dnsmasq dhcp configuration to %s" % Globals.DNSMASQ_DHCP_CONF_FILE) return False return True @@ -447,31 +447,31 @@ def isDhcpServer(): def getDhcpServerStatus(): - if runCommandFG("service dnsmasq status", root=True) == 0: + if runCommand("service dnsmasq status", root=True) == 0: return True return False def startDhcpServer(): - if runCommandFG("service dnsmasq start", root=True) == 0: + if runCommand("service dnsmasq start", root=True) == 0: return True return False def stopDhcpServer(): - if runCommandFG("service dnsmasq stop", root=True) == 0: - runCommandFG("rm -f %s" % Globals.DNSMASQ_LEASE_FILE, root=True) + if runCommand("service dnsmasq stop", root=True) == 0: + runCommand("rm -f %s" % Globals.DNSMASQ_LEASE_FILE, root=True) return True return False def restartDhcpServer(): stopDhcpServer() - runCommandFG("rm -f %s" % Globals.DNSMASQ_LEASE_FILE, root=True) + runCommand("rm -f %s" % Globals.DNSMASQ_LEASE_FILE, root=True) return startDhcpServer() def reloadDhcpServer(): - if runCommandFG("service dnsmasq reload", root=True) == 0: + if runCommand("service dnsmasq reload", root=True) == 0: return True return False diff --git a/src/com.gluster.storage.management.gateway.scripts/src/backend/RRDUtils.py b/src/com.gluster.storage.management.gateway.scripts/src/backend/RRDUtils.py deleted file mode 100644 index d1a6c058..00000000 --- a/src/com.gluster.storage.management.gateway.scripts/src/backend/RRDUtils.py +++ /dev/null @@ -1,76 +0,0 @@ -# Copyright (C) 2011 Gluster, Inc. <http://www.gluster.com> -# This file is part of Gluster Storage Platform. -# - -import rrdtool -import os -from socket import gethostname -from itertools import groupby - -class RRD: - def __init__ (self): - self.COLORS = [0xff7777, 0x7777ff, 0x55ff55, 0xffcc77, 0xff77ff, 0x77ffff,0xffff77, 0x55aaff] - self.HOST = gethostname() - self.DIR = "/var/lib/collectd" - - def fade_component(self, component): - return ((component + 255 * 5) / 6) - - def fade_color(self, color): - r = 0; - for i in [0,1,2]: - shft = (i * 8) - component = ((color >> shft) & 255) - r |= (self.fade_component(component) << shft) - return r - - def generate_pngs(self): - - rrdlist = os.popen ("find %s -type f -name '*.rrd'" % self.DIR) - - for rrd in rrdlist: - self.dss = [] - self.defs = "" - - rrdinfo = rrdtool.info(rrd.strip()) - - for key in rrdinfo.keys(): - if key.split('[')[0] == 'ds': - self.dss.append(key.split('[')[1].split(']')[0]) - self.dss.sort() - - self.dss = [a for a,b in groupby(self.dss)] - - for ds in self.dss: - self.defs = self.defs + " DEF:%s_avg=%s:%s:AVERAGE " % (ds, rrd.strip(), ds) - self.defs = self.defs + " DEF:%s_max=%s:%s:MAX " % (ds, rrd.strip(), ds) - - j = 0 - for ds in self.dss: - color = self.COLORS[j % len(self.COLORS)] - j = j + 1 - faded_color = self.fade_color(color) - self.defs = self.defs + " AREA:%s_max#%06x " % (ds, faded_color) - - j = 0 - for ds in self.dss: - color = self.COLORS[j % len(self.COLORS)] - j = j + 1 - self.defs = self.defs + " LINE2:%s_avg#%06x:%s " % (ds, color, ds) - self.defs = self.defs + " GPRINT:%s_avg:AVERAGE:%%5.1lf%%sAvg " % ds - self.defs = self.defs + " GPRINT:%s_max:MAX:%%5.1lf%%sMax " % ds - - for span in ['1hour', '1day', '1week', '1month']: - os.system ("mkdir -p %s/%s" % (self.DIR, self.HOST)) - image = os.path.dirname(rrd.strip()) + "-" + span + ".png" - cmd = "rrdtool graph " + image + " -t \"%s %s\"" % (os.path.dirname(rrd.strip()), span) + " --imgformat PNG --width 600 --height 100 --start now-" + span + " --end now --interlaced " + self.defs + " >/dev/null 2>&1" - os.system(cmd) - - -def main (): - - rrd = RRD () - rrd.generate_pngs () - -if __name__ == "__main__": - main() diff --git a/src/com.gluster.storage.management.gateway.scripts/src/backend/ServerUtils.py b/src/com.gluster.storage.management.gateway.scripts/src/backend/ServerUtils.py deleted file mode 100644 index 16cdeed2..00000000 --- a/src/com.gluster.storage.management.gateway.scripts/src/backend/ServerUtils.py +++ /dev/null @@ -1,295 +0,0 @@ -# Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com> -# This file is part of Gluster Storage Platform. -# - -import os -import re -import subprocess -import glob -import Globals -from Protocol import * -from Utils import * - -def isValidServer(serverName): - for profile in getProfileList(): - if profile.ProfileName == "default" and profile.Active: - if serverName == profile.DNS.Hostname: - return True - return False - -def getHostname(): - for profile in getProfileList(): - if profile.ProfileName == "default" and profile.Active: - return profile.DNS.Hostname - return None - -def getDomainName(): - try: - domainName = open(Globals.DOMAINNAME_FILE).read() - except IOError: - return None - return domainName.split()[0] - -def replaceServerIp(fileName, findWhat, replaceWith): - try: - data = open(fileName).read() - fp = open(fileName, "w") - fp.write(re.sub(findWhat, replaceWith, data)) - fp.close() - return True - except IOError: - return False - except ValueError: - return False - except OSError: - return False - -def serverName2IpAddress(serverName): - command = "dig %s | grep '^%s'" % (serverName, serverName) - ps = subprocess.Popen(command, - shell=True, - stdout=subprocess.PIPE, - stdin=subprocess.PIPE, - stderr=subprocess.PIPE, - close_fds=True) - ipAddress = serverName - if ps.wait() == 0: - output = ps.communicate() - ipAddress = output[0].split()[-1] - return ipAddress - -def getInstallerIp(): - if not os.path.exists(Globals.INSTALLER_INFO_FILE): - return None - try: - for line in open(Globals.INSTALLER_INFO_FILE): - tokens = line.split("=") - if tokens[0] == "IP-ADDRESS": - return tokens[1].split(",")[0].strip() - except IOError: - syslog.syslog(syslog.LOG_ERR, "unable to read %s file" % Globals.INSTALLER_INFO_FILE) - return False - -def setInstallerIp(installerIp): - try: - open(Globals.INSTALLER_INFO_FILE, "w").write("IP-ADDRESS=%s\n" % installerIp) - return True - except IOError: - log(syslog.LOG_ERR, "unable to create %s file" % Globals.INSTALLER_INFO_FILE) - return False - -def getCurrentServerName(): - try: - for line in open(Globals.SYSCONFIG_NETWORK_FILE): - tokens = line.split("=") - if tokens[0] == "HOSTNAME": - return tokens[1].strip() - except IOError: - syslog.syslog(syslog.LOG_ERR, "unable to read %s file" % Globals.SYSCONFIG_NETWORK_FILE) - return False - -def getLastAccessedNetwork(serverName): - lastAccessedNetworkFile = ("/%s/servers/%s/%s" % - (Globals.GLUSTER_CONF_DIR, serverName, Globals.LAST_ACCESSED_NETWORK_FILE)) - try: - return open(lastAccessedNetworkFile).read().strip() - except IOError: - log(syslog.LOG_ERR, "failed to read last accessed network file %s" % lastAccessedNetworkFile) - pass - return False - -def setLastAccessedNetwork(serverName, ipAddress): - lastAccessedNetworkFile = ("/%s/servers/%s/%s" % - (Globals.GLUSTER_CONF_DIR, serverName, Globals.LAST_ACCESSED_NETWORK_FILE)) - try: - open(lastAccessedNetworkFile, "w").write(ipAddress.strip() + "\n") - except IOError: - log(syslog.LOG_ERR, "failed to write last accessed network file %s" % lastAccessedNetworkFile) - return False - return True - -def getServerIpList(serverName, preferredNetworkOnly=False): - networkXmlFile = ("%s/servers/%s/network.xml" % (Globals.GLUSTER_CONF_DIR, serverName)) - configDom = XDOM() - if not configDom.parseFile(networkXmlFile): - log(syslog.LOG_ERR, "failed to read %s file" % networkXmlFile) - return None - preferredNetwork = configDom.getTextByTagRoute("preferred-network") - ipList = [] - interfaceDom = XDOM() - for tagE in configDom.getElementsByTagName("interface"): - interfaceDom.setDomObj(tagE) - deviceName = interfaceDom.getTextByTagRoute("device") - hostIp = interfaceDom.getTextByTagRoute("ipaddr") - if not hostIp: - continue - if preferredNetworkOnly: - if preferredNetwork.upper() == "ANY" or preferredNetwork.upper() == deviceName.upper(): - ipList.append(hostIp) - else: - ipList.append(hostIp) - if preferredNetworkOnly: - lastAccessedNetworkIp = getLastAccessedNetwork(serverName) - if lastAccessedNetworkIp in ipList: - ipList.remove(lastAccessedNetworkIp) - ipList = [lastAccessedNetworkIp] + ipList - return ipList - -def getServerPreferredIpList(serverName): - return getServerIpList(serverName, True) - -def getExecuteServerList(serverList): - executeServerList = {} - for serverName in serverList: - if serverName == Globals.INSTALLER_SERVER_NAME: - installerIp = getInstallerIp() - if installerIp: - executeServerList[serverName] = [installerIp] - continue - executeServerList[serverName] = getServerPreferredIpList(serverName) - return executeServerList - -def getAllServerList(): - serverList = [] - for filePath in glob.glob("%s/servers/*" % Globals.GLUSTER_CONF_DIR): - if os.path.isdir(filePath): - serverList.append(os.path.basename(filePath)) - try: - serverList.remove(Globals.INSTALLER_SERVER_NAME) - except ValueError: - pass - return serverList - -def getServerNetworkConfigFromLocalFile(serverName): - configDom = XDOM() - configDom.parseFile("%s/servers/%s/network.xml" % (Globals.GLUSTER_CONF_DIR, serverName)) - return configDom - -def updateServerNetworkConfigXmlFile(serverName, serverNetworkDom): - configDom = XDOM() - serverTag = serverNetworkDom.getElementsByTagRoute("server")[0] - configDom.setDomObj(serverTag) - if not configDom.writexml("%s/%s/network.xml" % (Globals.SERVER_VOLUME_CONF_DIR, serverName)): - log("Faild to write xml file %s/%s/network.xml" % (Globals.SERVER_VOLUME_CONF_DIR, serverName)) - -def compareServerNetworkDom(serverNetworkDomA, serverNetworkDomB, requestFlag=True): - command = "command.server." - if not requestFlag: - command = "" - sourceServer = {} - tagText = serverNetworkDomA.getTextByTagRoute("name") - if not tagText: - taxText = None - sourceServer["name"] = tagText - tagText = serverNetworkDomA.getTextByTagRoute("domain-name") - if not tagText: - tagText = None - sourceServer["domain-name"] = tagText - tagText = serverNetworkDomA.getTextByTagRoute("search-domain") - if not tagText: - tagText = None - sourceServer["search-domain"] = tagText - tagText = serverNetworkDomA.getTextByTagRoute("dns1") - if not tagText: - tagText = None - sourceServer["dns1"] = tagText - tagText = serverNetworkDomA.getTextByTagRoute("dns2") - if not tagText: - tagText = None - sourceServer["dns2"] = tagText - tagText = serverNetworkDomA.getTextByTagRoute("dns3") - if not tagText: - tagText = None - sourceServer["dns3"] = tagText - for tagE in serverNetworkDomA.getElementsByTagRoute("interface"): - interfaceDom = XDOM() - interfaceDom.setDomObj(tagE) - sourceServerList = {} - tagText = interfaceDom.getTextByTagRoute("description") - if not tagText: - tagText = None - sourceServerList["description"] = tagText - tagText = interfaceDom.getTextByTagRoute("hwaddr") - if not tagText: - tagText = None - sourceServerList["hwaddr"] = tagText - tagText = interfaceDom.getTextByTagRoute("onboot") - if not tagText: - tagText = None - sourceServerList["onboot"] = tagText - tagText = interfaceDom.getTextByTagRoute("bootproto") - if not tagText: - tagText = None - sourceServerList["bootproto"] = tagText - tagText = interfaceDom.getTextByTagRoute("ipaddr") - if not tagText: - tagText = None - sourceServerList["ipaddr"] = tagText - tagText = interfaceDom.getTextByTagRoute("netmask") - if not tagText: - tagText = None - sourceServerList["netmask"] = tagText - tagText = interfaceDom.getTextByTagRoute("gateway") - if not tagText: - tagText = None - sourceServerList["gateway"] = tagText - sourceServer[interfaceDom.getTextByTagRoute("device")] = sourceServerList - objServer = {} - tagText = serverNetworkDomB.getTextByTagRoute(command + "name") - if not tagText: - taxText = None - objServer["name"] = tagText - tagText = serverNetworkDomB.getTextByTagRoute(command + "domain-name") - if not tagText: - tagText = None - objServer["domain-name"] = tagText - tagText = serverNetworkDomB.getTextByTagRoute(command + "search-domain") - if not tagText: - tagText = None - objServer["search-domain"] = tagText - tagText = serverNetworkDomB.getTextByTagRoute(command + "dns1") - if not tagText: - tagText = None - objServer["dns1"] = tagText - tagText = serverNetworkDomB.getTextByTagRoute(command + "dns2") - if not tagText: - tagText = None - objServer["dns2"] = tagText - tagText = serverNetworkDomB.getTextByTagRoute(command + "dns3") - if not tagText: - tagText = None - objServer["dns3"] = tagText - for tagE in serverNetworkDomB.getElementsByTagRoute(command + "interface"): - interfaceDom = XDOM() - interfaceDom.setDomObj(tagE) - objServerList = {} - tagText = interfaceDom.getTextByTagRoute("description") - if not tagText: - tagText = None - objServerList["description"] = tagText - tagText = interfaceDom.getTextByTagRoute("hwaddr") - if not tagText: - tagText = None - objServerList["hwaddr"] = tagText - tagText = interfaceDom.getTextByTagRoute("onboot") - if not tagText: - tagText = None - objServerList["onboot"] = tagText - tagText = interfaceDom.getTextByTagRoute("bootproto") - if not tagText: - tagText = None - objServerList["bootproto"] = tagText - tagText = interfaceDom.getTextByTagRoute("ipaddr") - if not tagText: - tagText = None - objServerList["ipaddr"] = tagText - tagText = interfaceDom.getTextByTagRoute("netmask") - if not tagText: - tagText = None - objServerList["netmask"] = tagText - tagText = interfaceDom.getTextByTagRoute("gateway") - if not tagText: - tagText = None - objServerList["gateway"] = tagText - objServer[interfaceDom.getTextByTagRoute("device")] = objServerList - return sourceServer == objServer diff --git a/src/com.gluster.storage.management.gateway.scripts/src/backend/VolumeUtils.py b/src/com.gluster.storage.management.gateway.scripts/src/backend/VolumeUtils.py index 020a1900..e5256178 100644 --- a/src/com.gluster.storage.management.gateway.scripts/src/backend/VolumeUtils.py +++ b/src/com.gluster.storage.management.gateway.scripts/src/backend/VolumeUtils.py @@ -3,30 +3,15 @@ # import os -import glob -import tempfile -from operator import itemgetter +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 Globals -from Protocol import * -from Utils import * -from DiskUtils import * -from ServerUtils import * -import GlusterdUtils as Glusterd - - -def isVolumeExist(volumeName): - volumeDom = XDOM() - return volumeDom.parseFile("%s/%s.xml" % (Globals.VOLUME_CONF_DIR, volumeName)) and \ - Glusterd.isVolumeExist(volumeName) - - -def getVolumeUuid(volumeName): - fileName = "%s/%s.xml" % (Globals.VOLUME_CONF_DIR, volumeName) - volumeDom = XDOM() - if not volumeDom.parseFile(fileName): - log("Failed to parse volume configuration file %s of %s" % (fileName, volumeName)) - return None - return volumeDom.getTextByTagRoute("uuid") +import Utils def readVolumeSmbConfFile(fileName=Globals.VOLUME_SMBCONF_FILE): @@ -41,7 +26,7 @@ def readVolumeSmbConfFile(fileName=Globals.VOLUME_SMBCONF_FILE): entryList.append(tokens[1].strip()) fp.close() except IOError, e: - log("Failed to open file %s: %s" % (fileName, str(e))) + Utils.log("Failed to open file %s: %s" % (fileName, str(e))) return entryList @@ -53,7 +38,7 @@ def writeVolumeSmbConfFile(entryList, fileName=Globals.VOLUME_SMBCONF_FILE): fp.close() return True except IOError, e: - log("Failed to write file %s: %s" % (fileName, str(e))) + Utils.log("Failed to write file %s: %s" % (fileName, str(e))) return False @@ -76,7 +61,7 @@ def excludeVolume(volumeName, fileName=Globals.VOLUME_SMBCONF_FILE): if volumeFile not in entryList: return True entryList.remove(volumeFile) - log("entryList = %s" % entryList) + Utils.log("entryList = %s" % entryList) return writeVolumeSmbConfFile(entryList, fileName) @@ -99,7 +84,7 @@ def writeVolumeCifsConfiguration(volumeName, userList, adminUser=None): fp.close() return True except IOError, e: - log("Failed to write file %s: %s" % (volumeFile, str(e))) + Utils.log("Failed to write file %s: %s" % (volumeFile, str(e))) return False @@ -109,491 +94,6 @@ def removeVolumeCifsConfiguration(volumeName): os.remove(volumeFile) return True except OSError, e: - log("Failed to remove file %s: %s" % (volumeFile, str(e))) - return False - - -def getVolumeListByPartitionName(partitionName): - volumeConfigFileList = glob.glob(Globals.VOLUME_CONF_DIR + "/*.xml") - if not volumeConfigFileList: - return None - - volumeList = [] - for volumeXmlFile in volumeConfigFileList: - volumeDom = XDOM() - volumeDom.parseFile(volumeXmlFile) - serverTopology = volumeDom.getElementsByTagRoute("volume.topology.group") - serverPartitionFound = False - for topology in serverTopology: - partitionDom = XDOM() - for partition in topology.getElementsByTagName("partition"): - partitionDom.setDomObj(partition) - if partitionDom.getTextByTagRoute("name") == partitionName: - serverPartitionFound = True - break - if serverPartitionFound: - volumeList.append(volumeDom.getElementsByTagRoute("volume")[0]) - break - return volumeList - - -def addServerPartitionConfig(inputDom, groupOrder, partitionTag): - if not(inputDom and groupOrder and partitionTag): - return False - groupDom = XDOM() - for group in inputDom.getElementsByTagRoute("topology.group"): - groupDom.setDomObj(group) - order = groupDom.getTextByTagRoute("order") - if order and int(order) == groupOrder: - group.appendChild(partitionTag) - return inputDom - return False - - -def removeServerPartitionConfig(inputDom, partitionName): - if not(inputDom and partitionName): - return False - for group in inputDom.getElementsByTagRoute("topology.group"): - partitionDom = XDOM() - for partition in group.getElementsByTagName("partition"): - partitionDom.setDomObj(partition) - if partitionDom.getTextByTagRoute("name") == partitionName: - group.removeChild(partition) - return inputDom - return False - - -def updateServerPartitionConfig(inputDom, partitionName, partitionTag): - if not(inputDom and partitionName and partitionTag): - return False - for group in inputDom.getElementsByTagRoute("topology.group"): - partitionDom = XDOM() - for partition in group.getElementsByTagName("partition"): - partitionDom.setDomObj(partition) - if partitionDom.getTextByTagRoute("name") == partitionName: - try: - group.replaceChild(partitionTag, partition) - return inputDom - except AttributeError: - return False - return False - - -def getServerPartitionConfigUuid(serverGroupList, serverPartition): - for group in serverGroupList: - if not group: - continue - partitionDom = XDOM() - for partition in group.getElementsByTagName("partition"): - partitionDom.setDomObj(partition) - partitionName = partition.getTextByTagName("name") - if not partitionName: - continue - if partitionName == serverPartition: - return partitionDom.getTextByTagName("uuid") - return False - - -def setServerPartitionConfigProperty(inputDom, partitionName, propertyDict): - if not(inputDom and partitionName and propertyDict): - return False - for group in inputDom.getElementsByTagRoute("topology.group"): - partitionDom = XDOM() - for partition in group.getElementsByTagName("partition"): - partitionDom.setDomObj(partition) - if partitionDom.getTextByTagRoute("name") == partitionName: - for part in propertyDict.keys(): - x = partition.getElementsByTagName(part) - if x: - x[0].childNodes[0].nodeValue = propertyDict[part] - return inputDom - return False - - -def getSortedServerPartitionConfigProperty(inputDom): - groupDict = {} - if not inputDom: - return None - groupDom = XDOM() - for group in inputDom.getElementsByTagRoute("topology.group"): - groupDom.setDomObj(group) - groupOrder = groupDom.getTextByTagRoute("order") - if not groupOrder: - return None - groupOrder = int(groupOrder) - if groupOrder < 1: - return None - partitionDom = XDOM() - partitionDict = {} - for partition in group.getElementsByTagName("partition"): - partitionDom.setDomObj(partition) - partitionName = partitionDom.getTextByTagRoute("name") - if not partitionName: - return None - partitionOrder = partitionDom.getTextByTagRoute("order") - if not partitionOrder: - return None - partitionUuid = partitionDom.getTextByTagRoute("uuid") - partitionOrder = int(partitionOrder) - if partitionOrder < 1: - return None - partitionDetails = partitionName.split(":") - if not partitionDetails or len(partitionDetails) < 1: - return None - partitionDict[partitionOrder] = { "order":partitionOrder, - "servername":partitionDetails[0], - "name":partitionDetails[1], - "uuid":partitionUuid} - groupDict[groupOrder] = partitionDict - - serverList = [] - groupOrderList = groupDict.keys() - groupOrderList.sort() - for groupOrder in groupOrderList: - partitionOrderList = groupDict[groupOrder].keys() - partitionOrderList.sort() - for partitionOrder in partitionOrderList: - serverList.append(groupDict[groupOrder][partitionOrder]) - - return serverList - - -def getSortedServerPartitionList(serverGroupElements): - serverPartitionDict = {} - groupOrderList = [] - serverList = [] - partitionDom = XDOM() - for group in serverGroupElements: - if not group: - continue - groupOrderE = group.getElementsByTagName("order") - if not (groupOrderE and groupOrderE[0].childNodes): - return None - value = int(XDOM.getText(groupOrderE[0].childNodes)) - if value > 0: - groupOrderList.append(value) - partitionDict = {} - for partition in group.getElementsByTagName("partition"): - partitionDom.setDomObj(partition) - - partitionName = partitionDom.getTextByTagRoute("name") - if not partitionName: - return None - partitionOrder = partitionDom.getTextByTagRoute("order") - if not partitionOrder: - return None - partitionUuid = partitionDom.getTextByTagRoute("uuid") - partitionDict[int(partitionOrder)] = [partitionName, partitionUuid] - serverPartitionDict[value] = partitionDict - groupOrderList.sort() - - for groupOrder in groupOrderList: - items = serverPartitionDict[groupOrder].items() - items.sort(key = itemgetter(0)) - serverList = serverList + [ items[i][1] for i in range(0,len(items))] - return serverList - - -def clearExportDirectory(serverList, volumeName, volumeUuid): - thisServerName = getCurrentServerName() - for exportServer in serverList: - serverName, partition = exportServer[0].split(":") - if thisServerName != serverName: - continue - partitionUuid = getUuidByDiskPartition(getDevice(partition)) - if not partitionUuid: - log("unable to find uuid of partition %s" % partition) - return False - volumeDirName = "%s/%s/%s" % (Globals.GLUSTER_LUN_DIR, partitionUuid, volumeUuid) - if os.path.exists(volumeDirName): - ## Removing /data/PARTITION-UUID/VOLUME-UUID/ - ## TODO: Get an option to remove it at this time - if runCommandFG("mv -f %s %s.delete" % (volumeDirName, volumeDirName), root=True) != 0: - return False - if runCommandFG("rm -f %s/%s/volumes/%s" % (Globals.GLUSTER_LUN_DIR, partitionUuid, volumeName), root=True) != 0: - return False - return True - - -def createExportDirectory(serverList, volumeName, volumeUuid): - thisServerName = getCurrentServerName() - tempVolumeNameFile = getTempFileName() - - try: - fp = open(tempVolumeNameFile, "w") - fp.write("VOLUME_NAME=%s\n" % volumeName) - fp.write("VOLUME_UUID=%s\n" % volumeUuid) - fp.close() - except IOError, e: - log("failed to create temporary file for volume-name: %s" % (volumeName, str(e))) + Utils.log("Failed to remove file %s: %s" % (volumeFile, str(e))) return False - for exportServer in serverList: - serverName, partition = exportServer[0].split(":") - if thisServerName != serverName: - continue - partitionUuid = getUuidByDiskPartition(getDevice(partition)) - if not partitionUuid: - log("unable to find uuid of partition %s" % partition) - return False - - volumeDirName = "%s/%s/%s" % (Globals.GLUSTER_LUN_DIR, partitionUuid, volumeUuid) - ## Creating /data/PARTITION-UUID/VOLUME-UUID/ - if runCommandFG("mkdir %s" % volumeDirName, root=True) != 0: - return False - - ## Creating /data/PARTITION-UUID/VOLUME-UUID/exports/ - ## Creating /data/PARTITION-UUID/VOLUME-UUID/exports/brick1/ - if runCommandFG("mkdir -p %s/exports/brick1" % volumeDirName, root=True) != 0: - return False - - ## Creating /data/PARTITION-UUID/VOLUME-UUID/log/ - if runCommandFG("mkdir %s/log" % volumeDirName, root=True) != 0: - return False - - ## Creating /data/PARTITION-UUID/VOLUME-UUID/config/ - if runCommandFG("mkdir %s/config" % volumeDirName, root=True) != 0: - return False - - volumeLinkDirName = "%s/%s/volumes" % (Globals.GLUSTER_LUN_DIR, partitionUuid) - if not os.path.exists(volumeLinkDirName): - if runCommandFG("mkdir %s" % volumeLinkDirName, root=True) != 0: - return False - - ## Creating symlink - ## /data/PARTITION-UUID/volumes/VOLUME-NAME -> /data/PARTITION-UUID/VOLUME-UUID/ - command = "ln -fTs %s %s/%s" % (volumeDirName, - volumeLinkDirName, volumeName) - if runCommandFG(command, root=True) != 0: - return False - - if runCommandFG("cp -f %s %s/config/volume-name" % (tempVolumeNameFile, volumeDirName), root=True) != 0: - return False - - try: - os.remove(tempVolumeNameFile) - except OSError, e: - log("Failed to remove file %s: %s" % (tempVolumeNameFile, str(e))) - - return True - - -def getPartitionListByServerName(volumeDom, serverName, serverPartitionList=None): - partitionList = {} - if serverPartitionList: - for partitionName in serverPartitionList: - partitionUuid = getServerDiskPartitionUuid(serverName, partitionName) - if not partitionUuid: - log(syslog.LOG_ERR, "failed to get disk partition %s uuid of server %s" % (partitionName, serverName)) - return None - partitionList[partitionName] = partitionUuid - return partitionList - for group in volumeDom.getElementsByTagRoute("topology.group"): - for partitionTag in group.getElementsByTagName("partition"): - nameE = partitionTag.getElementsByTagName("name") - if not nameE: - continue - partition = XDOM.getText(nameE[0].childNodes) - if not partition: - continue - server, partitionName = partition.split(":") - if server != serverName: - continue - partitionUuid = getServerDiskPartitionUuid(serverName, partitionName) - if not partitionUuid: - log(syslog.LOG_ERR, "failed to get disk partition %s uuid of server %s" % (partitionName, serverName)) - return None - partitionList[partitionName] = partitionUuid - return partitionList - - -def isVolumeRunning(volumeName): - return Glusterd.isVolumeRunning(volumeName) - -def addVolumeMigrationDetails(sourcePartition, destinationPartition, volumeName): - migrationDom = XDOM() - if not os.path.exists(Globals.VOLUME_MIGRATION_LIST_FILE): - migrationDom.appendTagRoute("volume-migration") - else: - if not migrationDom.parseFile(Globals.VOLUME_MIGRATION_LIST_FILE): - log("Failed to load volume-migration.xml file") - return None - migrationList = migrationDom.getElementsByTagRoute("volume-migration.migration") - for tagE in migrationList: - dom = XDOM() - dom.setDomObj(tagE) - if dom.getTextByTagRoute("source-partition") == sourcePartition and \ - dom.getTextByTagRoute("destination-partition") == destinationPartition and \ - dom.getTextByTagRoute("volume-name") == volumeName: - return False - migrationTag = migrationDom.getElementsByTagRoute("volume-migration") - if not migrationTag: - return None - partitionTag = migrationDom.createTag("migration") - partitionTag.appendChild(migrationDom.createTag("source-partition", sourcePartition)) - partitionTag.appendChild(migrationDom.createTag("destination-partition", destinationPartition)) - partitionTag.appendChild(migrationDom.createTag("volume-name", volumeName)) - migrationTag[0].appendChild(partitionTag) - if not migrationDom.writexml(Globals.VOLUME_MIGRATION_LIST_FILE): - log("Unable to write disk migration details into %s/volume-migration.xml" % Globals.GLUSTER_BASE_DIR) - return False - return True - - -def removeVolumeMigrationDetails(sourcePartition, destinationPartition, volumeName): - migrationDom = XDOM() - if not os.path.exists(Globals.VOLUME_MIGRATION_LIST_FILE): - return None - if not migrationDom.parseFile(Globals.VOLUME_MIGRATION_LIST_FILE): - log("Failed to load volume-migration.xml file") - return None - migrationList = migrationDom.getElementsByTagRoute("volume-migration.migration") - for tagE in migrationList: - dom = XDOM() - dom.setDomObj(tagE) - if dom.getTextByTagRoute("source-partition") == sourcePartition and \ - dom.getTextByTagRoute("destination-partition") == destinationPartition and \ - dom.getTextByTagRoute("volume-name") == volumeName: - migrationDom.getElementsByTagRoute("volume-migration")[0].removeChild(tagE) - if not migrationDom.writexml(Globals.VOLUME_MIGRATION_LIST_FILE): - log("Unable to write disk migration details into %s/volume-migration.xml" % Globals.GLUSTER_BASE_DIR) - return False - return True - - -def addPartitionMigrationDetails(sourcePartition, destinationPartition, volumeList=None): - migrationDom = XDOM() - if not os.path.exists(Globals.MIGRATE_PARTITION_LIST_FILE): - migrationDom.appendTagRoute("partition-migration") - else: - if not migrationDom.parseFile(Globals.MIGRATE_PARTITION_LIST_FILE): - log("Failed to load migration.xml file") - return None - migrationList = migrationDom.getElementsByTagRoute("partition-migration.migration") - for tagE in migrationList: - dom = XDOM() - dom.setDomObj(tagE) - if dom.getTextByTagRoute("source-partition") == sourcePartition: - return False - if dom.getTextByTagRoute("destination-partition") == destinationPartition: - return False - migrationTag = migrationDom.getElementsByTagRoute("partition-migration") - if not migrationTag: - return None - partitionTag = migrationDom.createTag("migration") - partitionTag.appendChild(migrationDom.createTag("source-partition", sourcePartition)) - partitionTag.appendChild(migrationDom.createTag("destination-partition", destinationPartition)) - migrationTag[0].appendChild(partitionTag) - if not migrationDom.writexml(Globals.MIGRATE_PARTITION_LIST_FILE): - log("Unable to write disk migration details into %s/migration.xml" % Globals.GLUSTER_BASE_DIR) - return False - if volumeList: - for volumeName in volumeList: - addVolumeMigrationDetails(sourcePartition, destinationPartition, volumeName) - return True - - -def removePartitionMigrationDetails(sourcePartition, destinationPartition, volumeList=None): - migrationDom = XDOM() - if not os.path.exists(Globals.MIGRATE_PARTITION_LIST_FILE): - return None - if not migrationDom.parseFile(Globals.MIGRATE_PARTITION_LIST_FILE): - log("Failed to load migration.xml file") - return None - migrationList = migrationDom.getElementsByTagRoute("partition-migration.migration") - for tagE in migrationList: - dom = XDOM() - dom.setDomObj(tagE) - if dom.getTextByTagRoute("source-partition") == sourcePartition and \ - dom.getTextByTagRoute("destination-partition") == destinationPartition: - migrationDom.getElementsByTagRoute("partition-migration")[0].removeChild(tagE) - if not migrationDom.writexml(Globals.MIGRATE_PARTITION_LIST_FILE): - log("Unable to write disk migration details into %s/migration.xml" % Globals.GLUSTER_BASE_DIR) - return False - if volumeList: - for volumeName in volumeList: - removeVolumeMigrationDetails(sourcePartition, destinationPartition, volumeName) - return True - - -def isMigrationInProgress(partition): - migrationDom = XDOM() - if not os.path.exists(Globals.MIGRATE_PARTITION_LIST_FILE): - return None - if not migrationDom.parseFile(Globals.MIGRATE_PARTITION_LIST_FILE): - log("Failed to load migration.xml file") - return None - migrationList = migrationDom.getElementsByTagRoute("partition-migration.migration") - for tagE in migrationList: - dom = XDOM() - dom.setDomObj(tagE) - if migrationDom.getTextByTagRoute("source-partition") == partition or \ - migrationDom.getTextByTagRoute("destination-partition") == partition: - return True - return False - - -def getServerDiskPartitionUuid(serverName, partition): - diskConfigDom = XDOM() - if not diskConfigDom.parseFile("%s/%s/disk.xml" % (Globals.SERVER_CONF_DIR, serverName)): - return None - for disk in diskConfigDom.getElementsByTagRoute("disks.disk"): - diskDom = XDOM() - diskDom.setDomObj(disk) - partitionList = diskDom.getElementsByTagRoute("partition") - for tagE in partitionList: - partitionDom = XDOM() - partitionDom.setDomObj(tagE) - if partitionDom.getTextByTagRoute("device") == partition: - return partitionDom.getTextByTagRoute("uuid") - - -def getVolumeServerList(requestDom, requestFlag=True): - if requestFlag: - serverGroupElementList = requestDom.getElementsByTagRoute("command.volume.topology.group") - else: - serverGroupElementList = requestDom.getElementsByTagRoute("volume.topology.group") - if not serverGroupElementList: - return None - serverList = [] - partitionDom = XDOM() - for group in serverGroupElementList: - for partition in group.getElementsByTagName("partition"): - partitionDom.setDomObj(partition) - partitionName = partitionDom.getTextByTagRoute("name") - if not partitionName: - continue - serverPartition = partitionName.split(":") - if not(len(serverPartition) > 1 and serverPartition[1]): - return None - if serverPartition[0] not in serverList: - serverList.append(serverPartition[0]) - return serverList - - -def getVolumeServerListByName(volumeName): - serverList = [] - serverDom = XDOM() - volumeDom = XDOM() - if not os.path.exists("%s/%s.xml" % (Globals.VOLUME_CONF_DIR, volumeName)): - return False - if not volumeDom.parseFile("%s/%s.xml" % (Globals.VOLUME_CONF_DIR, volumeName)): - return False - return getVolumeServerList(volumeDom, False) - - -def getMigrateVolumeServerPartitionInfo(volumeName): - volumeMigrationDom = XDOM() - if not volumeMigrationDom.parseFile(Globals.VOLUME_MIGRATION_LIST_FILE): - Utils.log("Failed to parse file %s" % Globals.VOLUME_MIGRATION_LIST_FILE) - return None - volumeInfo = {} - dom = XDOM() - for tagE in volumeMigrationDom.getElementsByTagRoute("volume-migration.migration"): - dom.setDomObj(tagE) - if dom.getTextByTagRoute("volume-name") == volumeName: - volumeInfo['Name'] = volumeName - volumeInfo['SourcePartition'] = dom.getTextByTagRoute("source-partition") - volumeInfo['DestinationPartition'] = dom.getTextByTagRoute("destination-partition") - return volumeInfo - return None diff --git a/src/com.gluster.storage.management.gateway.scripts/src/backend/get_file.py b/src/com.gluster.storage.management.gateway.scripts/src/backend/get_file.py deleted file mode 100755 index 265823ab..00000000 --- a/src/com.gluster.storage.management.gateway.scripts/src/backend/get_file.py +++ /dev/null @@ -1,117 +0,0 @@ -# Copyright (C) 2011 Gluster, Inc. <http://www.gluster.com> -# This file is part of Gluster Storage Platform. -# - -import Globals -import Utils -from VolumeUtils import * -from XmlHandler import ResponseXml - - -def enumLogType(logCode): - if "M" == logCode.upper(): - return "EMERGENCY" - elif "A" == logCode.upper(): - return "ALERT" - elif "C" == logCode.upper(): - return "CRITICAL" - elif "E" == logCode.upper(): - return "ERROR" - elif "W" == logCode.upper(): - return "WARNING" - elif "N" == logCode.upper(): - return "NOTICE" - elif "I" == logCode.upper(): - return "INFO" - elif "D" == logCode.upper(): - return "DEBUG" - elif "T" == logCode.upper(): - return "TRACE" - else: - return "UNKNOWN" -##--end of enumLogType() - - -def addLog(responseDom, logMessageTag, loginfo): - logTag = responseDom.createTag("log", None) - logTag.appendChild(responseDom.createTag("date", loginfo[0])) - logTag.appendChild(responseDom.createTag("time", loginfo[1])) - logTag.appendChild(responseDom.createTag("type", enumLogType(loginfo[2]))) - logTag.appendChild(responseDom.createTag("message", loginfo[3])) - logMessageTag.appendChild(logTag) - return True -##--end of addLog() - - -def logSplit(log): - loginfo = log.strip().split(None, 3) - loginfo[0] = loginfo[0][1:] #-- Remove '[' - loginfo[1] = loginfo[1][0:-1] #-- Remove ']' - return loginfo -##--end of logSplit() - - -def getVolumeLog(volumeName, tailCount): - rs = ResponseXml() - if not volumeName: - rs.appendTagRoute("status.code", "-1") - rs.appendTagRoute("status.message", "No volume name given") - return rs.toprettyxml() - - if not tailCount: - rs.appendTagRoute("status.code", "-1") - rs.appendTagRoute("status.message", "No tail count given") - return rs.toprettyxml() - - thisServerName = getCurrentServerName() - if not thisServerName: - rs.appendTagRoute("status.code", "-2") - rs.appendTagRoute("status.message", "Failed to get current server name") - return rs.toprettyxml() - - volumeDom = XDOM() - partitionList = getPartitionListByServerName(volumeDom, thisServerName) - if not partitionList: - rs.appendTagRoute("status.code", "-3") - rs.appendTagRoute("status.message", "Failed to get server partition details") - return rs.toprettyxml() - - pattern = '\[\d{4}-\d{2}-\d{2}\s{1}\d{2}:\d{2}:\d{2}.\d+\]\s{1}([MACEWNIDT]){1}\s+' - logMessagesTag = rs.createTag("response.logMessages") - for partitionName in partitionList: - logMessageTag = rs.createTag("logMessage") - logMessageTag.appendChild("disk", "%s:%s" % (thisServerName, partitionName)) - - logDirectory = "%s/%s/%s/log" % (Globals.GLUSTER_LUN_DIR, partitionList[partitionName], volumeUuid) - logFileName = "%s/%s-%s-%s-exports-brick1.log" % (logDirectory, - Globals.GLUSTER_LUN_DIR[1:], - partitionList[partitionName], - volumeUuid) - if not os.path.exists(logFileName): - Utils.log("volume log file not found %s" % logFileName) - continue - fp = open(logFileName) - lines = [line for line in fp if re.match(pattern, line)] - fp.close() - i = len(lines) - int(tailCount) - if i < 0: - i = 0 - for log in lines[i:]: - loginfo = logSplit(log) - addLog(rs, logMessageTag, loginfo) - logMessagesTag.appendChild(logMessageTag) - return rs.toprettyxml() -##--end of getVolumeLog() - -def main(): - if len(sys.argv) != 3: - print >> sys.stderr, "usage: %s <disk name> <volume name>" % sys.argv[0] - sys.exit(-1) - - volumeName = sys.argv[1] - tailCount = sys.argv[2] - print getVolumeLog(volumeName, tailCount) - sys.exit(0) - -if __name__ == "__main__": - main() diff --git a/src/com.gluster.storage.management.gateway.scripts/src/backend/get_server_details.py b/src/com.gluster.storage.management.gateway.scripts/src/backend/get_server_details.py index ccd5815b..5c5b4c4a 100755 --- a/src/com.gluster.storage.management.gateway.scripts/src/backend/get_server_details.py +++ b/src/com.gluster.storage.management.gateway.scripts/src/backend/get_server_details.py @@ -15,6 +15,7 @@ import dbus import socket import re import Utils +import Protocol import DiskUtils from NetworkUtils import * from Disk import * @@ -22,10 +23,153 @@ from XmlHandler import ResponseXml from optparse import OptionParser +def getDiskDom(): + diskInfo = DiskUtils.getDiskInfo() + if not diskInfo: + return None + procMdstat = DiskUtils.getProcMdstat() + diskDom = Protocol.XDOM() + disksTag = diskDom.createTag("disks", None) + diskTagDict = {} + raidDisksTag = diskDom.createTag("raidDisks", None) + for raidDiskName, raidDisk in procMdstat.iteritems(): + raidDiskTag = diskDom.createTag("disk", None) + raidDiskTag.appendChild(diskDom.createTag("name", raidDiskName)) + raidDiskTag.appendChild(diskDom.createTag("description", diskInfo[raidDiskName]['Description'])) + raidDiskTag.appendChild(diskDom.createTag("uuid", diskInfo[raidDiskName]['Uuid'])) + raidDiskTag.appendChild(diskDom.createTag("type", "UNKNOWN")) + raidDiskTag.appendChild(diskDom.createTag("mountPoint", diskInfo[raidDiskName]['MountPoint'])) + raidDiskTag.appendChild(diskDom.createTag("fsType", diskInfo[raidDiskName]['FsType'])) + if diskInfo[raidDiskName]['FsType']: + raidDiskTag.appendChild(diskDom.createTag("status", "INITIALIZED")) + else: + raidDiskTag.appendChild(diskDom.createTag("status", "UNINITIALIZED")) + raidDiskTag.appendChild(diskDom.createTag("interface")) + raidDiskTag.appendChild(diskDom.createTag("fsVersion")) + raidDiskTag.appendChild(diskDom.createTag("size", diskInfo[raidDiskName]['Size'] / 1024.0)) + raidDiskTag.appendChild(diskDom.createTag("spaceInUse", diskInfo[raidDiskName]['SpaceInUse'])) + raidDisksTag.appendChild(raidDiskTag) + for raidMember in raidDisk['Member']: + # Case1: Raid array member is a disk. The following code will add the disk details under a disk tag + if diskInfo.has_key(raidMember): + diskTag = diskDom.createTag("disk", None) + diskTag.appendChild(diskDom.createTag("name", raidMember)) + diskTag.appendChild(diskDom.createTag("description", diskInfo[raidMember]["Description"])) + diskTag.appendChild(diskDom.createTag("uuid", diskInfo[raidMember]["Uuid"])) + if DiskUtils.isDiskInFormatting(raidMember): + diskTag.appendChild(diskDom.createTag("status", "INITIALIZING")) + else: + if diskInfo[raidMember]["FsType"]: + diskTag.appendChild(diskDom.createTag("status", "INITIALIZED")) + else: + diskTag.appendChild(diskDom.createTag("status", "UNINITIALIZED")) + diskTag.appendChild(diskDom.createTag("interface", diskInfo[raidMember]["Interface"])) + diskTag.appendChild(diskDom.createTag("mountPoint", diskInfo[raidMember]["MountPoint"])) + if diskInfo[raidMember]["FsType"]: + diskTag.appendChild(diskDom.createTag("type", "DATA")) + else: + diskTag.appendChild(diskDom.createTag("type", "UNKNOWN")) + diskTag.appendChild(diskDom.createTag("fsType", diskInfo[raidMember]["FsType"])) + diskTag.appendChild(diskDom.createTag("fsVersion", diskInfo[raidMember]["FsVersion"])) + diskTag.appendChild(diskDom.createTag("size", diskInfo[raidMember]["Size"] / 1024.0)) + diskTag.appendChild(diskDom.createTag("spaceInUse", diskInfo[raidMember]["SpaceInUse"])) + raidDiskTag.appendChild(diskTag) + del diskInfo[raidMember] + continue + # Case2: Raid array member is a partition. The following code will add the partition and its corresponding disk its belong to. + for disk, item in diskInfo.iteritems(): + if not item['Partitions'].has_key(raidMember): + continue + if not diskTagDict.has_key(disk): + diskTag = diskDom.createTag("disk", None) + diskTag.appendChild(diskDom.createTag("name", disk)) + diskTag.appendChild(diskDom.createTag("description", item["Description"])) + diskTag.appendChild(diskDom.createTag("uuid", item["Uuid"])) + diskTag.appendChild(diskDom.createTag("status", "INITIALIZED")) + diskTag.appendChild(diskDom.createTag("interface", item["Interface"])) + diskTag.appendChild(diskDom.createTag("mountPoint")) + diskTag.appendChild(diskDom.createTag("type", "DATA")) + diskTag.appendChild(diskDom.createTag("fsType", item["FsType"])) + diskTag.appendChild(diskDom.createTag("fsVersion", item["FsVersion"])) + diskTag.appendChild(diskDom.createTag("size", item["Size"] / 1024.0)) + diskTag.appendChild(diskDom.createTag("spaceInUse", item["SpaceInUse"])) + partitionsTag = diskDom.createTag("partitions", None) + diskTag.appendChild(partitionsTag) + raidDiskTag.appendChild(diskTag) + # Constructed disk tag will be added to the dictonary. + # This will be used to keep add all the corresponding partitions tags of the disk to the disk tag. + diskTagDict[disk] = {'diskTag': diskTag, 'partitionsTag': partitionsTag} + # adding partition details under this disk tag + partitionTag = diskDom.createTag("partition", None) + partitionTag.appendChild(diskDom.createTag("name", raidMember)) + partitionTag.appendChild(diskDom.createTag("uuid", item['Partitions'][raidMember]["Uuid"])) + partitionTag.appendChild(diskDom.createTag("fsType", item['Partitions'][raidMember]["FsType"])) + if item['Partitions'][raidMember]["FsType"]: + partitionTag.appendChild(diskDom.createTag("status", "INITIALIZED")) + partitionTag.appendChild(diskDom.createTag("type", "DATA")) + else: + partitionTag.appendChild(diskDom.createTag("status", "UNINITIALIZED")) + partitionTag.appendChild(diskDom.createTag("type", "UNKNOWN")) + partitionTag.appendChild(diskDom.createTag("mountPoint", item['Partitions'][raidMember]['MountPoint'])) + partitionTag.appendChild(diskDom.createTag("size", item['Partitions'][raidMember]["Size"] / 1024.0)) + partitionTag.appendChild(diskDom.createTag("spaceInUse", item['Partitions'][raidMember]["SpaceInUse"])) + diskTagDict[disk]['partitionsTag'].appendChild(partitionTag) + # deleting partition entry of a raid member from diskInfo (item['Partitions']) + del item['Partitions'][raidMember] + del diskInfo[raidDiskName] + disksTag.appendChild(raidDisksTag) + for diskName, value in diskInfo.iteritems(): + diskTag = diskDom.createTag("disk", None) + diskTag.appendChild(diskDom.createTag("name", diskName)) + diskTag.appendChild(diskDom.createTag("description", value["Description"])) + diskTag.appendChild(diskDom.createTag("uuid", value["Uuid"])) + if DiskUtils.isDiskInFormatting(diskName): + status = "INITIALIZING" + else: + if value["FsType"]: + status = "INITIALIZED" + else: + status = "UNINITIALIZED" + diskTag.appendChild(diskDom.createTag("status", status)) + diskTag.appendChild(diskDom.createTag("interface", value["Interface"])) + if value["MountPoint"] and value["MountPoint"] in ["/", "/boot"]: + diskTag.appendChild(diskDom.createTag("type", "BOOT")) + elif "UNINITIALIZED" == status: + diskTag.appendChild(diskDom.createTag("type", "UNKNOWN")) + else: + diskTag.appendChild(diskDom.createTag("type", "DATA")) + diskTag.appendChild(diskDom.createTag("fsType", value["FsType"])) + diskTag.appendChild(diskDom.createTag("fsVersion", value["FsVersion"])) + diskTag.appendChild(diskDom.createTag("mountPoint", value["MountPoint"])) + diskTag.appendChild(diskDom.createTag("size", value["Size"] / 1024.0)) + diskTag.appendChild(diskDom.createTag("spaceInUse", value["SpaceInUse"])) + partitionsTag = diskDom.createTag("partitions", None) + diskTag.appendChild(partitionsTag) + for partName, partValues in value['Partitions'].iteritems(): + partitionTag = diskDom.createTag("partition", None) + partitionTag.appendChild(diskDom.createTag("name", partName)) + partitionTag.appendChild(diskDom.createTag("uuid", partValues["Uuid"])) + partitionTag.appendChild(diskDom.createTag("fsType", partValues["FsType"])) + if partValues["FsType"]: + partitionTag.appendChild(diskDom.createTag("status", "INITIALIZED")) + partitionTag.appendChild(diskDom.createTag("type", "DATA")) + else: + partitionTag.appendChild(diskDom.createTag("status", "UNINITIALIZED")) + partitionTag.appendChild(diskDom.createTag("type", "UNKNOWN")) + partitionTag.appendChild(diskDom.createTag("mountPoint", partValues['MountPoint'])) + partitionTag.appendChild(diskDom.createTag("size", partValues["Size"] / 1024.0)) + partitionTag.appendChild(diskDom.createTag("spaceInUse", partValues["SpaceInUse"])) + partitionsTag.appendChild(partitionTag) + continue + disksTag.appendChild(diskTag) + diskDom.addTag(disksTag) + return diskDom + + def getServerDetails(listall): serverName = socket.getfqdn() - meminfo = getMeminfo() - cpu = getCpuUsageAvg() + meminfo = Utils.getMeminfo() + cpu = Utils.getCpuUsageAvg() nameServerList, domain, searchDomain = readResolvConfFile() if not domain: domain = [None] @@ -57,7 +201,7 @@ def getServerDetails(listall): deviceList[device["device"]] = device try: macAddress = open("/sys/class/net/%s/address" % device["device"]).read().strip() - except IOError: + except IOError, e: continue interfaceTag = responseDom.createTag("networkInterface", None) interfaceTag.appendChild(responseDom.createTag("name", device["device"])) @@ -88,12 +232,7 @@ def getServerDetails(listall): responseDom.appendTag(serverTag) serverTag.appendChild(responseDom.createTag("numOfCPUs", int(os.sysconf('SC_NPROCESSORS_ONLN')))) - try: - diskDom = DiskUtils.getDiskDom() - except dbus.dbus_bindings.DBusException, e: - sys.stderr.write("%s. Please check if HAL services are running\n" % str(e)) - Utils.log("failed to get disk details :%s" % str(e)) - sys.exit(1) + diskDom = getDiskDom() if not diskDom: sys.stderr.write("No disk found!") Utils.log("Failed to get disk details") diff --git a/src/com.gluster.storage.management.gateway.scripts/src/backend/get_volume_log.py b/src/com.gluster.storage.management.gateway.scripts/src/backend/get_volume_log.py deleted file mode 100755 index c4c97a51..00000000 --- a/src/com.gluster.storage.management.gateway.scripts/src/backend/get_volume_log.py +++ /dev/null @@ -1,126 +0,0 @@ -#!/usr/bin/python -# Copyright (C) 2011 Gluster, Inc. <http://www.gluster.com> -# This file is part of Gluster Storage Platform. -# - -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 Globals -import Utils -from VolumeUtils import * -from XmlHandler import ResponseXml - - -def enumLogType(logCode): - if "M" == logCode.upper(): - return "EMERGENCY" - elif "A" == logCode.upper(): - return "ALERT" - elif "C" == logCode.upper(): - return "CRITICAL" - elif "E" == logCode.upper(): - return "ERROR" - elif "W" == logCode.upper(): - return "WARNING" - elif "N" == logCode.upper(): - return "NOTICE" - elif "I" == logCode.upper(): - return "INFO" - elif "D" == logCode.upper(): - return "DEBUG" - elif "T" == logCode.upper(): - return "TRACE" - else: - return "UNKNOWN" -##--end of enumLogType() - - -def addLog(responseDom, logMessageTag, loginfo): - logTag = responseDom.createTag("log", None) - logTag.appendChild(responseDom.createTag("date", loginfo[0])) - logTag.appendChild(responseDom.createTag("time", loginfo[1])) - logTag.appendChild(responseDom.createTag("type", enumLogType(loginfo[2]))) - logTag.appendChild(responseDom.createTag("message", loginfo[3])) - logMessageTag.appendChild(logTag) - return True -##--end of addLog() - - -def logSplit(log): - loginfo = log.strip().split(None, 3) - loginfo[0] = loginfo[0][1:] #-- Remove '[' - loginfo[1] = loginfo[1][0:-1] #-- Remove ']' - return loginfo -##--end of logSplit() - - -def getVolumeLog(volumeName, tailCount): - rs = ResponseXml() - if not volumeName: - rs.appendTagRoute("status.code", "-1") - rs.appendTagRoute("status.message", "No volume name given") - return rs.toprettyxml() - - if not tailCount: - rs.appendTagRoute("status.code", "-1") - rs.appendTagRoute("status.message", "No tail count given") - return rs.toprettyxml() - - thisServerName = getCurrentServerName() - if not thisServerName: - rs.appendTagRoute("status.code", "-2") - rs.appendTagRoute("status.message", "Failed to get current server name") - return rs.toprettyxml() - - volumeDom = XDOM() - partitionList = getPartitionListByServerName(volumeDom, thisServerName) - if not partitionList: - rs.appendTagRoute("status.code", "-3") - rs.appendTagRoute("status.message", "Failed to get server partition details") - return rs.toprettyxml() - - pattern = '\[\d{4}-\d{2}-\d{2}\s{1}\d{2}:\d{2}:\d{2}.\d+\]\s{1}([MACEWNIDT]){1}\s+' - logMessagesTag = rs.createTag("response.logMessages") - for partitionName in partitionList: - logMessageTag = rs.createTag("logMessage") - logMessageTag.appendChild("disk", "%s:%s" % (thisServerName, partitionName)) - - logDirectory = "%s/%s/%s/log" % (Globals.GLUSTER_LUN_DIR, partitionList[partitionName], volumeUuid) - logFileName = "%s/%s-%s-%s-exports-brick1.log" % (logDirectory, - Globals.GLUSTER_LUN_DIR[1:], - partitionList[partitionName], - volumeUuid) - if not os.path.exists(logFileName): - Utils.log("volume log file not found %s" % logFileName) - continue - fp = open(logFileName) - lines = [line for line in fp if re.match(pattern, line)] - fp.close() - i = len(lines) - int(tailCount) - if i < 0: - i = 0 - for log in lines[i:]: - loginfo = logSplit(log) - addLog(rs, logMessageTag, loginfo) - logMessagesTag.appendChild(logMessageTag) - return rs.toprettyxml() -##--end of getVolumeLog() - -def main(): - if len(sys.argv) != 3: - print >> sys.stderr, "usage: %s <disk name> <volume name>" % sys.argv[0] - sys.exit(-1) - - volumeName = sys.argv[1] - tailCount = sys.argv[2] - print getVolumeLog(volumeName, tailCount) - sys.exit(0) - -if __name__ == "__main__": - main() diff --git a/src/com.gluster.storage.management.gateway.scripts/src/backend/rrd_update_cpu_details.py b/src/com.gluster.storage.management.gateway.scripts/src/backend/rrd_update_cpu_details.py deleted file mode 100755 index 9f93b84b..00000000 --- a/src/com.gluster.storage.management.gateway.scripts/src/backend/rrd_update_cpu_details.py +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/python -# Copyright (C) 2011 Gluster, Inc. <http://www.gluster.com> -# This file is part of Gluster Storage Platform. -# - -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) -from XmlHandler import ResponseXml -import Utils - -def createMemData(file, step): - rs = ResponseXml() - command = ["rrdtool", "create", file, "--step=%s" % step, - "DS:user:COUNTER:600:0:U", - "DS:system:COUNTER:600:0:U", - "DS:idle:COUNTER:600:0:U", - "RRA:AVERAGE:0.5:1:576", - "RRA:AVERAGE:0.5:6:672", - "RRA:AVERAGE:0.5:24:732", - "RRA:AVERAGE:0.5:144:1460"] - - rv = Utils.runCommand(command, output=True, root=True) - message = Utils.stripEmptyLines(rv["Stdout"]) - if rv["Stderr"]: - error = Utils.stripEmptyLines(rv["Stderr"]) - message += "Error: [%s]" % (error) - Utils.log("failed to create RRD file for cpu usages %s" % file) - rs.appendTagRoute("status.code", rv["Status"]) - rs.appendTagRoute("status.message", message) - return rs.toxml() - return None - -def updateMemData(file): - rs = ResponseXml() - user = None - system = None - idle = None - for line in open("/proc/stat").readlines(): - if line.startswith("cpu"): - cpudetails = line.split() - if "cpu" == cpudetails[0]: - user = cpudetails[1] - system = cpudetails[3] - idle = cpudetails[4] - break - - if None == user: - Utils.log("failed to fetch cpu details from /proc/stat") - rs.appendTagRoute("status.code", "-1") - rs.appendTagRoute("status.message", "failed to fetch cpu details") - return rs.toxml() - - command = ["rrdtool", "update", file, "-t", "user:system:idle", - "N:%s:%s:%s" % (user, system, idle)] - rv = Utils.runCommand(command, output=True, root=True) - if rv["Stderr"]: - error = Utils.stripEmptyLines(rv["Stderr"]) - message = "Error: [%s]" % (error) - Utils.log("failed to update cpu usage into rrd file %s" % file) - rs.appendTagRoute("status.code", rv["Status"]) - rs.appendTagRoute("status.message", message) - return rs.toxml() - return None - - -def main(): - cpuRrdFile = "/var/lib/rrd/cpu.rrd" - if not os.path.exists(cpuRrdFile): - status = createMemData(cpuRrdFile, 100) - if status: - print status - status = updateMemData(cpuRrdFile) - if status: - print status - sys.exit(0) - -if __name__ == "__main__": - main() diff --git a/src/com.gluster.storage.management.gateway.scripts/src/backend/rrd_update_memory_details.py b/src/com.gluster.storage.management.gateway.scripts/src/backend/rrd_update_memory_details.py deleted file mode 100755 index 2639d490..00000000 --- a/src/com.gluster.storage.management.gateway.scripts/src/backend/rrd_update_memory_details.py +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/python -# Copyright (C) 2011 Gluster, Inc. <http://www.gluster.com> -# This file is part of Gluster Storage Platform. -# - -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) -from XmlHandler import ResponseXml -import Utils - -def createMemData(file, step): - rs = ResponseXml() - command = ["rrdtool", "create", file, "--step=%s" % step, - "DS:memused:ABSOLUTE:600:0:U", - "DS:memfree:ABSOLUTE:600:0:U", - "DS:memcache:ABSOLUTE:600:0:U", - "DS:swapused:ABSOLUTE:600:0:U", - "DS:swapfree:ABSOLUTE:600:0:U", - "RRA:AVERAGE:0.5:1:576", - "RRA:AVERAGE:0.5:6:672", - "RRA:AVERAGE:0.5:24:732", - "RRA:AVERAGE:0.5:144:1460"] - - rv = Utils.runCommand(command, output=True, root=True) - message = Utils.stripEmptyLines(rv["Stdout"]) - if rv["Stderr"]: - error = Utils.stripEmptyLines(rv["Stderr"]) - message += "Error: [%s]" % (error) - Utils.log("failed to create RRD file for memory usages %s" % file) - rs.appendTagRoute("status.code", rv["Status"]) - rs.appendTagRoute("status.message", message) - return rs.toxml() - return None - -def updateMemData(file): - rs = ResponseXml() - command = ["free", "-b", "-o"] - rv = Utils.runCommand(command, output=True, root=True) - if rv["Stderr"]: - error = Utils.stripEmptyLines(rv["Stderr"]) - message += "Error: [%s]" % (error) - Utils.log("failed to retrieve memory details") - rs.appendTagRoute("status.code", rv["Status"]) - rs.appendTagRoute("status.message", message) - return rs.toxml() - - message = rv["Stdout"].split() - command = ["rrdtool", "update", file, "-t", "memused:memfree:memcache:swapused:swapfree", - "N:%s:%s:%s:%s:%s" % (message[8], message[9], message[12], message[14], message[15])] - rv = Utils.runCommand(command, output=True, root=True) - if rv["Stderr"]: - error = Utils.stripEmptyLines(rv["Stderr"]) - message += "Error: [%s]" % (error) - Utils.log(syslog.LOG_ERR, "failed to update memory usage into rrd file %s" % file) - rs.appendTagRoute("status.code", rv["Status"]) - rs.appendTagRoute("status.message", message) - return rs.toxml() - return None - - -def main(): - #if len(sys.argv) != 2: - # print >> sys.stderr, "usage: %s <step>" % sys.argv[0] - # sys.exit(-1) - #step = sys.argv[1] - - memRrdFile = "mem.rrd" - if not os.path.exists(memRrdFile): - status = createMemData(memRrdFile, 100) - if status: - print status - status = updateMemData(memRrdFile) - if status: - print status - sys.exit(0) - -if __name__ == "__main__": - main() diff --git a/src/com.gluster.storage.management.gateway.scripts/src/common/Globals.py b/src/com.gluster.storage.management.gateway.scripts/src/common/Globals.py index ea37fa92..26a74bfd 100644 --- a/src/com.gluster.storage.management.gateway.scripts/src/common/Globals.py +++ b/src/com.gluster.storage.management.gateway.scripts/src/common/Globals.py @@ -11,71 +11,33 @@ SERVER_PORT = 24731 DEFAULT_BACKLOG = 5 DEFAULT_TIMEOUT = 3 DEFAULT_ID_LENGTH = 16 - GLUSTER_PLATFORM_VERSION = "3.2" ## System configuration constants SYSCONFIG_NETWORK_DIR = "/etc/sysconfig/network-scripts" -DNSMASQ_CONF_DIR = "/etc/dnsmasq.d" - FSTAB_FILE = "/etc/fstab" -NFS_EXPORTS_FILE = "/etc/exports" SAMBA_CONF_FILE = "/etc/samba/smb.conf" -TIMEZONE_FILE = "/etc/timezone" -ZONEINFO_DIR = "/usr/share/zoneinfo" -LOCALTIME_FILE = "/etc/localtime" -KERBEROS_CONF_FILE = "/etc/krb5.conf" -NSSWITCH_CONF_FILE = "/etc/nsswitch.conf" -NTP_CONF_FILE = "/etc/ntp.conf" +REAL_SAMBA_CONF_FILE = "/etc/samba/real.smb.conf" MODPROBE_CONF_FILE = "/etc/modprobe.d/bonding.conf" -SYSCONFIG_NETWORK_FILE = "/etc/sysconfig/network" RESOLV_CONF_FILE = "/etc/resolv.conf" DNSMASQ_LEASE_FILE = "/var/tmp/dnsmasq.leases" LIVE_MODE_FILE = "/etc/live" -ADD_SERVER_COMPLETED_FILE = "/var/tmp/installation-completed" - -DNSMASQ_DNS_CONF_FILE = DNSMASQ_CONF_DIR + "/dns.conf" +DNSMASQ_CONF_DIR = "/etc/dnsmasq.d" DNSMASQ_DHCP_CONF_FILE = DNSMASQ_CONF_DIR + "/dhcp.conf" -## - -## Base constants -MAX_PARTITION_SIZE = 16777216 # 16 TB -OS_PARTITION_SIZE = 4000 # 4 GB -SESSION_TIMEOUT = 1800 # 30 minutes -SERVER_AGENT_PORT = 50000 - -BOOT_PARTITION_LABEL = "GLUSTEROS" DATA_PARTITION_LABEL = "GLUSTERDATA" VOLUME_USER_DESCRIPTION = "Gluster Volume User" -SERVER_AGENT_RUN_USERNAME = "gluster" +GLUSTER_BASE_DIR = "/etc/glustermg" +REEXPORT_DIR = "/reexport" +CIFS_EXPORT_DIR = "/cifs" +GLUSTER_UPDATES_FILE = "updates.xml" INSTALLER_SERVER_NAME = "$installer$" -GLUSTER_BASE_DIR = "/etc/glustermg" -GLUSTER_LUN_DIR = "/data" -REEXPORT_DIR = "/reexport" -NFS_EXPORT_DIR = "/nfs" -CIFS_EXPORT_DIR = "/cifs" -WEBDAV_DOCUMENT_ROOT_DIR = "/var/www/html" -UPDATES_DIR = "/UPDATES" -TRANSPORT_HOME_DIR = "/transport" -GLUSTERFS_LOG_DIR = "/var/log/glusterfs" -LOG_DIR = "/var/log/glustermg" - -GLUSTER_UPDATES_FILE = "updates.xml" -INSTALLER_STATUS_FILE = "/var/log/install-server-status.log" -INSTALL_PLATFORM_LOCK_FILE = "/var/lock/install-gluster-platform.lock" -LAST_ACCESSED_NETWORK_FILE = "last-accessed-network" -PREPARE_DATA_DISK_LOCK_FILE = "/var/tmp/prepare-data-disk.lock" -## - ## Derived constants GLUSTER_CONF_DIR = GLUSTER_BASE_DIR + "/conf" GLUSTER_TMP_DIR = GLUSTER_BASE_DIR + "/tmp" VOLUME_CONF_DIR = GLUSTER_BASE_DIR + "/volumes" SERVER_CONF_DIR = GLUSTER_BASE_DIR + "/servers" DNS_RECORDS_DIR = GLUSTER_BASE_DIR + "/dns-records" -INSTALLER_CONF_DIR = SERVER_CONF_DIR + "/" + INSTALLER_SERVER_NAME - GSN_USER_INFO_FILE = GLUSTER_BASE_DIR + "/gsn-user.info" GLUSTER_VERSION_FILE = GLUSTER_BASE_DIR + "/version" GLUSTER_UPDATE_SITE_FILE = GLUSTER_BASE_DIR + "/update-site" @@ -86,37 +48,12 @@ SERVER_COUNT_FILE = GLUSTER_BASE_DIR + "/server-count" SIGNATURE_FILE = GLUSTER_BASE_DIR + "/.signature" GLUSTER_SERVER_POOL_FILE = GLUSTER_BASE_DIR + "/pool" GLUSTER_ADMIN_FILE = GLUSTER_BASE_DIR + "/.password" - +INSTALLER_CONF_DIR = SERVER_CONF_DIR + "/" + INSTALLER_SERVER_NAME VOLUME_SMBCONF_FILE = VOLUME_CONF_DIR + "/volumes.smbconf.list" - GLOBAL_NETWORK_FILE = INSTALLER_CONF_DIR + "/network.xml" -INSTALL_SERVER_CONF_FILE = INSTALLER_CONF_DIR + "/installer.xml" -INSTALLER_INFO_FILE = INSTALLER_CONF_DIR + "/installer.info" INSTALLED_SERVER_COUNT_FILE = INSTALLER_CONF_DIR + "/installed-server-count" -SESSION_FILE = GLUSTER_TMP_DIR + "/login.sessions" - -GENERAL_LOG_FILE = LOG_DIR + "/general.log" -INSTALLER_LOG_FILE = LOG_DIR + "/installer.log" -PEER_AGENT_LOG_FILE = LOG_DIR + "/peeragent.log" -SERVER_AGENT_LOG_FILE = LOG_DIR + "/serveragent.log" -TRANSPORT_AGENT_LOG_FILE = LOG_DIR + "/transport.log" -## - - -## Global variables -## TODO: These should be removed -DOWNLOAD_GLUSTER_UPDATE_PROCESS = None -DOWNLOAD_GLUSTER_UPDATE_LEVEL = None -DOWNLOAD_GLUSTER_CURRENT_UPDATE_LEVEL = None -DOWNLOAD_GLUSTER_UPDATE_MD5SUM = None -REQUEST_MAP = {} -VERSION_DICTONARY = {} -## - AWS_WEB_SERVICE_URL = "http://169.254.169.254/latest" -REAL_SAMBA_CONF_FILE = "/etc/samba/real.smb.conf" - DEFAULT_UID = 1024000 CIFS_USER_FILE = "/opt/glustermg/etc/users.cifs" CIFS_VOLUME_FILE = "/opt/glustermg/etc/volumes.cifs" diff --git a/src/com.gluster.storage.management.gateway.scripts/src/common/Protocol.py b/src/com.gluster.storage.management.gateway.scripts/src/common/Protocol.py index a11164f7..9649e534 100644 --- a/src/com.gluster.storage.management.gateway.scripts/src/common/Protocol.py +++ b/src/com.gluster.storage.management.gateway.scripts/src/common/Protocol.py @@ -189,7 +189,7 @@ class XDOM: self._domObj.writexml(fp, indent, addindent, newl) fp.close() return True - except IOError: + except IOError, e: return False def toString(self, indent=" ", newl="\n", encoding = None): @@ -210,7 +210,7 @@ class XDOM: return None try: return self.getElementsByTagName("command")[0].getAttribute(attributeName) - except IndexError: + except IndexError, e: return False def setAttribute(self, attributeName, attributeValue): @@ -218,7 +218,7 @@ class XDOM: return None try: return self.getElementsByTagName("command")[0].setAttribute(attributeName, attributeValue) - except IndexError: + except IndexError, e: return False def getRequestCommand(self): @@ -269,9 +269,9 @@ class RequestXml(XDOM): self._domObj = MDOM.parse(requestString) elif XML_STRING == type: self._domObj = MDOM.parseString(requestString) - except IOError: + except IOError, e: XDOM.__init__(self) - except xml.parsers.expat.ExpatError: + except xml.parsers.expat.ExpatError, e: XDOM.__init__(self) ##--end of RequestXML diff --git a/src/com.gluster.storage.management.gateway.scripts/src/common/Utils.py b/src/com.gluster.storage.management.gateway.scripts/src/common/Utils.py index 03e7eb58..874acaa8 100644 --- a/src/com.gluster.storage.management.gateway.scripts/src/common/Utils.py +++ b/src/com.gluster.storage.management.gateway.scripts/src/common/Utils.py @@ -21,12 +21,8 @@ import time import tempfile import grp import pwd -import inspect -from datetime import datetime -import urllib import Globals -import Protocol RUN_COMMAND_ERROR = -1024 LOG_SYSLOG = 1 @@ -35,116 +31,6 @@ LOG_FILE_NAME = None LOG_FILE_OBJ = None logOpened = False -def _getLogCode(priority): - if syslog.LOG_EMERG == priority: - return "M" - elif syslog.LOG_ALERT == priority: - return "A" - elif syslog.LOG_CRIT == priority: - return "C" - elif syslog.LOG_ERR == priority: - return "E" - elif syslog.LOG_WARNING == priority: - return "W" - elif syslog.LOG_NOTICE == priority: - return "N" - elif syslog.LOG_INFO == priority: - return "I" - elif syslog.LOG_DEBUG == priority: - return "D" - else: # UNKNOWN - return "X" - - -def setLogFile(fileName): - global LOG_FILE_NAME - - if fileName: - LOG_FILE_NAME = fileName - return True - return False - - -def closeLog(): - global LOG_FILE_OBJ - global SYSLOG_REQUIRED - - if SYSLOG_REQUIRED: - syslog.closelog() - SYSLOG_REQUIRED = False - return True - - if LOG_FILE_OBJ: - try: - LOG_FILE_OBJ.close() - LOG_FILE_OBJ = None - except IOError, e: - sys.stderr.write("Failed to close file: %s\n" % e) - return False - return True - - -def openLog(fileName=None): - global LOG_FILE_NAME - global LOG_FILE_OBJ - global SYSLOG_REQUIRED - - if fileName == LOG_SYSLOG: - syslog.openlog(os.path.basename(sys.argv[0])) - SYSLOG_REQUIRED = True - return True - - if fileName: - LOG_FILE_NAME = fileName - - if not LOG_FILE_NAME: - return False - - closeLog() - - try: - LOG_FILE_OBJ = open(LOG_FILE_NAME, "a") - except IOError, e: - sys.stderr.write("Failed to open file %s: %s\n" % (LOG_FILE_NAME, e)) - return False - return True - -def record(priority, message=None): - global LOG_FILE_OBJ - global SYSLOG_REQUIRED - - stack = inspect.stack()[1] - if stack[3] == "<module>": - prefix = "%s:%s:%s" % (stack[1], stack[2], stack[3]) - else: - prefix = "%s:%s:%s()" % (stack[1], stack[2], stack[3]) - - if type(priority) == type("") or type(priority) == type(u""): - logPriority = syslog.LOG_INFO - logMessage = priority - else: - logPriority = priority - logMessage = message - - if SYSLOG_REQUIRED: - syslog.syslog(logPriority, "[%s]: %s" % (prefix, logMessage)) - return - - fp = sys.stderr - if LOG_FILE_OBJ: - fp = LOG_FILE_OBJ - - fp.write("[%s] %s [%s]: %s" % (str(datetime.now()), _getLogCode(logPriority), prefix, logMessage)) - if logMessage[-1] != '\n': - fp.write("\n") - fp.flush() - return - - -def trace(message): - if message: - log(syslog.LOG_DEBUG, message) - def isString(value): return (type(value) == type("") or type(value) == type(u"")) @@ -260,22 +146,22 @@ def runCommandFG(command, stdout=False, stderr=False, def IP2Number(ipString): try: return socket.htonl(struct.unpack("I", socket.inet_aton(ipString))[0]) - except socket.error: + except socket.error, e: return None - except TypeError: + except TypeError, e: return None - except struct.error: + except struct.error, e: return None def Number2IP(number): try: return socket.inet_ntoa(struct.pack("I", socket.ntohl(number))) - except socket.error: + except socket.error, e: return None - except AttributeError: + except AttributeError, e: return None - except ValueError: + except ValueError, e: return None @@ -292,7 +178,7 @@ def computeHostName(hostName): hostPrefix = hostName[:pos+1] try: hostIndex = int(hostName[pos+1:]) - except ValueError: + except ValueError, e: hostIndex = 0 # TODO: Check the availablity of the (server) name return "%s%s" % (hostPrefix, hostIndex + 1) @@ -304,7 +190,7 @@ def daemonize(): if pid > 0: # exit first parent sys.exit(0) - except OSError, e: + except OSError, e: #sys.stderr.write("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror)) return False @@ -339,7 +225,7 @@ def getDownloadStatus(fileName): try: lines = [line for line in open(fileName) if "saved" in line or "%" in line] - except IOError: + except IOError, e: return 0 if not lines: return 0 @@ -406,8 +292,8 @@ def getCpuUsageAvg(): def getLoadavg(): try: loadavgstr = open('/proc/loadavg', 'r').readline().strip() - except IOError: - syslog.syslog(syslog.LOG_ERR, "failed to find cpu load") + except IOError, e: + syslog.syslog(syslog.LOG_ERR, "failed to find cpu load: %s" % str(e)) return None data = map(float, loadavgstr.split()[1:]) @@ -439,173 +325,33 @@ def getInfinibandPortStatus(): return portkeys -def getServerCount(): - try: - return int(open(Globals.SERVER_COUNT_FILE).read().strip()) - except IOError: - log("failed to read file %s" % Globals.SERVER_COUNT_FILE) - return 1 - except ValueError: - log("invalid number format in file %s" % Globals.SERVER_COUNT_FILE) - return 1 - - -def setServerCount(count): - try: - open(Globals.SERVER_COUNT_FILE, "w").write("%s\n" % count) - return True - except IOError: - log("failed to write file %s" % Globals.SERVER_COUNT_FILE) - return False - - -def getInstalledServerCount(): - try: - return int(open(Globals.INSTALLED_SERVER_COUNT_FILE).read().strip()) - except IOError: - log("failed to read file %s" % Globals.INSTALLED_SERVER_COUNT_FILE) - return 1 - except ValueError: - log("invalid number format in file %s" % Globals.INSTALLED_SERVER_COUNT_FILE) - return 1 - - -def setInstalledServerCount(count): - try: - open(Globals.INSTALLED_SERVER_COUNT_FILE, "w").write("%s\n" % count) - return True - except IOError: - log("failed to write file %s" % Globals.INSTALLED_SERVER_COUNT_FILE) - return False - - -def getLastInstalledServerIpList(): - ipList = {} - networkDom = Protocol.XDOM() - if not networkDom.parseFile(Globals.GLOBAL_NETWORK_FILE): - log("failed to parse file %s" % Globals.GLOBAL_NETWORK_FILE) - for tagE in networkDom.getElementsByTagRoute("server.interface"): - interfaceDom = Protocol.XDOM() - interfaceDom.setDomObj(tagE) - ipAddress = interfaceDom.getTextByTagRoute("ipaddr") - if ipAddress: - ipList[interfaceDom.getTextByTagRoute("device")] = ipAddress - return ipList - - -def getFreeIpAddress(device=None): - serverCount = getServerCount() - installedServerCount = getInstalledServerCount() - if serverCount == installedServerCount: - return None - - availableServerCount = serverCount - installedServerCount - ipList = getLastInstalledServerIpList() - - if not ipList: - return None - - if device: - if device not in ipList.keys(): - return None - deviceIpAddress = ipList[device] - else: - deviceIpAddress = ipList.values()[0] - ipNumber = IP2Number(deviceIpAddress) - - for i in range((ipNumber + availableServerCount), ipNumber, -1): - ipAddress = Number2IP(i) - if runCommandFG(["ping", "-qnc", "1", ipAddress]) != 0: - return ipAddress - return None - - def getPasswordHash(userName): try: #return spwd.getspnam(userName).sp_pwd return "Not implimented" - except KeyError: + except KeyError, e: return None -def getTransactionKey(): - try: - tokens = open(Globals.TRANSACTION_KEY_FILE).read().split(',') - except IOError: - return None, None - return tokens - - def generateSignature(): #return str(uuid.uuid4()) + ('--%f' % time.time()) return ('--%f' % time.time()) -def getSignature(): - try: - return open(Globals.SIGNATURE_FILE).read().strip() - except IOError: - log(syslog.LOG_ERR, "unable to read signaure from %s file" % Globals.SIGNATURE_FILE) - return False - - -def storeSignature(signature, fileName=Globals.SIGNATURE_FILE): - try: - open(fileName, "w").write(signature + "\n") - except IOError: - log(syslog.LOG_ERR, "unable to write signature %s to %s file" % (signature, fileName)) - return False - return True - - def isUserExist(userName): try: grp.getgrnam(userName).gr_gid return True - except KeyError: + except KeyError, e: pass try: pwd.getpwnam(userName).pw_uid return True - except KeyError: + except KeyError, e: pass return False -def getGsnUserInfo(fileName=Globals.GSN_USER_INFO_FILE): - userInfo = {} - userInfo["UserId"] = None - userInfo["Password"] = None - try: - for line in open(fileName): - line = line.strip() - k = line[:line.index("=")] - v = line[line.index("=") + 1:] - if v[0] == "'" or v[0] == '"': - v = v[1:] - if v[-1] == "'" or v[-1] == '"': - v = v[:-1] - if k.upper() == "GSN_ID": - userInfo["UserId"] = v - if k.upper() == "GSN_PASSWORD": - userInfo["Password"] = v - except IOError, e: - log("Failed to read file %s: %s" % (fileName, e)) - return userInfo - - -def setGsnUserInfo(userInfo, fileName=Globals.GSN_USER_INFO_FILE): - try: - fp = open(fileName, "w") - fp.write("GSN_ID=%s\n" % userInfo["UserId"]) - fp.write("GSN_PASSWORD=%s\n" % userInfo["Password"]) - fp.close() - return True - except IOError, e: - log("Failed to write file %s: %s" % (fileName, e)) - return False - - def getPlatformVersion(fileName=Globals.GLUSTER_VERSION_FILE): versionInfo = {} versionInfo["Version"] = None @@ -625,7 +371,7 @@ def getPlatformVersion(fileName=Globals.GLUSTER_VERSION_FILE): if k.upper() == "UPDATE": versionInfo["Update"] = v except IOError, e: - log("Failed to read file %s: %s" % (fileName, e)) + log("Failed to read file %s: %s" % (fileName, str(e))) return versionInfo @@ -649,42 +395,10 @@ def setPlatformVersion(versionInfo, fileName=Globals.GLUSTER_VERSION_FILE): fp.close() return True except IOError, e: - log("Failed to write file %s: %s" % (fileName, e)) + log("Failed to write file %s: %s" % (fileName, str(e))) return False -def getGlusterUpdateDom(serverVersion): - errorMessage = "" - updateInfoDom = None - try: - baseUrl = open(Globals.GLUSTER_UPDATE_SITE_FILE).read().strip() - except IOError, e: - log("Failed to read file %s: %s" % (Globals.GLUSTER_UPDATE_SITE_FILE, e)) - errorMessage = "Failed to read update site file" - return updateInfoDom, errorMessage - - try: - url = "%s/%s/%s" % (baseUrl, serverVersion, Globals.GLUSTER_UPDATES_FILE) - connection = urllib.urlopen(url) - if connection.getcode() != 200: - connection.close() - errorMessage = "Error received from server to open URL %s" % url - return updateInfoDom, errorMessage - updateInfoString = connection.read() - connection.close() - except IOError, e: - log("Failed to get update information from URL %s: %s" % (url, e)) - errorMessage = "Error getting update information" - return updateInfoDom, errorMessage - - updateInfoDom = Protocol.XDOM() - if not updateInfoDom.parseString(updateInfoString): - log("XML parse error on update information content [%s]" % updateInfoString) - errorMessage = "Parse error on update information" - updateInfoDom = None - return updateInfoDom, errorMessage - - def removeFile(fileName, root=False): if root: if runCommand("rm %s" % fileName, root=True) == 0: @@ -694,7 +408,7 @@ def removeFile(fileName, root=False): os.remove(fileName) return True except OSError, e: - log("Failed to remove file %s: %s" % (fileName, e)) + log("Failed to remove file %s: %s" % (fileName, str(e))) return False @@ -711,9 +425,9 @@ def getIPIndex(indexFile): line = fp.readline() fp.close() index = int(line) - except IOError: + except IOError, e: index = 0 - except ValueError: + except ValueError, e: index = False return index @@ -722,34 +436,34 @@ def setIPIndex(index, indexFile): fp = open(indexFile, "w") fp.write(str(index)) fp.close() - except IOError: + except IOError, e: return False return True def IP2Number(ipString): try: return socket.htonl(struct.unpack("I", socket.inet_aton(ipString))[0]) - except socket.error: + except socket.error, e: return None - except TypeError: + except TypeError, e: return None - except struct.error: + except struct.error, e: return None def Number2IP(number): try: return socket.inet_ntoa(struct.pack("I", socket.ntohl(number))) - except socket.error: + except socket.error, e: return None - except AttributeError: + except AttributeError, e: return None - except ValueError: + except ValueError, e: return None def hasEntryFoundInFile(searchString, dnsEntryFileName): try: addServerEntryList = open(dnsEntryFileName).read().split() - except IOError: + except IOError, e: return None if searchString in addServerEntryList: return True @@ -765,8 +479,8 @@ def computeIpAddress(ipAddress, startIp, endIp): while True: nextIpNumber = nextIpNumber + 1 ipAddress = Number2IP(nextIpNumber) - rv = runCommandFG(["ping", "-qnc", "1", ipAddress]) - if type(rv) == type(True): + rv = runCommand("ping -qnc 1 %s" % ipAddress, output=True) + if rv["Status"] != 0: return False if rv != 0: break @@ -778,8 +492,8 @@ def computeIpAddress(ipAddress, startIp, endIp): while True: ipAddress = Number2IP(nextIpNumber) nextIpNumber = nextIpNumber + 1 - rv = runCommandFG(["ping", "-qnc", "1", ipAddress]) - if type(rv) == type(True): + rv = runCommand("ping -qnc 1 %s" % ipAddress, output=True) + if rv["Status"] != 0: return False if rv != 0: break @@ -795,7 +509,7 @@ def setHostNameAndIp(hostName, ipAddress, lastAddServerDetailFile): fp.write("HOSTNAME=" + hostName + "\n") fp.write("IPADDRESS=" + ipAddress); fp.close() - except IOError: + except IOError, e: return False return True @@ -805,9 +519,9 @@ def getPort(): portString = fd.readline() fd.close() port = int(portString) - except IOError: + except IOError, e: port = Globals.DEFAULT_PORT - 2 - except ValueError: + except ValueError, e: port = Globals.DEFAULT_PORT - 2 return port @@ -816,84 +530,10 @@ def setPort(port): fd = open(Globals.PORT_FILE, "w") fd.write(str(port)) fd.close() - except IOError: + except IOError, e: return False return True -def getServerAgentCredentials(): - try: - lines = open(Globals.SERVERAGENT_AUTH_FILE).readlines() - except IOError: - return None,None - - userName = None - password = None - - for l in lines: - if l[-1] == '\n': - l = l[:-1] - k = l[:l.index('=')] - v = l[l.index('=') + 1:] - if v[0] == "'" or v[0] == '"': - v = v[1:] - if v[-1] == "'" or v[-1] == '"': - v = v[:-1] - if k.upper() == "AGENT_ID": - userName = v - if k.upper() == "AGENT_PASSWORD": - password = v - - return userName, password - -def getGatewayAgentCredentials(): - try: - lines = open(Globals.GATEWAYAGENT_AUTH_FILE).readlines() - except IOError: - return None - - #userName = None - password = None - - for l in lines: - if l[-1] == '\n': - l = l[:-1] - k = l[:l.index('=')] - v = l[l.index('=') + 1:] - if v[0] == "'" or v[0] == '"': - v = v[1:] - if v[-1] == "'" or v[-1] == '"': - v = v[:-1] - #if k.upper() == "AGENT_ID": - # userName = v - if k.upper() == "AGENT_PASSWORD": - password = v - - return password - -def getWebAgentCredentials(): - try: - lines = open(Globals.WEBAGENT_AUTH_FILE).readlines() - except IOError: - return None,None - - userName = None - password = None - - for l in lines: - if l[-1] == '\n': - l = l[:-1] - k = l[:l.index('=')] - v = l[l.index('=') + 1:] - if v[0] == "'" or v[0] == '"': - v = v[1:] - if v[-1] == "'" or v[-1] == '"': - v = v[:-1] - if k.upper() == "AGENT_ID": - userName = v - if k.upper() == "AGENT_PASSWORD": - password = v - - return userName, password def daemonize(): try: @@ -931,37 +571,19 @@ def daemonize(): os.dup2(se.fileno(), sys.stderr.fileno()) return True -def getFreeIpAddress(): - startRange, endRange = getStoragePoolInfo() - if not (startRange and endRange): - return None - - startIpNumber = IP2Number(startRange) - endIpNumber = IP2Number(endRange) - - for ipNumber in range(endIpNumber, startIpNumber, -1): - rv = runCommandFG(["ping", "-qnc", "1", Number2IP(ipNumber)]) - if type(rv) == type(True): - return None - if rv != 0: - return Number2IP(ipNumber) - return None def getDhcpServerStatus(): - status = runCommandFG(["sudo", "service", "dnsmasq", " status"]) - if type(status) == type(True) or 0 != status: + if runCommand("service dnsmasq status", root=True) != 0: return False return True def startDhcpServer(): - status = runCommandFG(["sudo", "service", "dnsmasq", " start"]) - if type(status) == type(True) or 0 != status: + if runCommand("service dnsmasq start", root=True) != 0: return False return True def stopDhcpServer(): - status = runCommandFG(["sudo", "service", "dnsmasq", " stop"]) - if type(status) == type(True) or 0 != status: + if runCommand("service dnsmasq stop", root=True) != 0: return False return True @@ -975,8 +597,8 @@ def getStoragePoolInfo(): startRange = tokens[1].strip() if tokens[0] == "ENDRANGE": endRange = tokens[1].strip() - except IOError: - log(syslog.LOG_ERR, "unable to read %s file" % Globals.GLUSTER_SERVER_POOL_FILE) + except IOError, e: + log(syslog.LOG_ERR, "unable to read %s file: %s" % (Globals.GLUSTER_SERVER_POOL_FILE, str(e))) return startRange, endRange def configureDnsmasq(serverIpAddress, dhcpIpAddress): @@ -988,12 +610,12 @@ def configureDnsmasq(serverIpAddress, dhcpIpAddress): if token[0] == "dhcp": serverPortString = token[1] break - except IOError: - log(syslog.LOG_ERR, "Failed to read /proc/cmdline. Continuing with default port 68") + except IOError, e: + log(syslog.LOG_ERR, "Failed to read /proc/cmdline. Continuing with default port 68: %s" % str(e)) try: serverPort = int(serverPortString) - except ValueError: - log(syslog.LOG_ERR, "Invalid dhcp port '%s' in /proc/cmdline. Continuing with default port 68" % serverPortString) + except ValueError, e: + log(syslog.LOG_ERR, "Invalid dhcp port '%s' in /proc/cmdline. Continuing with default port 68: %s" % (serverPortString, str(e))) serverPort = 68 try: @@ -1010,11 +632,10 @@ def configureDnsmasq(serverIpAddress, dhcpIpAddress): fp.write("server=%s\n" % serverIpAddress) fp.write("dhcp-script=/usr/sbin/server-info\n") fp.close() - except IOError: - log(syslog.LOG_ERR, "unable to write dnsmasq configuration %s" % dnsmasqConfFile) + except IOError, e: + log(syslog.LOG_ERR, "unable to write dnsmasq configuration %s: %s" % (dnsmasqConfFile, str(e))) return False - status = runCommandFG(["sudo", "cp", "-f", Globals.GLUSTER_CONF_CONF_DIR + "/dnsmasq.conf", Globals.DNSMASQ_CONF_FILE]) - if type(status) == type(True) or 0 != status: + if runCommand(["cp", "-f", Globals.GLUSTER_CONF_CONF_DIR + "/dnsmasq.conf", Globals.DNSMASQ_CONF_FILE], root=True) != 0: log(syslog.LOG_ERR, "unable to copy dnsmasq configuration to " + Globals.DNSMASQ_CONF_FILE) return False return True @@ -1084,3 +705,20 @@ def getCifsUserUid(userName): if tokens[1] == userName: return int(tokens[0]) return None + +def readFile(fileName, lines=False): + content = None + try: + fp = open(fileName) + if lines: + content = fp.readlines() + else: + content = fp.read() + fp.close() + return content + except IOError, e: + log("failed to read file %s: %s" % (fileName, str(e))) + if lines: + return [] + else: + return "" diff --git a/src/com.gluster.storage.management.gateway.scripts/src/common/XmlHandler.py b/src/com.gluster.storage.management.gateway.scripts/src/common/XmlHandler.py index beff388b..22c023cc 100644 --- a/src/com.gluster.storage.management.gateway.scripts/src/common/XmlHandler.py +++ b/src/com.gluster.storage.management.gateway.scripts/src/common/XmlHandler.py @@ -182,7 +182,7 @@ class XDOM: self._domObj.writexml(fp, indent, addindent, newl) fp.close() return True - except IOError: + except IOError, e: return False def toString(self, indent=" ", newl="\n", encoding = None): @@ -218,9 +218,9 @@ class RequestXml(XDOM): self._domObj = MDOM.parse(requestString) elif XML_STRING == type: self._domObj = MDOM.parseString(requestString) - except IOError: + except IOError, e: XDOM.__init__(self) - except xml.parsers.expat.ExpatError: + except xml.parsers.expat.ExpatError, e: XDOM.__init__(self) ##--end of RequestXML |
