Skip to content
Open
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
.idea
gopath
8 changes: 7 additions & 1 deletion lib/systemd/system/lastore-daemon.service
Original file line number Diff line number Diff line change
Expand Up @@ -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
1 change: 1 addition & 0 deletions lib/tmpfiles.d/99lastore.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
r! /var/lib/lastore/lastore-download-delay
3 changes: 3 additions & 0 deletions src/internal/system/apt/proxy.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
31 changes: 21 additions & 10 deletions src/internal/updateplatform/message_report.go
Original file line number Diff line number Diff line change
Expand Up @@ -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获取
Expand Down Expand Up @@ -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,
Expand All @@ -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,
Expand Down Expand Up @@ -1576,20 +1584,23 @@ 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
cache.SelectPkgs = m.SelectPkgs
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)
}
Expand Down
2 changes: 1 addition & 1 deletion src/lastore-daemon/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
16 changes: 12 additions & 4 deletions src/lastore-daemon/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -1120,32 +1121,39 @@ 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
},
})
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,目的是保证检查、下载、安装过程中的一致性,不受配置修改的影响
Expand Down
44 changes: 40 additions & 4 deletions src/lastore-daemon/manager_update.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"encoding/json"
"errors"
"fmt"
"github.com/linuxdeepin/go-lib/utils"
"os"
"os/exec"
"path/filepath"
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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()
Expand All @@ -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
},
Expand Down Expand Up @@ -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"])
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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,获取必装清单
Expand Down Expand Up @@ -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)
Expand Down
Loading