From fa328e8874bdf709426b84e7d25cd86ab8631c6d Mon Sep 17 00:00:00 2001 From: rusefi Date: Fri, 24 Jul 2020 00:59:32 -0400 Subject: [PATCH] proxy progress - I am getting tired :( --- .../java/com/rusefi/LocalApplicationProxy.java | 6 +++--- .../main/java/com/rusefi/tools/ConsoleTools.java | 2 +- .../com/rusefi/tools/NetworkConnectorStartup.java | 11 +++++++++-- .../src/test/java/com/rusefi/FullServerTest.java | 3 ++- .../test/java/com/rusefi/MockRusEfiDevice.java | 2 +- .../com/rusefi/proxy/BaseBroadcastingThread.java | 4 ++-- .../java/com/rusefi/proxy/NetworkConnector.java | 8 ++++---- .../main/java/com/rusefi/ts_plugin/RemoteTab.java | 15 +++++++++------ 8 files changed, 31 insertions(+), 20 deletions(-) diff --git a/java_console/io/src/main/java/com/rusefi/LocalApplicationProxy.java b/java_console/io/src/main/java/com/rusefi/LocalApplicationProxy.java index ee5e2f16a3..b74eda005f 100644 --- a/java_console/io/src/main/java/com/rusefi/LocalApplicationProxy.java +++ b/java_console/io/src/main/java/com/rusefi/LocalApplicationProxy.java @@ -10,7 +10,6 @@ import com.rusefi.server.ApplicationRequest; import com.rusefi.server.rusEFISSLContext; import com.rusefi.tools.online.HttpUtil; import com.rusefi.tools.online.ProxyClient; -import org.apache.http.HttpResponse; import java.io.IOException; @@ -29,14 +28,15 @@ public class LocalApplicationProxy { * @param applicationRequest remote session we want to connect to * @param localApplicationPort local port we would bind for TunerStudio to connect to * @param jsonHttpPort + * @param disconnectListener */ - public static ServerHolder startAndRun(Logger logger, int serverPortForRemoteUsers, ApplicationRequest applicationRequest, int localApplicationPort, int jsonHttpPort) throws IOException { + public static ServerHolder startAndRun(Logger logger, int serverPortForRemoteUsers, ApplicationRequest applicationRequest, int localApplicationPort, int jsonHttpPort, TcpIoStream.DisconnectListener disconnectListener) throws IOException { String version = HttpUtil.executeGet(logger,ProxyClient.getHttpAddress(jsonHttpPort) + ProxyClient.VERSION_PATH); logger.info("Server says version=" + version); if (!version.contains(ProxyClient.BACKEND_VERSION)) throw new IOException("Unexpected backend version " + version + " while we want " + ProxyClient.BACKEND_VERSION); - IoStream authenticatorToProxyStream = new TcpIoStream("authenticatorToProxyStream ", logger, rusEFISSLContext.getSSLSocket(HttpUtil.RUSEFI_PROXY_HOSTNAME, serverPortForRemoteUsers)); + IoStream authenticatorToProxyStream = new TcpIoStream("authenticatorToProxyStream ", logger, rusEFISSLContext.getSSLSocket(HttpUtil.RUSEFI_PROXY_HOSTNAME, serverPortForRemoteUsers), disconnectListener); LocalApplicationProxy localApplicationProxy = new LocalApplicationProxy(logger, applicationRequest); logger.info("Pushing " + applicationRequest); localApplicationProxy.run(authenticatorToProxyStream); diff --git a/java_console/ui/src/main/java/com/rusefi/tools/ConsoleTools.java b/java_console/ui/src/main/java/com/rusefi/tools/ConsoleTools.java index f9d2079e20..36a0d39b92 100644 --- a/java_console/ui/src/main/java/com/rusefi/tools/ConsoleTools.java +++ b/java_console/ui/src/main/java/com/rusefi/tools/ConsoleTools.java @@ -63,7 +63,7 @@ public class ConsoleTools { registerTool("compile_fsio_file", ConsoleTools::runCompileTool, "Convert all lines from a file to RPN form."); registerTool("proxy_server", a -> BackendLauncher.start(), "NOT A USER TOOL"); - registerTool("network_connector", NetworkConnectorStartup::start, "Connect your rusEFI ECU to rusEFI Online"); + registerTool("network_connector", strings -> NetworkConnectorStartup.start(), "Connect your rusEFI ECU to rusEFI Online"); registerTool("network_authenticator", LocalApplicationProxy::start, "rusEFI Online Authenticator"); registerTool("print_auth_token", args -> printAuthToken(), "Print current rusEFI Online authentication token."); diff --git a/java_console/ui/src/main/java/com/rusefi/tools/NetworkConnectorStartup.java b/java_console/ui/src/main/java/com/rusefi/tools/NetworkConnectorStartup.java index d51559bb9e..8a0bc3c3e5 100644 --- a/java_console/ui/src/main/java/com/rusefi/tools/NetworkConnectorStartup.java +++ b/java_console/ui/src/main/java/com/rusefi/tools/NetworkConnectorStartup.java @@ -2,6 +2,7 @@ package com.rusefi.tools; import com.rusefi.auth.AutoTokenUtil; import com.rusefi.autodetect.PortDetector; +import com.rusefi.io.tcp.TcpIoStream; import com.rusefi.proxy.NetworkConnector; import com.rusefi.server.Backend; import com.rusefi.server.SessionDetails; @@ -10,7 +11,7 @@ import com.rusefi.ui.AuthTokenPanel; import java.io.IOException; public class NetworkConnectorStartup { - public static void start(String[] strings) throws IOException, InterruptedException { + public static void start() throws IOException, InterruptedException { String authToken = AuthTokenPanel.getAuthToken(); if (!AutoTokenUtil.isToken(authToken)) { System.err.println("Please configure authentication token using 'set_auth_token' command"); @@ -23,7 +24,13 @@ public class NetworkConnectorStartup { return; } - SessionDetails sessionDetails = NetworkConnector.runNetworkConnector(authToken, autoDetectedPort, Backend.SERVER_PORT_FOR_CONTROLLERS); + SessionDetails sessionDetails = NetworkConnector.runNetworkConnector(authToken, autoDetectedPort, Backend.SERVER_PORT_FOR_CONTROLLERS, new TcpIoStream.DisconnectListener() { + @Override + public void onDisconnect() { + System.err.println("Disconnect detected"); + System.exit(-1); + } + }); System.out.println("Running with " + sessionDetails.getOneTimeToken()); } } diff --git a/java_console/ui/src/test/java/com/rusefi/FullServerTest.java b/java_console/ui/src/test/java/com/rusefi/FullServerTest.java index 7432f54066..385ddd2242 100644 --- a/java_console/ui/src/test/java/com/rusefi/FullServerTest.java +++ b/java_console/ui/src/test/java/com/rusefi/FullServerTest.java @@ -7,6 +7,7 @@ import com.rusefi.binaryprotocol.BinaryProtocol; import com.rusefi.config.generated.Fields; import com.rusefi.io.ConnectionStateListener; import com.rusefi.io.LinkManager; +import com.rusefi.io.tcp.TcpIoStream; import com.rusefi.proxy.NetworkConnector; import com.rusefi.server.*; import org.junit.Before; @@ -74,7 +75,7 @@ public class FullServerTest { // start "rusEFI network connector" to connect controller with backend since in real life controller has only local serial port it does not have network - SessionDetails deviceSessionDetails = NetworkConnector.runNetworkConnector(MockRusEfiDevice.TEST_TOKEN_1, TestHelper.LOCALHOST + ":" + controllerPort, serverPortForControllers); + SessionDetails deviceSessionDetails = NetworkConnector.runNetworkConnector(MockRusEfiDevice.TEST_TOKEN_1, TestHelper.LOCALHOST + ":" + controllerPort, serverPortForControllers, TcpIoStream.DisconnectListener.VOID); assertTrue("controllerRegistered", controllerRegistered.await(READ_IMAGE_TIMEOUT, TimeUnit.MILLISECONDS)); diff --git a/java_console/ui/src/test/java/com/rusefi/MockRusEfiDevice.java b/java_console/ui/src/test/java/com/rusefi/MockRusEfiDevice.java index c640cd9d2a..3219ec5b06 100644 --- a/java_console/ui/src/test/java/com/rusefi/MockRusEfiDevice.java +++ b/java_console/ui/src/test/java/com/rusefi/MockRusEfiDevice.java @@ -35,7 +35,7 @@ public class MockRusEfiDevice { Socket socket = rusEFISSLContext.getSSLSocket(LOCALHOST, serverPort); BaseBroadcastingThread baseBroadcastingThread = new BaseBroadcastingThread(socket, sessionDetails, - logger) { + logger, TcpIoStream.DisconnectListener.VOID) { @Override protected void handleCommand(BinaryProtocolServer.Packet packet, TcpIoStream stream) throws IOException { super.handleCommand(packet, stream); diff --git a/java_tools/proxy_server/src/main/java/com/rusefi/proxy/BaseBroadcastingThread.java b/java_tools/proxy_server/src/main/java/com/rusefi/proxy/BaseBroadcastingThread.java index 3776b7b393..27fb3ae75c 100644 --- a/java_tools/proxy_server/src/main/java/com/rusefi/proxy/BaseBroadcastingThread.java +++ b/java_tools/proxy_server/src/main/java/com/rusefi/proxy/BaseBroadcastingThread.java @@ -21,8 +21,8 @@ public class BaseBroadcastingThread { private final Thread thread; @SuppressWarnings("InfiniteLoopStatement") - public BaseBroadcastingThread(Socket socket, SessionDetails sessionDetails, Logger logger) throws IOException { - TcpIoStream stream = new TcpIoStream("[broadcast] ", logger, socket); + public BaseBroadcastingThread(Socket socket, SessionDetails sessionDetails, Logger logger, TcpIoStream.DisconnectListener disconnectListener) throws IOException { + TcpIoStream stream = new TcpIoStream("[broadcast] ", logger, socket, disconnectListener); IncomingDataBuffer in = stream.getDataBuffer(); thread = BASE_BROADCASTING_THREAD.newThread(() -> { diff --git a/java_tools/proxy_server/src/main/java/com/rusefi/proxy/NetworkConnector.java b/java_tools/proxy_server/src/main/java/com/rusefi/proxy/NetworkConnector.java index 9f1cfb639e..9e7b591eca 100644 --- a/java_tools/proxy_server/src/main/java/com/rusefi/proxy/NetworkConnector.java +++ b/java_tools/proxy_server/src/main/java/com/rusefi/proxy/NetworkConnector.java @@ -24,7 +24,7 @@ import java.util.concurrent.TimeUnit; * Connector between rusEFI ECU and rusEFI server */ public class NetworkConnector { - public static SessionDetails runNetworkConnector(String authToken, String controllerPort, int serverPortForControllers) throws InterruptedException, IOException { + public static SessionDetails runNetworkConnector(String authToken, String controllerPort, int serverPortForControllers, TcpIoStream.DisconnectListener disconnectListener) throws InterruptedException, IOException { LinkManager linkManager = new LinkManager(Logger.CONSOLE) .setCompositeLogicEnabled(false) .setNeedPullData(false); @@ -49,11 +49,11 @@ public class NetworkConnector { return null; } - return runNetworkConnector(serverPortForControllers, linkManager, Logger.CONSOLE, authToken); + return runNetworkConnector(serverPortForControllers, linkManager, Logger.CONSOLE, authToken, disconnectListener); } @NotNull - private static SessionDetails runNetworkConnector(int serverPortForControllers, LinkManager linkManager, final Logger logger, String authToken) throws IOException { + private static SessionDetails runNetworkConnector(int serverPortForControllers, LinkManager linkManager, final Logger logger, String authToken, final TcpIoStream.DisconnectListener disconnectListener) throws IOException { IoStream targetEcuSocket = linkManager.getConnector().getBinaryProtocol().getStream(); HelloCommand.send(targetEcuSocket, logger); String helloResponse = HelloCommand.getHelloResponse(targetEcuSocket.getDataBuffer(), logger); @@ -71,7 +71,7 @@ public class NetworkConnector { BaseBroadcastingThread baseBroadcastingThread = new BaseBroadcastingThread(rusEFISSLContext.getSSLSocket(HttpUtil.RUSEFI_PROXY_HOSTNAME, serverPortForControllers), deviceSessionDetails, - logger) { + logger, disconnectListener) { @Override protected void handleCommand(BinaryProtocolServer.Packet packet, TcpIoStream stream) throws IOException { super.handleCommand(packet, stream); diff --git a/java_tools/ts_plugin/src/main/java/com/rusefi/ts_plugin/RemoteTab.java b/java_tools/ts_plugin/src/main/java/com/rusefi/ts_plugin/RemoteTab.java index 386174d0df..d79277c053 100644 --- a/java_tools/ts_plugin/src/main/java/com/rusefi/ts_plugin/RemoteTab.java +++ b/java_tools/ts_plugin/src/main/java/com/rusefi/ts_plugin/RemoteTab.java @@ -112,9 +112,7 @@ public class RemoteTab { JButton connect = new JButton("Connect"); connect.addActionListener(event -> { - list.removeAll(); - list.add(new JLabel("Connecting to " + publicSession.getUserDetails().getUserName())); - AutoupdateUtil.trueLayout(list); + setStatus("Connecting to " + publicSession.getUserDetails().getUserName()); new Thread(new Runnable() { @Override @@ -131,6 +129,12 @@ public class RemoteTab { return userPanel; } + private void setStatus(String text) { + list.removeAll(); + list.add(new JLabel(text)); + AutoupdateUtil.trueLayout(list); + } + private void runAuthenticator(PublicSession publicSession, ControllerInfo controllerInfo) { SessionDetails sessionDetails = new SessionDetails(controllerInfo, AuthTokenPanel.getAuthToken(), Integer.parseInt(oneTimePasswordControl.getText())); @@ -142,10 +146,9 @@ public class RemoteTab { LocalApplicationProxy.SERVER_PORT_FOR_APPLICATIONS, applicationRequest, Integer.parseInt(getLocalPort()), - HttpUtil.PROXY_JSON_API_HTTP_PORT); + HttpUtil.PROXY_JSON_API_HTTP_PORT, () -> SwingUtilities.invokeLater(() -> setStatus("Disconnected"))); } catch (IOException e) { - // todo: proper handling - e.printStackTrace(); + setStatus("IO error: " + e); } }