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
25 changes: 13 additions & 12 deletions src/lastore-daemon/manager_ifc.go
Original file line number Diff line number Diff line change
Expand Up @@ -745,23 +745,24 @@ func (m *Manager) SetUpdateSources(sender dbus.Sender, updateType system.UpdateT
func (m *Manager) ConfirmRollback(sender dbus.Sender, confirm bool) *dbus.Error {
var err error
if confirm {
go func() {
err = osTreeRollback()
needReboot := osTreeNeedRebootAfterRollback()
err = osTreeRollback()
if err != nil {
logger.Warning(err)
}
if m.grub != nil {
err = m.grub.changeGrubDefaultEntry(normalBootEntry)
if err != nil {
logger.Warning(err)
}
if m.grub != nil {
err = m.grub.changeGrubDefaultEntry(normalBootEntry)
if err != nil {
logger.Warning(err)
}
}
}

// 如果自动回滚,则无需重启
if !osTreeIsAutoRollback() {
m.PowerOff(sender, true)
if needReboot {
err := m.PowerOff(sender, true)
if err != nil {
logger.Warning(err)
}
}()
}
} else {
return m.PowerOff(sender, true)
}
Expand Down
48 changes: 29 additions & 19 deletions src/lastore-daemon/manager_upgrade.go
Original file line number Diff line number Diff line change
Expand Up @@ -590,6 +590,7 @@ type ostreeRollbackData struct {
Time int64 `json:"time"`
Name string `json:"name"`
Auto bool `json:"auto"`
Reboot bool `json:"reboot"`
}

type ostreeResponse struct {
Expand Down Expand Up @@ -623,11 +624,11 @@ func osTreeRollback() error {
return nil
}

func osTreeParseRollbackData() (*ostreeRollbackData, error) {
func osTreeParseRollbackData() (string, error) {
out, err := osTreeCmd([]string{"admin", "rollback", "--can-rollback", "-j"})
if err != nil {
logger.Warning("osTreeCmd failed:", err)
return nil, err
return "", err
}

logger.Info("osTree rollback output:", out)
Expand All @@ -636,44 +637,53 @@ func osTreeParseRollbackData() (*ostreeRollbackData, error) {
err = json.Unmarshal([]byte(out), &resp)
if err != nil {
logger.Warning("unmarshal ostree response failed:", err)
return nil, err
return "", err
}

if resp.Error != nil {
logger.Warning("ostree response has error:", resp.Error)
return nil, fmt.Errorf("ostree error: %v", resp.Error)
return "", fmt.Errorf("ostree error: %v", resp.Error)
}

var data ostreeRollbackData
err = json.Unmarshal(resp.Data, &data)
if err != nil {
logger.Warning("unmarshal rollback data failed:", err)
return nil, err
}

return &data, nil
return string(resp.Data), nil
}

func osTreeCanRollback() (bool, string) {
data, err := osTreeParseRollbackData()
dataJson, err := osTreeParseRollbackData()
if err != nil {
return false, ""
}

rawData, err := json.Marshal(data)
var data ostreeRollbackData
err = json.Unmarshal([]byte(dataJson), &data)
if err != nil {
return data.CanRollback, ""
return false, ""
}

return data.CanRollback, string(rawData)
return data.CanRollback, dataJson
}

func osTreeIsAutoRollback() bool {
data, err := osTreeParseRollbackData()
func osTreeNeedRebootAfterRollback() bool {
dataJson, err := osTreeParseRollbackData()
if err != nil {
return false
}
return data.Auto

var data ostreeRollbackData
err = json.Unmarshal([]byte(dataJson), &data)
if err != nil {
return false
}

// 兼容旧版本,Auto为true时,表示不需要重启
var rawData map[string]json.RawMessage
if err := json.Unmarshal([]byte(dataJson), &rawData); err == nil {
if _, hasReboot := rawData["reboot"]; !hasReboot {
return !data.Auto
}
}

return data.Reboot
}

func (m *Manager) preUpgradeCmdSuccessHook(job *Job, needChangeGrub bool, mode system.UpdateType, uuid string) error {
Expand Down