Skip to content

Commit 09b8a9f

Browse files
committed
init v3
1 parent b20cf1d commit 09b8a9f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+17540
-2332
lines changed

Dockerfile

+24-89
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,3 @@
1-
FROM debian:bullseye-slim as stage-wisp-build
2-
ARG TARGETARCH
3-
4-
ARG DEPENDENCIES=" \
5-
ca-certificates \
6-
wget"
7-
8-
ARG APT_MIRROR=http://mirrors.ustc.edu.cn
9-
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked,id=chen \
10-
--mount=type=cache,target=/var/lib/apt,sharing=locked,id=chen \
11-
set -ex \
12-
&& rm -f /etc/apt/apt.conf.d/docker-clean \
13-
&& echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' >/etc/apt/apt.conf.d/keep-cache \
14-
&& sed -i "s@http://.*.debian.org@${APT_MIRROR}@g" /etc/apt/sources.list \
15-
&& apt-get update \
16-
&& apt-get -y install --no-install-recommends ${DEPENDENCIES} \
17-
&& echo "no" | dpkg-reconfigure dash \
18-
&& apt-get clean all \
19-
&& rm -rf /var/lib/apt/lists/*
20-
21-
WORKDIR /opt
22-
23-
ARG CHECK_VERSION=v1.0.2
24-
RUN set -ex \
25-
&& wget https://github.com/jumpserver-dev/healthcheck/releases/download/${CHECK_VERSION}/check-${CHECK_VERSION}-linux-${TARGETARCH}.tar.gz \
26-
&& tar -xf check-${CHECK_VERSION}-linux-${TARGETARCH}.tar.gz \
27-
&& mv check /usr/local/bin/ \
28-
&& chown root:root /usr/local/bin/check \
29-
&& chmod 755 /usr/local/bin/check \
30-
&& rm -f check-${CHECK_VERSION}-linux-${TARGETARCH}.tar.gz
31-
32-
ARG WISP_VERSION=v0.1.21
33-
RUN set -ex \
34-
&& wget https://github.com/jumpserver/wisp/releases/download/${WISP_VERSION}/wisp-${WISP_VERSION}-linux-${TARGETARCH}.tar.gz \
35-
&& tar -xf wisp-${WISP_VERSION}-linux-${TARGETARCH}.tar.gz -C /usr/local/bin/ --strip-components=1 \
36-
&& chown root:root /usr/local/bin/wisp \
37-
&& chmod 755 /usr/local/bin/wisp \
38-
&& rm -f /opt/*.tar.gz
39-
401
from node:16.20-bullseye-slim as stage-web-build
412
ARG TARGETARCH
423
ARG NPM_REGISTRY="https://registry.npmmirror.com"
@@ -46,50 +7,17 @@ RUN set -ex \
467
&& yarn config set registry ${NPM_REGISTRY}
478

489
WORKDIR /opt/chen/frontend
49-
10+
ADD frontend/package.json frontend/yarn.lock .
5011
RUN --mount=type=cache,target=/usr/local/share/.cache/yarn,sharing=locked,id=chen \
51-
--mount=type=bind,source=frontend/package.json,target=package.json \
52-
--mount=type=bind,source=frontend/yarn.lock,target=yarn.lock \
5312
yarn install
5413

5514
ADD frontend .
56-
5715
RUN --mount=type=cache,target=/usr/local/share/.cache/yarn,sharing=locked,id=chen \
5816
yarn build
5917

60-
FROM debian:bullseye-slim as stage-chen-build
18+
FROM registry.fit2cloud.com/jumpserver/maven:3.9.5-openjdk-17-slim-bullseye as stage-chen-build
6119
ARG TARGETARCH
6220

63-
ARG DEPENDENCIES=" \
64-
ca-certificates \
65-
curl \
66-
openjdk-17-jre-headless"
67-
68-
ARG APT_MIRROR=http://mirrors.ustc.edu.cn
69-
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked,id=chen \
70-
--mount=type=cache,target=/var/lib/apt,sharing=locked,id=chen \
71-
set -ex \
72-
&& rm -f /etc/apt/apt.conf.d/docker-clean \
73-
&& echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' >/etc/apt/apt.conf.d/keep-cache \
74-
&& sed -i "s@http://.*.debian.org@${APT_MIRROR}@g" /etc/apt/sources.list \
75-
&& ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
76-
&& apt-get update \
77-
&& apt-get install -y --no-install-recommends ${DEPENDENCIES} \
78-
&& echo "no" | dpkg-reconfigure dash
79-
80-
ARG MAVEN_VERSION=3.9.7
81-
ARG USER_HOME_DIR="/root"
82-
ARG BASE_URL=https://downloads.apache.org/maven/maven-3/${MAVEN_VERSION}/binaries
83-
84-
RUN mkdir -p /usr/share/maven /usr/share/maven/ref \
85-
&& curl -fsSL -o /tmp/apache-maven.tar.gz ${BASE_URL}/apache-maven-${MAVEN_VERSION}-bin.tar.gz \
86-
&& tar -xzf /tmp/apache-maven.tar.gz -C /usr/share/maven --strip-components=1 \
87-
&& rm -f /tmp/apache-maven.tar.gz \
88-
&& ln -s /usr/share/maven/bin/mvn /usr/bin/mvn
89-
90-
ENV MAVEN_HOME /usr/share/maven
91-
ENV MAVEN_CONFIG "$USER_HOME_DIR/.m2"
92-
9321
WORKDIR /opt/chen
9422

9523
COPY . .
@@ -99,6 +27,7 @@ ARG VERSION
9927
ENV VERSION=$VERSION
10028

10129
ARG MAVEN_MIRROR=https://repo.maven.apache.org/maven2
30+
10231
RUN --mount=type=cache,target=/root/.m2,id=chen \
10332
set -ex \
10433
&& mkdir -p /root/.m2 \
@@ -108,30 +37,42 @@ RUN --mount=type=cache,target=/root/.m2,id=chen \
10837

10938
RUN chmod +x entrypoint.sh
11039

111-
FROM debian:bullseye-slim
40+
FROM registry.fit2cloud.com/jumpserver/openjdk:17-slim-bullseye
11241
ARG TARGETARCH
113-
ENV LANG=en_US.UTF-8
42+
ENV LANG=zh_CN.UTF-8
11443

11544
ARG DEPENDENCIES=" \
11645
ca-certificates \
117-
openjdk-17-jre-headless"
46+
curl \
47+
locales \
48+
wget"
11849

11950
ARG APT_MIRROR=http://mirrors.ustc.edu.cn
12051
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked,id=chen \
121-
--mount=type=cache,target=/var/lib/apt,sharing=locked,id=chen \
12252
sed -i "s@http://.*.debian.org@${APT_MIRROR}@g" /etc/apt/sources.list \
53+
&& sed -i "[email protected]=SSLv3, TLSv1, [email protected]=SSLv3@" /opt/java/openjdk/conf/security/java.security \
54+
|| sed -i "[email protected]=SSLv3, TLSv1, [email protected]=SSLv3@" /usr/local/openjdk-17/conf/security/java.security \
12355
&& rm -f /etc/apt/apt.conf.d/docker-clean \
12456
&& ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
12557
&& apt-get update \
12658
&& apt-get install -y --no-install-recommends ${DEPENDENCIES} \
12759
&& echo "no" | dpkg-reconfigure dash \
128-
&& sed -i "[email protected]=SSLv3, TLSv1, [email protected]=SSLv3@" /etc/java-17-openjdk/security/java.security \
129-
&& sed -i "s@# export @export @g" ~/.bashrc \
130-
&& sed -i "s@# alias @alias @g" ~/.bashrc
60+
&& echo "zh_CN.UTF-8" | dpkg-reconfigure locales \
61+
&& apt-get clean all \
62+
&& rm -rf /var/lib/apt/lists/*
63+
64+
WORKDIR /opt
65+
66+
ARG WISP_VERSION=v0.1.21
67+
RUN set -ex \
68+
&& wget https://github.com/jumpserver/wisp/releases/download/${WISP_VERSION}/wisp-${WISP_VERSION}-linux-${TARGETARCH}.tar.gz \
69+
&& tar -xf wisp-${WISP_VERSION}-linux-${TARGETARCH}.tar.gz -C /usr/local/bin/ --strip-components=1 \
70+
&& chown root:root /usr/local/bin/wisp \
71+
&& chmod 755 /usr/local/bin/wisp \
72+
&& rm -f /opt/*.tar.gz
13173

13274
WORKDIR /opt/chen
13375

134-
COPY --from=stage-wisp-build /usr/local/bin /usr/local/bin
13576
COPY --from=stage-chen-build /opt/chen/backend/web/target/web-*.jar /opt/chen/chen.jar
13677
COPY --from=stage-chen-build /opt/chen/entrypoint.sh .
13778
COPY --from=stage-chen-build /opt/chen/drivers /opt/chen/drivers
@@ -140,12 +81,6 @@ COPY --from=stage-chen-build /opt/chen/config/application.yml /opt/chen/config/a
14081
ARG VERSION
14182
ENV VERSION=$VERSION
14283

143-
VOLUME /opt/chen/data
144-
145-
ENTRYPOINT ["./entrypoint.sh"]
146-
14784
EXPOSE 8082
14885

149-
STOPSIGNAL SIGQUIT
150-
151-
CMD [ "wisp" ]
86+
CMD ["./entrypoint.sh"]

Dockerfile-ee

-17
This file was deleted.

README.md

+1-28
Original file line numberDiff line numberDiff line change
@@ -1,28 +1 @@
1-
# Chen
2-
3-
Chen 是 JumpServer 的 WebDB 连接组件,支持多种数据库协议。
4-
5-
Chen 使用 Java 实现,名字来源于 Dota 英雄 [](https://www.dota2.com/hero/chen)
6-
7-
# UI 展示
8-
9-
![UI展示](https://download.jumpserver.org/images/chen.png)
10-
11-
12-
## 支持的功能
13-
14-
- [x] 安全认证
15-
- [x] SQL 过滤
16-
- [x] SQL 录像
17-
- [x] SQL 阻断
18-
19-
## 支持的数据库
20-
21-
- [x] MySQL 5.7/8.0+
22-
- [x] MariaDB
23-
- [x] PostgreSQL (X-Pack)
24-
- [x] SQL Server (X-Pack)
25-
- [x] Oracle (X-Pack)
26-
- [x] DB2 (X-Pack)
27-
28-
1+
# chen

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

+5-5
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public void handle(Packet packet) {
7676
}
7777

7878
public void onConnect(Connect connect) {
79-
this.getConsoleLogger().info("Websocket" + MessageUtils.get("Connected"));
79+
this.getConsoleLogger().info("Websocket" + MessageUtils.get("state.connected"));
8080
this.getConsoleLogger().info("view table: %s", this.getTitle());
8181

8282
this.createDataView(this.schema, this.table);
@@ -87,7 +87,7 @@ public void onConnect(Connect connect) {
8787

8888
this.tableDataView.loadData();
8989
} catch (SQLException e) {
90-
this.getMessager().send(Message.error(MessageUtils.get("FetchError"), e.getMessage()));
90+
this.getMessager().send(Message.error(MessageUtils.get("msg.error.fetch_error"), e.getMessage()));
9191
} finally {
9292
this.tableDataView.getStateManager().getState().setLoading(false);
9393
this.tableDataView.getStateManager().commit();
@@ -112,14 +112,14 @@ public void createDataView(String schemaName, String tableName) {
112112
var sql = plan.getTargetSQL();
113113
var aclResult = session.checkACL(sql);
114114
if (aclResult != null && (aclResult.getRiskLevel() == Common.RiskLevel.Reject || aclResult.getRiskLevel() == Common.RiskLevel.ReviewReject)) {
115-
this.getConsoleLogger().error("%s", MessageUtils.get("ACLRejectError"));
115+
this.getConsoleLogger().error("%s", MessageUtils.get("msg.error.acl_reject"));
116116
CommandRecord commandRecord = new CommandRecord(sql);
117117
commandRecord.setRiskLevel(aclResult.getRiskLevel());
118118
session.recordCommand(commandRecord);
119119

120120
this.stateManager.getState().setLoading(false);
121121
this.stateManager.commit();
122-
throw new SQLException(MessageUtils.get("ACLRejectError"));
122+
throw new SQLException(MessageUtils.get("msg.error.acl_reject"));
123123
}
124124
plan.setSqlQueryParams(sqlQueryParams);
125125
plan.generateTargetSQL();
@@ -146,7 +146,7 @@ public void onDataViewAction(DataViewAction action) {
146146
this.getPacketIO().sendPacket("update_data_view", new UpdateDataView(this.tableDataView.getTitle(), this.tableDataView.getData()));
147147
this.tableDataView.getStateManager().commit();
148148
} catch (SQLException e) {
149-
this.getMessager().send(Message.error(MessageUtils.get("FetchError"), e.getMessage()));
149+
this.getMessager().send(Message.error(MessageUtils.get("msg.error.fetch_error"), e.getMessage()));
150150
} finally {
151151
this.tableDataView.getStateManager().getState().setLoading(false);
152152
this.tableDataView.getStateManager().commit();

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

+12-12
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public class QueryConsole extends AbstractConsole {
4444

4545
public QueryConsole(Datasource datasource, WebSocketSession ws, String nodeKey) {
4646
super(datasource, ws, nodeKey);
47-
this.setTitle(String.format(MessageUtils.get("Query") + "-%d", generateConsoleName()));
47+
this.setTitle(String.format(MessageUtils.get("title.query") + "-%d", generateConsoleName()));
4848
this.datasource = datasource;
4949
}
5050

@@ -69,7 +69,7 @@ public void onInit(Connect connect) {
6969
}
7070

7171
public void onConnect(Connect connect) {
72-
this.getConsoleLogger().info("Websocket" + MessageUtils.get("Connected"));
72+
this.getConsoleLogger().info("Websocket" + MessageUtils.get("state.connected"));
7373

7474
this.stateManager = new StateManager<>(new QueryConsoleState(this.getTitle())
7575
, this.getPacketIO());
@@ -93,7 +93,7 @@ public void onConnect(Connect connect) {
9393
this.getState().setCurrentContext(context);
9494

9595
} catch (SQLException e) {
96-
this.getConsoleLogger().error(MessageUtils.get("ConnectError") + ": %s", e.getMessage());
96+
this.getConsoleLogger().error(MessageUtils.get("msg.error.connect_error") + ": %s", e.getMessage());
9797
}
9898

9999
this.getState().setLoading(false);
@@ -189,7 +189,7 @@ private void onDataViewAction(DataViewAction action) {
189189
this.getPacketIO().sendPacket("update_data_view", new UpdateDataView(action.getDataView(), dataView.getData()));
190190

191191
} catch (SQLException e) {
192-
this.getMessager().send(Message.error(MessageUtils.get("FetchError"), e.getMessage()));
192+
this.getMessager().send(Message.error(MessageUtils.get("msg.error.fetch_error"), e.getMessage()));
193193
} finally {
194194
dataView.getStateManager().getState().setLoading(false);
195195
dataView.getStateManager().commit();
@@ -219,7 +219,7 @@ public void onManualChangeContext(String context) {
219219
this.getState().setCurrentContext(context);
220220

221221
} catch (SQLException e) {
222-
this.getConsoleLogger().error(MessageUtils.get("ChangeContextError") + ": %s", e.getMessage());
222+
this.getConsoleLogger().error(MessageUtils.get("msg.error.change_context_error") + ": %s", e.getMessage());
223223
} finally {
224224
this.getState().setEditorLoading(false);
225225
this.stateManager.commit();
@@ -263,7 +263,7 @@ public void onSQL(String sql) {
263263
var aclResult = session.checkACL(sql, this.getConnection());
264264
if (aclResult != null) {
265265
if (aclResult.getRiskLevel() == Common.RiskLevel.Reject || aclResult.getRiskLevel() == Common.RiskLevel.ReviewReject) {
266-
this.getConsoleLogger().error("%s", MessageUtils.get("ACLRejectError"));
266+
this.getConsoleLogger().error("%s", MessageUtils.get("msg.error.acl_reject"));
267267
CommandRecord commandRecord = new CommandRecord(sql);
268268
commandRecord.setRiskLevel(aclResult.getRiskLevel());
269269
session.recordCommand(commandRecord);
@@ -282,20 +282,20 @@ public void onSQL(String sql) {
282282
var dataView = this.runSingleSQL(stmt, aclResult);
283283
if (!dataView.isHasTable()) {
284284
this.getConsoleLogger().success("%s , %s: %d",
285-
MessageUtils.get("ExecuteSuccess"),
286-
MessageUtils.get("AffectedRows"), dataView.getUpdateCount());
285+
MessageUtils.get("msg.success.execute_success"),
286+
MessageUtils.get("msg.info.affected_rows"), dataView.getUpdateCount());
287287
} else {
288288
this.sendDataView(dataView, clearOthers);
289289
clearOthers = false;
290290
}
291291
}
292292
this.ensureCurrentSchema();
293293
} catch (ParserException e) {
294-
this.getConsoleLogger().error("%s: %s", MessageUtils.get("ParseError"), e.getMessage());
295-
this.getPacketIO().sendPacket("message", Message.error(MessageUtils.get("ParseError"), e.getMessage()));
294+
this.getConsoleLogger().error("%s: %s", MessageUtils.get("msg.error.parse_error"), e.getMessage());
295+
this.getPacketIO().sendPacket("message", Message.error(MessageUtils.get("msg.error.parse_error"), e.getMessage()));
296296
} catch (SQLException e) {
297-
this.getConsoleLogger().error("%s: %s", MessageUtils.get("ExecuteError"), e.getMessage());
298-
this.getPacketIO().sendPacket("message", Message.error(MessageUtils.get("ExecuteError"), e.getMessage()));
297+
this.getConsoleLogger().error("%s: %s", MessageUtils.get("msg.error.execute_error"), e.getMessage());
298+
this.getPacketIO().sendPacket("message", Message.error(MessageUtils.get("msg.error.execute_error"), e.getMessage()));
299299
} finally {
300300
this.getState().setInQuery(false);
301301
this.getState().setCanCancel(false);

0 commit comments

Comments
 (0)