
文章目录
一、项目背景
公司项目想展示当前部署系统的:操作系统,软件版本、IP、主机名。
二、页面

三、说明
说明点1
:查询系统类型及IP实际流程是,程序执行linux命令获取结果信息的过程。
说明点2
:查询系统类型命令
java
hostnamectl | awk -F': +' '/Static hostname|Operating System/ {printf "%s,", $2}' | sed 's/,$//'
说明点3
:目前项目支持查询3种不同类型的系统:Centos、Ubuntu、Res OS
说明点4
:其中ip、os和hostname是从服务器查询出来的;version是从配置文件或者适配包读取的;
说明点5
:IP其实是从网络接口中获取的信息,比如linux执行iFconfig即可获取网络接口信息,在每个接口的输出中,inet 行表示该接口的 IPv4 地址,inet6 行表示 IPv6 地址
CentOS 系统
常见命名
- 传统上使用 ethX(如 eth0, eth1)
- 新版本(如 CentOS 7 及以上)可能使用 enoX 或 ensX 这样的命名方式。
Ubuntu 系统常见命名:
- 新版本的 Ubuntu 通常使用 enpX(如 enp0s3, enp0s8)。
Red Hat 系统常见命名:
- 新版本的 Red Hat 和 Fedora 系统通常使用 ensX(如 ens33, ens160)。
结论:
- 对于 CentOS,你可以检查 eth, eno, 和 ens 开头的接口。
- 对于 Ubuntu,检查 enp 开头的接口。
- 对于 Red Hat 和 Fedora,检查 ens 开头的接口。
这种方式可以确保你能够捕获到常见的网络接口命名,并获取相应的 IPv4 地址。
四、代码
1.SysInfo
java
package com.hero.lte.ems.sysconf.model;
import javax.xml.bind.annotation.XmlAttribute;
/**
* ems系统基本信息
*
* @author w17231
* @date 2017年4月13日
*/
public class SysInfo {
/**
* ems对外通信IP
*/
private String emsCommIp;
/**
* ems系统IP
*/
private String emsSysIp;
/**
* 系统语言
*/
private String locale;
/**
* 产品名称
*/
private String productName;
/**
* 进程名称
*/
private String processName;
/**
* 产品版本
*/
private String productVersion;
private String ftpRootPath;
private String ftpUploadPath;
private String verification;
private String ftpPatchPath;
/**
* 制造商
*/
private String manufacturer;
/**
* 产品描述
*/
private String description;
private String systemVersion;
private String systemRoot;
public String getEmsCommIp() {
return emsCommIp;
}
public void setEmsCommIp(String emsCommIp) {
this.emsCommIp = emsCommIp;
}
public String getEmsSysIp() {
return emsSysIp;
}
public void setEmsSysIp(String emsSysIp) {
this.emsSysIp = emsSysIp;
}
public String getLocale() {
return locale;
}
public void setLocale(String locale) {
this.locale = locale;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
@XmlAttribute
public String getProductVersion() {
return productVersion;
}
public void setProductVersion(String productVersion) {
this.productVersion = productVersion;
}
public String getManufacturer() {
return manufacturer;
}
public void setManufacturer(String manufacturer) {
this.manufacturer = manufacturer;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getProcessName() {
return processName;
}
public void setProcessName(String processName) {
this.processName = processName;
}
public String getFtpRootPath() {
return ftpRootPath;
}
public void setFtpRootPath(String ftpRootPath) {
this.ftpRootPath = ftpRootPath;
}
public String getFtpUploadPath() {
return ftpUploadPath;
}
public void setFtpUploadPath(String ftpUploadPath) {
this.ftpUploadPath = ftpUploadPath;
}
public String getVerification() {
return verification;
}
public void setVerification(String verification) {
this.verification = verification;
}
public String getSystemVersion() {
return systemVersion;
}
public void setSystemVersion(String systemVersion) {
this.systemVersion = systemVersion;
}
public String getSystemRoot() {
return systemRoot;
}
public void setSystemRoot(String systemRoot) {
this.systemRoot = systemRoot;
}
public String getFtpPatchPath() {
return ftpPatchPath;
}
public void setFtpPatchPath(String ftpPatchPath) {
this.ftpPatchPath = ftpPatchPath;
}
@Override
public String toString() {
return "SysInfo{" +
"emsCommIp='" + emsCommIp + '\'' +
", emsSysIp='" + emsSysIp + '\'' +
", locale='" + locale + '\'' +
", productName='" + productName + '\'' +
", processName='" + processName + '\'' +
", productVersion='" + productVersion + '\'' +
", ftpRootPath='" + ftpRootPath + '\'' +
", ftpUploadPath='" + ftpUploadPath + '\'' +
", ftpPatchPath='" + ftpPatchPath + '\'' +
", verification='" + verification + '\'' +
", manufacturer='" + manufacturer + '\'' +
", description='" + description + '\'' +
", systemVersion='" + systemVersion + '\'' +
", systemRoot='" + systemRoot + '\'' +
'}';
}
}
2.EmsSysConfig
java
package com.hero.lte.ems.configuration;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.hero.lte.ems.sysconf.model.InstallInfo;
import com.hero.lte.ems.sysconf.model.SysInfo;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@Configuration
public class EmsSysConfig {
@Bean(name = "sysInfo")
public SysInfo getSysInfo() {
SysInfo sysInfo = new SysInfo();
DynamicConfig dynamicConfig = DynamicConfigLoader.load("server.properties");
sysInfo.setEmsCommIp(dynamicConfig.getString("system.transport.ip"));
sysInfo.setEmsSysIp(dynamicConfig.getString("service.host"));
sysInfo.setProcessName(dynamicConfig.getString("service.name"));
sysInfo.setProductName(dynamicConfig.getString("service.productName"));
sysInfo.setSystemVersion(dynamicConfig.getString("service.version"));
sysInfo.setFtpRootPath(dynamicConfig.getString("system.ftprootpath"));
sysInfo.setFtpUploadPath(dynamicConfig.getString("system.uploadpath"));
sysInfo.setFtpPatchPath(dynamicConfig.getString("system.ftppatchpath"));
sysInfo.setLocale(dynamicConfig.getString("system.language"));
sysInfo.setVerification(dynamicConfig.getString("verification"));
sysInfo.setSystemRoot(dynamicConfig.getString("system.root"));
return sysInfo;
}
3.HostInformationController
java
package com.hero.lte.ems.sysmanager.resources;
import com.hero.lte.ems.common.spring.SpringContextHolder;
import com.hero.lte.ems.sysconf.model.SysInfo;
import com.hero.lte.ems.sysmanager.entity.HostInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping(value = "lte/ems/sysmanager/host")
@Api(value = "HostInformationController",tags={"系统信息"})
public class HostInformationController {
private static Logger logger = LoggerFactory.getLogger(HostInformationController.class);
public static String CENTOS_SYSTEM = "CentOS";
public static String UBUNTU_SYSTEM = "Ubuntu";
public static String REDOS_SYSTEM = "RED OS";
@RequestMapping(value = "info", method = RequestMethod.GET)
@ApiOperation("系统信息")
public HostInfo getMailConfig() throws Exception
{
SysInfo sysInfo = SpringContextHolder.getBean(SysInfo.class);
List<String> list = getAllHostIp();
final StringBuilder ip = new StringBuilder("");
if(list!=null&&list.size()>0){
list.forEach(o->{
ip.append(o+"/");
});
ip.deleteCharAt(ip.length()-1);
}
HostInfo hostInfo = new HostInfo();
//hostInfo.setIp(sysInfo.getEmsCommIp());
Map<String, String> map = getHostnameAndSystem();
hostInfo.setIp(ip.toString());
hostInfo.setVersion(sysInfo.getSystemVersion());
hostInfo.setHostname(map.get("hostname").equals("n/a") ? "localhost" : map.get("hostname"));
hostInfo.setOs(map.get("os"));
return hostInfo;
}
public Map<String, String> getHostnameAndSystem() {
Map<String, String> map = new HashMap<>();
InputStream in = null;
BufferedReader read = null;
Process pro = null;
String cmd = "hostnamectl | awk -F': +' '/Static hostname|Operating System/ {printf \"%s,\", $2}' | sed 's/,$//'";
String[] cmds = null;
try {
String result = getSingleResult(cmd, cmds, pro, in, read);
logger.info("result:{}", result);
String[] split = result.split(",");
map.put("hostname", split[0]);
map.put("os", split[1]);
} catch (IOException | InterruptedException e) {
logger.error("-getHostnameAndSystem-Exception:{}", e);
return null;
} finally {
try {
if (pro != null) {
pro.destroy();
}
if (read != null) {
read.close();
}
if (in != null) {
in.close();
}
} catch (IOException e) {
logger.error("-getHostnameAndSystem-finally-IOException:{}", e);
}
}
return map;
}
public static String getSingleResult(String cmd, String[] cmds, Process pro, InputStream in, BufferedReader read) throws IOException, InterruptedException {
cmds = new String[]{"/bin/sh", "-c", cmd};
logger.info("-cmd:{}", cmd);
pro = Runtime.getRuntime().exec(cmds);
if (pro.waitFor() == 0) {
String line = "";
in = pro.getInputStream();
read = new BufferedReader(new InputStreamReader(in));
while ((line = read.readLine()) != null) {
logger.info("-line:{}", line);
return line;
}
}
return null;
}
/**
* 获取该主机上所有网卡的ip
*/
public static ArrayList<String> getAllHostIp(){
ArrayList<String> hostAddress = new ArrayList<>();
try{
String systemType = createSystemMonitor();
// 获得本机的所有网络接口
Enumeration<NetworkInterface> nifs = NetworkInterface.getNetworkInterfaces();
while (nifs.hasMoreElements()) {
NetworkInterface nif = nifs.nextElement();
//查询Centos系统参数
if(systemType.equals(CENTOS_SYSTEM) && nif.getName().startsWith("eth") || nif.getName().startsWith("eno")) {
// 获得与该网络接口绑定的 IP 地址,一般只有一个
Enumeration<InetAddress> addresses = nif.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress addr = addresses.nextElement();
if (addr instanceof Inet4Address) { // 只关心 IPv4 地址
hostAddress.add(addr.getHostAddress());
}
}
} else if(systemType.equals(UBUNTU_SYSTEM) && nif.getName().startsWith("enp")) {
//查询ubuntu系统参数,获得与该网络接口绑定的 IP 地址,一般只有一个
Enumeration<InetAddress> addresses = nif.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress addr = addresses.nextElement();
if (addr instanceof Inet4Address) { // 只关心 IPv4 地址
hostAddress.add(addr.getHostAddress());
}
}
} else if(systemType.equals(REDOS_SYSTEM) && nif.getName().startsWith("ens")) {
logger.info("nif.getName():{}", nif.getName());
//查询redos系统参数,获得与该网络接口绑定的 IP 地址,一般只有一个
Enumeration<InetAddress> addresses = nif.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress addr = addresses.nextElement();
if (addr instanceof Inet4Address) {
hostAddress.add(addr.getHostAddress());
}
}
}
}
}catch(Exception e){
e.printStackTrace();
}
return hostAddress;
}
public static String createSystemMonitor() {
String systemType = "";
InputStream in = null;
BufferedReader read = null;
Process pro = null;
String cmd = "hostnamectl | awk -F': +' '/Static hostname|Operating System/ {printf \"%s,\", $2}' | sed 's/,$//'";
String[] cmds = null;
try {
String result = getSingleResult(cmd, cmds, pro, in, read);
String[] split = result.split(",");
String os = split[1];
if (os.contains(CENTOS_SYSTEM)) {
systemType = CENTOS_SYSTEM;
} else if (os.contains(UBUNTU_SYSTEM)) {
systemType = UBUNTU_SYSTEM;
} else if (os.contains(REDOS_SYSTEM)) {
systemType = REDOS_SYSTEM;
}
} catch (IOException | InterruptedException e) {
logger.error("-createSystemMonitor-Exception:{}", e);
return null;
} finally {
try {
if (pro != null) {
pro.destroy();
}
if (read != null) {
read.close();
}
if (in != null) {
in.close();
}
} catch (IOException e) {
logger.error("-createSystemMonitor-finally-IOException:{}", e);
}
}
return systemType;
}
}
4.HostInfo
java
package com.hero.lte.ems.sysmanager.entity;
public class HostInfo {
private String os = "CentOS Linux release 7.7.1908 (Core)";;
private String version;
private String ip;
private String hostname = "localhost.localdomain";
public String getOs() {
return os;
}
public void setOs(String os) {
this.os = os;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getHostname() {
return hostname;
}
public void setHostname(String hostname) {
this.hostname = hostname;
}
@Override
public String toString() {
return "HostInfo{" +
"os='" + os + '\'' +
", version='" + version + '\'' +
", ip='" + ip + '\'' +
", hostname='" + hostname + '\'' +
'}';
}
}