You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
udi-wms-java/src/main/java/com/glxp/api/util/MyHardWareUtils.groovy

760 lines
26 KiB
Groovy

3 years ago
package com.glxp.api.util
import java.util.logging.Logger
import java.util.regex.Matcher
import java.util.regex.Pattern
class MyHardWareUtils {
private static Logger logger = Logger.getLogger(HardWareUtils.class);
private static String OSName = System.getProperty("os.name").toLowerCase();
public static List<String> listResult = new ArrayList<String>();
public HardWareUtils() {
logger.info("------当前系统版本-----" + OSName);
}
/**
*
*/
public static String getOSName() {
return OSName;
}
// 主板序列号 windows
private static String getMainBordId_windows() {
String result = "";
try {
File file = File.createTempFile("realhowto", ".vbs");
file.deleteOnExit();
FileWriter fw = new java.io.FileWriter(file);
String vbs = "Set objWMIService = GetObject(\"winmgmts:\\\\.\\root\\cimv2\")\n"
+"Set colItems = objWMIService.ExecQuery _ \n" + " (\"Select * from Win32_BaseBoard\") \n"
+"For Each objItem in colItems \n" + " Wscript.Echo objItem.SerialNumber \n"
+" exit for ' do the first cpu only! \n" + "Next \n";
fw.write(vbs);
fw.close();
Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = input.readLine()) != null) {
result += line;
}
input.close();
} catch (Exception e) {
logger.error("获取主板信息错误", e);
}
return result.trim();
}
// 主板序列号 linux
private static String getMainBordId_linux() {
String result = "";
String maniBord_cmd = /dmidecode | grep 'Serial Number' | awk '{print $3}' | tail -1/;
Process p;
try {
p = Runtime.getRuntime().exec(new String[]{"sh", "-c", maniBord_cmd});// 管道
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
result += line;
break;
}
br.close();
} catch (IOException e) {
logger.error("获取主板信息错误", e);
}
return result;
}
/**
* mac Linuxeth0
*/
private static String getMAC_linux() {
String mac = null;
BufferedReader bufferedReader = null;
Process process = null;
try {
// linux下的命令一般取eth0作为本地主网卡
process = Runtime.getRuntime().exec("ifconfig eth0");
// 显示信息中包含有mac地址信息
bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
int index = -1;
while ((line = bufferedReader.readLine()) != null) {
// 寻找标示字符串[hwaddr]
index = line.toLowerCase().indexOf("hwaddr");
if (index >= 0) {// 找到了
// 取出mac地址并去除2边空格
mac = line.substring(index + "hwaddr".length() + 1).trim();
break;
}
}
} catch (IOException e) {
logger.error("获取mac信息错误", e);
} finally {
try {
if (bufferedReader != null) {
bufferedReader.close();
}
} catch (IOException e1) {
logger.error("获取mac信息错误", e1);
}
bufferedReader = null;
process = null;
}
return mac;
}
/**
* Linuxmac
*/
private static String getMAC_linuxs() {
String mac = null;
BufferedReader bufferedReader = null;
Process process = null;
try {
// linux下的命令一般取eth0作为本地主网卡
process = Runtime.getRuntime().exec("ifconfig");
// 显示信息中包含有mac地址信息
bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
int index = -1;
while ((line = bufferedReader.readLine()) != null) {
Pattern pat = Pattern.compile("\\b\\w+:\\w+:\\w+:\\w+:\\w+:\\w+\\b");
Matcher mat = pat.matcher(line);
if (mat.find()) {
mac = mat.group(0);
}
}
} catch (IOException e) {
logger.error("获取mac信息错误", e);
} finally {
try {
if (bufferedReader != null) {
bufferedReader.close();
}
} catch (IOException e1) {
logger.error("获取mac信息错误", e1);
}
bufferedReader = null;
process = null;
}
return mac;
}
/**
* widnowsmac.
*/
private static String getMAC_windows() {
InetAddress ip = null;
NetworkInterface ni = null;
List<String> macList = new ArrayList<String>();
try {
Enumeration<NetworkInterface> netInterfaces = (Enumeration<NetworkInterface>) NetworkInterface
.getNetworkInterfaces();
while (netInterfaces.hasMoreElements()) {
ni = (NetworkInterface) netInterfaces.nextElement();
// ----------特定情况可以考虑用ni.getName判断
// 遍历所有ip
Enumeration<InetAddress> ips = ni.getInetAddresses();
while (ips.hasMoreElements()) {
ip = (InetAddress) ips.nextElement();
if (!ip.isLoopbackAddress() // 非127.0.0.1
&& ip.getHostAddress().matches("(\\d{1,3}\\.){3}\\d{1,3}")) {
macList.add(getMacFromBytes(ni.getHardwareAddress()));
}
}
}
} catch (Exception e) {
logger.error("获取mac错误", e);
}
if (macList.size() > 0) {
return macList.get(0);
} else {
return "";
}
}
private static String getMacFromBytes(byte[] bytes) {
StringBuffer mac = new StringBuffer();
byte currentByte;
boolean first = false;
for (byte b : bytes) {
if (first) {
mac.append("-");
}
currentByte = (byte) ((b & 240) >> 4);
mac.append(Integer.toHexString(currentByte));
currentByte = (byte) (b & 15);
mac.append(Integer.toHexString(currentByte));
first = true;
}
return mac.toString().toUpperCase();
}
/**
* CPU Windows
*
* @return
*/
private static String getCPUID_Windows() {
String result = "";
try {
File file = File.createTempFile("tmp", ".vbs");
file.deleteOnExit();
FileWriter fw = new java.io.FileWriter(file);
String vbs = "Set objWMIService = GetObject(\"winmgmts:\\\\.\\root\\cimv2\")\n"
+"Set colItems = objWMIService.ExecQuery _ \n" + " (\"Select * from Win32_Processor\") \n"
+"For Each objItem in colItems \n" + " Wscript.Echo objItem.ProcessorId \n"
+" exit for ' do the first cpu only! \n" + "Next \n";
fw.write(vbs);
fw.close();
Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = input.readLine()) != null) {
result += line;
}
input.close();
file.delete();
} catch (Exception e) {
logger.error("获取windows cpu信息错误", e);
}
return result.trim();
}
/**
* CPU linux
*
* @return
*/
private static String getCPUID_linux() throws InterruptedException {
String result = "";
String CPU_ID_CMD = "dmidecode";
BufferedReader bufferedReader = null;
Process p = null;
try {
p = Runtime.getRuntime().exec(new String[]{"sh", "-c", CPU_ID_CMD});// 管道
bufferedReader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
int index = -1;
while ((line = bufferedReader.readLine()) != null) {
// 寻找标示字符串[hwaddr]
index = line.toLowerCase().indexOf("uuid");
if (index >= 0) {// 找到了
// 取出mac地址并去除2边空格
result = line.substring(index + "uuid".length() + 1).trim();
break;
}
}
} catch (IOException e) {
logger.error("获取liunx cpu信息错误", e);
}
return result.trim();
}
/**
* ( ,) C,D
*
* @param drive
* @return
*/
private static String getHardDiskSN_Windows(String drive) {
String result = "";
try {
File file = File.createTempFile("realhowto", ".vbs");
file.deleteOnExit();
FileWriter fw = new java.io.FileWriter(file);
String vbs = "Set objFSO = CreateObject(\"Scripting.FileSystemObject\")\n"
+"Set colDrives = objFSO.Drives\n"
+"Set objDrive = colDrives.item(\""
+drive
+"\")\n"
+"Wscript.Echo objDrive.SerialNumber"; // see note
fw.write(vbs);
fw.close();
String path = file.getPath().replace("%20", " ");
Process p = Runtime.getRuntime().exec(
"cscript //NoLogo " + path);
BufferedReader input = new BufferedReader(new InputStreamReader(
p.getInputStream()));
String line;
while ((line = input.readLine()) != null) {
result += line;
}
input.close();
} catch (Exception e) {
e.printStackTrace();
}
return result.trim();
}
private static String getBiosSN_Windows() {
String result = "";
try {
Runtime rt = Runtime.getRuntime();
Process p = rt.exec("cmd.exe /c wmic bios get serialnumber");
BufferedReader input = new BufferedReader(new InputStreamReader(
p.getInputStream()));
String line;
while ((line = input.readLine()) != null) {
result += line;
}
input.close();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException();
}
return result.split("SerialNumber")[1].trim().toString();
}
/***************************linux下 通过执行shell读取 *********************************/
/**
* Javashell
* @param shellName
* @throws Exception
*/
public static void service(String shellName) throws Exception {
String shellDir = "";
String shellPath = "";
try {
//获取脚本所在的目录
String configFilePath = Thread.currentThread().getContextClassLoader().getResource("jdbc.properties").getPath();
File f = new File(configFilePath);
shellDir = f.getParent().split("java")[0];
logger.info("shell dir = " + shellDir);
//拼接完整的脚本目录
shellPath = shellDir + "java/solution/Shell/" + shellName;
logger.info("shell path = " + shellPath);
//执行脚本
callScript(shellPath);
} catch (Exception e) {
logger.error("ShellExcutor异常" + e.getMessage(), e);
throw e;
}
}
/**
*
* @param script
* @throws Exception
*/
private static void callScript(String script) throws Exception {
try {
String cmd = "sh " + script;
try {
//解决脚本没有执行权限
ProcessBuilder builder = new ProcessBuilder("/bin/chmod", "755", script);
Process chmodprocess = builder.start();
int w = chmodprocess.waitFor();
if (w != 0) {
logger.error("------callScript 开启脚本权限不成功!");
BufferedReader erro_br = new BufferedReader(new InputStreamReader(chmodprocess.getErrorStream())); ;
String erroResult = "";
String l = "";
while ((l = erro_br.readLine()) != null) {
erroResult += l + "\n";
}
if (erroResult.length() > 0)
logger.error("-----callScript erro" + erroResult);
erro_br.close();
}
chmodprocess.destroy();
} catch (Exception e) {
// TODO: handle exception
}
// //启动独立线程等待process执行完成
// CommandWaitForThread commandThread = new CommandWaitForThread(cmd);
// commandThread.start();
//
// while (!commandThread.isFinish()) {
// logger.info("shell " + script + " 还未执行完毕,10s后重新探测");
// Thread.sleep(10000);
// }
//
// //检查脚本执行结果状态码
// if(commandThread.getExitValue() != 0){
// throw new Exception("shell " + script + "执行失败,exitValue = " + commandThread.getExitValue());
// }
// logger.info("shell " + script + "执行成功,exitValue = " + commandThread.getExitValue());
logger.info("------callScript cmd job : " + cmd);
Scanner input = null;
Process process = null;
try {
//整个命令作为sh的参数进行执行以便执行重定向和管道命令否则管道命令会被当成参数执行得到错误结果
//process = Runtime.getRuntime().exec(new String[] { "/bin/sh", "-c", cmd });
process = Runtime.getRuntime().exec(cmd);
try {
//等待命令执行完成
//process.waitFor(10, TimeUnit.SECONDS)
int waitfor = process.waitFor();
if (waitfor != 0) {
logger.error("------callScript 执行命令不成功!");
BufferedReader erro_br = new BufferedReader(new InputStreamReader(process.getErrorStream())); ;
String erroResult = "";
String l = "";
while ((l = erro_br.readLine()) != null) {
erroResult += l + "\n";
}
if (erroResult.length() > 0)
logger.error("-----callScript erro" + erroResult);
erro_br.close();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
listResult.add(line);
}
br.close();
} finally {
if (input != null) {
input.close();
}
if (process != null) {
process.destroy();
}
}
}
catch (Exception e) {
throw new Exception("执行脚本发生异常,脚本路径" + script, e);
}
}
/**
* 线
*/
private static class CommandWaitForThread extends Thread {
private String cmd;
private boolean finish = false;
private int exitValue = -1;
public CommandWaitForThread(String cmd) {
this.cmd = cmd;
}
public void run() {
try {
//执行脚本并等待脚本执行完成
Process process = Runtime.getRuntime().exec(cmd);
//写出脚本执行中的过程信息
BufferedReader infoInput = new BufferedReader(new InputStreamReader(process.getInputStream()));
BufferedReader errorInput = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String line = "";
while ((line = infoInput.readLine()) != null) {
logger.info(line);
}
while ((line = errorInput.readLine()) != null) {
logger.error(line);
}
infoInput.close();
errorInput.close();
//阻塞执行线程直至脚本执行完成后返回
this.exitValue = process.waitFor();
} catch (Throwable e) {
logger.error("CommandWaitForThread accure exception,shell " + cmd, e);
exitValue = 110;
} finally {
finish = true;
}
}
public boolean isFinish() {
return finish;
}
public void setFinish(boolean finish) {
this.finish = finish;
}
public int getExitValue() {
return exitValue;
}
}
/**
*
*/
private static String getInfoByName(String name) {
String infoString = "";
try {
if (listResult.size() == 0)
service("HardWareInfo.sh");
for (String line : listResult) {
if (line.contains(name)) {
String[] r = line.replace(name + ":", "").trim().split(":");
if (r.length > 1) {
if (r.length == 2)
return r[1];
else {
//针对这种情况 00:16:3e:0a:6d:70
String rString = "";
for (int i = 0; i < r.length; i++) {
rString += ":" + r[i];
}
return rString.split(":", 2)[1];
}
} else
return r[0];
}
}
} catch (Exception e) {
// TODO: handle exception
logger.error("------getInfoByName " + name + ":" + e.getMessage(), e);
throw new RuntimeException();
}
return infoString;
}
/***************************linux下 通过命令读取 *********************************/
private static String executeLinuxCmd(String cmd) throws IOException {
logger.info("------executeLinuxCmd got cmd job : " + cmd);
Scanner input = null;
String result = "";
Process process = null;
try {
//整个命令作为sh的参数进行执行以便执行重定向和管道命令否则管道命令会被当成参数执行得到错误结果
process = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", cmd});
try {
//等待命令执行完成
//process.waitFor(10, TimeUnit.SECONDS)
int waitfor = process.waitFor();
if (waitfor != 0)
logger.error("------executeLinuxCmd 执行命令不成功!");
} catch (InterruptedException e) {
e.printStackTrace();
}
// InputStream is = process.getInputStream();
// input = new Scanner(is);
// while (input.hasNextLine()) {
// result += input.nextLine() + "\n";
// }
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
result += line;
break;
}
br = new BufferedReader(new InputStreamReader(process.getErrorStream())); ;
String erroResult = "";
while ((line = br.readLine()) != null) {
erroResult += line + "\n";
}
if (erroResult.length() > 0)
logger.error("-----executeLinuxCmd erro" + erroResult);
br.close();
//result = cmd + "\n" + result; //加上命令本身,打印出来
} finally {
if (input != null) {
input.close();
}
if (process != null) {
process.destroy();
}
}
return result;
}
/**
*
* @param cmd
* @param record
* @param symbol
* @return
*/
private static String getSerialNumber(String cmd, String record, String symbol) {
try {
String execResult = executeLinuxCmd(cmd);
logger.info("------getSerialNumber execResult:" + execResult);
String[] infos = execResult.split("\n");
for (String info : infos) {
info = info.trim();
if (info.indexOf(record) != -1) {
info.replace(" ", "");
String[] sn = info.split(symbol);
logger.info("------getSerialNumber return:" + sn[1]);
return sn[1];
}
}
} catch (Exception e) {
// TODO: handle exception
//e.printStackTrace();
logger.error(e);
throw new RuntimeException();
}
return "";
}
/**
* linux fdisk -l |grep 'Disk identifier'
* @return
*/
private static String getHardDiskSN_Linux() {
return getSerialNumber("fdisk -l", "Disk identifier", ":").replace(" ", "");
}
/**
* linux Bios
* @return
*/
private static String getBiosVersion_Linux() {
return getSerialNumber("dmidecode -s bios-version", "", "").trim();
}
/**
* linux Bios Serial Number: Not Specified
* @return
*/
private static String getMemroySN_Linux() {
return getSerialNumber("dmidecode -t memory |grep 'Serial Number'", "", "").split(":")[1].trim();
}
/**
* CPU linux
*
* @return
*/
private static String getCPUID_linux2() {
return getSerialNumber("dmidecode -t processor | grep 'ID'", "", "").split(":")[1].trim();
}
// 主板序列号 linux
private static String getMainBordId_linux2() {
return getSerialNumber("dmidecode | grep 'Serial Number'", "", "").split(":")[1].trim();
}
/***************************整合*********************************/
/**
* CPU
*
* @return
*/
public static String getCPUID() {
logger.info("------当前系统版本-----" + OSName);
try {
if (OSName != null && OSName.indexOf("linux") > -1) {
//return getCPUID_linux2();
return getInfoByName("cpuid");
} else {
return getCPUID_Windows();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException();
}
}
/**
*
*
* @return
*/
public static String getMainBordId() {
try {
if (OSName != null && OSName.indexOf("linux") > -1) {
//return getMainBordId_linux2();
return getInfoByName("mainborid");
} else {
return getMainBordId_windows();
}
} catch (Exception e) {
// TODO Auto-generated catch block
logger.error("------getMainBordId------:" + e.getMessage());
throw new RuntimeException();
}
}
/**
* linux
* @return
*/
public static String getHardDiskSN() {
try {
if (OSName != null && OSName.indexOf("linux") > -1) {
//return getHardDiskSN_Linux();
return getInfoByName("harddisksn");
} else {
return getHardDiskSN_Windows("C");
}
} catch (Exception e) {
// TODO Auto-generated catch block
logger.error("------getHardDiskSN------:" + e.getMessage());
throw new RuntimeException();
}
}
/**
* bios
* @return
*/
public static String getBiosSN() {
try {
if (OSName != null && OSName.indexOf("linux") > -1) {
//return getBiosVersion_Linux();
return getInfoByName("biossn");
} else {
return getBiosSN_Windows();
}
} catch (Exception e) {
logger.error("------getBiosSN------:" + e.getMessage());
throw new RuntimeException();
}
}
//硬盘驱动????
/**
* widnowsmac.
*/
public static String getMAC() {
try {
if (OSName != null && OSName.indexOf("linux") > -1) {
//return getMAC_linuxs();
return getInfoByName("mac");
} else {
return getMAC_windows();
}
} catch (Exception e) {
logger.error("------getMAC------:" + e.getMessage());
throw new RuntimeException();
}
}
}