From 811ae71d844cc76958730597865e519ec19f4d10 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 14 Jun 2017 02:10:09 +0300 Subject: [PATCH] =?UTF-8?q?Zond:=20=D0=BF=D0=BE=D0=BF=D1=8B=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=B5=D1=81=D1=82=D0=B8?= =?UTF-8?q?=20=D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=BD=D0=BE=D0=B9=20=D1=84?= =?UTF-8?q?=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=BE=D0=BD=D0=B0=D0=BB=20=D0=BF?= =?UTF-8?q?=D0=BB=D0=B0=D0=B3=D0=B8=D0=BD=D0=B0=20=D0=BD=D0=B0=20"=D0=B7?= =?UTF-8?q?=D0=BE=D0=BD=D0=B4"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit что бы плагин занимался только апи сервера --- bridge/README.MD | 13 +--- bridge/build.gradle | 2 +- .../bridge/bukkit/BridgeLoggerAppender.java | 42 ----------- .../java/asys/bridge/bukkit/BridgePlugin.java | 24 +----- bridge/src/main/resources/config.yml | 8 +- zond/build.gradle | 2 +- zond/src/main/java/asys/zond/Main.java | 65 ++-------------- .../src/main/java/asys/zond/proxy/Client.java | 3 + .../asys/zond/proxy/ClientPacketHandler.java | 9 ++- .../main/java/asys/zond/proxy/Connector.java | 74 +++++++++++++++++++ .../main/java/asys/zond/proxy/TaskTicker.java | 48 ++++++++++++ 11 files changed, 143 insertions(+), 147 deletions(-) delete mode 100644 bridge/src/main/java/asys/bridge/bukkit/BridgeLoggerAppender.java create mode 100644 zond/src/main/java/asys/zond/proxy/Connector.java create mode 100644 zond/src/main/java/asys/zond/proxy/TaskTicker.java diff --git a/bridge/README.MD b/bridge/README.MD index c4691bd..12aca70 100644 --- a/bridge/README.MD +++ b/bridge/README.MD @@ -6,15 +6,4 @@ Настройки хранятся в файле `config.yml`. -`clientId` - Идентификатор и одновременно имя сервера. Должно быть уникальным. - -`mode` - Режим работы плагина. Имеется два режим: `1` и `2`. -Первый предназначен для прямого подключения к ASys: принимаются комманды, передается вывод консоли. -Второй - для подключения через Zond. В этом режиме плагин занимается только пинговкой и выполнением -служебных (от Zond) комманд. По-умолчению значение `1`. - -`host` - Хост/IP для подключения к ASys. В режиме `2` игнорируется и всегда имеет значение `127.0.0.1`. - -`port` - Порт для подключения к ASys/Zond. - -`passcode` - Секретное слово. Необходимо как дополнительный слой защиты. В режме `2` игнорируется. \ No newline at end of file +`port` - Порт для подключения к Zond. \ No newline at end of file diff --git a/bridge/build.gradle b/bridge/build.gradle index 9c830d9..71e9af3 100644 --- a/bridge/build.gradle +++ b/bridge/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.6-SNAPSHOT' +version = '0.7-SNAPSHOT' repositories { maven { url 'https://hub.spigotmc.org/nexus/content/groups/public/' } diff --git a/bridge/src/main/java/asys/bridge/bukkit/BridgeLoggerAppender.java b/bridge/src/main/java/asys/bridge/bukkit/BridgeLoggerAppender.java deleted file mode 100644 index 2ab12b2..0000000 --- a/bridge/src/main/java/asys/bridge/bukkit/BridgeLoggerAppender.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * DmitriyMX - * 2017-05-17 - */ -package asys.bridge.bukkit; - -import asys.mcsmanager.packets.CS_ConsoleMessage; -import io.netty.channel.Channel; -import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.appender.AbstractAppender; - -public class BridgeLoggerAppender extends AbstractAppender { - private Channel channel; - - BridgeLoggerAppender() { - super("ASysBridge", null, null); - super.start(); - } - - @Override - public void append(LogEvent event) { - if (channel == null) return; - - long timeMillis = event.getMillis(); - int intLevel = event.getLevel().intLevel(); - String loggerName = event.getLoggerName(); - String message = event.getMessage().getFormattedMessage(); - - CS_ConsoleMessage messagePkg = new CS_ConsoleMessage( - timeMillis, - intLevel, - loggerName, - message - ); - - channel.writeAndFlush(messagePkg); - } - - void setChannel(Channel channel) { - this.channel = channel; - } -} diff --git a/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java b/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java index 4f7b821..5debbf8 100644 --- a/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java +++ b/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java @@ -15,23 +15,11 @@ import org.bukkit.plugin.java.JavaPlugin; public class BridgePlugin extends JavaPlugin { public static BridgePlugin INSTANCE; - private String appConnect = "ASys"; private Client client; private TaskTicker connectTicker, pingTicker; private int tryConnect = 0; - private BridgeLoggerAppender loggerAppender; private boolean needReconnect = true; - @Override - public void onLoad() { - if (getConfig().getInt("mode") == 1) { - ((Logger)LogManager.getRootLogger()).addAppender(loggerAppender = new BridgeLoggerAppender()); - } else { - this.appConnect = "Zond"; - } - onEnable(); - } - @Override public void onEnable() { if (INSTANCE == null) { @@ -66,7 +54,7 @@ public class BridgePlugin extends JavaPlugin { client = new Client(); connectTicker = new TaskTicker().setStepTimeMs(5000L); connectTicker.setTask(() -> { - getLogger().info(String.format("Connect(%d) to %s...", ++tryConnect, appConnect)); + getLogger().info(String.format("Connect(%d) to Zond...", ++tryConnect)); if (getConfig().getInt("mode") == 1) { client.connect(getConfig().getString("host"), getConfig().getInt("port")); } else { @@ -89,9 +77,6 @@ public class BridgePlugin extends JavaPlugin { } public void startPing(Channel channel) { - if (getConfig().getInt("mode") == 1) { - getLoggerAppender().setChannel(channel); - } pingTicker = new TaskTicker().setStepTimeMs(5000L); pingTicker.setTask(() -> { channel.write(new CS_Ping( @@ -113,18 +98,11 @@ public class BridgePlugin extends JavaPlugin { } public void stopPing() { - if (getConfig().getInt("mode") == 1) { - getLoggerAppender().setChannel(null); - } if (pingTicker != null) { pingTicker.stop(); } } - public BridgeLoggerAppender getLoggerAppender() { - return loggerAppender; - } - public boolean isNeedReconnect() { return needReconnect; } diff --git a/bridge/src/main/resources/config.yml b/bridge/src/main/resources/config.yml index a6a0a8c..bec7cc2 100644 --- a/bridge/src/main/resources/config.yml +++ b/bridge/src/main/resources/config.yml @@ -1,7 +1 @@ -clientId: SpigotServer0 -# 1 - прямое соединение с ASys. Сообщения из консоли перехватываются -# 2 - подключение через Zond. Сообщения из консоли не перехватываются -mode: 1 -host: 127.0.0.1 -port: 8779 -passcode: testpassphrase \ No newline at end of file +port: 8710 \ No newline at end of file diff --git a/zond/build.gradle b/zond/build.gradle index f01b79b..82c85d3 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.4-SNAPSHOT' +version = '0.5.6-SNAPSHOT' apply plugin: 'application' diff --git a/zond/src/main/java/asys/zond/Main.java b/zond/src/main/java/asys/zond/Main.java index ed15b30..9d98f1e 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -5,7 +5,7 @@ */ package asys.zond; -import asys.zond.proxy.Client; +import asys.zond.proxy.Connector; import org.apache.commons.exec.CommandLine; import org.apache.commons.exec.DefaultExecutor; import org.apache.commons.exec.ExecuteException; @@ -16,20 +16,9 @@ import org.fusesource.jansi.AnsiConsole; import java.io.*; import java.util.Arrays; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -import static org.fusesource.jansi.Ansi.ansi; - public class Main { - private static Client client; - private static ScheduledExecutorService ses; - private static ScheduledFuture sesFuture; - private static int tryConnect = 0; - private static void printLogo() { System.out.println( Ansi.ansi().reset() @@ -60,13 +49,13 @@ public class Main { } loadConfig(); - startReconnect(); + Connector.getInstance().startReconnect(); int resultCode = executeProcess(args); - stopReconnect(); - ses.shutdown(); - client.disconnect(); + Connector.getInstance().setNeedReconnect(false); + Connector.getInstance().stopReconnect(); + Connector.getInstance().disconnect(); System.out.println( Ansi.ansi().reset().newline() @@ -80,7 +69,7 @@ public class Main { CommandLine commandLine = CommandLine.parse(cmdLine); DefaultExecutor executor = new DefaultExecutor(); - PrintStream proxySysOut = new ProxySysOut(System.err); + PrintStream proxySysOut = new ProxySysOut(System.out); InputStream proxySysIn = new ProxySysIn(); PumpStreamHandler psh = new PumpStreamHandler(proxySysOut, proxySysOut, proxySysIn); @@ -118,55 +107,15 @@ public class Main { fis.close(); } - public static void startReconnect() { - client = new Client(); - ses = Executors.newScheduledThreadPool(2); - sesFuture = ses.scheduleAtFixedRate(() -> { - log(String.format("Connect(%d) to ASys...", ++tryConnect)); - client.connect(Config.getString("host"), Config.getInt("port")); - if (client.isConnected()) { - stopReconnect(); - } else { - log(String.format("Connection(%d) fail. Try reconnect...", tryConnect)); - } - }, 0L, 5L, TimeUnit.SECONDS); - } - - private static void stopReconnect() { - if (sesFuture != null) { - sesFuture.cancel(false); - sesFuture = null; - tryConnect = 0; - } - } - private static class ProxySysOut extends PrintStream { - final byte[] prefix = Ansi.ansi().bg(Color.YELLOW).fg(Color.BLACK).boldOff().toString().getBytes(); - final byte[] suffix = Ansi.ansi().reset().toString().getBytes(); - ProxySysOut(OutputStream out) { super(out); } @Override public void write(byte[] buf, int off, int len) { - super.write(prefix, 0, prefix.length); super.write(buf, off, len); - super.write(suffix, 0, suffix.length); - } - - @Override - public void write(int b) { - super.write(prefix, 0, prefix.length); - super.write(b); - super.write(suffix, 0, suffix.length); - } - - @Override - public void write(byte[] b) throws IOException { - super.write(prefix, 0, prefix.length); - super.write(b); - super.write(suffix, 0, suffix.length); + Connector.getInstance().sendMessage(new String(buf, off, len)); } } diff --git a/zond/src/main/java/asys/zond/proxy/Client.java b/zond/src/main/java/asys/zond/proxy/Client.java index 114b4c9..672634c 100644 --- a/zond/src/main/java/asys/zond/proxy/Client.java +++ b/zond/src/main/java/asys/zond/proxy/Client.java @@ -25,6 +25,9 @@ public class Client { group = new NioEventLoopGroup(); bootstrap = createBootstrap(); } + + channelFuture = bootstrap.connect(host, port); + channelFuture.awaitUninterruptibly(5000); } public boolean isConnected() { diff --git a/zond/src/main/java/asys/zond/proxy/ClientPacketHandler.java b/zond/src/main/java/asys/zond/proxy/ClientPacketHandler.java index e15ada8..9f425ac 100644 --- a/zond/src/main/java/asys/zond/proxy/ClientPacketHandler.java +++ b/zond/src/main/java/asys/zond/proxy/ClientPacketHandler.java @@ -56,9 +56,11 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { - log("Lost connection!"); - log("Try reconnect..."); - Main.startReconnect(); + Connector.getInstance().setChannel(null); + if (Connector.getInstance().isNeedReconnect()) { + log("Lost connection! Try reconnect..."); + Connector.getInstance().startReconnect(); + } ctx.channel().attr(KNOWN_PACKETS).remove(); ctx.channel().attr(KNOWN_HANDLERS).remove(); @@ -73,6 +75,7 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements log(String.format("Handshake: #%d %s", pkt.getErrorCode(), pkt.getMessage())); } else { context.channel().attr(KNOWN_PACKETS).set(knownPackets); + Connector.getInstance().setChannel(context.channel()); log("Handshake: OK"); } } diff --git a/zond/src/main/java/asys/zond/proxy/Connector.java b/zond/src/main/java/asys/zond/proxy/Connector.java new file mode 100644 index 0000000..7827d49 --- /dev/null +++ b/zond/src/main/java/asys/zond/proxy/Connector.java @@ -0,0 +1,74 @@ +/* + * DmitriyMX + * 2017-06-14 + */ +package asys.zond.proxy; + +import asys.mcsmanager.packets.CS_ConsoleMessage; +import asys.zond.Config; +import io.netty.channel.Channel; + +import static asys.zond.Main.log; + +public class Connector { + private static Connector instance = new Connector(); + private Client client; + private TaskTicker connectTicker; + private int tryConnect = 0; + private boolean needReconnect = true; + private Channel channel; + + public static Connector getInstance() { + return instance; + } + + private Connector(){ + } + + public void startReconnect() { + client = new Client(); + connectTicker = new TaskTicker().setStepTimeMs(5000L); + connectTicker.setTask(() -> { + log(String.format("Connect(%d) to ASys...", ++tryConnect)); + client.connect(Config.getString("host"), Config.getInt("port")); + if (client.isConnected()) { + stopReconnect(); + } else { + log(String.format("Connection(%d) fail. Try reconnect...", tryConnect)); + } + }).start(); + } + + public boolean isNeedReconnect() { + return needReconnect; + } + + public void setNeedReconnect(boolean value) { + this.needReconnect = value; + } + + public void stopReconnect() { + if (connectTicker != null) { + connectTicker.stop(); + tryConnect = 0; + } + } + + public void disconnect() { + if (client.isConnected()) { + log("Disconnect..."); + client.disconnect(); + } + } + + public void setChannel(Channel channel) { + this.channel = channel; + } + + public void sendMessage(String message) { + if (channel != null) { + channel.writeAndFlush(new CS_ConsoleMessage( + System.currentTimeMillis(),0,"L",message)); + } + } +} diff --git a/zond/src/main/java/asys/zond/proxy/TaskTicker.java b/zond/src/main/java/asys/zond/proxy/TaskTicker.java new file mode 100644 index 0000000..3861683 --- /dev/null +++ b/zond/src/main/java/asys/zond/proxy/TaskTicker.java @@ -0,0 +1,48 @@ +/* + * DmitriyMX + * 2017-05-18 + */ +package asys.zond.proxy; + +public class TaskTicker implements Runnable { + private Runnable task; + private long stepTimeMs = 1000L; + private Thread thread; + private boolean loop = false; + + TaskTicker setTask(Runnable task) { + this.task = task; + return this; + } + + TaskTicker setStepTimeMs(long stepTimeMs) { + this.stepTimeMs = stepTimeMs; + return this; + } + + void start() { + thread = new Thread(this, "TaskTicker"); + loop = true; + thread.start(); + } + + void stop() { + loop = false; + if (thread != null) { + thread.interrupt(); + } + } + + @Override + public void run() { + while (loop || !Thread.currentThread().isInterrupted()) { + task.run(); + + try { + Thread.sleep(stepTimeMs); + } catch (InterruptedException e) { + break; + } + } + } +}