Moved around OSAL and implemented /proc/net/arp parser
This commit is contained in:
parent
ab8239a809
commit
1e5e114300
13 changed files with 1160 additions and 941 deletions
5
src/zutil/osal/OSAbstractionLayer.java
Normal file → Executable file
5
src/zutil/osal/OSAbstractionLayer.java
Normal file → Executable file
|
|
@ -24,9 +24,12 @@
|
|||
|
||||
package zutil.osal;
|
||||
|
||||
import zutil.osal.linux.OsalLinuxImpl;
|
||||
import zutil.osal.macos.OsalMacOSImpl;
|
||||
import zutil.osal.windows.OsalWindowsImpl;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.util.ArrayList;
|
||||
|
||||
|
|
|
|||
68
src/zutil/osal/HalLinuxImpl.java → src/zutil/osal/linux/HalLinuxImpl.java
Normal file → Executable file
68
src/zutil/osal/HalLinuxImpl.java → src/zutil/osal/linux/HalLinuxImpl.java
Normal file → Executable file
|
|
@ -1,33 +1,35 @@
|
|||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2015 Ziver Koc
|
||||
*
|
||||
* 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 zutil.osal;
|
||||
|
||||
/**
|
||||
* Created by Ziver on 2015-04-07.
|
||||
*/
|
||||
public class HalLinuxImpl implements HardwareAbstractionLayer{
|
||||
|
||||
protected HalLinuxImpl(){}
|
||||
}
|
||||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2015 Ziver Koc
|
||||
*
|
||||
* 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 zutil.osal.linux;
|
||||
|
||||
import zutil.osal.HardwareAbstractionLayer;
|
||||
|
||||
/**
|
||||
* Created by Ziver on 2015-04-07.
|
||||
*/
|
||||
public class HalLinuxImpl implements HardwareAbstractionLayer {
|
||||
|
||||
protected HalLinuxImpl(){}
|
||||
}
|
||||
167
src/zutil/osal/OsalLinuxImpl.java → src/zutil/osal/linux/OsalLinuxImpl.java
Normal file → Executable file
167
src/zutil/osal/OsalLinuxImpl.java → src/zutil/osal/linux/OsalLinuxImpl.java
Normal file → Executable file
|
|
@ -1,82 +1,85 @@
|
|||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2015 Ziver Koc
|
||||
*
|
||||
* 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 zutil.osal;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
/**
|
||||
* Linux platform specific implementation
|
||||
*/
|
||||
public class OsalLinuxImpl extends OSAbstractionLayer {
|
||||
private static HalLinuxImpl hal;
|
||||
|
||||
@Override
|
||||
public OSType getOSType() {
|
||||
return OSType.Linux;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getOSVersion() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getKernelVersion() {
|
||||
try{
|
||||
return super.getFirstLineFromExec("uname -r");
|
||||
} catch(Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getUsername() {
|
||||
try{
|
||||
return super.getFirstLineFromExec("whoami");
|
||||
} catch(Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public File getUserConfigPath() {
|
||||
return new File("/home/"+getUsername());
|
||||
}
|
||||
|
||||
@Override
|
||||
public File getGlobalConfigPath() {
|
||||
return new File("/etc");
|
||||
}
|
||||
|
||||
@Override
|
||||
public HardwareAbstractionLayer getHAL() {
|
||||
if(hal == null)
|
||||
hal = new HalLinuxImpl();
|
||||
return hal;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2015 Ziver Koc
|
||||
*
|
||||
* 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 zutil.osal.linux;
|
||||
|
||||
import zutil.osal.HardwareAbstractionLayer;
|
||||
import zutil.osal.OSAbstractionLayer;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
/**
|
||||
* Linux platform specific implementation
|
||||
*/
|
||||
public class OsalLinuxImpl extends OSAbstractionLayer {
|
||||
private static HalLinuxImpl hal;
|
||||
|
||||
@Override
|
||||
public OSType getOSType() {
|
||||
return OSType.Linux;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getOSVersion() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getKernelVersion() {
|
||||
try{
|
||||
return super.getFirstLineFromExec("uname -r");
|
||||
} catch(Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getUsername() {
|
||||
try{
|
||||
return super.getFirstLineFromExec("whoami");
|
||||
} catch(Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public File getUserConfigPath() {
|
||||
return new File("/home/"+getUsername());
|
||||
}
|
||||
|
||||
@Override
|
||||
public File getGlobalConfigPath() {
|
||||
return new File("/etc");
|
||||
}
|
||||
|
||||
@Override
|
||||
public HardwareAbstractionLayer getHAL() {
|
||||
if(hal == null)
|
||||
hal = new HalLinuxImpl();
|
||||
return hal;
|
||||
}
|
||||
}
|
||||
346
src/zutil/osal/app/linux/AptGet.java → src/zutil/osal/linux/app/AptGet.java
Normal file → Executable file
346
src/zutil/osal/app/linux/AptGet.java → src/zutil/osal/linux/app/AptGet.java
Normal file → Executable file
|
|
@ -1,173 +1,173 @@
|
|||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2015 Ziver Koc
|
||||
*
|
||||
* 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 zutil.osal.app.linux;
|
||||
|
||||
import zutil.Timer;
|
||||
import zutil.log.LogUtil;
|
||||
import zutil.osal.OSAbstractionLayer;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* Created by Ziver on 2014-11-09.
|
||||
*/
|
||||
public class AptGet {
|
||||
public static final Logger log = LogUtil.getLogger();
|
||||
|
||||
private static Timer updateTimer = new Timer(1000*60*5); // 5min timer
|
||||
private static Timer packageTimer = new Timer(1000*60*5); // 5min timer
|
||||
private static HashMap<String, Package> packages = new HashMap<>();
|
||||
|
||||
public static void install(String pkg) {
|
||||
update();
|
||||
OSAbstractionLayer.exec("apt-get -y install " + pkg);
|
||||
packageTimer.reset();
|
||||
}
|
||||
|
||||
public static void upgrade(){
|
||||
update();
|
||||
OSAbstractionLayer.exec("apt-get -y " +
|
||||
// Dont display configuration conflicts
|
||||
"-o Dpkg::Options::=\"--force-confdef\" -o Dpkg::Options::=\"--force-confold\" " +
|
||||
"upgrade");
|
||||
packageTimer.reset();
|
||||
}
|
||||
|
||||
public static void update(){
|
||||
// Only run every 5 min
|
||||
if(updateTimer.hasTimedOut()){
|
||||
OSAbstractionLayer.exec("apt-get update");
|
||||
updateTimer.start();
|
||||
}
|
||||
}
|
||||
|
||||
public static void purge(String pkg) {
|
||||
OSAbstractionLayer.exec("apt-get --purge remove " + pkg);
|
||||
packageTimer.reset();
|
||||
}
|
||||
|
||||
|
||||
public static Package getPackage(String pkg){
|
||||
updatePackages();
|
||||
return packages.get(pkg);
|
||||
}
|
||||
public static synchronized void updatePackages(){
|
||||
// Only run every 5 min
|
||||
if(packageTimer.hasTimedOut()){
|
||||
String[] output = OSAbstractionLayer.exec("dpkg --list");
|
||||
for(int i=5; i<output.length; ++i) {
|
||||
packages.put(output[i], new Package(output[5]));
|
||||
}
|
||||
packageTimer.start();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* This class represents a system package and its current status
|
||||
*/
|
||||
public static class Package{
|
||||
public enum PackageState{
|
||||
// Expected States
|
||||
/* u */ Unknown,
|
||||
/* i */ Installed,
|
||||
/* r */ Removed,
|
||||
/* p */ Purged, // remove including config files
|
||||
/* h */ Holding,
|
||||
|
||||
// Current States
|
||||
/* n */ NotInstalled,
|
||||
/* i */ //Installed,
|
||||
/* c */ ConfigFiles, // only the config files are installed
|
||||
/* u */ Unpacked,
|
||||
/* f */ HalfConfigured, // configuration failed for some reason
|
||||
/* h */ HalfInstalled, // installation failed for some reason
|
||||
/* w */ TriggersAwaited, // package is waiting for a trigger from another package
|
||||
/* t */ TriggersPending, //package has been triggered
|
||||
|
||||
// Error States
|
||||
/* r */ ReinstallRequired // package broken, reinstallation required
|
||||
}
|
||||
|
||||
|
||||
private PackageState expectedState = PackageState.Unknown;
|
||||
private PackageState currentState = PackageState.Unknown;;
|
||||
private PackageState errorState = PackageState.Unknown;;
|
||||
|
||||
private String name;
|
||||
private String version;
|
||||
private String description;
|
||||
|
||||
|
||||
protected Package(String dpkgStr){
|
||||
switch (dpkgStr.charAt(0)){
|
||||
case 'u': expectedState = PackageState.Unknown; break;
|
||||
case 'i': expectedState = PackageState.Installed; break;
|
||||
case 'r': expectedState = PackageState.Removed; break;
|
||||
case 'p': expectedState = PackageState.Purged; break;
|
||||
case 'h': expectedState = PackageState.Holding; break;
|
||||
}
|
||||
switch (dpkgStr.charAt(0)){
|
||||
case 'n': currentState = PackageState.NotInstalled; break;
|
||||
case 'i': currentState = PackageState.Installed; break;
|
||||
case 'c': currentState = PackageState.ConfigFiles; break;
|
||||
case 'u': currentState = PackageState.Unpacked; break;
|
||||
case 'f': currentState = PackageState.HalfConfigured; break;
|
||||
case 'h': currentState = PackageState.HalfInstalled; break;
|
||||
case 'w': currentState = PackageState.TriggersAwaited; break;
|
||||
case 't': currentState = PackageState.TriggersPending; break;
|
||||
}
|
||||
if(dpkgStr.charAt(2) == 'r')
|
||||
errorState = PackageState.ReinstallRequired;
|
||||
|
||||
String[] tmp = dpkgStr.split("[ \\t]*", 4);
|
||||
name = tmp[1];
|
||||
version = tmp[2];
|
||||
description = tmp[3];
|
||||
}
|
||||
|
||||
|
||||
public PackageState getExpectedState() {
|
||||
return expectedState;
|
||||
}
|
||||
public PackageState getCurrentState() {
|
||||
return currentState;
|
||||
}
|
||||
public PackageState getErrorState() {
|
||||
return errorState;
|
||||
}
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
public String getVersion() {
|
||||
return version;
|
||||
}
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2015 Ziver Koc
|
||||
*
|
||||
* 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 zutil.osal.linux.app;
|
||||
|
||||
import zutil.Timer;
|
||||
import zutil.log.LogUtil;
|
||||
import zutil.osal.OSAbstractionLayer;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* Created by Ziver on 2014-11-09.
|
||||
*/
|
||||
public class AptGet {
|
||||
public static final Logger log = LogUtil.getLogger();
|
||||
|
||||
private static Timer updateTimer = new Timer(1000*60*5); // 5min timer
|
||||
private static Timer packageTimer = new Timer(1000*60*5); // 5min timer
|
||||
private static HashMap<String, Package> packages = new HashMap<>();
|
||||
|
||||
public static void install(String pkg) {
|
||||
update();
|
||||
OSAbstractionLayer.exec("apt-get -y install " + pkg);
|
||||
packageTimer.reset();
|
||||
}
|
||||
|
||||
public static void upgrade(){
|
||||
update();
|
||||
OSAbstractionLayer.exec("apt-get -y " +
|
||||
// Dont display configuration conflicts
|
||||
"-o Dpkg::Options::=\"--force-confdef\" -o Dpkg::Options::=\"--force-confold\" " +
|
||||
"upgrade");
|
||||
packageTimer.reset();
|
||||
}
|
||||
|
||||
public static void update(){
|
||||
// Only run every 5 min
|
||||
if(updateTimer.hasTimedOut()){
|
||||
OSAbstractionLayer.exec("apt-get update");
|
||||
updateTimer.start();
|
||||
}
|
||||
}
|
||||
|
||||
public static void purge(String pkg) {
|
||||
OSAbstractionLayer.exec("apt-get --purge remove " + pkg);
|
||||
packageTimer.reset();
|
||||
}
|
||||
|
||||
|
||||
public static Package getPackage(String pkg){
|
||||
updatePackages();
|
||||
return packages.get(pkg);
|
||||
}
|
||||
public static synchronized void updatePackages(){
|
||||
// Only run every 5 min
|
||||
if(packageTimer.hasTimedOut()){
|
||||
String[] output = OSAbstractionLayer.exec("dpkg --list");
|
||||
for(int i=5; i<output.length; ++i) {
|
||||
packages.put(output[i], new Package(output[5]));
|
||||
}
|
||||
packageTimer.start();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* This class represents a system package and its current status
|
||||
*/
|
||||
public static class Package{
|
||||
public enum PackageState{
|
||||
// Expected States
|
||||
/* u */ Unknown,
|
||||
/* i */ Installed,
|
||||
/* r */ Removed,
|
||||
/* p */ Purged, // remove including config files
|
||||
/* h */ Holding,
|
||||
|
||||
// Current States
|
||||
/* n */ NotInstalled,
|
||||
/* i */ //Installed,
|
||||
/* c */ ConfigFiles, // only the config files are installed
|
||||
/* u */ Unpacked,
|
||||
/* f */ HalfConfigured, // configuration failed for some reason
|
||||
/* h */ HalfInstalled, // installation failed for some reason
|
||||
/* w */ TriggersAwaited, // package is waiting for a trigger from another package
|
||||
/* t */ TriggersPending, //package has been triggered
|
||||
|
||||
// Error States
|
||||
/* r */ ReinstallRequired // package broken, reinstallation required
|
||||
}
|
||||
|
||||
|
||||
private PackageState expectedState = PackageState.Unknown;
|
||||
private PackageState currentState = PackageState.Unknown;;
|
||||
private PackageState errorState = PackageState.Unknown;;
|
||||
|
||||
private String name;
|
||||
private String version;
|
||||
private String description;
|
||||
|
||||
|
||||
protected Package(String dpkgStr){
|
||||
switch (dpkgStr.charAt(0)){
|
||||
case 'u': expectedState = PackageState.Unknown; break;
|
||||
case 'i': expectedState = PackageState.Installed; break;
|
||||
case 'r': expectedState = PackageState.Removed; break;
|
||||
case 'p': expectedState = PackageState.Purged; break;
|
||||
case 'h': expectedState = PackageState.Holding; break;
|
||||
}
|
||||
switch (dpkgStr.charAt(0)){
|
||||
case 'n': currentState = PackageState.NotInstalled; break;
|
||||
case 'i': currentState = PackageState.Installed; break;
|
||||
case 'c': currentState = PackageState.ConfigFiles; break;
|
||||
case 'u': currentState = PackageState.Unpacked; break;
|
||||
case 'f': currentState = PackageState.HalfConfigured; break;
|
||||
case 'h': currentState = PackageState.HalfInstalled; break;
|
||||
case 'w': currentState = PackageState.TriggersAwaited; break;
|
||||
case 't': currentState = PackageState.TriggersPending; break;
|
||||
}
|
||||
if(dpkgStr.charAt(2) == 'r')
|
||||
errorState = PackageState.ReinstallRequired;
|
||||
|
||||
String[] tmp = dpkgStr.split("[ \\t]*", 4);
|
||||
name = tmp[1];
|
||||
version = tmp[2];
|
||||
description = tmp[3];
|
||||
}
|
||||
|
||||
|
||||
public PackageState getExpectedState() {
|
||||
return expectedState;
|
||||
}
|
||||
public PackageState getCurrentState() {
|
||||
return currentState;
|
||||
}
|
||||
public PackageState getErrorState() {
|
||||
return errorState;
|
||||
}
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
public String getVersion() {
|
||||
return version;
|
||||
}
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package zutil.osal.app.linux;
|
||||
package zutil.osal.linux.app;
|
||||
|
||||
import zutil.Timer;
|
||||
import zutil.log.LogUtil;
|
||||
513
src/zutil/osal/app/linux/ProcDiskstats.java → src/zutil/osal/linux/app/ProcDiskstats.java
Normal file → Executable file
513
src/zutil/osal/app/linux/ProcDiskstats.java → src/zutil/osal/linux/app/ProcDiskstats.java
Normal file → Executable file
|
|
@ -1,253 +1,260 @@
|
|||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2015 Ziver Koc
|
||||
*
|
||||
* 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 zutil.osal.app.linux;
|
||||
|
||||
import zutil.StringUtil;
|
||||
import zutil.log.LogUtil;
|
||||
import zutil.net.ThroughputCalculator;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* Documentation from https://www.kernel.org/doc/Documentation/block/stat.txt
|
||||
*
|
||||
* Created by ezivkoc on 2015-05-19.
|
||||
*/
|
||||
public class ProcDiskstats {
|
||||
private static final Logger log = LogUtil.getLogger();
|
||||
private static final String PROC_PATH = "/proc/diskstats";
|
||||
private static final int TTL = 500; // update stats every 0.5 second
|
||||
|
||||
private static HashMap<String, HddStats> hdds = new HashMap<String, HddStats>();
|
||||
private static long updateTimestamp;
|
||||
|
||||
|
||||
private synchronized static void update(){
|
||||
if(System.currentTimeMillis() - updateTimestamp < TTL)
|
||||
return;
|
||||
updateTimestamp = System.currentTimeMillis();
|
||||
try {
|
||||
BufferedReader in = new BufferedReader(new FileReader(PROC_PATH));
|
||||
String line = null;
|
||||
while((line=in.readLine()) != null){
|
||||
String[] str = line.trim().split("\\s+", 4);
|
||||
if(str.length >= 4) {
|
||||
String devName = str[2];
|
||||
if(!hdds.containsKey(devName)){
|
||||
HddStats hdd = new HddStats(devName);
|
||||
hdds.put(hdd.getDevName(), hdd);
|
||||
}
|
||||
hdds.get(devName).update(str[3]);
|
||||
}
|
||||
}
|
||||
in.close();
|
||||
} catch (IOException e) {
|
||||
log.log(Level.SEVERE, null, e);
|
||||
}
|
||||
}
|
||||
|
||||
public static HddStats getStats(String devName){
|
||||
update();
|
||||
return hdds.get(devName);
|
||||
}
|
||||
|
||||
|
||||
public static class HddStats {
|
||||
private String devName;
|
||||
//read I/Os requests number of read I/Os processed
|
||||
private long readIO = -1;
|
||||
//read merges requests number of read I/Os merged with in-queue I/O
|
||||
private long readMerges = -1;
|
||||
//read sectors sectors number of sectors read
|
||||
private long readSectors = -1;
|
||||
//read ticks milliseconds total wait time for read requests
|
||||
private long readTicks = -1;
|
||||
//write I/Os requests number of write I/Os processed
|
||||
private long writeIO = -1;
|
||||
//write merges requests number of write I/Os merged with in-queue I/O
|
||||
private long writeMerges = -1;
|
||||
//write sectors sectors number of sectors written
|
||||
private long writeSectors = -1;
|
||||
//write ticks milliseconds total wait time for write requests
|
||||
private long writeTicks = -1;
|
||||
//in_flight requests number of I/Os currently in flight
|
||||
private long inFlight = -1;
|
||||
//io_ticks milliseconds total time this block device has been active
|
||||
private long ioTicks = -1;
|
||||
//time_in_queue milliseconds total wait time for all requests
|
||||
private long timeInQueue = -1;
|
||||
|
||||
private ThroughputCalculator readThroughput;
|
||||
private ThroughputCalculator writeThroughput;
|
||||
|
||||
|
||||
protected HddStats(String devName) {
|
||||
this.devName = devName;
|
||||
readThroughput = new ThroughputCalculator();
|
||||
writeThroughput = new ThroughputCalculator();
|
||||
}
|
||||
protected void update(String line){
|
||||
String[] stats = line.split("\\s+");
|
||||
if(stats.length >= 11){
|
||||
readIO = Long.parseLong(stats[0]);
|
||||
readMerges = Long.parseLong(stats[1]);
|
||||
readSectors = Long.parseLong(stats[2]);
|
||||
readTicks = Long.parseLong(stats[3]);
|
||||
writeIO = Long.parseLong(stats[4]);
|
||||
writeMerges = Long.parseLong(stats[5]);
|
||||
writeSectors = Long.parseLong(stats[6]);
|
||||
writeTicks = Long.parseLong(stats[7]);
|
||||
inFlight = Long.parseLong(stats[8]);
|
||||
ioTicks = Long.parseLong(stats[9]);
|
||||
timeInQueue = Long.parseLong(stats[10]);
|
||||
|
||||
readThroughput.setTotalHandledData(readSectors * 512);
|
||||
writeThroughput.setTotalHandledData(writeSectors * 512);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public String getDevName() {
|
||||
return devName;
|
||||
}
|
||||
/**
|
||||
* This values increment when an I/O request completes.
|
||||
*/
|
||||
public long getReadIO() {
|
||||
return readIO;
|
||||
}
|
||||
/**
|
||||
* This value increment when an I/O request is merged with an
|
||||
* already-queued I/O request.
|
||||
*/
|
||||
public long getReadMerges() {
|
||||
return readMerges;
|
||||
}
|
||||
/**
|
||||
* This value count the number of sectors read from to this
|
||||
* block device. The "sectors" in question are the standard UNIX 512-byte
|
||||
* sectors, not any device- or filesystem-specific block size. The
|
||||
* counter is incremented when the I/O completes.
|
||||
*/
|
||||
public long getReadSectors() {
|
||||
return readSectors;
|
||||
}
|
||||
/**
|
||||
* This value count the number of milliseconds that I/O requests have
|
||||
* waited on this block device. If there are multiple I/O requests waiting,
|
||||
* this value will increase at a rate greater than 1000/second; for
|
||||
* example, if 60 read requests wait for an average of 30 ms, the read_ticks
|
||||
* field will increase by 60*30 = 1800.
|
||||
*/
|
||||
public long getReadTicks() {
|
||||
return readTicks;
|
||||
}
|
||||
/**
|
||||
* This values increment when an I/O request completes.
|
||||
*/
|
||||
public long getWriteIO() {
|
||||
return writeIO;
|
||||
}
|
||||
/**
|
||||
* This value increment when an I/O request is merged with an
|
||||
* already-queued I/O request.
|
||||
*/
|
||||
public long getWriteMerges() {
|
||||
return writeMerges;
|
||||
}
|
||||
/**
|
||||
* This value count the number of sectors written to this
|
||||
* block device. The "sectors" in question are the standard UNIX 512-byte
|
||||
* sectors, not any device- or filesystem-specific block size. The
|
||||
* counter is incremented when the I/O completes.
|
||||
*/
|
||||
public long getWriteSectors() {
|
||||
return writeSectors;
|
||||
}
|
||||
/**
|
||||
* This value count the number of milliseconds that I/O requests have
|
||||
* waited on this block device. If there are multiple I/O requests waiting,
|
||||
* this value will increase at a rate greater than 1000/second; for
|
||||
* example, if 60 write requests wait for an average of 30 ms, the write_ticks
|
||||
* field will increase by 60*30 = 1800.
|
||||
*/
|
||||
public long getWriteTicks() {
|
||||
return writeTicks;
|
||||
}
|
||||
/**
|
||||
* This value counts the number of I/O requests that have been issued to
|
||||
* the device driver but have not yet completed. It does not include I/O
|
||||
* requests that are in the queue but not yet issued to the device driver.
|
||||
*/
|
||||
public long getInFlight() {
|
||||
return inFlight;
|
||||
}
|
||||
/**
|
||||
* This value counts the number of milliseconds during which the device has
|
||||
* had I/O requests queued.
|
||||
*/
|
||||
public long getIoTicks() {
|
||||
return ioTicks;
|
||||
}
|
||||
/**
|
||||
* This value counts the number of milliseconds that I/O requests have waited
|
||||
* on this block device. If there are multiple I/O requests waiting, this
|
||||
* value will increase as the product of the number of milliseconds times the
|
||||
* number of requests waiting (see "read ticks" above for an example).
|
||||
*/
|
||||
public long getTimeInQueue() {
|
||||
return timeInQueue;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the average byte/second read throughput from the disk
|
||||
*/
|
||||
public double getReadThroughput(){
|
||||
return readThroughput.getByteThroughput();
|
||||
}
|
||||
/**
|
||||
* @return the average byte/second write throughput to the disk
|
||||
*/
|
||||
public double getWriteThroughput(){
|
||||
return writeThroughput.getByteThroughput();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void main(String[] args){
|
||||
while(true){
|
||||
HddStats hdd = ProcDiskstats.getStats("sda");
|
||||
System.out.println("sda= " +
|
||||
"read: " + StringUtil.formatByteSizeToString((long)hdd.getReadThroughput()) + "/s "+
|
||||
"write: " + StringUtil.formatByteSizeToString((long)hdd.getWriteThroughput()) + "/s");
|
||||
try{Thread.sleep(1000);}catch (Exception e){}
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2015 Ziver Koc
|
||||
*
|
||||
* 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 zutil.osal.linux.app;
|
||||
|
||||
import zutil.StringUtil;
|
||||
import zutil.Timer;
|
||||
import zutil.log.LogUtil;
|
||||
import zutil.net.ThroughputCalculator;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* Documentation from https://www.kernel.org/doc/Documentation/block/stat.txt
|
||||
*
|
||||
* Created by Ziver on 2015-05-19.
|
||||
*/
|
||||
public class ProcDiskstats {
|
||||
private static final Logger log = LogUtil.getLogger();
|
||||
private static final String PROC_PATH = "/proc/diskstats";
|
||||
private static final int TTL = 500; // update stats every 0.5 second
|
||||
|
||||
private static HashMap<String, HddStats> hdds = new HashMap<String, HddStats>();
|
||||
private static Timer updateTimer = new Timer(TTL);
|
||||
|
||||
|
||||
private synchronized static void update(){
|
||||
if(!updateTimer.hasTimedOut())
|
||||
return;
|
||||
|
||||
try {
|
||||
BufferedReader in = new BufferedReader(new FileReader(PROC_PATH));
|
||||
parse(in);
|
||||
in.close();
|
||||
} catch (IOException e) {
|
||||
log.log(Level.SEVERE, null, e);
|
||||
}
|
||||
}
|
||||
protected static void parse(BufferedReader in) throws IOException {
|
||||
updateTimer.start();
|
||||
String line = null;
|
||||
while((line=in.readLine()) != null){
|
||||
String[] str = line.trim().split("\\s+", 4);
|
||||
if(str.length >= 4) {
|
||||
String devName = str[2];
|
||||
if(!hdds.containsKey(devName)){
|
||||
HddStats hdd = new HddStats(devName);
|
||||
hdds.put(hdd.getDevName(), hdd);
|
||||
}
|
||||
hdds.get(devName).update(str[3]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static HddStats getStats(String devName){
|
||||
update();
|
||||
return hdds.get(devName);
|
||||
}
|
||||
|
||||
|
||||
public static class HddStats {
|
||||
private String devName;
|
||||
//read I/Os requests number of read I/Os processed
|
||||
private long readIO = -1;
|
||||
//read merges requests number of read I/Os merged with in-queue I/O
|
||||
private long readMerges = -1;
|
||||
//read sectors sectors number of sectors read
|
||||
private long readSectors = -1;
|
||||
//read ticks milliseconds total wait time for read requests
|
||||
private long readTicks = -1;
|
||||
//write I/Os requests number of write I/Os processed
|
||||
private long writeIO = -1;
|
||||
//write merges requests number of write I/Os merged with in-queue I/O
|
||||
private long writeMerges = -1;
|
||||
//write sectors sectors number of sectors written
|
||||
private long writeSectors = -1;
|
||||
//write ticks milliseconds total wait time for write requests
|
||||
private long writeTicks = -1;
|
||||
//in_flight requests number of I/Os currently in flight
|
||||
private long inFlight = -1;
|
||||
//io_ticks milliseconds total time this block device has been active
|
||||
private long ioTicks = -1;
|
||||
//time_in_queue milliseconds total wait time for all requests
|
||||
private long timeInQueue = -1;
|
||||
|
||||
private ThroughputCalculator readThroughput;
|
||||
private ThroughputCalculator writeThroughput;
|
||||
|
||||
|
||||
protected HddStats(String devName) {
|
||||
this.devName = devName;
|
||||
readThroughput = new ThroughputCalculator();
|
||||
writeThroughput = new ThroughputCalculator();
|
||||
}
|
||||
protected void update(String line){
|
||||
String[] stats = line.split("\\s+");
|
||||
if(stats.length >= 11){
|
||||
readIO = Long.parseLong(stats[0]);
|
||||
readMerges = Long.parseLong(stats[1]);
|
||||
readSectors = Long.parseLong(stats[2]);
|
||||
readTicks = Long.parseLong(stats[3]);
|
||||
writeIO = Long.parseLong(stats[4]);
|
||||
writeMerges = Long.parseLong(stats[5]);
|
||||
writeSectors = Long.parseLong(stats[6]);
|
||||
writeTicks = Long.parseLong(stats[7]);
|
||||
inFlight = Long.parseLong(stats[8]);
|
||||
ioTicks = Long.parseLong(stats[9]);
|
||||
timeInQueue = Long.parseLong(stats[10]);
|
||||
|
||||
readThroughput.setTotalHandledData(readSectors * 512);
|
||||
writeThroughput.setTotalHandledData(writeSectors * 512);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public String getDevName() {
|
||||
return devName;
|
||||
}
|
||||
/**
|
||||
* This values increment when an I/O request completes.
|
||||
*/
|
||||
public long getReadIO() {
|
||||
return readIO;
|
||||
}
|
||||
/**
|
||||
* This value increment when an I/O request is merged with an
|
||||
* already-queued I/O request.
|
||||
*/
|
||||
public long getReadMerges() {
|
||||
return readMerges;
|
||||
}
|
||||
/**
|
||||
* This value count the number of sectors read from to this
|
||||
* block device. The "sectors" in question are the standard UNIX 512-byte
|
||||
* sectors, not any device- or filesystem-specific block size. The
|
||||
* counter is incremented when the I/O completes.
|
||||
*/
|
||||
public long getReadSectors() {
|
||||
return readSectors;
|
||||
}
|
||||
/**
|
||||
* This value count the number of milliseconds that I/O requests have
|
||||
* waited on this block device. If there are multiple I/O requests waiting,
|
||||
* this value will increase at a rate greater than 1000/second; for
|
||||
* example, if 60 read requests wait for an average of 30 ms, the read_ticks
|
||||
* field will increase by 60*30 = 1800.
|
||||
*/
|
||||
public long getReadTicks() {
|
||||
return readTicks;
|
||||
}
|
||||
/**
|
||||
* This values increment when an I/O request completes.
|
||||
*/
|
||||
public long getWriteIO() {
|
||||
return writeIO;
|
||||
}
|
||||
/**
|
||||
* This value increment when an I/O request is merged with an
|
||||
* already-queued I/O request.
|
||||
*/
|
||||
public long getWriteMerges() {
|
||||
return writeMerges;
|
||||
}
|
||||
/**
|
||||
* This value count the number of sectors written to this
|
||||
* block device. The "sectors" in question are the standard UNIX 512-byte
|
||||
* sectors, not any device- or filesystem-specific block size. The
|
||||
* counter is incremented when the I/O completes.
|
||||
*/
|
||||
public long getWriteSectors() {
|
||||
return writeSectors;
|
||||
}
|
||||
/**
|
||||
* This value count the number of milliseconds that I/O requests have
|
||||
* waited on this block device. If there are multiple I/O requests waiting,
|
||||
* this value will increase at a rate greater than 1000/second; for
|
||||
* example, if 60 write requests wait for an average of 30 ms, the write_ticks
|
||||
* field will increase by 60*30 = 1800.
|
||||
*/
|
||||
public long getWriteTicks() {
|
||||
return writeTicks;
|
||||
}
|
||||
/**
|
||||
* This value counts the number of I/O requests that have been issued to
|
||||
* the device driver but have not yet completed. It does not include I/O
|
||||
* requests that are in the queue but not yet issued to the device driver.
|
||||
*/
|
||||
public long getInFlight() {
|
||||
return inFlight;
|
||||
}
|
||||
/**
|
||||
* This value counts the number of milliseconds during which the device has
|
||||
* had I/O requests queued.
|
||||
*/
|
||||
public long getIoTicks() {
|
||||
return ioTicks;
|
||||
}
|
||||
/**
|
||||
* This value counts the number of milliseconds that I/O requests have waited
|
||||
* on this block device. If there are multiple I/O requests waiting, this
|
||||
* value will increase as the product of the number of milliseconds times the
|
||||
* number of requests waiting (see "read ticks" above for an example).
|
||||
*/
|
||||
public long getTimeInQueue() {
|
||||
return timeInQueue;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the average byte/second read throughput from the disk
|
||||
*/
|
||||
public double getReadThroughput(){
|
||||
return readThroughput.getByteThroughput();
|
||||
}
|
||||
/**
|
||||
* @return the average byte/second write throughput to the disk
|
||||
*/
|
||||
public double getWriteThroughput(){
|
||||
return writeThroughput.getByteThroughput();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void main(String[] args){
|
||||
while(true){
|
||||
HddStats hdd = ProcDiskstats.getStats("sda");
|
||||
System.out.println("sda= " +
|
||||
"read: " + StringUtil.formatByteSizeToString((long)hdd.getReadThroughput()) + "/s "+
|
||||
"write: " + StringUtil.formatByteSizeToString((long)hdd.getWriteThroughput()) + "/s");
|
||||
try{Thread.sleep(1000);}catch (Exception e){}
|
||||
}
|
||||
}
|
||||
}
|
||||
135
src/zutil/osal/linux/app/ProcNetArp.java
Executable file
135
src/zutil/osal/linux/app/ProcNetArp.java
Executable file
|
|
@ -0,0 +1,135 @@
|
|||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2015 Ziver Koc
|
||||
*
|
||||
* 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 zutil.osal.linux.app;
|
||||
|
||||
import zutil.Timer;
|
||||
import zutil.converter.Converter;
|
||||
import zutil.log.LogUtil;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.net.InetAddress;
|
||||
import java.net.NetworkInterface;
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* Makes the Linux ARP cache available as Java api
|
||||
* <p>
|
||||
* Created by Ziver on 2015-05-19.
|
||||
*/
|
||||
public class ProcNetArp {
|
||||
private static final Logger logger = LogUtil.getLogger();
|
||||
private static final String PROC_PATH = "/proc/net/arp";
|
||||
private static final int TTL = 500; // update stats every 0.5 second
|
||||
|
||||
private static HashMap<InetAddress, ArpEntry> arpTable = new HashMap<>();
|
||||
private static Timer updateTimer = new Timer(TTL);
|
||||
|
||||
|
||||
private synchronized static void update() {
|
||||
if (!updateTimer.hasTimedOut())
|
||||
return;
|
||||
|
||||
try {
|
||||
BufferedReader in = new BufferedReader(new FileReader(PROC_PATH));
|
||||
parse(in);
|
||||
in.close();
|
||||
} catch (IOException e) {
|
||||
logger.log(Level.SEVERE, null, e);
|
||||
}
|
||||
}
|
||||
protected static void parse(BufferedReader in) throws IOException {
|
||||
updateTimer.start();
|
||||
String line = null;
|
||||
in.readLine(); // Skipp headers
|
||||
while ((line = in.readLine()) != null) {
|
||||
String[] str = line.split("\\s+");
|
||||
|
||||
if (str.length >= 6) {
|
||||
InetAddress ip = InetAddress.getByName(str[0]);
|
||||
if (!arpTable.containsKey(ip))
|
||||
arpTable.put(ip, new ArpEntry());
|
||||
ArpEntry entry = arpTable.get(ip);
|
||||
entry.ip = ip;
|
||||
entry.hwAddress = Converter.hexToByte(str[3].replaceAll(":", ""));
|
||||
entry.netIf = str[5];
|
||||
} else
|
||||
logger.warning(PROC_PATH + " contains unrecognized format");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static Collection<ArpEntry> getAllArpEntries() {
|
||||
update();
|
||||
return arpTable.values();
|
||||
}
|
||||
|
||||
public static ArpEntry getArpEntry(InetAddress ip) {
|
||||
update();
|
||||
return arpTable.get(ip);
|
||||
}
|
||||
|
||||
|
||||
public static class ArpEntry {
|
||||
private InetAddress ip;
|
||||
private byte[] hwAddress;
|
||||
private String netIf;
|
||||
|
||||
|
||||
public InetAddress getIp() {
|
||||
return ip;
|
||||
}
|
||||
|
||||
public byte[] getHwAddress() {
|
||||
return hwAddress;
|
||||
}
|
||||
|
||||
public String getHwAddressString() {
|
||||
StringBuilder str = new StringBuilder();
|
||||
for (int i = 0; i < hwAddress.length; i++) {
|
||||
if (i != 0)
|
||||
str.append(':');
|
||||
str.append(Converter.toHexString(hwAddress[i]));
|
||||
}
|
||||
return str.toString();
|
||||
}
|
||||
|
||||
public String getNetworkInterface() {
|
||||
return netIf;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void main(String[] args) {
|
||||
for (ArpEntry entry : getAllArpEntries()) {
|
||||
System.out.println(entry.getIp().getHostAddress() + " => " + entry.getHwAddressString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,208 +1,214 @@
|
|||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2015 Ziver Koc
|
||||
*
|
||||
* 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 zutil.osal.app.linux;
|
||||
|
||||
import zutil.Timer;
|
||||
import zutil.log.LogUtil;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* Documentation from https://www.kernel.org/doc/Documentation/block/stat.txt
|
||||
*
|
||||
* Created by ezivkoc on 2015-05-19.
|
||||
*/
|
||||
public class ProcStat {
|
||||
private static final Logger log = LogUtil.getLogger();
|
||||
private static final String PROC_PATH = "/proc/stat";
|
||||
private static final int TTL = 500; // update stats every 0.5 second
|
||||
|
||||
private static CpuStats cpuTotal = new CpuStats();
|
||||
private static ArrayList<CpuStats> cpus = new ArrayList<CpuStats>();
|
||||
private static long uptime;
|
||||
private static long processes;
|
||||
private static Timer updateTimer = new Timer(TTL);
|
||||
|
||||
|
||||
private synchronized static void update(){
|
||||
if(updateTimer.hasTimedOut())
|
||||
return;
|
||||
updateTimer.start();
|
||||
try {
|
||||
BufferedReader in = new BufferedReader(new FileReader(PROC_PATH));
|
||||
String line = null;
|
||||
while((line=in.readLine()) != null){
|
||||
String[] str = line.split("\\s+");
|
||||
if(str[0].equals("cpu")) {
|
||||
cpuTotal.update(str);
|
||||
}
|
||||
else if(str[0].startsWith("cpu")){
|
||||
int cpuId = Integer.parseInt(str[0].substring(3));
|
||||
if(cpus.size() <= cpuId)
|
||||
cpus.add(new CpuStats());
|
||||
cpus.get(cpuId).update(str);
|
||||
}
|
||||
else if(str[0].startsWith("btime")){
|
||||
uptime = Long.parseLong(str[1]);
|
||||
}
|
||||
else if(str[0].startsWith("processes")){
|
||||
processes = Long.parseLong(str[1]);
|
||||
}
|
||||
}
|
||||
in.close();
|
||||
} catch (IOException e) {
|
||||
log.log(Level.SEVERE, null, e);
|
||||
}
|
||||
}
|
||||
|
||||
public static CpuStats getTotalCpuStats(){
|
||||
update();
|
||||
return cpuTotal;
|
||||
}
|
||||
public static Iterator<CpuStats> getCpuStats(){
|
||||
update();
|
||||
return cpus.iterator();
|
||||
}
|
||||
/**
|
||||
* @return the time at which the system booted, in seconds since the Unix epoch.
|
||||
*/
|
||||
public static long getUptime(){
|
||||
update();
|
||||
return uptime;
|
||||
}
|
||||
/**
|
||||
* @return the number of processes and threads created, which includes (but is not limited to) those created by calls to the fork() and clone() system calls.
|
||||
*/
|
||||
public static long getProcesses(){
|
||||
update();
|
||||
return processes;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static class CpuStats {
|
||||
// normal processes executing in user mode
|
||||
private long user;
|
||||
// processes executing in kernel mode
|
||||
private long system;
|
||||
// twiddling thumbs
|
||||
private long idle;
|
||||
// waiting for I/O to complete
|
||||
private long iowait;
|
||||
private long steal;
|
||||
// virtual processes
|
||||
private long guest;
|
||||
private long total;
|
||||
|
||||
// Percentage
|
||||
private float load_total;
|
||||
private float load_user;
|
||||
private float load_system;
|
||||
private float load_iowait;
|
||||
private float load_virtual;
|
||||
|
||||
protected CpuStats(){}
|
||||
protected void update(String[] stats){
|
||||
long newUser=0, newNice=0, newSystem=0, newIdle=0, newIowait=0, newIrq=0, newSoftirq=0, newSteal=0, newGuest=0, newGuestNice=0;
|
||||
if(stats.length >= 1+8){
|
||||
newUser = Long.parseLong(stats[1]);
|
||||
newNice = Long.parseLong(stats[2]);
|
||||
newSystem = Long.parseLong(stats[3]);
|
||||
newIdle = Long.parseLong(stats[4]);
|
||||
newIowait = Long.parseLong(stats[5]);
|
||||
newIrq = Long.parseLong(stats[6]);
|
||||
newSoftirq = Long.parseLong(stats[7]);
|
||||
if(stats.length >= 1+8+3){
|
||||
newSteal = Long.parseLong(stats[8]);
|
||||
newGuest = Long.parseLong(stats[9]);
|
||||
newGuestNice = Long.parseLong(stats[10]);
|
||||
}
|
||||
|
||||
// Summarize
|
||||
newUser = newUser + newNice - newGuest - newGuestNice;
|
||||
newSystem = newSystem + newIrq + newSoftirq;
|
||||
newGuest = newGuest + newGuestNice;
|
||||
|
||||
// Calculate the diffs
|
||||
long userDiff = newUser - user;
|
||||
long idleDiff = (newIdle + newIowait) - (idle + iowait);
|
||||
long systemDiff = newSystem - system;
|
||||
long stealDiff = newSteal - steal;
|
||||
long virtualDiff = newGuest - guest;
|
||||
long newTotal = userDiff + systemDiff + idleDiff + stealDiff + virtualDiff;
|
||||
// Calculate load
|
||||
load_total = (float)(newTotal-idleDiff)/newTotal;
|
||||
load_user = (float)userDiff/newTotal;
|
||||
load_system = (float)systemDiff/newTotal;
|
||||
load_iowait = (float)(newIowait - iowait)/newTotal;
|
||||
load_virtual = (float)virtualDiff/newTotal;
|
||||
|
||||
// update old values
|
||||
user = newUser;
|
||||
system = newSystem;
|
||||
idle = newIdle;
|
||||
iowait = newIowait;
|
||||
steal = newSteal;
|
||||
guest = newGuest;
|
||||
total = newTotal;
|
||||
}
|
||||
}
|
||||
|
||||
public float getTotalLoad() {
|
||||
return load_total;
|
||||
}
|
||||
public float getUserLoad() {
|
||||
return load_user;
|
||||
}
|
||||
public float getSystemLoad() {
|
||||
return load_system;
|
||||
}
|
||||
public float getIOWaitLoad() {
|
||||
return load_iowait;
|
||||
}
|
||||
public float getVirtualLoad() {
|
||||
return load_virtual;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static void main(String[] args){
|
||||
while(true){
|
||||
Iterator<CpuStats> it = ProcStat.getCpuStats();
|
||||
for(int i=0; it.hasNext(); ++i){
|
||||
CpuStats cpu = it.next();
|
||||
System.out.print("CPU"+i+": " + cpu.getTotalLoad()+ " ");
|
||||
}
|
||||
System.out.println("Total Load: " + ProcStat.getTotalCpuStats().getTotalLoad());
|
||||
try{Thread.sleep(1000);}catch (Exception e){}
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2015 Ziver Koc
|
||||
*
|
||||
* 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 zutil.osal.linux.app;
|
||||
|
||||
import zutil.Timer;
|
||||
import zutil.log.LogUtil;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* Documentation from https://www.kernel.org/doc/Documentation/block/stat.txt
|
||||
*
|
||||
* Created by Ziver on 2015-05-19.
|
||||
*/
|
||||
public class ProcStat {
|
||||
private static final Logger log = LogUtil.getLogger();
|
||||
private static final String PROC_PATH = "/proc/stat";
|
||||
private static final int TTL = 500; // update stats every 0.5 second
|
||||
|
||||
private static CpuStats cpuTotal = new CpuStats();
|
||||
private static ArrayList<CpuStats> cpus = new ArrayList<CpuStats>();
|
||||
private static long uptime;
|
||||
private static long processes;
|
||||
private static Timer updateTimer = new Timer(TTL);
|
||||
|
||||
|
||||
private synchronized static void update(){
|
||||
if(!updateTimer.hasTimedOut())
|
||||
return;
|
||||
|
||||
try {
|
||||
BufferedReader in = new BufferedReader(new FileReader(PROC_PATH));
|
||||
parse(in);
|
||||
in.close();
|
||||
} catch (IOException e) {
|
||||
log.log(Level.SEVERE, null, e);
|
||||
}
|
||||
}
|
||||
protected static void parse(BufferedReader in) throws IOException {
|
||||
updateTimer.start();
|
||||
String line = null;
|
||||
while((line=in.readLine()) != null){
|
||||
String[] str = line.split("\\s+");
|
||||
if(str[0].equals("cpu")) {
|
||||
cpuTotal.update(str);
|
||||
}
|
||||
else if(str[0].startsWith("cpu")){
|
||||
int cpuId = Integer.parseInt(str[0].substring(3));
|
||||
if(cpus.size() <= cpuId)
|
||||
cpus.add(new CpuStats());
|
||||
cpus.get(cpuId).update(str);
|
||||
}
|
||||
else if(str[0].startsWith("btime")){
|
||||
uptime = Long.parseLong(str[1]);
|
||||
}
|
||||
else if(str[0].startsWith("processes")){
|
||||
processes = Long.parseLong(str[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static CpuStats getTotalCpuStats(){
|
||||
update();
|
||||
return cpuTotal;
|
||||
}
|
||||
public static Iterator<CpuStats> getCpuStats(){
|
||||
update();
|
||||
return cpus.iterator();
|
||||
}
|
||||
/**
|
||||
* @return the time at which the system booted, in seconds since the Unix epoch.
|
||||
*/
|
||||
public static long getUptime(){
|
||||
update();
|
||||
return uptime;
|
||||
}
|
||||
/**
|
||||
* @return the number of processes and threads created, which includes (but is not limited to) those created by calls to the fork() and clone() system calls.
|
||||
*/
|
||||
public static long getProcesses(){
|
||||
update();
|
||||
return processes;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static class CpuStats {
|
||||
// normal processes executing in user mode
|
||||
private long user;
|
||||
// processes executing in kernel mode
|
||||
private long system;
|
||||
// twiddling thumbs
|
||||
private long idle;
|
||||
// waiting for I/O to complete
|
||||
private long iowait;
|
||||
private long steal;
|
||||
// virtual processes
|
||||
private long guest;
|
||||
private long total;
|
||||
|
||||
// Percentage
|
||||
private float load_total;
|
||||
private float load_user;
|
||||
private float load_system;
|
||||
private float load_iowait;
|
||||
private float load_virtual;
|
||||
|
||||
protected CpuStats(){}
|
||||
protected void update(String[] stats){
|
||||
long newUser=0, newNice=0, newSystem=0, newIdle=0, newIowait=0, newIrq=0, newSoftirq=0, newSteal=0, newGuest=0, newGuestNice=0;
|
||||
if(stats.length >= 1+8){
|
||||
newUser = Long.parseLong(stats[1]);
|
||||
newNice = Long.parseLong(stats[2]);
|
||||
newSystem = Long.parseLong(stats[3]);
|
||||
newIdle = Long.parseLong(stats[4]);
|
||||
newIowait = Long.parseLong(stats[5]);
|
||||
newIrq = Long.parseLong(stats[6]);
|
||||
newSoftirq = Long.parseLong(stats[7]);
|
||||
if(stats.length >= 1+8+3){
|
||||
newSteal = Long.parseLong(stats[8]);
|
||||
newGuest = Long.parseLong(stats[9]);
|
||||
newGuestNice = Long.parseLong(stats[10]);
|
||||
}
|
||||
|
||||
// Summarize
|
||||
newUser = newUser + newNice - newGuest - newGuestNice;
|
||||
newSystem = newSystem + newIrq + newSoftirq;
|
||||
newGuest = newGuest + newGuestNice;
|
||||
|
||||
// Calculate the diffs
|
||||
long userDiff = newUser - user;
|
||||
long idleDiff = (newIdle + newIowait) - (idle + iowait);
|
||||
long systemDiff = newSystem - system;
|
||||
long stealDiff = newSteal - steal;
|
||||
long virtualDiff = newGuest - guest;
|
||||
long newTotal = userDiff + systemDiff + idleDiff + stealDiff + virtualDiff;
|
||||
// Calculate load
|
||||
load_total = (float)(newTotal-idleDiff)/newTotal;
|
||||
load_user = (float)userDiff/newTotal;
|
||||
load_system = (float)systemDiff/newTotal;
|
||||
load_iowait = (float)(newIowait - iowait)/newTotal;
|
||||
load_virtual = (float)virtualDiff/newTotal;
|
||||
|
||||
// update old values
|
||||
user = newUser;
|
||||
system = newSystem;
|
||||
idle = newIdle;
|
||||
iowait = newIowait;
|
||||
steal = newSteal;
|
||||
guest = newGuest;
|
||||
total = newTotal;
|
||||
}
|
||||
}
|
||||
|
||||
public float getTotalLoad() {
|
||||
return load_total;
|
||||
}
|
||||
public float getUserLoad() {
|
||||
return load_user;
|
||||
}
|
||||
public float getSystemLoad() {
|
||||
return load_system;
|
||||
}
|
||||
public float getIOWaitLoad() {
|
||||
return load_iowait;
|
||||
}
|
||||
public float getVirtualLoad() {
|
||||
return load_virtual;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static void main(String[] args){
|
||||
while(true){
|
||||
Iterator<CpuStats> it = ProcStat.getCpuStats();
|
||||
for(int i=0; it.hasNext(); ++i){
|
||||
CpuStats cpu = it.next();
|
||||
System.out.print("CPU"+i+": " + cpu.getTotalLoad()+ " ");
|
||||
}
|
||||
System.out.println("Total Load: " + ProcStat.getTotalCpuStats().getTotalLoad());
|
||||
try{Thread.sleep(1000);}catch (Exception e){}
|
||||
}
|
||||
}
|
||||
}
|
||||
78
src/zutil/osal/app/linux/Ps.java → src/zutil/osal/linux/app/Ps.java
Normal file → Executable file
78
src/zutil/osal/app/linux/Ps.java → src/zutil/osal/linux/app/Ps.java
Normal file → Executable file
|
|
@ -1,39 +1,39 @@
|
|||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2015 Ziver Koc
|
||||
*
|
||||
* 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 zutil.osal.app.linux;
|
||||
|
||||
import zutil.osal.OSAbstractionLayer;
|
||||
|
||||
/**
|
||||
* Created by Ziver on 2014-12-23.
|
||||
*/
|
||||
public class Ps {
|
||||
private static OSAbstractionLayer os = OSAbstractionLayer.getInstance();
|
||||
|
||||
public static boolean isRunning(int pid){
|
||||
String[] output = os.exec("ps -p "+pid);
|
||||
return output.length > 1;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2015 Ziver Koc
|
||||
*
|
||||
* 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 zutil.osal.linux.app;
|
||||
|
||||
import zutil.osal.OSAbstractionLayer;
|
||||
|
||||
/**
|
||||
* Created by Ziver on 2014-12-23.
|
||||
*/
|
||||
public class Ps {
|
||||
private static OSAbstractionLayer os = OSAbstractionLayer.getInstance();
|
||||
|
||||
public static boolean isRunning(int pid){
|
||||
String[] output = os.exec("ps -p "+pid);
|
||||
return output.length > 1;
|
||||
}
|
||||
}
|
||||
4
src/zutil/osal/OsalMacOSImpl.java → src/zutil/osal/macos/OsalMacOSImpl.java
Normal file → Executable file
4
src/zutil/osal/OsalMacOSImpl.java → src/zutil/osal/macos/OsalMacOSImpl.java
Normal file → Executable file
|
|
@ -22,9 +22,11 @@
|
|||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package zutil.osal;
|
||||
package zutil.osal.macos;
|
||||
|
||||
import com.mysql.jdbc.NotImplemented;
|
||||
import zutil.osal.HardwareAbstractionLayer;
|
||||
import zutil.osal.OSAbstractionLayer;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
149
src/zutil/osal/OsalWindowsImpl.java → src/zutil/osal/windows/OsalWindowsImpl.java
Normal file → Executable file
149
src/zutil/osal/OsalWindowsImpl.java → src/zutil/osal/windows/OsalWindowsImpl.java
Normal file → Executable file
|
|
@ -1,73 +1,76 @@
|
|||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2015 Ziver Koc
|
||||
*
|
||||
* 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 zutil.osal;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
/**
|
||||
* Windows platform specific implementation
|
||||
*/
|
||||
public class OsalWindowsImpl extends OSAbstractionLayer {
|
||||
|
||||
@Override
|
||||
public OSType getOSType() {
|
||||
return OSType.Windows;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getOSVersion() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getKernelVersion() {
|
||||
try {
|
||||
return getFirstLineFromExec("ver");
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getUsername() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public File getUserConfigPath() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public File getGlobalConfigPath() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public HardwareAbstractionLayer getHAL() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
||||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2015 Ziver Koc
|
||||
*
|
||||
* 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 zutil.osal.windows;
|
||||
|
||||
import zutil.osal.HardwareAbstractionLayer;
|
||||
import zutil.osal.OSAbstractionLayer;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
/**
|
||||
* Windows platform specific implementation
|
||||
*/
|
||||
public class OsalWindowsImpl extends OSAbstractionLayer {
|
||||
|
||||
@Override
|
||||
public OSType getOSType() {
|
||||
return OSType.Windows;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getOSVersion() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getKernelVersion() {
|
||||
try {
|
||||
return getFirstLineFromExec("ver");
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getUsername() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public File getUserConfigPath() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public File getGlobalConfigPath() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public HardwareAbstractionLayer getHAL() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
58
test/zutil/osal/linux/app/ProcNetArpTest.java
Executable file
58
test/zutil/osal/linux/app/ProcNetArpTest.java
Executable file
|
|
@ -0,0 +1,58 @@
|
|||
package zutil.osal.linux.app;
|
||||
|
||||
import org.junit.Test;
|
||||
import zutil.io.StringInputStream;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.InetAddress;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Created by ezivkoc on 2016-09-30.
|
||||
*/
|
||||
public class ProcNetArpTest {
|
||||
@Test
|
||||
public void parse() throws Exception {
|
||||
StringInputStream buff = new StringInputStream(
|
||||
"IP address HW type Flags HW address Mask Device\n" +
|
||||
"192.168.1.140 0x1 0x0 fc:f8:ae:3f:66:64 * eth0\n" +
|
||||
"169.254.67.249 0x1 0x0 78:ab:bb:c4:05:b3 * eth0\n" +
|
||||
"192.168.1.127 0x1 0x2 00:05:cd:39:aa:07 * eth0\n" +
|
||||
"192.168.1.1 0x1 0x2 c0:56:27:c2:5e:82 * eth0\n" +
|
||||
"192.168.1.190 0x1 0x0 fc:f8:ae:3f:66:64 * eth0\n" +
|
||||
"192.168.1.253 0x1 0x0 00:00:00:00:00:00 * eth0\n" +
|
||||
"192.168.1.105 0x1 0x2 24:0a:64:49:c9:7b * eth0\n" +
|
||||
"192.168.1.110 0x1 0x0 00:00:00:00:00:00 * eth0\n" +
|
||||
"192.168.1.2 0x1 0x0 00:00:00:00:00:00 * eth0\n" +
|
||||
"192.168.1.137 0x1 0x2 78:ab:bb:c4:05:b3 * eth0\n" +
|
||||
"192.168.1.128 0x1 0x2 6c:ad:f8:be:ef:ba * eth0\n" +
|
||||
"192.168.1.30 0x1 0x0 00:00:00:00:00:00 * eth0\n" +
|
||||
"192.168.1.12 0x1 0x0 00:00:00:00:00:00 * eth0\n" +
|
||||
"192.168.1.178 0x1 0x2 6c:ad:f8:be:ef:ba * eth0\n");
|
||||
ProcNetArp.parse(new BufferedReader(new InputStreamReader(buff)));
|
||||
|
||||
ProcNetArp.ArpEntry entry = ProcNetArp.getArpEntry(InetAddress.getByName("192.168.1.140"));
|
||||
assertEquals("192.168.1.140", entry.getIp().getHostAddress());
|
||||
assertEquals("fc:f8:ae:3f:66:64", entry.getHwAddressString());
|
||||
assertEquals("eth0", entry.getNetworkInterface());
|
||||
|
||||
entry = ProcNetArp.getArpEntry(InetAddress.getByName("192.168.1.1"));
|
||||
assertEquals("192.168.1.1", entry.getIp().getHostAddress());
|
||||
assertEquals("c0:56:27:c2:5e:82", entry.getHwAddressString());
|
||||
assertEquals("eth0", entry.getNetworkInterface());
|
||||
|
||||
entry = ProcNetArp.getArpEntry(InetAddress.getByName("192.168.1.178"));
|
||||
assertEquals("192.168.1.178", entry.getIp().getHostAddress());
|
||||
assertEquals("6c:ad:f8:be:ef:ba", entry.getHwAddressString());
|
||||
assertEquals("eth0", entry.getNetworkInterface());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void parseTwoTimes() throws Exception {
|
||||
parse();
|
||||
parse();
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue