From 1f9bac5a0a304095090629220b278934371acc67 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 24 Jun 2017 17:13:19 +0300 Subject: [PATCH] =?UTF-8?q?Zond:=20=D1=81=D0=BE=D0=B5=D0=B4=D0=B8=D0=BD?= =?UTF-8?q?=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