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; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.NetworkInterface; import java.net.Socket; import java.net.SocketException; import java.net.SocketTimeoutException; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Hashtable; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; 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; import com.google.gson.JsonParser; import com.google.gson.JsonPrimitive; public class KLALBProxySystem { private Set proxys=new HashSet<>(); private KLALBController klalbController; private KLALBRemoteManagement krm; private KLALBConfig config; private Gson gson; private File jsonFile; { GsonBuilder gb=new GsonBuilder().setPrettyPrinting(); MultipurposeSocketAddress.registerToGsonBuilder(gb); KLALBConfigItem.registerToGsonBuilder(gb); gson=gb.create(); } public Set getProxys() { return proxys; } public KLALBController getKlalbController() { return klalbController; } public KLALBProxySystem(Reader json) { loadConfigJson(json); } public KLALBProxySystem(String json) { loadConfigJson(json); } public KLALBProxySystem(JsonElement json) { loadConfigJson(json); } public KLALBProxySystem(File jsonFile) throws IOException { loadConfigJson(jsonFile); } public KLALBProxySystem() { } public void enableRemoteManagement() throws IOException { if(krm==null) { krm=new KLALBRemoteManagement(this); }else { throw new IllegalStateException("Remote Management already enabled!"); } } public void enableRemoteManagement(MultipurposeSocketAddress bind) throws IOException { if(krm==null) { krm=new KLALBRemoteManagement(this,bind); }else { throw new IllegalStateException("Remote Management already enabled!"); } } public boolean isRemoteManagementEnabled() { return krm!=null; } public void disableRemoteManagement() { if(krm!=null) { krm.close(); krm=null; } } public void loadConfigJson(File jsonFile) throws IOException { this.jsonFile=jsonFile; FileReader fr = null; try { fr=new FileReader(jsonFile); loadConfigJson(fr); }finally { if(fr!=null) fr.close(); } } public void loadConfigJson(String json) { loadConfigJson(new JsonParser().parse(json)); } public void loadConfigJson(Reader json) { loadConfigJson(new JsonParser().parse(json)); } public void loadConfigJson(JsonElement json) { KLALBConfig config= gson.fromJson(json, KLALBConfig.class); System.out.println(config); loadConfig(config); } 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 { UIEnv.setRsb(lang.getFileName()); } catch (IOException e) { e.printStackTrace(); } } } String vase= kcci.getVirtualAddress(); //System.out.println(vase); Listdaddr=new ArrayList(); List 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 { klalbController=new KLALBController(daddr); } Long vasn= kcci.getVirtualASN(); if(vasn!=null) { klalbController.getIpv6Router().setASN (vasn); } String vsne=kcci.getVirtualSocketName(); //if(vsne!=null) { MultipurposeSocketAddress.getSocketTypeRegister().put(vsne, klalbController.getStreamSocketType()); //} MultipurposeSocketAddress tcple=kcci.getTCPListen(); if(tcple!=null) { SocketChannelListener tcpl = null; try { tcpl = new SocketChannelListener(tcple); 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 linele=kcci.getLineTable(); if(linele!=null) { klalbController.getSelflineTable().addAll(linele); } List linetoc=kcci.getConnectLineTable(); if(linetoc!=null) { linetoc.forEach((aline)->{ klalbController.addRemoteLines(aline); }); } List ntps=kcci.getNtpServerTable(); if(ntps!=null) { klalbController.getNTPTable().addAll(ntps); } List strexc=kcci.getNetworkInterfaceExcepts(); klalbController.getNetworkInterfaceExcept().clear(); if(strexc!=null) { for(String strexci:strexc) { try { klalbController.getNetworkInterfaceExcept().add(NetworkInterface.getByName(strexci)); } catch (SocketException e) { e.printStackTrace(); } } } }else if(item instanceof SocketBridgeConfigItem) { SocketBridgeConfigItem scci=(SocketBridgeConfigItem) item; try { proxys.add(scci.createProxy(klalbController)); } catch (IOException e) { e.printStackTrace(); } } } } 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(); } } } }); } return kgui; } public KLALBConfig getConfig() { return config; } public KLALBControllerConfigItem getControllerConfig() { for(KLALBConfigItem item:config) { if(item instanceof KLALBControllerConfigItem) return (KLALBControllerConfigItem) item; } return null; } }