Skip to content

Commit 2434e7e

Browse files
committed
feat(gotty): 增加gotty build
1 parent e8ccb57 commit 2434e7e

File tree

13 files changed

+177
-87
lines changed

13 files changed

+177
-87
lines changed

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,5 @@ cmd/server/web
1515

1616
# Output of the go coverage tool, specifically when used with LiteIDE
1717
*.out
18-
1918
# Dependency directories (remove the comment below to include it)
2019
# vendor/

.kube/config

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,19 @@
1-
<html>
2-
<head><title>302 Found</title></head>
3-
<body bgcolor="white">
4-
<center><h1>302 Found</h1></center>
5-
<hr><center>bfe/1.0.8.18</center>
6-
</body>
7-
</html>
1+
apiVersion: v1
2+
clusters:
3+
- cluster:
4+
insecure-skip-tls-verify: true
5+
server: https://172.16.10.41:8443
6+
name: abcd
7+
contexts:
8+
- context:
9+
cluster: abcd
10+
user: admin
11+
name: abcd@admin
12+
current-context: abcd@admin
13+
kind: Config
14+
preferences: {}
15+
users:
16+
- name: admin
17+
user:
18+
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBRENDQWVpZ0F3SUJBZ0lKQVBraVB1OVZxTjhHTUEwR0NTcUdTSWIzRFFFQkN3VUFNQlV4RXpBUkJnTlYKQkFNTUNtdDFZbVZ5Ym1WMFpYTXdJQmNOTWpFd056SXpNRFkwTkRFeVdoZ1BNakV5TVRBMk1qa3dOalEwTVRKYQpNRFF4R1RBWEJnTlZCQU1NRUd0MVltVnlibVYwWlhNdFlXUnRhVzR4RnpBVkJnTlZCQW9NRG5ONWMzUmxiVHB0CllYTjBaWEp6TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF6eEhRTUN3OWh5STYKeGVaNEVmbXcwV0xqWE0rZnV6Q0t1bHByeXhQZVAzTVh3VmRrK2MybEUrZG9oTENDMDZ1QlBzVXJ1RVN6NGhvVApyQ1ZCOGpLb21UUWpXb2ExRWtUaDRBZUZHQUNjandNcU53Uk16TG9aeWxUSUs2eXdxNzNyVnlYSjQyVUVyR0pzCnpPd1ZpYVlaQ0k4MW13aWttaFBaaDhMSk1JZ1JSMzVtbXFBSmU0OTlZd2ZzWnRTNXljalUyaGd4dDduamxDVjkKQ1cxWEJUS1ppbWlNeDBWN3BidjBmaHp5UHpVcnBqM1p1azJtSzZzcUYyaFNpMFB5alVyWkFJSVNzYmtyOVRuUAo2MFhPZUt2Tkw2dk1Gc3F1aXpKbWZvUXh5R2UvbUoxSjRLRGgxNzAwN3pSa3ZiMVc0dnJtODFYQ1U0T0p5TmEwCmVnRTl6OG9iQ1FJREFRQUJvekl3TURBSkJnTlZIUk1FQWpBQU1BNEdBMVVkRHdFQi93UUVBd0lGb0RBVEJnTlYKSFNVRUREQUtCZ2dyQmdFRkJRY0RBakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBbHNLSmF0QzNsbFF5VjNBdwpZbUNMT1ZuTzkxQXlzTEhPa0xJQVAwblFYRldiQzBXeG1ja09uS2tseCsxZ29xV2o2a2Z2UC9xT3JJZitPaUcwClhGazJIQ21UM2pzTlA3ck9DUnZBUVpQQ3VLeVVUejJoYXQ4Z25LOFhIemU4QzBOTmxQaG94eE1ieVRWNXRKbUkKbFRkNFNpWlVrcWVUSU44OEQ5WkgvTWlVbHN2aTllNWg3U3BkdC9RcU9BNlp1T0V4RjI5dlMvU29hNDVTUnNuTgpaU3Y5WU84bUEvSS9iRHE3cFAyUVR2TjF1T1ZMTUF1K0QzQlNkQllwUU1BTnZkMkM1TkFBYmZVcUdBTldhZlhXClFNeHhDaE9ybjlWRWRYSG1DSzJSdUN4STRYVXdzZVo3dFpUNnJZV0NEc2p1T0ZCc2VDYTR6aEQ2c0pBM3RQeWgKNXQ5QXBBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
19+
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBenhIUU1DdzloeUk2eGVaNEVmbXcwV0xqWE0rZnV6Q0t1bHByeXhQZVAzTVh3VmRrCitjMmxFK2RvaExDQzA2dUJQc1VydUVTejRob1RyQ1ZCOGpLb21UUWpXb2ExRWtUaDRBZUZHQUNjandNcU53Uk0KekxvWnlsVElLNnl3cTczclZ5WEo0MlVFckdKc3pPd1ZpYVlaQ0k4MW13aWttaFBaaDhMSk1JZ1JSMzVtbXFBSgplNDk5WXdmc1p0UzV5Y2pVMmhneHQ3bmpsQ1Y5Q1cxWEJUS1ppbWlNeDBWN3BidjBmaHp5UHpVcnBqM1p1azJtCks2c3FGMmhTaTBQeWpVclpBSUlTc2JrcjlUblA2MFhPZUt2Tkw2dk1Gc3F1aXpKbWZvUXh5R2UvbUoxSjRLRGgKMTcwMDd6Umt2YjFXNHZybTgxWENVNE9KeU5hMGVnRTl6OG9iQ1FJREFRQUJBb0lCQUJQdkRoQ2xJYU14cTJERAp5QWxLOVRlakFtbzczbytobzZrKzdTT1duUTJVb2RQTit2MkZTMy80QmZySUYwQVRRWlR1WEVBWDlRMHVIM2l4CitZQThXaml0YVQzY3UrK3ZTK05LTmdqU2ZqL1NPUzBrcjlRQmtsd0UvMlFjOHNFRnZuTWNReXd0M0Y1UDkxTmUKNHMvbWVvQjFjTjZrM1Z1cno0UWZQMGo1d0ZnV2FhdEdab1hxeis3OXVwcHArY3p2bzRieUh5bmFEVTZjTVFlagp0c0RFMy9lcHpQNGxFaGU3VG5kVUo0RS9Qb2haN05LT1lVOTRQOUt2ZDBoVG5leWVEdERFVk5Va2x1RGo0TDh6Ck8vR2QyYVpsTjZsMjhCY1VMK3JSbGcydUJCaXJPdXlPckMzb3hhdFdxVm9jUlZVM0tJV0lNK05ib0FpTjNFQ2gKT1F5Mi93RUNnWUVBNk0wTEpXYXdCK09KOEZPMXFlMEtPZUJFckluY0U0NEFvNEFvMStTUzF2YlNvbkJQclRLSgpwNFN5REFqVnlLY0djbDlJOThaaTJiN1VqWWcyaU16cDNpSE1jQ2lmb3gxVW9oVkQ3Z0F4SXY0K0kzUFFVV3ZIClc3WmhrSzl2N285ZEtVNTI0Y1NFa0FqWmRCTEYrbFZ5Rmw2RTBmK0dOVzlCcVdUNEovY1NRdUVDZ1lFQTQ3UlgKQk8rY0VSUDZGZUEyM3piT3ZIZitod0dXbC9YYU0raHVVTVRhcGQza004bERUSDF5UGU5ZXNUNUJOTlkzRW5MegpVZGgva1ZwWjA3V044MkVHRWV5K1FPTmR5THVLdFFrRGFiVTdNUStYc2JLODhzVVZKQStjaHhPd3NiazRNTTl6Cm5obEU2bHp5d0VUUERQWXorcUd3dENFMC9EV2lwUGg5bUVOdkJTa0NnWUVBc3k0dWFBa1RiOTc0S2x1anRUaFcKNkpqdkFvWFJOOVBTTmdYTWFlN3AvajVYZk9OSTBCdlh5M0hjd0ZxRWdUM2RQbWFNZVBqZTJJMkNkN1RobElWegpjNTg4QlErZlh5S1NJM2FPcEQ3Tmt3dHd0RVROai8yT29jNU1aZHBDSXJHQm1PdGxvUHRxdEptN0ZSWGwvM21JCnFDTHp3OVlTYkVwSGxhTzdSTGRyL01FQ2dZQWh3dHBvSS9LNjRZQmgvL1dDMFFpRUR6S1E1OTVoTjVXYnZxbWsKbGh0cEhtWTRlMjNjQ0htSXoxWDE1Nm9aWUcyWDhhMDhCR0tkdFl5K0JCeEE2ckRRdFk1YjVwcEFLZlpkOHpFcgpXakNsakk5TVRKa1JVY0Zac0dyZjZENTVpMkhXY3R2TXBDaUFxemxlNHBUa2NoaXczNHBvbXNmVllVcDFOVmJCCjNiVzNTUUtCZ0V2YWVUQ1RWU0tTTjlqTE1aem5sd0R5YllEaTFHVDVMdVBtSGkrNlVaeFpKUFVvVjIweEw4Y2gKL2Z2bGk2NSs4RTdteDVGT3V0RVkyWUJKd01DOXpRczVabjVHSHMwUm45Sm1uNE83TzM1R05SSGpBdjdiK3J2NwpwMHBLeXRBT3ZQSTQ4U3FjM0xwSzVUc1E3ZCtEWThZYUw5TjVCV00vTmVFM3VMWW15bG5OCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==

Dockerfile

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ COPY --from=stage-web-build /build/kubepi/web .
3030

3131
RUN go mod download
3232

33+
RUN make build_gotty
3334
RUN make build_bin
3435

3536
FROM alpine:3.14
@@ -38,6 +39,21 @@ WORKDIR /
3839

3940
COPY --from=stage-bin-build /build/kubepi/bin/dist/usr /usr
4041

42+
RUN ARCH=$(uname -m) && case $ARCH in aarch64) ARCH="arm64";; x86_64) ARCH="amd64";; esac && echo "ARCH: " $ARCH && \
43+
echo > /etc/apk/repositories && echo -e "https://dl-cdn.alpinelinux.org/alpine/latest-stable/main\nhttps://dl-cdn.alpinelinux.org/alpine/latest-stable/community" >> /etc/apk/repositories && \
44+
apk update && apk upgrade && apk add --update --no-cache bash bash-completion curl git wget openssl iputils busybox-extras vim && sed -i "s/nobody:\//nobody:\/nonexistent/g" /etc/passwd && \
45+
curl -sLf https://storage.googleapis.com/kubernetes-release/release/v1.22.1/bin/linux/${ARCH}/kubectl > /usr/bin/kubectl && chmod +x /usr/bin/kubectl && \
46+
git clone --branch master --depth 1 https://github.com/ahmetb/kubectl-aliases /opt/kubectl-aliases && chmod -R 755 /opt/kubectl-aliases && \
47+
git clone --branch 0.21.0 --depth 1 https://github.com/junegunn/fzf /opt/fzf && chmod -R 755 /opt/fzf && /opt/fzf/install && ln -s /opt/fzf/bin/fzf /usr/local/bin/fzf && \
48+
ARCH=$(uname -m) && case $ARCH in aarch64) ARCH="arm64";; x86_64) ARCH="x86_64";; esac && echo "ARCH: " $ARCH && \
49+
cd /tmp/ && wget https://github.com/derailed/k9s/releases/download/v0.24.14/k9s_Linux_${ARCH}.tar.gz && tar -xvf k9s_Linux_${ARCH}.tar.gz && chmod +x k9s && mv k9s /usr/bin && \
50+
KUBECTX_VERSION=v0.9.4 && wget https://github.com/ahmetb/kubectx/releases/download/${KUBECTX_VERSION}/kubens_${KUBECTX_VERSION}_linux_${ARCH}.tar.gz && tar -xvf kubens_${KUBECTX_VERSION}_linux_${ARCH}.tar.gz && chmod +x kubens && mv kubens /usr/bin && \
51+
wget https://github.com/ahmetb/kubectx/releases/download/${KUBECTX_VERSION}/kubectx_${KUBECTX_VERSION}_linux_${ARCH}.tar.gz && tar -xvf kubectx_${KUBECTX_VERSION}_linux_${ARCH}.tar.gz && chmod +x kubectx && mv kubectx /usr/bin && \
52+
curl -L https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash && \
53+
chmod +x /usr/bin/gotty && chmod 555 /bin/busybox && \
54+
apk del git curl && rm -rf /tmp/* /var/tmp/* /var/cache/apk/* && \
55+
chmod -R 755 /tmp && mkdir -p /opt/webkubectl
56+
4157
EXPOSE 80
4258

4359
USER root

Makefile

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,10 @@ BUILDDIR=$(BASEPATH)/dist/usr/local/bin
99
KUBEPIDIR=$(BASEPATH)/web/kubepi
1010
DASHBOARDDIR=$(BASEPATH)/web/dashboard
1111
TERMINALDIR=$(BASEPATH)/web/terminal
12-
13-
12+
GOTTYDIR=$(BASEPATH)/thirdparty/gotty
1413
MAIN= $(BASEPATH)/cmd/server/main.go
15-
1614
APP_NAME=kubepi-server
1715

18-
GOPROXY="https://goproxy.cn,direct"
19-
2016
build_web_kubepi:
2117
cd $(KUBEPIDIR) && npm install && npm run-script build
2218
build_web_dashboard:
@@ -29,7 +25,10 @@ build_web: build_web_kubepi build_web_dashboard build_web_terminal
2925
build_bin:
3026
GOOS=$(GOOS) GOARCH=$(GOARCH) $(GOBUILD) -trimpath -ldflags "-s -w" -o $(BUILDDIR)/$(APP_NAME) $(MAIN)
3127

32-
build_all: build_web build_bin
28+
build_gotty:
29+
cd $(GOTTYDIR) && make && mkdir -p ${BUILDDIR} && mv gotty ${BUILDDIR}
30+
31+
build_all: build_web build_gotty build_bin
3332

3433
build_docker:
3534
docker build -t kubeoperator/kubepi-server:master .

cmd/server/main.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"github.com/KubeOperator/kubepi/internal/route"
66
"github.com/KubeOperator/kubepi/internal/server"
77
"github.com/spf13/cobra"
8+
"runtime"
89
)
910

1011
var (
@@ -22,6 +23,12 @@ var embedWebDashboard embed.FS
2223
//go:embed web/terminal
2324
var embedWebTerminal embed.FS
2425

26+
//go:embed script/darwin/init-kube.sh
27+
var webkubectlEntrypointDarwin string
28+
29+
//go:embed script/linux/init-kube.sh
30+
var webkubectlEntrypointLinux string
31+
2532
func init() {
2633
RootCmd.Flags().StringVar(&serverBindHost, "server-bind-host", "", "kubepi bind address")
2734
RootCmd.Flags().IntVar(&serverBindPort, "server-bind-port", 0, "kubepi bind port")
@@ -35,6 +42,11 @@ var RootCmd = &cobra.Command{
3542
server.EmbedWebDashboard = embedWebDashboard
3643
server.EmbedWebTerminal = embedWebTerminal
3744
server.EmbedWebKubePi = embedWebKubePi
45+
if runtime.GOOS == "darwin" {
46+
server.WebkubectlEntrypoint = webkubectlEntrypointDarwin
47+
} else {
48+
server.WebkubectlEntrypoint = webkubectlEntrypointLinux
49+
}
3850
return server.Listen(route.InitRoute)
3951
},
4052
}

cmd/server/script/darwin/init-kube.sh

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#!/bin/bash
2+
set -e
3+
4+
arg1=$1
5+
mkdir -p ~/.kube
6+
code=`curl -w %{http_code} -s -o ~/.kube/config http://localhost/api/v1/webkubectl/session?token=${arg1}`
7+
8+
if [[ $code -ne '200' ]];then
9+
echo "download kubeconfig failed"
10+
cat .kube/config
11+
exit
12+
fi
13+
14+
current_context=`kubectl config current-context`
15+
username=${current_context%@*}
16+
cluster=${current_context#*@}
17+
18+
echo "Welcome to kubepi"
19+
echo "Current cluster is ${username}"
20+
echo "Current user is ${cluster}"
21+
22+
exec /bin/bash

cmd/server/script/linux/init-kube.sh

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
#!/bin/bash
2+
set -e
3+
4+
if [ "${WELCOME_BANNER}" ]; then
5+
echo ${WELCOME_BANNER}
6+
fi
7+
8+
arg1=$1
9+
10+
11+
mkdir -p /nonexistent
12+
mount -t tmpfs -o size=${SESSION_STORAGE_SIZE} tmpfs /nonexistent
13+
cd /nonexistent
14+
cp /root/.bashrc ./
15+
cp /etc/vim/vimrc.local .vimrc
16+
echo 'source /opt/kubectl-aliases/.kubectl_aliases' >> .bashrc
17+
echo -e 'PS1="> "\nalias ll="ls -la"' >> .bashrc
18+
mkdir -p ~/.kube
19+
20+
export HOME=/nonexistent
21+
22+
23+
code=`curl -w %{http_code} -s -o ~/.kube/config http://localhost/api/v1/webkubectl/session?token=${arg1}`
24+
25+
if [[ $code -ne '200' ]];then
26+
echo "download kubeconfig failed"
27+
cat .kube/config
28+
exit
29+
fi
30+
31+
current_context=`kubectl config current-context`
32+
username=${current_context%@*}
33+
cluster=${current_context#*@}
34+
35+
echo "Welcome to kubepi"
36+
echo "Current cluster is ${username}"
37+
echo "Current user is ${cluster}"
38+
39+
40+
chown -R nobody:nogroup .kube
41+
export TMPDIR=/nonexistent
42+
43+
envs=`env`
44+
for env in ${envs[@]}; do
45+
if [[ $env == GOTTY* ]];
46+
then
47+
unset ${env%%=*}
48+
fi
49+
done
50+
51+
unset WELCOME_BANNER PPROF_ENABLED KUBECTL_INSECURE_SKIP_TLS_VERIFY SESSION_STORAGE_SIZE KUBECTL_VERSION
52+
53+
exec su -s /bin/bash nobody
54+
exec /bin/bash

internal/server/server.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ const sessionCookieName = "SESS_COOKIE_KUBEPI"
2929
var EmbedWebKubePi embed.FS
3030
var EmbedWebDashboard embed.FS
3131
var EmbedWebTerminal embed.FS
32+
var WebkubectlEntrypoint string
3233

3334
type KubePiSerer struct {
3435
*iris.Application
@@ -203,6 +204,18 @@ func (e *KubePiSerer) setWebkubectlProxy() {
203204
e.Any("webkubectl", handler)
204205
}
205206

207+
func (e *KubePiSerer) setUpTtyEntrypoint() {
208+
f, err := os.OpenFile("init-kube.sh", os.O_CREATE|os.O_RDWR, 0755)
209+
if err != nil {
210+
e.logger.Error(err)
211+
return
212+
}
213+
if _, err := f.WriteString(WebkubectlEntrypoint); err != nil {
214+
e.logger.Error(err)
215+
return
216+
}
217+
}
218+
206219
func (e *KubePiSerer) bootstrap() *KubePiSerer {
207220
e.Application = iris.New()
208221
e.setUpStaticFile()
@@ -214,6 +227,7 @@ func (e *KubePiSerer) bootstrap() *KubePiSerer {
214227
e.setUpErrHandler()
215228
e.setWebkubectlProxy()
216229
e.runMigrations()
230+
e.setUpTtyEntrypoint()
217231
e.startTty()
218232
return e
219233
}

internal/server/tty_darwin.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ func (e *KubePiSerer) startTty() {
1212
params := []string{"--permit-write", "bash", "init-kube.sh"}
1313
go func() {
1414
c := exec.Command(cmd, params...)
15+
c.Env = append(c.Env, os.Environ()...)
1516
c.Stdout = os.Stdout
1617
c.Stderr = os.Stderr
1718
if err := c.Run(); err != nil {

internal/server/tty_linux.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ package server
44

55
func (e *KubePiSerer) startTty() {
66
cmd := "gotty"
7-
params := []string{"--permit-write", "bash", "unshare", "--fork", "--pid", "--mount-proc", "--mount", "init-kube.sh"}
7+
params := []string{"--permit-write", "unshare", "--fork", "--pid", "--mount-proc", "--mount", "bash", "init-kube.sh"}
88
go func() {
99
c := exec.Command(cmd, params...)
10+
c.Env = append(c.Env, os.Environ()...)
1011
c.Stdout = os.Stdout
1112
c.Stderr = os.Stderr
1213
if err := c.Run(); err != nil {

thirdparty/gotty/.kube/config

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,5 @@
1-
apiVersion: v1
2-
clusters:
3-
- cluster:
4-
insecure-skip-tls-verify: true
5-
server: https://172.16.10.41:8443
6-
name: abcd
7-
contexts:
8-
- context:
9-
cluster: abcd
10-
user: admin
11-
name: abcd@admin
12-
current-context: abcd@admin
13-
kind: Config
14-
preferences: {}
15-
users:
16-
- name: admin
17-
user:
18-
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBRENDQWVpZ0F3SUJBZ0lKQVBraVB1OVZxTjhHTUEwR0NTcUdTSWIzRFFFQkN3VUFNQlV4RXpBUkJnTlYKQkFNTUNtdDFZbVZ5Ym1WMFpYTXdJQmNOTWpFd056SXpNRFkwTkRFeVdoZ1BNakV5TVRBMk1qa3dOalEwTVRKYQpNRFF4R1RBWEJnTlZCQU1NRUd0MVltVnlibVYwWlhNdFlXUnRhVzR4RnpBVkJnTlZCQW9NRG5ONWMzUmxiVHB0CllYTjBaWEp6TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF6eEhRTUN3OWh5STYKeGVaNEVmbXcwV0xqWE0rZnV6Q0t1bHByeXhQZVAzTVh3VmRrK2MybEUrZG9oTENDMDZ1QlBzVXJ1RVN6NGhvVApyQ1ZCOGpLb21UUWpXb2ExRWtUaDRBZUZHQUNjandNcU53Uk16TG9aeWxUSUs2eXdxNzNyVnlYSjQyVUVyR0pzCnpPd1ZpYVlaQ0k4MW13aWttaFBaaDhMSk1JZ1JSMzVtbXFBSmU0OTlZd2ZzWnRTNXljalUyaGd4dDduamxDVjkKQ1cxWEJUS1ppbWlNeDBWN3BidjBmaHp5UHpVcnBqM1p1azJtSzZzcUYyaFNpMFB5alVyWkFJSVNzYmtyOVRuUAo2MFhPZUt2Tkw2dk1Gc3F1aXpKbWZvUXh5R2UvbUoxSjRLRGgxNzAwN3pSa3ZiMVc0dnJtODFYQ1U0T0p5TmEwCmVnRTl6OG9iQ1FJREFRQUJvekl3TURBSkJnTlZIUk1FQWpBQU1BNEdBMVVkRHdFQi93UUVBd0lGb0RBVEJnTlYKSFNVRUREQUtCZ2dyQmdFRkJRY0RBakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBbHNLSmF0QzNsbFF5VjNBdwpZbUNMT1ZuTzkxQXlzTEhPa0xJQVAwblFYRldiQzBXeG1ja09uS2tseCsxZ29xV2o2a2Z2UC9xT3JJZitPaUcwClhGazJIQ21UM2pzTlA3ck9DUnZBUVpQQ3VLeVVUejJoYXQ4Z25LOFhIemU4QzBOTmxQaG94eE1ieVRWNXRKbUkKbFRkNFNpWlVrcWVUSU44OEQ5WkgvTWlVbHN2aTllNWg3U3BkdC9RcU9BNlp1T0V4RjI5dlMvU29hNDVTUnNuTgpaU3Y5WU84bUEvSS9iRHE3cFAyUVR2TjF1T1ZMTUF1K0QzQlNkQllwUU1BTnZkMkM1TkFBYmZVcUdBTldhZlhXClFNeHhDaE9ybjlWRWRYSG1DSzJSdUN4STRYVXdzZVo3dFpUNnJZV0NEc2p1T0ZCc2VDYTR6aEQ2c0pBM3RQeWgKNXQ5QXBBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
19-
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBenhIUU1DdzloeUk2eGVaNEVmbXcwV0xqWE0rZnV6Q0t1bHByeXhQZVAzTVh3VmRrCitjMmxFK2RvaExDQzA2dUJQc1VydUVTejRob1RyQ1ZCOGpLb21UUWpXb2ExRWtUaDRBZUZHQUNjandNcU53Uk0KekxvWnlsVElLNnl3cTczclZ5WEo0MlVFckdKc3pPd1ZpYVlaQ0k4MW13aWttaFBaaDhMSk1JZ1JSMzVtbXFBSgplNDk5WXdmc1p0UzV5Y2pVMmhneHQ3bmpsQ1Y5Q1cxWEJUS1ppbWlNeDBWN3BidjBmaHp5UHpVcnBqM1p1azJtCks2c3FGMmhTaTBQeWpVclpBSUlTc2JrcjlUblA2MFhPZUt2Tkw2dk1Gc3F1aXpKbWZvUXh5R2UvbUoxSjRLRGgKMTcwMDd6Umt2YjFXNHZybTgxWENVNE9KeU5hMGVnRTl6OG9iQ1FJREFRQUJBb0lCQUJQdkRoQ2xJYU14cTJERAp5QWxLOVRlakFtbzczbytobzZrKzdTT1duUTJVb2RQTit2MkZTMy80QmZySUYwQVRRWlR1WEVBWDlRMHVIM2l4CitZQThXaml0YVQzY3UrK3ZTK05LTmdqU2ZqL1NPUzBrcjlRQmtsd0UvMlFjOHNFRnZuTWNReXd0M0Y1UDkxTmUKNHMvbWVvQjFjTjZrM1Z1cno0UWZQMGo1d0ZnV2FhdEdab1hxeis3OXVwcHArY3p2bzRieUh5bmFEVTZjTVFlagp0c0RFMy9lcHpQNGxFaGU3VG5kVUo0RS9Qb2haN05LT1lVOTRQOUt2ZDBoVG5leWVEdERFVk5Va2x1RGo0TDh6Ck8vR2QyYVpsTjZsMjhCY1VMK3JSbGcydUJCaXJPdXlPckMzb3hhdFdxVm9jUlZVM0tJV0lNK05ib0FpTjNFQ2gKT1F5Mi93RUNnWUVBNk0wTEpXYXdCK09KOEZPMXFlMEtPZUJFckluY0U0NEFvNEFvMStTUzF2YlNvbkJQclRLSgpwNFN5REFqVnlLY0djbDlJOThaaTJiN1VqWWcyaU16cDNpSE1jQ2lmb3gxVW9oVkQ3Z0F4SXY0K0kzUFFVV3ZIClc3WmhrSzl2N285ZEtVNTI0Y1NFa0FqWmRCTEYrbFZ5Rmw2RTBmK0dOVzlCcVdUNEovY1NRdUVDZ1lFQTQ3UlgKQk8rY0VSUDZGZUEyM3piT3ZIZitod0dXbC9YYU0raHVVTVRhcGQza004bERUSDF5UGU5ZXNUNUJOTlkzRW5MegpVZGgva1ZwWjA3V044MkVHRWV5K1FPTmR5THVLdFFrRGFiVTdNUStYc2JLODhzVVZKQStjaHhPd3NiazRNTTl6Cm5obEU2bHp5d0VUUERQWXorcUd3dENFMC9EV2lwUGg5bUVOdkJTa0NnWUVBc3k0dWFBa1RiOTc0S2x1anRUaFcKNkpqdkFvWFJOOVBTTmdYTWFlN3AvajVYZk9OSTBCdlh5M0hjd0ZxRWdUM2RQbWFNZVBqZTJJMkNkN1RobElWegpjNTg4QlErZlh5S1NJM2FPcEQ3Tmt3dHd0RVROai8yT29jNU1aZHBDSXJHQm1PdGxvUHRxdEptN0ZSWGwvM21JCnFDTHp3OVlTYkVwSGxhTzdSTGRyL01FQ2dZQWh3dHBvSS9LNjRZQmgvL1dDMFFpRUR6S1E1OTVoTjVXYnZxbWsKbGh0cEhtWTRlMjNjQ0htSXoxWDE1Nm9aWUcyWDhhMDhCR0tkdFl5K0JCeEE2ckRRdFk1YjVwcEFLZlpkOHpFcgpXakNsakk5TVRKa1JVY0Zac0dyZjZENTVpMkhXY3R2TXBDaUFxemxlNHBUa2NoaXczNHBvbXNmVllVcDFOVmJCCjNiVzNTUUtCZ0V2YWVUQ1RWU0tTTjlqTE1aem5sd0R5YllEaTFHVDVMdVBtSGkrNlVaeFpKUFVvVjIweEw4Y2gKL2Z2bGk2NSs4RTdteDVGT3V0RVkyWUJKd01DOXpRczVabjVHSHMwUm45Sm1uNE83TzM1R05SSGpBdjdiK3J2NwpwMHBLeXRBT3ZQSTQ4U3FjM0xwSzVUc1E3ZCtEWThZYUw5TjVCV00vTmVFM3VMWW15bG5OCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==
1+
{
2+
"code": 400,
3+
"message": "sessionId length must be 36",
4+
"success": false
5+
}

0 commit comments

Comments
 (0)