1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package service
import (
"context"
"encoding/json"
"os"
"path"
"path/filepath"
"time"
"github.com/jumpserver/koko/pkg/common"
"github.com/jumpserver/koko/pkg/config"
"github.com/jumpserver/koko/pkg/logger"
)
var client = common.NewClient(30, "")
var authClient = common.NewClient(30, "")
func Initial(ctx context.Context) {
cf := config.GetConf()
keyPath := cf.AccessKeyFile
client.BaseHost = cf.CoreHost
authClient.BaseHost = cf.CoreHost
client.SetHeader("X-JMS-ORG", "ROOT")
authClient.SetHeader("X-JMS-ORG", "ROOT")
if !path.IsAbs(cf.AccessKeyFile) {
keyPath = filepath.Join(cf.RootPath, keyPath)
}
ak := AccessKey{Value: cf.AccessKey, Path: keyPath}
_ = ak.Load()
authClient.Auth = ak
validateAccessAuth()
MustLoadServerConfigOnce()
go KeepSyncConfigWithServer(ctx)
}
func newClient() common.Client {
cf := config.GetConf()
cli := common.NewClient(30, cf.CoreHost)
return cli
}
func validateAccessAuth() {
cf := config.GetConf()
maxTry := 30
count := 0
for {
user, err := GetProfile()
if err == nil && user.Role == "App" {
break
}
if err != nil {
msg := "Connect server error or access key is invalid, remove %s run again"
logger.Errorf(msg, cf.AccessKeyFile)
} else if user.Role != "App" {
logger.Error("Access role is not App, is: ", user.Role)
}
count++
time.Sleep(3 * time.Second)
if count >= maxTry {
os.Exit(1)
}
}
}
func MustLoadServerConfigOnce() {
var data map[string]interface{}
_, err := authClient.Get(TerminalConfigURL, &data)
if err != nil {
logger.Error("Load config from server error: ", err)
return
}
data["TERMINAL_HOST_KEY"] = "Hidden"
msg, err := json.Marshal(data)
if err != nil {
logger.Errorf("Marsha server config error: %s", err)
return
}
logger.Debug("Load config from server: " + string(msg))
err = LoadConfigFromServer()
if err != nil {
logger.Error("Load config from server error: ", err)
}
}
func LoadConfigFromServer() (err error) {
conf := config.GetConf()
_, err = authClient.Get(TerminalConfigURL, &conf)
if err != nil {
return err
}
config.SetConf(conf)
return nil
}
func KeepSyncConfigWithServer(ctx context.Context) {
ticker := time.NewTicker(60 * time.Second)
defer ticker.Stop()
for {
select {
case <-ctx.Done():
logger.Info("Sync config with server exit.")
return
case <-ticker.C:
err := LoadConfigFromServer()
if err != nil {
logger.Warn("Sync config with server error: ", err)
}
}
}
}