From 6282d952de54901207b7044aed3c8deb40fffe35 Mon Sep 17 00:00:00 2001 From: Tim Date: Tue, 10 May 2011 11:10:19 +0530 Subject: Added functionalities to get server details. Added GetServerDetails.py file Added Disk.py file --- .../src/nodes/Disk.py | 120 ++++++++++++ .../src/nodes/GetServerDetails.py | 208 +++++++++++++++++++++ 2 files changed, 328 insertions(+) create mode 100644 src/com.gluster.storage.management.server.scripts/src/nodes/Disk.py create mode 100755 src/com.gluster.storage.management.server.scripts/src/nodes/GetServerDetails.py (limited to 'src') diff --git a/src/com.gluster.storage.management.server.scripts/src/nodes/Disk.py b/src/com.gluster.storage.management.server.scripts/src/nodes/Disk.py new file mode 100644 index 00000000..d5d8de31 --- /dev/null +++ b/src/com.gluster.storage.management.server.scripts/src/nodes/Disk.py @@ -0,0 +1,120 @@ +# Copyright (c) 2009 Gluster, Inc. +# This file is part of GlusterSP. +# +# GlusterSP is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published +# by the Free Software Foundation; either version 3 of the License, +# or (at your option) any later version. +# +# GlusterSP is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see +# . + +import os +import dbus +from Common import * + +class Disk: + def __init__(self): + """init""" + + self.volumes = [] + self.disks = [] + self.bus = dbus.SystemBus() + self.hal_obj = self.bus.get_object("org.freedesktop.Hal", + "/org/freedesktop/Hal/Manager") + self.hal = dbus.Interface(self.hal_obj, "org.freedesktop.Hal.Manager") + self.devices = [] + self.devices = self.hal.FindDeviceByCapability("storage") + + self.detect_disks() + self.detect_mountable_volumes() + + def getDiskList(self): + + return self.disks + + def getMountableDiskList(self): + + return self.volumes + + def detect_disks(self): + for device in self.devices: + dev = self._get_device(device) + if dev.GetProperty("storage.drive_type") != "cdrom": + if not dev.GetProperty("block.is_volume"): + self._add_disks(dev) + continue + + def _add_disks(self, dev): + disk = str(dev.GetProperty('block.device')) + disk_size = str(int(dev.GetProperty('storage.size')) / 1024**2) + + try: + if dev.GetProperty('storage.removable'): + disk_size = str(int(dev.GetProperty('storage.removable.media_size')) / 1024**2) + except: + return + + self.disks.append({ + 'device': disk, + 'description': str(dev.GetProperty('storage.model')) + " " + str(dev.GetProperty('storage.vendor')), + 'interface': str(dev.GetProperty('storage.bus')), + 'size': disk_size, + 'drive_type': str(dev.GetProperty('storage.drive_type')) + }) + + def detect_mountable_volumes(self): + """ Detect all mountable volumes using HAL via D-Bus """ + for device in self.devices: + dev = self._get_device(device) + if dev.GetProperty("storage.drive_type") != "cdrom": + if dev.GetProperty("block.is_volume"): + self._add_volume(dev) + continue + else: # iterate over children looking for a volume + children = self.hal.FindDeviceStringMatch("info.parent", + device) + for child in children: + child = self._get_device(child) + if child.GetProperty("block.is_volume"): + self._add_volume(child, parent=dev) + #break # don't break, allow all partitions + + def _add_volume(self, dev, parent=None): + volume = str(dev.GetProperty('block.device')) + self.volumes.append ({ + 'device' : volume, + 'label' : str(dev.GetProperty('volume.label')), + 'fstype' : str(dev.GetProperty('volume.fstype')), + 'fsversion': str(dev.GetProperty('volume.fsversion')), + 'uuid' : str(dev.GetProperty('volume.uuid')), + 'interface': str(parent.GetProperty('storage.bus')), + 'parent' : str(parent.GetProperty('block.device')), + 'description': str(parent.GetProperty('storage.model')) + " " + str(parent.GetProperty('storage.vendor')), + 'size' : str(int(dev.GetProperty('volume.size')) / 1024**2), + 'totalsize' : str(int(parent.GetProperty('storage.size')) / 1024**2), + 'drive_type': str(parent.GetProperty('storage.drive_type')) + }) + + def _get_device(self, udi): + """ Return a dbus Interface to a specific HAL device UDI """ + dev_obj = self.bus.get_object("org.freedesktop.Hal", udi) + return dbus.Interface(dev_obj, "org.freedesktop.Hal.Device") + + def get_free_bytes(self, device=None): + """ Return the number of available bytes on our device """ + import statvfs + stat = os.statvfs(device) + return stat[statvfs.F_BSIZE] * stat[statvfs.F_BAVAIL] + + def get_used_bytes(self, device=None): + """ Return the number of used bytes on our device """ + import statvfs + stat = os.statvfs(device) + return ((stat[statvfs.F_BSIZE] * stat[statvfs.F_BLOCKS]) - (stat[statvfs.F_BSIZE] * stat[statvfs.F_BAVAIL])) diff --git a/src/com.gluster.storage.management.server.scripts/src/nodes/GetServerDetails.py b/src/com.gluster.storage.management.server.scripts/src/nodes/GetServerDetails.py new file mode 100755 index 00000000..440347a4 --- /dev/null +++ b/src/com.gluster.storage.management.server.scripts/src/nodes/GetServerDetails.py @@ -0,0 +1,208 @@ +# Copyright (C) 2009 Gluster, Inc. +# This file is part of Gluster Storage Platform. +# +# Gluster Storage Platform is free software; you can redistribute it +# and/or modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 3 of +# the License, or (at your option) any later version. +# +# Gluster Storage Platform is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied warranty +# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see +# . + +import sys +import syslog +import socket +import Globals +import Commands +import re +from ServerUtils import * +from Protocol import * +from NetworkUtils import * +from Disk import * +from XmlHandler import ResponseXml + +def getDiskSizeInfo(partition): + # get values from df output + total = None + used = None + free = None + commandList = ['df', '-kl', '-t', 'ext3', '-t', 'ext4'] + commandOutput = "" + try: + process = subprocess.Popen(commandList, + stdout=subprocess.PIPE, + stdin=subprocess.PIPE, + stderr=subprocess.PIPE, + close_fds=True) + status = process.wait() + if status == 0: + commandOutput = process.communicate() + except OSError: + return None,None,None + + for line in commandOutput[0].split("\n"): + tokens = line.split() + if len(tokens) < 4: + continue + if tokens[0] == partition: + total = int(tokens[1]) / 1024.0 + used = int(tokens[2]) / 1024.0 + free = int(tokens[3]) / 1024.0 + break + + if total: + return total, used, free + + # get total size from parted output + for i in range(len(partition), 0, -1): + pos = i - 1 + if not partition[pos].isdigit(): + break + disk = partition[:pos+1] + number = int(partition[pos+1:]) + + commandList = ['parted', '-ms', disk, 'unit', 'kb', 'print'] + commandOutput = "" + try: + process = subprocess.Popen(commandList, + stdout=subprocess.PIPE, + stdin=subprocess.PIPE, + stderr=subprocess.PIPE, + close_fds=True) + status = process.wait() + if status == 0: + commandOutput = process.communicate() + except OSError: + return None,None,None + + lines = commandOutput[0].split(";\n") + if len(lines) < 3: + return None,None,None + + for line in lines[2:]: + tokens = line.split(':') + if len(tokens) < 4: + continue + if tokens[0] == str(number): + total = int(tokens[3].split('kB')[0]) / 1024.0 + break + + return total, used, free + +def getServerDetails(): + serverName = socket.gethostname() + responseDom = ResponseXml() + #responseDom.appendTagRoute("status.code", "0") + #responseDom.appendTagRoute("status.message", "success") + serverTag = responseDom.appendTagRoute("server") + serverTag.appendChild(responseDom.createTag("name", serverName)) + + nameServerList, domain, searchDomain = readResolvConfFile() + if domain: + domainName = domain[0] + else: + domainName = None + serverTag.appendChild(responseDom.createTag("domainname", domainName)) + i = 1 + for dns in nameServerList: + serverTag.appendChild(responseDom.createTag("dns%s" % i, dns)) + i += 1 + #TODO: probe and retrieve timezone, ntp-server, preferred-network details and update the tags + + deviceList = {} + for device in getNetDeviceList(): + deviceList[device["device"]] = device + try: + macAddress = open("/sys/class/net/%s/address" % device["device"]).read().strip() + except IOError: + continue + interfaces = responseDom.createTag("networkInterfaces", None) + interfaceTag = responseDom.createTag("networkInterface", None) + interfaceTag.appendChild(responseDom.createTag("name", device["device"])) + interfaceTag.appendChild(responseDom.createTag("hwaddr", macAddress)) + if deviceList[device["device"]]: + if deviceList[device["device"]]["onboot"]: + interfaceTag.appendChild(responseDom.createTag("onboot", "yes")) + else: + interfaceTag.appendChild(responseDom.createTag("onBoot", "no")) + interfaceTag.appendChild(responseDom.createTag("bootProto", deviceList[device["device"]]["bootproto"])) + interfaceTag.appendChild(responseDom.createTag("ipAddress", deviceList[device["device"]]["ipaddr"])) + interfaceTag.appendChild(responseDom.createTag("netMask", deviceList[device["device"]]["netmask"])) + interfaceTag.appendChild(responseDom.createTag("defaultGateway", deviceList[device["device"]]["gateway"])) + if deviceList[device["device"]]["mode"]: + interfaceTag.appendChild(responseDom.createTag("mode", deviceList[device["device"]]["mode"])) + if deviceList[device["device"]]["master"]: + interfaceTag.appendChild(responseDom.createTag("bonding", "yes")) + spliter = re.compile(r'[\D]') + interfaceTag.appendChild(responseDom.createTag("bondid", spliter.split(device["master"])[-1])) + else: + interfaceTag.appendChild(responseDom.createTag("onBoot", "no")) + interfaceTag.appendChild(responseDom.createTag("bootProto", "none")) + interfaces.appendChild(interfaceTag) + serverTag.appendChild(interfaces) + responseDom.appendTag(serverTag) + serverTag.appendChild(responseDom.createTag("numOfCPUs", int(os.sysconf('SC_NPROCESSORS_ONLN')))) + + try: + meminfo = getMeminfo() + mem_total = meminfo['MemTotal'] + mem_free = meminfo['MemFree'] + mem_used = (mem_total - mem_free) + value = "%.2f" % (1.0 * mem_used / mem_total) + mem_percent = 100 * float(value) + cpu = 100 * float(getLoadavg()) + + except IOError: + print "Error" + responseDom.appendTagRoute("server.name", serverName) + syslog.syslog(syslog.LOG_ERR, "Error finding memory information of server:%s" % serverName) + return None + + diskObj = Disk() + ## disks = diskObj.getDiskList() + disks = diskObj.getMountableDiskList() + + if disks is None: + print "No disk found!" + syslog.syslog(syslog.LOG_ERR, "Error finding disk information of server:%s" % serverName) + return None + + serverTag.appendChild(responseDom.createTag("cpuUsage", str(cpu))) + #serverTag.appendChild(responseDom.createTag("totalMemory", str(mem_percent))) + serverTag.appendChild(responseDom.createTag("totalMemory", str(mem_total))) + serverTag.appendChild(responseDom.createTag("memoryInUse", str(mem_used))) + serverTag.appendChild(responseDom.createTag("status", "ONLINE")) + serverTag.appendChild(responseDom.createTag("uuid", None)) + + totalDiskSpace = 0 + diskSpaceInUse = 0 + diskTag = responseDom.createTag("disks") + for disk in disks: + if disk['interface'] in ['usb', 'mmc']: + continue + partitionTag = responseDom.createTag("disk", None) + partitionTag.appendChild(responseDom.createTag("name", os.path.basename(disk['device']))) + partitionTag.appendChild(responseDom.createTag("serverName", serverName)) + partitionTag.appendChild(responseDom.createTag("description", disk['description'])) + total, used, free = getDiskSizeInfo(disk['device']) + if total: + partitionTag.appendChild(responseDom.createTag("space", str(total))) + totalDiskSpace += total + if used: + partitionTag.appendChild(responseDom.createTag("spaceInUse", str(used))) + diskSpaceInUse += used + partitionTag.appendChild(responseDom.createTag("status", "READY")) + diskTag.appendChild(partitionTag) + serverTag.appendChild(diskTag) + serverTag.appendChild(responseDom.createTag("totalDiskSpace", str(totalDiskSpace))) + serverTag.appendChild(responseDom.createTag("diskSpaceInUse", str(diskSpaceInUse))) + return serverTag + +def test(): + print getServerDetails().toxml() -- cgit From ec9d4b2d323c5bce48be5ce5c179894b1de74d3e Mon Sep 17 00:00:00 2001 From: Shireesh Anjal Date: Mon, 9 May 2011 15:20:04 +0530 Subject: Story #42 - Volume logs download --- .../storage/management/client/AbstractClient.java | 33 ++++-- .../storage/management/client/VolumesClient.java | 6 +- .../storage/management/core/utils/FileUtil.java | 18 ++-- .../feature.xml | 112 +++++++++++++++++++++ src/com.gluster.storage.management.gui/plugin.xml | 16 +++ .../gui/actions/DownloadVolumeLogsAction.java | 71 +++++++++++++ .../server/resources/VolumesResource.java | 20 ++-- .../management/server/utils/GlusterUtil.java | 3 + 8 files changed, 249 insertions(+), 30 deletions(-) create mode 100644 src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/DownloadVolumeLogsAction.java (limited to 'src') diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java index b9a0ef56..a077c721 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java @@ -1,12 +1,15 @@ package com.gluster.storage.management.client; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.net.URI; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; import com.gluster.storage.management.client.utils.ClientUtil; -import com.gluster.storage.management.core.constants.RESTConstants; +import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.WebResource; @@ -49,15 +52,25 @@ public abstract class AbstractClient { .get(responseClass); } - private Object downloadResource(WebResource res, MultivaluedMap queryParams, Class responseClass) { - return res.queryParams(queryParams).header(HTTP_HEADER_AUTH, authHeader).accept(MediaType.TEXT_XML) - .get(responseClass); - } - - protected Object downloadResource(WebResource res) { + protected void downloadResource(WebResource res, String filePath) { ClientResponse response = res.header(HTTP_HEADER_AUTH, authHeader).accept(MediaType.APPLICATION_OCTET_STREAM) .get(ClientResponse.class); - return response; + try { + if(!response.hasEntity()) { + throw new GlusterRuntimeException("No entity in response!"); + } + + InputStream inputStream = response.getEntityInputStream(); + byte[] data = new byte[inputStream.available()]; + inputStream.read(data); + inputStream.close(); + + FileOutputStream os = new FileOutputStream(filePath); + os.write(data); + os.close(); + } catch (IOException e) { + throw new GlusterRuntimeException("Error while downloading resource [" + res.getURI().getPath() + "]", e); + } } /** @@ -104,8 +117,8 @@ public abstract class AbstractClient { return fetchResource(resource.path(subResourceName), NO_PARAMS, responseClass); } - protected Object downloadSubResource(String subResourceName) { - return downloadResource(resource.path(subResourceName)); + protected void downloadSubResource(String subResourceName, String filePath) { + downloadResource(resource.path(subResourceName), filePath); } /** diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java index f1464211..c0ce8620 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java @@ -141,8 +141,8 @@ public class VolumesClient extends AbstractClient { queryParams, LogMessageListResponse.class); } - public void downloadLogs(String volumeName) { - downloadSubResource((volumeName) + "/" + RESTConstants.SUBRESOURCE_LOGS + "/" + RESTConstants.SUBRESOURCE_DOWNLOAD); + public void downloadLogs(String volumeName, String filePath) { + downloadSubResource((volumeName) + "/" + RESTConstants.SUBRESOURCE_LOGS + "/" + RESTConstants.SUBRESOURCE_DOWNLOAD, filePath); } public Status removeBricks(String volumeName, List diskList, boolean deleteOption) { @@ -258,7 +258,7 @@ public class VolumesClient extends AbstractClient { // // Status status = client.addDisks("Volume3", disks); // System.out.println(status.getMessage()); - client.downloadLogs("vol1"); + client.downloadLogs("vol1", "/tmp/temp1.tar.gz"); } } } diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/FileUtil.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/FileUtil.java index c6394a3e..8c77fbab 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/FileUtil.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/FileUtil.java @@ -20,27 +20,32 @@ package com.gluster.storage.management.core.utils; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.util.UUID; +import com.gluster.storage.management.core.constants.CoreConstants; import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; public class FileUtil { public String readFileAsString(File file) { try { - FileInputStream fileInputStream = new FileInputStream(file); - byte[] data = new byte[fileInputStream.available()]; - fileInputStream.read(data); - fileInputStream.close(); - - return new String(data); + return new String(readFileAsByteArray(file), CoreConstants.ENCODING_UTF8); } catch (Exception e) { e.printStackTrace(); throw new GlusterRuntimeException("Could not read file [" + file + "]", e); } } + + public byte[] readFileAsByteArray(File file) throws FileNotFoundException, IOException { + FileInputStream fileInputStream = new FileInputStream(file); + byte[] data = new byte[fileInputStream.available()]; + fileInputStream.read(data); + fileInputStream.close(); + return data; + } public InputStream loadResource(String resourcePath) { return this.getClass().getClassLoader().getResourceAsStream(resourcePath); @@ -50,6 +55,7 @@ public class FileUtil { try { FileWriter writer = new FileWriter(fileName); writer.write(contents); + writer.close(); } catch (Exception e) { throw new GlusterRuntimeException("Exception while trying to create text file [" + fileName + "]", e); } diff --git a/src/com.gluster.storage.management.gui.feature/feature.xml b/src/com.gluster.storage.management.gui.feature/feature.xml index 06df1a47..426201bf 100644 --- a/src/com.gluster.storage.management.gui.feature/feature.xml +++ b/src/com.gluster.storage.management.gui.feature/feature.xml @@ -785,4 +785,116 @@ install-size="0" version="0.0.0"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/com.gluster.storage.management.gui/plugin.xml b/src/com.gluster.storage.management.gui/plugin.xml index b208fc24..6c6983a3 100644 --- a/src/com.gluster.storage.management.gui/plugin.xml +++ b/src/com.gluster.storage.management.gui/plugin.xml @@ -524,6 +524,22 @@ toolbarPath="Normal" tooltip="Delete Volume"> + + + * This file is part of Gluster Management Console. + * + * Gluster Management Console is free software; you can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Gluster Management Console is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see + * . + *******************************************************************************/ +package com.gluster.storage.management.gui.actions; + +import java.io.File; + +import org.eclipse.jface.action.IAction; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.FileDialog; + +import com.gluster.storage.management.client.GlusterDataModelManager; +import com.gluster.storage.management.client.VolumesClient; +import com.gluster.storage.management.core.model.Volume; + +/** + * + */ +public class DownloadVolumeLogsAction extends AbstractActionDelegate { + + /* (non-Javadoc) + * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose() + */ + @Override + public void dispose() { + // TODO Auto-generated method stub + + } + + /* (non-Javadoc) + * @see com.gluster.storage.management.gui.actions.AbstractActionDelegate#performAction(org.eclipse.jface.action.IAction) + */ + @Override + protected void performAction(IAction action) { + final Volume volume = (Volume)selectedEntity; + final VolumesClient client = new VolumesClient(GlusterDataModelManager.getInstance().getSecurityToken()); + + Display.getDefault().asyncExec(new Runnable() { + + @Override + public void run() { + FileDialog dialog = new FileDialog(getShell(), SWT.SAVE); + dialog.setFilterNames(new String[] {"GZipped Tar"}); + dialog.setFilterExtensions(new String[] {"*.tar.gz"}); + dialog.open(); + + try { + client.downloadLogs(volume.getName(), dialog.getFilterPath() + File.separator + dialog.getFileName()); + } catch(Exception e) { + showErrorDialog("Download Volume Logs [" + volume.getName() + "]", e.getMessage()); + } + } + }); + } +} diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java index fe03fffd..521c6175 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java @@ -102,7 +102,11 @@ public class VolumesResource { @InjectParam private static ServerUtil serverUtil; - private final GlusterUtil glusterUtil = new GlusterUtil(); + + @InjectParam + private static GlusterUtil glusterUtil; + + private static final FileUtil fileUtil = new FileUtil(); @InjectParam private VolumeOptionsDefaults volumeOptionsDefaults; @@ -386,13 +390,9 @@ public class VolumesResource { public void write(OutputStream output) throws IOException, WebApplicationException { Volume volume = getVolume(volumeName); try { - String archiveFileName = downloadLogs(volume); - FileInputStream inputStream = new FileInputStream(archiveFileName); - int size = inputStream.available(); - byte[] data = new byte[size]; - inputStream.read(data); - inputStream.close(); - output.write(data); + File archiveFile = new File(downloadLogs(volume)); + output.write(fileUtil.readFileAsByteArray(archiveFile)); + archiveFile.delete(); } catch (Exception e) { e.printStackTrace(); throw new GlusterRuntimeException("Exception while downloading/archiving volume log files!", e); @@ -402,8 +402,6 @@ public class VolumesResource { } private String downloadLogs(Volume volume) { - FileUtil fileUtil = new FileUtil(); - // create temporary directory File tempDir = fileUtil.createTempDir(); String tempDirPath = tempDir.getPath(); @@ -423,7 +421,7 @@ public class VolumesResource { } String gzipPath = fileUtil.getTempDirName() + CoreConstants.FILE_SEPARATOR + volume.getName() + "-logs.tar.gz"; - new ProcessUtil().executeCommand("tar", "czvf", gzipPath, tempDirPath); + new ProcessUtil().executeCommand("tar", "czvf", gzipPath, "-C", tempDir.getParent(), tempDir.getName()); // delete the temp directory fileUtil.recursiveDelete(tempDir); diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java index 476b5a14..14117aff 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java @@ -25,6 +25,8 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import org.springframework.stereotype.Component; + import com.gluster.storage.management.core.constants.CoreConstants; import com.gluster.storage.management.core.constants.RESTConstants; import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; @@ -38,6 +40,7 @@ import com.gluster.storage.management.core.model.Volume.VOLUME_TYPE; import com.gluster.storage.management.core.utils.ProcessResult; import com.gluster.storage.management.core.utils.ProcessUtil; +@Component public class GlusterUtil { private static final String glusterFSminVersion = "3.1"; -- cgit