Skip to content

Commit df1dde6

Browse files
committed
wip:TODO
1 parent ae55cf4 commit df1dde6

10 files changed

Lines changed: 1025 additions & 0 deletions

makefile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ 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+
bin/iup-tool:
39+
${GoPath} ${GOBUILD_CGO_FLAGS} ${GOBUILD} -o bin/iup-tool ${GOBUILD_OPTIONS} ${GOPKG_PREFIX}/src/local_cmd/iup-tool
40+
3841
fetch-base-metadata:
3942
./bin/lastore-tools update -r desktop -j applications -o var/lib/lastore/applications.json
4043
./bin/lastore-tools update -r desktop -j categories -o var/lib/lastore/categories.json
@@ -106,3 +109,5 @@ clean:
106109

107110
check_code_quality:
108111
${GoPath} go vet ./src/...
112+
113+
.PHONY: bin/iup-tool
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
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().StringVar(&currentPkgBaseline, "baseline", "", "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+
return client.Do(request)
78+
}
79+
80+
func getCurrentPkgListsData(data json.RawMessage) *PreInstalledPkgMeta {
81+
tmp := &PreInstalledPkgMeta{}
82+
err := json.Unmarshal(data, &tmp)
83+
if err != nil {
84+
logger.Warningf("%v failed to Unmarshal msg.Data to PreInstalledPkgMeta: %v ", GetCurrentPkgLists.string(), err.Error())
85+
return nil
86+
}
87+
return tmp
88+
}
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 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().StringVar(&cveSyncTime, "sync-time", "", "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+
return client.Do(request)
79+
}
80+
81+
func getCVEData(data json.RawMessage) *CVEMeta {
82+
tmp := &CVEMeta{}
83+
err := json.Unmarshal(data, &tmp)
84+
if err != nil {
85+
logger.Warningf("%v failed to Unmarshal msg.Data to CVEMeta: %v ", GetPkgCVEs.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 getUpdateLogCmd = &cobra.Command{
16+
Use: "get_update_log",
17+
Short: "Get system update logs from update platform",
18+
Long: "Query the update platform for system update logs based on baseline and unstable version",
19+
Run: runGetUpdateLog,
20+
}
21+
22+
var (
23+
updateLogBaseline string
24+
updateLogIsUnstable int
25+
)
26+
27+
func init() {
28+
getUpdateLogCmd.Flags().StringVar(&updateLogBaseline, "baseline", "", "Target baseline number (required)")
29+
getUpdateLogCmd.Flags().IntVar(&updateLogIsUnstable, "is-unstable", 1, "Is unstable version (1 for release, 2 for unstable)")
30+
_ = getUpdateLogCmd.MarkFlagRequired("baseline")
31+
rootCmd.AddCommand(getUpdateLogCmd)
32+
}
33+
34+
func runGetUpdateLog(cmd *cobra.Command, args []string) {
35+
if updateLogBaseline == "" {
36+
logger.Warning("baseline is required")
37+
os.Exit(1)
38+
}
39+
40+
response, err := genUpdateLogResponse(updatePlatform.requestURL, updatePlatform.Token, updateLogBaseline, updateLogIsUnstable)
41+
if err != nil {
42+
logger.Warningf("genUpdateLogResponse failed: %v", err)
43+
os.Exit(1)
44+
}
45+
46+
data, err := getResponseData(response, GetUpdateLog)
47+
if err != nil {
48+
logger.Warningf("getResponseData failed: %v", err)
49+
os.Exit(1)
50+
}
51+
52+
logs := getUpdateLogData(data)
53+
if logs == nil {
54+
logger.Warning("failed to parse update log data")
55+
os.Exit(1)
56+
}
57+
58+
logger.Infof("Found %d update logs", len(logs))
59+
for i, log := range logs {
60+
logger.Infof("Log %d: Type=%s, Title=%s", i+1, log.Type, log.Title)
61+
logger.Debugf(" Content: %s", log.Content)
62+
}
63+
}
64+
65+
func genUpdateLogResponse(requestUrl, token, baseline string, isUnstable int) (*http.Response, error) {
66+
policyUrl := requestUrl + Urls[GetUpdateLog].path
67+
client := &http.Client{
68+
Timeout: 40 * time.Second,
69+
}
70+
values := url.Values{}
71+
values.Add("baseline", baseline)
72+
values.Add("isUnstable", fmt.Sprintf("%d", isUnstable))
73+
policyUrl = policyUrl + "?" + values.Encode()
74+
request, err := http.NewRequest(Urls[GetUpdateLog].method, policyUrl, nil)
75+
if err != nil {
76+
return nil, fmt.Errorf("%v new request failed: %v ", GetUpdateLog.string(), err.Error())
77+
}
78+
request.Header.Set("X-Repo-Token", base64.RawStdEncoding.EncodeToString([]byte(token)))
79+
return client.Do(request)
80+
}
81+
82+
func getUpdateLogData(data json.RawMessage) []UpdateLogMeta {
83+
var tmp []UpdateLogMeta
84+
err := json.Unmarshal(data, &tmp)
85+
if err != nil {
86+
logger.Warningf("%v failed to Unmarshal msg.Data to UpdateLogMeta: %v ", GetUpdateLog.string(), err.Error())
87+
return nil
88+
}
89+
return tmp
90+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
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+
return client.Do(request)
39+
}
40+
41+
// genUpdatePolicyByToken 检查更新时将token数据发送给更新平台,获取本次更新信息
42+
func (m *UpdatePlatformManager) genUpdatePolicyByToken() error {
43+
response, err := m.genVersionResponse()
44+
if err != nil {
45+
return fmt.Errorf("failed get version data %v", err)
46+
}
47+
logger.Debugf("response: %v", response)
48+
data, err := getResponseData(response, GetVersion)
49+
if err != nil {
50+
return fmt.Errorf("failed get version data %v", err)
51+
}
52+
msg := getVersionData(data)
53+
logger.Infof("msg: %s", spew.Sdump(msg))
54+
return nil
55+
}
56+
57+
var getVersionCmd = &cobra.Command{
58+
Use: "get_version",
59+
Short: "Get version information from update platform",
60+
Long: "Query the update platform for version information and update policy",
61+
Run: func(cmd *cobra.Command, args []string) {
62+
err := updatePlatform.genUpdatePolicyByToken()
63+
if err != nil {
64+
logger.Warningf("genUpdatePolicyByToken failed: %v", err)
65+
os.Exit(1)
66+
}
67+
},
68+
}
69+
70+
func init() {
71+
rootCmd.AddCommand(getVersionCmd)
72+
}

0 commit comments

Comments
 (0)