package io.fathom.auto.processes;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Charsets;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.io.Files;
public class ProcFs {
private static final Logger log = LoggerFactory.getLogger(ProcFs.class);
static final File ROOT = new File("/proc");
public static class Process {
final long pid;
public Process(long pid) {
this.pid = pid;
}
List<String> cmdline;
File getBase() {
return new File("/proc", Long.toString(pid));
}
public List<String> getCmdline() throws IOException {
if (cmdline == null) {
File file = new File(getBase(), "cmdline");
byte[] data;
try {
data = Files.toByteArray(file);
} catch (FileNotFoundException e) {
return null;
}
String s = new String(data, Charsets.UTF_8);
if (s.endsWith("\0")) {
s = s.substring(0, s.length() - 1);
}
List<String> args = Lists.newArrayList(Splitter.on('\0').split(s));
cmdline = args;
log.debug("CmdLine {} => {}", pid, Joiner.on(",").join(args));
}
return cmdline;
}
public long getPid() {
return pid;
}
public boolean exists() {
return getBase().exists();
}
@Override
public String toString() {
return "Process [pid=" + pid + "]";
}
}
public static List<Process> findProcesses() {
List<Process> processes = Lists.newArrayList();
for (File file : ROOT.listFiles()) {
if (!file.isDirectory()) {
continue;
}
String name = file.getName();
if (Strings.isNullOrEmpty(name)) {
continue;
}
char first = name.charAt(0);
if (first < '0' || first > '9') {
continue;
}
Long pid = null;
try {
pid = Long.parseLong(name);
} catch (NumberFormatException e) {
log.debug("Error parsing proc dir as pid: " + name);
}
if (pid == null) {
continue;
}
Process proc = new Process(pid);
processes.add(proc);
}
return processes;
}
public static Process findProcess(Pid pid) {
return findProcess(pid.getValue());
}
public static Process findProcess(long pid) {
Process proc = new Process(pid);
if (!proc.exists()) {
return null;
}
return proc;
}
}