proxy progress - getting REALLY close?!
This commit is contained in:
parent
50aad7496f
commit
09d14a4861
|
@ -4,6 +4,7 @@ import com.opensr5.Logger;
|
|||
import com.rusefi.io.IoStream;
|
||||
import com.rusefi.io.commands.HelloCommand;
|
||||
import com.rusefi.io.tcp.BinaryProtocolProxy;
|
||||
import com.rusefi.io.tcp.ServerHolder;
|
||||
import com.rusefi.io.tcp.TcpIoStream;
|
||||
import com.rusefi.server.ApplicationRequest;
|
||||
import com.rusefi.server.rusEFISSLContext;
|
||||
|
@ -29,7 +30,7 @@ public class LocalApplicationProxy {
|
|||
* @param authenticatorPort local port we would bind for TunerStudio to connect to
|
||||
* @param httpPort
|
||||
*/
|
||||
static void startAndRun(Logger logger, int serverPortForRemoteUsers, ApplicationRequest applicationRequest, int authenticatorPort, int httpPort) throws IOException {
|
||||
public static ServerHolder startAndRun(Logger logger, int serverPortForRemoteUsers, ApplicationRequest applicationRequest, int authenticatorPort, int httpPort) throws IOException {
|
||||
HttpResponse httpResponse = HttpUtil.executeGet(ProxyClient.getHttpAddress(httpPort) + ProxyClient.VERSION_PATH);
|
||||
String version = HttpUtil.getResponse(httpResponse);
|
||||
logger.info("Version=" + version);
|
||||
|
@ -40,7 +41,7 @@ public class LocalApplicationProxy {
|
|||
LocalApplicationProxy localApplicationProxy = new LocalApplicationProxy(logger, applicationRequest);
|
||||
localApplicationProxy.run(authenticatorToProxyStream);
|
||||
|
||||
BinaryProtocolProxy.createProxy(logger, authenticatorToProxyStream, authenticatorPort);
|
||||
return BinaryProtocolProxy.createProxy(logger, authenticatorToProxyStream, authenticatorPort);
|
||||
}
|
||||
|
||||
public void run(IoStream authenticatorToProxyStream) throws IOException {
|
||||
|
|
|
@ -15,30 +15,23 @@ import static com.rusefi.binaryprotocol.BinaryProtocolCommands.COMMAND_PROTOCOL;
|
|||
import static com.rusefi.config.generated.Fields.TS_PROTOCOL;
|
||||
|
||||
public class BinaryProtocolProxy {
|
||||
public static void createProxy(Logger logger, IoStream targetEcuSocket, int serverProxyPort) {
|
||||
Function<Socket, Runnable> clientSocketRunnableFactory = new Function<Socket, Runnable>() {
|
||||
@Override
|
||||
public Runnable apply(Socket clientSocket) {
|
||||
return new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
TcpIoStream clientStream = new TcpIoStream("[[proxy]] ", logger, clientSocket);
|
||||
runProxy(targetEcuSocket, clientStream);
|
||||
} catch (IOException e) {
|
||||
logger.error("BinaryProtocolProxy::run" + e);
|
||||
}
|
||||
}
|
||||
};
|
||||
public static ServerHolder createProxy(Logger logger, IoStream targetEcuSocket, int serverProxyPort) {
|
||||
Function<Socket, Runnable> clientSocketRunnableFactory = clientSocket -> () -> {
|
||||
try {
|
||||
TcpIoStream clientStream = new TcpIoStream("[[proxy]] ", logger, clientSocket);
|
||||
runProxy(targetEcuSocket, clientStream);
|
||||
} catch (IOException e) {
|
||||
logger.error("BinaryProtocolProxy::run" + e);
|
||||
}
|
||||
};
|
||||
BinaryProtocolServer.tcpServerSocket(serverProxyPort, "proxy", clientSocketRunnableFactory, Logger.CONSOLE, null);
|
||||
return BinaryProtocolServer.tcpServerSocket(serverProxyPort, "proxy", clientSocketRunnableFactory, Logger.CONSOLE, null);
|
||||
}
|
||||
|
||||
public static void runProxy(IoStream targetEcu, IoStream clientStream) throws IOException {
|
||||
/*
|
||||
* Each client socket is running on it's own thread
|
||||
*/
|
||||
//noinspection InfiniteLoopStatement
|
||||
while (true) {
|
||||
byte firstByte = clientStream.getDataBuffer().readByte();
|
||||
if (firstByte == COMMAND_PROTOCOL) {
|
||||
|
|
|
@ -10,6 +10,7 @@ import com.rusefi.io.IoStream;
|
|||
import com.rusefi.io.LinkManager;
|
||||
import com.rusefi.io.commands.HelloCommand;
|
||||
import com.rusefi.server.rusEFISSLContext;
|
||||
import com.rusefi.shared.FileUtil;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.ServerSocket;
|
||||
|
@ -75,24 +76,33 @@ public class BinaryProtocolServer implements BinaryProtocolCommands {
|
|||
|
||||
/**
|
||||
* Starts a new thread
|
||||
*
|
||||
* @param port server port to accept connections
|
||||
* @param port server port to accept connections
|
||||
* @param threadName
|
||||
* @param socketRunnableFactory method to invoke on a new thread for each new client connection
|
||||
* @param logger
|
||||
* @param serverSocketCreationCallback this callback is invoked once we open the server socket
|
||||
* @return
|
||||
*/
|
||||
public static void tcpServerSocket(int port, String threadName, Function<Socket, Runnable> socketRunnableFactory, final Logger logger, Listener serverSocketCreationCallback) {
|
||||
tcpServerSocket(logger, socketRunnableFactory, port, threadName, serverSocketCreationCallback, PLAIN_SOCKET_FACTORY);
|
||||
public static ServerHolder tcpServerSocket(int port, String threadName, Function<Socket, Runnable> socketRunnableFactory, final Logger logger, Listener serverSocketCreationCallback) {
|
||||
return tcpServerSocket(logger, socketRunnableFactory, port, threadName, serverSocketCreationCallback, PLAIN_SOCKET_FACTORY);
|
||||
}
|
||||
|
||||
public static void tcpServerSocket(Logger logger, Function<Socket, Runnable> clientSocketRunnableFactory, int port, String threadName, Listener serverSocketCreationCallback, Function<Integer, ServerSocket> nonSecureSocketFunction) {
|
||||
public static ServerHolder tcpServerSocket(Logger logger, Function<Socket, Runnable> clientSocketRunnableFactory, int port, String threadName, Listener serverSocketCreationCallback, Function<Integer, ServerSocket> nonSecureSocketFunction) {
|
||||
ServerSocket serverSocket = nonSecureSocketFunction.apply(port);
|
||||
|
||||
ServerHolder holder = new ServerHolder() {
|
||||
@Override
|
||||
public void close() {
|
||||
super.close();
|
||||
FileUtil.close(serverSocket);
|
||||
}
|
||||
};
|
||||
|
||||
if (serverSocketCreationCallback != null)
|
||||
serverSocketCreationCallback.onResult(null);
|
||||
Runnable runnable = () -> {
|
||||
try {
|
||||
while (true) {
|
||||
while (!holder.isClosed()) {
|
||||
// Wait for a connection
|
||||
final Socket clientSocket = serverSocket.accept();
|
||||
logger.info("Binary protocol proxy port connection");
|
||||
|
@ -103,6 +113,7 @@ public class BinaryProtocolServer implements BinaryProtocolCommands {
|
|||
}
|
||||
};
|
||||
new Thread(runnable, threadName).start();
|
||||
return holder;
|
||||
}
|
||||
|
||||
@SuppressWarnings("InfiniteLoopStatement")
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
package com.rusefi.io.tcp;
|
||||
|
||||
import java.io.Closeable;
|
||||
|
||||
public class ServerHolder implements Closeable {
|
||||
private boolean isClosed;
|
||||
|
||||
public void close() {
|
||||
isClosed = true;
|
||||
}
|
||||
|
||||
public boolean isClosed() {
|
||||
return isClosed;
|
||||
}
|
||||
}
|
|
@ -2,8 +2,6 @@ package com.rusefi.server;
|
|||
|
||||
import com.rusefi.tools.online.HttpUtil;
|
||||
import org.json.simple.JSONObject;
|
||||
import org.json.simple.parser.JSONParser;
|
||||
import org.json.simple.parser.ParseException;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
|
|
|
@ -3,8 +3,6 @@ package com.rusefi.server;
|
|||
import com.rusefi.tools.online.HttpUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.json.simple.JSONObject;
|
||||
import org.json.simple.parser.JSONParser;
|
||||
import org.json.simple.parser.ParseException;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
|
|
|
@ -15,7 +15,7 @@ import java.io.IOException;
|
|||
public class HttpUtil {
|
||||
// todo: migrate proxy http json API server to TLS
|
||||
public static final String RUSEFI_PROXY_JSON_PROTOCOL = "http://";
|
||||
public static final int HTTP_PORT = 8001;
|
||||
public static final int PROXY_JSON_API_HTTP_PORT = 8001;
|
||||
/**
|
||||
* hostname of PROXY server, not primary rusEFI web server - those are two separate hosts at the moment
|
||||
*/
|
||||
|
|
|
@ -62,7 +62,7 @@ public class ConsoleTools {
|
|||
registerTool("compile_fsio_line", ConsoleTools::invokeCompileExpressionTool, "Convert a line to RPN form.");
|
||||
registerTool("compile_fsio_file", ConsoleTools::runCompileTool, "Convert all lines from a file to RPN form.");
|
||||
|
||||
registerTool("proxy_server", BackendLauncher::start, "NOT A USER TOOL");
|
||||
registerTool("proxy_server", a -> BackendLauncher.start(), "NOT A USER TOOL");
|
||||
registerTool("network_connector", NetworkConnectorStartup::start, "Connect your rusEFI ECU to rusEFI Online");
|
||||
registerTool("network_authenticator", LocalApplicationProxy::start, "rusEFI Online Authenticator");
|
||||
|
||||
|
|
|
@ -33,6 +33,7 @@ import static com.rusefi.Timeouts.SECOND;
|
|||
|
||||
/**
|
||||
* See NetworkConnectorStartup
|
||||
* @see BackendLauncher
|
||||
*/
|
||||
public class Backend implements Closeable {
|
||||
public static final int SERVER_PORT_FOR_CONTROLLERS = 8003;
|
||||
|
|
|
@ -4,24 +4,21 @@ import com.opensr5.Logger;
|
|||
import com.rusefi.LocalApplicationProxy;
|
||||
import com.rusefi.tools.online.HttpUtil;
|
||||
|
||||
import java.net.MalformedURLException;
|
||||
|
||||
public class BackendLauncher {
|
||||
/**
|
||||
* need this method to be not in Backend class for console to work without all backend classes
|
||||
*/
|
||||
public static void start(String[] args) throws MalformedURLException {
|
||||
public static void start() {
|
||||
/* todo
|
||||
rusEFISSLContext.setupCertificates(new File("keystore.jks"), System.getProperty("RUSEFI_PROXY_PASSWORD"));
|
||||
*/
|
||||
|
||||
UserDetailsResolver userDetailsFunction = new JsonUserDetailsResolver();
|
||||
|
||||
Backend backend = new Backend(userDetailsFunction, HttpUtil.HTTP_PORT, Logger.CONSOLE);
|
||||
Backend backend = new Backend(userDetailsFunction, HttpUtil.PROXY_JSON_API_HTTP_PORT, Logger.CONSOLE);
|
||||
backend.runApplicationConnector(LocalApplicationProxy.SERVER_PORT_FOR_APPLICATIONS, parameter -> {
|
||||
});
|
||||
backend.runControllerConnector(Backend.SERVER_PORT_FOR_CONTROLLERS, parameter -> {
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,18 +1,24 @@
|
|||
package com.rusefi.ts_plugin;
|
||||
|
||||
import com.opensr5.Logger;
|
||||
import com.rusefi.LocalApplicationProxy;
|
||||
import com.rusefi.NamedThreadFactory;
|
||||
import com.rusefi.SignatureHelper;
|
||||
import com.rusefi.autoupdate.AutoupdateUtil;
|
||||
import com.rusefi.server.ApplicationRequest;
|
||||
import com.rusefi.server.ControllerInfo;
|
||||
import com.rusefi.server.SessionDetails;
|
||||
import com.rusefi.tools.online.HttpUtil;
|
||||
import com.rusefi.tools.online.ProxyClient;
|
||||
import com.rusefi.tools.online.PublicSession;
|
||||
import com.rusefi.ui.AuthTokenPanel;
|
||||
import com.rusefi.ui.util.URLLabel;
|
||||
import org.putgemin.VerticalFlowLayout;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Executor;
|
||||
|
@ -37,7 +43,7 @@ public class RemoteTab {
|
|||
refresh.addActionListener(e -> requestListDownload());
|
||||
|
||||
JTextField applicationPort = new JTextField();
|
||||
String portProperty = getConfig().getRoot().getProperty(APPLICATION_PORT, Integer.toString(LocalApplicationProxy.SERVER_PORT_FOR_APPLICATIONS));
|
||||
String portProperty = getLocalPort();
|
||||
applicationPort.setText(portProperty);
|
||||
|
||||
|
||||
|
@ -52,25 +58,19 @@ public class RemoteTab {
|
|||
requestListDownload();
|
||||
}
|
||||
|
||||
private void requestListDownload() {
|
||||
listDownloadExecutor.execute(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
List<PublicSession> userDetails;
|
||||
try {
|
||||
userDetails = ProxyClient.getOnlineApplications(HttpUtil.HTTP_PORT);
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
showList(userDetails);
|
||||
}
|
||||
});
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return;
|
||||
}
|
||||
System.out.println(userDetails);
|
||||
private String getLocalPort() {
|
||||
return getConfig().getRoot().getProperty(APPLICATION_PORT, Integer.toString(LocalApplicationProxy.SERVER_PORT_FOR_APPLICATIONS));
|
||||
}
|
||||
|
||||
private void requestListDownload() {
|
||||
listDownloadExecutor.execute(() -> {
|
||||
List<PublicSession> userDetails;
|
||||
try {
|
||||
userDetails = ProxyClient.getOnlineApplications(HttpUtil.RUSEFI_PROXY_JSON_PROTOCOL);
|
||||
SwingUtilities.invokeLater(() -> showList(userDetails));
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -92,7 +92,27 @@ public class RemoteTab {
|
|||
userPanel.add(new URLLabel(SignatureHelper.getUrl(controllerInfo.getSignature())));
|
||||
|
||||
|
||||
userPanel.add(new JButton("Connect"));
|
||||
JButton connect = new JButton("Connect");
|
||||
connect.addActionListener(event -> {
|
||||
|
||||
SessionDetails sessionDetails = new SessionDetails(controllerInfo, AuthTokenPanel.getAuthToken(),
|
||||
Integer.parseInt(oneTimePasswordControl.getText()));
|
||||
|
||||
ApplicationRequest applicationRequest = new ApplicationRequest(sessionDetails, publicSession.getUserDetails().getUserId());
|
||||
|
||||
try {
|
||||
LocalApplicationProxy.startAndRun(Logger.CONSOLE,
|
||||
LocalApplicationProxy.SERVER_PORT_FOR_APPLICATIONS,
|
||||
applicationRequest,
|
||||
HttpUtil.PROXY_JSON_API_HTTP_PORT,
|
||||
Integer.parseInt(getLocalPort()));
|
||||
} catch (IOException e) {
|
||||
// todo: proper handling
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
});
|
||||
userPanel.add(connect);
|
||||
|
||||
return userPanel;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue