Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions makefile
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,11 @@ build: prepare bin/lastore-agent bin/lastore-upgrade-query
${GoPath} ${GOBUILD_CGO_FLAGS} ${GOBUILD} -o bin/lastore-smartmirror-daemon ${GOBUILD_OPTIONS} ${GOPKG_PREFIX}/src/lastore-smartmirror-daemon || echo "build failed, disable smartmirror support "
${GoPath} ${GOBUILD_CGO_FLAGS} ${GOBUILD} -o bin/lastore-apt-clean ${GOBUILD_OPTIONS} ${GOPKG_PREFIX}/src/lastore-apt-clean

dev-tools: bin/iup-tool

bin/iup-tool:
${GoPath} ${GOBUILD_CGO_FLAGS} ${GOBUILD} -o bin/iup-tool ${GOBUILD_OPTIONS} ${GOPKG_PREFIX}/src/dev-tools/iup-tool

fetch-base-metadata:
./bin/lastore-tools update -r desktop -j applications -o var/lib/lastore/applications.json
./bin/lastore-tools update -r desktop -j categories -o var/lib/lastore/categories.json
Expand Down Expand Up @@ -106,3 +111,5 @@ clean:

check_code_quality:
${GoPath} go vet ./src/...

.PHONY: dev-tools bin/iup-tool
89 changes: 89 additions & 0 deletions src/dev-tools/iup-tool/cmd_get_current_packages.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package main

import (
"encoding/base64"
"encoding/json"
"fmt"
"net/http"
"net/url"
"os"
"time"

"github.com/spf13/cobra"
)

var getCurrentPackagesCmd = &cobra.Command{
Use: "get_current_packages",
Short: "Get current package lists from update platform",
Long: "Query the update platform for current version package lists",
Run: runGetCurrentPackages,
}

var currentPkgBaseline string

func init() {
getCurrentPackagesCmd.Flags().StringVarP(&currentPkgBaseline, "baseline", "b", "", "Current baseline number (required)")
_ = getCurrentPackagesCmd.MarkFlagRequired("baseline")
rootCmd.AddCommand(getCurrentPackagesCmd)
}

func runGetCurrentPackages(cmd *cobra.Command, args []string) {
if currentPkgBaseline == "" {
logger.Warning("baseline is required")
os.Exit(1)
}

response, err := genCurrentPkgListsResponse(updatePlatform.requestURL, updatePlatform.Token, currentPkgBaseline)
if err != nil {
logger.Warningf("genCurrentPkgListsResponse failed: %v", err)
os.Exit(1)
}

data, err := getResponseData(response, GetCurrentPkgLists)
if err != nil {
logger.Warningf("getResponseData failed: %v", err)
os.Exit(1)
}

pkgs := getCurrentPkgListsData(data)
if pkgs == nil {
logger.Warning("failed to parse current package list data")
os.Exit(1)
}

logger.Infof("Current Package Lists for baseline: %s", currentPkgBaseline)
logger.Infof("PreCheck scripts: %d", len(pkgs.PreCheck))
logger.Infof("MidCheck scripts: %d", len(pkgs.MidCheck))
logger.Infof("PostCheck scripts: %d", len(pkgs.PostCheck))
logger.Infof("Core packages: %d", len(pkgs.Packages.Core))
logger.Infof("Select packages: %d", len(pkgs.Packages.Select))
logger.Infof("Freeze packages: %d", len(pkgs.Packages.Freeze))
logger.Infof("Purge packages: %d", len(pkgs.Packages.Purge))
}

func genCurrentPkgListsResponse(requestUrl, token, baseline string) (*http.Response, error) {
policyUrl := requestUrl + Urls[GetCurrentPkgLists].path
client := &http.Client{
Timeout: 40 * time.Second,
}
values := url.Values{}
values.Add("baseline", baseline)
policyUrl = policyUrl + "?" + values.Encode()
request, err := http.NewRequest(Urls[GetCurrentPkgLists].method, policyUrl, nil)
if err != nil {
return nil, fmt.Errorf("%v new request failed: %v ", GetCurrentPkgLists.string(), err.Error())
}
request.Header.Set("X-Repo-Token", base64.RawStdEncoding.EncodeToString([]byte(token)))
logRequestHeaders(request)
return client.Do(request)
}

func getCurrentPkgListsData(data json.RawMessage) *PreInstalledPkgMeta {
tmp := &PreInstalledPkgMeta{}
err := json.Unmarshal(data, &tmp)
if err != nil {
logger.Warningf("%v failed to Unmarshal msg.Data to PreInstalledPkgMeta: %v ", GetCurrentPkgLists.string(), err.Error())
return nil
}
return tmp
}
90 changes: 90 additions & 0 deletions src/dev-tools/iup-tool/cmd_get_cve_info.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package main

import (
"encoding/base64"
"encoding/json"
"fmt"
"net/http"
"net/url"
"os"
"time"

"github.com/spf13/cobra"
)

var getCVEInfoCmd = &cobra.Command{
Use: "get_cve_info",
Short: "Get CVE vulnerability information from update platform",
Long: "Query the update platform for CVE (Common Vulnerabilities and Exposures) information",
Run: runGetCVEInfo,
}

var cveSyncTime string

func init() {
getCVEInfoCmd.Flags().StringVarP(&cveSyncTime, "sync-time", "s", "", "Sync time for CVE data (optional, format: 2006-01-02)")
rootCmd.AddCommand(getCVEInfoCmd)
}

func runGetCVEInfo(cmd *cobra.Command, args []string) {
response, err := genCVEInfoResponse(updatePlatform.requestURL, updatePlatform.Token, cveSyncTime)
if err != nil {
logger.Warningf("genCVEInfoResponse failed: %v", err)
os.Exit(1)
}

data, err := getResponseData(response, GetPkgCVEs)
if err != nil {
logger.Warningf("getResponseData failed: %v", err)
os.Exit(1)
}

cveMeta := getCVEData(data)
if cveMeta == nil {
logger.Warning("failed to parse CVE data")
os.Exit(1)
}

logger.Infof("CVE Data Time: %s", cveMeta.DataTime)
logger.Infof("Total CVEs: %d", len(cveMeta.CVEs))
logger.Infof("Total Packages with CVEs: %d", len(cveMeta.PkgCVEs))

// 打印部分CVE信息
count := 0
for cveID, cveInfo := range cveMeta.CVEs {
if count >= 10 {
logger.Infof("... and %d more CVEs", len(cveMeta.CVEs)-10)
break
}
logger.Infof("CVE %s: Severity=%s", cveID, cveInfo.Severity)
logger.Debugf(" Description: %s", cveInfo.Description)
count++
}
}

func genCVEInfoResponse(requestUrl, token, syncTime string) (*http.Response, error) {
policyUrl := requestUrl + Urls[GetPkgCVEs].path
client := &http.Client{
Timeout: 40 * time.Second,
}
values := url.Values{}
values.Add("synctime", syncTime)
policyUrl = policyUrl + "?" + values.Encode()
request, err := http.NewRequest(Urls[GetPkgCVEs].method, policyUrl, nil)
if err != nil {
return nil, fmt.Errorf("%v new request failed: %v ", GetPkgCVEs.string(), err.Error())
}
request.Header.Set("X-Repo-Token", base64.RawStdEncoding.EncodeToString([]byte(token)))
logRequestHeaders(request)
return client.Do(request)
}

func getCVEData(data json.RawMessage) *CVEMeta {
tmp := &CVEMeta{}
err := json.Unmarshal(data, &tmp)
if err != nil {
logger.Warningf("%v failed to Unmarshal msg.Data to CVEMeta: %v ", GetPkgCVEs.string(), err.Error())
return nil
}
return tmp
}
87 changes: 87 additions & 0 deletions src/dev-tools/iup-tool/cmd_get_update_log.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package main

import (
"encoding/base64"
"encoding/json"
"fmt"
"net/http"
"net/url"
"os"
"time"

"github.com/davecgh/go-spew/spew"
"github.com/spf13/cobra"
)

var getUpdateLogCmd = &cobra.Command{
Use: "get_update_log",
Short: "Get system update logs from update platform",
Long: "Query the update platform for system update logs based on baseline and unstable version",
Run: runGetUpdateLog,
}

var (
updateLogBaseline string
updateLogIsUnstable int
)

func init() {
getUpdateLogCmd.Flags().StringVarP(&updateLogBaseline, "baseline", "b", "", "Target baseline number (required)")
getUpdateLogCmd.Flags().IntVarP(&updateLogIsUnstable, "is-unstable", "u", 1, "Is unstable version (1 for release, 2 for unstable)")
_ = getUpdateLogCmd.MarkFlagRequired("baseline")
rootCmd.AddCommand(getUpdateLogCmd)
}

func runGetUpdateLog(cmd *cobra.Command, args []string) {
if updateLogBaseline == "" {
logger.Warning("baseline is required")
os.Exit(1)
}

response, err := genUpdateLogResponse(updatePlatform.requestURL, updatePlatform.Token, updateLogBaseline, updateLogIsUnstable)
if err != nil {
logger.Warningf("genUpdateLogResponse failed: %v", err)
os.Exit(1)
}

data, err := getResponseData(response, GetUpdateLog)
if err != nil {
logger.Warningf("getResponseData failed: %v", err)
os.Exit(1)
}

logs := getUpdateLogData(data)
if logs == nil {
logger.Warning("failed to parse update log data")
os.Exit(1)
}
logger.Debugf("Update Log Data: %v", spew.Sdump(logs))
}

func genUpdateLogResponse(requestUrl, token, baseline string, isUnstable int) (*http.Response, error) {
policyUrl := requestUrl + Urls[GetUpdateLog].path
client := &http.Client{
Timeout: 40 * time.Second,
}
values := url.Values{}
values.Add("baseline", baseline)
values.Add("isUnstable", fmt.Sprintf("%d", isUnstable))
policyUrl = policyUrl + "?" + values.Encode()
request, err := http.NewRequest(Urls[GetUpdateLog].method, policyUrl, nil)
if err != nil {
return nil, fmt.Errorf("%v new request failed: %v ", GetUpdateLog.string(), err.Error())
}
request.Header.Set("X-Repo-Token", base64.RawStdEncoding.EncodeToString([]byte(token)))
logRequestHeaders(request)
return client.Do(request)
}

func getUpdateLogData(data json.RawMessage) []UpdateLogMeta {
var tmp []UpdateLogMeta
err := json.Unmarshal(data, &tmp)
if err != nil {
logger.Warningf("%v failed to Unmarshal msg.Data to UpdateLogMeta: %v ", GetUpdateLog.string(), err.Error())
return nil
}
return tmp
}
73 changes: 73 additions & 0 deletions src/dev-tools/iup-tool/cmd_get_version.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package main

import (
"encoding/base64"
"encoding/json"
"fmt"
"net/http"
"os"
"time"

"github.com/davecgh/go-spew/spew"
"github.com/spf13/cobra"
)

// getVersionData 解析版本数据
func getVersionData(data json.RawMessage) *updateMessage {
tmp := &updateMessage{}
err := json.Unmarshal(data, &tmp)
if err != nil {
logger.Warningf("%v failed to Unmarshal msg.Data to updateMessage: %v ", GetVersion.string(), err.Error())
return nil
}
return tmp
}

// genVersionResponse 生成版本请求
func (m *UpdatePlatformManager) genVersionResponse() (*http.Response, error) {
policyURL := m.requestURL + Urls[GetVersion].path
client := &http.Client{
Timeout: 40 * time.Second,
}
request, err := http.NewRequest(Urls[GetVersion].method, policyURL, nil)
if err != nil {
return nil, fmt.Errorf("%v new request failed: %v ", GetVersion.string(), err.Error())
}
request.Header.Set("X-Repo-Token", base64.RawStdEncoding.EncodeToString([]byte(m.Token)))
request.Header.Set("X-Packages", base64.RawStdEncoding.EncodeToString([]byte(getClientPackageInfo(""))))
logRequestHeaders(request)
return client.Do(request)
}

// genUpdatePolicyByToken 检查更新时将token数据发送给更新平台,获取本次更新信息
func (m *UpdatePlatformManager) genUpdatePolicyByToken() error {
response, err := m.genVersionResponse()
if err != nil {
return fmt.Errorf("failed get version data %v", err)
}
logger.Debugf("response: %v", response)
data, err := getResponseData(response, GetVersion)
if err != nil {
return fmt.Errorf("failed get version data %v", err)
}
msg := getVersionData(data)
logger.Infof("msg: %s", spew.Sdump(msg))
return nil
}

var getVersionCmd = &cobra.Command{
Use: "get_version",
Short: "Get version information from update platform",
Long: "Query the update platform for version information and update policy",
Run: func(cmd *cobra.Command, args []string) {
err := updatePlatform.genUpdatePolicyByToken()
if err != nil {
logger.Warningf("genUpdatePolicyByToken failed: %v", err)
os.Exit(1)
}
},
}

func init() {
rootCmd.AddCommand(getVersionCmd)
}
Loading
Loading