Skip to content

Commit e02e92f

Browse files
authored
Merge pull request #215 from jumpserver/pr@new_terminal@feat_chen_new-console
feat:new console
2 parents 1e0df20 + 9ee0154 commit e02e92f

10 files changed

Lines changed: 242 additions & 100 deletions

File tree

backend/framework/src/main/java/org/jumpserver/chen/framework/console/QueryConsole.java

Lines changed: 155 additions & 86 deletions
Large diffs are not rendered by default.

backend/framework/src/main/java/org/jumpserver/chen/framework/console/context/ConsoleContextResolver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public ConsoleContext resolve(String submittedNodeKey, String consoleType) {
3737

3838
private static boolean isAllowedNodeType(String consoleType, String nodeType) {
3939
return switch (consoleType) {
40-
case Connect.CONSOLE_TYPE_QUERY -> QUERY_NODE_TYPES.contains(nodeType);
40+
case Connect.CONSOLE_TYPE_QUERY, Connect.CONSOLE_TYPE_CONSOLE -> QUERY_NODE_TYPES.contains(nodeType);
4141
case Connect.CONSOLE_TYPE_DATA_VIEW -> DATA_VIEW_NODE_TYPES.contains(nodeType);
4242
default -> false;
4343
};

backend/framework/src/main/java/org/jumpserver/chen/framework/console/dataview/DataView.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
@EqualsAndHashCode(callSuper = true)
2727
@Data
2828
public class DataView extends SQLResult {
29+
private final String id;
2930
private final String title;
3031
private final StateManager<DataViewState> stateManager;
3132
private LoadDataInterface loadDataInterface;
@@ -38,8 +39,13 @@ public class DataView extends SQLResult {
3839
private Logger consoleLogger;
3940

4041
public DataView(String title, PacketIO packetIO, Logger logger) {
42+
this(title, title, packetIO, logger);
43+
}
44+
45+
public DataView(String id, String title, PacketIO packetIO, Logger logger) {
46+
this.id = id;
4147
this.title = title;
42-
this.state = new DataViewState(title);
48+
this.state = new DataViewState(this.id, title);
4349
this.stateManager = new StateManager<>(this.state, packetIO);
4450
this.consoleLogger = logger;
4551
}

backend/framework/src/main/java/org/jumpserver/chen/framework/console/dataview/UpdateDataView.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,16 @@
44

55
@Data
66
public class UpdateDataView {
7+
private String id;
78
private String title;
89
private DataViewData data;
910

1011
public UpdateDataView(String title, DataViewData data) {
12+
this(title, title, data);
13+
}
14+
15+
public UpdateDataView(String id, String title, DataViewData data) {
16+
this.id = id;
1117
this.title = title;
1218
this.data = data;
1319
}

backend/framework/src/main/java/org/jumpserver/chen/framework/console/entity/request/Connect.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
public class Connect {
77

88
public static final String CONSOLE_TYPE_QUERY = "query";
9+
public static final String CONSOLE_TYPE_CONSOLE = "console";
910
public static final String CONSOLE_TYPE_DATA_VIEW = "data_view";
1011

1112
private String nodeKey;

backend/framework/src/main/java/org/jumpserver/chen/framework/console/state/DataViewState.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,16 @@
88
@EqualsAndHashCode(callSuper = true)
99
@Data
1010
public class DataViewState extends State {
11+
private String id;
1112
private int page;
1213
private int limit;
1314
private int total;
1415
private boolean pinned;
1516
private boolean paged;
1617

17-
public DataViewState(String title) {
18+
public DataViewState(String id, String title) {
1819
super(title);
20+
this.id = id;
1921
this.paged = true;
2022
this.pinned = false;
2123
this.total = 0;

backend/framework/src/main/java/org/jumpserver/chen/framework/session/SessionManager.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.jumpserver.chen.framework.session;
22

33
import lombok.extern.slf4j.Slf4j;
4+
import org.jumpserver.chen.framework.console.Console;
45

56
import java.util.Map;
67
import java.util.UUID;
@@ -31,6 +32,13 @@ public static void unregisterSession(String token) {
3132
log.info("session {} unregistered, current session count {}", token, instance.getCurrentSessionCount());
3233
}
3334

35+
public static boolean registerConsole(String token, String consoleId, Console console) {
36+
return instance.store.computeIfPresent(token, (ignored, session) -> {
37+
session.getConsoles().put(consoleId, console);
38+
return session;
39+
}) != null;
40+
}
41+
3442
public int getCurrentSessionCount() {
3543
return instance.store.size();
3644
}

backend/framework/src/main/java/org/jumpserver/chen/framework/session/impl/BaseSession.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,12 @@
2323
import java.sql.Connection;
2424
import java.sql.SQLException;
2525
import java.time.LocalDateTime;
26+
import java.util.ArrayList;
2627
import java.util.List;
2728
import java.util.Locale;
2829
import java.util.Map;
2930
import java.util.concurrent.ConcurrentHashMap;
31+
import java.util.concurrent.atomic.AtomicBoolean;
3032

3133
@Slf4j
3234
public class BaseSession implements Session {
@@ -44,6 +46,7 @@ public class BaseSession implements Session {
4446

4547
@Getter
4648
Map<String, Console> consoles = new ConcurrentHashMap<>();
49+
private final AtomicBoolean closeStarted = new AtomicBoolean(false);
4750

4851
@Getter
4952
@Setter
@@ -201,10 +204,22 @@ public boolean isActive() {
201204

202205
@Override
203206
public void close() {
207+
if (!this.beginClose()) {
208+
return;
209+
}
210+
this.closeSessionResources();
211+
}
212+
213+
protected final boolean beginClose() {
214+
return this.closeStarted.compareAndSet(false, true);
215+
}
216+
217+
protected final void closeSessionResources() {
204218
if (this.getController() != null) {
205219
this.getController().cancelAllDialogs();
206220
}
207221
SessionManager.unregisterSession(this.getWebToken());
222+
this.closeConsoles();
208223
this.getDatasource().close();
209224
this.getPacketIO().close();
210225
var path = this.getTempPath();
@@ -213,6 +228,24 @@ public void close() {
213228
}
214229
}
215230

231+
private void closeConsoles() {
232+
var detached = new ArrayList<Map.Entry<String, Console>>();
233+
while (!this.consoles.isEmpty()) {
234+
for (var entry : this.consoles.entrySet()) {
235+
if (this.consoles.remove(entry.getKey(), entry.getValue())) {
236+
detached.add(Map.entry(entry.getKey(), entry.getValue()));
237+
}
238+
}
239+
}
240+
for (var entry : detached) {
241+
try {
242+
entry.getValue().close();
243+
} catch (RuntimeException e) {
244+
log.warn("close console failed, consoleId={}", entry.getKey(), e);
245+
}
246+
}
247+
}
248+
216249
@Override
217250
public void close(String message, Object... args) {
218251
this.close();

backend/framework/src/main/java/org/jumpserver/chen/framework/session/impl/JMSSession.java

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,13 @@ private void startWaitIdleTime() {
267267

268268
@Override
269269
public void close() {
270+
if (!this.beginClose()) {
271+
return;
272+
}
273+
this.closeJmsSessionResources();
274+
}
275+
276+
private void closeJmsSessionResources() {
270277
if (this.getController() != null) {
271278
this.getController().cancelAllDialogs();
272279
}
@@ -279,23 +286,27 @@ public void close() {
279286
}
280287

281288
} finally {
282-
super.close();
289+
super.closeSessionResources();
283290
}
284291
}
285292

286293
public void close(String message, String reason, Object... args) {
294+
if (!this.beginClose()) {
295+
return;
296+
}
287297
SessionManager.setContext(this.getWebToken());
298+
try {
299+
this.getPacketIO().sendPacket("session_close", null);
288300

289-
this.getPacketIO().sendPacket("session_close", null);
290-
291-
var dialog = new Dialog(MessageUtils.get("SessionFinished"));
292-
dialog.setBody(MessageUtils.get(message, args));
293-
this.getController().showDialog(dialog);
294-
295-
this.recordLifecycle(ServiceOuterClass.SessionLifecycleLogRequest.EventType.AssetConnectFinished, reason);
296-
this.closed = true;
301+
var dialog = new Dialog(MessageUtils.get("SessionFinished"));
302+
dialog.setBody(MessageUtils.get(message, args));
303+
this.getController().showDialog(dialog);
297304

298-
this.close();
305+
this.recordLifecycle(ServiceOuterClass.SessionLifecycleLogRequest.EventType.AssetConnectFinished, reason);
306+
this.closed = true;
307+
} finally {
308+
this.closeJmsSessionResources();
309+
}
299310
}
300311

301312
private void finishedJmsSession() {

backend/framework/src/main/java/org/jumpserver/chen/framework/ws/ConsoleWebSocketHandler.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,12 @@ private void onConnectPacket(WebSocketSession session, Packet packet) {
142142
Console console = this.createConsole(connect.getType(), webSess.getDatasource(), session, context);
143143
if (console != null) {
144144
this.setDatabaseContext(console);
145-
webSess.getConsoles().put(session.getId(), console);
145+
var token = (String) session.getAttributes().get("token");
146+
if (!SessionManager.registerConsole(token, session.getId(), console)) {
147+
console.close();
148+
this.closeWebSocket(session);
149+
return;
150+
}
146151
console.onInit(connect);
147152
log.info("User {} open a console ", webSess.getUsername());
148153
}
@@ -152,6 +157,7 @@ protected Console createConsole(String type, org.jumpserver.chen.framework.datas
152157
WebSocketSession session, ConsoleContext context) {
153158
return switch (type) {
154159
case Connect.CONSOLE_TYPE_QUERY -> new QueryConsole(datasource, session, context);
160+
case Connect.CONSOLE_TYPE_CONSOLE -> new QueryConsole(datasource, session, context, true);
155161
case Connect.CONSOLE_TYPE_DATA_VIEW -> new DataViewConsole(datasource, session, context);
156162
default -> null;
157163
};

0 commit comments

Comments
 (0)