Zond: попытка перевести основной функционал плагина на "зонд"
что бы плагин занимался только апи сервера
This commit is contained in:
@@ -6,15 +6,4 @@
|
|||||||
|
|
||||||
Настройки хранятся в файле `config.yml`.
|
Настройки хранятся в файле `config.yml`.
|
||||||
|
|
||||||
`clientId` - Идентификатор и одновременно имя сервера. Должно быть уникальным.
|
`port` - Порт для подключения к Zond.
|
||||||
|
|
||||||
`mode` - Режим работы плагина. Имеется два режим: `1` и `2`.
|
|
||||||
Первый предназначен для прямого подключения к ASys: принимаются комманды, передается вывод консоли.
|
|
||||||
Второй - для подключения через Zond. В этом режиме плагин занимается только пинговкой и выполнением
|
|
||||||
служебных (от Zond) комманд. По-умолчению значение `1`.
|
|
||||||
|
|
||||||
`host` - Хост/IP для подключения к ASys. В режиме `2` игнорируется и всегда имеет значение `127.0.0.1`.
|
|
||||||
|
|
||||||
`port` - Порт для подключения к ASys/Zond.
|
|
||||||
|
|
||||||
`passcode` - Секретное слово. Необходимо как дополнительный слой защиты. В режме `2` игнорируется.
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
group = 'asys'
|
group = 'asys'
|
||||||
version = '0.6-SNAPSHOT'
|
version = '0.7-SNAPSHOT'
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
maven { url 'https://hub.spigotmc.org/nexus/content/groups/public/' }
|
maven { url 'https://hub.spigotmc.org/nexus/content/groups/public/' }
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
/*
|
|
||||||
* DmitriyMX <dimon550@gmail.com>
|
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -15,23 +15,11 @@ import org.bukkit.plugin.java.JavaPlugin;
|
|||||||
|
|
||||||
public class BridgePlugin extends JavaPlugin {
|
public class BridgePlugin extends JavaPlugin {
|
||||||
public static BridgePlugin INSTANCE;
|
public static BridgePlugin INSTANCE;
|
||||||
private String appConnect = "ASys";
|
|
||||||
private Client client;
|
private Client client;
|
||||||
private TaskTicker connectTicker, pingTicker;
|
private TaskTicker connectTicker, pingTicker;
|
||||||
private int tryConnect = 0;
|
private int tryConnect = 0;
|
||||||
private BridgeLoggerAppender loggerAppender;
|
|
||||||
private boolean needReconnect = true;
|
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
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
if (INSTANCE == null) {
|
if (INSTANCE == null) {
|
||||||
@@ -66,7 +54,7 @@ public class BridgePlugin extends JavaPlugin {
|
|||||||
client = new Client();
|
client = new Client();
|
||||||
connectTicker = new TaskTicker().setStepTimeMs(5000L);
|
connectTicker = new TaskTicker().setStepTimeMs(5000L);
|
||||||
connectTicker.setTask(() -> {
|
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) {
|
if (getConfig().getInt("mode") == 1) {
|
||||||
client.connect(getConfig().getString("host"), getConfig().getInt("port"));
|
client.connect(getConfig().getString("host"), getConfig().getInt("port"));
|
||||||
} else {
|
} else {
|
||||||
@@ -89,9 +77,6 @@ public class BridgePlugin extends JavaPlugin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void startPing(Channel channel) {
|
public void startPing(Channel channel) {
|
||||||
if (getConfig().getInt("mode") == 1) {
|
|
||||||
getLoggerAppender().setChannel(channel);
|
|
||||||
}
|
|
||||||
pingTicker = new TaskTicker().setStepTimeMs(5000L);
|
pingTicker = new TaskTicker().setStepTimeMs(5000L);
|
||||||
pingTicker.setTask(() -> {
|
pingTicker.setTask(() -> {
|
||||||
channel.write(new CS_Ping(
|
channel.write(new CS_Ping(
|
||||||
@@ -113,18 +98,11 @@ public class BridgePlugin extends JavaPlugin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void stopPing() {
|
public void stopPing() {
|
||||||
if (getConfig().getInt("mode") == 1) {
|
|
||||||
getLoggerAppender().setChannel(null);
|
|
||||||
}
|
|
||||||
if (pingTicker != null) {
|
if (pingTicker != null) {
|
||||||
pingTicker.stop();
|
pingTicker.stop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public BridgeLoggerAppender getLoggerAppender() {
|
|
||||||
return loggerAppender;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isNeedReconnect() {
|
public boolean isNeedReconnect() {
|
||||||
return needReconnect;
|
return needReconnect;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1 @@
|
|||||||
clientId: SpigotServer0
|
port: 8710
|
||||||
# 1 - прямое соединение с ASys. Сообщения из консоли перехватываются
|
|
||||||
# 2 - подключение через Zond. Сообщения из консоли не перехватываются
|
|
||||||
mode: 1
|
|
||||||
host: 127.0.0.1
|
|
||||||
port: 8779
|
|
||||||
passcode: testpassphrase
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
group = 'asys'
|
group = 'asys'
|
||||||
version = '0.4-SNAPSHOT'
|
version = '0.5.6-SNAPSHOT'
|
||||||
|
|
||||||
apply plugin: 'application'
|
apply plugin: 'application'
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
package asys.zond;
|
package asys.zond;
|
||||||
|
|
||||||
import asys.zond.proxy.Client;
|
import asys.zond.proxy.Connector;
|
||||||
import org.apache.commons.exec.CommandLine;
|
import org.apache.commons.exec.CommandLine;
|
||||||
import org.apache.commons.exec.DefaultExecutor;
|
import org.apache.commons.exec.DefaultExecutor;
|
||||||
import org.apache.commons.exec.ExecuteException;
|
import org.apache.commons.exec.ExecuteException;
|
||||||
@@ -16,20 +16,9 @@ import org.fusesource.jansi.AnsiConsole;
|
|||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.util.Arrays;
|
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 java.util.stream.Collectors;
|
||||||
|
|
||||||
import static org.fusesource.jansi.Ansi.ansi;
|
|
||||||
|
|
||||||
public class Main {
|
public class Main {
|
||||||
private static Client client;
|
|
||||||
private static ScheduledExecutorService ses;
|
|
||||||
private static ScheduledFuture<?> sesFuture;
|
|
||||||
private static int tryConnect = 0;
|
|
||||||
|
|
||||||
private static void printLogo() {
|
private static void printLogo() {
|
||||||
System.out.println(
|
System.out.println(
|
||||||
Ansi.ansi().reset()
|
Ansi.ansi().reset()
|
||||||
@@ -60,13 +49,13 @@ public class Main {
|
|||||||
}
|
}
|
||||||
|
|
||||||
loadConfig();
|
loadConfig();
|
||||||
startReconnect();
|
Connector.getInstance().startReconnect();
|
||||||
|
|
||||||
int resultCode = executeProcess(args);
|
int resultCode = executeProcess(args);
|
||||||
|
|
||||||
stopReconnect();
|
Connector.getInstance().setNeedReconnect(false);
|
||||||
ses.shutdown();
|
Connector.getInstance().stopReconnect();
|
||||||
client.disconnect();
|
Connector.getInstance().disconnect();
|
||||||
|
|
||||||
System.out.println(
|
System.out.println(
|
||||||
Ansi.ansi().reset().newline()
|
Ansi.ansi().reset().newline()
|
||||||
@@ -80,7 +69,7 @@ public class Main {
|
|||||||
CommandLine commandLine = CommandLine.parse(cmdLine);
|
CommandLine commandLine = CommandLine.parse(cmdLine);
|
||||||
DefaultExecutor executor = new DefaultExecutor();
|
DefaultExecutor executor = new DefaultExecutor();
|
||||||
|
|
||||||
PrintStream proxySysOut = new ProxySysOut(System.err);
|
PrintStream proxySysOut = new ProxySysOut(System.out);
|
||||||
InputStream proxySysIn = new ProxySysIn();
|
InputStream proxySysIn = new ProxySysIn();
|
||||||
|
|
||||||
PumpStreamHandler psh = new PumpStreamHandler(proxySysOut, proxySysOut, proxySysIn);
|
PumpStreamHandler psh = new PumpStreamHandler(proxySysOut, proxySysOut, proxySysIn);
|
||||||
@@ -118,55 +107,15 @@ public class Main {
|
|||||||
fis.close();
|
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 {
|
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) {
|
ProxySysOut(OutputStream out) {
|
||||||
super(out);
|
super(out);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void write(byte[] buf, int off, int len) {
|
public void write(byte[] buf, int off, int len) {
|
||||||
super.write(prefix, 0, prefix.length);
|
|
||||||
super.write(buf, off, len);
|
super.write(buf, off, len);
|
||||||
super.write(suffix, 0, suffix.length);
|
Connector.getInstance().sendMessage(new String(buf, off, len));
|
||||||
}
|
|
||||||
|
|
||||||
@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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,9 @@ public class Client {
|
|||||||
group = new NioEventLoopGroup();
|
group = new NioEventLoopGroup();
|
||||||
bootstrap = createBootstrap();
|
bootstrap = createBootstrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
channelFuture = bootstrap.connect(host, port);
|
||||||
|
channelFuture.awaitUninterruptibly(5000);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isConnected() {
|
public boolean isConnected() {
|
||||||
|
|||||||
@@ -56,9 +56,11 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
|
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
|
||||||
log("Lost connection!");
|
Connector.getInstance().setChannel(null);
|
||||||
log("Try reconnect...");
|
if (Connector.getInstance().isNeedReconnect()) {
|
||||||
Main.startReconnect();
|
log("Lost connection! Try reconnect...");
|
||||||
|
Connector.getInstance().startReconnect();
|
||||||
|
}
|
||||||
|
|
||||||
ctx.channel().attr(KNOWN_PACKETS).remove();
|
ctx.channel().attr(KNOWN_PACKETS).remove();
|
||||||
ctx.channel().attr(KNOWN_HANDLERS).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()));
|
log(String.format("Handshake: #%d %s", pkt.getErrorCode(), pkt.getMessage()));
|
||||||
} else {
|
} else {
|
||||||
context.channel().attr(KNOWN_PACKETS).set(knownPackets);
|
context.channel().attr(KNOWN_PACKETS).set(knownPackets);
|
||||||
|
Connector.getInstance().setChannel(context.channel());
|
||||||
log("Handshake: OK");
|
log("Handshake: OK");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
74
zond/src/main/java/asys/zond/proxy/Connector.java
Normal file
74
zond/src/main/java/asys/zond/proxy/Connector.java
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* DmitriyMX <dimon550@gmail.com>
|
||||||
|
* 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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
48
zond/src/main/java/asys/zond/proxy/TaskTicker.java
Normal file
48
zond/src/main/java/asys/zond/proxy/TaskTicker.java
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* DmitriyMX <d.mihailov@samson-rus.com>
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user