46 changed files with 849 additions and 168 deletions
-
8pom.xml
-
7src/main/java/a8k/BoditechA800Application.java
-
7src/main/java/a8k/OS.java
-
10src/main/java/a8k/app/channel/iflytophald/channel/A8kCanBusConnection.java
-
7src/main/java/a8k/app/channel/iflytophald/channel/A8kCanBusService.java
-
69src/main/java/a8k/app/channel/iflytophald/channel/LisUartChannel.java
-
7src/main/java/a8k/app/channel/iflytophald/channel/PrinterUartChannel.java
-
7src/main/java/a8k/app/channel/net/BoditechLisSingleTrackTcpClient.java
-
1src/main/java/a8k/app/constant/AppConstant.java
-
5src/main/java/a8k/app/constant/AppVersion.java
-
5src/main/java/a8k/app/controler/api/v1/app/setting/LISSettingController.java
-
52src/main/java/a8k/app/dao/ProjOptInfoDao.java
-
4src/main/java/a8k/app/dao/ProjectBaseInfoDao.java
-
4src/main/java/a8k/app/dao/type/db/NetworkSetting.java
-
2src/main/java/a8k/app/factory/BoditechLisSingleTrackFrameFactory.java
-
2src/main/java/a8k/app/service/background/AppEventBusService.java
-
14src/main/java/a8k/app/service/background/LisCommunicationService.java
-
2src/main/java/a8k/app/service/background/ProjIDCardCtrlAndMonitorService.java
-
2src/main/java/a8k/app/service/data/ReactionRecordMgrService.java
-
109src/main/java/a8k/app/service/lis/BoditechLisSingleTrackChannel.java
-
119src/main/java/a8k/app/service/lis/LisCommunicationService.java
-
7src/main/java/a8k/app/service/mainctrl/AppDeviceInitCtrlService.java
-
3src/main/java/a8k/app/service/module/OptScanCtrlModule.java
-
9src/main/java/a8k/app/service/setting/AppNetworkSettingService.java
-
3src/main/java/a8k/app/type/GState.java
-
34src/main/java/a8k/app/type/a8k/proj/A8kResultUnit.java
-
7src/main/java/a8k/app/type/appevent/AppDeviceInitSucEvent.java
-
16src/main/java/a8k/app/type/lis/LISSerialBaudrateType.java
-
2src/main/java/a8k/app/type/lisprotocol/BoditechLisSingleTrackFrame.java
-
6src/main/java/a8k/app/utils/ZSqlite.java
-
6src/main/java/a8k/app/utils/ZSqliteJdbcHelper.java
-
11src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java
-
50src/main/java/a8k/extui/page/apptest/LisTestPage.java
-
2src/main/java/a8k/extui/page/apptest/PrinterDebugPage.java
-
6src/main/java/a8k/extui/page/extapp/debug_assistant/FakeReactionRecordGeneratorPage.java
-
49src/main/java/a8k/extui/page/hardwaretest/LISUartTestPage.java
-
57src/main/java/a8k/iflyutils/IftIpUtils.java
-
122src/main/java/a8k/iflyutils/netplan/NetplanConfigFactory.java
-
7src/main/java/a8k/iflyutils/netplan/exception/NetSettingIllegalException.java
-
15src/main/java/a8k/iflyutils/netplan/type/EthernetConfig.java
-
8src/main/java/a8k/iflyutils/netplan/type/Nameservers.java
-
10src/main/java/a8k/iflyutils/netplan/type/NetplanConfig.java
-
6src/main/java/a8k/iflyutils/netplan/type/RendererType.java
-
12src/main/java/a8k/iflyutils/netplan/type/Route.java
-
16src/main/resources/application.yml
@ -0,0 +1,5 @@ |
|||
package a8k.app.constant; |
|||
|
|||
public class AppVersion { |
|||
public static final String APP_VERSION = "1.0.1"; |
|||
} |
@ -1,14 +0,0 @@ |
|||
package a8k.app.service.background; |
|||
|
|||
import a8k.app.channel.iflytophald.channel.LisUartChannel; |
|||
import lombok.RequiredArgsConstructor; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
@Component |
|||
@RequiredArgsConstructor |
|||
@Slf4j |
|||
public class LisCommunicationService { |
|||
private final LisUartChannel lisUartChannel; |
|||
|
|||
} |
@ -0,0 +1,109 @@ |
|||
package a8k.app.service.lis; |
|||
|
|||
import a8k.app.channel.iflytophald.channel.LisUartChannel; |
|||
import a8k.app.channel.net.BoditechLisSingleTrackTcpClient; |
|||
import a8k.app.dao.type.db.ReactionRecord; |
|||
import a8k.app.factory.BoditechLisSingleTrackFrameFactory; |
|||
import a8k.app.type.lisprotocol.BoditechLisSingleTrackFrame; |
|||
import org.slf4j.Logger; |
|||
import org.slf4j.LoggerFactory; |
|||
|
|||
import java.util.List; |
|||
|
|||
public class BoditechLisSingleTrackChannel { |
|||
private static final Logger log = LoggerFactory.getLogger(BoditechLisSingleTrackChannel.class); |
|||
|
|||
enum ChannelType { |
|||
UART, |
|||
TCP, |
|||
} |
|||
|
|||
BoditechLisSingleTrackTcpClient boditechLisSingleTrackTcpClient; |
|||
LisUartChannel lisUartChannel; |
|||
ChannelType channelType; |
|||
|
|||
String hostip; |
|||
Integer port; |
|||
|
|||
public BoditechLisSingleTrackChannel(String hostip, Integer port) { |
|||
boditechLisSingleTrackTcpClient = new BoditechLisSingleTrackTcpClient(); |
|||
this.hostip = hostip; |
|||
this.port = port; |
|||
channelType = ChannelType.TCP; |
|||
} |
|||
|
|||
public BoditechLisSingleTrackChannel(LisUartChannel lisUartChannel) { |
|||
this.lisUartChannel = lisUartChannel; |
|||
channelType = ChannelType.UART; |
|||
} |
|||
|
|||
public void start() { |
|||
switch (channelType) { |
|||
case TCP -> { |
|||
boditechLisSingleTrackTcpClient.start(hostip, port); |
|||
} |
|||
case UART -> { |
|||
|
|||
} |
|||
} |
|||
} |
|||
|
|||
public boolean isConnected() { |
|||
switch (channelType) { |
|||
case UART -> { |
|||
if (lisUartChannel != null) { |
|||
return lisUartChannel.isConnected(); |
|||
} |
|||
} |
|||
case TCP -> { |
|||
if (boditechLisSingleTrackTcpClient != null) { |
|||
return boditechLisSingleTrackTcpClient.isConnected(); |
|||
} |
|||
} |
|||
} |
|||
return false; |
|||
} |
|||
|
|||
public void shotdown() { |
|||
switch (channelType) { |
|||
case UART -> { |
|||
} |
|||
case TCP -> { |
|||
if (boditechLisSingleTrackTcpClient != null) { |
|||
boditechLisSingleTrackTcpClient.shutdown(); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
public void reportReactionReport(ReactionRecord reactionRecord) { |
|||
if (reactionRecord == null) { |
|||
return; |
|||
} |
|||
List<BoditechLisSingleTrackFrame> frames = BoditechLisSingleTrackFrameFactory.buildBoditechLisSingleTrackFrame(reactionRecord); |
|||
for (BoditechLisSingleTrackFrame frame : frames) { |
|||
tx(frame); |
|||
} |
|||
} |
|||
|
|||
public void tx(BoditechLisSingleTrackFrame frame) { |
|||
if (frame == null) { |
|||
return; |
|||
} |
|||
String frameStr = frame.serialization(); |
|||
switch (channelType) { |
|||
case UART -> { |
|||
if (lisUartChannel != null) { |
|||
log.debug("BoditechLisSingleTrackChannel tx frame by uart: {}", frameStr); |
|||
lisUartChannel.tx(frameStr); |
|||
} |
|||
} |
|||
case TCP -> { |
|||
if (boditechLisSingleTrackTcpClient != null) { |
|||
log.debug("BoditechLisSingleTrackChannel tx frame by tcp: {}", frameStr); |
|||
boditechLisSingleTrackTcpClient.tx(frameStr); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,119 @@ |
|||
package a8k.app.service.lis; |
|||
|
|||
import a8k.app.channel.iflytophald.channel.LisUartChannel; |
|||
import a8k.app.dao.type.db.LISSetting; |
|||
import a8k.app.dao.type.db.ReactionRecord; |
|||
import a8k.app.service.setting.AppSettingsMgrService; |
|||
import a8k.app.type.lis.LISDirectionTypeEnum; |
|||
import a8k.app.type.lis.LISIFType; |
|||
import a8k.app.type.lis.LISProtocolEnum; |
|||
import a8k.app.utils.ZJsonHelper; |
|||
import jakarta.annotation.PostConstruct; |
|||
import lombok.RequiredArgsConstructor; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
@Component |
|||
@RequiredArgsConstructor |
|||
@Slf4j |
|||
public class LisCommunicationService { |
|||
private final AppSettingsMgrService appSettingsMgrService; |
|||
private final LisUartChannel lisUartChannel; |
|||
private LISSetting setting; |
|||
|
|||
BoditechLisSingleTrackChannel boditechLisSingleTrackChannel; |
|||
|
|||
public void updateLisSetting(LISSetting lisSetting) { |
|||
log.info("updateLisSetting: {}", ZJsonHelper.objToPrettyJson(lisSetting)); |
|||
setting = lisSetting; |
|||
doUpdateLisSetting(); |
|||
} |
|||
|
|||
public String getProtocolDetail() { |
|||
|
|||
if (isChannelEq(LISProtocolEnum.Boditech, LISDirectionTypeEnum.SINGLE_TRACK, LISIFType.SERIAL)) { |
|||
return String.format("%s.%s.%s,baudrate:%s", setting.lisProtocol, setting.lisType, setting.lisIf, setting.lisSerialBaudrate.baudrate); |
|||
} |
|||
else if (isChannelEq(LISProtocolEnum.Boditech, LISDirectionTypeEnum.SINGLE_TRACK, LISIFType.NETWORK)) { |
|||
return String.format("%s.%s.%s,ip:%s,port:%d", setting.lisProtocol, setting.lisType, setting.lisIf, setting.lisNetIp, setting.lisNetPort); |
|||
} else { |
|||
return String.format("%s.%s.%s", setting.lisProtocol, setting.lisType, setting.lisIf); |
|||
} |
|||
|
|||
|
|||
} |
|||
|
|||
public Boolean getConnectionState() { |
|||
//巴迪泰串口单向 && 巴迪泰网口单向 |
|||
if (isChannelEq(LISProtocolEnum.Boditech, LISDirectionTypeEnum.SINGLE_TRACK, null)) { |
|||
return boditechLisSingleTrackChannel.isConnected(); |
|||
} |
|||
return false; |
|||
} |
|||
|
|||
public void reportReactionRecord(ReactionRecord reactionRecord) { |
|||
//巴迪泰串口单向 && 巴迪泰网口单向 |
|||
if (isChannelEq(LISProtocolEnum.Boditech, LISDirectionTypeEnum.SINGLE_TRACK, null)) { |
|||
boditechLisSingleTrackChannel.reportReactionReport(reactionRecord); |
|||
} else { |
|||
log.warn("LIS Type is not support, ignore report"); |
|||
} |
|||
} |
|||
|
|||
|
|||
@PostConstruct |
|||
public void init() { |
|||
log.info("LisCommunicationService init"); |
|||
setting = appSettingsMgrService.getLISSetting(); |
|||
doUpdateLisSetting(); |
|||
} |
|||
|
|||
// |
|||
// Channel builder |
|||
// |
|||
|
|||
private void doUpdateLisSetting() { |
|||
shutdownAllChannel(); |
|||
//巴迪泰串口单向 |
|||
if (isChannelEq(LISProtocolEnum.Boditech, LISDirectionTypeEnum.SINGLE_TRACK, LISIFType.SERIAL)) { |
|||
log.info("new BoditechLisSingleTrackChannel with SERIAL , baudrate: {}", setting.lisSerialBaudrate.baudrate); |
|||
lisUartChannel.setBaudRate(setting.lisSerialBaudrate.baudrate); |
|||
boditechLisSingleTrackChannel = new BoditechLisSingleTrackChannel(lisUartChannel); |
|||
boditechLisSingleTrackChannel.start(); |
|||
} |
|||
//巴迪泰网口单向 |
|||
else if (isChannelEq(LISProtocolEnum.Boditech, LISDirectionTypeEnum.SINGLE_TRACK, LISIFType.NETWORK)) { |
|||
log.info("new BoditechLisSingleTrackChannel with NETWORK, ip: {}, port: {}", setting.lisNetIp, setting.lisNetPort); |
|||
boditechLisSingleTrackChannel = new BoditechLisSingleTrackChannel(setting.lisNetIp, setting.lisNetPort); |
|||
boditechLisSingleTrackChannel.start(); |
|||
} else { |
|||
log.warn("Unsupported LIS channel configuration: protocol={}, direction={}, ifType={}", |
|||
setting.lisProtocol, setting.lisType, setting.lisIf); |
|||
} |
|||
|
|||
} |
|||
|
|||
boolean isChannelEq(LISProtocolEnum protocol, LISDirectionTypeEnum direction, LISIFType ifType) { |
|||
if (setting == null) { |
|||
return false; |
|||
} |
|||
|
|||
boolean protocolIsEq = protocol == null || setting.lisProtocol.equals(protocol); |
|||
boolean ifTypeIsEq = ifType == null || setting.lisIf.equals(ifType); |
|||
boolean directionIsEq = direction == null || setting.lisType.equals(direction); |
|||
|
|||
return protocolIsEq && |
|||
ifTypeIsEq && |
|||
directionIsEq; |
|||
} |
|||
|
|||
|
|||
private void shutdownAllChannel() { |
|||
if (boditechLisSingleTrackChannel != null) { |
|||
boditechLisSingleTrackChannel.shotdown(); |
|||
boditechLisSingleTrackChannel = null; |
|||
} |
|||
log.info("shutdownAllChannel done"); |
|||
} |
|||
|
|||
} |
@ -0,0 +1,7 @@ |
|||
package a8k.app.type.appevent; |
|||
|
|||
public class AppDeviceInitSucEvent extends AppEvent { |
|||
public AppDeviceInitSucEvent() { |
|||
super(AppDeviceInitSucEvent.class.getSimpleName()); |
|||
} |
|||
} |
@ -1,8 +1,16 @@ |
|||
package a8k.app.type.lis; |
|||
|
|||
public enum LISSerialBaudrateType { |
|||
B9600, |
|||
B115200, |
|||
B12800, |
|||
B19200; |
|||
B9600(9600), |
|||
B19200(19200), |
|||
B38400(38400), |
|||
B115200(115200), |
|||
B460800(460800), |
|||
; |
|||
|
|||
final public Integer baudrate; |
|||
|
|||
LISSerialBaudrateType(Integer baudrate) { |
|||
this.baudrate = baudrate; |
|||
} |
|||
} |
@ -0,0 +1,50 @@ |
|||
package a8k.extui.page.apptest; |
|||
|
|||
import a8k.app.dao.type.db.ReactionRecord; |
|||
import a8k.app.factory.FakeReactionRecordFactory; |
|||
import a8k.app.service.data.ProjInfoMgrService; |
|||
import a8k.app.service.lis.LisCommunicationService; |
|||
import a8k.app.type.exception.AppException; |
|||
import a8k.extui.mgr.ExtApiPageMgr; |
|||
import a8k.extui.type.ExtApiStatu; |
|||
import a8k.extui.type.ExtUIPageCfg; |
|||
import jakarta.annotation.PostConstruct; |
|||
import lombok.RequiredArgsConstructor; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
import java.util.stream.Stream; |
|||
|
|||
@Component |
|||
@Slf4j |
|||
@RequiredArgsConstructor |
|||
public class LisTestPage { |
|||
private final LisCommunicationService lisCommunicationService; |
|||
private final ProjInfoMgrService projInfoMgrService; |
|||
private final ExtApiPageMgr extApiPageMgr; |
|||
|
|||
|
|||
@ExtApiStatu(name = "", group = "LIS协议", order = 1) |
|||
public String getLisProtocol() { |
|||
return lisCommunicationService.getProtocolDetail(); |
|||
} |
|||
|
|||
@ExtApiStatu(name = "", group = "LIS连接状态", order = 2) |
|||
public Boolean getLisConnection() { |
|||
return lisCommunicationService.getConnectionState(); |
|||
} |
|||
|
|||
public void reportFakeData() throws AppException { |
|||
ReactionRecord record = FakeReactionRecordFactory.buildRecord(projInfoMgrService.getProjBuildInInfo(1)); |
|||
lisCommunicationService.reportReactionRecord(record); |
|||
} |
|||
|
|||
|
|||
|
|||
@PostConstruct |
|||
void init() { |
|||
ExtUIPageCfg page = new ExtUIPageCfg(this); |
|||
page.addFunction("上报记录", this::reportFakeData); |
|||
extApiPageMgr.addPage(page); |
|||
} |
|||
} |
@ -1,4 +1,4 @@ |
|||
package a8k.extui.page.driver; |
|||
package a8k.extui.page.apptest; |
|||
|
|||
import a8k.OS; |
|||
import a8k.app.channel.iflytophald.channel.PrinterUartChannel; |
@ -0,0 +1,49 @@ |
|||
package a8k.extui.page.hardwaretest; |
|||
|
|||
import a8k.app.channel.iflytophald.channel.LisUartChannel; |
|||
import a8k.app.type.lis.LISSerialBaudrateType; |
|||
import a8k.extui.mgr.ExtApiPageMgr; |
|||
import a8k.extui.type.ExtApiStatu; |
|||
import jakarta.annotation.PostConstruct; |
|||
import lombok.RequiredArgsConstructor; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
@Component |
|||
@RequiredArgsConstructor |
|||
public class LISUartTestPage { |
|||
final private LisUartChannel lisUartChannel; |
|||
private final ExtApiPageMgr extApiPageMgr; |
|||
|
|||
@ExtApiStatu(name = "", group = "波特率", order = 1) |
|||
public Integer getBaudRate() { |
|||
return lisUartChannel.getBaudRateDirect(); |
|||
} |
|||
|
|||
@ExtApiStatu(name = "", group = "回环模式", order = 1) |
|||
public Boolean getLoopbackMode() { |
|||
return lisUartChannel.isInLoopbackMode(); |
|||
} |
|||
|
|||
public void setBaudRate(LISSerialBaudrateType baudRate) { |
|||
lisUartChannel.setBaudRate(baudRate.baudrate); |
|||
} |
|||
|
|||
|
|||
public void setInLoopbackMode(Boolean val) { |
|||
lisUartChannel.setInLoopbackMode(val); |
|||
} |
|||
|
|||
public void sendCommand(String msg) { |
|||
lisUartChannel.tx(msg); |
|||
} |
|||
|
|||
@PostConstruct |
|||
public void init() { |
|||
var page = extApiPageMgr.newPage(this); |
|||
page.addFunction("设置波特率", this::setBaudRate); |
|||
page.addFunction("设置环回模式", this::setInLoopbackMode); |
|||
page.addFunction("发送命令", this::sendCommand); |
|||
extApiPageMgr.addPage(page); |
|||
} |
|||
|
|||
} |
@ -0,0 +1,57 @@ |
|||
package a8k.iflyutils; |
|||
|
|||
import a8k.iflyutils.netplan.exception.NetSettingIllegalException; |
|||
|
|||
public class IftIpUtils { |
|||
|
|||
/** |
|||
* 将IP地址和子网掩码转换为CIDR表示法 |
|||
* @param ipAddress IP地址 |
|||
* @param netmask 子网掩码 |
|||
* @return ipAddress/netmask的CIDR表示法 |
|||
* <p> |
|||
* demo: |
|||
* String ip = IftIpUtils.toCIDR("192.168.8.1", "255.255.255.0"); |
|||
* ip == 192.168.8.1/24 |
|||
* |
|||
*/ |
|||
public static String toCIDR(String ipAddress, String netmask) throws NetSettingIllegalException { |
|||
// 验证IP和子网掩码格式 |
|||
if (!isValidIp(ipAddress) || !isValidIp(netmask)) { |
|||
throw new NetSettingIllegalException("无效的IP地址或子网掩码格式"); |
|||
} |
|||
// 计算子网掩码对应的前缀长度 |
|||
int prefixLength = netmaskToPrefixLength(netmask); |
|||
return ipAddress + "/" + prefixLength; |
|||
} |
|||
|
|||
public static boolean isValidIp(String ip) { |
|||
return ip.matches("^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"); |
|||
} |
|||
|
|||
public static boolean isValidNetmask(String netmask) { |
|||
return netmask.matches("^((255|254|252|248|240|224|192|128|0)\\.){3}(255|254|252|248|240|224|192|128|0)$"); |
|||
} |
|||
|
|||
private static int netmaskToPrefixLength(String netmask) throws NetSettingIllegalException { |
|||
String[] octets = netmask.split("\\."); |
|||
int prefixLength = 0; |
|||
|
|||
for (String octet : octets) { |
|||
int value = Integer.parseInt(octet); |
|||
// 检查是否为有效的子网掩码值 |
|||
if (value != 0 && value != 128 && value != 192 && value != 224 && |
|||
value != 240 && value != 248 && value != 252 && value != 254 && value != 255) { |
|||
throw new NetSettingIllegalException("无效的子网掩码"); |
|||
} |
|||
// 计算前缀长度 |
|||
prefixLength += Integer.bitCount(value); |
|||
} |
|||
|
|||
return prefixLength; |
|||
} |
|||
|
|||
public static void main(String[] args) { |
|||
} |
|||
|
|||
} |
@ -0,0 +1,122 @@ |
|||
package a8k.iflyutils.netplan; |
|||
|
|||
import a8k.iflyutils.IftIpUtils; |
|||
import a8k.iflyutils.netplan.exception.NetSettingIllegalException; |
|||
import a8k.iflyutils.netplan.type.EthernetConfig; |
|||
import a8k.iflyutils.netplan.type.NetplanConfig; |
|||
import a8k.iflyutils.netplan.type.RendererType; |
|||
import a8k.iflyutils.netplan.type.Route; |
|||
import com.fasterxml.jackson.annotation.JsonInclude; |
|||
import com.fasterxml.jackson.core.JsonProcessingException; |
|||
import com.fasterxml.jackson.databind.ObjectMapper; |
|||
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; |
|||
import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator; |
|||
|
|||
import java.util.LinkedHashMap; |
|||
import java.util.List; |
|||
import java.util.Map; |
|||
|
|||
|
|||
public class NetplanConfigFactory { |
|||
/** |
|||
* |
|||
* 调试常用指令 |
|||
* 查看当前dns |
|||
* cat /run/systemd/resolve/resolv.conf |
|||
* 应用配置 |
|||
* netplan apply |
|||
* |
|||
* |
|||
*/ |
|||
|
|||
RendererType renderer = RendererType.NetworkManager; |
|||
|
|||
|
|||
public String newDynamicEthernetConfig(String ethName, Boolean autoDns, List<String> dnsList) throws NetSettingIllegalException, JsonProcessingException { |
|||
|
|||
var mapper = createMapper(); |
|||
Map<String, Object> top = new LinkedHashMap<>(); |
|||
|
|||
NetplanConfig config = new NetplanConfig(); |
|||
config.version = 2; |
|||
config.renderer = renderer; |
|||
config.ethernets = new LinkedHashMap<>(); |
|||
{ |
|||
EthernetConfig ethConfig = new EthernetConfig(); |
|||
ethConfig.addresses = null; |
|||
ethConfig.routes = null; |
|||
if (autoDns || dnsList == null || dnsList.isEmpty()) { |
|||
ethConfig.nameservers = null; |
|||
// ethConfig.accept_ra = true; |
|||
} else { |
|||
// ethConfig.accept_ra = false; |
|||
ethConfig.nameservers.addresses.addAll(dnsList); |
|||
} |
|||
ethConfig.dhcp4 = "yes"; |
|||
config.ethernets.put(ethName, ethConfig); |
|||
} |
|||
|
|||
top.put("network", config); |
|||
return mapper.writeValueAsString(top); |
|||
} |
|||
|
|||
public String newStaticEthernetConfig(String ethName, |
|||
String ip, |
|||
String netmask, |
|||
String gateway, |
|||
List<String> dnsList) throws NetSettingIllegalException, JsonProcessingException { |
|||
|
|||
var mapper = createMapper(); |
|||
Map<String, Object> top = new LinkedHashMap<>(); |
|||
|
|||
NetplanConfig config = new NetplanConfig(); |
|||
config.version = 2; |
|||
config.renderer = renderer; |
|||
config.ethernets = new LinkedHashMap<>(); |
|||
{ |
|||
EthernetConfig ethConfig = new EthernetConfig(); |
|||
ethConfig.addresses.add(IftIpUtils.toCIDR(ip, netmask)); |
|||
ethConfig.nameservers.addresses.addAll(dnsList); |
|||
ethConfig.routes.add(new Route("0.0.0.0/0", gateway)); |
|||
ethConfig.dhcp4 = "no"; |
|||
config.ethernets.put(ethName, ethConfig); |
|||
} |
|||
|
|||
top.put("network", config); |
|||
return mapper.writeValueAsString(top); |
|||
} |
|||
|
|||
// |
|||
// PRIVATE |
|||
// |
|||
static private ObjectMapper createMapper() { |
|||
YAMLFactory yamlFactory = new YAMLFactory() |
|||
.enable(YAMLGenerator.Feature.MINIMIZE_QUOTES) |
|||
.enable(YAMLGenerator.Feature.LITERAL_BLOCK_STYLE) |
|||
.enable(YAMLGenerator.Feature.INDENT_ARRAYS_WITH_INDICATOR) |
|||
.disable(YAMLGenerator.Feature.INDENT_ARRAYS); |
|||
ObjectMapper mapper = new ObjectMapper(yamlFactory); |
|||
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); |
|||
return mapper; |
|||
} |
|||
|
|||
|
|||
public static void main(String[] args) throws NetSettingIllegalException, JsonProcessingException { |
|||
// 创建YAML映射工厂,配置输出选项 |
|||
// 写入YAML文件 |
|||
NetplanConfigFactory factory = new NetplanConfigFactory(); |
|||
var netplanConfig = factory.newStaticEthernetConfig( |
|||
"eth1", |
|||
"192.168.8.10", |
|||
"255.255.255.0", |
|||
"192.168.8.1", |
|||
List.of("192.168.8.1") |
|||
); |
|||
System.out.println(netplanConfig); |
|||
System.out.println("==============================================================="); |
|||
var netDConfig = factory.newDynamicEthernetConfig("eth1", false, List.of("8.8.8.8")); |
|||
System.out.println(netDConfig); |
|||
|
|||
|
|||
} |
|||
} |
@ -0,0 +1,7 @@ |
|||
package a8k.iflyutils.netplan.exception; |
|||
|
|||
public class NetSettingIllegalException extends Exception { |
|||
public NetSettingIllegalException(String message) { |
|||
super(message); |
|||
} |
|||
} |
@ -0,0 +1,15 @@ |
|||
package a8k.iflyutils.netplan.type; |
|||
|
|||
import com.fasterxml.jackson.annotation.JsonProperty; |
|||
|
|||
import java.util.ArrayList; |
|||
import java.util.List; |
|||
|
|||
public class EthernetConfig { |
|||
public List<String> addresses = new ArrayList<>(); |
|||
public Nameservers nameservers = new Nameservers(); |
|||
public List<Route> routes = new ArrayList<>(); |
|||
public String dhcp4 = "no"; |
|||
// @JsonProperty("accept-ra") |
|||
// public Boolean accept_ra = true; |
|||
} |
@ -0,0 +1,8 @@ |
|||
package a8k.iflyutils.netplan.type; |
|||
|
|||
import java.util.ArrayList; |
|||
import java.util.List; |
|||
|
|||
public class Nameservers { |
|||
public List<String> addresses = new ArrayList<>(); |
|||
} |
@ -0,0 +1,10 @@ |
|||
package a8k.iflyutils.netplan.type; |
|||
|
|||
import java.util.LinkedHashMap; |
|||
import java.util.Map; |
|||
|
|||
public class NetplanConfig { |
|||
public int version = 2; |
|||
public RendererType renderer = RendererType.NetworkManager; |
|||
public Map<String, EthernetConfig> ethernets = new LinkedHashMap<>(); |
|||
} |
@ -0,0 +1,6 @@ |
|||
package a8k.iflyutils.netplan.type; |
|||
|
|||
public enum RendererType { |
|||
networkd, |
|||
NetworkManager; |
|||
} |
@ -0,0 +1,12 @@ |
|||
package a8k.iflyutils.netplan.type; |
|||
|
|||
public class Route { |
|||
public String to; |
|||
public String via; |
|||
public Integer metric = null; |
|||
|
|||
public Route(String to, String via) { |
|||
this.to = to; |
|||
this.via = via; |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue