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
27 changes: 27 additions & 0 deletions src/internal/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ type Config struct {
EnableVersionCheck bool
UpdateProcessUpload bool
PlatformRepoComponents string // 更新平台仓库组件
UpgradeDeliveryEnabled bool // 传递优化服务是否开机可用

ClassifiedUpdatablePackages map[string][]string
OnlineCache string
Expand Down Expand Up @@ -200,6 +201,7 @@ const (
dSettingsKeyUpdateProcessUpload = "update-process-upload"
dSettingsKeyEnableCoreList = "enable-core-list"
dSettingsKeyClientPackageName = "client-package-name"
dSettingsKeyUpgradeDeliveryEnabled = "upgrade-delivery-enabled"
dSettingsKeySystemCustomSource = "system-custom-source"
dSettingsKeySecurityCustomSource = "security-custom-source"
dSettingsKeySystemRepoType = "system-repo-type"
Expand Down Expand Up @@ -607,6 +609,26 @@ func getConfigFromDSettings() *Config {
c.ClientPackageName = v.Value().(string)
}

updateUpgradeDeliveryEnabled := func() {
v, err = c.dsLastoreManager.Value(0, dSettingsKeyUpgradeDeliveryEnabled)
if err != nil {
logger.Warning(err)
c.UpgradeDeliveryEnabled = false
} else {
c.UpgradeDeliveryEnabled = v.Value().(bool)
}
}
updateUpgradeDeliveryEnabled()
_, err = c.dsLastoreManager.ConnectValueChanged(func(key string) {
switch key {
case dSettingsKeyUpgradeDeliveryEnabled:
updateUpgradeDeliveryEnabled()
}
})
if err != nil {
logger.Warning(err)
}

v, err = c.dsLastoreManager.Value(0, dSettingsKeySystemCustomSource)
if err != nil {
logger.Warning(err)
Expand Down Expand Up @@ -929,6 +951,11 @@ func (c *Config) SetSystemRepoType(typ RepoType) error {
return c.save(dSettingsKeySystemRepoType, typ)
}

func (c *Config) SetUpgradeDeliveryEnabled(enable bool) error {
c.UpgradeDeliveryEnabled = enable
return c.save(dSettingsKeyUpgradeDeliveryEnabled, enable)
}

func (c *Config) SetSecurityRepoType(typ RepoType) error {
c.SecurityRepoType = typ
return c.save(dSettingsKeySecurityRepoType, typ)
Expand Down
75 changes: 75 additions & 0 deletions src/internal/system/update_type.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,20 @@ package system
import (
"errors"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"strings"

"github.com/linuxdeepin/go-lib/strv"
"github.com/linuxdeepin/go-lib/utils"
)

type UpdateType uint64

// org.deepin.upgradedelivery的ServiceStatus返回的服务状态。1为可用,2为不可用,0为未知
const UpgradeDeliveryEnable int32 = 1

// 用于设置UpdateMode属性,最大支持64位
const (
SystemUpdate UpdateType = 1 << 0 // 系统仓库更新,检查该仓库,显示更新内容
Expand Down Expand Up @@ -168,6 +173,76 @@ func UpdateSystemDefaultSourceDir(sourceList []string) error {
return nil
}

func UpdateP2pDefaultSourceDir(updateType UpdateType, upgradeDeliveryEnabled bool) {
if !upgradeDeliveryEnabled {
return
}
var sourceDir string
switch updateType {
case SystemUpdate:
sourceDir = SoftLinkSystemSourceDir
case SecurityUpdate:
sourceDir = SecuritySourceDir
}
p2pSource, err := ioutil.TempFile("/tmp", "p2pSource.*.list")
defer os.Remove(p2pSource.Name())
//从SystemSource.d或SecuritySource.d中读取每个文件内容并将协议替换成delivery协议后存放到/tmp中
//这么做为了保证替换协议的原子性
files, err := ioutil.ReadDir(sourceDir)
if err != nil {
logger.Warningf("Error writing dir: %s err:%v", sourceDir, err)
return
}
for _, file := range files {
var content []byte
filePath := filepath.Join(sourceDir, file.Name())
if utils.IsSymlink(filePath) {
targetPath, err := os.Readlink(filePath)
if err != nil {
logger.Warningf("Error read link: %s err:%v", filePath, err)
continue
}
if !utils.IsFileExist(targetPath) {
logger.Warningf("target file is not exist: %s err:%v", filePath, err)
continue
}
content, err = ioutil.ReadFile(targetPath)
if err != nil {
logger.Warningf("Error reading file: %v\n", err)
return
}
} else {
content, err = ioutil.ReadFile(filePath)
if err != nil {
logger.Warningf("Error reading file: %v\n", err)
return
}
}
var newContent string
newContent = strings.ReplaceAll(string(content), "https://", "delivery://")
_, err = p2pSource.Write([]byte(newContent))
if err != nil {
logger.Warningf("Error writing file: %v\n", err)
return
}
}
//所有协议均正常替换后重新创建SystemSource.d或SecuritySource.d,再讲/tmp中的文件拷贝过去
err = os.RemoveAll(sourceDir)
if err != nil {
logger.Warning(err)
return
}
err = os.MkdirAll(sourceDir, 0755)
if err != nil {
logger.Warning(err)
return
}
err = utils.MoveFile(p2pSource.Name(), filepath.Join(sourceDir, filepath.Base(p2pSource.Name())))
if err != nil {
logger.Warning(err)
}
}

func UpdateSecurityDefaultSourceDir(sourceList []string) error {
err := os.RemoveAll(SecuritySourceDir)
if err != nil {
Expand Down
5 changes: 5 additions & 0 deletions src/internal/updateplatform/message_report.go
Original file line number Diff line number Diff line change
Expand Up @@ -1236,6 +1236,11 @@ func (m *UpdatePlatformManager) updateLogMetaSync() error {
func (m *UpdatePlatformManager) genDepositoryFromPlatform() {
var repos []string
for _, repo := range m.repoInfos {

if m.config.UpgradeDeliveryEnabled {
repo.Source = strings.ReplaceAll(repo.Source, "https://", "delivery://")
repo.Uri = strings.ReplaceAll(repo.Uri, "https://", "delivery://")
}
if strings.HasPrefix(repo.Source, "deb ") {
repos = append(repos, repo.Source)
} else {
Expand Down
3 changes: 2 additions & 1 deletion src/lastore-daemon/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ import (
"github.com/linuxdeepin/go-lib/strv"
)

var _urlReg = regexp.MustCompile(`^[ ]*deb .*((?:https?|ftp|file|p2p)://[^ ]+)`)
var _urlReg = regexp.MustCompile(`^[ ]*deb .*((?:https?|ftp|file|p2p|delivery)://[^ ]+)`)

const lastoreGatherInfo = "lastoreGatherInfo"

Expand Down Expand Up @@ -597,6 +597,7 @@ func checkSenderNsMntValid(pid uint32) bool {
}

const polkitActionChangeOwnData = "org.deepin.dde.accounts.user-administration"
const polkitActionChangeUpgradeDelivery = "com.deepin.lastore.doUpgradeDelivery"

func checkInvokePermission(service *dbusutil.Service, sender dbus.Sender) error {
uid, err := service.GetConnUID(string(sender))
Expand Down
16 changes: 10 additions & 6 deletions src/lastore-daemon/dbusutil.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions src/lastore-daemon/exported_methods_auto.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions src/lastore-daemon/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,8 @@ type Manager struct {
logFds []*os.File
logFdsMu sync.Mutex
logTmpFile *os.File

UpgradeDeliveryEnabled bool
}

/*
Expand Down
2 changes: 2 additions & 0 deletions src/lastore-daemon/manager_update.go
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,8 @@ func (m *Manager) updateSource(sender dbus.Sender) (*Job, error) {
}
prepareUpdateSource()
m.reloadOemConfig(true)
system.UpdateP2pDefaultSourceDir(system.SystemUpdate, m.updater.P2PUpdateEnable)
system.UpdateP2pDefaultSourceDir(system.SecurityUpdate, m.updater.P2PUpdateEnable)
m.updatePlatform.Token = updateplatform.UpdateTokenConfigFile(m.config.IncludeDiskInfo, m.config.GetHardwareIdByHelper)
m.jobManager.dispatch() // 解决 bug 59351问题(防止CreatJob获取到状态为end但是未被删除的job)
var job *Job
Expand Down
77 changes: 50 additions & 27 deletions src/lastore-daemon/updater.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
package main

import (
"context"
"encoding/json"
"errors"
"fmt"
Expand Down Expand Up @@ -78,8 +79,8 @@ type Updater struct {

UpdateTarget string

p2PUpdateEnable bool // p2p更新是否开启
p2PUpdateSupport bool // 是否支持p2p更新
P2PUpdateEnable bool // p2p更新是否开启
P2PUpdateSupport bool // 是否支持p2p更新
}

func NewUpdater(service *dbusutil.Service, m *Manager, config *Config) *Updater {
Expand All @@ -106,29 +107,7 @@ func NewUpdater(service *dbusutil.Service, m *Manager, config *Config) *Updater
if err != nil {
logger.Warning(err)
}
state, err := u.systemdManager.GetUnitFileState(0, p2pService)
if err != nil {
logger.Warning("get p2p service state err:", err)
u.p2PUpdateEnable = false
u.p2PUpdateSupport = false
} else {
u.p2PUpdateEnable = false
u.p2PUpdateSupport = true
if state == "enabled" {
unit, err := u.getP2PUnit()
if err != nil {
logger.Warning("get p2p unit err:", err)
} else {
value, err := unit.Unit().ActiveState().Get(0)
if err != nil {
logger.Warning("get p2p SubState err:", err)
}
if value == "active" {
u.p2PUpdateEnable = true
}
}
}
}
u.refreshUpgradeDeliveryService()
return u
}

Expand All @@ -138,6 +117,50 @@ func SetAPTSmartMirror(url string) error {
0644) // #nosec G306
}

func (u *Updater) refreshUpgradeDeliveryService() {
// 检查upgrade服务是否被正常安装
_, err := u.service.NameHasOwner("org.deepin.upgradedelivery")
if err != nil {
logger.Warning(err)
u.setPropP2PUpdateSupport(false)
return
}
object := u.service.Conn().Object("org.deepin.upgradedelivery", "/org/deepin/upgradedelivery")
var ret dbus.Variant
ctx, _ := context.WithTimeout(context.Background(), 1*time.Second)
err = object.CallWithContext(ctx, "org.deepin.upgradedelivery.ServiceStatus", 0).Store(&ret)
if err != nil {
logger.Warning(err)
u.setPropP2PUpdateSupport(false)
return
}
u.setPropP2PUpdateSupport(true)
v := ret.Value()
u.setPropP2PUpdateEnable(u.config.UpgradeDeliveryEnabled)
// 情况一:当upgrade服务开启但P2PUpdateEnable关闭时,尝试关闭服务。若关闭失败则将P2PUpdateEnable恢复为true
if !u.P2PUpdateEnable && v == system.UpgradeDeliveryEnable {
err = object.Call("org.deepin.upgradedelivery.DisableService", 0).Err
if err != nil {
logger.Warning(err)
u.setPropP2PUpdateEnable(true)
} else {
err = object.Call("org.deepin.upgradedelivery.Clear", 0).Err
}
return
}
// 情况二:当upgrade服务开启但P2PUpdateEnable为false时,将P2PUpdateEnable设置为true
if v == system.UpgradeDeliveryEnable {
u.setPropP2PUpdateEnable(true)
return
}
// 情况三:当upgrade服务未开启但P2PUpdateEnable为true时,尝试拉起服务。若拉起失败则将P2PUpdateEnable设置为false
err = object.Call("org.deepin.upgradedelivery.StartService", 0).Err
if err != nil {
logger.Warning(err)
u.setPropP2PUpdateEnable(false)
}
}

type LocaleMirrorSource struct {
Id string
Url string
Expand Down Expand Up @@ -451,10 +474,10 @@ func (u *Updater) getP2PUnit() (systemd1.Unit, error) {
}

func (u *Updater) dealSetP2PUpdateEnable(enable bool) error {
if !u.p2PUpdateSupport {
if !u.P2PUpdateSupport {
return fmt.Errorf("unsupport p2p update")
}
if u.p2PUpdateEnable == enable {
if u.P2PUpdateEnable == enable {
return nil
}
files := []string{p2pService}
Expand Down
Loading
Loading