diff --git a/src/internal/updateplatform/message_report.go b/src/internal/updateplatform/message_report.go index 7ab1244f5..508da4bb0 100644 --- a/src/internal/updateplatform/message_report.go +++ b/src/internal/updateplatform/message_report.go @@ -45,6 +45,14 @@ type ShellCheck struct { Shell string `json:"shell"` //检查脚本的内容 } +// 发送给更新平台的状态信息 +type StatusMessage struct { + Type string `json:"type"` //消息类型,info,warning,error + UpdateType string `json:"updateType"` //system.UpdateType类型 + JobDescription string `json:"jobDescription"` //job.Description + Detail string `json:"detail"` //消息详情 +} + type UpdatePlatformManager struct { config *Config allowPostSystemUpgradeMessageType system.UpdateType @@ -1316,12 +1324,19 @@ func (m *UpdatePlatformManager) UpdateAllPlatformDataSync() error { } // PostStatusMessage 将检查\下载\安装过程中所有异常状态和每个阶段成功的正常状态上报 -func (m *UpdatePlatformManager) PostStatusMessage(body string) { - logger.Debug("post status msg:", body) +func (m *UpdatePlatformManager) PostStatusMessage(message StatusMessage) { + logger.Debugf("post status msg, type:%v, detail:%v", message.Type, message.Detail) if (m.config.PlatformDisabled & DisabledProcess) != 0 { return } - buf := bytes.NewBufferString(body) + + msg, err := json.Marshal(message) + if err != nil { + logger.Warningf("marshal status message failed:%v", err) + return + } + + buf := bytes.NewBufferString(string(msg)) filePath := fmt.Sprintf("/tmp/%s_%s.xz", "update", time.Now().Format("20231019102233444")) response, err := m.genPostProcessResponse(buf, filePath) if err != nil { diff --git a/src/lastore-daemon/manager.go b/src/lastore-daemon/manager.go index e1d3c1223..a294728ae 100644 --- a/src/lastore-daemon/manager.go +++ b/src/lastore-daemon/manager.go @@ -162,7 +162,12 @@ func NewManager(service *dbusutil.Service, updateApi system.System, c *config.Co if c.UpgradeStatus.Status == system.UpgradeRunning { m.rebootTimeoutTimer = time.AfterFunc(600*time.Second, func() { // 启动后600s如果没有触发检查,那么上报更新失败 - m.updatePlatform.PostStatusMessage(fmt.Sprintf("the check has not been triggered after reboot for 600 seconds")) + + m.updatePlatform.PostStatusMessage(updateplatform.StatusMessage{ + Type: "error", + Detail: "the check has not been triggered after reboot for 600 seconds", + }) + err = m.delRebootCheckOption(all) if err != nil { logger.Warning(err) @@ -895,6 +900,7 @@ func (m *Manager) sendNotify(appName string, replacesId uint32, appIcon string, cmdArgs := []string{ "-u", username, "DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/" + strconv.Itoa(int(uid)) + "/bus", } + // 安全地添加参数,避免命令注入 cmdArgs = append(cmdArgs, args...) cmd := exec.Command("sudo", cmdArgs...) logger.Info(cmd.String()) @@ -909,7 +915,9 @@ func (m *Manager) sendNotify(appName string, replacesId uint32, appIcon string, } else { str := outBuffer.String() if len(str) >= 12 { - num, err := strconv.ParseUint(str[8:len(str)-3], 10, 0) + // 确保解析的字符串是有效的数字 + numStr := str[8 : len(str)-3] + num, err := strconv.ParseUint(numStr, 10, 32) if err != nil { logger.Warning(err) } else { @@ -949,6 +957,7 @@ func (m *Manager) closeNotify(id uint32) error { cmdArgs := []string{ "-u", username, "DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/" + strconv.Itoa(int(uid)) + "/bus", } + // 安全地添加参数,避免命令注入 cmdArgs = append(cmdArgs, args...) cmd := exec.Command("sudo", cmdArgs...) logger.Info(cmd.String()) diff --git a/src/lastore-daemon/manager_check.go b/src/lastore-daemon/manager_check.go index 8adfdc737..0809f9163 100644 --- a/src/lastore-daemon/manager_check.go +++ b/src/lastore-daemon/manager_check.go @@ -114,7 +114,14 @@ func (m *Manager) checkUpgrade(sender dbus.Sender, checkMode system.UpdateType, go func() { m.inhibitAutoQuitCountAdd() defer m.inhibitAutoQuitCountSub() - m.updatePlatform.PostStatusMessage(fmt.Sprintf("%v postcheck error: %v", checkOrder.JobType(), job.Description)) + + m.updatePlatform.PostStatusMessage(updateplatform.StatusMessage{ + Type: "error", + UpdateType: checkOrder.JobType(), + JobDescription: job.Description, + Detail: fmt.Sprintf("%v postcheck error: %v", checkOrder.JobType(), job.Description), + }) + m.reportLog(upgradeStatusReport, false, job.Description) }() inhibit(false) diff --git a/src/lastore-daemon/manager_download.go b/src/lastore-daemon/manager_download.go index d95ca168b..d87b7fbeb 100644 --- a/src/lastore-daemon/manager_download.go +++ b/src/lastore-daemon/manager_download.go @@ -187,7 +187,13 @@ func (m *Manager) prepareDistUpgrade(sender dbus.Sender, origin system.UpdateTyp m.inhibitAutoQuitCountAdd() defer m.inhibitAutoQuitCountSub() m.reportLog(downloadStatusReport, false, j.Description) - m.updatePlatform.PostStatusMessage(fmt.Sprintf("download %v package failed, detail is %v", mode.JobType(), job.Description)) // 上报下载失败状态 + // 上报下载失败状态 + m.updatePlatform.PostStatusMessage(updateplatform.StatusMessage{ + Type: "error", + UpdateType: mode.JobType(), + JobDescription: job.Description, + Detail: fmt.Sprintf("download %v package failed, detail is %v", mode.JobType(), job.Description), + }) }() return nil }, @@ -220,7 +226,14 @@ func (m *Manager) prepareDistUpgrade(sender dbus.Sender, origin system.UpdateTyp m.inhibitAutoQuitCountSub() } } - m.updatePlatform.PostStatusMessage(fmt.Sprintf("download %v package success", j.updateTyp.JobType())) // 上报下载成功状态 + + // 上报下载成功状态 + m.updatePlatform.PostStatusMessage(updateplatform.StatusMessage{ + Type: "info", + UpdateType: j.updateTyp.JobType(), + JobDescription: j.Description, + Detail: fmt.Sprintf("download %v package success", j.updateTyp.JobType()), + }) return nil }, string(system.EndStatus): func() error { diff --git a/src/lastore-daemon/manager_update.go b/src/lastore-daemon/manager_update.go index e251b5f04..7178441dd 100644 --- a/src/lastore-daemon/manager_update.go +++ b/src/lastore-daemon/manager_update.go @@ -150,7 +150,10 @@ func (m *Manager) updateSource(sender dbus.Sender) (*Job, error) { go func() { m.inhibitAutoQuitCountAdd() defer m.inhibitAutoQuitCountSub() - m.updatePlatform.PostStatusMessage("update source success") + m.updatePlatform.PostStatusMessage(updateplatform.StatusMessage{ + Type: "info", + Detail: "update source success", + }) }() m.updatePlatform.SaveCache(m.config) job.setPropProgress(1.0) @@ -177,7 +180,12 @@ func (m *Manager) updateSource(sender dbus.Sender) (*Job, error) { m.inhibitAutoQuitCountAdd() defer m.inhibitAutoQuitCountSub() m.reportLog(updateStatusReport, false, job.Description) - m.updatePlatform.PostStatusMessage(fmt.Sprintf("apt-get update failed, detail is %v , option is %+v", job.Description, job.option)) + + m.updatePlatform.PostStatusMessage(updateplatform.StatusMessage{ + Type: "error", + JobDescription: job.Description, + Detail: fmt.Sprintf("apt-get update failed, detail is %v , option is %+v", job.Description, job.option), + }) }() return nil }, @@ -472,7 +480,10 @@ func (m *Manager) refreshUpdateInfos(sync bool) { go func() { m.inhibitAutoQuitCountAdd() defer m.inhibitAutoQuitCountSub() - m.updatePlatform.PostStatusMessage(fmt.Sprintf("generate package list error, detail is %v:", e)) + m.updatePlatform.PostStatusMessage(updateplatform.StatusMessage{ + Type: "error", + Detail: fmt.Sprintf("generate package list error, detail is %v:", e), + }) }() logger.Warning(e) } @@ -488,7 +499,12 @@ func (m *Manager) refreshUpdateInfos(sync bool) { go func() { m.inhibitAutoQuitCountAdd() defer m.inhibitAutoQuitCountSub() - m.updatePlatform.PostStatusMessage(fmt.Sprintf("generate package list error, detail is %v:", e)) + + m.updatePlatform.PostStatusMessage(updateplatform.StatusMessage{ + Type: "error", + Detail: fmt.Sprintf("generate package list error, detail is %v:", e), + }) + }() logger.Warning(e) } diff --git a/src/lastore-daemon/manager_upgrade.go b/src/lastore-daemon/manager_upgrade.go index 1b6a32c0b..d411cc8aa 100644 --- a/src/lastore-daemon/manager_upgrade.go +++ b/src/lastore-daemon/manager_upgrade.go @@ -360,7 +360,13 @@ func (m *Manager) distUpgrade(sender dbus.Sender, mode system.UpdateType, needAd uuid, err = m.prepareAptCheck(mode) if err != nil { logger.Warning(err) - m.updatePlatform.PostStatusMessage(fmt.Sprintf("%v gen dut meta failed, detail is: %v", mode.JobType(), err.Error())) + + m.updatePlatform.PostStatusMessage(updateplatform.StatusMessage{ + Type: "error", + UpdateType: mode.JobType(), + Detail: fmt.Sprintf("%v gen dut meta failed, detail is: %v", mode.JobType(), err.Error()), + }) + if unref != nil { unref() } @@ -371,7 +377,12 @@ func (m *Manager) distUpgrade(sender dbus.Sender, mode system.UpdateType, needAd systemErr := dut.CheckSystem(dut.PreCheck, nil) // 只是为了执行precheck的hook脚本 if systemErr != nil { logger.Info(systemErr) - m.updatePlatform.PostStatusMessage(fmt.Sprintf("%v CheckSystem failed, detail is: %v", mode.JobType(), systemErr.Error())) + + m.updatePlatform.PostStatusMessage(updateplatform.StatusMessage{ + Type: "error", + UpdateType: mode.JobType(), + Detail: fmt.Sprintf("%v CheckSystem failed, detail is: %v", mode.JobType(), systemErr.Error()), + }) return systemErr } if !system.CheckInstallAddSize(mode) { @@ -395,7 +406,12 @@ func (m *Manager) distUpgrade(sender dbus.Sender, mode system.UpdateType, needAd systemErr := dut.CheckSystem(dut.MidCheck, nil) if systemErr != nil { logger.Info(systemErr) - m.updatePlatform.PostStatusMessage(fmt.Sprintf("%v CheckSystem failed, detail is: %v", mode.JobType(), systemErr.Error())) + + m.updatePlatform.PostStatusMessage(updateplatform.StatusMessage{ + Type: "error", + UpdateType: mode.JobType(), + Detail: fmt.Sprintf("%v CheckSystem failed, detail is: %v", mode.JobType(), systemErr.Error()), + }) return systemErr } if m.statusManager.abStatus == system.HasBackedUp { @@ -592,7 +608,12 @@ func (m *Manager) preFailedHook(job *Job, mode system.UpdateType, uuid string) e allErrMsg = append(allErrMsg, string(msg)) } } - m.updatePlatform.PostStatusMessage(fmt.Sprintf("%v upgrade failed, detail is: %v; all error message is %v", mode.JobType(), job.Description, strings.Join(allErrMsg, "\n"))) + + m.updatePlatform.PostStatusMessage(updateplatform.StatusMessage{ + Type: "error", + UpdateType: mode.JobType(), + Detail: fmt.Sprintf("%v upgrade failed, detail is: %v; all error message is %v", mode.JobType(), job.Description, strings.Join(allErrMsg, "\n")), + }) }() m.statusManager.SetUpdateStatus(mode, system.UpgradeErr) // 如果安装失败,那么需要将version文件一直缓存,防止下次检查更新时version版本变高 @@ -612,7 +633,11 @@ func (m *Manager) preUpgradeCmdSuccessHook(job *Job, needChangeGrub bool, mode s } m.statusManager.SetUpdateStatus(mode, system.Upgraded) job.setPropProgress(1.00) - m.updatePlatform.PostStatusMessage(fmt.Sprintf("%v install package success,need reboot and check", mode)) + + m.updatePlatform.PostStatusMessage(updateplatform.StatusMessage{ + Type: "info", + Detail: fmt.Sprintf("%v install package success, need reboot and check", mode.JobType()), + }) return nil }