Skip to content

Commit abebbf6

Browse files
committed
feat: Add iup-tool for testing the internal update platform
Accelerate issue debugging
1 parent 838aeda commit abebbf6

11 files changed

Lines changed: 1535 additions & 0 deletions

makefile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ build: prepare bin/lastore-agent bin/lastore-upgrade-query
3535
${GoPath} ${GOBUILD_CGO_FLAGS} ${GOBUILD} -o bin/lastore-smartmirror-daemon ${GOBUILD_OPTIONS} ${GOPKG_PREFIX}/src/lastore-smartmirror-daemon || echo "build failed, disable smartmirror support "
3636
${GoPath} ${GOBUILD_CGO_FLAGS} ${GOBUILD} -o bin/lastore-apt-clean ${GOBUILD_OPTIONS} ${GOPKG_PREFIX}/src/lastore-apt-clean
3737

38+
dev-tools: bin/iup-tool
39+
40+
bin/iup-tool:
41+
${GoPath} ${GOBUILD_CGO_FLAGS} ${GOBUILD} -o bin/iup-tool ${GOBUILD_OPTIONS} ${GOPKG_PREFIX}/src/dev-tools/iup-tool
42+
3843
fetch-base-metadata:
3944
./bin/lastore-tools update -r desktop -j applications -o var/lib/lastore/applications.json
4045
./bin/lastore-tools update -r desktop -j categories -o var/lib/lastore/categories.json
@@ -106,3 +111,5 @@ clean:
106111

107112
check_code_quality:
108113
${GoPath} go vet ./src/...
114+
115+
.PHONY: dev-tools bin/iup-tool
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package main
2+
3+
import (
4+
"encoding/base64"
5+
"encoding/json"
6+
"fmt"
7+
"net/http"
8+
"net/url"
9+
"os"
10+
"time"
11+
12+
"github.com/spf13/cobra"
13+
)
14+
15+
var getCurrentPackagesCmd = &cobra.Command{
16+
Use: "get_current_packages",
17+
Short: "Get current package lists from update platform",
18+
Long: "Query the update platform for current version package lists",
19+
Run: runGetCurrentPackages,
20+
}
21+
22+
var currentPkgBaseline string
23+
24+
func init() {
25+
getCurrentPackagesCmd.Flags().StringVarP(&currentPkgBaseline, "baseline", "b", "", "Current baseline number (required)")
26+
_ = getCurrentPackagesCmd.MarkFlagRequired("baseline")
27+
rootCmd.AddCommand(getCurrentPackagesCmd)
28+
}
29+
30+
func runGetCurrentPackages(cmd *cobra.Command, args []string) {
31+
if currentPkgBaseline == "" {
32+
logger.Warning("baseline is required")
33+
os.Exit(1)
34+
}
35+
36+
response, err := genCurrentPkgListsResponse(updatePlatform.requestURL, updatePlatform.Token, currentPkgBaseline)
37+
if err != nil {
38+
logger.Warningf("genCurrentPkgListsResponse failed: %v", err)
39+
os.Exit(1)
40+
}
41+
42+
data, err := getResponseData(response, GetCurrentPkgLists)
43+
if err != nil {
44+
logger.Warningf("getResponseData failed: %v", err)
45+
os.Exit(1)
46+
}
47+
48+
pkgs := getCurrentPkgListsData(data)
49+
if pkgs == nil {
50+
logger.Warning("failed to parse current package list data")
51+
os.Exit(1)
52+
}
53+
54+
logger.Infof("Current Package Lists for baseline: %s", currentPkgBaseline)
55+
logger.Infof("PreCheck scripts: %d", len(pkgs.PreCheck))
56+
logger.Infof("MidCheck scripts: %d", len(pkgs.MidCheck))
57+
logger.Infof("PostCheck scripts: %d", len(pkgs.PostCheck))
58+
logger.Infof("Core packages: %d", len(pkgs.Packages.Core))
59+
logger.Infof("Select packages: %d", len(pkgs.Packages.Select))
60+
logger.Infof("Freeze packages: %d", len(pkgs.Packages.Freeze))
61+
logger.Infof("Purge packages: %d", len(pkgs.Packages.Purge))
62+
}
63+
64+
func genCurrentPkgListsResponse(requestUrl, token, baseline string) (*http.Response, error) {
65+
policyUrl := requestUrl + Urls[GetCurrentPkgLists].path
66+
client := &http.Client{
67+
Timeout: 40 * time.Second,
68+
}
69+
values := url.Values{}
70+
values.Add("baseline", baseline)
71+
policyUrl = policyUrl + "?" + values.Encode()
72+
request, err := http.NewRequest(Urls[GetCurrentPkgLists].method, policyUrl, nil)
73+
if err != nil {
74+
return nil, fmt.Errorf("%v new request failed: %v ", GetCurrentPkgLists.string(), err.Error())
75+
}
76+
request.Header.Set("X-Repo-Token", base64.RawStdEncoding.EncodeToString([]byte(token)))
77+
logRequestHeaders(request)
78+
return client.Do(request)
79+
}
80+
81+
func getCurrentPkgListsData(data json.RawMessage) *PreInstalledPkgMeta {
82+
tmp := &PreInstalledPkgMeta{}
83+
err := json.Unmarshal(data, &tmp)
84+
if err != nil {
85+
logger.Warningf("%v failed to Unmarshal msg.Data to PreInstalledPkgMeta: %v ", GetCurrentPkgLists.string(), err.Error())
86+
return nil
87+
}
88+
return tmp
89+
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package main
2+
3+
import (
4+
"encoding/base64"
5+
"encoding/json"
6+
"fmt"
7+
"net/http"
8+
"net/url"
9+
"os"
10+
"time"
11+
12+
"github.com/spf13/cobra"
13+
)
14+
15+
var getCVEInfoCmd = &cobra.Command{
16+
Use: "get_cve_info",
17+
Short: "Get CVE vulnerability information from update platform",
18+
Long: "Query the update platform for CVE (Common Vulnerabilities and Exposures) information",
19+
Run: runGetCVEInfo,
20+
}
21+
22+
var cveSyncTime string
23+
24+
func init() {
25+
getCVEInfoCmd.Flags().StringVarP(&cveSyncTime, "sync-time", "s", "", "Sync time for CVE data (optional, format: 2006-01-02)")
26+
rootCmd.AddCommand(getCVEInfoCmd)
27+
}
28+
29+
func runGetCVEInfo(cmd *cobra.Command, args []string) {
30+
response, err := genCVEInfoResponse(updatePlatform.requestURL, updatePlatform.Token, cveSyncTime)
31+
if err != nil {
32+
logger.Warningf("genCVEInfoResponse failed: %v", err)
33+
os.Exit(1)
34+
}
35+
36+
data, err := getResponseData(response, GetPkgCVEs)
37+
if err != nil {
38+
logger.Warningf("getResponseData failed: %v", err)
39+
os.Exit(1)
40+
}
41+
42+
cveMeta := getCVEData(data)
43+
if cveMeta == nil {
44+
logger.Warning("failed to parse CVE data")
45+
os.Exit(1)
46+
}
47+
48+
logger.Infof("CVE Data Time: %s", cveMeta.DataTime)
49+
logger.Infof("Total CVEs: %d", len(cveMeta.CVEs))
50+
logger.Infof("Total Packages with CVEs: %d", len(cveMeta.PkgCVEs))
51+
52+
// 打印部分CVE信息
53+
count := 0
54+
for cveID, cveInfo := range cveMeta.CVEs {
55+
if count >= 10 {
56+
logger.Infof("... and %d more CVEs", len(cveMeta.CVEs)-10)
57+
break
58+
}
59+
logger.Infof("CVE %s: Severity=%s", cveID, cveInfo.Severity)
60+
logger.Debugf(" Description: %s", cveInfo.Description)
61+
count++
62+
}
63+
}
64+
65+
func genCVEInfoResponse(requestUrl, token, syncTime string) (*http.Response, error) {
66+
policyUrl := requestUrl + Urls[GetPkgCVEs].path
67+
client := &http.Client{
68+
Timeout: 40 * time.Second,
69+
}
70+
values := url.Values{}
71+
values.Add("synctime", syncTime)
72+
policyUrl = policyUrl + "?" + values.Encode()
73+
request, err := http.NewRequest(Urls[GetPkgCVEs].method, policyUrl, nil)
74+
if err != nil {
75+
return nil, fmt.Errorf("%v new request failed: %v ", GetPkgCVEs.string(), err.Error())
76+
}
77+
request.Header.Set("X-Repo-Token", base64.RawStdEncoding.EncodeToString([]byte(token)))
78+
logRequestHeaders(request)
79+
return client.Do(request)
80+
}
81+
82+
func getCVEData(data json.RawMessage) *CVEMeta {
83+
tmp := &CVEMeta{}
84+
err := json.Unmarshal(data, &tmp)
85+
if err != nil {
86+
logger.Warningf("%v failed to Unmarshal msg.Data to CVEMeta: %v ", GetPkgCVEs.string(), err.Error())
87+
return nil
88+
}
89+
return tmp
90+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package main
2+
3+
import (
4+
"encoding/base64"
5+
"encoding/json"
6+
"fmt"
7+
"net/http"
8+
"net/url"
9+
"os"
10+
"time"
11+
12+
"github.com/davecgh/go-spew/spew"
13+
"github.com/spf13/cobra"
14+
)
15+
16+
var getUpdateLogCmd = &cobra.Command{
17+
Use: "get_update_log",
18+
Short: "Get system update logs from update platform",
19+
Long: "Query the update platform for system update logs based on baseline and unstable version",
20+
Run: runGetUpdateLog,
21+
}
22+
23+
var (
24+
updateLogBaseline string
25+
updateLogIsUnstable int
26+
)
27+
28+
func init() {
29+
getUpdateLogCmd.Flags().StringVarP(&updateLogBaseline, "baseline", "b", "", "Target baseline number (required)")
30+
getUpdateLogCmd.Flags().IntVarP(&updateLogIsUnstable, "is-unstable", "u", 1, "Is unstable version (1 for release, 2 for unstable)")
31+
_ = getUpdateLogCmd.MarkFlagRequired("baseline")
32+
rootCmd.AddCommand(getUpdateLogCmd)
33+
}
34+
35+
func runGetUpdateLog(cmd *cobra.Command, args []string) {
36+
if updateLogBaseline == "" {
37+
logger.Warning("baseline is required")
38+
os.Exit(1)
39+
}
40+
41+
response, err := genUpdateLogResponse(updatePlatform.requestURL, updatePlatform.Token, updateLogBaseline, updateLogIsUnstable)
42+
if err != nil {
43+
logger.Warningf("genUpdateLogResponse failed: %v", err)
44+
os.Exit(1)
45+
}
46+
47+
data, err := getResponseData(response, GetUpdateLog)
48+
if err != nil {
49+
logger.Warningf("getResponseData failed: %v", err)
50+
os.Exit(1)
51+
}
52+
53+
logs := getUpdateLogData(data)
54+
if logs == nil {
55+
logger.Warning("failed to parse update log data")
56+
os.Exit(1)
57+
}
58+
logger.Debugf("Update Log Data: %v", spew.Sdump(logs))
59+
}
60+
61+
func genUpdateLogResponse(requestUrl, token, baseline string, isUnstable int) (*http.Response, error) {
62+
policyUrl := requestUrl + Urls[GetUpdateLog].path
63+
client := &http.Client{
64+
Timeout: 40 * time.Second,
65+
}
66+
values := url.Values{}
67+
values.Add("baseline", baseline)
68+
values.Add("isUnstable", fmt.Sprintf("%d", isUnstable))
69+
policyUrl = policyUrl + "?" + values.Encode()
70+
request, err := http.NewRequest(Urls[GetUpdateLog].method, policyUrl, nil)
71+
if err != nil {
72+
return nil, fmt.Errorf("%v new request failed: %v ", GetUpdateLog.string(), err.Error())
73+
}
74+
request.Header.Set("X-Repo-Token", base64.RawStdEncoding.EncodeToString([]byte(token)))
75+
logRequestHeaders(request)
76+
return client.Do(request)
77+
}
78+
79+
func getUpdateLogData(data json.RawMessage) []UpdateLogMeta {
80+
var tmp []UpdateLogMeta
81+
err := json.Unmarshal(data, &tmp)
82+
if err != nil {
83+
logger.Warningf("%v failed to Unmarshal msg.Data to UpdateLogMeta: %v ", GetUpdateLog.string(), err.Error())
84+
return nil
85+
}
86+
return tmp
87+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package main
2+
3+
import (
4+
"encoding/base64"
5+
"encoding/json"
6+
"fmt"
7+
"net/http"
8+
"os"
9+
"time"
10+
11+
"github.com/davecgh/go-spew/spew"
12+
"github.com/spf13/cobra"
13+
)
14+
15+
// getVersionData 解析版本数据
16+
func getVersionData(data json.RawMessage) *updateMessage {
17+
tmp := &updateMessage{}
18+
err := json.Unmarshal(data, &tmp)
19+
if err != nil {
20+
logger.Warningf("%v failed to Unmarshal msg.Data to updateMessage: %v ", GetVersion.string(), err.Error())
21+
return nil
22+
}
23+
return tmp
24+
}
25+
26+
// genVersionResponse 生成版本请求
27+
func (m *UpdatePlatformManager) genVersionResponse() (*http.Response, error) {
28+
policyURL := m.requestURL + Urls[GetVersion].path
29+
client := &http.Client{
30+
Timeout: 40 * time.Second,
31+
}
32+
request, err := http.NewRequest(Urls[GetVersion].method, policyURL, nil)
33+
if err != nil {
34+
return nil, fmt.Errorf("%v new request failed: %v ", GetVersion.string(), err.Error())
35+
}
36+
request.Header.Set("X-Repo-Token", base64.RawStdEncoding.EncodeToString([]byte(m.Token)))
37+
request.Header.Set("X-Packages", base64.RawStdEncoding.EncodeToString([]byte(getClientPackageInfo(""))))
38+
logRequestHeaders(request)
39+
return client.Do(request)
40+
}
41+
42+
// genUpdatePolicyByToken 检查更新时将token数据发送给更新平台,获取本次更新信息
43+
func (m *UpdatePlatformManager) genUpdatePolicyByToken() error {
44+
response, err := m.genVersionResponse()
45+
if err != nil {
46+
return fmt.Errorf("failed get version data %v", err)
47+
}
48+
logger.Debugf("response: %v", response)
49+
data, err := getResponseData(response, GetVersion)
50+
if err != nil {
51+
return fmt.Errorf("failed get version data %v", err)
52+
}
53+
msg := getVersionData(data)
54+
logger.Infof("msg: %s", spew.Sdump(msg))
55+
return nil
56+
}
57+
58+
var getVersionCmd = &cobra.Command{
59+
Use: "get_version",
60+
Short: "Get version information from update platform",
61+
Long: "Query the update platform for version information and update policy",
62+
Run: func(cmd *cobra.Command, args []string) {
63+
err := updatePlatform.genUpdatePolicyByToken()
64+
if err != nil {
65+
logger.Warningf("genUpdatePolicyByToken failed: %v", err)
66+
os.Exit(1)
67+
}
68+
},
69+
}
70+
71+
func init() {
72+
rootCmd.AddCommand(getVersionCmd)
73+
}

0 commit comments

Comments
 (0)