FileWatcher to mirror /proc files
This commit is contained in:
parent
be5ee7b600
commit
1ca37d4411
|
@ -0,0 +1,173 @@
|
|||
/*
|
||||
* Copyright (C) [2004, 2005, 2006], Hyperic, Inc.
|
||||
* This file is part of SIGAR.
|
||||
*
|
||||
* SIGAR is free software; you can redistribute it and/or modify
|
||||
* it under the terms version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||
* USA.
|
||||
*/
|
||||
|
||||
package org.hyperic.sigar;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
//intended for use on systems with very large connection tables
|
||||
//where processing /proc/net/tcp may block or otherwise take much longer
|
||||
//than reading a plain 'ol text file
|
||||
public class ProcFileMirror extends FileWatcher {
|
||||
|
||||
private String proc;
|
||||
private long timestamp;
|
||||
private long expire;
|
||||
|
||||
private static final Logger log =
|
||||
SigarLog.getLogger(ProcFileMirror.class.getName());
|
||||
|
||||
private static final boolean isDebug = log.isDebugEnabled();
|
||||
|
||||
public ProcFileMirror(Sigar sigar, String proc) {
|
||||
super(sigar);
|
||||
this.timestamp = System.currentTimeMillis();
|
||||
this.proc = proc;
|
||||
this.expire = FileWatcherThread.DEFAULT_INTERVAL;
|
||||
}
|
||||
|
||||
public long getExpireMillis() {
|
||||
return this.expire;
|
||||
}
|
||||
|
||||
public void setExpire(long seconds) {
|
||||
setExpireMillis(seconds * 1000);
|
||||
}
|
||||
|
||||
public void setExpireMillis(long millis) {
|
||||
this.expire = millis;
|
||||
}
|
||||
|
||||
public String getProcFile(File file) {
|
||||
return getProcFile(file.getPath());
|
||||
}
|
||||
|
||||
public String getProcFile(String file) {
|
||||
final String PROC = "/proc/";
|
||||
if (file.startsWith(PROC)) {
|
||||
file = file.substring(PROC.length());
|
||||
}
|
||||
return this.proc + File.separator + file;
|
||||
}
|
||||
|
||||
private void mirror(String source) throws IOException {
|
||||
mirror(source, getProcFile(source));
|
||||
}
|
||||
|
||||
private String mirrorToString(File source, File dest) {
|
||||
return "mirror(" + source + ", " + dest + ")";
|
||||
}
|
||||
|
||||
private void mirror(String source, String dest) throws IOException {
|
||||
mirror(new File(source), new File(dest));
|
||||
}
|
||||
|
||||
private void mirror(File source, File dest) throws IOException {
|
||||
FileInputStream is = null;
|
||||
FileOutputStream os = null;
|
||||
|
||||
try {
|
||||
is = new FileInputStream(source);
|
||||
os = new FileOutputStream(dest);
|
||||
byte[] buffer = new byte[2048];
|
||||
int nread;
|
||||
while (true) {
|
||||
nread = is.read(buffer);
|
||||
if (nread == -1) {
|
||||
break;
|
||||
}
|
||||
os.write(buffer, 0, nread);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
String msg =
|
||||
mirrorToString(source, dest) + " failed: " +
|
||||
e.getMessage();
|
||||
throw new IOException(msg);
|
||||
} finally {
|
||||
if (is != null) {
|
||||
try { is.close(); } catch (IOException e) {}
|
||||
}
|
||||
if (os != null) {
|
||||
os.close();
|
||||
}
|
||||
}
|
||||
|
||||
if (isDebug) {
|
||||
log.debug(mirrorToString(source, dest));
|
||||
}
|
||||
}
|
||||
|
||||
public FileInfo add(String name)
|
||||
throws SigarException {
|
||||
|
||||
File source = new File(name);
|
||||
File dest = new File(getProcFile(source));
|
||||
File dir = dest.getParentFile();
|
||||
|
||||
if (!dir.exists()) {
|
||||
if (!dir.mkdirs()) {
|
||||
String msg = "mkdir(" + dir + ") failed";
|
||||
throw new SigarException(msg);
|
||||
}
|
||||
}
|
||||
if (!source.canRead()) {
|
||||
throw new SigarException("Cannot read: " + source);
|
||||
}
|
||||
if ((dest.isFile() && !dest.canWrite()) ||
|
||||
!dir.isDirectory() ||
|
||||
!dir.canWrite())
|
||||
{
|
||||
throw new SigarException("Cannot write: " + dest);
|
||||
}
|
||||
|
||||
try {
|
||||
mirror(source.getPath(), dest.getPath());
|
||||
} catch (IOException e) {
|
||||
throw new SigarException(e.getMessage());
|
||||
}
|
||||
|
||||
return super.add(source.getPath());
|
||||
}
|
||||
|
||||
public void onChange(FileInfo info) {
|
||||
try {
|
||||
mirror(info.getName());
|
||||
} catch (IOException e) {
|
||||
System.err.println(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
protected boolean changed(FileInfo info)
|
||||
throws SigarException,
|
||||
SigarFileNotFoundException {
|
||||
|
||||
long now = System.currentTimeMillis();
|
||||
if ((now - this.timestamp) > this.expire) {
|
||||
this.timestamp = now;
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue