diff --git a/.gitignore b/.gitignore index 485dee64b..10abe99a7 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .idea +gopath \ No newline at end of file diff --git a/lib/systemd/system/lastore-daemon.service b/lib/systemd/system/lastore-daemon.service index 3bfa303f0..7e5eadf0b 100644 --- a/lib/systemd/system/lastore-daemon.service +++ b/lib/systemd/system/lastore-daemon.service @@ -6,7 +6,13 @@ After=display-manager.service Type=dbus BusName=org.deepin.dde.Lastore1 ExecStart=/usr/libexec/lastore-daemon/lastore-daemon + +Restart=on-failure +RestartForceExitStatus=2 +StartLimitBurst=0 + StandardOutput=null -StandardError=null +StandardError=journal + StateDirectory=lastore CacheDirectory=lastore \ No newline at end of file diff --git a/lib/tmpfiles.d/99lastore.conf b/lib/tmpfiles.d/99lastore.conf new file mode 100644 index 000000000..a93dd5881 --- /dev/null +++ b/lib/tmpfiles.d/99lastore.conf @@ -0,0 +1 @@ +r! /var/lib/lastore/lastore-download-delay \ No newline at end of file diff --git a/src/internal/system/apt/proxy.go b/src/internal/system/apt/proxy.go index 9af3519d9..fe28b239b 100644 --- a/src/internal/system/apt/proxy.go +++ b/src/internal/system/apt/proxy.go @@ -294,6 +294,9 @@ func (p *APTSystem) Install(jobId string, packages []string, environ map[string] return err } c := newAPTCommand(p, jobId, system.InstallJobType, p.Indicator, append(OptionToArgs(args), packages...)) + if environ == nil { + environ = make(map[string]string) + } environ["IMMUTABLE_DISABLE_REMOUNT"] = "false" c.SetEnv(environ) return safeStart(c) diff --git a/src/internal/updateplatform/message_report.go b/src/internal/updateplatform/message_report.go index a42d572e4..2c24be0cd 100644 --- a/src/internal/updateplatform/message_report.go +++ b/src/internal/updateplatform/message_report.go @@ -82,12 +82,15 @@ type UpdatePlatformManager struct { } type platformCacheContent struct { - CoreListPkgs map[string]system.PackageInfo - BaselinePkgs map[string]system.PackageInfo - SelectPkgs map[string]system.PackageInfo - PreCheck string - MidCheck string - PostCheck string + CoreListPkgs map[string]system.PackageInfo + BaselinePkgs map[string]system.PackageInfo + SelectPkgs map[string]system.PackageInfo + PreCheck string + MidCheck string + PostCheck string + Tp UpdateTp + UpdateTime string + UpdateNowForce bool } // 需要注意cache文件的同步时机,所有数据应该不会从os-version和os-baseline获取 @@ -134,6 +137,10 @@ func NewUpdatePlatformManager(c *Config, updateToken bool) *UpdatePlatformManage logger.Warning(err) } + updateTime, err := time.Parse(time.RFC3339, cache.UpdateTime) + if err != nil { + logger.Warning(err) + } return &UpdatePlatformManager{ config: c, allowPostSystemUpgradeMessageType: system.SystemUpdate, @@ -145,8 +152,9 @@ func NewUpdatePlatformManager(c *Config, updateToken bool) *UpdatePlatformManage cvePkgs: make(map[string][]string), Token: token, arch: arch, - Tp: UnknownUpdate, - UpdateNowForce: false, + Tp: cache.Tp, + UpdateNowForce: cache.UpdateNowForce, + UpdateTime: updateTime, jobPostMsgMap: getLocalJobPostMsg(), TargetCorePkgs: cache.CoreListPkgs, BaselinePkgs: cache.BaselinePkgs, @@ -1576,7 +1584,7 @@ func (m *UpdatePlatformManager) GetRules() []dut.RuleInfo { return rules } -func (m *UpdatePlatformManager) SaveCache(c *Config) { +func (m *UpdatePlatformManager) SaveCache() { cache := platformCacheContent{} cache.CoreListPkgs = m.TargetCorePkgs cache.BaselinePkgs = m.BaselinePkgs @@ -1584,12 +1592,15 @@ func (m *UpdatePlatformManager) SaveCache(c *Config) { cache.PreCheck = m.PreCheck cache.MidCheck = m.MidCheck cache.PostCheck = m.PostCheck + cache.Tp = m.Tp + cache.UpdateNowForce = m.UpdateNowForce + cache.UpdateTime = m.UpdateTime.Format(time.RFC3339) content, err := json.Marshal(cache) if err != nil { logger.Warning("marshal cache failed:", err) return } - err = c.SetOnlineCache(string(content)) + err = m.config.SetOnlineCache(string(content)) if err != nil { logger.Warning("save cache failed:", err) } diff --git a/src/lastore-daemon/main.go b/src/lastore-daemon/main.go index f02d24299..c859c611c 100644 --- a/src/lastore-daemon/main.go +++ b/src/lastore-daemon/main.go @@ -121,7 +121,7 @@ func main() { manager.reloadOemConfig(false) return nil }) - manager.refreshUpdateInfos(false) + manager.refreshUpdateInfos(false, false) manager.loadLastoreCache() // object导出前将job处理完成,否则控制中心继续任务时,StartJob会出现job未导出的情况 go manager.jobManager.Dispatch() // 导入job缓存之后,再执行job的dispatch,防止暂停任务创建时自动开始 err = serverObject.Export() diff --git a/src/lastore-daemon/manager.go b/src/lastore-daemon/manager.go index 834d9aea1..c4bf82c51 100644 --- a/src/lastore-daemon/manager.go +++ b/src/lastore-daemon/manager.go @@ -1108,10 +1108,11 @@ func (m *Manager) handleDownloadLimitChanged(job *Job) { } } -func (m *Manager) installSpecialPackageSync(pkgName string, option map[string]string, environ map[string]string) { +func (m *Manager) installSpecialPackageSync(pkgName string, option map[string]string, environ map[string]string) (bool, error) { if strv.Strv(m.updater.UpdatablePackages).Contains(pkgName) || system.QueryPackageInstallable(pkgName) { // 该包可更新或者该包未安装可以安装 var wg sync.WaitGroup + var installErr error wg.Add(1) m.do.Lock() @@ -1120,20 +1121,22 @@ func (m *Manager) installSpecialPackageSync(pkgName string, option map[string]st if err != nil { wg.Done() logger.Warning(err) - return + return false, nil } if isExist { wg.Done() - return + return false, nil } if installJob != nil { installJob.option = option installJob.setPreHooks(map[string]func() error{ string(system.FailedStatus): func() error { + installErr = fmt.Errorf("install package failed:%v", installJob.Description) wg.Done() return nil }, string(system.SucceedStatus): func() error { + installErr = nil wg.Done() return nil }, @@ -1141,11 +1144,16 @@ func (m *Manager) installSpecialPackageSync(pkgName string, option map[string]st if err := m.jobManager.addJob(installJob); err != nil { logger.Warning(err) wg.Done() - return + return false, err } } wg.Wait() + if installErr != nil { + return false, installErr + } + return true, nil } + return false, nil } // 只有初始化和检查更新的时候,才能更新系统和安全仓库的Dir,目的是保证检查、下载、安装过程中的一致性,不受配置修改的影响 diff --git a/src/lastore-daemon/manager_update.go b/src/lastore-daemon/manager_update.go index c788e5584..08a5abc91 100644 --- a/src/lastore-daemon/manager_update.go +++ b/src/lastore-daemon/manager_update.go @@ -10,6 +10,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/linuxdeepin/go-lib/utils" "os" "os/exec" "path/filepath" @@ -46,6 +47,8 @@ func prepareUpdateSource() { } +const UpgradePackageName = "TODO" + // updateSource 检查更新主要步骤:1.从更新平台获取数据并解析;2.apt update;3.最终可更新内容确定(模拟安装的方式);4.数据上报; // 任务进度划分: 0-10%-80%-90%-100% func (m *Manager) updateSource(sender dbus.Sender) (*Job, error) { @@ -122,9 +125,19 @@ func (m *Manager) updateSource(sender dbus.Sender) (*Job, error) { job.subRetryHookFn = func(j *Job) { handleUpdateSourceFailed(j) } + var installedUpgradePart bool + var installErr error job.setPreHooks(map[string]func() error{ string(system.SucceedStatus): func() error { - m.refreshUpdateInfos(true) + installedUpgradePart, installErr = m.installSpecialPackageSync(UpgradePackageName, nil, nil) + if installErr != nil { + logger.Warning(installErr) + go func() { + m.updatePlatform.PostStatusMessage(fmt.Sprintf("upgrade self failed:: %v", installErr)) + }() + } + m.updatePlatform.SaveCache() // updatePlatform初始化时自动 load 该配置; + m.refreshUpdateInfos(true, installedUpgradePart) m.PropsMu.Lock() m.updateSourceOnce = true m.PropsMu.Unlock() @@ -147,7 +160,7 @@ func (m *Manager) updateSource(sender dbus.Sender) (*Job, error) { defer m.inhibitAutoQuitCountSub() m.updatePlatform.PostStatusMessage("update source success") }() - m.updatePlatform.SaveCache(m.config) + job.setPropProgress(1.0) return nil }, @@ -186,6 +199,8 @@ func (m *Manager) updateSource(sender dbus.Sender) (*Job, error) { }) job.setAfterHooks(map[string]func() error{ string(system.RunningStatus): func() error { + // 清理自动下载的 flag + _ = os.RemoveAll(DelayAutoDownloadFlag) job.setPropProgress(0.01) _ = os.Setenv("http_proxy", environ["http_proxy"]) _ = os.Setenv("https_proxy", environ["https_proxy"]) @@ -224,6 +239,13 @@ func (m *Manager) updateSource(sender dbus.Sender) (*Job, error) { job.setPropProgress(0.10) return nil }, + string(system.EndStatus): func() error { + if installedUpgradePart { + logger.Info("enter end and exit 2") + os.Exit(2) + } + return nil + }, }) if err = m.jobManager.addJob(job); err != nil { @@ -456,8 +478,10 @@ func (m *Manager) getCoreList(online bool) []string { } const TimeOnly = "15:04:05" +const DelayAutoDownloadFlag = "/var/lib/lastore/lastore-download-delay" -func (m *Manager) refreshUpdateInfos(sync bool) { +func (m *Manager) refreshUpdateInfos(sync, delay bool) { + logger.Info("refreshUpdateInfos:", delay) // 检查更新时,同步修改canUpgrade状态;检查更新时需要同步操作 if sync { // 检查更新后,先下载解析coreList,获取必装清单 @@ -518,10 +542,22 @@ func (m *Manager) refreshUpdateInfos(sync bool) { // 强制更新开启后,以强制更新下载策略优先 return } - if m.updater.AutoDownloadUpdates && len(m.updater.UpdatablePackages) > 0 && sync && !m.updater.getIdleDownloadEnabled() { + if m.updater.AutoDownloadUpdates && len(m.updater.UpdatablePackages) > 0 && !m.updater.getIdleDownloadEnabled() { + if !sync && !utils.IsFileExist(DelayAutoDownloadFlag) { + // 没有标记文件的初始化,无需做自动下载操作 + return + } + if delay { + err := os.WriteFile(DelayAutoDownloadFlag, []byte{}, 0644) + if err != nil { + logger.Warning(err) + } + return + } logger.Info("auto download updates") go func() { m.inhibitAutoQuitCountAdd() + _ = os.RemoveAll(DelayAutoDownloadFlag) _, err := m.PrepareDistUpgrade(dbus.Sender(m.service.Conn().Names()[0])) if err != nil { logger.Error("failed to prepare dist-upgrade:", err)