/*
* RHQ Management Platform
* Copyright (C) 2005-2014 Red Hat, Inc.
* All rights reserved.
*
* This program 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 version 2 of the License.
*
* This program 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, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
package org.rhq.core.system;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hyperic.sigar.FileSystem;
import org.hyperic.sigar.FileSystemUsage;
import org.hyperic.sigar.SigarException;
import org.hyperic.sigar.SigarProxy;
/**
* Information about a mounted file system.
*
* @author Greg Hinkle
* @author John Mazzitelli
*/
public class FileSystemInfo {
private static final Log LOG = LogFactory.getLog(FileSystemInfo.class);
private final String mountPoint;
private FileSystem fs;
private FileSystemUsage fsUsage;
private boolean fetchedInfo;
public FileSystemInfo(String mountPoint) {
this.mountPoint = mountPoint;
this.fetchedInfo = false;
refresh();
}
public FileSystemInfo(String mountPoint, boolean deferedFetchInfo) {
this.mountPoint = mountPoint;
this.fetchedInfo = false;
if (!deferedFetchInfo) {
refresh();
} else {
SigarProxy sigar = SigarAccess.getSigar();
createFileSystemObject(sigar);
}
}
private void createFileSystemObject(SigarProxy sigar) {
try {
// this only needs to be loaded once - it will never change during the lifetime of the file system
if (this.fs == null) {
this.fs = sigar.getFileSystemMap().getFileSystem(this.mountPoint);
}
} catch (Exception e) {
throw new SystemInfoException("Cannot refresh file system mounted at [" + this.mountPoint + "]", e);
}
}
public void refresh() {
SigarProxy sigar = SigarAccess.getSigar();
createFileSystemObject(sigar);
try {
// this is the usage data and therefore should be refreshed
this.fsUsage = sigar.getMountedFileSystemUsage(this.mountPoint);
this.fetchedInfo = true;
} catch (SigarException e) {
// this happens when the file system is not available (e.g. if it's a CD-ROM without a CD loaded in it) or
// if we don't have permission to access the filesystem. we can ignore it and set the usage data to null.
this.fsUsage = null;
this.fetchedInfo = true;
if (LOG.isTraceEnabled()) {
LOG.trace("Cannot refresh the usage data for file system mounted at [" + this.mountPoint + "].", e);
} else if (LOG.isDebugEnabled()) {
LOG.debug("Cannot refresh the usage data for file system mounted at [" + this.mountPoint + "]: " + e);
}
} catch (RuntimeException e) {
this.fsUsage = null;
this.fetchedInfo = true;
LOG.error("An error occurred while refreshing the usage data for file system mounted at [" + this.mountPoint
+ "].", e);
}
}
public String getMountPoint() {
return this.mountPoint;
}
/**
* Provides with static information about the file system.
*
* @return static file system information
*/
public FileSystem getFileSystem() {
return this.fs;
}
/**
* This returns the usage information on the file system. This may return <code>null</code> if the file system is
* not available (e.g when a "device not ready" error for CD-ROM drives occurs) or not accessible due to lack of
* permission.
*
* @return file system usage data
*/
public FileSystemUsage getFileSystemUsage() {
if(!this.fetchedInfo){
refresh();
}
return this.fsUsage;
}
@Override
public String toString() {
return this.getClass().getSimpleName() + "[" +
"mountPoint='" + mountPoint + '\'' +
", fs=" + fs +
", fsUsage=" + fsUsage +
']';
}
}