This commit is contained in:
Administrator
2025-08-08 17:13:27 +08:00
parent 7267aec1fd
commit 306bfd36f7
39 changed files with 2515 additions and 355 deletions
@@ -2,6 +2,7 @@ package org.kne.cloud.network.klalb;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.net.Inet6Address;
@@ -23,10 +24,15 @@ import java.util.Map.Entry;
import org.kne.cloud.network.*;
import org.kne.cloud.network.klalb.ui.KLALBStateGUI2;
import org.kne.cloud.network.klalb.ui.KLALBStateGUI3;
import org.kne.cloud.network.klalb.ui.Language;
import org.kne.cloud.network.klalb.ui.UIEnv;
import org.kne.cloud.network.minecraft.MinecraftSocketBridge;
import java.util.Set;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
@@ -37,6 +43,15 @@ public class KLALBProxySystem {
private Set<Proxy> proxys=new HashSet<>();
private KLALBController klalbController;
private KLALBRemoteManagement krm;
private KLALBConfig config;
private Gson gson;
private File jsonFile;
{
GsonBuilder gb=new GsonBuilder();
MultipurposeSocketAddress.registerToGsonBuilder(gb);
KLALBConfigItem.registerToGsonBuilder(gb);
gson=gb.create();
}
public Set<Proxy> getProxys() {
return proxys;
}
@@ -87,6 +102,7 @@ public class KLALBProxySystem {
}
public void loadConfigJson(File jsonFile) throws IOException {
this.jsonFile=jsonFile;
FileReader fr = null;
try {
fr=new FileReader(jsonFile);
@@ -104,229 +120,165 @@ public class KLALBProxySystem {
loadConfigJson(new JsonParser().parse(json));
}
public void loadConfigJson(JsonElement json) {
JsonArray jobj=(JsonArray) json;
jobj.forEach((val)->{
solveEntry((JsonObject) val);
});
KLALBConfig config= gson.fromJson(json, KLALBConfig.class);
System.out.println(config);
loadConfig(config);
}
protected void solveEntry(JsonObject entry){
switch (entry.get("Type").getAsString()) {
case "KLALBController":
JsonElement vase= entry.get("VirtualAddress");
//System.out.println(vase);
List<InetAddress>daddr=new ArrayList<InetAddress>();
JsonElement vdns= entry.get("DNS");
if(vdns!=null) {
if(vdns instanceof JsonArray) {
JsonArray arr=(JsonArray) vdns;
for(JsonElement str:arr) {
public void loadConfig(KLALBConfig config) {
this.config=config;
for(KLALBConfigItem item:config) {
if(item instanceof KLALBControllerConfigItem) {
KLALBControllerConfigItem kcci=(KLALBControllerConfigItem) item;
String lstr=kcci.getLanguage();
if(lstr!=null) {
Language lang=Language.valueOf(lstr);
if(lang!=null) {
try {
daddr.add((Inet6Address) InetAddress.getByName(str.getAsString()));
} catch (UnknownHostException e) {
UIEnv.setRsb(lang.getFileName());
} catch (IOException e) {
e.printStackTrace();
}
}
}
String vase= kcci.getVirtualAddress();
//System.out.println(vase);
List<InetAddress>daddr=new ArrayList<InetAddress>();
List<InetAddress> vdns= kcci.getDNS();
if(vdns!=null) {
for(InetAddress dnsaddr:vdns) {
daddr.add(dnsaddr);
}
}
if(vase!=null) {
try {
klalbController=new KLALBController((Inet6Address) InetAddress.getByName(vase),daddr);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}else {
try {
daddr.add((Inet6Address) InetAddress.getByName(vdns.getAsString()));
} catch (UnknownHostException e) {
e.printStackTrace();
}
klalbController=new KLALBController(daddr);
}
}
if(vase!=null) {
try {
klalbController=new KLALBController((Inet6Address) InetAddress.getByName(vase.getAsString()),daddr);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}else {
klalbController=new KLALBController(daddr);
}
JsonElement vasn= entry.get("VirtualASN");
if(vasn!=null) {
klalbController.getIpv6Router().setASN (Long.parseLong( vasn.getAsString()));
}
JsonElement vsne=entry.get("VirtualSocketName");
//if(vsne!=null) {
MultipurposeSocketAddress.getSocketTypeRegister().put(vsne.getAsString(), klalbController.getSocketType());
//}
JsonElement tcple=entry.get("TCPListen");
if(tcple!=null) {
MultipurposeSocketAddress mpsa=new MultipurposeSocketAddress(tcple.getAsString());
SocketChannelListener tcpl = null;
try {
tcpl = new SocketChannelListener(mpsa);
Long vasn= kcci.getVirtualASN();
if(vasn!=null) {
klalbController.getIpv6Router().setASN (vasn);
}
tcpl.setCon((soc)->{
KLALBRemoteLine krs=null;
try {
krs = new KLALBRemoteLine(new StreamChannelKLALBPacketLink(soc));
klalbController.addRemoteLine(krs);
} catch (IOException e) {
e.printStackTrace();
}
String vsne=kcci.getVirtualSocketName();
//if(vsne!=null) {
MultipurposeSocketAddress.getSocketTypeRegister().put(vsne, klalbController.getSocketType());
//}
MultipurposeSocketAddress tcple=kcci.getTCPListen();
if(tcple!=null) {
});
MultipurposeSocketAddress mpsa2=new MultipurposeSocketAddress(mpsa.getType(), mpsa.getHost(),((InetSocketAddress)tcpl.getServerSocketChannel().getLocalAddress()).getPort());
klalbController.getListenSocketAddress().add(mpsa2);
} catch (IOException e1) {
e1.printStackTrace();
}
}
JsonElement udple=entry.get("UDPListen");
if(udple!=null) {
MultipurposeSocketAddress mpsa=new MultipurposeSocketAddress(udple.getAsString());
DatagramSocketListener udpl = null;
try {
udpl = new DatagramSocketListener(mpsa);
udpl.setCon((soc)->{
KLALBRemoteLine krs=null;
SocketChannelListener tcpl = null;
try {
krs = new KLALBRemoteLine(new SplitedDatagramKLALBPacketLink(soc));
klalbController.addRemoteLine(krs);
} catch (IOException e) {
e.printStackTrace();
}
tcpl = new SocketChannelListener(tcple);
});
MultipurposeSocketAddress mpsau2=new MultipurposeSocketAddress(mpsa.getType(), mpsa.getHost(),((InetSocketAddress)(udpl.getDatagramServerSocket().getLocalSocketAddress())).getPort());
//klalbController.getListenSocketAddress().add(mpsau2);
} catch (IOException e1) {
e1.printStackTrace();
tcpl.setCon((soc)->{
KLALBRemoteLine krs=null;
try {
krs = new KLALBRemoteLine(new StreamChannelKLALBPacketLink(soc));
klalbController.addRemoteLine(krs);
} catch (IOException e) {
e.printStackTrace();
}
});
MultipurposeSocketAddress mpsa2=new MultipurposeSocketAddress(tcple.getType(), tcple.getHost(),((InetSocketAddress)tcpl.getServerSocketChannel().getLocalAddress()).getPort());
klalbController.getListenSocketAddress().add(mpsa2);
} catch (IOException e1) {
e1.printStackTrace();
}
}
MultipurposeSocketAddress udple=kcci.getUDPListen();
if(udple!=null) {
DatagramSocketListener udpl = null;
try {
udpl = new DatagramSocketListener(udple);
udpl.setCon((soc)->{
KLALBRemoteLine krs=null;
try {
krs = new KLALBRemoteLine(new SplitedDatagramKLALBPacketLink(soc));
klalbController.addRemoteLine(krs);
} catch (IOException e) {
e.printStackTrace();
}
});
MultipurposeSocketAddress mpsau2=new MultipurposeSocketAddress(udple.getType(), udple.getHost(),((InetSocketAddress)(udpl.getDatagramServerSocket().getLocalSocketAddress())).getPort());
//klalbController.getListenSocketAddress().add(mpsau2);
} catch (IOException e1) {
e1.printStackTrace();
}
}
List<MultipurposeSocketAddress> linele=kcci.getLineTable();
if(linele!=null) {
linele.forEach((aline)->{
klalbController.getSelflineTable().add(aline);
});
}
List<MultipurposeSocketAddress> linetoc=kcci.getConnectLineTable();
if(linetoc!=null) {
linetoc.forEach((aline)->{
klalbController.addRemoteLines(aline);
});
}
}else if(item instanceof SocketBridgeConfigItem) {
SocketBridgeConfigItem scci=(SocketBridgeConfigItem) item;
try {
proxys.add(scci.createProxy(klalbController));
} catch (IOException e) {
e.printStackTrace();
}
}
JsonElement linele=entry.get("LineTable");
if(linele!=null) {
JsonArray jary=(JsonArray)linele;
jary.forEach((aline)->{
klalbController.getSelflineTable().add(new MultipurposeSocketAddress(aline.getAsString()));
});
}
JsonElement linetoc=entry.get("ConnectLineTable");
if(linetoc!=null) {
JsonArray jary=(JsonArray)linetoc;
jary.forEach((aline)->{
klalbController.addRemoteLines(new MultipurposeSocketAddress(aline.getAsString()));
});
}
break;
case "SocketBridge":
try {
proxys.add(createProxyByJson(entry));
} catch (IOException e) {
e.printStackTrace();
}
break;
default:
break;
}
}
public Proxy createProxyByJson(JsonObject entry) throws IOException {
HostPortMap mapp=new HostPortMap();
LinkedHashMap<String, SocketBridgeFactory>mapb=new LinkedHashMap<>();
MultipurposeSocketAddress l=new MultipurposeSocketAddress(entry.get("Listen").getAsString());
SocketBridgeFactory bdg=getDefaultBridgeFactory(entry.get("Bridge"),mapb);
MultipurposeSocketAddress r=getDefaultConnect(entry.get("Connect"),mapp);
return new SocketToSocketProxy(l ,new MultipurposeSocketAddress("0.0.0.0:0"), r,mapp,bdg,mapb);
}
public JsonObject createJsonObjectByProxy(Proxy p) {
if(p instanceof SocketToSocketProxy) {
SocketToSocketProxy stsp=(SocketToSocketProxy) p;
JsonObject jobj=new JsonObject();
jobj.addProperty("Listen", stsp.getListen().toString());
jobj.add("Bridge", getJsonElementByBridges(stsp));
jobj.add("Connect", getJsonElementByConnects(stsp));
return jobj;
}else {
throw new UnsupportedOperationException();
}
}
private JsonElement getJsonElementByConnects(SocketToSocketProxy stsp) {
if(stsp.getDetectedConnect()==null||stsp.getDetectedConnect().isEmpty()) {
return new JsonPrimitive(stsp.getDefaultConnect().toString());
}else {
JsonObject jo=new JsonObject();
for (Iterator<Entry<String, MultipurposeSocketAddress>> iterator = stsp.getDetectedConnect().entrySet().iterator(); iterator.hasNext();) {
Entry<String, MultipurposeSocketAddress> proxy = (Entry<String, MultipurposeSocketAddress>) iterator.next();
if(!proxy.getKey().equals("DEFAULT")) {
jo.addProperty(proxy.getKey(), proxy.getValue().toString());
}
}
jo.addProperty("DEFAULT", stsp.getDefaultConnect().toString());
return jo;
}
}
private JsonElement getJsonElementByBridges(SocketToSocketProxy stsp) {
if(stsp.getDetectedFactory()==null||stsp.getDetectedFactory().isEmpty()) {
return new JsonPrimitive(getJobjByFActory(stsp.getDefaultFactory()));
}else {
JsonObject jo=new JsonObject();
for (Iterator<Entry<String, SocketBridgeFactory>> iterator = stsp.getDetectedFactory().entrySet().iterator(); iterator.hasNext();) {
Entry<String, SocketBridgeFactory> proxy = (Entry<String, SocketBridgeFactory>) iterator.next();
if(!proxy.getKey().equals("DEFAULT")) {
jo.addProperty(proxy.getKey(), getJobjByFActory(proxy.getValue()));
}
}
jo.addProperty("DEFAULT",getJobjByFActory( stsp.getDefaultFactory()));
return jo;
}
}
private MultipurposeSocketAddress getDefaultConnect(JsonElement jsonElement, LinkedHashMap<String, MultipurposeSocketAddress> mapp) {
if(jsonElement instanceof JsonObject) {
JsonObject jobj=(JsonObject) jsonElement;
jobj.entrySet().forEach((en)->{
mapp.put(en.getKey(), new MultipurposeSocketAddress( en.getValue().getAsString()));
});
return mapp.get("DEFAULT");
}else {
return new MultipurposeSocketAddress(jsonElement.getAsString());
}
}
private SocketBridgeFactory getDefaultBridgeFactory(JsonElement jsonElement, LinkedHashMap<String, SocketBridgeFactory> mapp) {
if(jsonElement instanceof JsonObject) {
JsonObject jobj=(JsonObject) jsonElement;
jobj.entrySet().forEach((en)->{
mapp.put(en.getKey(), getFactoryByJobj(en.getValue().getAsString()));
});
return mapp.get("DEFAULT");
}else {
return getFactoryByJobj(jsonElement.getAsString());
}
}
private SocketBridgeFactory getFactoryByJobj(String string) {
if(string.startsWith("SocketBridge")) {
return new DefaultSocketBridgeFactory();
}else if(string.startsWith("MinecraftSocketBridge")) {
return new DefaultMinecraftSocketBridgeFactory(klalbController.getSelf().getAddress(), Integer.parseInt(string.substring(21)));
private KLALBStateGUI3 kgui;
public KLALBStateGUI3 getKLALBGUI() {
if(kgui==null) {
kgui=new KLALBStateGUI3(klalbController);
kgui.loadConfig(config);
kgui.setSaveComsumer((cfg)->{
String json=gson.toJson(cfg);
if(jsonFile!=null) {
FileWriter fw = null;
try {
fw=new FileWriter(jsonFile);
fw.write(json);
}catch(IOException e) {
e.printStackTrace();
}finally {
if(fw!=null)
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
}
throw new IllegalArgumentException("unknown SocketBridge type:"+string);
}
private String getJobjByFActory(SocketBridgeFactory sbf) {
if(sbf instanceof DefaultSocketBridgeFactory) {
return "SocketBridge";
}else if(sbf instanceof DefaultMinecraftSocketBridgeFactory) {
return "MinecraftSocketBridge"+((DefaultMinecraftSocketBridgeFactory)sbf).getVport();
}else {
throw new UnsupportedOperationException();
}
}
private KLALBStateGUI2 kgui;
public KLALBStateGUI2 getKLALBGUI() {
if(kgui==null)
kgui=new KLALBStateGUI2(klalbController);
return kgui;
}
public KLALBConfig getConfig() {
return config;
}
public KLALBControllerConfigItem getControllerConfig() {
for(KLALBConfigItem item:config) {
if(item instanceof KLALBControllerConfigItem)
return (KLALBControllerConfigItem) item;
}
return null;
}
}