From 400e821b0ec45689f8f36af99abcfc7f7d86b238 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 8 Jun 2017 00:44:01 +0300 Subject: [PATCH 01/73] =?UTF-8?q?Zond:=20=D0=BF=D1=80=D0=BE=D0=BA=D1=81?= =?UTF-8?q?=D0=B8=D1=80=D1=83=D1=8E=D1=89=D0=B8=D0=B9=20=D0=B7=D0=B0=D0=BF?= =?UTF-8?q?=D1=83=D1=81=D0=BA=D0=B0=D1=82=D0=BE=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- settings.gradle | 1 + zond/build.gradle | 26 +++++++++++++ zond/src/main/java/asys/zond/Main.java | 54 ++++++++++++++++++++++++++ 4 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 zond/build.gradle create mode 100644 zond/src/main/java/asys/zond/Main.java diff --git a/build.gradle b/build.gradle index 23f171a..1e22a8f 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ subprojects { } subprojects { - if (!it.name.startsWith('bridge')) { + if (!it.name.startsWith('bridge') && !it.name.startsWith('zond')) { ext { slf4jVersion = '1.7.21' } diff --git a/settings.gradle b/settings.gradle index df0ccb4..02de200 100644 --- a/settings.gradle +++ b/settings.gradle @@ -4,3 +4,4 @@ include 'webinterface' include 'mcserver-manager' include 'bridge-protocol' include 'bridge' +include 'zond' diff --git a/zond/build.gradle b/zond/build.gradle new file mode 100644 index 0000000..36d2c8c --- /dev/null +++ b/zond/build.gradle @@ -0,0 +1,26 @@ +group = 'asys' +version = '0.1-SNAPSHOT' + +apply plugin: 'application' + +mainClassName = "asys.zond.Main" + +configurations { + included + compile.extendsFrom included +} + +jar { + manifest { + attributes 'Implementation-Title': 'ASys Zond', + 'Implementation-Version': version, + 'Main-Class': mainClassName + } + baseName = project.group + '.' + project.name + from { configurations.included.collect { it.isDirectory() ? it : zipTree(it) } } +} + +dependencies { + included group: 'org.fusesource.jansi', name: 'jansi', version: '1.11' + included group: 'org.apache.commons', name: 'commons-exec', version: '1.3' +} diff --git a/zond/src/main/java/asys/zond/Main.java b/zond/src/main/java/asys/zond/Main.java new file mode 100644 index 0000000..9623b35 --- /dev/null +++ b/zond/src/main/java/asys/zond/Main.java @@ -0,0 +1,54 @@ +/* + * DmitriyMX + * 2017-06-07 + * Idea by Daniil on 2017-06-07 + */ +package asys.zond; + +import org.apache.commons.exec.CommandLine; +import org.apache.commons.exec.DefaultExecutor; +import org.apache.commons.exec.ExecuteException; +import org.apache.commons.exec.PumpStreamHandler; +import org.fusesource.jansi.Ansi; +import org.fusesource.jansi.Ansi.Color; +import org.fusesource.jansi.AnsiConsole; + +import java.io.IOException; +import java.util.Arrays; +import java.util.stream.Collectors; + +import static org.fusesource.jansi.Ansi.ansi; + +public class Main { + public static void main(String[] args) throws IOException { + if (Boolean.getBoolean("ansi.install")) { + AnsiConsole.systemInstall(); + } + + Ansi ansi = ansi().reset(); + ansi.bold().fg(Color.WHITE).a("ASys").boldOff().a(":// "); + ansi.fg(Color.BLACK).bg(Color.RED).a("Zond").reset().newline(); + System.out.println(ansi.toString()); + + if (args.length == 0) { + System.out.println("no args"); + System.exit(0); + return; + } + + String cmdLine = Arrays.stream(args).collect(Collectors.joining(" ")); + CommandLine commandLine = CommandLine.parse(cmdLine); + DefaultExecutor executor = new DefaultExecutor(); + executor.setExitValue(1); + executor.setStreamHandler(new PumpStreamHandler(System.out, System.err, System.in)); + + int resultCode = 0; + try { + resultCode = executor.execute(commandLine); + } catch (ExecuteException ignore) { + } + System.out.print(ansi().reset().newline() + .fg(Color.GREEN).a("Process Finished. Code: ") + .bold().fg(Color.WHITE).a(resultCode).reset().newline()); + } +} From 304f640257f5586884237151768b14e65158ba0b Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 17 May 2017 17:20:33 +0300 Subject: [PATCH 02/73] =?UTF-8?q?Bridge:=20=D1=82=D0=B5=D1=81=D1=82=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D1=85=D0=B2=D0=B0=D1=82=D0=B0=20=D0=BB=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 305fc3d6b2adaef0de42b547b473313485c91837) --- bridge/build.gradle | 1 + .../bridge/bukkit/BridgeLoggerAppender.java | 21 +++++++++++++++++++ .../java/asys/bridge/bukkit/BridgePlugin.java | 7 +++++++ 3 files changed, 29 insertions(+) create mode 100644 bridge/src/main/java/asys/bridge/bukkit/BridgeLoggerAppender.java diff --git a/bridge/build.gradle b/bridge/build.gradle index 28d7e5b..073c68a 100644 --- a/bridge/build.gradle +++ b/bridge/build.gradle @@ -40,4 +40,5 @@ dependencies { exclude group: 'org.avaje' } compile group: 'io.netty', name: 'netty-codec', version: nettyVersion + compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.5' } diff --git a/bridge/src/main/java/asys/bridge/bukkit/BridgeLoggerAppender.java b/bridge/src/main/java/asys/bridge/bukkit/BridgeLoggerAppender.java new file mode 100644 index 0000000..c3c8529 --- /dev/null +++ b/bridge/src/main/java/asys/bridge/bukkit/BridgeLoggerAppender.java @@ -0,0 +1,21 @@ +/* + * DmitriyMX + * 2017-05-17 + */ +package asys.bridge.bukkit; + +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.appender.AbstractAppender; + +public class BridgeLoggerAppender extends AbstractAppender { + + BridgeLoggerAppender() { + super("ASysBridge", null, null); + super.start(); + } + + @Override + public void append(LogEvent event) { + System.out.println("+++ "+event.getMessage().getFormattedMessage()); + } +} diff --git a/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java b/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java index 2f688ba..7e98331 100644 --- a/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java +++ b/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java @@ -7,6 +7,8 @@ package asys.bridge.bukkit; import asys.bridge.client.Client; import asys.mcsmanager.packets.CS_Ping; import io.netty.channel.Channel; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.Logger; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.plugin.java.JavaPlugin; @@ -23,6 +25,11 @@ public class BridgePlugin extends JavaPlugin { private ScheduledFuture sesFuture, sesPingFuture; private int tryConnect = 0; + @Override + public void onLoad() { + ((Logger)LogManager.getRootLogger()).addAppender(new BridgeLoggerAppender()); + } + @Override public void onEnable() { INSTANCE = this; From 3f65ab33f9a1efa92016d42e94288ec9fbc4ea83 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 18 May 2017 01:11:51 +0300 Subject: [PATCH 03/73] =?UTF-8?q?Bridge:=20=D1=83=D1=81=D0=BF=D0=B5=D1=88?= =?UTF-8?q?=D0=BD=D0=B0=D1=8F=20=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=20=D0=BD=D0=B0=20MCSM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 2070a5eb63f677ba67fdef0cd68105c8bda48974) --- bridge-protocol/build.gradle | 2 +- .../mcsmanager/packets/CS_ConsoleMessage.java | 56 +++++++++++++++++++ bridge/build.gradle | 4 +- .../bridge/bukkit/BridgeLoggerAppender.java | 25 ++++++++- .../java/asys/bridge/bukkit/BridgePlugin.java | 18 ++++-- .../bridge/client/ClientPacketHandler.java | 3 +- mcserver-manager/build.gradle | 2 +- .../server/ServerPacketHandler.java | 13 ++++- 8 files changed, 110 insertions(+), 13 deletions(-) create mode 100644 bridge-protocol/src/main/java/asys/mcsmanager/packets/CS_ConsoleMessage.java diff --git a/bridge-protocol/build.gradle b/bridge-protocol/build.gradle index c53f9d2..6b537fc 100644 --- a/bridge-protocol/build.gradle +++ b/bridge-protocol/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.2-SNAPSHOT' +version = '0.3-SNAPSHOT' task jar(type: Jar, overwrite: true) { // не собирать jar diff --git a/bridge-protocol/src/main/java/asys/mcsmanager/packets/CS_ConsoleMessage.java b/bridge-protocol/src/main/java/asys/mcsmanager/packets/CS_ConsoleMessage.java new file mode 100644 index 0000000..f144589 --- /dev/null +++ b/bridge-protocol/src/main/java/asys/mcsmanager/packets/CS_ConsoleMessage.java @@ -0,0 +1,56 @@ +/* + * DmitriyMX + * 2017-05-17 + */ +package asys.mcsmanager.packets; + +import io.netty.buffer.ByteBuf; + +public class CS_ConsoleMessage extends Packet { + private long time; + private int level; + private String loggerName, + message; + + public CS_ConsoleMessage() { + } + + public CS_ConsoleMessage(long time, int level, String loggerName, String message) { + this.time = time; + this.level = level; + this.loggerName = loggerName; + this.message = message; + } + + public long getTime() { + return time; + } + + public int getLevel() { + return level; + } + + public String getLoggerName() { + return loggerName; + } + + public String getMessage() { + return message; + } + + @Override + public void readSelfData(ByteBuf buffer) { + this.time = buffer.readLong(); + this.level = buffer.readInt(); + this.loggerName = readString(buffer); + this.message = readString(buffer); + } + + @Override + public void writeSelfData(ByteBuf buffer) { + buffer.writeLong(time); + buffer.writeInt(level); + writeString(buffer, loggerName); + writeString(buffer, message); + } +} diff --git a/bridge/build.gradle b/bridge/build.gradle index 073c68a..baa9fe7 100644 --- a/bridge/build.gradle +++ b/bridge/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.5.1-SNAPSHOT' +version = '0.5.2-SNAPSHOT' repositories { maven { url 'https://hub.spigotmc.org/nexus/content/groups/public/' } @@ -40,5 +40,5 @@ dependencies { exclude group: 'org.avaje' } compile group: 'io.netty', name: 'netty-codec', version: nettyVersion - compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.5' + compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.0-rc1' } diff --git a/bridge/src/main/java/asys/bridge/bukkit/BridgeLoggerAppender.java b/bridge/src/main/java/asys/bridge/bukkit/BridgeLoggerAppender.java index c3c8529..2ab12b2 100644 --- a/bridge/src/main/java/asys/bridge/bukkit/BridgeLoggerAppender.java +++ b/bridge/src/main/java/asys/bridge/bukkit/BridgeLoggerAppender.java @@ -1,13 +1,16 @@ /* - * DmitriyMX + * 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); @@ -16,6 +19,24 @@ public class BridgeLoggerAppender extends AbstractAppender { @Override public void append(LogEvent event) { - System.out.println("+++ "+event.getMessage().getFormattedMessage()); + 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 7e98331..9223e21 100644 --- a/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java +++ b/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java @@ -24,18 +24,22 @@ public class BridgePlugin extends JavaPlugin { private ScheduledExecutorService ses; private ScheduledFuture sesFuture, sesPingFuture; private int tryConnect = 0; + private BridgeLoggerAppender loggerAppender; @Override public void onLoad() { - ((Logger)LogManager.getRootLogger()).addAppender(new BridgeLoggerAppender()); + ((Logger)LogManager.getRootLogger()).addAppender(loggerAppender = new BridgeLoggerAppender()); + onEnable(); } @Override public void onEnable() { - INSTANCE = this; - saveDefaultConfig(); + if (INSTANCE == null) { + INSTANCE = this; + saveDefaultConfig(); - startReconnect(); + startReconnect(); + } } @Override @@ -84,6 +88,7 @@ public class BridgePlugin extends JavaPlugin { } public void startPing(Channel channel) { + getLoggerAppender().setChannel(channel); sesPingFuture = ses.scheduleAtFixedRate(() -> { channel.write(new CS_Ping( System.currentTimeMillis(), @@ -104,8 +109,13 @@ public class BridgePlugin extends JavaPlugin { } public void stopPing() { + getLoggerAppender().setChannel(null); if (sesPingFuture != null) { sesPingFuture.cancel(false); } } + + public BridgeLoggerAppender getLoggerAppender() { + return loggerAppender; + } } diff --git a/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java b/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java index 94c145b..2995740 100644 --- a/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java +++ b/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java @@ -25,7 +25,8 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements private static Map, IPacketHandler> handshakeHandlers; private static final BiMap> pingPackets = ImmutableBiMap.of( - 3, CS_Ping.class + 3, CS_Ping.class, + 4, CS_ConsoleMessage.class ); ClientPacketHandler() { diff --git a/mcserver-manager/build.gradle b/mcserver-manager/build.gradle index d3ab670..e72c9bc 100644 --- a/mcserver-manager/build.gradle +++ b/mcserver-manager/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.8.6-SNAPSHOT' +version = '0.8.7-SNAPSHOT' apply plugin: 'osgi' diff --git a/mcserver-manager/src/main/java/asys/mcsmanager/server/ServerPacketHandler.java b/mcserver-manager/src/main/java/asys/mcsmanager/server/ServerPacketHandler.java index 91c9abc..bed9a46 100644 --- a/mcserver-manager/src/main/java/asys/mcsmanager/server/ServerPacketHandler.java +++ b/mcserver-manager/src/main/java/asys/mcsmanager/server/ServerPacketHandler.java @@ -11,6 +11,7 @@ import com.google.common.collect.ImmutableMap; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.util.AttributeKey; +import org.slf4j.LoggerFactory; import java.util.Map; @@ -26,7 +27,8 @@ class ServerPacketHandler extends ChannelInboundHandlerAdapter implements IPacke private static Map, IPacketHandler> handshakeHandlers; private static final BiMap> pingPackets = ImmutableBiMap.of( - 3, CS_Ping.class + 3, CS_Ping.class, + 4, CS_ConsoleMessage.class ); private static Map, IPacketHandler> pingHandlers; @@ -41,7 +43,8 @@ class ServerPacketHandler extends ChannelInboundHandlerAdapter implements IPacke if (pingHandlers == null) { pingHandlers = ImmutableMap.of( - CS_Ping.class, this + CS_Ping.class, this, + CS_ConsoleMessage.class, this ); } } @@ -59,6 +62,8 @@ class ServerPacketHandler extends ChannelInboundHandlerAdapter implements IPacke handleCSHandshake((CS_Handshake) packet, context); } else if (packet.getClass() == CS_Ping.class) { handleCSPing((CS_Ping) packet, context); + } else if (packet.getClass() == CS_ConsoleMessage.class) { + handleCSConsoleMessage((CS_ConsoleMessage) packet); } } @@ -91,4 +96,8 @@ class ServerPacketHandler extends ChannelInboundHandlerAdapter implements IPacke private void handleCSPing(CS_Ping packet, ChannelHandlerContext context) { manager.putInfo(context.channel().attr(CLIENTID).get(), packet); } + + private void handleCSConsoleMessage(CS_ConsoleMessage packet) { + LoggerFactory.getLogger(getClass()).debug("[L:{}] {}", packet.getLevel(), packet.getMessage()); + } } From 1151f1580c1a7f6d3dcdb9ae894a4ab97484ac37 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 8 Jun 2017 11:49:29 +0300 Subject: [PATCH 04/73] =?UTF-8?q?Bridge:=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC?= =?UTF-8?q?=D1=8B=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Теперь есть два режима: 1 и 2. 1 - это стандартный режим, когда подключение идет напрямую к ASys. 2 - это новый режим, когда подключением к ASys занимается Zond. Bridge в таком режиме является лишь "мостиком" между игровым API и ASys. --- bridge/README.MD | 20 ++++++++++ bridge/build.gradle | 2 +- .../java/asys/bridge/bukkit/BridgePlugin.java | 28 +++++++++---- .../bridge/client/ClientPacketHandler.java | 39 ++++++++++++------- bridge/src/main/resources/config.yml | 3 ++ 5 files changed, 68 insertions(+), 24 deletions(-) create mode 100644 bridge/README.MD diff --git a/bridge/README.MD b/bridge/README.MD new file mode 100644 index 0000000..c4691bd --- /dev/null +++ b/bridge/README.MD @@ -0,0 +1,20 @@ +# Bridge + +Плагин, служащий "мостом" между внутренним серверным API и ASys + +## Настройка + +Настройки хранятся в файле `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 diff --git a/bridge/build.gradle b/bridge/build.gradle index baa9fe7..9c830d9 100644 --- a/bridge/build.gradle +++ b/bridge/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.5.2-SNAPSHOT' +version = '0.6-SNAPSHOT' repositories { maven { url 'https://hub.spigotmc.org/nexus/content/groups/public/' } diff --git a/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java b/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java index 9223e21..030b125 100644 --- a/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java +++ b/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java @@ -20,6 +20,7 @@ import java.util.concurrent.TimeUnit; public class BridgePlugin extends JavaPlugin { public static BridgePlugin INSTANCE; + private String appConnect = "ASys"; private Client client; private ScheduledExecutorService ses; private ScheduledFuture sesFuture, sesPingFuture; @@ -28,7 +29,12 @@ public class BridgePlugin extends JavaPlugin { @Override public void onLoad() { - ((Logger)LogManager.getRootLogger()).addAppender(loggerAppender = new BridgeLoggerAppender()); + saveDefaultConfig(); + if (getConfig().getInt("mode") == 1) { + ((Logger) LogManager.getRootLogger()).addAppender(loggerAppender = new BridgeLoggerAppender()); + } else { + this.appConnect = "Zond"; + } onEnable(); } @@ -36,8 +42,6 @@ public class BridgePlugin extends JavaPlugin { public void onEnable() { if (INSTANCE == null) { INSTANCE = this; - saveDefaultConfig(); - startReconnect(); } } @@ -68,8 +72,12 @@ public class BridgePlugin extends JavaPlugin { client = new Client(); ses = Executors.newScheduledThreadPool(2); sesFuture = ses.scheduleAtFixedRate(() -> { - getLogger().info(String.format("Connect(%d) to ASys...", ++tryConnect)); - client.connect(getConfig().getString("host"), getConfig().getInt("port")); + getLogger().info(String.format("Connect(%d) to %s...", ++tryConnect, appConnect)); + if (getConfig().getInt("mode") == 1) { + client.connect(getConfig().getString("host"), getConfig().getInt("port")); + } else { + client.connect("127.0.0.1", getConfig().getInt("port")); + } if (client.isConnected()) { stopReconnect(); } else { @@ -88,7 +96,9 @@ public class BridgePlugin extends JavaPlugin { } public void startPing(Channel channel) { - getLoggerAppender().setChannel(channel); + if (getConfig().getInt("mode") == 1) { + getLoggerAppender().setChannel(channel); + } sesPingFuture = ses.scheduleAtFixedRate(() -> { channel.write(new CS_Ping( System.currentTimeMillis(), @@ -109,13 +119,15 @@ public class BridgePlugin extends JavaPlugin { } public void stopPing() { - getLoggerAppender().setChannel(null); + if (getConfig().getInt("mode") == 1) { + getLoggerAppender().setChannel(null); + } if (sesPingFuture != null) { sesPingFuture.cancel(false); } } - public BridgeLoggerAppender getLoggerAppender() { + private BridgeLoggerAppender getLoggerAppender() { return loggerAppender; } } diff --git a/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java b/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java index 2995740..4d8bfba 100644 --- a/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java +++ b/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java @@ -40,14 +40,21 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements @Override public void channelActive(ChannelHandlerContext context) throws Exception { BridgePlugin.INSTANCE.getLogger().info("channelActive"); - context.channel().attr(KNOWN_PACKETS).set(handshakePackets); - context.channel().attr(KNOWN_HANDLERS).set(handshakeHandlers); + if (BridgePlugin.INSTANCE.getConfig().getInt("mode") == 1) { + context.channel().attr(KNOWN_PACKETS).set(handshakePackets); + context.channel().attr(KNOWN_HANDLERS).set(handshakeHandlers); - CS_Handshake packet = new CS_Handshake( - BridgePlugin.INSTANCE.getConfig().getString("clientId"), - BridgePlugin.INSTANCE.getConfig().getString("passcode")); - BridgePlugin.INSTANCE.getLogger().info("send Handshake packet..."); - context.channel().writeAndFlush(packet); + + CS_Handshake packet = new CS_Handshake( + BridgePlugin.INSTANCE.getConfig().getString("clientId"), + BridgePlugin.INSTANCE.getConfig().getString("passcode")); + BridgePlugin.INSTANCE.getLogger().info("send Handshake packet..."); + context.channel().writeAndFlush(packet); + } else { + context.channel().attr(KNOWN_PACKETS).set(pingPackets); + BridgePlugin.INSTANCE.getLogger().info("Handshake: SKIP. Used Zond."); + BridgePlugin.INSTANCE.startPing(context.channel()); + } super.channelActive(context); } @@ -67,14 +74,16 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements @Override public void handle(Packet packet, ChannelHandlerContext context) { BridgePlugin.INSTANCE.getLogger().info("handle : " + packet.getClass().getSimpleName()); - SC_HandshakeResult pkt = (SC_HandshakeResult) packet; - if (pkt.getErrorCode() != 0) { - BridgePlugin.INSTANCE.getLogger().severe( - String.format("Handshake: #%d %s", pkt.getErrorCode(), pkt.getMessage())); - } else { - context.channel().attr(KNOWN_PACKETS).set(pingPackets); - BridgePlugin.INSTANCE.getLogger().info("Handshake: OK"); - BridgePlugin.INSTANCE.startPing(context.channel()); + if (BridgePlugin.INSTANCE.getConfig().getInt("mode") == 1) { + SC_HandshakeResult pkt = (SC_HandshakeResult) packet; + if (pkt.getErrorCode() != 0) { + BridgePlugin.INSTANCE.getLogger().severe( + String.format("Handshake: #%d %s", pkt.getErrorCode(), pkt.getMessage())); + } else { + context.channel().attr(KNOWN_PACKETS).set(pingPackets); + BridgePlugin.INSTANCE.getLogger().info("Handshake: OK"); + BridgePlugin.INSTANCE.startPing(context.channel()); + } } } } diff --git a/bridge/src/main/resources/config.yml b/bridge/src/main/resources/config.yml index 5d80f21..a6a0a8c 100644 --- a/bridge/src/main/resources/config.yml +++ b/bridge/src/main/resources/config.yml @@ -1,4 +1,7 @@ clientId: SpigotServer0 +# 1 - прямое соединение с ASys. Сообщения из консоли перехватываются +# 2 - подключение через Zond. Сообщения из консоли не перехватываются +mode: 1 host: 127.0.0.1 port: 8779 passcode: testpassphrase \ No newline at end of file From 2d53066132acff2f7432a7dbea3765a7fa5b1bd7 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 8 Jun 2017 11:49:51 +0300 Subject: [PATCH 05/73] Zond: add README --- zond/README.MD | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 zond/README.MD diff --git a/zond/README.MD b/zond/README.MD new file mode 100644 index 0000000..1c6bf7b --- /dev/null +++ b/zond/README.MD @@ -0,0 +1,3 @@ +# Zond + +Проксирующий запускатор, дающий больший контроль над процессом игрового сервера. From 118e4fe896bedca2b38075e732ffa4f179fea6a8 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 8 Jun 2017 13:18:29 +0300 Subject: [PATCH 06/73] =?UTF-8?q?Zond:=20=D1=81=D0=BE=D0=B5=D0=B4=D0=B8?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=20ASys?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 15 +++- zond/src/main/java/asys/zond/Config.java | 35 ++++++++ zond/src/main/java/asys/zond/Main.java | 80 ++++++++++++++++++- .../src/main/java/asys/zond/proxy/Client.java | 60 ++++++++++++++ .../asys/zond/proxy/ClientPacketHandler.java | 79 ++++++++++++++++++ zond/src/main/resources/zond.properties | 4 + 6 files changed, 268 insertions(+), 5 deletions(-) create mode 100644 zond/src/main/java/asys/zond/Config.java create mode 100644 zond/src/main/java/asys/zond/proxy/Client.java create mode 100644 zond/src/main/java/asys/zond/proxy/ClientPacketHandler.java create mode 100644 zond/src/main/resources/zond.properties diff --git a/zond/build.gradle b/zond/build.gradle index 36d2c8c..6748cd3 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.1-SNAPSHOT' +version = '0.2-SNAPSHOT' apply plugin: 'application' @@ -10,7 +10,13 @@ configurations { compile.extendsFrom included } +compileJava { + dependsOn ':bridge-protocol:compileJava' +} + jar { + dependsOn ':bridge-protocol:jar' + dependsOn configurations.included manifest { attributes 'Implementation-Title': 'ASys Zond', 'Implementation-Version': version, @@ -20,7 +26,14 @@ jar { from { configurations.included.collect { it.isDirectory() ? it : zipTree(it) } } } +ext { + nettyVersion = '4.0.23.Final' +} + dependencies { + included files(project(':bridge-protocol').sourceSets.main.output.classesDir) included group: 'org.fusesource.jansi', name: 'jansi', version: '1.11' included group: 'org.apache.commons', name: 'commons-exec', version: '1.3' + included group: 'io.netty', name: 'netty-codec', version: nettyVersion + included group: 'com.google.guava', name: 'guava', version: '21.0' } diff --git a/zond/src/main/java/asys/zond/Config.java b/zond/src/main/java/asys/zond/Config.java new file mode 100644 index 0000000..b3092e1 --- /dev/null +++ b/zond/src/main/java/asys/zond/Config.java @@ -0,0 +1,35 @@ +/* + * DmitriyMX + * 2017-06-08 + */ +package asys.zond; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +public class Config { + private static Properties properties = new Properties(); + + private Config(){ + } + + public static void load(InputStream inputStream) throws IOException { + properties.load(inputStream); + if (properties.size() == 0) { + throw new IOException("Config empty!"); + } + } + + public static String getString(String key) { + return properties.getProperty(key); + } + + public static int getInt(String key) { + try { + return Integer.parseInt(properties.getProperty(key)); + } catch (NumberFormatException e) { + return 0; + } + } +} diff --git a/zond/src/main/java/asys/zond/Main.java b/zond/src/main/java/asys/zond/Main.java index 9623b35..581f6e2 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -5,6 +5,7 @@ */ package asys.zond; +import asys.zond.proxy.Client; import org.apache.commons.exec.CommandLine; import org.apache.commons.exec.DefaultExecutor; import org.apache.commons.exec.ExecuteException; @@ -13,13 +14,22 @@ import org.fusesource.jansi.Ansi; import org.fusesource.jansi.Ansi.Color; import org.fusesource.jansi.AnsiConsole; -import java.io.IOException; +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; + public static void main(String[] args) throws IOException { if (Boolean.getBoolean("ansi.install")) { AnsiConsole.systemInstall(); @@ -36,6 +46,21 @@ public class Main { return; } + loadConfig(); + startReconnect(); + + int resultCode = executeProcess(args); + + stopReconnect(); + ses.shutdown(); + client.disconnect(); + + System.out.print(ansi().reset().newline() + .fg(Color.GREEN).a("Process Finished. Code: ") + .bold().fg(Color.WHITE).a(resultCode).reset().newline()); + } + + private static int executeProcess(String[] args) { String cmdLine = Arrays.stream(args).collect(Collectors.joining(" ")); CommandLine commandLine = CommandLine.parse(cmdLine); DefaultExecutor executor = new DefaultExecutor(); @@ -46,9 +71,56 @@ public class Main { try { resultCode = executor.execute(commandLine); } catch (ExecuteException ignore) { + } catch (IOException e) { + e.printStackTrace(); + resultCode = -1; + } + + return resultCode; + } + + private static void loadConfig() throws IOException { + File zondPropertiesFile = new File("zond.properties"); + if (!zondPropertiesFile.exists()) { + InputStream stream = Main.class.getResourceAsStream("/zond.properties"); + FileOutputStream fos = new FileOutputStream(zondPropertiesFile); + byte[] buff = new byte[65536]; + int len; + while ((len = stream.read(buff)) > 0) { + fos.write(buff, 0, len); + } + fos.flush(); + fos.close(); + } + + FileInputStream fis = new FileInputStream(zondPropertiesFile); + Config.load(fis); + fis.close(); + } + + public static void log(String message){ + System.out.println("[ASys Zond] " + message); + } + + 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; } - System.out.print(ansi().reset().newline() - .fg(Color.GREEN).a("Process Finished. Code: ") - .bold().fg(Color.WHITE).a(resultCode).reset().newline()); } } diff --git a/zond/src/main/java/asys/zond/proxy/Client.java b/zond/src/main/java/asys/zond/proxy/Client.java new file mode 100644 index 0000000..114b4c9 --- /dev/null +++ b/zond/src/main/java/asys/zond/proxy/Client.java @@ -0,0 +1,60 @@ +/* + * DmitriyMX + * 2017-06-08 + */ +package asys.zond.proxy; + +import asys.mcsmanager.packets.codec.PacketDecoder; +import asys.mcsmanager.packets.codec.PacketEncoder; +import asys.mcsmanager.packets.codec.PacketHandler; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; + +public class Client { + private EventLoopGroup group; + private Bootstrap bootstrap; + private ChannelFuture channelFuture; + + public void connect(String host, int port) { + if (group == null || bootstrap == null) { + group = new NioEventLoopGroup(); + bootstrap = createBootstrap(); + } + } + + public boolean isConnected() { + return (channelFuture != null && channelFuture.isSuccess()); + } + + public void disconnect() { + group.shutdownGracefully(); + } + + private Bootstrap createBootstrap() { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(group) + .channel(NioSocketChannel.class) + .handler(createChannelInitializer()); + + return bootstrap; + } + + private ChannelInitializer createChannelInitializer() { + return new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) throws Exception { + socketChannel.pipeline().addLast( + new PacketEncoder(), + new PacketDecoder(), + new PacketHandler(), + new ClientPacketHandler() + ); + } + }; + } +} diff --git a/zond/src/main/java/asys/zond/proxy/ClientPacketHandler.java b/zond/src/main/java/asys/zond/proxy/ClientPacketHandler.java new file mode 100644 index 0000000..e15ada8 --- /dev/null +++ b/zond/src/main/java/asys/zond/proxy/ClientPacketHandler.java @@ -0,0 +1,79 @@ +/* + * DmitriyMX + * 2017-06-08 + */ +package asys.zond.proxy; + +import asys.mcsmanager.packets.*; +import asys.zond.Config; +import asys.zond.Main; +import com.google.common.collect.BiMap; +import com.google.common.collect.ImmutableBiMap; +import com.google.common.collect.ImmutableMap; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; + +import java.util.Map; + +import static asys.mcsmanager.packets.codec.Params.KNOWN_HANDLERS; +import static asys.mcsmanager.packets.codec.Params.KNOWN_PACKETS; +import static asys.zond.Main.log; + +public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements IPacketHandler { + private static final BiMap> handshakePackets = ImmutableBiMap.of( + 1, CS_Handshake.class, + 2, SC_HandshakeResult.class + ); + private static Map, IPacketHandler> handshakeHandlers; + + private static final BiMap> knownPackets = ImmutableBiMap.of( + 3, CS_Ping.class, + 4, CS_ConsoleMessage.class + ); + + ClientPacketHandler() { + if (handshakeHandlers == null) { + handshakeHandlers = ImmutableMap.of( + SC_HandshakeResult.class, this + ); + } + } + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + log("channelActive"); + ctx.channel().attr(KNOWN_PACKETS).set(handshakePackets); + ctx.channel().attr(KNOWN_HANDLERS).set(handshakeHandlers); + + CS_Handshake packet = new CS_Handshake( + Config.getString("clientId"), + Config.getString("passcode")); + log("send Handshake packet..."); + ctx.channel().writeAndFlush(packet); + + super.channelActive(ctx); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log("Lost connection!"); + log("Try reconnect..."); + Main.startReconnect(); + + ctx.channel().attr(KNOWN_PACKETS).remove(); + ctx.channel().attr(KNOWN_HANDLERS).remove(); + super.channelInactive(ctx); + } + + @Override + public void handle(Packet packet, ChannelHandlerContext context) { + log("handle : " + packet.getClass().getSimpleName()); + SC_HandshakeResult pkt = (SC_HandshakeResult) packet; + if (pkt.getErrorCode() != 0) { + log(String.format("Handshake: #%d %s", pkt.getErrorCode(), pkt.getMessage())); + } else { + context.channel().attr(KNOWN_PACKETS).set(knownPackets); + log("Handshake: OK"); + } + } +} diff --git a/zond/src/main/resources/zond.properties b/zond/src/main/resources/zond.properties new file mode 100644 index 0000000..547e091 --- /dev/null +++ b/zond/src/main/resources/zond.properties @@ -0,0 +1,4 @@ +clientId = SpigotServer0 +host = 127.0.0.1 +port = 8779 +passcode = testpassphrase \ No newline at end of file From d9439d64822a2617fe8416c4ab4ecd7fea929402 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 10 Jun 2017 15:13:15 +0300 Subject: [PATCH 07/73] =?UTF-8?q?Zond:=20=D0=BF=D1=80=D0=BE=D0=BA=D1=81?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20SysOut/SysEr?= =?UTF-8?q?r=20=D0=B8=20SysIn?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 2 +- zond/src/main/java/asys/zond/Main.java | 57 ++++++++++++++++++++++++-- 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/zond/build.gradle b/zond/build.gradle index 6748cd3..0f4e267 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.2-SNAPSHOT' +version = '0.3-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 581f6e2..67ebdee 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -64,8 +64,11 @@ public class Main { String cmdLine = Arrays.stream(args).collect(Collectors.joining(" ")); CommandLine commandLine = CommandLine.parse(cmdLine); DefaultExecutor executor = new DefaultExecutor(); - executor.setExitValue(1); - executor.setStreamHandler(new PumpStreamHandler(System.out, System.err, System.in)); + + PrintStream proxySysOut = new ProxySysOut(System.err); + InputStream proxySysIn = new ProxySysIn(); + + executor.setStreamHandler(new PumpStreamHandler(proxySysOut, proxySysOut, proxySysIn)); int resultCode = 0; try { @@ -99,7 +102,8 @@ public class Main { } public static void log(String message){ - System.out.println("[ASys Zond] " + message); + System.out.println(Ansi.ansi().bg(Color.BLUE).fg(Color.WHITE) + .a("[ASys Zond] ").a(message).reset()); } public static void startReconnect() { @@ -123,4 +127,51 @@ public class Main { 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); + } + } + + private static class ProxySysIn extends InputStream { + @Override + public int read() throws IOException { + return System.in.read(); + } + + @Override + public int read(byte[] b) throws IOException { + return System.in.read(b); + } + + @Override + public int read(byte[] b, int off, int len) throws IOException { + return System.in.read(b, off, len); + } + } } From f54ae33236770d7cf180871e240bdb16bcefd3fd Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 10 Jun 2017 15:16:50 +0300 Subject: [PATCH 08/73] =?UTF-8?q?Zond:=20=D0=BF=D0=B0=D1=82=D1=87=D0=B8?= =?UTF-8?q?=D0=BC=20Apache=20Exec?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 14 +- zond/src/main/java/asys/zond/Main.java | 4 +- .../org/apache/commons/exec/StreamPumper.java | 152 ++++++++++++++++++ 3 files changed, 167 insertions(+), 3 deletions(-) create mode 100644 zond/src/main/java/org/apache/commons/exec/StreamPumper.java diff --git a/zond/build.gradle b/zond/build.gradle index 0f4e267..f01b79b 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.3-SNAPSHOT' +version = '0.4-SNAPSHOT' apply plugin: 'application' @@ -7,16 +7,25 @@ mainClassName = "asys.zond.Main" configurations { included + includedEx compile.extendsFrom included + compile.extendsFrom includedEx } compileJava { dependsOn ':bridge-protocol:compileJava' } +def zp(FileTree ft) { + return ft.matching { + exclude 'org/apache/commons/exec/StreamPumper.class' + } +} + jar { dependsOn ':bridge-protocol:jar' dependsOn configurations.included + dependsOn configurations.includedEx manifest { attributes 'Implementation-Title': 'ASys Zond', 'Implementation-Version': version, @@ -24,6 +33,7 @@ jar { } baseName = project.group + '.' + project.name from { configurations.included.collect { it.isDirectory() ? it : zipTree(it) } } + from { configurations.includedEx.collect { it.isDirectory() ? it : zp(zipTree(it)) } } } ext { @@ -33,7 +43,7 @@ ext { dependencies { included files(project(':bridge-protocol').sourceSets.main.output.classesDir) included group: 'org.fusesource.jansi', name: 'jansi', version: '1.11' - included group: 'org.apache.commons', name: 'commons-exec', version: '1.3' + includedEx group: 'org.apache.commons', name: 'commons-exec', version: '1.3' included group: 'io.netty', name: 'netty-codec', version: nettyVersion included group: 'com.google.guava', name: 'guava', version: '21.0' } diff --git a/zond/src/main/java/asys/zond/Main.java b/zond/src/main/java/asys/zond/Main.java index 67ebdee..de47ea2 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -68,7 +68,9 @@ public class Main { PrintStream proxySysOut = new ProxySysOut(System.err); InputStream proxySysIn = new ProxySysIn(); - executor.setStreamHandler(new PumpStreamHandler(proxySysOut, proxySysOut, proxySysIn)); + PumpStreamHandler psh = new PumpStreamHandler(proxySysOut, proxySysOut, proxySysIn); + psh.setStopTimeout(-1999); //hack: по-умолчанию в Apache Exec добавляется еще 2000L милисекунд + executor.setStreamHandler(psh); int resultCode = 0; try { diff --git a/zond/src/main/java/org/apache/commons/exec/StreamPumper.java b/zond/src/main/java/org/apache/commons/exec/StreamPumper.java new file mode 100644 index 0000000..b50bc13 --- /dev/null +++ b/zond/src/main/java/org/apache/commons/exec/StreamPumper.java @@ -0,0 +1,152 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.commons.exec; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import org.apache.commons.exec.util.DebugUtils; + +/** + * Copies all data from an input stream to an output stream. + * + * @version $Id: StreamPumper.java 1557263 2014-01-10 21:18:09Z ggregory $ + */ +public class StreamPumper implements Runnable { + + /** the default size of the internal buffer for copying the streams */ + private static final int DEFAULT_SIZE = 1024; + + /** the input stream to pump from */ + private final InputStream is; + + /** the output stream to pmp into */ + private final OutputStream os; + + /** the size of the internal buffer for copying the streams */ + private final int size; + + /** was the end of the stream reached */ + private boolean finished; + + /** close the output stream when exhausted */ + private final boolean closeWhenExhausted; + + /** + * Create a new stream pumper. + * + * @param is input stream to read data from + * @param os output stream to write data to. + * @param closeWhenExhausted if true, the output stream will be closed when the input is exhausted. + */ + public StreamPumper(final InputStream is, final OutputStream os, + final boolean closeWhenExhausted) { + this.is = is; + this.os = os; + this.size = DEFAULT_SIZE; + this.closeWhenExhausted = closeWhenExhausted; + } + + /** + * Create a new stream pumper. + * + * @param is input stream to read data from + * @param os output stream to write data to. + * @param closeWhenExhausted if true, the output stream will be closed when the input is exhausted. + * @param size the size of the internal buffer for copying the streams + */ + public StreamPumper(final InputStream is, final OutputStream os, + final boolean closeWhenExhausted, final int size) { + this.is = is; + this.os = os; + this.size = size > 0 ? size : DEFAULT_SIZE; + this.closeWhenExhausted = closeWhenExhausted; + } + + /** + * Create a new stream pumper. + * + * @param is input stream to read data from + * @param os output stream to write data to. + */ + public StreamPumper(final InputStream is, final OutputStream os) { + this(is, os, false); + } + + /** + * Copies data from the input stream to the output stream. Terminates as + * soon as the input stream is closed or an error occurs. + */ + public void run() { + synchronized (this) { + // Just in case this object is reused in the future + finished = false; + } + + final byte[] buf = new byte[this.size]; + + int length; + try { + //hack: пропатчили алгоритм + while (!Thread.currentThread().isInterrupted() && (length = is.read(buf)) > 0) { + os.write(buf, 0, length); + os.flush(); + } + } catch (final Exception e) { + // nothing to do - happens quite often with watchdog + } finally { + if (closeWhenExhausted) { + try { + os.close(); + } catch (final IOException e) { + final String msg = "Got exception while closing exhausted output stream"; + DebugUtils.handleException(msg ,e); + } + } + synchronized (this) { + finished = true; + notifyAll(); + } + } + } + + /** + * Tells whether the end of the stream has been reached. + * + * @return true is the stream has been exhausted. + */ + public synchronized boolean isFinished() { + return finished; + } + + /** + * This method blocks until the stream pumper finishes. + * + * @exception InterruptedException + * if any thread interrupted the current thread before or while the current thread was waiting for a + * notification. + * @see #isFinished() + */ + public synchronized void waitFor() throws InterruptedException { + while (!isFinished()) { + wait(); + } + } +} From e44b1fd9004d9d193d72625e5233f8b5d241ca37 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 10 Jun 2017 15:19:09 +0300 Subject: [PATCH 09/73] =?UTF-8?q?Zond:=20=D0=BD=D0=B0=D0=B2=D0=BE=D0=B4?= =?UTF-8?q?=D0=B8=D0=BC=20=D0=BF=D0=BE=D1=80=D1=8F=D0=B4=D0=BE=D0=BA=20?= =?UTF-8?q?=D0=B2=20=D0=BA=D0=BE=D0=B4=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/src/main/java/asys/zond/Main.java | 32 +++++++++++++++++--------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/zond/src/main/java/asys/zond/Main.java b/zond/src/main/java/asys/zond/Main.java index de47ea2..ed15b30 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -30,15 +30,28 @@ public class Main { private static ScheduledFuture sesFuture; private static int tryConnect = 0; + private static void printLogo() { + System.out.println( + Ansi.ansi().reset() + .bold().fg(Color.WHITE).a("ASys").boldOff().a(":// ") + .fg(Color.BLACK).bg(Color.RED).a("Zond").reset().newline() + ); + } + + public static void log(String message){ + System.out.println( + Ansi.ansi().reset() + .bg(Color.BLUE).fg(Color.WHITE).a("[ASys Zond] ") + .a(message).reset() + ); + } + public static void main(String[] args) throws IOException { if (Boolean.getBoolean("ansi.install")) { AnsiConsole.systemInstall(); } - Ansi ansi = ansi().reset(); - ansi.bold().fg(Color.WHITE).a("ASys").boldOff().a(":// "); - ansi.fg(Color.BLACK).bg(Color.RED).a("Zond").reset().newline(); - System.out.println(ansi.toString()); + printLogo(); if (args.length == 0) { System.out.println("no args"); @@ -55,9 +68,11 @@ public class Main { ses.shutdown(); client.disconnect(); - System.out.print(ansi().reset().newline() + System.out.println( + Ansi.ansi().reset().newline() .fg(Color.GREEN).a("Process Finished. Code: ") - .bold().fg(Color.WHITE).a(resultCode).reset().newline()); + .bold().fg(Color.WHITE).a(resultCode).reset() + ); } private static int executeProcess(String[] args) { @@ -103,11 +118,6 @@ public class Main { fis.close(); } - public static void log(String message){ - System.out.println(Ansi.ansi().bg(Color.BLUE).fg(Color.WHITE) - .a("[ASys Zond] ").a(message).reset()); - } - public static void startReconnect() { client = new Client(); ses = Executors.newScheduledThreadPool(2); From 811ae71d844cc76958730597865e519ec19f4d10 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 14 Jun 2017 02:10:09 +0300 Subject: [PATCH 10/73] =?UTF-8?q?Zond:=20=D0=BF=D0=BE=D0=BF=D1=8B=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=B8=20=D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=BD=D0=BE=D0=B9=20?= =?UTF-8?q?=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=BE=D0=BD=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=BF=D0=BB=D0=B0=D0=B3=D0=B8=D0=BD=D0=B0=20=D0=BD=D0=B0=20"?= =?UTF-8?q?=D0=B7=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; + } + } + } +} From 6d0ada1af3b138043dc937cdfd68a22f3ce2d88f Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 14 Jun 2017 11:26:08 +0300 Subject: [PATCH 11/73] =?UTF-8?q?Zond:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D1=8F=D0=B5=D0=BC=20JLine?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 3 +- .../main/java/asys/zond/JlineProxySysOut.java | 58 +++++++++++++++++++ zond/src/main/java/asys/zond/Main.java | 48 +++++++++++---- 3 files changed, 98 insertions(+), 11 deletions(-) create mode 100644 zond/src/main/java/asys/zond/JlineProxySysOut.java diff --git a/zond/build.gradle b/zond/build.gradle index 82c85d3..a294e94 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.5.6-SNAPSHOT' +version = '0.6-SNAPSHOT' apply plugin: 'application' @@ -46,4 +46,5 @@ dependencies { includedEx group: 'org.apache.commons', name: 'commons-exec', version: '1.3' included group: 'io.netty', name: 'netty-codec', version: nettyVersion included group: 'com.google.guava', name: 'guava', version: '21.0' + included group: 'jline', name: 'jline', version: '2.13' } diff --git a/zond/src/main/java/asys/zond/JlineProxySysOut.java b/zond/src/main/java/asys/zond/JlineProxySysOut.java new file mode 100644 index 0000000..d43470a --- /dev/null +++ b/zond/src/main/java/asys/zond/JlineProxySysOut.java @@ -0,0 +1,58 @@ +/* + * DmitriyMX + * 2017-06-14 + */ +package asys.zond; + +import jline.console.ConsoleReader; + +import java.io.*; + +public class JlineProxySysOut extends PrintStream { + private ConsoleReader consoleReader; + private PrintWriter writer; + + public JlineProxySysOut(OutputStream out) { + super(out, true); + } + + public void setConsoleReader(ConsoleReader consoleReader) { + this.consoleReader = consoleReader; + this.writer = new PrintWriter(consoleReader.getOutput()); + } + + private void _print(String s) { + writer.print(ConsoleReader.RESET_LINE); + writer.print(s); + cleanTrashLine(s); + writer.println(); + try { + consoleReader.drawLine(); + } catch (IOException ignore) { + } + writer.flush(); + } + + /** + * Очистка печатной строки от мусора + */ + private void cleanTrashLine(String string) { + // очищает полностью строку + if (consoleReader.getCursorBuffer().buffer.length() + consoleReader.getPrompt().length() > string.length()) { + for (int i = string.length(); i <= consoleReader.getCursorBuffer().buffer.length() + 2; i++) { + writer.print(' '); + } + } + } + + @Override + public void write(byte[] buf, int off, int len) { + if ((char)buf[len-1] == '\n') len--; //TODO проверить в windows + _print(new String(buf, off, len)); + } + + @Override + public void println(String x) { + _print(x); + } +} diff --git a/zond/src/main/java/asys/zond/Main.java b/zond/src/main/java/asys/zond/Main.java index 9d98f1e..612b769 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -6,6 +6,7 @@ package asys.zond; import asys.zond.proxy.Connector; +import jline.console.ConsoleReader; import org.apache.commons.exec.CommandLine; import org.apache.commons.exec.DefaultExecutor; import org.apache.commons.exec.ExecuteException; @@ -49,19 +50,46 @@ public class Main { } loadConfig(); - Connector.getInstance().startReconnect(); - int resultCode = executeProcess(args); + JlineProxySysOut proxySysOut = new JlineProxySysOut(System.out); + ConsoleReader console = new ConsoleReader(System.in, proxySysOut); + proxySysOut.setConsoleReader(console); + console.setPrompt(ConsoleReader.RESET_LINE + ":"); + Thread thread = new Thread(() -> { + Thread current = Thread.currentThread(); - Connector.getInstance().setNeedReconnect(false); - Connector.getInstance().stopReconnect(); - Connector.getInstance().disconnect(); + try { + while (!current.isInterrupted()) { + String line; + if ((line = console.readLine()) != null) { + proxySysOut.println(line); + } + } + } catch (Exception e) { + e.printStackTrace(); //FIXME + } + }); + try { + thread.join(); + thread.start(); + } catch (Exception e) { + e.printStackTrace();//FIXME + } - System.out.println( - Ansi.ansi().reset().newline() - .fg(Color.GREEN).a("Process Finished. Code: ") - .bold().fg(Color.WHITE).a(resultCode).reset() - ); + +// Connector.getInstance().startReconnect(); + +// int resultCode = executeProcess(args); + +// Connector.getInstance().setNeedReconnect(false); +// Connector.getInstance().stopReconnect(); +// Connector.getInstance().disconnect(); + +// System.out.println( +// Ansi.ansi().reset().newline() +// .fg(Color.GREEN).a("Process Finished. Code: ") +// .bold().fg(Color.WHITE).a(resultCode).reset() +// ); } private static int executeProcess(String[] args) { From 97b83815d2e7379a7f2904a0c37bcbf0888bc185 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 14 Jun 2017 14:59:16 +0300 Subject: [PATCH 12/73] =?UTF-8?q?Zond:=20=D0=BC=D0=BE=D0=B4=D0=B8=D1=84?= =?UTF-8?q?=D0=B8=D1=86=D0=B8=D1=80=D1=83=D0=B5=D0=BC=20ProxyStdIn?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 2 +- .../main/java/asys/zond/JlineProxySysIn.java | 88 +++++++++++++++++++ zond/src/main/java/asys/zond/Main.java | 38 ++++---- 3 files changed, 112 insertions(+), 16 deletions(-) create mode 100644 zond/src/main/java/asys/zond/JlineProxySysIn.java diff --git a/zond/build.gradle b/zond/build.gradle index a294e94..67f0c9d 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.6-SNAPSHOT' +version = '0.6.7-SNAPSHOT' apply plugin: 'application' diff --git a/zond/src/main/java/asys/zond/JlineProxySysIn.java b/zond/src/main/java/asys/zond/JlineProxySysIn.java new file mode 100644 index 0000000..5fb6963 --- /dev/null +++ b/zond/src/main/java/asys/zond/JlineProxySysIn.java @@ -0,0 +1,88 @@ +/* + * DmitriyMX + * 2017-06-14 + */ +package asys.zond; + +import java.io.IOException; +import java.io.InputStream; + +public class JlineProxySysIn extends InputStream { + private byte[] buffer = new byte[15]; + private int lastWritePos = 0, + lastReadPos = 0, + wallPos = buffer.length-1; + + public synchronized void write(String s) { + byte[] strBytes = s.getBytes(); + + while ((lastWritePos < lastReadPos) && ((lastReadPos - lastWritePos) >= strBytes.length)) { + try { + wait(); + } catch (InterruptedException e) { + return; + } + } + + if ((lastWritePos + strBytes.length) >= 1024) { + wallPos = lastWritePos; + lastWritePos = 0; + } + + System.arraycopy(strBytes, 0, this.buffer, lastWritePos, strBytes.length); + lastWritePos += strBytes.length; + notify(); + } + + @Override + public synchronized int read() throws IOException { + if (lastReadPos == lastWritePos) { + try { + wait(); + } catch (InterruptedException ignore) { + return 0; + } + } + + if (lastReadPos == wallPos) { + lastReadPos = 0; + } + + return this.buffer[lastReadPos++]; + } + + @Override + public int read(byte[] b) throws IOException { + return this.read(b, 0, b.length); + } + + @Override + public synchronized int read(byte[] buffOut, int off, int len) throws IOException { + if (lastReadPos == lastWritePos) { + try { + wait(); + } catch (InterruptedException ignore) { + return 0; + } + } + int actualLen = len; + + if (lastReadPos > lastWritePos) { + if ((lastReadPos + len) > wallPos) { + actualLen = (wallPos - lastReadPos); + } + } else { + if ((lastReadPos + len) > lastWritePos) { + actualLen = (lastWritePos - lastReadPos); + } + } + + System.arraycopy(this.buffer, lastReadPos, buffOut, off, actualLen); + lastReadPos += actualLen; + if (lastReadPos == wallPos) { + lastReadPos = 0; + } + notify(); + return actualLen; + } +} diff --git a/zond/src/main/java/asys/zond/Main.java b/zond/src/main/java/asys/zond/Main.java index 612b769..f86ee40 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -7,10 +7,7 @@ package asys.zond; import asys.zond.proxy.Connector; import jline.console.ConsoleReader; -import org.apache.commons.exec.CommandLine; -import org.apache.commons.exec.DefaultExecutor; -import org.apache.commons.exec.ExecuteException; -import org.apache.commons.exec.PumpStreamHandler; +import org.apache.commons.exec.*; import org.fusesource.jansi.Ansi; import org.fusesource.jansi.Ansi.Color; import org.fusesource.jansi.AnsiConsole; @@ -52,9 +49,11 @@ public class Main { loadConfig(); JlineProxySysOut proxySysOut = new JlineProxySysOut(System.out); + JlineProxySysIn proxySysIn = new JlineProxySysIn(); ConsoleReader console = new ConsoleReader(System.in, proxySysOut); proxySysOut.setConsoleReader(console); console.setPrompt(ConsoleReader.RESET_LINE + ":"); + Thread thread = new Thread(() -> { Thread current = Thread.currentThread(); @@ -62,7 +61,12 @@ public class Main { while (!current.isInterrupted()) { String line; if ((line = console.readLine()) != null) { - proxySysOut.println(line); + if (line.equalsIgnoreCase(":exit")) { + proxySysOut.println("force exit"); + watchdog.destroyProcess(); + break; + } + proxySysIn.write(line+"\r\n"); } } } catch (Exception e) { @@ -79,30 +83,34 @@ public class Main { // Connector.getInstance().startReconnect(); -// int resultCode = executeProcess(args); + int resultCode = executeProcess(args, proxySysOut, proxySysIn); // Connector.getInstance().setNeedReconnect(false); // Connector.getInstance().stopReconnect(); // Connector.getInstance().disconnect(); -// System.out.println( -// Ansi.ansi().reset().newline() -// .fg(Color.GREEN).a("Process Finished. Code: ") -// .bold().fg(Color.WHITE).a(resultCode).reset() -// ); + System.out.println( + Ansi.ansi().reset().newline() + .fg(Color.GREEN).a("Process Finished. Code: ") + .bold().fg(Color.WHITE).a(resultCode).reset() + ); } - private static int executeProcess(String[] args) { + private static ExecuteWatchdog watchdog; + private static int executeProcess(String[] args, PrintStream printStream, InputStream stdin) throws IOException { String cmdLine = Arrays.stream(args).collect(Collectors.joining(" ")); CommandLine commandLine = CommandLine.parse(cmdLine); DefaultExecutor executor = new DefaultExecutor(); - PrintStream proxySysOut = new ProxySysOut(System.out); - InputStream proxySysIn = new ProxySysIn(); +// PrintStream proxySysOut = new ProxySysOut(System.out); +// InputStream proxySysIn = new ProxySysIn(); - PumpStreamHandler psh = new PumpStreamHandler(proxySysOut, proxySysOut, proxySysIn); +// PumpStreamHandler psh = new PumpStreamHandler(proxySysOut, proxySysOut, proxySysIn); + PumpStreamHandler psh = new PumpStreamHandler(printStream, printStream, stdin); psh.setStopTimeout(-1999); //hack: по-умолчанию в Apache Exec добавляется еще 2000L милисекунд executor.setStreamHandler(psh); + watchdog = new ExecuteWatchdog(ExecuteWatchdog.INFINITE_TIMEOUT); + executor.setWatchdog(watchdog); int resultCode = 0; try { From 4f9c4790a3450f5ea1e4c6aebb0721ffa00f955d Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 14 Jun 2017 15:27:42 +0300 Subject: [PATCH 13/73] =?UTF-8?q?Zond:=20=D0=B2=D0=B5=D1=80=D0=BD=D1=83?= =?UTF-8?q?=D0=BB=D0=B8=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=BE=D0=BD?= =?UTF-8?q?=D0=B0=D0=BB=20=D0=BA=D0=BE=D0=BD=D0=BD=D0=B5=D0=BA=D1=82=D0=B0?= =?UTF-8?q?=20=D0=BA=20=D0=B0=D1=81=D0=B8=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 2 +- zond/src/main/java/asys/zond/Main.java | 63 ++++++++------------------ 2 files changed, 19 insertions(+), 46 deletions(-) diff --git a/zond/build.gradle b/zond/build.gradle index 67f0c9d..01e88c6 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.6.7-SNAPSHOT' +version = '0.6.9-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 f86ee40..5f03951 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -17,6 +17,8 @@ import java.util.Arrays; import java.util.stream.Collectors; public class Main { + private static JlineProxySysOut proxySysOut; + private static void printLogo() { System.out.println( Ansi.ansi().reset() @@ -26,11 +28,14 @@ public class Main { } public static void log(String message){ - System.out.println( - Ansi.ansi().reset() + String msg = Ansi.ansi().reset() .bg(Color.BLUE).fg(Color.WHITE).a("[ASys Zond] ") - .a(message).reset() - ); + .a(message).reset().toString(); + if (proxySysOut != null) { + proxySysOut.println(msg); + } else { + System.out.println(msg); + } } public static void main(String[] args) throws IOException { @@ -48,7 +53,7 @@ public class Main { loadConfig(); - JlineProxySysOut proxySysOut = new JlineProxySysOut(System.out); + proxySysOut = new JlineProxySysOut(System.out); JlineProxySysIn proxySysIn = new JlineProxySysIn(); ConsoleReader console = new ConsoleReader(System.in, proxySysOut); proxySysOut.setConsoleReader(console); @@ -69,25 +74,26 @@ public class Main { proxySysIn.write(line+"\r\n"); } } - } catch (Exception e) { - e.printStackTrace(); //FIXME + } catch (Throwable ignore) { } }); try { - thread.join(); thread.start(); } catch (Exception e) { e.printStackTrace();//FIXME } -// Connector.getInstance().startReconnect(); + Connector.getInstance().startReconnect(); int resultCode = executeProcess(args, proxySysOut, proxySysIn); -// Connector.getInstance().setNeedReconnect(false); -// Connector.getInstance().stopReconnect(); -// Connector.getInstance().disconnect(); + Connector.getInstance().setNeedReconnect(false); + Connector.getInstance().stopReconnect(); + Connector.getInstance().disconnect(); + + thread.interrupt(); + console.shutdown(); System.out.println( Ansi.ansi().reset().newline() @@ -102,10 +108,6 @@ public class Main { CommandLine commandLine = CommandLine.parse(cmdLine); DefaultExecutor executor = new DefaultExecutor(); -// PrintStream proxySysOut = new ProxySysOut(System.out); -// InputStream proxySysIn = new ProxySysIn(); - -// PumpStreamHandler psh = new PumpStreamHandler(proxySysOut, proxySysOut, proxySysIn); PumpStreamHandler psh = new PumpStreamHandler(printStream, printStream, stdin); psh.setStopTimeout(-1999); //hack: по-умолчанию в Apache Exec добавляется еще 2000L милисекунд executor.setStreamHandler(psh); @@ -142,33 +144,4 @@ public class Main { Config.load(fis); fis.close(); } - - private static class ProxySysOut extends PrintStream { - ProxySysOut(OutputStream out) { - super(out); - } - - @Override - public void write(byte[] buf, int off, int len) { - super.write(buf, off, len); - Connector.getInstance().sendMessage(new String(buf, off, len)); - } - } - - private static class ProxySysIn extends InputStream { - @Override - public int read() throws IOException { - return System.in.read(); - } - - @Override - public int read(byte[] b) throws IOException { - return System.in.read(b); - } - - @Override - public int read(byte[] b, int off, int len) throws IOException { - return System.in.read(b, off, len); - } - } } From 52c5a739420ce67a1bd866dad75e2199af087c10 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 14 Jun 2017 16:41:14 +0300 Subject: [PATCH 14/73] =?UTF-8?q?Zond:=20=D0=B0=D0=BB=D0=B3=D0=BE=D1=80?= =?UTF-8?q?=D0=B8=D1=82=D0=BC=D1=8B=20=D1=81=20=D0=BA=D0=BE=D0=BC=D0=B0?= =?UTF-8?q?=D0=BD=D0=B4=D0=BD=D0=BE=D0=B9=20=D1=81=D1=82=D1=80=D0=BE=D0=BA?= =?UTF-8?q?=D0=BE=D0=B9=20=D0=B2=D1=8B=D0=B4=D0=B5=D0=BB=D0=B8=D0=BB=D0=B8?= =?UTF-8?q?=20=D0=B2=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20=D0=BF=D0=B0=D0=BA=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 2 +- zond/src/main/java/asys/zond/Main.java | 56 +++++----------- ...neProxySysIn.java => PipeInputStream.java} | 4 +- .../asys/zond/shell/CommandLineHandler.java | 9 +++ .../zond/{ => shell}/JlineProxySysOut.java | 2 +- zond/src/main/java/asys/zond/shell/Shell.java | 67 +++++++++++++++++++ 6 files changed, 96 insertions(+), 44 deletions(-) rename zond/src/main/java/asys/zond/{JlineProxySysIn.java => PipeInputStream.java} (95%) create mode 100644 zond/src/main/java/asys/zond/shell/CommandLineHandler.java rename zond/src/main/java/asys/zond/{ => shell}/JlineProxySysOut.java (98%) create mode 100644 zond/src/main/java/asys/zond/shell/Shell.java diff --git a/zond/build.gradle b/zond/build.gradle index 01e88c6..c86e4f8 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.6.9-SNAPSHOT' +version = '0.6.10-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 5f03951..e3cd6d3 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -6,7 +6,7 @@ package asys.zond; import asys.zond.proxy.Connector; -import jline.console.ConsoleReader; +import asys.zond.shell.Shell; import org.apache.commons.exec.*; import org.fusesource.jansi.Ansi; import org.fusesource.jansi.Ansi.Color; @@ -17,7 +17,7 @@ import java.util.Arrays; import java.util.stream.Collectors; public class Main { - private static JlineProxySysOut proxySysOut; + private static ExecuteWatchdog watchdog; private static void printLogo() { System.out.println( @@ -31,8 +31,8 @@ public class Main { String msg = Ansi.ansi().reset() .bg(Color.BLUE).fg(Color.WHITE).a("[ASys Zond] ") .a(message).reset().toString(); - if (proxySysOut != null) { - proxySysOut.println(msg); + if (Shell.getInstance().isActive()) { + Shell.getInstance().getOutput().println(msg); } else { System.out.println(msg); } @@ -53,56 +53,32 @@ public class Main { loadConfig(); - proxySysOut = new JlineProxySysOut(System.out); - JlineProxySysIn proxySysIn = new JlineProxySysIn(); - ConsoleReader console = new ConsoleReader(System.in, proxySysOut); - proxySysOut.setConsoleReader(console); - console.setPrompt(ConsoleReader.RESET_LINE + ":"); - - Thread thread = new Thread(() -> { - Thread current = Thread.currentThread(); - - try { - while (!current.isInterrupted()) { - String line; - if ((line = console.readLine()) != null) { - if (line.equalsIgnoreCase(":exit")) { - proxySysOut.println("force exit"); - watchdog.destroyProcess(); - break; - } - proxySysIn.write(line+"\r\n"); - } - } - } catch (Throwable ignore) { + PipeInputStream pipeInputStream = new PipeInputStream(); + Shell.getInstance().start(System.in, commandLine -> { + if (commandLine.equalsIgnoreCase(":exit")) { + Shell.getInstance().getOutput().println("force exit"); + watchdog.destroyProcess(); + Shell.getInstance().shutdown(); } + pipeInputStream.write(commandLine+"\r\n"); }); - try { - thread.start(); - } catch (Exception e) { - e.printStackTrace();//FIXME - } Connector.getInstance().startReconnect(); - int resultCode = executeProcess(args, proxySysOut, proxySysIn); + int resultCode = executeProcess(args, Shell.getInstance().getOutput(), pipeInputStream); Connector.getInstance().setNeedReconnect(false); Connector.getInstance().stopReconnect(); Connector.getInstance().disconnect(); - thread.interrupt(); - console.shutdown(); + Shell.getInstance().shutdown(); - System.out.println( - Ansi.ansi().reset().newline() - .fg(Color.GREEN).a("Process Finished. Code: ") - .bold().fg(Color.WHITE).a(resultCode).reset() - ); + System.out.println(Ansi.ansi().reset().newline() + .fg(Color.GREEN).a("Process Finished. Code: ") + .bold().fg(Color.WHITE).a(resultCode).reset()); } - private static ExecuteWatchdog watchdog; private static int executeProcess(String[] args, PrintStream printStream, InputStream stdin) throws IOException { String cmdLine = Arrays.stream(args).collect(Collectors.joining(" ")); CommandLine commandLine = CommandLine.parse(cmdLine); diff --git a/zond/src/main/java/asys/zond/JlineProxySysIn.java b/zond/src/main/java/asys/zond/PipeInputStream.java similarity index 95% rename from zond/src/main/java/asys/zond/JlineProxySysIn.java rename to zond/src/main/java/asys/zond/PipeInputStream.java index 5fb6963..5ea3ef4 100644 --- a/zond/src/main/java/asys/zond/JlineProxySysIn.java +++ b/zond/src/main/java/asys/zond/PipeInputStream.java @@ -7,8 +7,8 @@ package asys.zond; import java.io.IOException; import java.io.InputStream; -public class JlineProxySysIn extends InputStream { - private byte[] buffer = new byte[15]; +public class PipeInputStream extends InputStream { + private byte[] buffer = new byte[1024]; private int lastWritePos = 0, lastReadPos = 0, wallPos = buffer.length-1; diff --git a/zond/src/main/java/asys/zond/shell/CommandLineHandler.java b/zond/src/main/java/asys/zond/shell/CommandLineHandler.java new file mode 100644 index 0000000..fc1d7de --- /dev/null +++ b/zond/src/main/java/asys/zond/shell/CommandLineHandler.java @@ -0,0 +1,9 @@ +/* + * DmitriyMX + * 2017-06-14 + */ +package asys.zond.shell; + +public interface CommandLineHandler { + void handle(String commandLine); +} diff --git a/zond/src/main/java/asys/zond/JlineProxySysOut.java b/zond/src/main/java/asys/zond/shell/JlineProxySysOut.java similarity index 98% rename from zond/src/main/java/asys/zond/JlineProxySysOut.java rename to zond/src/main/java/asys/zond/shell/JlineProxySysOut.java index d43470a..49a164a 100644 --- a/zond/src/main/java/asys/zond/JlineProxySysOut.java +++ b/zond/src/main/java/asys/zond/shell/JlineProxySysOut.java @@ -2,7 +2,7 @@ * DmitriyMX * 2017-06-14 */ -package asys.zond; +package asys.zond.shell; import jline.console.ConsoleReader; diff --git a/zond/src/main/java/asys/zond/shell/Shell.java b/zond/src/main/java/asys/zond/shell/Shell.java new file mode 100644 index 0000000..c9ecbba --- /dev/null +++ b/zond/src/main/java/asys/zond/shell/Shell.java @@ -0,0 +1,67 @@ +/* + * DmitriyMX + * 2017-06-14 + */ +package asys.zond.shell; + +import jline.console.ConsoleReader; + +import java.io.*; + +public class Shell { + private static Shell instance = new Shell(); + private boolean active = false; + private ConsoleReader console; + private JlineProxySysOut proxySysOut; + private Thread threadCommandHandler; + + public static Shell getInstance() { + return instance; + } + + private Shell() { + } + + public void start(final InputStream inputStream, final CommandLineHandler commandLineHandler) throws IOException { + proxySysOut = new JlineProxySysOut(System.out); + console = new ConsoleReader(inputStream, proxySysOut); + proxySysOut.setConsoleReader(console); + console.setPrompt(ConsoleReader.RESET_LINE + ":"); + + threadCommandHandler = new Thread(() -> { + Thread current = Thread.currentThread(); + + try { + String line; + while (!current.isInterrupted() && ((line = console.readLine()) != null)) { + commandLineHandler.handle(line); + } + } catch (IOException ignore) { + } + + console.shutdown(); + }, "Shell: command handler"); + active = true; + threadCommandHandler.start(); + } + + public void shutdown() { + threadCommandHandler.interrupt(); + active = false; + } + + public JlineProxySysOut getOutput() { + return proxySysOut; + } + + public boolean isActive() { + return active; + } + + private void safeSleep() { + try { + Thread.sleep(1); + } catch (InterruptedException ignore) { + } + } +} From 349deaa837ee62c4b20fa3ff535c64dc601f3fc1 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 14 Jun 2017 17:39:48 +0300 Subject: [PATCH 15/73] =?UTF-8?q?Zond:=20=D0=BD=D0=B5=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=BA=D0=BE=20=D1=84=D0=B8=D0=BA=D1=81=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 2 +- zond/src/main/java/asys/zond/Main.java | 28 +++++++++------ .../main/java/asys/zond/proxy/Connector.java | 8 ++--- .../asys/zond/shell/JlineProxySysOut.java | 34 ++++++++++++++++--- zond/src/main/java/asys/zond/shell/Shell.java | 2 ++ 5 files changed, 53 insertions(+), 21 deletions(-) diff --git a/zond/build.gradle b/zond/build.gradle index c86e4f8..030c805 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.6.10-SNAPSHOT' +version = '0.6.11-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 e3cd6d3..af901fb 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -57,8 +57,10 @@ public class Main { Shell.getInstance().start(System.in, commandLine -> { if (commandLine.equalsIgnoreCase(":exit")) { Shell.getInstance().getOutput().println("force exit"); - watchdog.destroyProcess(); +// watchdog.destroyProcess(); Shell.getInstance().shutdown(); + Main.shutdown(); + return; } pipeInputStream.write(commandLine+"\r\n"); }); @@ -66,17 +68,15 @@ public class Main { Connector.getInstance().startReconnect(); - int resultCode = executeProcess(args, Shell.getInstance().getOutput(), pipeInputStream); +// int resultCode = executeProcess(args, Shell.getInstance().getOutput(), pipeInputStream); - Connector.getInstance().setNeedReconnect(false); - Connector.getInstance().stopReconnect(); - Connector.getInstance().disconnect(); - - Shell.getInstance().shutdown(); - - System.out.println(Ansi.ansi().reset().newline() - .fg(Color.GREEN).a("Process Finished. Code: ") - .bold().fg(Color.WHITE).a(resultCode).reset()); +// Shell.getInstance().shutdown(); +// +// +// int resultCode = -2; +// System.out.println(Ansi.ansi().reset().newline() +// .fg(Color.GREEN).a("Process Finished. Code: ") +// .bold().fg(Color.WHITE).a(resultCode).reset()); } private static int executeProcess(String[] args, PrintStream printStream, InputStream stdin) throws IOException { @@ -120,4 +120,10 @@ public class Main { Config.load(fis); fis.close(); } + + private static void shutdown() { + Connector.getInstance().setNeedReconnect(false); + Connector.getInstance().stopReconnect(); + Connector.getInstance().shutdown(); + } } diff --git a/zond/src/main/java/asys/zond/proxy/Connector.java b/zond/src/main/java/asys/zond/proxy/Connector.java index 7827d49..e41a25b 100644 --- a/zond/src/main/java/asys/zond/proxy/Connector.java +++ b/zond/src/main/java/asys/zond/proxy/Connector.java @@ -54,11 +54,9 @@ public class Connector { } } - public void disconnect() { - if (client.isConnected()) { - log("Disconnect..."); - client.disconnect(); - } + public void shutdown() { + log("Disconnect..."); + client.disconnect(); } public void setChannel(Channel channel) { diff --git a/zond/src/main/java/asys/zond/shell/JlineProxySysOut.java b/zond/src/main/java/asys/zond/shell/JlineProxySysOut.java index 49a164a..2ead4a6 100644 --- a/zond/src/main/java/asys/zond/shell/JlineProxySysOut.java +++ b/zond/src/main/java/asys/zond/shell/JlineProxySysOut.java @@ -18,7 +18,16 @@ public class JlineProxySysOut extends PrintStream { public void setConsoleReader(ConsoleReader consoleReader) { this.consoleReader = consoleReader; - this.writer = new PrintWriter(consoleReader.getOutput()); + if (consoleReader != null) { + this.writer = new PrintWriter(consoleReader.getOutput()); + } else { + try { + super.out.write('\r'); + super.out.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + } } private void _print(String s) { @@ -47,12 +56,29 @@ public class JlineProxySysOut extends PrintStream { @Override public void write(byte[] buf, int off, int len) { - if ((char)buf[len-1] == '\n') len--; //TODO проверить в windows - _print(new String(buf, off, len)); + if (consoleReader != null) { + if ((char) buf[len - 1] == '\n') len--; //TODO проверить в windows + _print(new String(buf, off, len)); + } else { + super.write(buf, off, len); + } + } + + @Override + public void print(String x) { + if (consoleReader != null) { + _print(x); + } else { + super.print(x); + } } @Override public void println(String x) { - _print(x); + if (consoleReader != null) { + _print(x); + } else { + super.println(x); + } } } diff --git a/zond/src/main/java/asys/zond/shell/Shell.java b/zond/src/main/java/asys/zond/shell/Shell.java index c9ecbba..0809ca3 100644 --- a/zond/src/main/java/asys/zond/shell/Shell.java +++ b/zond/src/main/java/asys/zond/shell/Shell.java @@ -5,6 +5,7 @@ package asys.zond.shell; import jline.console.ConsoleReader; +import jline.internal.Ansi; import java.io.*; @@ -48,6 +49,7 @@ public class Shell { public void shutdown() { threadCommandHandler.interrupt(); active = false; + proxySysOut.setConsoleReader(null); } public JlineProxySysOut getOutput() { From 915e612862995e4e3d2523d0e9d489fca6a19854 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 14 Jun 2017 17:43:00 +0300 Subject: [PATCH 16/73] =?UTF-8?q?Zond:=20=D0=BD=D0=B5=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=BA=D0=BE=20=D1=84=D0=B8=D0=BA=D1=81=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 2 +- zond/src/main/java/asys/zond/Main.java | 15 +++++---------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/zond/build.gradle b/zond/build.gradle index 030c805..6c3b453 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.6.11-SNAPSHOT' +version = '0.6.12-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 af901fb..182632f 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -57,7 +57,7 @@ public class Main { Shell.getInstance().start(System.in, commandLine -> { if (commandLine.equalsIgnoreCase(":exit")) { Shell.getInstance().getOutput().println("force exit"); -// watchdog.destroyProcess(); + watchdog.destroyProcess(); Shell.getInstance().shutdown(); Main.shutdown(); return; @@ -65,18 +65,13 @@ public class Main { pipeInputStream.write(commandLine+"\r\n"); }); - Connector.getInstance().startReconnect(); -// int resultCode = executeProcess(args, Shell.getInstance().getOutput(), pipeInputStream); + int resultCode = executeProcess(args, Shell.getInstance().getOutput(), pipeInputStream); -// Shell.getInstance().shutdown(); -// -// -// int resultCode = -2; -// System.out.println(Ansi.ansi().reset().newline() -// .fg(Color.GREEN).a("Process Finished. Code: ") -// .bold().fg(Color.WHITE).a(resultCode).reset()); + System.out.println(Ansi.ansi().reset().newline() + .fg(Color.GREEN).a("Process Finished. Code: ") + .bold().fg(Color.WHITE).a(resultCode).reset()); } private static int executeProcess(String[] args, PrintStream printStream, InputStream stdin) throws IOException { From 07a4324a28d6fd46262f465b7bdd8b1f43688c7f Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 14 Jun 2017 18:02:27 +0300 Subject: [PATCH 17/73] =?UTF-8?q?Zond:=20=D0=BD=D0=B5=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=BA=D0=BE=20=D1=84=D0=B8=D0=BA=D1=81=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 2 +- zond/src/main/java/asys/zond/Main.java | 15 +++++---------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/zond/build.gradle b/zond/build.gradle index 6c3b453..64b24b6 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.6.12-SNAPSHOT' +version = '0.6.13-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 182632f..b6db385 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -56,7 +56,7 @@ public class Main { PipeInputStream pipeInputStream = new PipeInputStream(); Shell.getInstance().start(System.in, commandLine -> { if (commandLine.equalsIgnoreCase(":exit")) { - Shell.getInstance().getOutput().println("force exit"); + log("force exit"); watchdog.destroyProcess(); Shell.getInstance().shutdown(); Main.shutdown(); @@ -64,17 +64,11 @@ public class Main { } pipeInputStream.write(commandLine+"\r\n"); }); - Connector.getInstance().startReconnect(); - - int resultCode = executeProcess(args, Shell.getInstance().getOutput(), pipeInputStream); - - System.out.println(Ansi.ansi().reset().newline() - .fg(Color.GREEN).a("Process Finished. Code: ") - .bold().fg(Color.WHITE).a(resultCode).reset()); + executeProcess(args, Shell.getInstance().getOutput(), pipeInputStream); } - private static int executeProcess(String[] args, PrintStream printStream, InputStream stdin) throws IOException { + private static void executeProcess(String[] args, PrintStream printStream, InputStream stdin) throws IOException { String cmdLine = Arrays.stream(args).collect(Collectors.joining(" ")); CommandLine commandLine = CommandLine.parse(cmdLine); DefaultExecutor executor = new DefaultExecutor(); @@ -94,7 +88,8 @@ public class Main { resultCode = -1; } - return resultCode; + watchdog = null; + log("Process finished. Code: " + resultCode); } private static void loadConfig() throws IOException { From 2c442924652d9e1deb87067e3c330502c789dbfd Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 14 Jun 2017 22:33:35 +0300 Subject: [PATCH 18/73] =?UTF-8?q?MCSM:Webconsole:=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=D1=81=20=D1=81=D1=82=D1=80=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mcserver-manager/src/main/resources/moduleStyle.css | 1 + 1 file changed, 1 insertion(+) diff --git a/mcserver-manager/src/main/resources/moduleStyle.css b/mcserver-manager/src/main/resources/moduleStyle.css index 063e814..2a9fd62 100644 --- a/mcserver-manager/src/main/resources/moduleStyle.css +++ b/mcserver-manager/src/main/resources/moduleStyle.css @@ -23,6 +23,7 @@ #webconsole .output .wrapper .content p { margin: 0; + word-wrap: break-word; } #webconsole .output .scroll { From 89ba10ebec4bfff2aec25690aefe71aa8559bf6b Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 14 Jun 2017 22:34:08 +0300 Subject: [PATCH 19/73] =?UTF-8?q?Zond:=20=D0=BC=D1=83=D0=BB=D1=8C=D1=82?= =?UTF-8?q?=D0=B8=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B8=20=D0=B4=D1=80=D0=BE?= =?UTF-8?q?=D0=B1=D0=B8=D1=82=20=D0=BD=D0=B0=20=D0=BE=D1=82=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5=20=D0=BF=D0=B0=D0=BA=D0=B5=D1=82?= =?UTF-8?q?=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 2 +- zond/src/main/java/asys/zond/shell/JlineProxySysOut.java | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/zond/build.gradle b/zond/build.gradle index a294e94..887f6d1 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.6-SNAPSHOT' +version = '0.6.1-SNAPSHOT' apply plugin: 'application' diff --git a/zond/src/main/java/asys/zond/shell/JlineProxySysOut.java b/zond/src/main/java/asys/zond/shell/JlineProxySysOut.java index 2ead4a6..bb74802 100644 --- a/zond/src/main/java/asys/zond/shell/JlineProxySysOut.java +++ b/zond/src/main/java/asys/zond/shell/JlineProxySysOut.java @@ -4,6 +4,7 @@ */ package asys.zond.shell; +import asys.zond.proxy.Connector; import jline.console.ConsoleReader; import java.io.*; @@ -40,6 +41,10 @@ public class JlineProxySysOut extends PrintStream { } catch (IOException ignore) { } writer.flush(); + + for (String l : s.split("\n")) { + Connector.getInstance().sendMessage(l); + } } /** From 42d986c66daecd2f4ade15fe0f246dbab0051769 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 14 Jun 2017 22:42:36 +0300 Subject: [PATCH 20/73] =?UTF-8?q?MCSM:Webconsole:=20=D0=BE=D0=BA=D1=80?= =?UTF-8?q?=D0=B0=D1=88=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=BA=20=D0=B2=20=D1=81=D0=BE=D0=BE=D1=82=D0=B2?= =?UTF-8?q?=D0=B5=D1=82=D1=81=D1=82=D0=B2=D0=B8=D0=B8=20=D1=81=D0=BE=20?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D1=82=D1=83=D1=81=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ошибки в красный фон, предупреждения - желтый --- mcserver-manager/build.gradle | 2 +- mcserver-manager/src/main/resources/components.js | 5 ++++- mcserver-manager/src/main/resources/moduleStyle.css | 8 ++++++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/mcserver-manager/build.gradle b/mcserver-manager/build.gradle index 3471b72..0fdb140 100644 --- a/mcserver-manager/build.gradle +++ b/mcserver-manager/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.10.4-SNAPSHOT' +version = '0.10.5-SNAPSHOT' apply plugin: 'osgi' diff --git a/mcserver-manager/src/main/resources/components.js b/mcserver-manager/src/main/resources/components.js index f07bea5..ae8a9b1 100644 --- a/mcserver-manager/src/main/resources/components.js +++ b/mcserver-manager/src/main/resources/components.js @@ -199,7 +199,10 @@ var WebConsole = React.createClass({ ce('div', {id: 'webconsole'}, ce(ScrollingContent, {className: 'output'}, this.state.lines.map(function(line){ - return ce('p', {dangerouslySetInnerHTML: {__html: ansi_up.ansi_to_html(line)}}); + var clazz = ""; + if (line.indexOf('ERROR') !== -1) { clazz = "error"; } + else if (line.indexOf('WARN') !== -1) { clazz = "warn"; } + return ce('p', {className: clazz, dangerouslySetInnerHTML: {__html: ansi_up.ansi_to_html(line)}}); }) ), ce('input', {ref: 'input', 'onKeyPress': this.handleKeyInput}) diff --git a/mcserver-manager/src/main/resources/moduleStyle.css b/mcserver-manager/src/main/resources/moduleStyle.css index 2a9fd62..621d064 100644 --- a/mcserver-manager/src/main/resources/moduleStyle.css +++ b/mcserver-manager/src/main/resources/moduleStyle.css @@ -26,6 +26,14 @@ word-wrap: break-word; } +#webconsole .output .wrapper .content p.error { + background-color: rgba(255,0,0,0.4); +} + +#webconsole .output .wrapper .content p.warn { + background-color: rgba(255,200,0,0.3); +} + #webconsole .output .scroll { width: 9px; background: #f00; From 290245970322e84c21c9390c9d37008416fa3161 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 14 Jun 2017 23:11:06 +0300 Subject: [PATCH 21/73] =?UTF-8?q?MCSM:Webconsole:=20=D0=B7=D0=B0=D1=82?= =?UTF-8?q?=D0=B5=D0=BD=D0=B5=D0=B8=D0=B5=20=D0=B2=D0=B5=D1=80=D1=85=D0=BD?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=B8=20=D0=BD=D0=B8=D0=B6=D0=BD=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=B3=D1=80=D0=B0=D0=BD=D0=B8=D1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mcserver-manager/build.gradle | 2 +- .../src/main/resources/moduleStyle.css | 26 ++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/mcserver-manager/build.gradle b/mcserver-manager/build.gradle index 0fdb140..1c6657f 100644 --- a/mcserver-manager/build.gradle +++ b/mcserver-manager/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.10.5-SNAPSHOT' +version = '0.10.6-SNAPSHOT' apply plugin: 'osgi' diff --git a/mcserver-manager/src/main/resources/moduleStyle.css b/mcserver-manager/src/main/resources/moduleStyle.css index 621d064..e7a15b0 100644 --- a/mcserver-manager/src/main/resources/moduleStyle.css +++ b/mcserver-manager/src/main/resources/moduleStyle.css @@ -3,7 +3,7 @@ color: #eee; min-height: 500px; height: 1px; - padding: 8px; + padding: 0 8px 0 8px; font-family: monospace; position: relative; } @@ -13,12 +13,35 @@ height: 100%; } +#webconsole .output .wrapper::before { + content: ''; + position: absolute; + z-index: 1; + top: 0; + left: 0; + right: 0; + height: 5%; + background: linear-gradient(#1e1e1e 0%, rgba(30,30,30,0) 100%); +} + +#webconsole .output .wrapper::after { + content: ''; + position: absolute; + z-index: 1; + bottom: 0; + left: 0; + right: 0; + height: 5%; + background: linear-gradient(rgba(30,30,30,0) 0%, #1e1e1e 100%); +} + #webconsole .output .wrapper .content { overflow: auto; height: 100%; position: relative; right: -18px; margin-left: -18px; + padding: 8px 0 8px 0; } #webconsole .output .wrapper .content p { @@ -43,6 +66,7 @@ cursor: -webkit-grab; cursor: -moz-grab; right: 0; + z-index: 1; } .scroll-grabbed, From 82fcdcdfe8a1a190174d9abcb1ff0aba820bb39b Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 15 Jun 2017 15:02:22 +0300 Subject: [PATCH 22/73] Zond: clear --- zond/src/main/java/asys/zond/Config.java | 35 ---- zond/src/main/java/asys/zond/Main.java | 109 +------------ .../main/java/asys/zond/PipeInputStream.java | 88 ---------- .../src/main/java/asys/zond/proxy/Client.java | 63 -------- .../asys/zond/proxy/ClientPacketHandler.java | 82 ---------- .../main/java/asys/zond/proxy/Connector.java | 72 --------- .../main/java/asys/zond/proxy/TaskTicker.java | 48 ------ .../asys/zond/shell/CommandLineHandler.java | 9 -- .../asys/zond/shell/JlineProxySysOut.java | 89 ---------- zond/src/main/java/asys/zond/shell/Shell.java | 69 -------- .../org/apache/commons/exec/StreamPumper.java | 152 ------------------ zond/src/main/resources/zond.properties | 4 - 12 files changed, 1 insertion(+), 819 deletions(-) delete mode 100644 zond/src/main/java/asys/zond/Config.java delete mode 100644 zond/src/main/java/asys/zond/PipeInputStream.java delete mode 100644 zond/src/main/java/asys/zond/proxy/Client.java delete mode 100644 zond/src/main/java/asys/zond/proxy/ClientPacketHandler.java delete mode 100644 zond/src/main/java/asys/zond/proxy/Connector.java delete mode 100644 zond/src/main/java/asys/zond/proxy/TaskTicker.java delete mode 100644 zond/src/main/java/asys/zond/shell/CommandLineHandler.java delete mode 100644 zond/src/main/java/asys/zond/shell/JlineProxySysOut.java delete mode 100644 zond/src/main/java/asys/zond/shell/Shell.java delete mode 100644 zond/src/main/java/org/apache/commons/exec/StreamPumper.java delete mode 100644 zond/src/main/resources/zond.properties diff --git a/zond/src/main/java/asys/zond/Config.java b/zond/src/main/java/asys/zond/Config.java deleted file mode 100644 index b3092e1..0000000 --- a/zond/src/main/java/asys/zond/Config.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * DmitriyMX - * 2017-06-08 - */ -package asys.zond; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Properties; - -public class Config { - private static Properties properties = new Properties(); - - private Config(){ - } - - public static void load(InputStream inputStream) throws IOException { - properties.load(inputStream); - if (properties.size() == 0) { - throw new IOException("Config empty!"); - } - } - - public static String getString(String key) { - return properties.getProperty(key); - } - - public static int getInt(String key) { - try { - return Integer.parseInt(properties.getProperty(key)); - } catch (NumberFormatException e) { - return 0; - } - } -} diff --git a/zond/src/main/java/asys/zond/Main.java b/zond/src/main/java/asys/zond/Main.java index b6db385..e73e088 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -5,115 +5,8 @@ */ package asys.zond; -import asys.zond.proxy.Connector; -import asys.zond.shell.Shell; -import org.apache.commons.exec.*; -import org.fusesource.jansi.Ansi; -import org.fusesource.jansi.Ansi.Color; -import org.fusesource.jansi.AnsiConsole; - -import java.io.*; -import java.util.Arrays; -import java.util.stream.Collectors; - public class Main { - private static ExecuteWatchdog watchdog; + public static void main(String[] args) { - private static void printLogo() { - System.out.println( - Ansi.ansi().reset() - .bold().fg(Color.WHITE).a("ASys").boldOff().a(":// ") - .fg(Color.BLACK).bg(Color.RED).a("Zond").reset().newline() - ); - } - - public static void log(String message){ - String msg = Ansi.ansi().reset() - .bg(Color.BLUE).fg(Color.WHITE).a("[ASys Zond] ") - .a(message).reset().toString(); - if (Shell.getInstance().isActive()) { - Shell.getInstance().getOutput().println(msg); - } else { - System.out.println(msg); - } - } - - public static void main(String[] args) throws IOException { - if (Boolean.getBoolean("ansi.install")) { - AnsiConsole.systemInstall(); - } - - printLogo(); - - if (args.length == 0) { - System.out.println("no args"); - System.exit(0); - return; - } - - loadConfig(); - - PipeInputStream pipeInputStream = new PipeInputStream(); - Shell.getInstance().start(System.in, commandLine -> { - if (commandLine.equalsIgnoreCase(":exit")) { - log("force exit"); - watchdog.destroyProcess(); - Shell.getInstance().shutdown(); - Main.shutdown(); - return; - } - pipeInputStream.write(commandLine+"\r\n"); - }); - Connector.getInstance().startReconnect(); - executeProcess(args, Shell.getInstance().getOutput(), pipeInputStream); - } - - private static void executeProcess(String[] args, PrintStream printStream, InputStream stdin) throws IOException { - String cmdLine = Arrays.stream(args).collect(Collectors.joining(" ")); - CommandLine commandLine = CommandLine.parse(cmdLine); - DefaultExecutor executor = new DefaultExecutor(); - - PumpStreamHandler psh = new PumpStreamHandler(printStream, printStream, stdin); - psh.setStopTimeout(-1999); //hack: по-умолчанию в Apache Exec добавляется еще 2000L милисекунд - executor.setStreamHandler(psh); - watchdog = new ExecuteWatchdog(ExecuteWatchdog.INFINITE_TIMEOUT); - executor.setWatchdog(watchdog); - - int resultCode = 0; - try { - resultCode = executor.execute(commandLine); - } catch (ExecuteException ignore) { - } catch (IOException e) { - e.printStackTrace(); - resultCode = -1; - } - - watchdog = null; - log("Process finished. Code: " + resultCode); - } - - private static void loadConfig() throws IOException { - File zondPropertiesFile = new File("zond.properties"); - if (!zondPropertiesFile.exists()) { - InputStream stream = Main.class.getResourceAsStream("/zond.properties"); - FileOutputStream fos = new FileOutputStream(zondPropertiesFile); - byte[] buff = new byte[65536]; - int len; - while ((len = stream.read(buff)) > 0) { - fos.write(buff, 0, len); - } - fos.flush(); - fos.close(); - } - - FileInputStream fis = new FileInputStream(zondPropertiesFile); - Config.load(fis); - fis.close(); - } - - private static void shutdown() { - Connector.getInstance().setNeedReconnect(false); - Connector.getInstance().stopReconnect(); - Connector.getInstance().shutdown(); } } diff --git a/zond/src/main/java/asys/zond/PipeInputStream.java b/zond/src/main/java/asys/zond/PipeInputStream.java deleted file mode 100644 index 5ea3ef4..0000000 --- a/zond/src/main/java/asys/zond/PipeInputStream.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * DmitriyMX - * 2017-06-14 - */ -package asys.zond; - -import java.io.IOException; -import java.io.InputStream; - -public class PipeInputStream extends InputStream { - private byte[] buffer = new byte[1024]; - private int lastWritePos = 0, - lastReadPos = 0, - wallPos = buffer.length-1; - - public synchronized void write(String s) { - byte[] strBytes = s.getBytes(); - - while ((lastWritePos < lastReadPos) && ((lastReadPos - lastWritePos) >= strBytes.length)) { - try { - wait(); - } catch (InterruptedException e) { - return; - } - } - - if ((lastWritePos + strBytes.length) >= 1024) { - wallPos = lastWritePos; - lastWritePos = 0; - } - - System.arraycopy(strBytes, 0, this.buffer, lastWritePos, strBytes.length); - lastWritePos += strBytes.length; - notify(); - } - - @Override - public synchronized int read() throws IOException { - if (lastReadPos == lastWritePos) { - try { - wait(); - } catch (InterruptedException ignore) { - return 0; - } - } - - if (lastReadPos == wallPos) { - lastReadPos = 0; - } - - return this.buffer[lastReadPos++]; - } - - @Override - public int read(byte[] b) throws IOException { - return this.read(b, 0, b.length); - } - - @Override - public synchronized int read(byte[] buffOut, int off, int len) throws IOException { - if (lastReadPos == lastWritePos) { - try { - wait(); - } catch (InterruptedException ignore) { - return 0; - } - } - int actualLen = len; - - if (lastReadPos > lastWritePos) { - if ((lastReadPos + len) > wallPos) { - actualLen = (wallPos - lastReadPos); - } - } else { - if ((lastReadPos + len) > lastWritePos) { - actualLen = (lastWritePos - lastReadPos); - } - } - - System.arraycopy(this.buffer, lastReadPos, buffOut, off, actualLen); - lastReadPos += actualLen; - if (lastReadPos == wallPos) { - lastReadPos = 0; - } - notify(); - return actualLen; - } -} diff --git a/zond/src/main/java/asys/zond/proxy/Client.java b/zond/src/main/java/asys/zond/proxy/Client.java deleted file mode 100644 index 672634c..0000000 --- a/zond/src/main/java/asys/zond/proxy/Client.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * DmitriyMX - * 2017-06-08 - */ -package asys.zond.proxy; - -import asys.mcsmanager.packets.codec.PacketDecoder; -import asys.mcsmanager.packets.codec.PacketEncoder; -import asys.mcsmanager.packets.codec.PacketHandler; -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioSocketChannel; - -public class Client { - private EventLoopGroup group; - private Bootstrap bootstrap; - private ChannelFuture channelFuture; - - public void connect(String host, int port) { - if (group == null || bootstrap == null) { - group = new NioEventLoopGroup(); - bootstrap = createBootstrap(); - } - - channelFuture = bootstrap.connect(host, port); - channelFuture.awaitUninterruptibly(5000); - } - - public boolean isConnected() { - return (channelFuture != null && channelFuture.isSuccess()); - } - - public void disconnect() { - group.shutdownGracefully(); - } - - private Bootstrap createBootstrap() { - Bootstrap bootstrap = new Bootstrap(); - bootstrap.group(group) - .channel(NioSocketChannel.class) - .handler(createChannelInitializer()); - - return bootstrap; - } - - private ChannelInitializer createChannelInitializer() { - return new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) throws Exception { - socketChannel.pipeline().addLast( - new PacketEncoder(), - new PacketDecoder(), - new PacketHandler(), - new ClientPacketHandler() - ); - } - }; - } -} diff --git a/zond/src/main/java/asys/zond/proxy/ClientPacketHandler.java b/zond/src/main/java/asys/zond/proxy/ClientPacketHandler.java deleted file mode 100644 index 9f425ac..0000000 --- a/zond/src/main/java/asys/zond/proxy/ClientPacketHandler.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * DmitriyMX - * 2017-06-08 - */ -package asys.zond.proxy; - -import asys.mcsmanager.packets.*; -import asys.zond.Config; -import asys.zond.Main; -import com.google.common.collect.BiMap; -import com.google.common.collect.ImmutableBiMap; -import com.google.common.collect.ImmutableMap; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; - -import java.util.Map; - -import static asys.mcsmanager.packets.codec.Params.KNOWN_HANDLERS; -import static asys.mcsmanager.packets.codec.Params.KNOWN_PACKETS; -import static asys.zond.Main.log; - -public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements IPacketHandler { - private static final BiMap> handshakePackets = ImmutableBiMap.of( - 1, CS_Handshake.class, - 2, SC_HandshakeResult.class - ); - private static Map, IPacketHandler> handshakeHandlers; - - private static final BiMap> knownPackets = ImmutableBiMap.of( - 3, CS_Ping.class, - 4, CS_ConsoleMessage.class - ); - - ClientPacketHandler() { - if (handshakeHandlers == null) { - handshakeHandlers = ImmutableMap.of( - SC_HandshakeResult.class, this - ); - } - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - log("channelActive"); - ctx.channel().attr(KNOWN_PACKETS).set(handshakePackets); - ctx.channel().attr(KNOWN_HANDLERS).set(handshakeHandlers); - - CS_Handshake packet = new CS_Handshake( - Config.getString("clientId"), - Config.getString("passcode")); - log("send Handshake packet..."); - ctx.channel().writeAndFlush(packet); - - super.channelActive(ctx); - } - - @Override - public void channelInactive(ChannelHandlerContext ctx) throws Exception { - 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(); - super.channelInactive(ctx); - } - - @Override - public void handle(Packet packet, ChannelHandlerContext context) { - log("handle : " + packet.getClass().getSimpleName()); - SC_HandshakeResult pkt = (SC_HandshakeResult) packet; - if (pkt.getErrorCode() != 0) { - 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 deleted file mode 100644 index e41a25b..0000000 --- a/zond/src/main/java/asys/zond/proxy/Connector.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * 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 shutdown() { - 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 deleted file mode 100644 index 3861683..0000000 --- a/zond/src/main/java/asys/zond/proxy/TaskTicker.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * 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; - } - } - } -} diff --git a/zond/src/main/java/asys/zond/shell/CommandLineHandler.java b/zond/src/main/java/asys/zond/shell/CommandLineHandler.java deleted file mode 100644 index fc1d7de..0000000 --- a/zond/src/main/java/asys/zond/shell/CommandLineHandler.java +++ /dev/null @@ -1,9 +0,0 @@ -/* - * DmitriyMX - * 2017-06-14 - */ -package asys.zond.shell; - -public interface CommandLineHandler { - void handle(String commandLine); -} diff --git a/zond/src/main/java/asys/zond/shell/JlineProxySysOut.java b/zond/src/main/java/asys/zond/shell/JlineProxySysOut.java deleted file mode 100644 index bb74802..0000000 --- a/zond/src/main/java/asys/zond/shell/JlineProxySysOut.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * DmitriyMX - * 2017-06-14 - */ -package asys.zond.shell; - -import asys.zond.proxy.Connector; -import jline.console.ConsoleReader; - -import java.io.*; - -public class JlineProxySysOut extends PrintStream { - private ConsoleReader consoleReader; - private PrintWriter writer; - - public JlineProxySysOut(OutputStream out) { - super(out, true); - } - - public void setConsoleReader(ConsoleReader consoleReader) { - this.consoleReader = consoleReader; - if (consoleReader != null) { - this.writer = new PrintWriter(consoleReader.getOutput()); - } else { - try { - super.out.write('\r'); - super.out.flush(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - private void _print(String s) { - writer.print(ConsoleReader.RESET_LINE); - writer.print(s); - cleanTrashLine(s); - writer.println(); - try { - consoleReader.drawLine(); - } catch (IOException ignore) { - } - writer.flush(); - - for (String l : s.split("\n")) { - Connector.getInstance().sendMessage(l); - } - } - - /** - * Очистка печатной строки от мусора - */ - private void cleanTrashLine(String string) { - // очищает полностью строку - if (consoleReader.getCursorBuffer().buffer.length() + consoleReader.getPrompt().length() > string.length()) { - for (int i = string.length(); i <= consoleReader.getCursorBuffer().buffer.length() + 2; i++) { - writer.print(' '); - } - } - } - - @Override - public void write(byte[] buf, int off, int len) { - if (consoleReader != null) { - if ((char) buf[len - 1] == '\n') len--; //TODO проверить в windows - _print(new String(buf, off, len)); - } else { - super.write(buf, off, len); - } - } - - @Override - public void print(String x) { - if (consoleReader != null) { - _print(x); - } else { - super.print(x); - } - } - - @Override - public void println(String x) { - if (consoleReader != null) { - _print(x); - } else { - super.println(x); - } - } -} diff --git a/zond/src/main/java/asys/zond/shell/Shell.java b/zond/src/main/java/asys/zond/shell/Shell.java deleted file mode 100644 index 0809ca3..0000000 --- a/zond/src/main/java/asys/zond/shell/Shell.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * DmitriyMX - * 2017-06-14 - */ -package asys.zond.shell; - -import jline.console.ConsoleReader; -import jline.internal.Ansi; - -import java.io.*; - -public class Shell { - private static Shell instance = new Shell(); - private boolean active = false; - private ConsoleReader console; - private JlineProxySysOut proxySysOut; - private Thread threadCommandHandler; - - public static Shell getInstance() { - return instance; - } - - private Shell() { - } - - public void start(final InputStream inputStream, final CommandLineHandler commandLineHandler) throws IOException { - proxySysOut = new JlineProxySysOut(System.out); - console = new ConsoleReader(inputStream, proxySysOut); - proxySysOut.setConsoleReader(console); - console.setPrompt(ConsoleReader.RESET_LINE + ":"); - - threadCommandHandler = new Thread(() -> { - Thread current = Thread.currentThread(); - - try { - String line; - while (!current.isInterrupted() && ((line = console.readLine()) != null)) { - commandLineHandler.handle(line); - } - } catch (IOException ignore) { - } - - console.shutdown(); - }, "Shell: command handler"); - active = true; - threadCommandHandler.start(); - } - - public void shutdown() { - threadCommandHandler.interrupt(); - active = false; - proxySysOut.setConsoleReader(null); - } - - public JlineProxySysOut getOutput() { - return proxySysOut; - } - - public boolean isActive() { - return active; - } - - private void safeSleep() { - try { - Thread.sleep(1); - } catch (InterruptedException ignore) { - } - } -} diff --git a/zond/src/main/java/org/apache/commons/exec/StreamPumper.java b/zond/src/main/java/org/apache/commons/exec/StreamPumper.java deleted file mode 100644 index b50bc13..0000000 --- a/zond/src/main/java/org/apache/commons/exec/StreamPumper.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.apache.commons.exec; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -import org.apache.commons.exec.util.DebugUtils; - -/** - * Copies all data from an input stream to an output stream. - * - * @version $Id: StreamPumper.java 1557263 2014-01-10 21:18:09Z ggregory $ - */ -public class StreamPumper implements Runnable { - - /** the default size of the internal buffer for copying the streams */ - private static final int DEFAULT_SIZE = 1024; - - /** the input stream to pump from */ - private final InputStream is; - - /** the output stream to pmp into */ - private final OutputStream os; - - /** the size of the internal buffer for copying the streams */ - private final int size; - - /** was the end of the stream reached */ - private boolean finished; - - /** close the output stream when exhausted */ - private final boolean closeWhenExhausted; - - /** - * Create a new stream pumper. - * - * @param is input stream to read data from - * @param os output stream to write data to. - * @param closeWhenExhausted if true, the output stream will be closed when the input is exhausted. - */ - public StreamPumper(final InputStream is, final OutputStream os, - final boolean closeWhenExhausted) { - this.is = is; - this.os = os; - this.size = DEFAULT_SIZE; - this.closeWhenExhausted = closeWhenExhausted; - } - - /** - * Create a new stream pumper. - * - * @param is input stream to read data from - * @param os output stream to write data to. - * @param closeWhenExhausted if true, the output stream will be closed when the input is exhausted. - * @param size the size of the internal buffer for copying the streams - */ - public StreamPumper(final InputStream is, final OutputStream os, - final boolean closeWhenExhausted, final int size) { - this.is = is; - this.os = os; - this.size = size > 0 ? size : DEFAULT_SIZE; - this.closeWhenExhausted = closeWhenExhausted; - } - - /** - * Create a new stream pumper. - * - * @param is input stream to read data from - * @param os output stream to write data to. - */ - public StreamPumper(final InputStream is, final OutputStream os) { - this(is, os, false); - } - - /** - * Copies data from the input stream to the output stream. Terminates as - * soon as the input stream is closed or an error occurs. - */ - public void run() { - synchronized (this) { - // Just in case this object is reused in the future - finished = false; - } - - final byte[] buf = new byte[this.size]; - - int length; - try { - //hack: пропатчили алгоритм - while (!Thread.currentThread().isInterrupted() && (length = is.read(buf)) > 0) { - os.write(buf, 0, length); - os.flush(); - } - } catch (final Exception e) { - // nothing to do - happens quite often with watchdog - } finally { - if (closeWhenExhausted) { - try { - os.close(); - } catch (final IOException e) { - final String msg = "Got exception while closing exhausted output stream"; - DebugUtils.handleException(msg ,e); - } - } - synchronized (this) { - finished = true; - notifyAll(); - } - } - } - - /** - * Tells whether the end of the stream has been reached. - * - * @return true is the stream has been exhausted. - */ - public synchronized boolean isFinished() { - return finished; - } - - /** - * This method blocks until the stream pumper finishes. - * - * @exception InterruptedException - * if any thread interrupted the current thread before or while the current thread was waiting for a - * notification. - * @see #isFinished() - */ - public synchronized void waitFor() throws InterruptedException { - while (!isFinished()) { - wait(); - } - } -} diff --git a/zond/src/main/resources/zond.properties b/zond/src/main/resources/zond.properties deleted file mode 100644 index 547e091..0000000 --- a/zond/src/main/resources/zond.properties +++ /dev/null @@ -1,4 +0,0 @@ -clientId = SpigotServer0 -host = 127.0.0.1 -port = 8779 -passcode = testpassphrase \ No newline at end of file From d8d80cf6dc4f9395f916178ee8c62d4db7bce55a Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 15 Jun 2017 15:05:40 +0300 Subject: [PATCH 23/73] =?UTF-8?q?Zond:=20=D0=BF=D0=B5=D1=80=D0=B2=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=BD=D0=B0=D0=BC=D0=B5=D1=82=D0=BA=D0=B8=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=BC=D0=B0=D0=BD=D0=B4=D0=BD=D0=BE=D0=B9=20=D0=BE?= =?UTF-8?q?=D0=B1=D0=BE=D0=BB=D0=BE=D1=87=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 28 +------ zond/src/main/java/asys/zond/Main.java | 21 +++++- .../java/asys/zond/shell/CommandHandler.java | 9 +++ .../java/asys/zond/shell/CommandLooper.java | 35 +++++++++ .../asys/zond/shell/EchoCommandHandler.java | 12 +++ zond/src/main/java/asys/zond/shell/Shell.java | 62 +++++++++++++++ .../java/asys/zond/shell/ShellOutputHook.java | 9 +++ .../java/asys/zond/shell/ShellStdOut.java | 75 +++++++++++++++++++ 8 files changed, 221 insertions(+), 30 deletions(-) create mode 100644 zond/src/main/java/asys/zond/shell/CommandHandler.java create mode 100644 zond/src/main/java/asys/zond/shell/CommandLooper.java create mode 100644 zond/src/main/java/asys/zond/shell/EchoCommandHandler.java create mode 100644 zond/src/main/java/asys/zond/shell/Shell.java create mode 100644 zond/src/main/java/asys/zond/shell/ShellOutputHook.java create mode 100644 zond/src/main/java/asys/zond/shell/ShellStdOut.java diff --git a/zond/build.gradle b/zond/build.gradle index 887f6d1..bba81ae 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.6.1-SNAPSHOT' +version = '0.7.1-SNAPSHOT' apply plugin: 'application' @@ -7,25 +7,11 @@ mainClassName = "asys.zond.Main" configurations { included - includedEx compile.extendsFrom included - compile.extendsFrom includedEx -} - -compileJava { - dependsOn ':bridge-protocol:compileJava' -} - -def zp(FileTree ft) { - return ft.matching { - exclude 'org/apache/commons/exec/StreamPumper.class' - } } jar { - dependsOn ':bridge-protocol:jar' dependsOn configurations.included - dependsOn configurations.includedEx manifest { attributes 'Implementation-Title': 'ASys Zond', 'Implementation-Version': version, @@ -33,18 +19,8 @@ jar { } baseName = project.group + '.' + project.name from { configurations.included.collect { it.isDirectory() ? it : zipTree(it) } } - from { configurations.includedEx.collect { it.isDirectory() ? it : zp(zipTree(it)) } } -} - -ext { - nettyVersion = '4.0.23.Final' } dependencies { - included files(project(':bridge-protocol').sourceSets.main.output.classesDir) - included group: 'org.fusesource.jansi', name: 'jansi', version: '1.11' - includedEx group: 'org.apache.commons', name: 'commons-exec', version: '1.3' - included group: 'io.netty', name: 'netty-codec', version: nettyVersion - included group: 'com.google.guava', name: 'guava', version: '21.0' - included group: 'jline', name: 'jline', version: '2.13' + included group: 'jline', name: 'jline', version: '2.14.3' } diff --git a/zond/src/main/java/asys/zond/Main.java b/zond/src/main/java/asys/zond/Main.java index e73e088..37621ba 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -1,12 +1,25 @@ /* * DmitriyMX - * 2017-06-07 + * 2017-06-15 * Idea by Daniil on 2017-06-07 */ package asys.zond; -public class Main { - public static void main(String[] args) { +import asys.zond.shell.Shell; +import java.io.IOException; + +public class Main { + public static void main(String[] args) throws IOException { + new Main().start(); } -} + + private void start() { + Shell shell = Shell.getInstance(); + try { + shell.start(System.in); + } catch (Exception e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/zond/src/main/java/asys/zond/shell/CommandHandler.java b/zond/src/main/java/asys/zond/shell/CommandHandler.java new file mode 100644 index 0000000..197ead7 --- /dev/null +++ b/zond/src/main/java/asys/zond/shell/CommandHandler.java @@ -0,0 +1,9 @@ +/* + * DmitriyMX + * 2017-06-15 + */ +package asys.zond.shell; + +public interface CommandHandler { + void handle(String commandLine); +} diff --git a/zond/src/main/java/asys/zond/shell/CommandLooper.java b/zond/src/main/java/asys/zond/shell/CommandLooper.java new file mode 100644 index 0000000..0460312 --- /dev/null +++ b/zond/src/main/java/asys/zond/shell/CommandLooper.java @@ -0,0 +1,35 @@ +/* + * DmitriyMX + * 2017-06-15 + */ +package asys.zond.shell; + +import jline.console.ConsoleReader; + +import java.io.IOException; + +public class CommandLooper implements Runnable { + private ConsoleReader consoleReader; + private CommandHandler commandHandler; + + CommandLooper(ConsoleReader consoleReader, CommandHandler commandHandler) { + this.consoleReader = consoleReader; + this.commandHandler = commandHandler; + } + + @Override + public void run() { + while (!Thread.currentThread().isInterrupted()) { + String line; + try { + line = consoleReader.readLine(); + } catch (IOException e) { + break; + } + if (line == null) break; + if (line.trim().isEmpty()) continue; + + commandHandler.handle(line); + } + } +} diff --git a/zond/src/main/java/asys/zond/shell/EchoCommandHandler.java b/zond/src/main/java/asys/zond/shell/EchoCommandHandler.java new file mode 100644 index 0000000..fa3741c --- /dev/null +++ b/zond/src/main/java/asys/zond/shell/EchoCommandHandler.java @@ -0,0 +1,12 @@ +/* + * DmitriyMX + * 2017-06-15 + */ +package asys.zond.shell; + +public class EchoCommandHandler implements CommandHandler { + @Override + public void handle(String commandLine) { + Shell.getInstance().getOutput().println(commandLine); + } +} diff --git a/zond/src/main/java/asys/zond/shell/Shell.java b/zond/src/main/java/asys/zond/shell/Shell.java new file mode 100644 index 0000000..13b914e --- /dev/null +++ b/zond/src/main/java/asys/zond/shell/Shell.java @@ -0,0 +1,62 @@ +/* + * DmitriyMX + * 2017-06-15 + */ +package asys.zond.shell; + +import jline.console.ConsoleReader; + +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintStream; + +public class Shell { + private static final String DEFAULT_PROMPT = ":"; + private static Shell instance; + private ConsoleReader consoleReader; + private Thread threadCommandLoop; + private CommandHandler commandHandler; + private ShellStdOut shellStdOut; + + public static Shell getInstance() { + if (instance == null) instance = new Shell(); + return instance; + } + + private Shell() { + } + + public void start(InputStream inputStream) throws IOException { + consoleReader = new ConsoleReader(inputStream, (shellStdOut = new ShellStdOut())); + shellStdOut.setConsoleReader(consoleReader); + consoleReader.setPrompt(DEFAULT_PROMPT); + + if (commandHandler == null) commandHandler = new EchoCommandHandler(); + + threadCommandLoop = new Thread( + new CommandLooper(consoleReader, commandHandler), + "Zond shell looper"); + threadCommandLoop.start(); + } + + public void shutdown() { + threadCommandLoop.interrupt(); + consoleReader.close(); + } + + public void setPrompt(String value) { + consoleReader.setPrompt(value); + } + + public void resetPrompt() { + consoleReader.setPrompt(DEFAULT_PROMPT); + } + + public PrintStream getOutput() { + return shellStdOut; + } + + public void setOutputHook(ShellOutputHook outputHook) { + shellStdOut.setOutputHook(outputHook); + } +} diff --git a/zond/src/main/java/asys/zond/shell/ShellOutputHook.java b/zond/src/main/java/asys/zond/shell/ShellOutputHook.java new file mode 100644 index 0000000..9936e2e --- /dev/null +++ b/zond/src/main/java/asys/zond/shell/ShellOutputHook.java @@ -0,0 +1,9 @@ +/* + * DmitriyMX + * 2017-06-15 + */ +package asys.zond.shell; + +public interface ShellOutputHook { + String handle(String line); +} diff --git a/zond/src/main/java/asys/zond/shell/ShellStdOut.java b/zond/src/main/java/asys/zond/shell/ShellStdOut.java new file mode 100644 index 0000000..6eac1c3 --- /dev/null +++ b/zond/src/main/java/asys/zond/shell/ShellStdOut.java @@ -0,0 +1,75 @@ +/* + * DmitriyMX + * 2017-06-15 + */ +package asys.zond.shell; + +import jline.console.ConsoleReader; + +import java.io.PrintStream; +import java.io.PrintWriter; + +public class ShellStdOut extends PrintStream { + private ConsoleReader consoleReader; + private PrintWriter writer; + private ShellOutputHook shellOutputHook; + + ShellStdOut() { + super(System.out, true); + } + + void setConsoleReader(ConsoleReader consoleReader) { + this.consoleReader = consoleReader; + this.writer = new PrintWriter(consoleReader.getOutput()); + } + + private void _print(String line) { + String newLine; + if (shellOutputHook != null) { + try { + newLine = shellOutputHook.handle(line); + if (newLine == null) return; + else line = newLine; + } catch (Exception ignore) { + } + } + + writer.print(ConsoleReader.RESET_LINE); + writer.print(line); + cleanTrashLine(line); + writer.println(); + writer.flush(); + } + + /** + * Очистка печатной строки от мусора + */ + private void cleanTrashLine(String string) { + // очищает полностью строку + if (consoleReader.getCursorBuffer().buffer.length() + consoleReader.getPrompt().length() > string.length()) { + for (int i = string.length(); i <= consoleReader.getCursorBuffer().buffer.length() + 2; i++) { + writer.print(' '); + } + } + } + + void setOutputHook(ShellOutputHook shellOutputHook) { + this.shellOutputHook = shellOutputHook; + } + + @Override + public void write(byte[] buf, int off, int len) { + if ((char)buf[len-1] == '\n') len--; + _print(new String(buf, off, len)); + } + + @Override + public void print(String s) { + _print(s); + } + + @Override + public void println(String x) { + _print(x); + } +} From 6fa8b4ecc4cbab4e2ebe3f29fb810481da7de26c Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 15 Jun 2017 15:42:55 +0300 Subject: [PATCH 24/73] =?UTF-8?q?Zond:=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD?= =?UTF-8?q?=D0=B4=D1=8B=20=D0=B2=D1=8B=D1=85=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 2 +- zond/src/main/java/asys/zond/Main.java | 1 + .../java/asys/zond/ZondCommandHandler.java | 25 +++++++++++++++++++ zond/src/main/java/asys/zond/shell/Shell.java | 4 +++ 4 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 zond/src/main/java/asys/zond/ZondCommandHandler.java diff --git a/zond/build.gradle b/zond/build.gradle index bba81ae..4f37fa8 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.7.1-SNAPSHOT' +version = '0.7.2-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 37621ba..f5cc9af 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -17,6 +17,7 @@ public class Main { private void start() { Shell shell = Shell.getInstance(); try { + shell.setCommandHandler(new ZondCommandHandler()); shell.start(System.in); } catch (Exception e) { e.printStackTrace(); diff --git a/zond/src/main/java/asys/zond/ZondCommandHandler.java b/zond/src/main/java/asys/zond/ZondCommandHandler.java new file mode 100644 index 0000000..11b47df --- /dev/null +++ b/zond/src/main/java/asys/zond/ZondCommandHandler.java @@ -0,0 +1,25 @@ +/* + * DmitriyMX + * 2017-06-15 + */ +package asys.zond; + +import asys.zond.shell.CommandHandler; +import asys.zond.shell.Shell; + +public class ZondCommandHandler implements CommandHandler { + @Override + public void handle(String commandLine) { + if (commandLine.startsWith(":")) { + internalCommand(commandLine.substring(1)); + } else { + Shell.getInstance().getOutput().println(commandLine); + } + } + + private void internalCommand(String line) { + if (line.equalsIgnoreCase("exit") || line.equalsIgnoreCase("quit")) { + Shell.getInstance().shutdown(); + } + } +} diff --git a/zond/src/main/java/asys/zond/shell/Shell.java b/zond/src/main/java/asys/zond/shell/Shell.java index 13b914e..f63bc2a 100644 --- a/zond/src/main/java/asys/zond/shell/Shell.java +++ b/zond/src/main/java/asys/zond/shell/Shell.java @@ -59,4 +59,8 @@ public class Shell { public void setOutputHook(ShellOutputHook outputHook) { shellStdOut.setOutputHook(outputHook); } + + public void setCommandHandler(CommandHandler commandHandler) { + this.commandHandler = commandHandler; + } } From 1c7e4d35452285974a7a4dd499b977979b2a256d Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 15 Jun 2017 17:49:37 +0300 Subject: [PATCH 25/73] =?UTF-8?q?Zond:=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81?= =?UTF-8?q?=D0=BA=20=D0=B2=D0=BD=D0=B5=D1=88=D0=BD=D0=B8=D1=85=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 11 ++ zond/src/main/java/asys/zond/Main.java | 31 +++- .../java/asys/zond/ZondCommandHandler.java | 39 +++++ .../java/asys/zond/shell/CommandLooper.java | 4 + .../java/asys/zond/shell/ShellStdOut.java | 8 + .../org/apache/commons/exec/StreamPumper.java | 152 ++++++++++++++++++ 6 files changed, 242 insertions(+), 3 deletions(-) create mode 100644 zond/src/main/java/org/apache/commons/exec/StreamPumper.java diff --git a/zond/build.gradle b/zond/build.gradle index 4f37fa8..eba758b 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -7,11 +7,20 @@ mainClassName = "asys.zond.Main" configurations { included + includedEx compile.extendsFrom included + compile.extendsFrom includedEx +} + +def zp(FileTree ft) { + return ft.matching { + exclude 'org/apache/commons/exec/StreamPumper.class' + } } jar { dependsOn configurations.included + dependsOn configurations.includedEx manifest { attributes 'Implementation-Title': 'ASys Zond', 'Implementation-Version': version, @@ -19,8 +28,10 @@ jar { } baseName = project.group + '.' + project.name from { configurations.included.collect { it.isDirectory() ? it : zipTree(it) } } + from { configurations.includedEx.collect { it.isDirectory() ? it : zp(zipTree(it)) } } } dependencies { included group: 'jline', name: 'jline', version: '2.14.3' + includedEx group: 'org.apache.commons', name: 'commons-exec', version: '1.3' } diff --git a/zond/src/main/java/asys/zond/Main.java b/zond/src/main/java/asys/zond/Main.java index f5cc9af..d9247b8 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -6,21 +6,46 @@ package asys.zond; import asys.zond.shell.Shell; +import org.apache.commons.exec.CommandLine; +import org.apache.commons.exec.DefaultExecutor; +import org.apache.commons.exec.Executor; +import org.apache.commons.exec.PumpStreamHandler; import java.io.IOException; +import java.io.PrintStream; +import java.util.Arrays; +import java.util.stream.Collectors; public class Main { + private Executor executor; + private CommandLine commandLine; + public static void main(String[] args) throws IOException { - new Main().start(); + new Main().start(args); } - private void start() { + private void start(String[] args) { + ZondCommandHandler commandHandler = new ZondCommandHandler(); + startShell(commandHandler); + initExecCommand(args, Shell.getInstance().getOutput()); + commandHandler.setExecutor(executor, commandLine); + } + + private void startShell(ZondCommandHandler commandHandler) { Shell shell = Shell.getInstance(); try { - shell.setCommandHandler(new ZondCommandHandler()); + shell.setCommandHandler(commandHandler); shell.start(System.in); } catch (Exception e) { e.printStackTrace(); } } + + private void initExecCommand(String[] args, PrintStream stdout) { + String cmdLine = Arrays.stream(args).collect(Collectors.joining(" ")); + commandLine = CommandLine.parse(cmdLine); + executor = new DefaultExecutor(); + PumpStreamHandler pumpStreamHandler = new PumpStreamHandler(stdout); + executor.setStreamHandler(pumpStreamHandler); + } } \ No newline at end of file diff --git a/zond/src/main/java/asys/zond/ZondCommandHandler.java b/zond/src/main/java/asys/zond/ZondCommandHandler.java index 11b47df..5d905dd 100644 --- a/zond/src/main/java/asys/zond/ZondCommandHandler.java +++ b/zond/src/main/java/asys/zond/ZondCommandHandler.java @@ -6,8 +6,19 @@ package asys.zond; import asys.zond.shell.CommandHandler; import asys.zond.shell.Shell; +import org.apache.commons.exec.CommandLine; +import org.apache.commons.exec.ExecuteException; +import org.apache.commons.exec.ExecuteWatchdog; +import org.apache.commons.exec.Executor; + +import java.io.IOException; public class ZondCommandHandler implements CommandHandler { + private Executor executor; + private CommandLine commandLine; + private ExecuteWatchdog watchdog; + private Thread threadExec; + @Override public void handle(String commandLine) { if (commandLine.startsWith(":")) { @@ -19,7 +30,35 @@ public class ZondCommandHandler implements CommandHandler { private void internalCommand(String line) { if (line.equalsIgnoreCase("exit") || line.equalsIgnoreCase("quit")) { + if (watchdog != null) { + watchdog.destroyProcess(); + threadExec.interrupt(); + } Shell.getInstance().shutdown(); + } else if (line.equalsIgnoreCase("start")) { + if (watchdog == null) { + watchdog = new ExecuteWatchdog(ExecuteWatchdog.INFINITE_TIMEOUT); + executor.setWatchdog(watchdog); + Runnable task = () -> { + int code = 0; + try { + code = executor.execute(commandLine); + } catch (ExecuteException ignore) { + } catch (IOException e) { + Shell.getInstance().getOutput().println("Exception message: " + e.getMessage()); + code = -99; + } + watchdog = null; + Shell.getInstance().getOutput().println("Process finished. Code: " + code); + }; + threadExec = new Thread(task, "Zond Exec"); + threadExec.start(); + } } } + + void setExecutor(Executor executor, CommandLine commandLine) { + this.executor = executor; + this.commandLine = commandLine; + } } diff --git a/zond/src/main/java/asys/zond/shell/CommandLooper.java b/zond/src/main/java/asys/zond/shell/CommandLooper.java index 0460312..681577e 100644 --- a/zond/src/main/java/asys/zond/shell/CommandLooper.java +++ b/zond/src/main/java/asys/zond/shell/CommandLooper.java @@ -11,10 +11,12 @@ import java.io.IOException; public class CommandLooper implements Runnable { private ConsoleReader consoleReader; private CommandHandler commandHandler; + private ShellStdOut output; CommandLooper(ConsoleReader consoleReader, CommandHandler commandHandler) { this.consoleReader = consoleReader; this.commandHandler = commandHandler; + this.output = (ShellStdOut) Shell.getInstance().getOutput(); } @Override @@ -22,7 +24,9 @@ public class CommandLooper implements Runnable { while (!Thread.currentThread().isInterrupted()) { String line; try { + output.needDrawLine = true; line = consoleReader.readLine(); + output.needDrawLine = false; } catch (IOException e) { break; } diff --git a/zond/src/main/java/asys/zond/shell/ShellStdOut.java b/zond/src/main/java/asys/zond/shell/ShellStdOut.java index 6eac1c3..7205e2c 100644 --- a/zond/src/main/java/asys/zond/shell/ShellStdOut.java +++ b/zond/src/main/java/asys/zond/shell/ShellStdOut.java @@ -13,6 +13,7 @@ public class ShellStdOut extends PrintStream { private ConsoleReader consoleReader; private PrintWriter writer; private ShellOutputHook shellOutputHook; + boolean needDrawLine = false; ShellStdOut() { super(System.out, true); @@ -38,6 +39,12 @@ public class ShellStdOut extends PrintStream { writer.print(line); cleanTrashLine(line); writer.println(); + if (needDrawLine) { + try { + consoleReader.drawLine(); + } catch (Throwable ignore) { + } + } writer.flush(); } @@ -60,6 +67,7 @@ public class ShellStdOut extends PrintStream { @Override public void write(byte[] buf, int off, int len) { if ((char)buf[len-1] == '\n') len--; + if ((char)buf[len-1] == '\r') len--; _print(new String(buf, off, len)); } diff --git a/zond/src/main/java/org/apache/commons/exec/StreamPumper.java b/zond/src/main/java/org/apache/commons/exec/StreamPumper.java new file mode 100644 index 0000000..b50bc13 --- /dev/null +++ b/zond/src/main/java/org/apache/commons/exec/StreamPumper.java @@ -0,0 +1,152 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.commons.exec; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import org.apache.commons.exec.util.DebugUtils; + +/** + * Copies all data from an input stream to an output stream. + * + * @version $Id: StreamPumper.java 1557263 2014-01-10 21:18:09Z ggregory $ + */ +public class StreamPumper implements Runnable { + + /** the default size of the internal buffer for copying the streams */ + private static final int DEFAULT_SIZE = 1024; + + /** the input stream to pump from */ + private final InputStream is; + + /** the output stream to pmp into */ + private final OutputStream os; + + /** the size of the internal buffer for copying the streams */ + private final int size; + + /** was the end of the stream reached */ + private boolean finished; + + /** close the output stream when exhausted */ + private final boolean closeWhenExhausted; + + /** + * Create a new stream pumper. + * + * @param is input stream to read data from + * @param os output stream to write data to. + * @param closeWhenExhausted if true, the output stream will be closed when the input is exhausted. + */ + public StreamPumper(final InputStream is, final OutputStream os, + final boolean closeWhenExhausted) { + this.is = is; + this.os = os; + this.size = DEFAULT_SIZE; + this.closeWhenExhausted = closeWhenExhausted; + } + + /** + * Create a new stream pumper. + * + * @param is input stream to read data from + * @param os output stream to write data to. + * @param closeWhenExhausted if true, the output stream will be closed when the input is exhausted. + * @param size the size of the internal buffer for copying the streams + */ + public StreamPumper(final InputStream is, final OutputStream os, + final boolean closeWhenExhausted, final int size) { + this.is = is; + this.os = os; + this.size = size > 0 ? size : DEFAULT_SIZE; + this.closeWhenExhausted = closeWhenExhausted; + } + + /** + * Create a new stream pumper. + * + * @param is input stream to read data from + * @param os output stream to write data to. + */ + public StreamPumper(final InputStream is, final OutputStream os) { + this(is, os, false); + } + + /** + * Copies data from the input stream to the output stream. Terminates as + * soon as the input stream is closed or an error occurs. + */ + public void run() { + synchronized (this) { + // Just in case this object is reused in the future + finished = false; + } + + final byte[] buf = new byte[this.size]; + + int length; + try { + //hack: пропатчили алгоритм + while (!Thread.currentThread().isInterrupted() && (length = is.read(buf)) > 0) { + os.write(buf, 0, length); + os.flush(); + } + } catch (final Exception e) { + // nothing to do - happens quite often with watchdog + } finally { + if (closeWhenExhausted) { + try { + os.close(); + } catch (final IOException e) { + final String msg = "Got exception while closing exhausted output stream"; + DebugUtils.handleException(msg ,e); + } + } + synchronized (this) { + finished = true; + notifyAll(); + } + } + } + + /** + * Tells whether the end of the stream has been reached. + * + * @return true is the stream has been exhausted. + */ + public synchronized boolean isFinished() { + return finished; + } + + /** + * This method blocks until the stream pumper finishes. + * + * @exception InterruptedException + * if any thread interrupted the current thread before or while the current thread was waiting for a + * notification. + * @see #isFinished() + */ + public synchronized void waitFor() throws InterruptedException { + while (!isFinished()) { + wait(); + } + } +} From 038693189eee3db1b931f183e3d50d36f699bc20 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 15 Jun 2017 23:38:49 +0300 Subject: [PATCH 26/73] =?UTF-8?q?Zond:=20=D0=BF=D1=80=D0=B8=D0=BD=D1=83?= =?UTF-8?q?=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D0=B5=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=B2=D0=B5=D1=80=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D1=86=D0=B5=D1=81=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 2 +- zond/src/main/java/asys/zond/ZondCommandHandler.java | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/zond/build.gradle b/zond/build.gradle index eba758b..42a51f7 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.7.2-SNAPSHOT' +version = '0.7.3-SNAPSHOT' apply plugin: 'application' diff --git a/zond/src/main/java/asys/zond/ZondCommandHandler.java b/zond/src/main/java/asys/zond/ZondCommandHandler.java index 5d905dd..cd5be4e 100644 --- a/zond/src/main/java/asys/zond/ZondCommandHandler.java +++ b/zond/src/main/java/asys/zond/ZondCommandHandler.java @@ -54,6 +54,11 @@ public class ZondCommandHandler implements CommandHandler { threadExec = new Thread(task, "Zond Exec"); threadExec.start(); } + } else if (line.equalsIgnoreCase("kill")) { + if (watchdog != null) { + watchdog.destroyProcess(); + threadExec.interrupt(); + } } } From f1bebae16005c74c266728a887717213a4c38479 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 17 Jun 2017 01:10:17 +0300 Subject: [PATCH 27/73] =?UTF-8?q?Zond:=20=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20(fake)=20=D0=BA=20ASys?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 13 +++- .../java/asys/zond/ZondCommandHandler.java | 4 ++ .../src/main/java/asys/zond/proxy/Client.java | 72 +++++++++++++++++++ .../asys/zond/proxy/ClientPacketHandler.java | 70 ++++++++++++++++++ .../main/java/asys/zond/proxy/Connector.java | 58 +++++++++++++++ .../main/java/asys/zond/proxy/TaskTicker.java | 52 ++++++++++++++ 6 files changed, 268 insertions(+), 1 deletion(-) create mode 100644 zond/src/main/java/asys/zond/proxy/Client.java create mode 100644 zond/src/main/java/asys/zond/proxy/ClientPacketHandler.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/zond/build.gradle b/zond/build.gradle index 42a51f7..9f41be0 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.7.3-SNAPSHOT' +version = '0.7.4-SNAPSHOT' apply plugin: 'application' @@ -18,6 +18,10 @@ def zp(FileTree ft) { } } +compileJava { + dependsOn ':libprotocol:compileJava' +} + jar { dependsOn configurations.included dependsOn configurations.includedEx @@ -31,7 +35,14 @@ jar { from { configurations.includedEx.collect { it.isDirectory() ? it : zp(zipTree(it)) } } } +ext { + nettyVersion = '4.0.23.Final' +} + dependencies { + included files(project(':libprotocol').sourceSets.main.output.classesDir) included group: 'jline', name: 'jline', version: '2.14.3' includedEx group: 'org.apache.commons', name: 'commons-exec', version: '1.3' + included group: 'io.netty', name: 'netty-codec', version: nettyVersion + included group: 'com.google.guava', name: 'guava', version: '21.0' } diff --git a/zond/src/main/java/asys/zond/ZondCommandHandler.java b/zond/src/main/java/asys/zond/ZondCommandHandler.java index cd5be4e..3b08abe 100644 --- a/zond/src/main/java/asys/zond/ZondCommandHandler.java +++ b/zond/src/main/java/asys/zond/ZondCommandHandler.java @@ -4,6 +4,7 @@ */ package asys.zond; +import asys.zond.proxy.Connector; import asys.zond.shell.CommandHandler; import asys.zond.shell.Shell; import org.apache.commons.exec.CommandLine; @@ -34,6 +35,7 @@ public class ZondCommandHandler implements CommandHandler { watchdog.destroyProcess(); threadExec.interrupt(); } + Connector.getInstance().shutdown(); Shell.getInstance().shutdown(); } else if (line.equalsIgnoreCase("start")) { if (watchdog == null) { @@ -59,6 +61,8 @@ public class ZondCommandHandler implements CommandHandler { watchdog.destroyProcess(); threadExec.interrupt(); } + } else if (line.equalsIgnoreCase("connect")) { + Connector.getInstance().startReconnect("127.0.0.1", 8779); } } diff --git a/zond/src/main/java/asys/zond/proxy/Client.java b/zond/src/main/java/asys/zond/proxy/Client.java new file mode 100644 index 0000000..5500af6 --- /dev/null +++ b/zond/src/main/java/asys/zond/proxy/Client.java @@ -0,0 +1,72 @@ +/* + * DmitriyMX + * 2017-06-16 + */ +package asys.zond.proxy; + +import asys.mcsmanager.packets.Packet; +import asys.mcsmanager.packets.codec.PacketDecoder; +import asys.mcsmanager.packets.codec.PacketEncoder; +import asys.mcsmanager.packets.codec.PacketHandler; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; + +public class Client { + private EventLoopGroup group; + private Bootstrap bootstrap; + private ChannelFuture channelFuture; + + public void connect(String host, int port) { + if (group == null || bootstrap == null) { + group = new NioEventLoopGroup(); + bootstrap = createBootstrap(); + } + + channelFuture = bootstrap.connect(host, port); + channelFuture.awaitUninterruptibly(5000); + } + + public void disconnect() { + channelFuture.channel().close(); + group.shutdownGracefully(); + } + + public boolean isConnected() { + return (channelFuture != null && channelFuture.isSuccess()); + } + + public void sendPacket(Packet packet) { + if (isConnected()) { + channelFuture.channel().writeAndFlush(packet); + } + } + + private Bootstrap createBootstrap() { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(group) + .channel(NioSocketChannel.class) + .handler(createChannelInitializer()); + + return bootstrap; + } + + private ChannelHandler createChannelInitializer() { + return new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) throws Exception { + socketChannel.pipeline().addLast( + new PacketEncoder(), + new PacketDecoder(), + new PacketHandler(), + new ClientPacketHandler() + ); + } + }; + } +} diff --git a/zond/src/main/java/asys/zond/proxy/ClientPacketHandler.java b/zond/src/main/java/asys/zond/proxy/ClientPacketHandler.java new file mode 100644 index 0000000..1de976e --- /dev/null +++ b/zond/src/main/java/asys/zond/proxy/ClientPacketHandler.java @@ -0,0 +1,70 @@ +/* + * DmitriyMX + * 2017-06-16 + */ +package asys.zond.proxy; + +import asys.mcsmanager.packets.*; +import asys.zond.shell.Shell; +import com.google.common.collect.BiMap; +import com.google.common.collect.ImmutableBiMap; +import com.google.common.collect.ImmutableMap; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; + +import java.util.Map; + +import static asys.mcsmanager.packets.codec.Params.KNOWN_HANDLERS; +import static asys.mcsmanager.packets.codec.Params.KNOWN_PACKETS; + +public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements IPacketHandler { + private final BiMap> handshakePackets; + private final Map, IPacketHandler> handshakeHandlers; + private final BiMap> knownPackets; + + ClientPacketHandler() { + handshakePackets = ImmutableBiMap.of( + 1, CS_Handshake.class, + 2, SC_HandshakeResult.class + ); + handshakeHandlers = ImmutableMap.of( + SC_HandshakeResult.class, this + ); + + knownPackets = ImmutableBiMap.of( + 3, CS_Ping.class, + 4, CS_ConsoleMessage.class + ); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + ctx.channel().attr(KNOWN_PACKETS).set(handshakePackets); + ctx.channel().attr(KNOWN_HANDLERS).set(handshakeHandlers); + + ctx.channel().writeAndFlush(new CS_Handshake("00","11")); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + ctx.channel().attr(KNOWN_PACKETS).remove(); + ctx.channel().attr(KNOWN_HANDLERS).remove(); + } + + @Override + public void handle(Packet packet, ChannelHandlerContext context) { + if (packet instanceof SC_HandshakeResult) { + handleHandshakeResult((SC_HandshakeResult) packet, context); + } + } + + private void handleHandshakeResult(SC_HandshakeResult packet, ChannelHandlerContext context) { + if (packet.getErrorCode() != 0) { + Shell.getInstance().getOutput() + .println(String.format("Handshake: #%d %s", packet.getErrorCode(), packet.getMessage())); + } else { + context.channel().attr(KNOWN_PACKETS).set(knownPackets); + Shell.getInstance().getOutput().println("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..f7ced12 --- /dev/null +++ b/zond/src/main/java/asys/zond/proxy/Connector.java @@ -0,0 +1,58 @@ +/* + * DmitriyMX + * 2017-06-16 + */ +package asys.zond.proxy; + +import asys.mcsmanager.packets.Packet; +import asys.zond.shell.Shell; + +public class Connector { + private static Connector instance; + private Client client; + private TaskTicker connectTicker; + private int tryConnect = 0; + + public static Connector getInstance() { + if (instance == null) instance = new Connector(); + return instance; + } + + private Connector() { + } + + public void startReconnect(final String host, final int port) { + if (connectTicker != null && connectTicker.isActive()) return; + client = new Client(); + connectTicker = new TaskTicker().setStepTimeMs(5000L); + connectTicker.setTask(() -> { + Shell.getInstance().getOutput() + .println(String.format("Connect(%d) to ASys...", ++tryConnect)); + client.connect(host, port); + if (client.isConnected()) { + stopReconnect(); + } else { + Shell.getInstance().getOutput() + .println(String.format("Connection(%d) fail. Try reconnect...", tryConnect)); + } + }).start(); + } + + public void stopReconnect() { + if (connectTicker != null) { + connectTicker.stop(); + tryConnect = 0; + } + } + + public void shutdown() { + stopReconnect(); + client.disconnect(); + } + + public void sendPacket(Packet packet) { + if (client != null) { + client.sendPacket(packet); + } + } +} 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..52313fb --- /dev/null +++ b/zond/src/main/java/asys/zond/proxy/TaskTicker.java @@ -0,0 +1,52 @@ +/* + * 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(); + } + } + + boolean isActive() { + return loop; + } + + @Override + public void run() { + while (loop || !Thread.currentThread().isInterrupted()) { + task.run(); + + try { + Thread.sleep(stepTimeMs); + } catch (InterruptedException e) { + break; + } + } + } +} From c81232ef9682f8be55cd07da19732b968ac35989 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 17 Jun 2017 01:13:33 +0300 Subject: [PATCH 28/73] =?UTF-8?q?Zond:=20=D0=BF=D1=80=D0=B8=D0=BD=D1=83?= =?UTF-8?q?=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D0=B5=20=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE?= =?UTF-8?q?=D1=82=20ASys?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 2 +- zond/src/main/java/asys/zond/ZondCommandHandler.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/zond/build.gradle b/zond/build.gradle index 9f41be0..d5853e8 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.7.4-SNAPSHOT' +version = '0.7.5-SNAPSHOT' apply plugin: 'application' diff --git a/zond/src/main/java/asys/zond/ZondCommandHandler.java b/zond/src/main/java/asys/zond/ZondCommandHandler.java index 3b08abe..e7dc7a2 100644 --- a/zond/src/main/java/asys/zond/ZondCommandHandler.java +++ b/zond/src/main/java/asys/zond/ZondCommandHandler.java @@ -63,6 +63,8 @@ public class ZondCommandHandler implements CommandHandler { } } else if (line.equalsIgnoreCase("connect")) { Connector.getInstance().startReconnect("127.0.0.1", 8779); + } else if (line.equalsIgnoreCase("disconnect")) { + Connector.getInstance().shutdown(); } } From e10ec527ad61015539e30916a8328fb79437e37c Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 17 Jun 2017 13:45:45 +0300 Subject: [PATCH 29/73] =?UTF-8?q?Zond:=20=D0=B7=D0=B0=D0=B4=D0=B5=D0=B9?= =?UTF-8?q?=D1=81=D1=82=D0=B2=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=84?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D0=B0=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B5=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 2 +- zond/src/main/java/asys/zond/Config.java | 40 +++++++++++++++++++ zond/src/main/java/asys/zond/Main.java | 29 +++++++++++++- .../java/asys/zond/ZondCommandHandler.java | 2 +- .../asys/zond/proxy/ClientPacketHandler.java | 6 ++- .../main/java/asys/zond/proxy/Connector.java | 6 ++- zond/src/main/resources/zond.properties | 4 ++ 7 files changed, 82 insertions(+), 7 deletions(-) create mode 100644 zond/src/main/java/asys/zond/Config.java create mode 100644 zond/src/main/resources/zond.properties diff --git a/zond/build.gradle b/zond/build.gradle index d5853e8..22c29df 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.7.5-SNAPSHOT' +version = '0.7.6-SNAPSHOT' apply plugin: 'application' diff --git a/zond/src/main/java/asys/zond/Config.java b/zond/src/main/java/asys/zond/Config.java new file mode 100644 index 0000000..ba2ed4b --- /dev/null +++ b/zond/src/main/java/asys/zond/Config.java @@ -0,0 +1,40 @@ +/* + * DmitriyMX + * 2017-06-08 + */ +package asys.zond; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +public class Config { + private static final Config instance = new Config(); + private Properties properties = new Properties(); + + public static Config getInstance() { + return instance; + } + + private Config(){ + } + + void load(InputStream inputStream) throws IOException { + properties.load(inputStream); + if (properties.size() == 0) { + throw new IOException("Config empty!"); + } + } + + public String getString(String key) { + return properties.getProperty(key); + } + + public int getInt(String key) { + try { + return Integer.parseInt(properties.getProperty(key)); + } catch (NumberFormatException e) { + return 0; + } + } +} diff --git a/zond/src/main/java/asys/zond/Main.java b/zond/src/main/java/asys/zond/Main.java index d9247b8..ce9de6b 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -11,8 +11,7 @@ import org.apache.commons.exec.DefaultExecutor; import org.apache.commons.exec.Executor; import org.apache.commons.exec.PumpStreamHandler; -import java.io.IOException; -import java.io.PrintStream; +import java.io.*; import java.util.Arrays; import java.util.stream.Collectors; @@ -25,6 +24,13 @@ public class Main { } private void start(String[] args) { + try { + loadConfig(); + } catch (IOException e) { + e.printStackTrace(); + System.exit(-2); + return; + } ZondCommandHandler commandHandler = new ZondCommandHandler(); startShell(commandHandler); initExecCommand(args, Shell.getInstance().getOutput()); @@ -48,4 +54,23 @@ public class Main { PumpStreamHandler pumpStreamHandler = new PumpStreamHandler(stdout); executor.setStreamHandler(pumpStreamHandler); } + + private void loadConfig() throws IOException { + File zondPropertiesFile = new File("zond.properties"); + if (!zondPropertiesFile.exists()) { + InputStream stream = Main.class.getResourceAsStream("/zond.properties"); + FileOutputStream fos = new FileOutputStream(zondPropertiesFile); + byte[] buff = new byte[65536]; + int len; + while ((len = stream.read(buff)) > 0) { + fos.write(buff, 0, len); + } + fos.flush(); + fos.close(); + } + + FileInputStream fis = new FileInputStream(zondPropertiesFile); + Config.getInstance().load(fis); + fis.close(); + } } \ No newline at end of file diff --git a/zond/src/main/java/asys/zond/ZondCommandHandler.java b/zond/src/main/java/asys/zond/ZondCommandHandler.java index e7dc7a2..68796fc 100644 --- a/zond/src/main/java/asys/zond/ZondCommandHandler.java +++ b/zond/src/main/java/asys/zond/ZondCommandHandler.java @@ -62,7 +62,7 @@ public class ZondCommandHandler implements CommandHandler { threadExec.interrupt(); } } else if (line.equalsIgnoreCase("connect")) { - Connector.getInstance().startReconnect("127.0.0.1", 8779); + Connector.getInstance().startReconnect(); } else if (line.equalsIgnoreCase("disconnect")) { Connector.getInstance().shutdown(); } diff --git a/zond/src/main/java/asys/zond/proxy/ClientPacketHandler.java b/zond/src/main/java/asys/zond/proxy/ClientPacketHandler.java index 1de976e..cae7496 100644 --- a/zond/src/main/java/asys/zond/proxy/ClientPacketHandler.java +++ b/zond/src/main/java/asys/zond/proxy/ClientPacketHandler.java @@ -5,6 +5,7 @@ package asys.zond.proxy; import asys.mcsmanager.packets.*; +import asys.zond.Config; import asys.zond.shell.Shell; import com.google.common.collect.BiMap; import com.google.common.collect.ImmutableBiMap; @@ -42,7 +43,10 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements ctx.channel().attr(KNOWN_PACKETS).set(handshakePackets); ctx.channel().attr(KNOWN_HANDLERS).set(handshakeHandlers); - ctx.channel().writeAndFlush(new CS_Handshake("00","11")); + ctx.channel().writeAndFlush(new CS_Handshake( + Config.getInstance().getString("serverId"), + Config.getInstance().getString("passcode") + )); } @Override diff --git a/zond/src/main/java/asys/zond/proxy/Connector.java b/zond/src/main/java/asys/zond/proxy/Connector.java index f7ced12..496e057 100644 --- a/zond/src/main/java/asys/zond/proxy/Connector.java +++ b/zond/src/main/java/asys/zond/proxy/Connector.java @@ -5,6 +5,7 @@ package asys.zond.proxy; import asys.mcsmanager.packets.Packet; +import asys.zond.Config; import asys.zond.shell.Shell; public class Connector { @@ -21,14 +22,15 @@ public class Connector { private Connector() { } - public void startReconnect(final String host, final int port) { + public void startReconnect() { if (connectTicker != null && connectTicker.isActive()) return; client = new Client(); connectTicker = new TaskTicker().setStepTimeMs(5000L); connectTicker.setTask(() -> { Shell.getInstance().getOutput() .println(String.format("Connect(%d) to ASys...", ++tryConnect)); - client.connect(host, port); + client.connect(Config.getInstance().getString("host"), + Config.getInstance().getInt("port")); if (client.isConnected()) { stopReconnect(); } else { diff --git a/zond/src/main/resources/zond.properties b/zond/src/main/resources/zond.properties new file mode 100644 index 0000000..3e96cb1 --- /dev/null +++ b/zond/src/main/resources/zond.properties @@ -0,0 +1,4 @@ +serverId = SpigotServer0 +host = 127.0.0.1 +port = 8779 +passcode = testpassphrase \ No newline at end of file From 14b3f46b502180acff8a460564f1502848b31851 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 17 Jun 2017 13:48:15 +0300 Subject: [PATCH 30/73] =?UTF-8?q?Zond:fix:=20=D1=80=D0=B0=D0=B7=D0=BE?= =?UTF-8?q?=D1=80=D0=B2=D0=B0=D1=82=D1=8C=20=D1=81=D0=BE=D0=B5=D0=B4=D0=B8?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5?= =?UTF-8?q?=20=D0=BD=D0=B5=D1=83=D0=B4=D0=B0=D1=87=D0=BD=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=20handshake?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/src/main/java/asys/zond/proxy/ClientPacketHandler.java | 1 + 1 file changed, 1 insertion(+) diff --git a/zond/src/main/java/asys/zond/proxy/ClientPacketHandler.java b/zond/src/main/java/asys/zond/proxy/ClientPacketHandler.java index cae7496..07e74ff 100644 --- a/zond/src/main/java/asys/zond/proxy/ClientPacketHandler.java +++ b/zond/src/main/java/asys/zond/proxy/ClientPacketHandler.java @@ -66,6 +66,7 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements if (packet.getErrorCode() != 0) { Shell.getInstance().getOutput() .println(String.format("Handshake: #%d %s", packet.getErrorCode(), packet.getMessage())); + Connector.getInstance().shutdown(); } else { context.channel().attr(KNOWN_PACKETS).set(knownPackets); Shell.getInstance().getOutput().println("Handshake: OK"); From 4c410cb7e74431f2f7d8a45c94156f1bb1b61061 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 17 Jun 2017 14:11:10 +0300 Subject: [PATCH 31/73] =?UTF-8?q?Zond:=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B7?= =?UTF-8?q?=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B0=20=D0=BD=D0=B0=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=B5=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/src/main/java/asys/zond/Config.java | 22 +++++++++++++++++-- zond/src/main/java/asys/zond/Main.java | 21 +----------------- .../java/asys/zond/ZondCommandHandler.java | 7 ++++++ 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/zond/src/main/java/asys/zond/Config.java b/zond/src/main/java/asys/zond/Config.java index ba2ed4b..9fb6036 100644 --- a/zond/src/main/java/asys/zond/Config.java +++ b/zond/src/main/java/asys/zond/Config.java @@ -4,8 +4,7 @@ */ package asys.zond; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import java.util.Properties; public class Config { @@ -26,6 +25,25 @@ public class Config { } } + void load() throws IOException { + File zondPropertiesFile = new File("zond.properties"); + if (!zondPropertiesFile.exists()) { + InputStream stream = Config.class.getResourceAsStream("/zond.properties"); + FileOutputStream fos = new FileOutputStream(zondPropertiesFile); + byte[] buff = new byte[128]; + int len; + while ((len = stream.read(buff)) > 0) { + fos.write(buff, 0, len); + } + fos.flush(); + fos.close(); + } + + FileInputStream fis = new FileInputStream(zondPropertiesFile); + load(fis); + fis.close(); + } + public String getString(String key) { return properties.getProperty(key); } diff --git a/zond/src/main/java/asys/zond/Main.java b/zond/src/main/java/asys/zond/Main.java index ce9de6b..dcecf7b 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -25,7 +25,7 @@ public class Main { private void start(String[] args) { try { - loadConfig(); + Config.getInstance().load(); } catch (IOException e) { e.printStackTrace(); System.exit(-2); @@ -54,23 +54,4 @@ public class Main { PumpStreamHandler pumpStreamHandler = new PumpStreamHandler(stdout); executor.setStreamHandler(pumpStreamHandler); } - - private void loadConfig() throws IOException { - File zondPropertiesFile = new File("zond.properties"); - if (!zondPropertiesFile.exists()) { - InputStream stream = Main.class.getResourceAsStream("/zond.properties"); - FileOutputStream fos = new FileOutputStream(zondPropertiesFile); - byte[] buff = new byte[65536]; - int len; - while ((len = stream.read(buff)) > 0) { - fos.write(buff, 0, len); - } - fos.flush(); - fos.close(); - } - - FileInputStream fis = new FileInputStream(zondPropertiesFile); - Config.getInstance().load(fis); - fis.close(); - } } \ No newline at end of file diff --git a/zond/src/main/java/asys/zond/ZondCommandHandler.java b/zond/src/main/java/asys/zond/ZondCommandHandler.java index 68796fc..bc13f4b 100644 --- a/zond/src/main/java/asys/zond/ZondCommandHandler.java +++ b/zond/src/main/java/asys/zond/ZondCommandHandler.java @@ -65,6 +65,13 @@ public class ZondCommandHandler implements CommandHandler { Connector.getInstance().startReconnect(); } else if (line.equalsIgnoreCase("disconnect")) { Connector.getInstance().shutdown(); + } else if (line.equalsIgnoreCase("reload")) { + Shell.getInstance().getOutput().println("Reload config"); + try { + Config.getInstance().load(); + } catch (IOException e) { + e.printStackTrace(); + } } } From 2100f7a8051dc4902dea895a492697e0bc0f47d2 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 17 Jun 2017 14:29:46 +0300 Subject: [PATCH 32/73] =?UTF-8?q?Zond:fix:=20=D0=B3=D1=80=D0=B0=D0=BC?= =?UTF-8?q?=D0=BE=D0=BD=D1=82=D0=BD=D0=BE=D0=B5=20=D0=BE=D1=82=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=82=20ASys?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/src/main/java/asys/zond/ZondCommandHandler.java | 1 + zond/src/main/java/asys/zond/proxy/Client.java | 7 +++++-- zond/src/main/java/asys/zond/proxy/Connector.java | 3 ++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/zond/src/main/java/asys/zond/ZondCommandHandler.java b/zond/src/main/java/asys/zond/ZondCommandHandler.java index bc13f4b..481d1ef 100644 --- a/zond/src/main/java/asys/zond/ZondCommandHandler.java +++ b/zond/src/main/java/asys/zond/ZondCommandHandler.java @@ -64,6 +64,7 @@ public class ZondCommandHandler implements CommandHandler { } else if (line.equalsIgnoreCase("connect")) { Connector.getInstance().startReconnect(); } else if (line.equalsIgnoreCase("disconnect")) { + Shell.getInstance().getOutput().println("Disconnect"); Connector.getInstance().shutdown(); } else if (line.equalsIgnoreCase("reload")) { Shell.getInstance().getOutput().println("Reload config"); diff --git a/zond/src/main/java/asys/zond/proxy/Client.java b/zond/src/main/java/asys/zond/proxy/Client.java index 5500af6..d9c4e61 100644 --- a/zond/src/main/java/asys/zond/proxy/Client.java +++ b/zond/src/main/java/asys/zond/proxy/Client.java @@ -33,8 +33,11 @@ public class Client { } public void disconnect() { - channelFuture.channel().close(); - group.shutdownGracefully(); + if (isConnected()) { + channelFuture.channel().close(); + channelFuture = null; + group.shutdownGracefully(); + } } public boolean isConnected() { diff --git a/zond/src/main/java/asys/zond/proxy/Connector.java b/zond/src/main/java/asys/zond/proxy/Connector.java index 496e057..ef980a8 100644 --- a/zond/src/main/java/asys/zond/proxy/Connector.java +++ b/zond/src/main/java/asys/zond/proxy/Connector.java @@ -23,7 +23,8 @@ public class Connector { } public void startReconnect() { - if (connectTicker != null && connectTicker.isActive()) return; + if ((connectTicker != null && connectTicker.isActive()) || + (client != null && client.isConnected())) return; client = new Client(); connectTicker = new TaskTicker().setStepTimeMs(5000L); connectTicker.setTask(() -> { From 5d1c674f111c4d6f4ed48e8b0fa138d99df5c514 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 17 Jun 2017 14:44:20 +0300 Subject: [PATCH 33/73] Zond: update README --- zond/README.MD | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/zond/README.MD b/zond/README.MD index 1c6bf7b..e61e9bd 100644 --- a/zond/README.MD +++ b/zond/README.MD @@ -1,3 +1,41 @@ # Zond Проксирующий запускатор, дающий больший контроль над процессом игрового сервера. + +## Настройка + +Настройки храняться в файле `zond.properties`. +Если файл не будет найден, **Zond** создаст файл настроек по-умолчанию + +`serverId` - идентификатор запускаемого сервера. Одновременно является именем и уникальным ID + +`host` - IP/Hostname для подключения к **ASys** + +`port` - порт для подключения к **ASys** + +`passcode` - секретное слово для предотвращения несанкционированного подключения + +## Запуск + +В качестве параметров передаётся коммандная строка для запуска майн-сервера. + +Пример запуска: + +``` +FORGE=java -jar forge-1.10.2-universal.jar +java -jar asys.zond.jar $FORGE +``` + +## Комманды + +`:reload` - перезагрузить настройки + +`:connect` - подключиться к **ASys** + +`:disconnect` - отключиться от **ASys** + +`:start` - запуск процесса майн-сервера + +`:kill` - принудительно завершить процесс майн-сервера + +`:exit` - завершить работу **Zond**. \ No newline at end of file From c96bb3784558f52a881c869177f5e38dee8f2cc7 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 17 Jun 2017 14:45:01 +0300 Subject: [PATCH 34/73] Bridge: update README --- bridge/README.MD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bridge/README.MD b/bridge/README.MD index 12aca70..d7a5d23 100644 --- a/bridge/README.MD +++ b/bridge/README.MD @@ -1,9 +1,9 @@ # Bridge -Плагин, служащий "мостом" между внутренним серверным API и ASys +Плагин, служащий "мостом" между внутренним серверным API и **ASys** ## Настройка Настройки хранятся в файле `config.yml`. -`port` - Порт для подключения к Zond. \ No newline at end of file +`port` - Порт для подключения к **Zond**. \ No newline at end of file From 42f94093a71c1a1a69a2481acd9b20ad44e8c548 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 24 Jun 2017 17:12:29 +0300 Subject: [PATCH 35/73] =?UTF-8?q?Bridge:=20=D0=BE=D1=82=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BA=D0=B0=20ping-=D0=BF=D0=B0=D0=BA=D0=B5=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=BD=D0=B0=20Zond?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bridge/build.gradle | 2 +- .../java/asys/bridge/bukkit/BridgePlugin.java | 5 +++++ .../asys/bridge/client/AbstractBridge.java | 19 ++++--------------- .../main/java/asys/bridge/client/Client.java | 7 +++++++ .../main/java/asys/bridge/client/IBridge.java | 4 +--- 5 files changed, 18 insertions(+), 19 deletions(-) diff --git a/bridge/build.gradle b/bridge/build.gradle index 071d568..ab5ec1e 100644 --- a/bridge/build.gradle +++ b/bridge/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.8-SNAPSHOT' +version = '0.8.1-SNAPSHOT' repositories { maven { url 'https://hub.spigotmc.org/nexus/content/groups/public/' } diff --git a/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java b/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java index 4d73b8f..3431ec5 100644 --- a/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java +++ b/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java @@ -18,6 +18,11 @@ public class BridgePlugin extends JavaPlugin { this.bridgeBukkit.startReconnect(); } + @Override + public void onEnable() { + this.bridgeBukkit.startPing(); + } + @Override public void onDisable() { this.bridgeBukkit.setNeedReconnect(false); diff --git a/bridge/src/main/java/asys/bridge/client/AbstractBridge.java b/bridge/src/main/java/asys/bridge/client/AbstractBridge.java index fb4b277..bc8b0d3 100644 --- a/bridge/src/main/java/asys/bridge/client/AbstractBridge.java +++ b/bridge/src/main/java/asys/bridge/client/AbstractBridge.java @@ -20,7 +20,7 @@ public abstract class AbstractBridge implements IBridge { connectTicker = new TaskTicker().setStepTimeMs(5000L); connectTicker.setTask(() -> { getLogger().info(String.format("Connect(%d) to Zond...", ++tryConnect)); - client.connect(getConfig().getString("host"), getConfig().getInt("port")); + client.connect("127.0.0.1", getConfig().getInt("port")); if (client.isConnected()) { stopReconnect(); } else { @@ -48,24 +48,13 @@ public abstract class AbstractBridge implements IBridge { } @Override - public void startPing(Channel channel) { + public void startPing() { pingTicker = new TaskTicker().setStepTimeMs(5000L); pingTicker.setTask(() -> { - channel.write(new CS_Ping( + client.sendPacket(new CS_Ping( System.currentTimeMillis(), 20.0D, //FIXME fake tps - getCountOnlinePlayers() - )); - if (channel.isWritable()) { - channel.flush(); - } else { - getLogger().warn("Lost connection!"); - channel.close(); - stopPing(); - - getLogger().warn("Try reconnect..."); - startReconnect(); - } + getCountOnlinePlayers())); }).start(); } diff --git a/bridge/src/main/java/asys/bridge/client/Client.java b/bridge/src/main/java/asys/bridge/client/Client.java index b9d354b..7243997 100644 --- a/bridge/src/main/java/asys/bridge/client/Client.java +++ b/bridge/src/main/java/asys/bridge/client/Client.java @@ -4,6 +4,7 @@ */ package asys.bridge.client; +import asys.mcsmanager.packets.Packet; import asys.mcsmanager.packets.codec.PacketDecoder; import asys.mcsmanager.packets.codec.PacketEncoder; import asys.mcsmanager.packets.codec.PacketHandler; @@ -65,4 +66,10 @@ public class Client { } }; } + + public void sendPacket(Packet packet) { + if (isConnected()) { + channelFuture.channel().writeAndFlush(packet); + } + } } diff --git a/bridge/src/main/java/asys/bridge/client/IBridge.java b/bridge/src/main/java/asys/bridge/client/IBridge.java index 3ded3e8..d8118e1 100644 --- a/bridge/src/main/java/asys/bridge/client/IBridge.java +++ b/bridge/src/main/java/asys/bridge/client/IBridge.java @@ -4,8 +4,6 @@ */ package asys.bridge.client; -import io.netty.channel.Channel; - public interface IBridge { ILogger getLogger(); IConfig getConfig(); @@ -15,7 +13,7 @@ public interface IBridge { boolean isNeedReconnect(); void setNeedReconnect(boolean value); void stopReconnect(); - void startPing(Channel channel); + void startPing(); void stopPing(); void disconnect(); } From 1f9bac5a0a304095090629220b278934371acc67 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 24 Jun 2017 17:13:19 +0300 Subject: [PATCH 36/73] =?UTF-8?q?Zond:=20=D1=81=D0=BE=D0=B5=D0=B4=D0=B8?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=20Bridge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 2 +- .../java/asys/zond/ZondCommandHandler.java | 12 +++- .../main/java/asys/zond/proxy/TaskTicker.java | 10 ++-- .../asys/zond/proxy/{ => client}/Client.java | 2 +- .../{ => client}/ClientPacketHandler.java | 5 +- .../zond/proxy/{ => client}/Connector.java | 3 +- .../java/asys/zond/proxy/server/Server.java | 57 ++++++++++++++++++ .../proxy/server/ServerPacketHandler.java | 59 +++++++++++++++++++ zond/src/main/resources/zond.properties | 3 +- 9 files changed, 141 insertions(+), 12 deletions(-) rename zond/src/main/java/asys/zond/proxy/{ => client}/Client.java (98%) rename zond/src/main/java/asys/zond/proxy/{ => client}/ClientPacketHandler.java (95%) rename zond/src/main/java/asys/zond/proxy/{ => client}/Connector.java (96%) create mode 100644 zond/src/main/java/asys/zond/proxy/server/Server.java create mode 100644 zond/src/main/java/asys/zond/proxy/server/ServerPacketHandler.java diff --git a/zond/build.gradle b/zond/build.gradle index 22c29df..4b64163 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.7.6-SNAPSHOT' +version = '0.7.7-SNAPSHOT' apply plugin: 'application' diff --git a/zond/src/main/java/asys/zond/ZondCommandHandler.java b/zond/src/main/java/asys/zond/ZondCommandHandler.java index 481d1ef..6c264cd 100644 --- a/zond/src/main/java/asys/zond/ZondCommandHandler.java +++ b/zond/src/main/java/asys/zond/ZondCommandHandler.java @@ -4,7 +4,8 @@ */ package asys.zond; -import asys.zond.proxy.Connector; +import asys.zond.proxy.client.Connector; +import asys.zond.proxy.server.Server; import asys.zond.shell.CommandHandler; import asys.zond.shell.Shell; import org.apache.commons.exec.CommandLine; @@ -19,6 +20,7 @@ public class ZondCommandHandler implements CommandHandler { private CommandLine commandLine; private ExecuteWatchdog watchdog; private Thread threadExec; + private Server server; @Override public void handle(String commandLine) { @@ -32,6 +34,7 @@ public class ZondCommandHandler implements CommandHandler { private void internalCommand(String line) { if (line.equalsIgnoreCase("exit") || line.equalsIgnoreCase("quit")) { if (watchdog != null) { + server.shutdown(); watchdog.destroyProcess(); threadExec.interrupt(); } @@ -44,12 +47,18 @@ public class ZondCommandHandler implements CommandHandler { Runnable task = () -> { int code = 0; try { + server = new Server(); + server.start(Config.getInstance().getInt("bridge.port")); + code = executor.execute(commandLine); } catch (ExecuteException ignore) { } catch (IOException e) { Shell.getInstance().getOutput().println("Exception message: " + e.getMessage()); code = -99; } + + server.shutdown(); + server = null; watchdog = null; Shell.getInstance().getOutput().println("Process finished. Code: " + code); }; @@ -58,6 +67,7 @@ public class ZondCommandHandler implements CommandHandler { } } else if (line.equalsIgnoreCase("kill")) { if (watchdog != null) { + server.shutdown(); watchdog.destroyProcess(); threadExec.interrupt(); } diff --git a/zond/src/main/java/asys/zond/proxy/TaskTicker.java b/zond/src/main/java/asys/zond/proxy/TaskTicker.java index 52313fb..b2d59e3 100644 --- a/zond/src/main/java/asys/zond/proxy/TaskTicker.java +++ b/zond/src/main/java/asys/zond/proxy/TaskTicker.java @@ -10,30 +10,30 @@ public class TaskTicker implements Runnable { private Thread thread; private boolean loop = false; - TaskTicker setTask(Runnable task) { + public TaskTicker setTask(Runnable task) { this.task = task; return this; } - TaskTicker setStepTimeMs(long stepTimeMs) { + public TaskTicker setStepTimeMs(long stepTimeMs) { this.stepTimeMs = stepTimeMs; return this; } - void start() { + public void start() { thread = new Thread(this, "TaskTicker"); loop = true; thread.start(); } - void stop() { + public void stop() { loop = false; if (thread != null) { thread.interrupt(); } } - boolean isActive() { + public boolean isActive() { return loop; } diff --git a/zond/src/main/java/asys/zond/proxy/Client.java b/zond/src/main/java/asys/zond/proxy/client/Client.java similarity index 98% rename from zond/src/main/java/asys/zond/proxy/Client.java rename to zond/src/main/java/asys/zond/proxy/client/Client.java index d9c4e61..ab57fac 100644 --- a/zond/src/main/java/asys/zond/proxy/Client.java +++ b/zond/src/main/java/asys/zond/proxy/client/Client.java @@ -2,7 +2,7 @@ * DmitriyMX * 2017-06-16 */ -package asys.zond.proxy; +package asys.zond.proxy.client; import asys.mcsmanager.packets.Packet; import asys.mcsmanager.packets.codec.PacketDecoder; diff --git a/zond/src/main/java/asys/zond/proxy/ClientPacketHandler.java b/zond/src/main/java/asys/zond/proxy/client/ClientPacketHandler.java similarity index 95% rename from zond/src/main/java/asys/zond/proxy/ClientPacketHandler.java rename to zond/src/main/java/asys/zond/proxy/client/ClientPacketHandler.java index 07e74ff..84c70a8 100644 --- a/zond/src/main/java/asys/zond/proxy/ClientPacketHandler.java +++ b/zond/src/main/java/asys/zond/proxy/client/ClientPacketHandler.java @@ -2,7 +2,7 @@ * DmitriyMX * 2017-06-16 */ -package asys.zond.proxy; +package asys.zond.proxy.client; import asys.mcsmanager.packets.*; import asys.zond.Config; @@ -34,7 +34,8 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements knownPackets = ImmutableBiMap.of( 3, CS_Ping.class, - 4, CS_ConsoleMessage.class + 4, CS_ConsoleMessage.class, + 5, SC_Command.class ); } diff --git a/zond/src/main/java/asys/zond/proxy/Connector.java b/zond/src/main/java/asys/zond/proxy/client/Connector.java similarity index 96% rename from zond/src/main/java/asys/zond/proxy/Connector.java rename to zond/src/main/java/asys/zond/proxy/client/Connector.java index ef980a8..cdf9953 100644 --- a/zond/src/main/java/asys/zond/proxy/Connector.java +++ b/zond/src/main/java/asys/zond/proxy/client/Connector.java @@ -2,10 +2,11 @@ * DmitriyMX * 2017-06-16 */ -package asys.zond.proxy; +package asys.zond.proxy.client; import asys.mcsmanager.packets.Packet; import asys.zond.Config; +import asys.zond.proxy.TaskTicker; import asys.zond.shell.Shell; public class Connector { diff --git a/zond/src/main/java/asys/zond/proxy/server/Server.java b/zond/src/main/java/asys/zond/proxy/server/Server.java new file mode 100644 index 0000000..abcfe8e --- /dev/null +++ b/zond/src/main/java/asys/zond/proxy/server/Server.java @@ -0,0 +1,57 @@ +/* + * DmitriyMX + * 2017-06-17 + */ +package asys.zond.proxy.server; + +import asys.mcsmanager.packets.codec.PacketDecoder; +import asys.mcsmanager.packets.codec.PacketEncoder; +import asys.mcsmanager.packets.codec.PacketHandler; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; + +public class Server { + private EventLoopGroup bossGroup, workerGroup; + + public void start(int port) { + bossGroup = new NioEventLoopGroup(1); + workerGroup = new NioEventLoopGroup(); + + ServerBootstrap serverBootstrap = createServerBootstrap(); + serverBootstrap.bind("127.0.0.1", port); + } + + public void shutdown() { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + + private ServerBootstrap createServerBootstrap() { + ServerBootstrap bootstrap = new ServerBootstrap(); + + bootstrap.group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .childHandler(createChannelInitializer()); + + return bootstrap; + } + + private ChannelHandler createChannelInitializer() { + return new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) throws Exception { + socketChannel.pipeline().addLast( + new PacketEncoder(), + new PacketDecoder(), + new PacketHandler(), + new ServerPacketHandler() + ); + } + }; + } +} diff --git a/zond/src/main/java/asys/zond/proxy/server/ServerPacketHandler.java b/zond/src/main/java/asys/zond/proxy/server/ServerPacketHandler.java new file mode 100644 index 0000000..6022aaf --- /dev/null +++ b/zond/src/main/java/asys/zond/proxy/server/ServerPacketHandler.java @@ -0,0 +1,59 @@ +/* + * DmitriyMX + * 2017-06-17 + */ +package asys.zond.proxy.server; + +import asys.mcsmanager.packets.*; +import asys.zond.proxy.client.Connector; +import asys.zond.shell.Shell; +import com.google.common.collect.BiMap; +import com.google.common.collect.ImmutableBiMap; +import com.google.common.collect.ImmutableMap; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; + +import java.util.Map; + +import static asys.mcsmanager.packets.codec.Params.KNOWN_HANDLERS; +import static asys.mcsmanager.packets.codec.Params.KNOWN_PACKETS; + +public class ServerPacketHandler extends ChannelInboundHandlerAdapter implements IPacketHandler { + private final BiMap> knownPackets; + private final Map, IPacketHandler> knownHandlers; + + ServerPacketHandler() { + knownPackets = ImmutableBiMap.of( + 3, CS_Ping.class, + 5, SC_Command.class + ); + knownHandlers = ImmutableMap.of( + CS_Ping.class, this, + CS_ConsoleMessage.class, this + ); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + ctx.channel().attr(KNOWN_PACKETS).set(knownPackets); + ctx.channel().attr(KNOWN_HANDLERS).set(knownHandlers); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + ctx.channel().attr(KNOWN_PACKETS).remove(); + ctx.channel().attr(KNOWN_HANDLERS).remove(); + } + + @Override + public void handle(Packet packet, ChannelHandlerContext context) { + if (packet instanceof CS_Ping) { + handleCSPing((CS_Ping) packet); + } + } + + private void handleCSPing(CS_Ping packet) { + Shell.getInstance().getOutput().println("proxied CS_Ping... [" + packet.getTime() + "]"); + Connector.getInstance().sendPacket(packet); + } +} diff --git a/zond/src/main/resources/zond.properties b/zond/src/main/resources/zond.properties index 3e96cb1..924f988 100644 --- a/zond/src/main/resources/zond.properties +++ b/zond/src/main/resources/zond.properties @@ -1,4 +1,5 @@ serverId = SpigotServer0 host = 127.0.0.1 port = 8779 -passcode = testpassphrase \ No newline at end of file +passcode = testpassphrase +bridge.port = 8710 \ No newline at end of file From b82e9a6a9923799c9ea2ff2516502751cc5f88f6 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 13 Jul 2017 23:02:05 +0300 Subject: [PATCH 37/73] =?UTF-8?q?Zond:=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4?= =?UTF-8?q?=D0=B0=D1=87=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B0=D0=BD=D0=B4?= =?UTF-8?q?=20=D0=B2=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D1=81=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 2 +- zond/src/main/java/asys/zond/Main.java | 6 +- .../main/java/asys/zond/PipeInputStream.java | 88 +++++++++++++++++++ .../java/asys/zond/ZondCommandHandler.java | 6 ++ 4 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 zond/src/main/java/asys/zond/PipeInputStream.java diff --git a/zond/build.gradle b/zond/build.gradle index 4b64163..2e43f48 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.7.7-SNAPSHOT' +version = '0.7.8-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 dcecf7b..ba625b3 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -18,6 +18,7 @@ import java.util.stream.Collectors; public class Main { private Executor executor; private CommandLine commandLine; + private PipeInputStream proxyStdIn; public static void main(String[] args) throws IOException { new Main().start(args); @@ -31,7 +32,8 @@ public class Main { System.exit(-2); return; } - ZondCommandHandler commandHandler = new ZondCommandHandler(); + proxyStdIn = new PipeInputStream(); + ZondCommandHandler commandHandler = new ZondCommandHandler(proxyStdIn); startShell(commandHandler); initExecCommand(args, Shell.getInstance().getOutput()); commandHandler.setExecutor(executor, commandLine); @@ -51,7 +53,7 @@ public class Main { String cmdLine = Arrays.stream(args).collect(Collectors.joining(" ")); commandLine = CommandLine.parse(cmdLine); executor = new DefaultExecutor(); - PumpStreamHandler pumpStreamHandler = new PumpStreamHandler(stdout); + PumpStreamHandler pumpStreamHandler = new PumpStreamHandler(stdout, stdout, proxyStdIn); executor.setStreamHandler(pumpStreamHandler); } } \ No newline at end of file diff --git a/zond/src/main/java/asys/zond/PipeInputStream.java b/zond/src/main/java/asys/zond/PipeInputStream.java new file mode 100644 index 0000000..ff44a07 --- /dev/null +++ b/zond/src/main/java/asys/zond/PipeInputStream.java @@ -0,0 +1,88 @@ +/* + * DmitriyMX + * 2017-07-13 + */ +package asys.zond; + +import java.io.IOException; +import java.io.InputStream; + +public class PipeInputStream extends InputStream { + private byte[] buffer = new byte[15]; + private int lastWritePos = 0, + lastReadPos = 0, + wallPos = buffer.length-1; + + public synchronized void write(String s) { + byte[] strBytes = s.getBytes(); + + while ((lastWritePos < lastReadPos) && ((lastReadPos - lastWritePos) >= strBytes.length)) { + try { + wait(); + } catch (InterruptedException e) { + return; + } + } + + if ((lastWritePos + strBytes.length) >= 1024) { + wallPos = lastWritePos; + lastWritePos = 0; + } + + System.arraycopy(strBytes, 0, this.buffer, lastWritePos, strBytes.length); + lastWritePos += strBytes.length; + notify(); + } + + @Override + public synchronized int read() throws IOException { + if (lastReadPos == lastWritePos) { + try { + wait(); + } catch (InterruptedException ignore) { + return 0; + } + } + + if (lastReadPos == wallPos) { + lastReadPos = 0; + } + + return this.buffer[lastReadPos++]; + } + + @Override + public int read(byte[] b) throws IOException { + return this.read(b, 0, b.length); + } + + @Override + public synchronized int read(byte[] buffOut, int off, int len) throws IOException { + if (lastReadPos == lastWritePos) { + try { + wait(); + } catch (InterruptedException ignore) { + return 0; + } + } + int actualLen = len; + + if (lastReadPos > lastWritePos) { + if ((lastReadPos + len) > wallPos) { + actualLen = (wallPos - lastReadPos); + } + } else { + if ((lastReadPos + len) > lastWritePos) { + actualLen = (lastWritePos - lastReadPos); + } + } + + System.arraycopy(this.buffer, lastReadPos, buffOut, off, actualLen); + lastReadPos += actualLen; + if (lastReadPos == wallPos) { + lastReadPos = 0; + } + notify(); + return actualLen; + } +} diff --git a/zond/src/main/java/asys/zond/ZondCommandHandler.java b/zond/src/main/java/asys/zond/ZondCommandHandler.java index 6c264cd..8de0a52 100644 --- a/zond/src/main/java/asys/zond/ZondCommandHandler.java +++ b/zond/src/main/java/asys/zond/ZondCommandHandler.java @@ -21,6 +21,11 @@ public class ZondCommandHandler implements CommandHandler { private ExecuteWatchdog watchdog; private Thread threadExec; private Server server; + private PipeInputStream proxyStdIn; + + ZondCommandHandler(PipeInputStream proxyStdIn) { + this.proxyStdIn = proxyStdIn; + } @Override public void handle(String commandLine) { @@ -28,6 +33,7 @@ public class ZondCommandHandler implements CommandHandler { internalCommand(commandLine.substring(1)); } else { Shell.getInstance().getOutput().println(commandLine); + proxyStdIn.write(commandLine+"\n"); } } From c12bf89e8f3cb342ae3ac8881dab0e41fe24b033 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 17 Jul 2017 03:20:39 +0300 Subject: [PATCH 38/73] =?UTF-8?q?Zond:fix:=20=D0=BE=D1=88=D0=B8=D0=B1?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D0=B8=20=D0=B2=20?= =?UTF-8?q?"=D1=82=D1=80=D1=83=D0=B1=D1=83"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/src/main/java/asys/zond/PipeInputStream.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/zond/src/main/java/asys/zond/PipeInputStream.java b/zond/src/main/java/asys/zond/PipeInputStream.java index ff44a07..f09bfdc 100644 --- a/zond/src/main/java/asys/zond/PipeInputStream.java +++ b/zond/src/main/java/asys/zond/PipeInputStream.java @@ -24,9 +24,12 @@ public class PipeInputStream extends InputStream { } } - if ((lastWritePos + strBytes.length) >= 1024) { + if ((lastWritePos + strBytes.length) >= buffer.length) { wallPos = lastWritePos; lastWritePos = 0; + if (lastReadPos == wallPos) { + lastReadPos = 0; + } } System.arraycopy(strBytes, 0, this.buffer, lastWritePos, strBytes.length); From 630c20124e71d43c9fbfc0e3773c2b2330145d67 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 19 Jul 2017 00:13:39 +0300 Subject: [PATCH 39/73] =?UTF-8?q?Zond:fix:=20=D0=B7=D0=B0=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80=D0=BE=D1=86?= =?UTF-8?q?=D0=B5=D1=81=D1=81=D0=B0=20=D0=B1=D0=B5=D0=B7=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B9=20=D0=BD=D0=B0=20rea?= =?UTF-8?q?d()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/asys/zond/PipeInputStream.java | 13 +++++++++++ .../java/asys/zond/ZondCommandHandler.java | 3 ++- .../java/asys/zond/ZondExecuteWatchdog.java | 23 +++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 zond/src/main/java/asys/zond/ZondExecuteWatchdog.java diff --git a/zond/src/main/java/asys/zond/PipeInputStream.java b/zond/src/main/java/asys/zond/PipeInputStream.java index f09bfdc..635967c 100644 --- a/zond/src/main/java/asys/zond/PipeInputStream.java +++ b/zond/src/main/java/asys/zond/PipeInputStream.java @@ -12,6 +12,7 @@ public class PipeInputStream extends InputStream { private int lastWritePos = 0, lastReadPos = 0, wallPos = buffer.length-1; + private boolean closed = false; public synchronized void write(String s) { byte[] strBytes = s.getBytes(); @@ -46,6 +47,7 @@ public class PipeInputStream extends InputStream { return 0; } } + if (closed) return 0; if (lastReadPos == wallPos) { lastReadPos = 0; @@ -68,6 +70,7 @@ public class PipeInputStream extends InputStream { return 0; } } + if (closed) return 0; int actualLen = len; if (lastReadPos > lastWritePos) { @@ -88,4 +91,14 @@ public class PipeInputStream extends InputStream { notify(); return actualLen; } + + public void open() { + closed = false; + } + + @Override + public synchronized void close() { + this.closed = true; + notify(); + } } diff --git a/zond/src/main/java/asys/zond/ZondCommandHandler.java b/zond/src/main/java/asys/zond/ZondCommandHandler.java index 8de0a52..1e74d82 100644 --- a/zond/src/main/java/asys/zond/ZondCommandHandler.java +++ b/zond/src/main/java/asys/zond/ZondCommandHandler.java @@ -48,8 +48,9 @@ public class ZondCommandHandler implements CommandHandler { Shell.getInstance().shutdown(); } else if (line.equalsIgnoreCase("start")) { if (watchdog == null) { - watchdog = new ExecuteWatchdog(ExecuteWatchdog.INFINITE_TIMEOUT); + watchdog = new ZondExecuteWatchdog(ExecuteWatchdog.INFINITE_TIMEOUT, proxyStdIn); executor.setWatchdog(watchdog); + Runnable task = () -> { int code = 0; try { diff --git a/zond/src/main/java/asys/zond/ZondExecuteWatchdog.java b/zond/src/main/java/asys/zond/ZondExecuteWatchdog.java new file mode 100644 index 0000000..0958d9b --- /dev/null +++ b/zond/src/main/java/asys/zond/ZondExecuteWatchdog.java @@ -0,0 +1,23 @@ +/* + * DmitriyMX + * 2017-07-19 + */ +package asys.zond; + +import org.apache.commons.exec.ExecuteWatchdog; + +public class ZondExecuteWatchdog extends ExecuteWatchdog { + private final PipeInputStream inputStream; + + public ZondExecuteWatchdog(long timeout, PipeInputStream inputStream) { + super(timeout); + this.inputStream = inputStream; + inputStream.open(); + } + + @Override + public synchronized void stop() { + super.stop(); + inputStream.close(); + } +} From feda0de9243d4ccdc0a4653430949ffeccaa76cc Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 19 Jul 2017 00:18:21 +0300 Subject: [PATCH 40/73] =?UTF-8?q?Zond:fix:=20=D0=BA=D0=BE=D1=80=D1=80?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=D0=BD=D0=BE=D0=B5=20=D0=B7=D0=B0=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D1=8B=20Zond?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 2 +- zond/src/main/java/asys/zond/proxy/client/Connector.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/zond/build.gradle b/zond/build.gradle index 2e43f48..bda5c79 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.7.8-SNAPSHOT' +version = '0.7.9-SNAPSHOT' apply plugin: 'application' diff --git a/zond/src/main/java/asys/zond/proxy/client/Connector.java b/zond/src/main/java/asys/zond/proxy/client/Connector.java index cdf9953..9ffb5cd 100644 --- a/zond/src/main/java/asys/zond/proxy/client/Connector.java +++ b/zond/src/main/java/asys/zond/proxy/client/Connector.java @@ -51,7 +51,9 @@ public class Connector { public void shutdown() { stopReconnect(); - client.disconnect(); + if (client != null) { + client.disconnect(); + } } public void sendPacket(Packet packet) { From 2a7599ec617b505ca37bd23412f72cb252fedbf0 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 20 Jul 2017 00:34:05 +0300 Subject: [PATCH 41/73] =?UTF-8?q?Zond:=20=D1=83=D0=B1=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BB=D0=B8=D1=88=D0=BD=D1=8F=D1=8F=20debug=20=D0=B8?= =?UTF-8?q?=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/asys/zond/proxy/server/ServerPacketHandler.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/zond/src/main/java/asys/zond/proxy/server/ServerPacketHandler.java b/zond/src/main/java/asys/zond/proxy/server/ServerPacketHandler.java index 6022aaf..f8dc17f 100644 --- a/zond/src/main/java/asys/zond/proxy/server/ServerPacketHandler.java +++ b/zond/src/main/java/asys/zond/proxy/server/ServerPacketHandler.java @@ -6,7 +6,6 @@ package asys.zond.proxy.server; import asys.mcsmanager.packets.*; import asys.zond.proxy.client.Connector; -import asys.zond.shell.Shell; import com.google.common.collect.BiMap; import com.google.common.collect.ImmutableBiMap; import com.google.common.collect.ImmutableMap; @@ -53,7 +52,6 @@ public class ServerPacketHandler extends ChannelInboundHandlerAdapter implements } private void handleCSPing(CS_Ping packet) { - Shell.getInstance().getOutput().println("proxied CS_Ping... [" + packet.getTime() + "]"); Connector.getInstance().sendPacket(packet); } } From 2a1aad2f9f114ab90f175d3865f76c0518db9ecc Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Fri, 21 Jul 2017 16:09:19 +0300 Subject: [PATCH 42/73] Zond: class PingMonitor --- zond/src/main/java/asys/zond/PingMonitor.java | 45 +++++++++++++++++++ zond/src/main/resources/zond.properties | 3 +- 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 zond/src/main/java/asys/zond/PingMonitor.java diff --git a/zond/src/main/java/asys/zond/PingMonitor.java b/zond/src/main/java/asys/zond/PingMonitor.java new file mode 100644 index 0000000..944bcec --- /dev/null +++ b/zond/src/main/java/asys/zond/PingMonitor.java @@ -0,0 +1,45 @@ +package asys.zond; + +public class PingMonitor { + private static final long STEP_PING = 5000; + private final long delayStart; + private long lastPingTime; + private Thread threadPingMon; + + public PingMonitor(long delayStart) { + this.delayStart = delayStart; + } + + public void start(final Runnable callback) { + this.threadPingMon = new Thread(() -> { + try { + Thread.sleep(delayStart); + } catch (InterruptedException e) { + return; + } + + while (!Thread.currentThread().isInterrupted()) { + long currentTimeMillis = System.currentTimeMillis(); + if ((currentTimeMillis - lastPingTime) >= (2*STEP_PING)) { // если пропущено два пинга + callback.run(); // запускаем код завершения процесса + return; // завершаем поток + } else { + lastPingTime = System.currentTimeMillis(); + } + + try { + Thread.sleep(STEP_PING); + } catch (InterruptedException e) { + return; + } + } + + lastPingTime = 0; + }); + } + + public void stop() { + threadPingMon.interrupt(); + threadPingMon = null; + } +} diff --git a/zond/src/main/resources/zond.properties b/zond/src/main/resources/zond.properties index 924f988..ce34e16 100644 --- a/zond/src/main/resources/zond.properties +++ b/zond/src/main/resources/zond.properties @@ -2,4 +2,5 @@ serverId = SpigotServer0 host = 127.0.0.1 port = 8779 passcode = testpassphrase -bridge.port = 8710 \ No newline at end of file +bridge.port = 8710 +pingmonitor.delay = 2100 \ No newline at end of file From 9bfb222787a17e373a72c02c41cf2a58a689a52a Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 22 Jul 2017 18:33:47 +0300 Subject: [PATCH 43/73] =?UTF-8?q?Zond:=20=D0=B4=D0=B5=D1=82=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B1=D0=BB=D0=B5=D0=BC=D0=BD=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=B0=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D1=86=D0=B5=D1=81=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 2 +- zond/src/main/java/asys/zond/Config.java | 8 ++ zond/src/main/java/asys/zond/PingMonitor.java | 1 + .../java/asys/zond/ZondCommandHandler.java | 79 +++++++++++++------ 4 files changed, 64 insertions(+), 26 deletions(-) diff --git a/zond/build.gradle b/zond/build.gradle index bda5c79..347d953 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.7.9-SNAPSHOT' +version = '0.7.10-SNAPSHOT' apply plugin: 'application' diff --git a/zond/src/main/java/asys/zond/Config.java b/zond/src/main/java/asys/zond/Config.java index 9fb6036..78ddc12 100644 --- a/zond/src/main/java/asys/zond/Config.java +++ b/zond/src/main/java/asys/zond/Config.java @@ -55,4 +55,12 @@ public class Config { return 0; } } + + public long getLong(String key) { + try { + return Long.parseLong(properties.getProperty(key)); + } catch (NumberFormatException e) { + return 0; + } + } } diff --git a/zond/src/main/java/asys/zond/PingMonitor.java b/zond/src/main/java/asys/zond/PingMonitor.java index 944bcec..e53aba4 100644 --- a/zond/src/main/java/asys/zond/PingMonitor.java +++ b/zond/src/main/java/asys/zond/PingMonitor.java @@ -36,6 +36,7 @@ public class PingMonitor { lastPingTime = 0; }); + this.threadPingMon.start(); } public void stop() { diff --git a/zond/src/main/java/asys/zond/ZondCommandHandler.java b/zond/src/main/java/asys/zond/ZondCommandHandler.java index 1e74d82..e44c332 100644 --- a/zond/src/main/java/asys/zond/ZondCommandHandler.java +++ b/zond/src/main/java/asys/zond/ZondCommandHandler.java @@ -22,6 +22,7 @@ public class ZondCommandHandler implements CommandHandler { private Thread threadExec; private Server server; private PipeInputStream proxyStdIn; + private PingMonitor pingMonitor; ZondCommandHandler(PipeInputStream proxyStdIn) { this.proxyStdIn = proxyStdIn; @@ -47,31 +48,7 @@ public class ZondCommandHandler implements CommandHandler { Connector.getInstance().shutdown(); Shell.getInstance().shutdown(); } else if (line.equalsIgnoreCase("start")) { - if (watchdog == null) { - watchdog = new ZondExecuteWatchdog(ExecuteWatchdog.INFINITE_TIMEOUT, proxyStdIn); - executor.setWatchdog(watchdog); - - Runnable task = () -> { - int code = 0; - try { - server = new Server(); - server.start(Config.getInstance().getInt("bridge.port")); - - code = executor.execute(commandLine); - } catch (ExecuteException ignore) { - } catch (IOException e) { - Shell.getInstance().getOutput().println("Exception message: " + e.getMessage()); - code = -99; - } - - server.shutdown(); - server = null; - watchdog = null; - Shell.getInstance().getOutput().println("Process finished. Code: " + code); - }; - threadExec = new Thread(task, "Zond Exec"); - threadExec.start(); - } + startProcess(); } else if (line.equalsIgnoreCase("kill")) { if (watchdog != null) { server.shutdown(); @@ -97,4 +74,56 @@ public class ZondCommandHandler implements CommandHandler { this.executor = executor; this.commandLine = commandLine; } + + private void startProcess() { + if (watchdog == null) { + watchdog = new ZondExecuteWatchdog(ExecuteWatchdog.INFINITE_TIMEOUT, proxyStdIn); + executor.setWatchdog(watchdog); + final long delay = Config.getInstance().getLong("pingmonitor.delay"); + pingMonitor = new PingMonitor(delay); + + Runnable task = () -> { + short _try = 0; + + do { + int code = 0; + long deadTime = System.currentTimeMillis() + delay; + + try { + server = new Server(); + server.start(Config.getInstance().getInt("bridge.port")); + + pingMonitor.start(() -> {}); + code = executor.execute(commandLine); + } catch (ExecuteException ignore) { + } catch (IOException e) { + Shell.getInstance().getOutput().println("Exception message: " + e.getMessage()); + code = -99; + } + + server.shutdown(); + pingMonitor.stop(); + server = null; + watchdog = null; + Shell.getInstance().getOutput().println("Process finished. Code: " + code); + + if (System.currentTimeMillis() <= deadTime) { + Shell.getInstance().getOutput().println("[!] Premature end process."); + _try++; + if (_try < 2) { + Shell.getInstance().getOutput().println("[!] Try start process again..."); + } + } else { + break; + } + } while (_try < 2); + + if (_try == 2) { + Shell.getInstance().getOutput().println("[!] Discovered the problem when starting the process"); + } + }; + threadExec = new Thread(task, "Zond Exec"); + threadExec.start(); + } + } } From b51601a0015e83581ec3f2645c1d9be924d48f34 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 22 Jul 2017 18:58:48 +0300 Subject: [PATCH 44/73] =?UTF-8?q?Zond:=20=D0=B4=D0=B5=D1=82=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BE?= =?UTF-8?q?=D1=82=D1=81=D1=83=D1=82=D1=81=D1=82=D0=B2=D0=B8=D1=8F=20=D0=BF?= =?UTF-8?q?=D0=B8=D0=BD=D0=B3=D0=B0=20(=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=20?= =?UTF-8?q?=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=3F)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 2 +- zond/src/main/java/asys/zond/PingMonitor.java | 9 +++++-- .../java/asys/zond/ZondCommandHandler.java | 26 ++++++++++++++----- .../java/asys/zond/proxy/server/Server.java | 8 +++++- .../proxy/server/ServerPacketHandler.java | 6 ++++- 5 files changed, 40 insertions(+), 11 deletions(-) diff --git a/zond/build.gradle b/zond/build.gradle index 347d953..2f9a6c0 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.7.10-SNAPSHOT' +version = '0.7.11-SNAPSHOT' apply plugin: 'application' diff --git a/zond/src/main/java/asys/zond/PingMonitor.java b/zond/src/main/java/asys/zond/PingMonitor.java index e53aba4..cb07a32 100644 --- a/zond/src/main/java/asys/zond/PingMonitor.java +++ b/zond/src/main/java/asys/zond/PingMonitor.java @@ -1,5 +1,7 @@ package asys.zond; +import asys.zond.shell.Shell; + public class PingMonitor { private static final long STEP_PING = 5000; private final long delayStart; @@ -23,8 +25,6 @@ public class PingMonitor { if ((currentTimeMillis - lastPingTime) >= (2*STEP_PING)) { // если пропущено два пинга callback.run(); // запускаем код завершения процесса return; // завершаем поток - } else { - lastPingTime = System.currentTimeMillis(); } try { @@ -43,4 +43,9 @@ public class PingMonitor { threadPingMon.interrupt(); threadPingMon = null; } + + public void checkPing() { + lastPingTime = System.currentTimeMillis(); + Shell.getInstance().getOutput().println("[D] check ping: " + lastPingTime); + } } diff --git a/zond/src/main/java/asys/zond/ZondCommandHandler.java b/zond/src/main/java/asys/zond/ZondCommandHandler.java index e44c332..ba4eacc 100644 --- a/zond/src/main/java/asys/zond/ZondCommandHandler.java +++ b/zond/src/main/java/asys/zond/ZondCommandHandler.java @@ -23,6 +23,7 @@ public class ZondCommandHandler implements CommandHandler { private Server server; private PipeInputStream proxyStdIn; private PingMonitor pingMonitor; + private boolean flagForceRestartProcess = false; ZondCommandHandler(PipeInputStream proxyStdIn) { this.proxyStdIn = proxyStdIn; @@ -50,11 +51,7 @@ public class ZondCommandHandler implements CommandHandler { } else if (line.equalsIgnoreCase("start")) { startProcess(); } else if (line.equalsIgnoreCase("kill")) { - if (watchdog != null) { - server.shutdown(); - watchdog.destroyProcess(); - threadExec.interrupt(); - } + killProcess(); } else if (line.equalsIgnoreCase("connect")) { Connector.getInstance().startReconnect(); } else if (line.equalsIgnoreCase("disconnect")) { @@ -91,9 +88,15 @@ public class ZondCommandHandler implements CommandHandler { try { server = new Server(); + server.setPingMonitor(pingMonitor); server.start(Config.getInstance().getInt("bridge.port")); - pingMonitor.start(() -> {}); + pingMonitor.start(() -> { + Shell.getInstance().getOutput().println("[!] Process - zobie?"); + Shell.getInstance().getOutput().println("[!] Force shutdown process."); + flagForceRestartProcess = true; + killProcess(); + }); code = executor.execute(commandLine); } catch (ExecuteException ignore) { } catch (IOException e) { @@ -113,6 +116,9 @@ public class ZondCommandHandler implements CommandHandler { if (_try < 2) { Shell.getInstance().getOutput().println("[!] Try start process again..."); } + } else if (flagForceRestartProcess) { + _try = 0; + flagForceRestartProcess = false; } else { break; } @@ -126,4 +132,12 @@ public class ZondCommandHandler implements CommandHandler { threadExec.start(); } } + + private void killProcess() { + if (watchdog != null) { + server.shutdown(); + watchdog.destroyProcess(); + threadExec.interrupt(); + } + } } diff --git a/zond/src/main/java/asys/zond/proxy/server/Server.java b/zond/src/main/java/asys/zond/proxy/server/Server.java index abcfe8e..a288e83 100644 --- a/zond/src/main/java/asys/zond/proxy/server/Server.java +++ b/zond/src/main/java/asys/zond/proxy/server/Server.java @@ -7,6 +7,7 @@ package asys.zond.proxy.server; import asys.mcsmanager.packets.codec.PacketDecoder; import asys.mcsmanager.packets.codec.PacketEncoder; import asys.mcsmanager.packets.codec.PacketHandler; +import asys.zond.PingMonitor; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelInitializer; @@ -17,6 +18,7 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; public class Server { private EventLoopGroup bossGroup, workerGroup; + private PingMonitor pingMonitor; public void start(int port) { bossGroup = new NioEventLoopGroup(1); @@ -49,9 +51,13 @@ public class Server { new PacketEncoder(), new PacketDecoder(), new PacketHandler(), - new ServerPacketHandler() + new ServerPacketHandler(pingMonitor) ); } }; } + + public void setPingMonitor(PingMonitor pingMonitor) { + this.pingMonitor = pingMonitor; + } } diff --git a/zond/src/main/java/asys/zond/proxy/server/ServerPacketHandler.java b/zond/src/main/java/asys/zond/proxy/server/ServerPacketHandler.java index f8dc17f..c9107f7 100644 --- a/zond/src/main/java/asys/zond/proxy/server/ServerPacketHandler.java +++ b/zond/src/main/java/asys/zond/proxy/server/ServerPacketHandler.java @@ -5,6 +5,7 @@ package asys.zond.proxy.server; import asys.mcsmanager.packets.*; +import asys.zond.PingMonitor; import asys.zond.proxy.client.Connector; import com.google.common.collect.BiMap; import com.google.common.collect.ImmutableBiMap; @@ -20,8 +21,10 @@ import static asys.mcsmanager.packets.codec.Params.KNOWN_PACKETS; public class ServerPacketHandler extends ChannelInboundHandlerAdapter implements IPacketHandler { private final BiMap> knownPackets; private final Map, IPacketHandler> knownHandlers; + private final PingMonitor pingMonitor; - ServerPacketHandler() { + ServerPacketHandler(PingMonitor pingMonitor) { + this.pingMonitor = pingMonitor; knownPackets = ImmutableBiMap.of( 3, CS_Ping.class, 5, SC_Command.class @@ -52,6 +55,7 @@ public class ServerPacketHandler extends ChannelInboundHandlerAdapter implements } private void handleCSPing(CS_Ping packet) { + pingMonitor.checkPing(); Connector.getInstance().sendPacket(packet); } } From 883c4f12579f6014b434a4d72bbfc25cc2d3d131 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 22 Jul 2017 20:35:56 +0300 Subject: [PATCH 45/73] =?UTF-8?q?Zond:=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B7?= =?UTF-8?q?=D0=B0=D0=BF=D1=83=D1=81=D1=82=D0=B8=D1=82=D1=8C=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=86=D0=B5=D1=81=D1=81=20=D0=B2=20=D1=81=D0=BB=D1=83?= =?UTF-8?q?=D1=87=D0=B0=D0=B5=20=D0=BA=D1=80=D0=B0=D1=88=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 2 +- zond/src/main/java/asys/zond/ZondCommandHandler.java | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/zond/build.gradle b/zond/build.gradle index 2f9a6c0..236d5b1 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.7.11-SNAPSHOT' +version = '0.7.12-SNAPSHOT' apply plugin: 'application' diff --git a/zond/src/main/java/asys/zond/ZondCommandHandler.java b/zond/src/main/java/asys/zond/ZondCommandHandler.java index ba4eacc..c7813a6 100644 --- a/zond/src/main/java/asys/zond/ZondCommandHandler.java +++ b/zond/src/main/java/asys/zond/ZondCommandHandler.java @@ -98,7 +98,8 @@ public class ZondCommandHandler implements CommandHandler { killProcess(); }); code = executor.execute(commandLine); - } catch (ExecuteException ignore) { + } catch (ExecuteException e) { + code = e.getExitValue(); } catch (IOException e) { Shell.getInstance().getOutput().println("Exception message: " + e.getMessage()); code = -99; @@ -119,6 +120,9 @@ public class ZondCommandHandler implements CommandHandler { } else if (flagForceRestartProcess) { _try = 0; flagForceRestartProcess = false; + } else if (code != 0 && code != -99) { + Shell.getInstance().getOutput().println("[!] Try start process again..."); + _try = 0; } else { break; } From a4f1d78c2eecf5fbee79d7271e63e93c40896d72 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 23 Jul 2017 00:30:42 +0300 Subject: [PATCH 46/73] =?UTF-8?q?Zond:fix:=20=D1=81=D1=82=D0=B0=D0=B1?= =?UTF-8?q?=D0=B8=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D1=8B=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8F?= =?UTF-8?q?=20=D0=B2=20=D1=86=D0=B5=D0=BB=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bridge/build.gradle | 2 +- .../java/asys/bridge/bukkit/BridgePlugin.java | 1 + .../asys/bridge/client/AbstractBridge.java | 9 +++- .../bridge/client/ClientPacketHandler.java | 3 +- .../main/java/asys/bridge/client/IBridge.java | 1 + libprotocol/build.gradle | 2 +- .../packets/CS_CorrectShutdown.java | 17 +++++++ zond/build.gradle | 2 +- zond/src/main/java/asys/zond/PingMonitor.java | 17 +++++-- .../main/java/asys/zond/PipeInputStream.java | 3 ++ .../java/asys/zond/ZondCommandHandler.java | 48 +++++++++++-------- .../java/asys/zond/ZondExecuteWatchdog.java | 5 ++ .../proxy/server/ServerPacketHandler.java | 12 ++++- 13 files changed, 92 insertions(+), 30 deletions(-) create mode 100644 libprotocol/src/main/java/asys/mcsmanager/packets/CS_CorrectShutdown.java diff --git a/bridge/build.gradle b/bridge/build.gradle index ab5ec1e..e6ffc35 100644 --- a/bridge/build.gradle +++ b/bridge/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.8.1-SNAPSHOT' +version = '0.8.2-SNAPSHOT' repositories { maven { url 'https://hub.spigotmc.org/nexus/content/groups/public/' } diff --git a/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java b/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java index 3431ec5..d417b5e 100644 --- a/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java +++ b/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java @@ -25,6 +25,7 @@ public class BridgePlugin extends JavaPlugin { @Override public void onDisable() { + this.bridgeBukkit.sendCorrectShutdownPacket(); this.bridgeBukkit.setNeedReconnect(false); this.bridgeBukkit.stopPing(); this.bridgeBukkit.stopReconnect(); diff --git a/bridge/src/main/java/asys/bridge/client/AbstractBridge.java b/bridge/src/main/java/asys/bridge/client/AbstractBridge.java index bc8b0d3..21a4f28 100644 --- a/bridge/src/main/java/asys/bridge/client/AbstractBridge.java +++ b/bridge/src/main/java/asys/bridge/client/AbstractBridge.java @@ -5,8 +5,8 @@ package asys.bridge.client; import asys.bridge.bukkit.TaskTicker; +import asys.mcsmanager.packets.CS_CorrectShutdown; import asys.mcsmanager.packets.CS_Ping; -import io.netty.channel.Channel; public abstract class AbstractBridge implements IBridge { private Client client; @@ -39,6 +39,13 @@ public abstract class AbstractBridge implements IBridge { this.needReconnect = value; } + @Override + public void sendCorrectShutdownPacket() { + if (client != null && client.isConnected()) { + client.sendPacket(new CS_CorrectShutdown()); + } + } + @Override public void stopReconnect() { if (connectTicker != null) { diff --git a/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java b/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java index b2fe930..5d1a25d 100644 --- a/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java +++ b/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java @@ -21,7 +21,8 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements private static final BiMap> knownPackets = ImmutableBiMap.of( 3, CS_Ping.class, - 5, SC_Command.class + 5, SC_Command.class, + 6, CS_CorrectShutdown.class ); private IBridge bridge; diff --git a/bridge/src/main/java/asys/bridge/client/IBridge.java b/bridge/src/main/java/asys/bridge/client/IBridge.java index d8118e1..22a1308 100644 --- a/bridge/src/main/java/asys/bridge/client/IBridge.java +++ b/bridge/src/main/java/asys/bridge/client/IBridge.java @@ -12,6 +12,7 @@ public interface IBridge { void startReconnect(); boolean isNeedReconnect(); void setNeedReconnect(boolean value); + void sendCorrectShutdownPacket(); void stopReconnect(); void startPing(); void stopPing(); diff --git a/libprotocol/build.gradle b/libprotocol/build.gradle index 1e11dd2..2783c19 100644 --- a/libprotocol/build.gradle +++ b/libprotocol/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.5-SNAPSHOT' +version = '0.6-SNAPSHOT' task jar(type: Jar, overwrite: true) { // не собирать jar diff --git a/libprotocol/src/main/java/asys/mcsmanager/packets/CS_CorrectShutdown.java b/libprotocol/src/main/java/asys/mcsmanager/packets/CS_CorrectShutdown.java new file mode 100644 index 0000000..85b334f --- /dev/null +++ b/libprotocol/src/main/java/asys/mcsmanager/packets/CS_CorrectShutdown.java @@ -0,0 +1,17 @@ +/* + * DmitriyMX + * 2017-07-22 + */ +package asys.mcsmanager.packets; + +import io.netty.buffer.ByteBuf; + +public class CS_CorrectShutdown extends Packet { + @Override + public void readSelfData(ByteBuf buffer) { + } + + @Override + public void writeSelfData(ByteBuf buffer) { + } +} diff --git a/zond/build.gradle b/zond/build.gradle index 236d5b1..77e19fe 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.7.12-SNAPSHOT' +version = '0.7.13-SNAPSHOT' apply plugin: 'application' diff --git a/zond/src/main/java/asys/zond/PingMonitor.java b/zond/src/main/java/asys/zond/PingMonitor.java index cb07a32..b8c7027 100644 --- a/zond/src/main/java/asys/zond/PingMonitor.java +++ b/zond/src/main/java/asys/zond/PingMonitor.java @@ -7,6 +7,7 @@ public class PingMonitor { private final long delayStart; private long lastPingTime; private Thread threadPingMon; + private boolean correctShutdown = false; public PingMonitor(long delayStart) { this.delayStart = delayStart; @@ -14,6 +15,7 @@ public class PingMonitor { public void start(final Runnable callback) { this.threadPingMon = new Thread(() -> { + correctShutdown = false; try { Thread.sleep(delayStart); } catch (InterruptedException e) { @@ -40,12 +42,21 @@ public class PingMonitor { } public void stop() { - threadPingMon.interrupt(); - threadPingMon = null; + if (threadPingMon != null) { + threadPingMon.interrupt(); + threadPingMon = null; + } } public void checkPing() { lastPingTime = System.currentTimeMillis(); - Shell.getInstance().getOutput().println("[D] check ping: " + lastPingTime); + } + + public void correctShutdown() { + correctShutdown = true; + } + + public boolean isCorrectShutdown() { + return correctShutdown; } } diff --git a/zond/src/main/java/asys/zond/PipeInputStream.java b/zond/src/main/java/asys/zond/PipeInputStream.java index 635967c..36bebfa 100644 --- a/zond/src/main/java/asys/zond/PipeInputStream.java +++ b/zond/src/main/java/asys/zond/PipeInputStream.java @@ -94,6 +94,9 @@ public class PipeInputStream extends InputStream { public void open() { closed = false; + lastWritePos = 0; + lastReadPos = 0; + wallPos = buffer.length-1; } @Override diff --git a/zond/src/main/java/asys/zond/ZondCommandHandler.java b/zond/src/main/java/asys/zond/ZondCommandHandler.java index c7813a6..091ca71 100644 --- a/zond/src/main/java/asys/zond/ZondCommandHandler.java +++ b/zond/src/main/java/asys/zond/ZondCommandHandler.java @@ -24,6 +24,7 @@ public class ZondCommandHandler implements CommandHandler { private PipeInputStream proxyStdIn; private PingMonitor pingMonitor; private boolean flagForceRestartProcess = false; + private boolean flagManualKill = false; ZondCommandHandler(PipeInputStream proxyStdIn) { this.proxyStdIn = proxyStdIn; @@ -41,16 +42,14 @@ public class ZondCommandHandler implements CommandHandler { private void internalCommand(String line) { if (line.equalsIgnoreCase("exit") || line.equalsIgnoreCase("quit")) { - if (watchdog != null) { - server.shutdown(); - watchdog.destroyProcess(); - threadExec.interrupt(); - } + flagManualKill = true; + killProcess(); Connector.getInstance().shutdown(); Shell.getInstance().shutdown(); } else if (line.equalsIgnoreCase("start")) { startProcess(); } else if (line.equalsIgnoreCase("kill")) { + flagManualKill = true; killProcess(); } else if (line.equalsIgnoreCase("connect")) { Connector.getInstance().startReconnect(); @@ -73,11 +72,14 @@ public class ZondCommandHandler implements CommandHandler { } private void startProcess() { - if (watchdog == null) { - watchdog = new ZondExecuteWatchdog(ExecuteWatchdog.INFINITE_TIMEOUT, proxyStdIn); - executor.setWatchdog(watchdog); + if (watchdog == null || !watchdog.isWatching()) { + if (watchdog == null) { + watchdog = new ZondExecuteWatchdog(ExecuteWatchdog.INFINITE_TIMEOUT, proxyStdIn); + executor.setWatchdog(watchdog); + } final long delay = Config.getInstance().getLong("pingmonitor.delay"); pingMonitor = new PingMonitor(delay); + flagManualKill = false; Runnable task = () -> { short _try = 0; @@ -108,22 +110,27 @@ public class ZondCommandHandler implements CommandHandler { server.shutdown(); pingMonitor.stop(); server = null; - watchdog = null; Shell.getInstance().getOutput().println("Process finished. Code: " + code); - if (System.currentTimeMillis() <= deadTime) { - Shell.getInstance().getOutput().println("[!] Premature end process."); - _try++; - if (_try < 2) { + if (!pingMonitor.isCorrectShutdown()) { + if (System.currentTimeMillis() <= deadTime && !flagManualKill) { + Shell.getInstance().getOutput().println("[!] Premature end process."); + _try++; + if (_try < 2) { + Shell.getInstance().getOutput().println("[!] Try start process again..."); + } + } else if (flagForceRestartProcess) { + _try = 0; + flagForceRestartProcess = false; + } else if (code != 0 && code != -99 && !flagManualKill) { Shell.getInstance().getOutput().println("[!] Try start process again..."); + _try = 0; + } else { + break; } - } else if (flagForceRestartProcess) { - _try = 0; - flagForceRestartProcess = false; - } else if (code != 0 && code != -99) { - Shell.getInstance().getOutput().println("[!] Try start process again..."); - _try = 0; } else { + flagForceRestartProcess = false; + _try = 0; break; } } while (_try < 2); @@ -138,8 +145,9 @@ public class ZondCommandHandler implements CommandHandler { } private void killProcess() { - if (watchdog != null) { + if (watchdog != null && watchdog.isWatching()) { server.shutdown(); + pingMonitor.stop(); watchdog.destroyProcess(); threadExec.interrupt(); } diff --git a/zond/src/main/java/asys/zond/ZondExecuteWatchdog.java b/zond/src/main/java/asys/zond/ZondExecuteWatchdog.java index 0958d9b..fa9d687 100644 --- a/zond/src/main/java/asys/zond/ZondExecuteWatchdog.java +++ b/zond/src/main/java/asys/zond/ZondExecuteWatchdog.java @@ -12,6 +12,11 @@ public class ZondExecuteWatchdog extends ExecuteWatchdog { public ZondExecuteWatchdog(long timeout, PipeInputStream inputStream) { super(timeout); this.inputStream = inputStream; + } + + @Override + public synchronized void start(Process processToMonitor) { + super.start(processToMonitor); inputStream.open(); } diff --git a/zond/src/main/java/asys/zond/proxy/server/ServerPacketHandler.java b/zond/src/main/java/asys/zond/proxy/server/ServerPacketHandler.java index c9107f7..1a0d8f5 100644 --- a/zond/src/main/java/asys/zond/proxy/server/ServerPacketHandler.java +++ b/zond/src/main/java/asys/zond/proxy/server/ServerPacketHandler.java @@ -27,11 +27,13 @@ public class ServerPacketHandler extends ChannelInboundHandlerAdapter implements this.pingMonitor = pingMonitor; knownPackets = ImmutableBiMap.of( 3, CS_Ping.class, - 5, SC_Command.class + 5, SC_Command.class, + 6, CS_CorrectShutdown.class ); knownHandlers = ImmutableMap.of( CS_Ping.class, this, - CS_ConsoleMessage.class, this + CS_ConsoleMessage.class, this, + CS_CorrectShutdown.class, this ); } @@ -51,6 +53,8 @@ public class ServerPacketHandler extends ChannelInboundHandlerAdapter implements public void handle(Packet packet, ChannelHandlerContext context) { if (packet instanceof CS_Ping) { handleCSPing((CS_Ping) packet); + } else if (packet instanceof CS_CorrectShutdown) { + handleCSCorrectShutdown(); } } @@ -58,4 +62,8 @@ public class ServerPacketHandler extends ChannelInboundHandlerAdapter implements pingMonitor.checkPing(); Connector.getInstance().sendPacket(packet); } + + private void handleCSCorrectShutdown() { + pingMonitor.correctShutdown(); + } } From cc218c13916bdf9a379d19c0498a36728c658b28 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 23 Jul 2017 16:35:18 +0300 Subject: [PATCH 47/73] =?UTF-8?q?Zond:fix:=20StackOverflow=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=B4=20linux?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Пришлось переписывать алгоритм работы ShellStdOut, что бы заработало как надо под Linux-based системами --- zond/build.gradle | 2 +- .../java/asys/zond/shell/CommandLooper.java | 6 +- zond/src/main/java/asys/zond/shell/Shell.java | 12 +-- .../java/asys/zond/shell/ShellOutputHook.java | 9 -- .../java/asys/zond/shell/ShellStdOut.java | 92 ++++++++++--------- .../org/apache/commons/exec/StreamPumper.java | 7 +- 6 files changed, 62 insertions(+), 66 deletions(-) delete mode 100644 zond/src/main/java/asys/zond/shell/ShellOutputHook.java diff --git a/zond/build.gradle b/zond/build.gradle index 77e19fe..b75a046 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.7.13-SNAPSHOT' +version = '0.7.14-SNAPSHOT' apply plugin: 'application' diff --git a/zond/src/main/java/asys/zond/shell/CommandLooper.java b/zond/src/main/java/asys/zond/shell/CommandLooper.java index 681577e..0350453 100644 --- a/zond/src/main/java/asys/zond/shell/CommandLooper.java +++ b/zond/src/main/java/asys/zond/shell/CommandLooper.java @@ -1,5 +1,5 @@ /* - * DmitriyMX + * DmitriyMX * 2017-06-15 */ package asys.zond.shell; @@ -11,12 +11,10 @@ import java.io.IOException; public class CommandLooper implements Runnable { private ConsoleReader consoleReader; private CommandHandler commandHandler; - private ShellStdOut output; CommandLooper(ConsoleReader consoleReader, CommandHandler commandHandler) { this.consoleReader = consoleReader; this.commandHandler = commandHandler; - this.output = (ShellStdOut) Shell.getInstance().getOutput(); } @Override @@ -24,9 +22,7 @@ public class CommandLooper implements Runnable { while (!Thread.currentThread().isInterrupted()) { String line; try { - output.needDrawLine = true; line = consoleReader.readLine(); - output.needDrawLine = false; } catch (IOException e) { break; } diff --git a/zond/src/main/java/asys/zond/shell/Shell.java b/zond/src/main/java/asys/zond/shell/Shell.java index f63bc2a..ed850c7 100644 --- a/zond/src/main/java/asys/zond/shell/Shell.java +++ b/zond/src/main/java/asys/zond/shell/Shell.java @@ -1,14 +1,12 @@ /* - * DmitriyMX + * DmitriyMX * 2017-06-15 */ package asys.zond.shell; import jline.console.ConsoleReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.PrintStream; +import java.io.*; public class Shell { private static final String DEFAULT_PROMPT = ":"; @@ -27,7 +25,7 @@ public class Shell { } public void start(InputStream inputStream) throws IOException { - consoleReader = new ConsoleReader(inputStream, (shellStdOut = new ShellStdOut())); + consoleReader = new ConsoleReader(inputStream, (shellStdOut = new ShellStdOut(System.out))); shellStdOut.setConsoleReader(consoleReader); consoleReader.setPrompt(DEFAULT_PROMPT); @@ -56,10 +54,6 @@ public class Shell { return shellStdOut; } - public void setOutputHook(ShellOutputHook outputHook) { - shellStdOut.setOutputHook(outputHook); - } - public void setCommandHandler(CommandHandler commandHandler) { this.commandHandler = commandHandler; } diff --git a/zond/src/main/java/asys/zond/shell/ShellOutputHook.java b/zond/src/main/java/asys/zond/shell/ShellOutputHook.java deleted file mode 100644 index 9936e2e..0000000 --- a/zond/src/main/java/asys/zond/shell/ShellOutputHook.java +++ /dev/null @@ -1,9 +0,0 @@ -/* - * DmitriyMX - * 2017-06-15 - */ -package asys.zond.shell; - -public interface ShellOutputHook { - String handle(String line); -} diff --git a/zond/src/main/java/asys/zond/shell/ShellStdOut.java b/zond/src/main/java/asys/zond/shell/ShellStdOut.java index 7205e2c..1cd8f60 100644 --- a/zond/src/main/java/asys/zond/shell/ShellStdOut.java +++ b/zond/src/main/java/asys/zond/shell/ShellStdOut.java @@ -1,83 +1,93 @@ /* - * DmitriyMX - * 2017-06-15 + * DmitriyMX + * 2017-07-23 */ package asys.zond.shell; import jline.console.ConsoleReader; +import java.io.IOException; +import java.io.OutputStream; import java.io.PrintStream; -import java.io.PrintWriter; public class ShellStdOut extends PrintStream { private ConsoleReader consoleReader; - private PrintWriter writer; - private ShellOutputHook shellOutputHook; - boolean needDrawLine = false; - ShellStdOut() { - super(System.out, true); + ShellStdOut(OutputStream out) { + super(out); } - void setConsoleReader(ConsoleReader consoleReader) { - this.consoleReader = consoleReader; - this.writer = new PrintWriter(consoleReader.getOutput()); + private void _write(char c) { + try { + this.out.write(c); + } catch (IOException ignore) { + } } - private void _print(String line) { - String newLine; - if (shellOutputHook != null) { - try { - newLine = shellOutputHook.handle(line); - if (newLine == null) return; - else line = newLine; - } catch (Exception ignore) { - } + private void _write(byte[] buf) { + try { + this.out.write(buf); + } catch (IOException ignore) { } + } - writer.print(ConsoleReader.RESET_LINE); - writer.print(line); - cleanTrashLine(line); - writer.println(); - if (needDrawLine) { - try { - consoleReader.drawLine(); - } catch (Throwable ignore) { - } + private void _write(byte[] buf, int off, int len) { + try { + this.out.write(buf, off, len); + } catch (IOException ignore) { + } + } + + private void _flush() { + try { + this.out.flush(); + } catch (IOException ignore) { } - writer.flush(); } /** * Очистка печатной строки от мусора */ - private void cleanTrashLine(String string) { + private void cleanTrashLine(int len) throws IOException { // очищает полностью строку - if (consoleReader.getCursorBuffer().buffer.length() + consoleReader.getPrompt().length() > string.length()) { - for (int i = string.length(); i <= consoleReader.getCursorBuffer().buffer.length() + 2; i++) { - writer.print(' '); + if (consoleReader.getCursorBuffer().buffer.length() + consoleReader.getPrompt().length() > len) { + for (int i = len; i <= consoleReader.getCursorBuffer().buffer.length() + 2; i++) { + this.out.write(' '); } + this.out.flush(); } } - void setOutputHook(ShellOutputHook shellOutputHook) { - this.shellOutputHook = shellOutputHook; + public void printEx(byte[] buf, int len) { + _write(ConsoleReader.RESET_LINE); + _write(buf, 0, len); + try { + cleanTrashLine(len); + consoleReader.drawLine(); + consoleReader.flush(); + } catch (Throwable ignore) { + } + _flush(); } @Override public void write(byte[] buf, int off, int len) { - if ((char)buf[len-1] == '\n') len--; - if ((char)buf[len-1] == '\r') len--; - _print(new String(buf, off, len)); + _write(buf, off, len); } @Override public void print(String s) { - _print(s); + _write(ConsoleReader.RESET_LINE); + _write(s.getBytes()); } @Override public void println(String x) { - _print(x); + print(x.concat("\n")); + _flush(); + } + + void setConsoleReader(ConsoleReader consoleReader) { + this.consoleReader = consoleReader; } } diff --git a/zond/src/main/java/org/apache/commons/exec/StreamPumper.java b/zond/src/main/java/org/apache/commons/exec/StreamPumper.java index b50bc13..5bc73ec 100644 --- a/zond/src/main/java/org/apache/commons/exec/StreamPumper.java +++ b/zond/src/main/java/org/apache/commons/exec/StreamPumper.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import asys.zond.shell.ShellStdOut; import org.apache.commons.exec.util.DebugUtils; /** @@ -106,7 +107,11 @@ public class StreamPumper implements Runnable { try { //hack: пропатчили алгоритм while (!Thread.currentThread().isInterrupted() && (length = is.read(buf)) > 0) { - os.write(buf, 0, length); + if (os instanceof ShellStdOut) { + ((ShellStdOut)os).printEx(buf, length); + } else { + os.write(buf, 0, length); + } os.flush(); } } catch (final Exception e) { From 2435796c28a24577d42a8666731dfb78bf7d3398 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 24 Jul 2017 01:38:17 +0300 Subject: [PATCH 48/73] Zond:fix: array out of range --- zond/src/main/java/asys/zond/PipeInputStream.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zond/src/main/java/asys/zond/PipeInputStream.java b/zond/src/main/java/asys/zond/PipeInputStream.java index 36bebfa..78accf8 100644 --- a/zond/src/main/java/asys/zond/PipeInputStream.java +++ b/zond/src/main/java/asys/zond/PipeInputStream.java @@ -8,7 +8,7 @@ import java.io.IOException; import java.io.InputStream; public class PipeInputStream extends InputStream { - private byte[] buffer = new byte[15]; + private byte[] buffer = new byte[1024]; private int lastWritePos = 0, lastReadPos = 0, wallPos = buffer.length-1; From 149c9231eeff4296db7eb860462ca127d7a64bb7 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 24 Jul 2017 01:47:08 +0300 Subject: [PATCH 49/73] =?UTF-8?q?Zond:fix:=20=D0=BD=D0=B5=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=87=D0=B0=D1=82=D0=B0=D0=BB=D1=81=D1=8F=20promt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/src/main/java/asys/zond/shell/ShellStdOut.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/zond/src/main/java/asys/zond/shell/ShellStdOut.java b/zond/src/main/java/asys/zond/shell/ShellStdOut.java index 1cd8f60..851657c 100644 --- a/zond/src/main/java/asys/zond/shell/ShellStdOut.java +++ b/zond/src/main/java/asys/zond/shell/ShellStdOut.java @@ -84,6 +84,12 @@ public class ShellStdOut extends PrintStream { @Override public void println(String x) { print(x.concat("\n")); + try { + cleanTrashLine(x.length()); + consoleReader.drawLine(); + consoleReader.flush(); + } catch (Throwable ignore) { + } _flush(); } From 9e63c503b917f48c3644e490c668b2f550dddefb Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 24 Jul 2017 02:02:54 +0300 Subject: [PATCH 50/73] =?UTF-8?q?Zond:fix:=20=D1=80=D0=B0=D1=81=D1=87?= =?UTF-8?q?=D0=B5=D1=82=20=D0=B7=D0=B0=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=B0=20PingMonitor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/src/main/java/asys/zond/PingMonitor.java | 2 -- .../main/java/asys/zond/ZondCommandHandler.java | 16 +++++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/zond/src/main/java/asys/zond/PingMonitor.java b/zond/src/main/java/asys/zond/PingMonitor.java index b8c7027..64999ea 100644 --- a/zond/src/main/java/asys/zond/PingMonitor.java +++ b/zond/src/main/java/asys/zond/PingMonitor.java @@ -1,7 +1,5 @@ package asys.zond; -import asys.zond.shell.Shell; - public class PingMonitor { private static final long STEP_PING = 5000; private final long delayStart; diff --git a/zond/src/main/java/asys/zond/ZondCommandHandler.java b/zond/src/main/java/asys/zond/ZondCommandHandler.java index 091ca71..18848cd 100644 --- a/zond/src/main/java/asys/zond/ZondCommandHandler.java +++ b/zond/src/main/java/asys/zond/ZondCommandHandler.java @@ -86,7 +86,7 @@ public class ZondCommandHandler implements CommandHandler { do { int code = 0; - long deadTime = System.currentTimeMillis() + delay; + long deadTime = 0; try { server = new Server(); @@ -99,6 +99,7 @@ public class ZondCommandHandler implements CommandHandler { flagForceRestartProcess = true; killProcess(); }); + deadTime = (System.currentTimeMillis()/1000) + delay; code = executor.execute(commandLine); } catch (ExecuteException e) { code = e.getExitValue(); @@ -106,14 +107,19 @@ public class ZondCommandHandler implements CommandHandler { Shell.getInstance().getOutput().println("Exception message: " + e.getMessage()); code = -99; } + long currTime = System.currentTimeMillis()/1000; server.shutdown(); pingMonitor.stop(); server = null; Shell.getInstance().getOutput().println("Process finished. Code: " + code); - if (!pingMonitor.isCorrectShutdown()) { - if (System.currentTimeMillis() <= deadTime && !flagManualKill) { + if (pingMonitor.isCorrectShutdown()) { + flagForceRestartProcess = false; + _try = 0; + break; + } else { + if (currTime <= deadTime && !flagManualKill) { Shell.getInstance().getOutput().println("[!] Premature end process."); _try++; if (_try < 2) { @@ -128,10 +134,6 @@ public class ZondCommandHandler implements CommandHandler { } else { break; } - } else { - flagForceRestartProcess = false; - _try = 0; - break; } } while (_try < 2); From b48f2fc7d4f4cfabf508b6f058b81a148d582b16 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 24 Jul 2017 02:13:19 +0300 Subject: [PATCH 51/73] =?UTF-8?q?Zond:fix:=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=20=D0=BF=D0=BE=D1=81=D0=BB?= =?UTF-8?q?=D0=B5=20=D0=BF=D0=BE=D1=82=D0=B5=D1=80=D0=B8=20=D0=BF=D0=B8?= =?UTF-8?q?=D0=BD=D0=B3=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 2 +- zond/src/main/java/asys/zond/ZondCommandHandler.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/zond/build.gradle b/zond/build.gradle index b75a046..d2434bd 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.7.14-SNAPSHOT' +version = '0.7.15-SNAPSHOT' apply plugin: 'application' diff --git a/zond/src/main/java/asys/zond/ZondCommandHandler.java b/zond/src/main/java/asys/zond/ZondCommandHandler.java index 18848cd..a3013d4 100644 --- a/zond/src/main/java/asys/zond/ZondCommandHandler.java +++ b/zond/src/main/java/asys/zond/ZondCommandHandler.java @@ -119,7 +119,7 @@ public class ZondCommandHandler implements CommandHandler { _try = 0; break; } else { - if (currTime <= deadTime && !flagManualKill) { + if (currTime <= deadTime && !flagManualKill && !flagForceRestartProcess) { Shell.getInstance().getOutput().println("[!] Premature end process."); _try++; if (_try < 2) { From 8eb42d64ad9ca5f74493220ec2a6c244827a6f7e Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 24 Jul 2017 03:37:32 +0300 Subject: [PATCH 52/73] =?UTF-8?q?Zond:=20=D1=83=D0=B1=D0=B8=D0=B9=D1=81?= =?UTF-8?q?=D1=82=D0=B2=D0=BE=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D1=81=D1=81?= =?UTF-8?q?=D0=B0=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20=D1=81=D0=B8=D1=81?= =?UTF-8?q?=D1=82=D0=B5=D0=BC=D0=BD=D1=8B=D0=B9=20=D0=B2=D1=8B=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 2 + zond/src/main/java/asys/zond/PingMonitor.java | 11 +++- .../java/asys/zond/ZondCommandHandler.java | 7 +- .../java/asys/zond/ZondExecuteWatchdog.java | 54 ++++++++++++++- .../main/java/asys/zond/win32/Kernel32.java | 15 +++++ .../src/main/java/asys/zond/win32/W32API.java | 65 +++++++++++++++++++ .../main/java/asys/zond/win32/W32Errors.java | 23 +++++++ zond/src/main/resources/zond.properties | 4 +- 8 files changed, 177 insertions(+), 4 deletions(-) create mode 100644 zond/src/main/java/asys/zond/win32/Kernel32.java create mode 100644 zond/src/main/java/asys/zond/win32/W32API.java create mode 100644 zond/src/main/java/asys/zond/win32/W32Errors.java diff --git a/zond/build.gradle b/zond/build.gradle index d2434bd..8efcb3e 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -45,4 +45,6 @@ dependencies { includedEx group: 'org.apache.commons', name: 'commons-exec', version: '1.3' included group: 'io.netty', name: 'netty-codec', version: nettyVersion included group: 'com.google.guava', name: 'guava', version: '21.0' + included group: 'com.sun.jna', name: 'jna', version: '3.0.9' + } diff --git a/zond/src/main/java/asys/zond/PingMonitor.java b/zond/src/main/java/asys/zond/PingMonitor.java index 64999ea..dfde0c7 100644 --- a/zond/src/main/java/asys/zond/PingMonitor.java +++ b/zond/src/main/java/asys/zond/PingMonitor.java @@ -1,5 +1,7 @@ package asys.zond; +import asys.zond.shell.Shell; + public class PingMonitor { private static final long STEP_PING = 5000; private final long delayStart; @@ -22,10 +24,17 @@ public class PingMonitor { while (!Thread.currentThread().isInterrupted()) { long currentTimeMillis = System.currentTimeMillis(); - if ((currentTimeMillis - lastPingTime) >= (2*STEP_PING)) { // если пропущено два пинга + if ((currentTimeMillis - lastPingTime) >= (1*STEP_PING)) { + Shell.getInstance().getOutput().println("[D] lost one ping...."); + } + else if ((currentTimeMillis - lastPingTime) >= (2*STEP_PING)) { // если пропущено два пинга + Shell.getInstance().getOutput().println("[D] lost two ping...."); callback.run(); // запускаем код завершения процесса return; // завершаем поток } + else { + Shell.getInstance().getOutput().println("[D] check ping"); + } try { Thread.sleep(STEP_PING); diff --git a/zond/src/main/java/asys/zond/ZondCommandHandler.java b/zond/src/main/java/asys/zond/ZondCommandHandler.java index a3013d4..b9bc009 100644 --- a/zond/src/main/java/asys/zond/ZondCommandHandler.java +++ b/zond/src/main/java/asys/zond/ZondCommandHandler.java @@ -74,7 +74,12 @@ public class ZondCommandHandler implements CommandHandler { private void startProcess() { if (watchdog == null || !watchdog.isWatching()) { if (watchdog == null) { - watchdog = new ZondExecuteWatchdog(ExecuteWatchdog.INFINITE_TIMEOUT, proxyStdIn); + watchdog = new ZondExecuteWatchdog( + ExecuteWatchdog.INFINITE_TIMEOUT, + proxyStdIn, + Config.getInstance().getString("cmdkiller") + ); + executor.setWatchdog(watchdog); } final long delay = Config.getInstance().getLong("pingmonitor.delay"); diff --git a/zond/src/main/java/asys/zond/ZondExecuteWatchdog.java b/zond/src/main/java/asys/zond/ZondExecuteWatchdog.java index fa9d687..5b45216 100644 --- a/zond/src/main/java/asys/zond/ZondExecuteWatchdog.java +++ b/zond/src/main/java/asys/zond/ZondExecuteWatchdog.java @@ -4,19 +4,56 @@ */ package asys.zond; +import asys.zond.shell.Shell; +import asys.zond.win32.Kernel32; +import asys.zond.win32.W32API; +import com.sun.jna.Pointer; import org.apache.commons.exec.ExecuteWatchdog; +import java.io.IOException; +import java.lang.reflect.Field; + public class ZondExecuteWatchdog extends ExecuteWatchdog { private final PipeInputStream inputStream; + private long pid; + private String cmdkiller; - public ZondExecuteWatchdog(long timeout, PipeInputStream inputStream) { + public ZondExecuteWatchdog(long timeout, PipeInputStream inputStream, String cmdkiller) { super(timeout); this.inputStream = inputStream; + this.cmdkiller = cmdkiller.trim(); + } + + private long get_pid(Process process) { + if (process.getClass().getName().equals("java.lang.Win32Process") || + process.getClass().getName().equals("java.lang.ProcessImpl")) { + try { + Field f = process.getClass().getDeclaredField("handle"); + f.setAccessible(true); + long handl = f.getLong(process); + + Kernel32 kernel32 = Kernel32.INSTANCE; + W32API.HANDLE handle = new W32API.HANDLE(); + handle.setPointer(Pointer.createConstant(handl)); + return kernel32.GetProcessId(handle); //pid + } catch (Throwable ignore) { + } + } else if (process.getClass().getName().equals("java.lang.UNIXProcess")) { + try { + Field f = process.getClass().getDeclaredField("pid"); + f.setAccessible(true); + return f.getLong(process); //pid + } catch (Throwable ignore) { + } + } + + return -1; } @Override public synchronized void start(Process processToMonitor) { super.start(processToMonitor); + pid = get_pid(processToMonitor); inputStream.open(); } @@ -25,4 +62,19 @@ public class ZondExecuteWatchdog extends ExecuteWatchdog { super.stop(); inputStream.close(); } + + @Override + public synchronized void destroyProcess() { + super.destroyProcess(); + if (pid != -1 && cmdkiller != null && !cmdkiller.isEmpty()) { + try { + String cmd = cmdkiller.replace("%PID", String.valueOf(pid)); + Shell.getInstance().getOutput().println("CMDKILL: '" + cmd + "'"); + Runtime.getRuntime().exec(cmd); + } catch (IOException ignore) { + } + } else { + Shell.getInstance().getOutput().println("PID = -1"); + } + } } diff --git a/zond/src/main/java/asys/zond/win32/Kernel32.java b/zond/src/main/java/asys/zond/win32/Kernel32.java new file mode 100644 index 0000000..e3dafbe --- /dev/null +++ b/zond/src/main/java/asys/zond/win32/Kernel32.java @@ -0,0 +1,15 @@ +/* + * DmitriyMX + * 2017-07-24 + */ +package asys.zond.win32; + +import com.sun.jna.Native; +/* https://jna.dev.java.net/ */ +public interface Kernel32 extends W32API { + Kernel32 INSTANCE = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class, DEFAULT_OPTIONS); + /* http://msdn.microsoft.com/en-us/library/ms683179(VS.85).aspx */ + HANDLE GetCurrentProcess(); + /* http://msdn.microsoft.com/en-us/library/ms683215.aspx */ + int GetProcessId(HANDLE Process); +} diff --git a/zond/src/main/java/asys/zond/win32/W32API.java b/zond/src/main/java/asys/zond/win32/W32API.java new file mode 100644 index 0000000..ad72ea5 --- /dev/null +++ b/zond/src/main/java/asys/zond/win32/W32API.java @@ -0,0 +1,65 @@ +/* Copyright (c) 2007 Timothy Wall, All Rights Reserved + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + */ +package asys.zond.win32; + +import java.util.HashMap; +import java.util.Map; + +import com.sun.jna.*; +import com.sun.jna.win32.StdCallLibrary; +import com.sun.jna.win32.W32APIFunctionMapper; +import com.sun.jna.win32.W32APITypeMapper; + +/** Base type for most W32 API libraries. Provides standard options + * for unicode/ASCII mappings. Set the system property w32.ascii + * to true to default to the ASCII mappings. + */ +public interface W32API extends StdCallLibrary, W32Errors { + + /** Standard options to use the unicode version of a w32 API. */ + Map UNICODE_OPTIONS = new HashMap() { + { + put(OPTION_TYPE_MAPPER, W32APITypeMapper.UNICODE); + put(OPTION_FUNCTION_MAPPER, W32APIFunctionMapper.UNICODE); + } + }; + + /** Standard options to use the ASCII/MBCS version of a w32 API. */ + Map ASCII_OPTIONS = new HashMap() { + { + put(OPTION_TYPE_MAPPER, W32APITypeMapper.ASCII); + put(OPTION_FUNCTION_MAPPER, W32APIFunctionMapper.ASCII); + } + }; + + Map DEFAULT_OPTIONS = Boolean.getBoolean("w32.ascii") ? ASCII_OPTIONS : UNICODE_OPTIONS; + + class HANDLE extends PointerType { + @Override + public Object fromNative(Object nativeValue, FromNativeContext context) { + Object o = super.fromNative(nativeValue, context); + if (INVALID_HANDLE_VALUE.equals(o)) + return INVALID_HANDLE_VALUE; + return o; + } + } + + /** Constant value representing an invalid HANDLE. */ + HANDLE INVALID_HANDLE_VALUE = new HANDLE() { + { super.setPointer(Pointer.createConstant(-1)); } + @Override + public void setPointer(Pointer p) { + throw new UnsupportedOperationException("Immutable reference"); + } + }; +} diff --git a/zond/src/main/java/asys/zond/win32/W32Errors.java b/zond/src/main/java/asys/zond/win32/W32Errors.java new file mode 100644 index 0000000..ed20a36 --- /dev/null +++ b/zond/src/main/java/asys/zond/win32/W32Errors.java @@ -0,0 +1,23 @@ +/* Copyright (c) 2007 Timothy Wall, All Rights Reserved + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + */ +package asys.zond.win32; + +public interface W32Errors { + + int NO_ERROR = 0; + int ERROR_INVALID_FUNCTION = 1; + int ERROR_FILE_NOT_FOUND = 2; + int ERROR_PATH_NOT_FOUND = 3; + +} diff --git a/zond/src/main/resources/zond.properties b/zond/src/main/resources/zond.properties index ce34e16..5a55b66 100644 --- a/zond/src/main/resources/zond.properties +++ b/zond/src/main/resources/zond.properties @@ -3,4 +3,6 @@ host = 127.0.0.1 port = 8779 passcode = testpassphrase bridge.port = 8710 -pingmonitor.delay = 2100 \ No newline at end of file +pingmonitor.delay = 2100 +#cmdkiller = taskkill /F /PID %PID +cmdkiller = kill -KILL %PID \ No newline at end of file From 02e734ff28753667824a4e184cb533d5ed9db95d Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 24 Jul 2017 22:51:35 +0300 Subject: [PATCH 53/73] =?UTF-8?q?Bridge:=20=D0=BF=D0=B8=D0=BD=D0=B3=20?= =?UTF-8?q?=D0=BD=D0=B0=D0=BF=D1=80=D1=8F=D0=BC=D1=83=D1=8E=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D1=81=D0=B8=D1=82=20=D0=BE=D1=82=20=D1=82=D0=B8?= =?UTF-8?q?=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bridge/build.gradle | 2 +- .../asys/bridge/bukkit/BridgeBukkitImpl.java | 21 ++++++++++++++++--- .../asys/bridge/client/AbstractBridge.java | 2 +- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/bridge/build.gradle b/bridge/build.gradle index e6ffc35..adad88e 100644 --- a/bridge/build.gradle +++ b/bridge/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.8.2-SNAPSHOT' +version = '0.8.3-SNAPSHOT' repositories { maven { url 'https://hub.spigotmc.org/nexus/content/groups/public/' } diff --git a/bridge/src/main/java/asys/bridge/bukkit/BridgeBukkitImpl.java b/bridge/src/main/java/asys/bridge/bukkit/BridgeBukkitImpl.java index be399a3..00b4188 100644 --- a/bridge/src/main/java/asys/bridge/bukkit/BridgeBukkitImpl.java +++ b/bridge/src/main/java/asys/bridge/bukkit/BridgeBukkitImpl.java @@ -8,14 +8,13 @@ import asys.bridge.client.AbstractBridge; import asys.bridge.client.IBridge; import asys.bridge.client.IConfig; import asys.bridge.client.ILogger; -import io.netty.channel.Channel; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.core.Logger; +import asys.mcsmanager.packets.CS_Ping; public class BridgeBukkitImpl extends AbstractBridge implements IBridge { private BridgePlugin plugin; private LoggerBukkitImpl logger; private ConfigBukkitImpl configBukkit; + private int scheduleId = -1; public BridgeBukkitImpl(BridgePlugin plugin) { this.plugin = plugin; @@ -45,4 +44,20 @@ public class BridgeBukkitImpl extends AbstractBridge implements IBridge { command ); } + + @Override + public void startPing() { + scheduleId = plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin,() -> { + plugin.getLogger().info("[D] send ping..."); + this.client.sendPacket(new CS_Ping( + System.currentTimeMillis(), + 20.0D, //FIXME fake tps + getCountOnlinePlayers())); + }, 0, 20L*5); + } + + @Override + public void stopPing() { + plugin.getServer().getScheduler().cancelTask(scheduleId); + } } diff --git a/bridge/src/main/java/asys/bridge/client/AbstractBridge.java b/bridge/src/main/java/asys/bridge/client/AbstractBridge.java index 21a4f28..ecbee7d 100644 --- a/bridge/src/main/java/asys/bridge/client/AbstractBridge.java +++ b/bridge/src/main/java/asys/bridge/client/AbstractBridge.java @@ -9,7 +9,7 @@ import asys.mcsmanager.packets.CS_CorrectShutdown; import asys.mcsmanager.packets.CS_Ping; public abstract class AbstractBridge implements IBridge { - private Client client; + protected Client client; private TaskTicker connectTicker, pingTicker; private int tryConnect = 0; private boolean needReconnect = true; From 1a36b70e5ddb9aa992d26357ea529866f726d914 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 24 Jul 2017 22:55:50 +0300 Subject: [PATCH 54/73] =?UTF-8?q?Bridge:=20=D0=BD=D0=B0=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B9=D0=BA=D0=B0=20=D1=87=D0=B0=D1=81=D1=82=D0=BE=D1=82?= =?UTF-8?q?=D1=8B=20=D0=BF=D0=B8=D0=BD=D0=B3=D0=B0=20=D1=87=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B7=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/asys/bridge/bukkit/BridgeBukkitImpl.java | 7 +++++-- bridge/src/main/resources/config.yml | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/bridge/src/main/java/asys/bridge/bukkit/BridgeBukkitImpl.java b/bridge/src/main/java/asys/bridge/bukkit/BridgeBukkitImpl.java index 00b4188..28effcc 100644 --- a/bridge/src/main/java/asys/bridge/bukkit/BridgeBukkitImpl.java +++ b/bridge/src/main/java/asys/bridge/bukkit/BridgeBukkitImpl.java @@ -14,12 +14,15 @@ public class BridgeBukkitImpl extends AbstractBridge implements IBridge { private BridgePlugin plugin; private LoggerBukkitImpl logger; private ConfigBukkitImpl configBukkit; - private int scheduleId = -1; + private int scheduleId; + private int second; public BridgeBukkitImpl(BridgePlugin plugin) { this.plugin = plugin; this.logger = new LoggerBukkitImpl(plugin.getLogger()); this.configBukkit = new ConfigBukkitImpl(plugin.getConfig()); + + this.second = this.configBukkit.getInt("second"); } @Override @@ -53,7 +56,7 @@ public class BridgeBukkitImpl extends AbstractBridge implements IBridge { System.currentTimeMillis(), 20.0D, //FIXME fake tps getCountOnlinePlayers())); - }, 0, 20L*5); + }, 0, 20L * second); } @Override diff --git a/bridge/src/main/resources/config.yml b/bridge/src/main/resources/config.yml index bec7cc2..66f3bc3 100644 --- a/bridge/src/main/resources/config.yml +++ b/bridge/src/main/resources/config.yml @@ -1 +1,2 @@ -port: 8710 \ No newline at end of file +port: 8710 +second: 5 \ No newline at end of file From 819cb372ba62f5fbf61a2bb7df2769810caec414 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 24 Jul 2017 23:06:55 +0300 Subject: [PATCH 55/73] =?UTF-8?q?Bridge:=20=D1=83=D0=B1=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D0=B9=20=D0=BA=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/asys/bridge/bukkit/BridgeBukkitImpl.java | 3 +-- .../main/java/asys/bridge/bukkit/ConfigBukkitImpl.java | 2 +- .../main/java/asys/bridge/client/AbstractBridge.java | 2 +- bridge/src/main/java/asys/bridge/client/Client.java | 10 +++++----- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/bridge/src/main/java/asys/bridge/bukkit/BridgeBukkitImpl.java b/bridge/src/main/java/asys/bridge/bukkit/BridgeBukkitImpl.java index 28effcc..cdfbbc8 100644 --- a/bridge/src/main/java/asys/bridge/bukkit/BridgeBukkitImpl.java +++ b/bridge/src/main/java/asys/bridge/bukkit/BridgeBukkitImpl.java @@ -17,7 +17,7 @@ public class BridgeBukkitImpl extends AbstractBridge implements IBridge { private int scheduleId; private int second; - public BridgeBukkitImpl(BridgePlugin plugin) { + BridgeBukkitImpl(BridgePlugin plugin) { this.plugin = plugin; this.logger = new LoggerBukkitImpl(plugin.getLogger()); this.configBukkit = new ConfigBukkitImpl(plugin.getConfig()); @@ -51,7 +51,6 @@ public class BridgeBukkitImpl extends AbstractBridge implements IBridge { @Override public void startPing() { scheduleId = plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin,() -> { - plugin.getLogger().info("[D] send ping..."); this.client.sendPacket(new CS_Ping( System.currentTimeMillis(), 20.0D, //FIXME fake tps diff --git a/bridge/src/main/java/asys/bridge/bukkit/ConfigBukkitImpl.java b/bridge/src/main/java/asys/bridge/bukkit/ConfigBukkitImpl.java index be56291..e85ad70 100644 --- a/bridge/src/main/java/asys/bridge/bukkit/ConfigBukkitImpl.java +++ b/bridge/src/main/java/asys/bridge/bukkit/ConfigBukkitImpl.java @@ -10,7 +10,7 @@ import org.bukkit.configuration.file.FileConfiguration; public class ConfigBukkitImpl implements IConfig { private FileConfiguration fileConfiguration; - public ConfigBukkitImpl(FileConfiguration fileConfiguration) { + ConfigBukkitImpl(FileConfiguration fileConfiguration) { this.fileConfiguration = fileConfiguration; } diff --git a/bridge/src/main/java/asys/bridge/client/AbstractBridge.java b/bridge/src/main/java/asys/bridge/client/AbstractBridge.java index ecbee7d..335f010 100644 --- a/bridge/src/main/java/asys/bridge/client/AbstractBridge.java +++ b/bridge/src/main/java/asys/bridge/client/AbstractBridge.java @@ -20,7 +20,7 @@ public abstract class AbstractBridge implements IBridge { connectTicker = new TaskTicker().setStepTimeMs(5000L); connectTicker.setTask(() -> { getLogger().info(String.format("Connect(%d) to Zond...", ++tryConnect)); - client.connect("127.0.0.1", getConfig().getInt("port")); + client.connect(getConfig().getInt("port")); if (client.isConnected()) { stopReconnect(); } else { diff --git a/bridge/src/main/java/asys/bridge/client/Client.java b/bridge/src/main/java/asys/bridge/client/Client.java index 7243997..084e816 100644 --- a/bridge/src/main/java/asys/bridge/client/Client.java +++ b/bridge/src/main/java/asys/bridge/client/Client.java @@ -22,25 +22,25 @@ public class Client { private ChannelFuture channelFuture; private IBridge bridge; - public Client(IBridge bridge) { + Client(IBridge bridge) { this.bridge = bridge; } - public void connect(String host, int port) { + void connect(int port) { if (group == null || bootstrap == null) { group = new NioEventLoopGroup(); bootstrap = createBootstrap(); } - channelFuture = bootstrap.connect(host, port); + channelFuture = bootstrap.connect("127.0.0.1", port); channelFuture.awaitUninterruptibly(5000); } - public boolean isConnected() { + boolean isConnected() { return (channelFuture != null && channelFuture.isSuccess()); } - public void disconnect() { + void disconnect() { group.shutdownGracefully(); } From c5077e58be5c21b8399db825303ca20c7ac47601 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 24 Jul 2017 23:11:58 +0300 Subject: [PATCH 56/73] Bridge: release candidate --- bridge/README.MD | 6 ++++-- bridge/build.gradle | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/bridge/README.MD b/bridge/README.MD index d7a5d23..49ba934 100644 --- a/bridge/README.MD +++ b/bridge/README.MD @@ -1,9 +1,11 @@ # Bridge -Плагин, служащий "мостом" между внутренним серверным API и **ASys** +Данный плагин служит "мостом" между сервером **Spigot** и **ASys** ## Настройка Настройки хранятся в файле `config.yml`. -`port` - Порт для подключения к **Zond**. \ No newline at end of file +`port` - порт для подключения к **Zond**. + +`second` - раз в сколько секунд отправлять пинг-сигнал \ No newline at end of file diff --git a/bridge/build.gradle b/bridge/build.gradle index adad88e..71993fe 100644 --- a/bridge/build.gradle +++ b/bridge/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.8.3-SNAPSHOT' +version = '0.8.4' repositories { maven { url 'https://hub.spigotmc.org/nexus/content/groups/public/' } @@ -22,6 +22,7 @@ compileJava { jar { dependsOn configurations.include + baseName = project.group + '.' + project.name from { configurations.include.collect { it.isDirectory() ? it : zipTree(it) } } } From 6f087426a28a25c969e41e8a6080c7724055c994 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 24 Jul 2017 23:36:56 +0300 Subject: [PATCH 57/73] Zond: fix email --- zond/src/main/java/asys/zond/Config.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zond/src/main/java/asys/zond/Config.java b/zond/src/main/java/asys/zond/Config.java index 78ddc12..a3aaf6f 100644 --- a/zond/src/main/java/asys/zond/Config.java +++ b/zond/src/main/java/asys/zond/Config.java @@ -1,5 +1,5 @@ /* - * DmitriyMX + * DmitriyMX * 2017-06-08 */ package asys.zond; From ddcfa1edf3670f830bd60da6917d8b6465771469 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 24 Jul 2017 23:38:07 +0300 Subject: [PATCH 58/73] Zond: fix code protected --- zond/src/main/java/asys/zond/Config.java | 2 +- zond/src/main/java/asys/zond/ZondExecuteWatchdog.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/zond/src/main/java/asys/zond/Config.java b/zond/src/main/java/asys/zond/Config.java index a3aaf6f..1c72aa3 100644 --- a/zond/src/main/java/asys/zond/Config.java +++ b/zond/src/main/java/asys/zond/Config.java @@ -18,7 +18,7 @@ public class Config { private Config(){ } - void load(InputStream inputStream) throws IOException { + private void load(InputStream inputStream) throws IOException { properties.load(inputStream); if (properties.size() == 0) { throw new IOException("Config empty!"); diff --git a/zond/src/main/java/asys/zond/ZondExecuteWatchdog.java b/zond/src/main/java/asys/zond/ZondExecuteWatchdog.java index 5b45216..3f655cf 100644 --- a/zond/src/main/java/asys/zond/ZondExecuteWatchdog.java +++ b/zond/src/main/java/asys/zond/ZondExecuteWatchdog.java @@ -18,7 +18,7 @@ public class ZondExecuteWatchdog extends ExecuteWatchdog { private long pid; private String cmdkiller; - public ZondExecuteWatchdog(long timeout, PipeInputStream inputStream, String cmdkiller) { + ZondExecuteWatchdog(long timeout, PipeInputStream inputStream, String cmdkiller) { super(timeout); this.inputStream = inputStream; this.cmdkiller = cmdkiller.trim(); From dc891e3d28b1290bd5913e01415f9df76aa7a31b Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 24 Jul 2017 23:39:13 +0300 Subject: [PATCH 59/73] Zond: remove copyright --- zond/src/main/java/asys/zond/win32/Kernel32.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/zond/src/main/java/asys/zond/win32/Kernel32.java b/zond/src/main/java/asys/zond/win32/Kernel32.java index e3dafbe..7f8cc23 100644 --- a/zond/src/main/java/asys/zond/win32/Kernel32.java +++ b/zond/src/main/java/asys/zond/win32/Kernel32.java @@ -1,7 +1,3 @@ -/* - * DmitriyMX - * 2017-07-24 - */ package asys.zond.win32; import com.sun.jna.Native; From a2952fc772282c92c4a921118b32c794c07b7b7e Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 24 Jul 2017 23:39:49 +0300 Subject: [PATCH 60/73] =?UTF-8?q?Zond:=20=D0=BD=D0=B0=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B9=D0=BA=D0=B0=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=B2=20=D0=BF=D0=B8=D0=BD=D0=B3=D0=B0=20?= =?UTF-8?q?=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8?= =?UTF-8?q?=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/src/main/java/asys/zond/PingMonitor.java | 32 +++++++++---------- .../java/asys/zond/ZondCommandHandler.java | 16 ++++++---- zond/src/main/resources/zond.properties | 6 +++- 3 files changed, 30 insertions(+), 24 deletions(-) diff --git a/zond/src/main/java/asys/zond/PingMonitor.java b/zond/src/main/java/asys/zond/PingMonitor.java index dfde0c7..eb228f7 100644 --- a/zond/src/main/java/asys/zond/PingMonitor.java +++ b/zond/src/main/java/asys/zond/PingMonitor.java @@ -1,19 +1,24 @@ +/* + * DmitriyMX + * 2017-07-21 + */ package asys.zond; -import asys.zond.shell.Shell; - public class PingMonitor { - private static final long STEP_PING = 5000; + private final long step_ping; private final long delayStart; private long lastPingTime; private Thread threadPingMon; private boolean correctShutdown = false; + private final int maxlost; - public PingMonitor(long delayStart) { - this.delayStart = delayStart; + PingMonitor(int delay, int second, int maxlost) { + this.delayStart = delay*1000; + this.step_ping = second*1000; + this.maxlost = maxlost; } - public void start(final Runnable callback) { + void start(final Runnable callback) { this.threadPingMon = new Thread(() -> { correctShutdown = false; try { @@ -24,20 +29,13 @@ public class PingMonitor { while (!Thread.currentThread().isInterrupted()) { long currentTimeMillis = System.currentTimeMillis(); - if ((currentTimeMillis - lastPingTime) >= (1*STEP_PING)) { - Shell.getInstance().getOutput().println("[D] lost one ping...."); - } - else if ((currentTimeMillis - lastPingTime) >= (2*STEP_PING)) { // если пропущено два пинга - Shell.getInstance().getOutput().println("[D] lost two ping...."); + if ((currentTimeMillis - lastPingTime) >= (maxlost*step_ping)) { // если пропущено N пингов callback.run(); // запускаем код завершения процесса return; // завершаем поток } - else { - Shell.getInstance().getOutput().println("[D] check ping"); - } try { - Thread.sleep(STEP_PING); + Thread.sleep(step_ping); } catch (InterruptedException e) { return; } @@ -48,7 +46,7 @@ public class PingMonitor { this.threadPingMon.start(); } - public void stop() { + void stop() { if (threadPingMon != null) { threadPingMon.interrupt(); threadPingMon = null; @@ -63,7 +61,7 @@ public class PingMonitor { correctShutdown = true; } - public boolean isCorrectShutdown() { + boolean isCorrectShutdown() { return correctShutdown; } } diff --git a/zond/src/main/java/asys/zond/ZondCommandHandler.java b/zond/src/main/java/asys/zond/ZondCommandHandler.java index b9bc009..83877a1 100644 --- a/zond/src/main/java/asys/zond/ZondCommandHandler.java +++ b/zond/src/main/java/asys/zond/ZondCommandHandler.java @@ -82,15 +82,19 @@ public class ZondCommandHandler implements CommandHandler { executor.setWatchdog(watchdog); } - final long delay = Config.getInstance().getLong("pingmonitor.delay"); - pingMonitor = new PingMonitor(delay); + int delay = Config.getInstance().getInt("pingmonitor.delay"); + pingMonitor = new PingMonitor( + delay, + Config.getInstance().getInt("bridge.second"), + Config.getInstance().getInt("pingmonitor.maxlost") + ); flagManualKill = false; Runnable task = () -> { short _try = 0; do { - int code = 0; + int code; long deadTime = 0; try { @@ -104,12 +108,12 @@ public class ZondCommandHandler implements CommandHandler { flagForceRestartProcess = true; killProcess(); }); - deadTime = (System.currentTimeMillis()/1000) + delay; + deadTime = (System.currentTimeMillis()/1000) + (delay*1000); code = executor.execute(commandLine); } catch (ExecuteException e) { code = e.getExitValue(); } catch (IOException e) { - Shell.getInstance().getOutput().println("Exception message: " + e.getMessage()); + Shell.getInstance().getOutput().println("[!] Exception message: " + e.getMessage()); code = -99; } long currTime = System.currentTimeMillis()/1000; @@ -117,7 +121,7 @@ public class ZondCommandHandler implements CommandHandler { server.shutdown(); pingMonitor.stop(); server = null; - Shell.getInstance().getOutput().println("Process finished. Code: " + code); + Shell.getInstance().getOutput().println("[i] Process finished. Code: " + code); if (pingMonitor.isCorrectShutdown()) { flagForceRestartProcess = false; diff --git a/zond/src/main/resources/zond.properties b/zond/src/main/resources/zond.properties index 5a55b66..30e7048 100644 --- a/zond/src/main/resources/zond.properties +++ b/zond/src/main/resources/zond.properties @@ -3,6 +3,10 @@ host = 127.0.0.1 port = 8779 passcode = testpassphrase bridge.port = 8710 -pingmonitor.delay = 2100 +bridge.second = 5 +pingmonitor.delay = 2 +pingmonitor.maxlost = 6 +#Windows #cmdkiller = taskkill /F /PID %PID +#Linux cmdkiller = kill -KILL %PID \ No newline at end of file From 65b680cef4c18a99a4456be3d2a5f8c4c0e6175d Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 24 Jul 2017 23:44:37 +0300 Subject: [PATCH 61/73] Zond: update README --- zond/README.MD | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/zond/README.MD b/zond/README.MD index e61e9bd..08d6053 100644 --- a/zond/README.MD +++ b/zond/README.MD @@ -15,6 +15,16 @@ `passcode` - секретное слово для предотвращения несанкционированного подключения +`bridge.port` - порт для подключения **Bridge** + +`bridge.second` - раз в сколько секунд **Bridge** будет присылать пинги + +`pingmonitor.delay` - задержка старта пинг-монитора + +`pingmonitor.maxlost` - сколько максимум пинг-сигналов позволено пропустить. По достижению этого числа, игровой сервер считается зависшим + +`cmdkiller` - комманда для "убийства" процесса сервера, на случай "тяжелых" зависаний + ## Запуск В качестве параметров передаётся коммандная строка для запуска майн-сервера. From 87301cd8e998ed077539b7d383a7f47c781d3158 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 24 Jul 2017 23:45:49 +0300 Subject: [PATCH 62/73] =?UTF-8?q?Zond:=20=D1=83=D0=B1=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B4=D0=BB=D1=8F=20=D0=BE=D1=82=D0=BB=D0=B0=D0=B4?= =?UTF-8?q?=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 3 +-- zond/src/main/java/asys/zond/ZondExecuteWatchdog.java | 3 --- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/zond/build.gradle b/zond/build.gradle index 8efcb3e..a79abbb 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.7.15-SNAPSHOT' +version = '0.7.16-SNAPSHOT' apply plugin: 'application' @@ -46,5 +46,4 @@ dependencies { included group: 'io.netty', name: 'netty-codec', version: nettyVersion included group: 'com.google.guava', name: 'guava', version: '21.0' included group: 'com.sun.jna', name: 'jna', version: '3.0.9' - } diff --git a/zond/src/main/java/asys/zond/ZondExecuteWatchdog.java b/zond/src/main/java/asys/zond/ZondExecuteWatchdog.java index 3f655cf..b153757 100644 --- a/zond/src/main/java/asys/zond/ZondExecuteWatchdog.java +++ b/zond/src/main/java/asys/zond/ZondExecuteWatchdog.java @@ -69,12 +69,9 @@ public class ZondExecuteWatchdog extends ExecuteWatchdog { if (pid != -1 && cmdkiller != null && !cmdkiller.isEmpty()) { try { String cmd = cmdkiller.replace("%PID", String.valueOf(pid)); - Shell.getInstance().getOutput().println("CMDKILL: '" + cmd + "'"); Runtime.getRuntime().exec(cmd); } catch (IOException ignore) { } - } else { - Shell.getInstance().getOutput().println("PID = -1"); } } } From 4410dd694e52f86f7b6aea50a69c2899df209963 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 13 Aug 2017 16:19:15 +0300 Subject: [PATCH 63/73] =?UTF-8?q?Zond:fix:=20=D1=81=D0=BB=D0=B8=D1=88?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=20=D1=87=D0=B0=D1=81=D1=82=D1=8B=D0=B5=20?= =?UTF-8?q?=D1=80=D0=B5=D1=81=D1=82=D0=B0=D1=80=D1=8B=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=20=D1=81=D1=82=D0=B0=D1=80=D1=82=D0=B5=20=D1=81=D0=B5=D1=80?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/src/main/java/asys/zond/ZondCommandHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zond/src/main/java/asys/zond/ZondCommandHandler.java b/zond/src/main/java/asys/zond/ZondCommandHandler.java index 83877a1..e358633 100644 --- a/zond/src/main/java/asys/zond/ZondCommandHandler.java +++ b/zond/src/main/java/asys/zond/ZondCommandHandler.java @@ -102,13 +102,13 @@ public class ZondCommandHandler implements CommandHandler { server.setPingMonitor(pingMonitor); server.start(Config.getInstance().getInt("bridge.port")); + deadTime = (System.currentTimeMillis()/1000) + (delay*1000); pingMonitor.start(() -> { Shell.getInstance().getOutput().println("[!] Process - zobie?"); Shell.getInstance().getOutput().println("[!] Force shutdown process."); flagForceRestartProcess = true; killProcess(); }); - deadTime = (System.currentTimeMillis()/1000) + (delay*1000); code = executor.execute(commandLine); } catch (ExecuteException e) { code = e.getExitValue(); @@ -128,7 +128,7 @@ public class ZondCommandHandler implements CommandHandler { _try = 0; break; } else { - if (currTime <= deadTime && !flagManualKill && !flagForceRestartProcess) { + if (currTime <= deadTime && !flagManualKill) { Shell.getInstance().getOutput().println("[!] Premature end process."); _try++; if (_try < 2) { From d9a5a538216966bcb08dc0b06013b43c5a32be5f Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 13 Aug 2017 16:33:56 +0300 Subject: [PATCH 64/73] =?UTF-8?q?Zond:=20=D0=BB=D0=BE=D0=B3=D0=BE=D1=82?= =?UTF-8?q?=D0=B8=D0=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/src/main/java/asys/zond/Main.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/zond/src/main/java/asys/zond/Main.java b/zond/src/main/java/asys/zond/Main.java index ba625b3..7ef8428 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -10,6 +10,8 @@ import org.apache.commons.exec.CommandLine; import org.apache.commons.exec.DefaultExecutor; import org.apache.commons.exec.Executor; import org.apache.commons.exec.PumpStreamHandler; +import org.fusesource.jansi.Ansi; +import org.fusesource.jansi.AnsiConsole; import java.io.*; import java.util.Arrays; @@ -24,7 +26,18 @@ public class Main { new Main().start(args); } + private String printLogo() { + return Ansi.ansi().bold().fg(Ansi.Color.WHITE).a("ASys") + .boldOff().a(":// ") + .fg(Ansi.Color.RED).a("Zond") + .reset().newline().toString(); + } + private void start(String[] args) { + if (Boolean.getBoolean("ansi.install")) + AnsiConsole.systemInstall(); + System.out.println(printLogo()); + try { Config.getInstance().load(); } catch (IOException e) { From ce4e8871aad7c64960a689106fe1e3147858848d Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 13 Aug 2017 16:48:26 +0300 Subject: [PATCH 65/73] =?UTF-8?q?Zond:=20=D1=86=D0=B2=D0=B5=D1=82=D0=BD?= =?UTF-8?q?=D0=BE=D0=B9=20=D1=82=D0=B5=D0=BA=D1=81=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/asys/zond/ZondCommandHandler.java | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/zond/src/main/java/asys/zond/ZondCommandHandler.java b/zond/src/main/java/asys/zond/ZondCommandHandler.java index e358633..4d9e736 100644 --- a/zond/src/main/java/asys/zond/ZondCommandHandler.java +++ b/zond/src/main/java/asys/zond/ZondCommandHandler.java @@ -12,6 +12,7 @@ import org.apache.commons.exec.CommandLine; import org.apache.commons.exec.ExecuteException; import org.apache.commons.exec.ExecuteWatchdog; import org.apache.commons.exec.Executor; +import org.fusesource.jansi.Ansi; import java.io.IOException; @@ -30,6 +31,12 @@ public class ZondCommandHandler implements CommandHandler { this.proxyStdIn = proxyStdIn; } + private static String zondColored(String string) { + return Ansi.ansi().bg(Ansi.Color.WHITE).fg(Ansi.Color.RED).a("[Zond]") + .reset().fg(Ansi.Color.RED).a(' ').a(string) + .reset().toString(); + } + @Override public void handle(String commandLine) { if (commandLine.startsWith(":")) { @@ -54,10 +61,10 @@ public class ZondCommandHandler implements CommandHandler { } else if (line.equalsIgnoreCase("connect")) { Connector.getInstance().startReconnect(); } else if (line.equalsIgnoreCase("disconnect")) { - Shell.getInstance().getOutput().println("Disconnect"); + Shell.getInstance().getOutput().println(zondColored("Disconnect")); Connector.getInstance().shutdown(); } else if (line.equalsIgnoreCase("reload")) { - Shell.getInstance().getOutput().println("Reload config"); + Shell.getInstance().getOutput().println(zondColored("Reload config")); try { Config.getInstance().load(); } catch (IOException e) { @@ -104,8 +111,8 @@ public class ZondCommandHandler implements CommandHandler { deadTime = (System.currentTimeMillis()/1000) + (delay*1000); pingMonitor.start(() -> { - Shell.getInstance().getOutput().println("[!] Process - zobie?"); - Shell.getInstance().getOutput().println("[!] Force shutdown process."); + Shell.getInstance().getOutput().println(zondColored("[!] Process - zobie?")); + Shell.getInstance().getOutput().println(zondColored("[!] Force shutdown process.")); flagForceRestartProcess = true; killProcess(); }); @@ -113,7 +120,7 @@ public class ZondCommandHandler implements CommandHandler { } catch (ExecuteException e) { code = e.getExitValue(); } catch (IOException e) { - Shell.getInstance().getOutput().println("[!] Exception message: " + e.getMessage()); + Shell.getInstance().getOutput().println(zondColored("[!] Exception message: " + e.getMessage())); code = -99; } long currTime = System.currentTimeMillis()/1000; @@ -121,7 +128,7 @@ public class ZondCommandHandler implements CommandHandler { server.shutdown(); pingMonitor.stop(); server = null; - Shell.getInstance().getOutput().println("[i] Process finished. Code: " + code); + Shell.getInstance().getOutput().println(zondColored("[i] Process finished. Code: " + code)); if (pingMonitor.isCorrectShutdown()) { flagForceRestartProcess = false; @@ -129,16 +136,16 @@ public class ZondCommandHandler implements CommandHandler { break; } else { if (currTime <= deadTime && !flagManualKill) { - Shell.getInstance().getOutput().println("[!] Premature end process."); + Shell.getInstance().getOutput().println(zondColored("[!] Premature end process.")); _try++; if (_try < 2) { - Shell.getInstance().getOutput().println("[!] Try start process again..."); + Shell.getInstance().getOutput().println(zondColored("[!] Try start process again...")); } } else if (flagForceRestartProcess) { _try = 0; flagForceRestartProcess = false; } else if (code != 0 && code != -99 && !flagManualKill) { - Shell.getInstance().getOutput().println("[!] Try start process again..."); + Shell.getInstance().getOutput().println(zondColored("[!] Try start process again...")); _try = 0; } else { break; @@ -147,7 +154,7 @@ public class ZondCommandHandler implements CommandHandler { } while (_try < 2); if (_try == 2) { - Shell.getInstance().getOutput().println("[!] Discovered the problem when starting the process"); + Shell.getInstance().getOutput().println(zondColored("[!] Discovered the problem when starting the process")); } }; threadExec = new Thread(task, "Zond Exec"); From 7018873758f3bb9077fe763588a44860237b8888 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 13 Aug 2017 17:40:11 +0300 Subject: [PATCH 66/73] =?UTF-8?q?Zond:=20=D1=82=D0=B8=D0=BA=D0=B5=D1=80,?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D0=B7=D0=B0=D0=BC=D0=B5=D1=80=D0=B0=20?= =?UTF-8?q?=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8=20=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D1=80=D1=82=D0=B0=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/asys/zond/ZondCommandHandler.java | 48 ++++++++++++++++--- 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/zond/src/main/java/asys/zond/ZondCommandHandler.java b/zond/src/main/java/asys/zond/ZondCommandHandler.java index 4d9e736..40761d2 100644 --- a/zond/src/main/java/asys/zond/ZondCommandHandler.java +++ b/zond/src/main/java/asys/zond/ZondCommandHandler.java @@ -26,6 +26,8 @@ public class ZondCommandHandler implements CommandHandler { private PingMonitor pingMonitor; private boolean flagForceRestartProcess = false; private boolean flagManualKill = false; + private boolean flagTicker = false; + private Thread threadTicker; ZondCommandHandler(PipeInputStream proxyStdIn) { this.proxyStdIn = proxyStdIn; @@ -37,6 +39,22 @@ public class ZondCommandHandler implements CommandHandler { .reset().toString(); } + private void buildThreadTicker() { + threadTicker = new Thread(() -> { + int sec = 0; + while (!Thread.currentThread().isInterrupted() && flagTicker) { + Shell.getInstance().getOutput().println(zondColored( + Ansi.ansi().fg(Ansi.Color.CYAN).a("Tick "+(sec++)+" sec").toString() + )); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + break; + } + } + }, "Thread Ticker"); + } + @Override public void handle(String commandLine) { if (commandLine.startsWith(":")) { @@ -70,6 +88,9 @@ public class ZondCommandHandler implements CommandHandler { } catch (IOException e) { e.printStackTrace(); } + } else if (line.equalsIgnoreCase("ticker")) { + flagTicker = !flagTicker; + Shell.getInstance().getOutput().println(zondColored("Ticker " + (flagTicker?"on":"off"))); } } @@ -110,12 +131,23 @@ public class ZondCommandHandler implements CommandHandler { server.start(Config.getInstance().getInt("bridge.port")); deadTime = (System.currentTimeMillis()/1000) + (delay*1000); - pingMonitor.start(() -> { - Shell.getInstance().getOutput().println(zondColored("[!] Process - zobie?")); - Shell.getInstance().getOutput().println(zondColored("[!] Force shutdown process.")); - flagForceRestartProcess = true; - killProcess(); - }); + Runnable callback; + if (flagTicker) { + callback = () -> { + Shell.getInstance().getOutput().println(zondColored("[!] Process - zobie?")); + }; + + buildThreadTicker(); + threadTicker.start(); + } else { + callback = () -> { + Shell.getInstance().getOutput().println(zondColored("[!] Process - zobie?")); + Shell.getInstance().getOutput().println(zondColored("[!] Force shutdown process.")); + flagForceRestartProcess = true; + killProcess(); + }; + } + pingMonitor.start(callback); code = executor.execute(commandLine); } catch (ExecuteException e) { code = e.getExitValue(); @@ -133,6 +165,8 @@ public class ZondCommandHandler implements CommandHandler { if (pingMonitor.isCorrectShutdown()) { flagForceRestartProcess = false; _try = 0; + if (flagTicker) + threadTicker.interrupt(); break; } else { if (currTime <= deadTime && !flagManualKill) { @@ -168,6 +202,8 @@ public class ZondCommandHandler implements CommandHandler { pingMonitor.stop(); watchdog.destroyProcess(); threadExec.interrupt(); + if (threadTicker != null) + threadTicker.interrupt(); } } } From 0f213e1ba96e1c47fc402e2b1adfc58f519a794c Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 13 Aug 2017 17:50:40 +0300 Subject: [PATCH 67/73] =?UTF-8?q?Zond:=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD?= =?UTF-8?q?=D0=B4=D0=B0=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=B0=20?= =?UTF-8?q?=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=B0=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D0=B0=20=D0=B2=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BD=D1=84=D0=B8=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/src/main/java/asys/zond/Main.java | 10 +++++----- zond/src/main/java/asys/zond/ZondCommandHandler.java | 2 +- zond/src/main/resources/zond.properties | 7 ++++--- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/zond/src/main/java/asys/zond/Main.java b/zond/src/main/java/asys/zond/Main.java index 7ef8428..0dbbd8f 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -23,7 +23,7 @@ public class Main { private PipeInputStream proxyStdIn; public static void main(String[] args) throws IOException { - new Main().start(args); + new Main().start(); } private String printLogo() { @@ -33,7 +33,7 @@ public class Main { .reset().newline().toString(); } - private void start(String[] args) { + private void start() { if (Boolean.getBoolean("ansi.install")) AnsiConsole.systemInstall(); System.out.println(printLogo()); @@ -48,7 +48,7 @@ public class Main { proxyStdIn = new PipeInputStream(); ZondCommandHandler commandHandler = new ZondCommandHandler(proxyStdIn); startShell(commandHandler); - initExecCommand(args, Shell.getInstance().getOutput()); + initExecCommand(Shell.getInstance().getOutput()); commandHandler.setExecutor(executor, commandLine); } @@ -62,8 +62,8 @@ public class Main { } } - private void initExecCommand(String[] args, PrintStream stdout) { - String cmdLine = Arrays.stream(args).collect(Collectors.joining(" ")); + private void initExecCommand(PrintStream stdout) { + String cmdLine = Config.getInstance().getString("cmd.start"); commandLine = CommandLine.parse(cmdLine); executor = new DefaultExecutor(); PumpStreamHandler pumpStreamHandler = new PumpStreamHandler(stdout, stdout, proxyStdIn); diff --git a/zond/src/main/java/asys/zond/ZondCommandHandler.java b/zond/src/main/java/asys/zond/ZondCommandHandler.java index 40761d2..1330d8f 100644 --- a/zond/src/main/java/asys/zond/ZondCommandHandler.java +++ b/zond/src/main/java/asys/zond/ZondCommandHandler.java @@ -105,7 +105,7 @@ public class ZondCommandHandler implements CommandHandler { watchdog = new ZondExecuteWatchdog( ExecuteWatchdog.INFINITE_TIMEOUT, proxyStdIn, - Config.getInstance().getString("cmdkiller") + Config.getInstance().getString("cmd.killer") ); executor.setWatchdog(watchdog); diff --git a/zond/src/main/resources/zond.properties b/zond/src/main/resources/zond.properties index 30e7048..6c3d764 100644 --- a/zond/src/main/resources/zond.properties +++ b/zond/src/main/resources/zond.properties @@ -4,9 +4,10 @@ port = 8779 passcode = testpassphrase bridge.port = 8710 bridge.second = 5 -pingmonitor.delay = 2 +pingmonitor.delay = 5 pingmonitor.maxlost = 6 #Windows -#cmdkiller = taskkill /F /PID %PID +#cmd.killer = taskkill /F /PID %PID #Linux -cmdkiller = kill -KILL %PID \ No newline at end of file +cmd.killer = kill -KILL %PID +cmd.start = java -jar server.jar \ No newline at end of file From 9b5ff8a6ad54289af210ded8c8ecf3c374340b2f Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 13 Aug 2017 19:19:42 +0300 Subject: [PATCH 68/73] =?UTF-8?q?Zond:=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B8?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BF?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/asys/zond/proxy/client/ClientPacketHandler.java | 4 ++-- zond/src/main/java/asys/zond/proxy/client/Connector.java | 4 ++-- zond/src/main/resources/zond.properties | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/zond/src/main/java/asys/zond/proxy/client/ClientPacketHandler.java b/zond/src/main/java/asys/zond/proxy/client/ClientPacketHandler.java index 84c70a8..202d416 100644 --- a/zond/src/main/java/asys/zond/proxy/client/ClientPacketHandler.java +++ b/zond/src/main/java/asys/zond/proxy/client/ClientPacketHandler.java @@ -45,8 +45,8 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements ctx.channel().attr(KNOWN_HANDLERS).set(handshakeHandlers); ctx.channel().writeAndFlush(new CS_Handshake( - Config.getInstance().getString("serverId"), - Config.getInstance().getString("passcode") + Config.getInstance().getString("asys.serverId"), + Config.getInstance().getString("asys.passcode") )); } diff --git a/zond/src/main/java/asys/zond/proxy/client/Connector.java b/zond/src/main/java/asys/zond/proxy/client/Connector.java index 9ffb5cd..191bee3 100644 --- a/zond/src/main/java/asys/zond/proxy/client/Connector.java +++ b/zond/src/main/java/asys/zond/proxy/client/Connector.java @@ -31,8 +31,8 @@ public class Connector { connectTicker.setTask(() -> { Shell.getInstance().getOutput() .println(String.format("Connect(%d) to ASys...", ++tryConnect)); - client.connect(Config.getInstance().getString("host"), - Config.getInstance().getInt("port")); + client.connect(Config.getInstance().getString("asys.host"), + Config.getInstance().getInt("asys.port")); if (client.isConnected()) { stopReconnect(); } else { diff --git a/zond/src/main/resources/zond.properties b/zond/src/main/resources/zond.properties index 6c3d764..ddffcb0 100644 --- a/zond/src/main/resources/zond.properties +++ b/zond/src/main/resources/zond.properties @@ -1,7 +1,7 @@ -serverId = SpigotServer0 -host = 127.0.0.1 -port = 8779 -passcode = testpassphrase +asys.serverId = SpigotServer0 +asys.host = 127.0.0.1 +asys.port = 8779 +asys.passcode = testpassphrase bridge.port = 8710 bridge.second = 5 pingmonitor.delay = 5 From 3c274219debb54786d4d7c441e929e88a11eb2dd Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 13 Aug 2017 19:22:10 +0300 Subject: [PATCH 69/73] =?UTF-8?q?Zond:=20=D0=B2=D1=81=D1=91=20=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D0=B8=D0=B7=20=D0=BA=D0=BE=D0=BD=D1=84?= =?UTF-8?q?=D0=B8=D0=B3=D0=B0=20=D0=BD=D0=B0=D0=BF=D1=80=D1=8F=D0=BC=D1=83?= =?UTF-8?q?=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/src/main/java/asys/zond/ZondCommandHandler.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/zond/src/main/java/asys/zond/ZondCommandHandler.java b/zond/src/main/java/asys/zond/ZondCommandHandler.java index 1330d8f..07c175f 100644 --- a/zond/src/main/java/asys/zond/ZondCommandHandler.java +++ b/zond/src/main/java/asys/zond/ZondCommandHandler.java @@ -110,9 +110,8 @@ public class ZondCommandHandler implements CommandHandler { executor.setWatchdog(watchdog); } - int delay = Config.getInstance().getInt("pingmonitor.delay"); pingMonitor = new PingMonitor( - delay, + Config.getInstance().getInt("pingmonitor.delay"), Config.getInstance().getInt("bridge.second"), Config.getInstance().getInt("pingmonitor.maxlost") ); @@ -130,7 +129,7 @@ public class ZondCommandHandler implements CommandHandler { server.setPingMonitor(pingMonitor); server.start(Config.getInstance().getInt("bridge.port")); - deadTime = (System.currentTimeMillis()/1000) + (delay*1000); + deadTime = (System.currentTimeMillis()/1000) + (Config.getInstance().getInt("pingmonitor.delay")*1000); Runnable callback; if (flagTicker) { callback = () -> { From 74f57eff3fefab0316b20bba077f74285f0bd3c8 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 13 Aug 2017 19:31:38 +0300 Subject: [PATCH 70/73] =?UTF-8?q?Zond:=20=D0=BA=D0=BE=D1=80=D1=80=D0=B5?= =?UTF-8?q?=D0=BA=D1=86=D0=B8=D1=8F=20=D1=86=D0=B2=D0=B5=D1=82=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=20=D0=BD=D0=B0=D0=B4=D0=BF=D0=B8=D1=81=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/asys/zond/ZondCommandHandler.java | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/zond/src/main/java/asys/zond/ZondCommandHandler.java b/zond/src/main/java/asys/zond/ZondCommandHandler.java index 07c175f..193979f 100644 --- a/zond/src/main/java/asys/zond/ZondCommandHandler.java +++ b/zond/src/main/java/asys/zond/ZondCommandHandler.java @@ -34,8 +34,12 @@ public class ZondCommandHandler implements CommandHandler { } private static String zondColored(String string) { + return zondColored(string, Ansi.Color.CYAN); + } + + private static String zondColored(String string, Ansi.Color color) { return Ansi.ansi().bg(Ansi.Color.WHITE).fg(Ansi.Color.RED).a("[Zond]") - .reset().fg(Ansi.Color.RED).a(' ').a(string) + .reset().fgBright(color).a(' ').a(string) .reset().toString(); } @@ -43,9 +47,7 @@ public class ZondCommandHandler implements CommandHandler { threadTicker = new Thread(() -> { int sec = 0; while (!Thread.currentThread().isInterrupted() && flagTicker) { - Shell.getInstance().getOutput().println(zondColored( - Ansi.ansi().fg(Ansi.Color.CYAN).a("Tick "+(sec++)+" sec").toString() - )); + Shell.getInstance().getOutput().println(zondColored("Tick "+(sec++)+" sec")); try { Thread.sleep(1000); } catch (InterruptedException e) { @@ -133,15 +135,15 @@ public class ZondCommandHandler implements CommandHandler { Runnable callback; if (flagTicker) { callback = () -> { - Shell.getInstance().getOutput().println(zondColored("[!] Process - zobie?")); + Shell.getInstance().getOutput().println(zondColored("[!] Process - zobie?", Ansi.Color.RED)); }; buildThreadTicker(); threadTicker.start(); } else { callback = () -> { - Shell.getInstance().getOutput().println(zondColored("[!] Process - zobie?")); - Shell.getInstance().getOutput().println(zondColored("[!] Force shutdown process.")); + Shell.getInstance().getOutput().println(zondColored("[!] Process - zobie?", Ansi.Color.RED)); + Shell.getInstance().getOutput().println(zondColored("[!] Force shutdown process.", Ansi.Color.RED)); flagForceRestartProcess = true; killProcess(); }; @@ -151,7 +153,7 @@ public class ZondCommandHandler implements CommandHandler { } catch (ExecuteException e) { code = e.getExitValue(); } catch (IOException e) { - Shell.getInstance().getOutput().println(zondColored("[!] Exception message: " + e.getMessage())); + Shell.getInstance().getOutput().println(zondColored("[!] Exception message: " + e.getMessage(), Ansi.Color.RED)); code = -99; } long currTime = System.currentTimeMillis()/1000; @@ -159,7 +161,7 @@ public class ZondCommandHandler implements CommandHandler { server.shutdown(); pingMonitor.stop(); server = null; - Shell.getInstance().getOutput().println(zondColored("[i] Process finished. Code: " + code)); + Shell.getInstance().getOutput().println(zondColored("[i] Process finished. Code: " + code, Ansi.Color.RED)); if (pingMonitor.isCorrectShutdown()) { flagForceRestartProcess = false; @@ -169,16 +171,16 @@ public class ZondCommandHandler implements CommandHandler { break; } else { if (currTime <= deadTime && !flagManualKill) { - Shell.getInstance().getOutput().println(zondColored("[!] Premature end process.")); + Shell.getInstance().getOutput().println(zondColored("[!] Premature end process.", Ansi.Color.RED)); _try++; if (_try < 2) { - Shell.getInstance().getOutput().println(zondColored("[!] Try start process again...")); + Shell.getInstance().getOutput().println(zondColored("[!] Try start process again...", Ansi.Color.RED)); } } else if (flagForceRestartProcess) { _try = 0; flagForceRestartProcess = false; } else if (code != 0 && code != -99 && !flagManualKill) { - Shell.getInstance().getOutput().println(zondColored("[!] Try start process again...")); + Shell.getInstance().getOutput().println(zondColored("[!] Try start process again...", Ansi.Color.RED)); _try = 0; } else { break; @@ -187,7 +189,7 @@ public class ZondCommandHandler implements CommandHandler { } while (_try < 2); if (_try == 2) { - Shell.getInstance().getOutput().println(zondColored("[!] Discovered the problem when starting the process")); + Shell.getInstance().getOutput().println(zondColored("[!] Discovered the problem when starting the process", Ansi.Color.RED)); } }; threadExec = new Thread(task, "Zond Exec"); From 85fd76dde19b4cd54ab1a6c384f1cdb4edf6e341 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 13 Aug 2017 20:11:10 +0300 Subject: [PATCH 71/73] =?UTF-8?q?Zond:=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF?= =?UTF-8?q?=D1=82=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=20=D0=B7=D0=B0=D0=BF?= =?UTF-8?q?=D1=83=D1=81=D0=BA=D0=BE=D0=BC=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/asys/zond/ZondCommandHandler.java | 28 +++++++++++++++++++ zond/src/main/resources/zond.properties | 3 +- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/zond/src/main/java/asys/zond/ZondCommandHandler.java b/zond/src/main/java/asys/zond/ZondCommandHandler.java index 193979f..87b9ed9 100644 --- a/zond/src/main/java/asys/zond/ZondCommandHandler.java +++ b/zond/src/main/java/asys/zond/ZondCommandHandler.java @@ -14,7 +14,12 @@ import org.apache.commons.exec.ExecuteWatchdog; import org.apache.commons.exec.Executor; import org.fusesource.jansi.Ansi; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.List; public class ZondCommandHandler implements CommandHandler { private Executor executor; @@ -57,6 +62,27 @@ public class ZondCommandHandler implements CommandHandler { }, "Thread Ticker"); } + private void preStartScript() { + if (Config.getInstance().getString("cmd.prestart").isEmpty()) + return; + + ProcessBuilder builder = new ProcessBuilder(Arrays.asList( + Config.getInstance().getString("cmd.prestart").split(" ", 2))); + builder.redirectErrorStream(true); + try { + Process process = builder.start(); + BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); + String line; + while ((line = br.readLine()) != null) { + Shell.getInstance().getOutput().println(zondColored(line)); + } + process.waitFor(); + } catch (IOException | InterruptedException e) { + Shell.getInstance().getOutput() + .println(zondColored("[!] PreStart error: " + e.getMessage(), Ansi.Color.RED)); + } + } + @Override public void handle(String commandLine) { if (commandLine.startsWith(":")) { @@ -103,6 +129,8 @@ public class ZondCommandHandler implements CommandHandler { private void startProcess() { if (watchdog == null || !watchdog.isWatching()) { + preStartScript(); + if (watchdog == null) { watchdog = new ZondExecuteWatchdog( ExecuteWatchdog.INFINITE_TIMEOUT, diff --git a/zond/src/main/resources/zond.properties b/zond/src/main/resources/zond.properties index ddffcb0..03dc7dc 100644 --- a/zond/src/main/resources/zond.properties +++ b/zond/src/main/resources/zond.properties @@ -10,4 +10,5 @@ pingmonitor.maxlost = 6 #cmd.killer = taskkill /F /PID %PID #Linux cmd.killer = kill -KILL %PID -cmd.start = java -jar server.jar \ No newline at end of file +cmd.start = java -jar server.jar +cmd.prestart = echo Hello \ No newline at end of file From 64291af3969f07ae7628f69761e77481f0e4e7c5 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 13 Aug 2017 20:24:02 +0300 Subject: [PATCH 72/73] =?UTF-8?q?Zond:=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF?= =?UTF-8?q?=D1=82=20=D0=BF=D1=80=D0=B8=20=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA?= =?UTF-8?q?=D0=B5=20=D1=81=D1=82=D0=B0=D1=80=D1=82=D0=B0=20=D1=81=D0=B5?= =?UTF-8?q?=D1=80=D0=B2=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/asys/zond/ZondCommandHandler.java | 28 +++++++++++++++++-- zond/src/main/resources/zond.properties | 3 +- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/zond/src/main/java/asys/zond/ZondCommandHandler.java b/zond/src/main/java/asys/zond/ZondCommandHandler.java index 87b9ed9..3d9f9bb 100644 --- a/zond/src/main/java/asys/zond/ZondCommandHandler.java +++ b/zond/src/main/java/asys/zond/ZondCommandHandler.java @@ -77,9 +77,32 @@ public class ZondCommandHandler implements CommandHandler { Shell.getInstance().getOutput().println(zondColored(line)); } process.waitFor(); - } catch (IOException | InterruptedException e) { + } catch (IOException e) { Shell.getInstance().getOutput() - .println(zondColored("[!] PreStart error: " + e.getMessage(), Ansi.Color.RED)); + .println(zondColored("[!] PreStart script error: " + e.getMessage(), Ansi.Color.RED)); + } catch (InterruptedException ignore) { + } + } + + private void errorStartScript() { + if (Config.getInstance().getString("cmd.errorstart").isEmpty()) + return; + + ProcessBuilder builder = new ProcessBuilder(Arrays.asList( + Config.getInstance().getString("cmd.errorstart").split(" ", 2))); + builder.redirectErrorStream(true); + try { + Process process = builder.start(); + BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); + String line; + while ((line = br.readLine()) != null) { + Shell.getInstance().getOutput().println(zondColored(line, Ansi.Color.RED)); + } + process.waitFor(); + } catch (IOException e) { + Shell.getInstance().getOutput() + .println(zondColored("[!] ErrorStart script error: " + e.getMessage(), Ansi.Color.RED)); + } catch (InterruptedException ignore) { } } @@ -218,6 +241,7 @@ public class ZondCommandHandler implements CommandHandler { if (_try == 2) { Shell.getInstance().getOutput().println(zondColored("[!] Discovered the problem when starting the process", Ansi.Color.RED)); + errorStartScript(); } }; threadExec = new Thread(task, "Zond Exec"); diff --git a/zond/src/main/resources/zond.properties b/zond/src/main/resources/zond.properties index 03dc7dc..2b8cd15 100644 --- a/zond/src/main/resources/zond.properties +++ b/zond/src/main/resources/zond.properties @@ -11,4 +11,5 @@ pingmonitor.maxlost = 6 #Linux cmd.killer = kill -KILL %PID cmd.start = java -jar server.jar -cmd.prestart = echo Hello \ No newline at end of file +cmd.prestart = echo Hello +cmd.errorstart = echo Error \ No newline at end of file From 2c121b6eee5ffd5da2bdda72995f017cf58efaaa Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 13 Aug 2017 22:49:44 +0300 Subject: [PATCH 73/73] Zond: release candidate --- zond/README.MD | 31 +++++++++++++++++-------------- zond/build.gradle | 2 +- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/zond/README.MD b/zond/README.MD index 08d6053..89c114d 100644 --- a/zond/README.MD +++ b/zond/README.MD @@ -7,13 +7,13 @@ Настройки храняться в файле `zond.properties`. Если файл не будет найден, **Zond** создаст файл настроек по-умолчанию -`serverId` - идентификатор запускаемого сервера. Одновременно является именем и уникальным ID +`asys.serverId` - идентификатор запускаемого сервера. Одновременно является именем и уникальным ID -`host` - IP/Hostname для подключения к **ASys** +`asys.host` - IP/Hostname для подключения к **ASys** -`port` - порт для подключения к **ASys** +`asys.port` - порт для подключения к **ASys** -`passcode` - секретное слово для предотвращения несанкционированного подключения +`asys.passcode` - секретное слово для предотвращения несанкционированного подключения `bridge.port` - порт для подключения **Bridge** @@ -23,29 +23,32 @@ `pingmonitor.maxlost` - сколько максимум пинг-сигналов позволено пропустить. По достижению этого числа, игровой сервер считается зависшим -`cmdkiller` - комманда для "убийства" процесса сервера, на случай "тяжелых" зависаний +`cmd.killer` - комманда для "убийства" процесса сервера + +`cmd.start` - комманда для запуска провесса сервера + +`cmd.prestart` - комманда выполняющаяся перед запуском сервера + +`cmd.errorstart` - комманда выполняющаяся в случае проблем с запуском сервера ## Запуск -В качестве параметров передаётся коммандная строка для запуска майн-сервера. - -Пример запуска: - ``` -FORGE=java -jar forge-1.10.2-universal.jar -java -jar asys.zond.jar $FORGE +java -jar asys.zond.jar ``` ## Комманды `:reload` - перезагрузить настройки +`:ticker` - вкл/выкл тикера. Нужен для корректировки задержки старта пинг-монитора + +`:start` - запуск процесса сервера + `:connect` - подключиться к **ASys** `:disconnect` - отключиться от **ASys** -`:start` - запуск процесса майн-сервера - -`:kill` - принудительно завершить процесс майн-сервера +`:kill` - принудительно завершить процесс сервера `:exit` - завершить работу **Zond**. \ No newline at end of file diff --git a/zond/build.gradle b/zond/build.gradle index a79abbb..488eaae 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.7.16-SNAPSHOT' +version = '0.7.17' apply plugin: 'application'