Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/**
* MIT License
*
* Copyright (c) 2010 - 2020 The OSHI Project Contributors: https://github.com/oshi/oshi/graphs/contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package oshi.software.os.unix.freebsd;
import static oshi.software.os.OSService.State.RUNNING;
import static oshi.software.os.OSService.State.STOPPED;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import oshi.annotation.concurrent.ThreadSafe;
import oshi.driver.unix.freebsd.Who;
import oshi.jna.platform.unix.freebsd.FreeBsdLibc;
import oshi.jna.platform.unix.freebsd.FreeBsdLibc.Timeval;
import oshi.software.common.AbstractOperatingSystem;
import oshi.software.os.FileSystem;
import oshi.software.os.InternetProtocolStats;
import oshi.software.os.NetworkParams;
import oshi.software.os.OSProcess;
import oshi.software.os.OSService;
import oshi.software.os.OSSession;
import oshi.util.ExecutingCommand;
import oshi.util.ParseUtil;
import oshi.util.platform.unix.freebsd.BsdSysctlUtil;
/**
* FreeBSD is a free and open-source Unix-like operating system descended from
* the Berkeley Software Distribution (BSD), which was based on Research Unix.
* The first version of FreeBSD was released in 1993. In 2005, FreeBSD was the
* most popular open-source BSD operating system, accounting for more than
* three-quarters of all installed simply, permissively licensed BSD systems.
*/
@ThreadSafe
public class FreeBsdOperatingSystem extends AbstractOperatingSystem {
private static final Logger LOG = LoggerFactory.getLogger(FreeBsdOperatingSystem.class);
private static final long BOOTTIME = querySystemBootTime();
@Override
public String queryManufacturer() {
return "Unix/BSD";
}
@Override
public FamilyVersionInfo queryFamilyVersionInfo() {
String family = BsdSysctlUtil.sysctl("kern.ostype", "FreeBSD");
String version = BsdSysctlUtil.sysctl("kern.osrelease", "");
String versionInfo = BsdSysctlUtil.sysctl("kern.version", "");
String buildNumber = versionInfo.split(":")[0].replace(family, "").replace(version, "").trim();
return new FamilyVersionInfo(family, new OSVersionInfo(version, null, buildNumber));
}
@Override
protected int queryBitness(int jvmBitness) {
if (jvmBitness < 64 && ExecutingCommand.getFirstAnswer("uname -m").indexOf("64") == -1) {
return jvmBitness;
}
return 64;
}
@Override
protected boolean queryElevated() {
return System.getenv("SUDO_COMMAND") != null;
}
@Override
public FileSystem getFileSystem() {
return new FreeBsdFileSystem();
}
@Override
public InternetProtocolStats getInternetProtocolStats() {
return new FreeBsdInternetProtocolStats();
}
@Override
public List getSessions() {
return Collections.unmodifiableList(USE_WHO_COMMAND ? super.getSessions() : Who.queryUtxent());
}
@Override
public List getProcesses(int limit, ProcessSort sort) {
List procs = getProcessListFromPS(-1);
List sorted = processSort(procs, limit, sort);
return Collections.unmodifiableList(sorted);
}
@Override
public OSProcess getProcess(int pid) {
List procs = getProcessListFromPS(pid);
if (procs.isEmpty()) {
return null;
}
return procs.get(0);
}
@Override
public List getChildProcesses(int parentPid, int limit, ProcessSort sort) {
List procs = new ArrayList<>();
for (OSProcess p : getProcesses(0, null)) {
if (p.getParentProcessID() == parentPid) {
procs.add(p);
}
}
List sorted = processSort(procs, limit, sort);
return Collections.unmodifiableList(sorted);
}
private static List getProcessListFromPS(int pid) {
List procs = new ArrayList<>();
String psCommand = "ps -awwxo state,pid,ppid,user,uid,group,gid,nlwp,pri,vsz,rss,etimes,systime,time,comm,args";
if (pid >= 0) {
psCommand += " -p " + pid;
}
List procList = ExecutingCommand.runNative(psCommand);
if (procList.isEmpty() || procList.size() < 2) {
return procs;
}
// remove header row
procList.remove(0);
// Fill list
for (String proc : procList) {
String[] split = ParseUtil.whitespaces.split(proc.trim(), 16);
// Elements should match ps command order
if (split.length == 16) {
procs.add(new FreeBsdOSProcess(pid < 0 ? ParseUtil.parseIntOrDefault(split[1], 0) : pid, split));
}
}
return procs;
}
@Override
public int getProcessId() {
return FreeBsdLibc.INSTANCE.getpid();
}
@Override
public int getProcessCount() {
List procList = ExecutingCommand.runNative("ps -axo pid");
if (!procList.isEmpty()) {
// Subtract 1 for header
return procList.size() - 1;
}
return 0;
}
@Override
public int getThreadCount() {
int threads = 0;
for (String proc : ExecutingCommand.runNative("ps -axo nlwp")) {
threads += ParseUtil.parseIntOrDefault(proc.trim(), 0);
}
return threads;
}
@Override
public long getSystemUptime() {
return System.currentTimeMillis() / 1000 - BOOTTIME;
}
@Override
public long getSystemBootTime() {
return BOOTTIME;
}
private static long querySystemBootTime() {
Timeval tv = new Timeval();
if (!BsdSysctlUtil.sysctl("kern.boottime", tv) || tv.tv_sec == 0) {
// Usually this works. If it doesn't, fall back to text parsing.
// Boot time will be the first consecutive string of digits.
return ParseUtil.parseLongOrDefault(
ExecutingCommand.getFirstAnswer("sysctl -n kern.boottime").split(",")[0].replaceAll("\\D", ""),
System.currentTimeMillis() / 1000);
}
// tv now points to a 128-bit timeval structure for boot time.
// First 8 bytes are seconds, second 8 bytes are microseconds (we ignore)
return tv.tv_sec;
}
@Override
public NetworkParams getNetworkParams() {
return new FreeBsdNetworkParams();
}
@Override
public OSService[] getServices() {
// Get running services
List services = new ArrayList<>();
Set running = new HashSet<>();
for (OSProcess p : getChildProcesses(1, 0, ProcessSort.PID)) {
OSService s = new OSService(p.getName(), p.getProcessID(), RUNNING);
services.add(s);
running.add(p.getName());
}
// Get Directories for stopped services
File dir = new File("/etc/rc.d");
File[] listFiles;
if (dir.exists() && dir.isDirectory() && (listFiles = dir.listFiles()) != null) {
for (File f : listFiles) {
String name = f.getName();
if (!running.contains(name)) {
OSService s = new OSService(name, 0, STOPPED);
services.add(s);
}
}
} else {
LOG.error("Directory: /etc/init does not exist");
}
return services.toArray(new OSService[0]);
}
}