Skip to content

Commit 74dbaae

Browse files
author
xml
committed
fix: automatic update check timer cycle anomaly
Bug: https://pms.uniontech.com/bug-view-355587.html
1 parent 21953aa commit 74dbaae

6 files changed

Lines changed: 147 additions & 70 deletions

File tree

src/internal/config/config.go

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,6 @@ type Config struct {
111111

112112
PlatformUrl string // 更新接口地址
113113
StartCheckRange []int // 开机检查更新区间
114-
CheckPolicyInterval int // 策略检查时间间隔(单位:秒)
115114
GetHardwareIdByHelper bool // machineID是否直接从sync helper获取
116115
IncludeDiskInfo bool // machineID是否包含硬盘信息
117116
PostUpgradeCron string // 更新上报间隔
@@ -224,7 +223,6 @@ const (
224223
DSettingsKeyIncrementalUpdate = "incremental-update"
225224
dSettingsKeyIntranetUpdate = "intranet-update"
226225
dSettingsKeyGetHardwareIdByHelper = "hardware-id-from-helper"
227-
dSettingsKeyCheckPolicyInterval = "check-policy-interval"
228226
dSettingsKeyDeliveryRemoteDownloadGlobalLimit = "delivery-remote-download-global-limit"
229227
dSettingsKeyDeliveryRemoteUploadGlobalLimit = "delivery-remote-upload-global-limit"
230228
dSettingsKeyDeliveryRemoteDownloadPeakLimit = "delivery-remote-download-peak-limit"
@@ -757,17 +755,6 @@ func getConfigFromDSettings() *Config {
757755
c.GetHardwareIdByHelper = v.Value().(bool)
758756
}
759757

760-
v, err = c.dsLastoreManager.Value(0, dSettingsKeyCheckPolicyInterval)
761-
if err != nil {
762-
logger.Warning(err)
763-
} else {
764-
if val, ok := v.Value().(int64); ok {
765-
c.CheckPolicyInterval = int(val)
766-
} else {
767-
logger.Warningf("dSettings key %s: value is not int64", dSettingsKeyCheckPolicyInterval)
768-
}
769-
}
770-
771758
err = c.recoveryAndApplyOemFlag(system.SystemUpdate)
772759
if err != nil {
773760
logger.Warning(err)
@@ -1222,11 +1209,6 @@ func (c *Config) SetSecurityRepoType(typ RepoType) error {
12221209
return c.save(dSettingsKeySecurityRepoType, typ)
12231210
}
12241211

1225-
func (c *Config) SetCheckPolicyInterval(interval int) error {
1226-
c.CheckPolicyInterval = interval
1227-
return c.save(dSettingsKeyCheckPolicyInterval, interval)
1228-
}
1229-
12301212
func (c *Config) SetStartCheckRange(checkRange []int) error {
12311213
c.StartCheckRange = checkRange
12321214

src/internal/updateplatform/message_report.go

Lines changed: 83 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -778,7 +778,7 @@ func getResponseData(response *http.Response, reqType requestType) (json.RawMess
778778
}
779779
return msg.Data, nil
780780
} else {
781-
return nil, fmt.Errorf("request for %s failed, response code=%d", response.Request.RequestURI, response.StatusCode)
781+
return nil, fmt.Errorf("request for %s failed, response code=%d", response.Request.URL, response.StatusCode)
782782
}
783783
}
784784

@@ -897,8 +897,8 @@ func (m *UpdatePlatformManager) genUpdatePolicyByToken(updateInRelease bool) err
897897
m.UpdateTime, _ = time.Parse(time.RFC3339, msg.Policy.Data.UpdateTime)
898898
}
899899
m.TimerHasChanged = false
900-
if !utils.IsElementEqual(m.config.CheckPolicyInterval, msg.ClientPollSetting.CheckPolicyInterval) && msg.ClientPollSetting.CheckPolicyInterval > 0 {
901-
m.config.SetCheckPolicyInterval(msg.ClientPollSetting.CheckPolicyInterval)
900+
if !utils.IsElementEqual(m.config.CheckInterval, msg.ClientPollSetting.CheckPolicyInterval*1000*1000*1000) && msg.ClientPollSetting.CheckPolicyInterval > 0 {
901+
m.config.SetCheckInterval(time.Duration(msg.ClientPollSetting.CheckPolicyInterval) * time.Second)
902902
m.TimerHasChanged = true
903903
}
904904
if !utils.IsElementEqual(m.config.StartCheckRange, msg.ClientPollSetting.StartCheckRange) && msg.ClientPollSetting.StartCheckRange != nil {
@@ -2182,3 +2182,83 @@ func (m *UpdatePlatformManager) UpdateDeliverySpeedLimit() error {
21822182

21832183
return nil
21842184
}
2185+
2186+
const checkPolicyCacheFile = "/tmp/checkpolicy.cache"
2187+
2188+
func (m *UpdatePlatformManager) CheckPolicyChanged() (bool, error) {
2189+
response, err := m.genVersionResponse()
2190+
if err != nil {
2191+
return false, fmt.Errorf("do request failed: %w", err)
2192+
}
2193+
2194+
body, err := io.ReadAll(response.Body)
2195+
if err != nil {
2196+
return false, err
2197+
}
2198+
2199+
if response.StatusCode != http.StatusOK {
2200+
return false, fmt.Errorf("request failed with status: %d", response.StatusCode)
2201+
}
2202+
2203+
sum := sha256.Sum256(body)
2204+
newSum := hex.EncodeToString(sum[:])
2205+
2206+
oldSum, _ := m.getCheckPolicyCache()
2207+
2208+
if oldSum != newSum {
2209+
m.saveCheckPolicyCache(newSum)
2210+
return true, nil
2211+
}
2212+
2213+
return false, nil
2214+
}
2215+
2216+
func (m *UpdatePlatformManager) getCheckPolicyCache() (string, time.Time) {
2217+
readFile, err := os.Open(checkPolicyCacheFile)
2218+
if err != nil {
2219+
return "", time.Time{}
2220+
}
2221+
defer readFile.Close()
2222+
2223+
reader := bufio.NewReader(readFile)
2224+
var sum string
2225+
var checkTime time.Time
2226+
2227+
data, _, err := reader.ReadLine()
2228+
if err == nil {
2229+
sum = string(data)
2230+
}
2231+
data, _, err = reader.ReadLine()
2232+
if err == nil {
2233+
checkTime, _ = time.Parse(time.RFC3339, string(data))
2234+
}
2235+
2236+
return sum, checkTime
2237+
}
2238+
2239+
func (m *UpdatePlatformManager) saveCheckPolicyCache(sum string) error {
2240+
writeFile, err := os.OpenFile(checkPolicyCacheFile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
2241+
if err != nil {
2242+
return err
2243+
}
2244+
defer writeFile.Close()
2245+
2246+
if _, err := writeFile.WriteString(sum); err != nil {
2247+
logger.Warning("failed to write sum:", err)
2248+
return err
2249+
}
2250+
if _, err := writeFile.WriteString("\n"); err != nil {
2251+
logger.Warning("failed to write newline:", err)
2252+
return err
2253+
}
2254+
if _, err := writeFile.WriteString(time.Now().Format(time.RFC3339)); err != nil {
2255+
logger.Warning("failed to write time:", err)
2256+
return err
2257+
}
2258+
if _, err := writeFile.WriteString("\n"); err != nil {
2259+
logger.Warning("failed to write newline:", err)
2260+
return err
2261+
}
2262+
2263+
return nil
2264+
}

src/lastore-daemon/main.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,8 @@ func main() {
100100
manager.initAgent()
101101
manager.initPlatformManager()
102102
if config.IntranetUpdate {
103-
//私有化更新的Cron是核心业务场景,不再依赖检查更新或者online定时器触发,而是直接创建
104-
manager.TryToStartCronCheck()
103+
//不再依赖检查更新或者online定时器触发,而是直接创建
104+
manager.TryToStartAutoCheck()
105105
}
106106
err = serverObject.SetWriteCallback(updater, "AutoInstallUpdates", updater.autoInstallUpdatesWriteCallback)
107107
if err != nil {

src/lastore-daemon/manager.go

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -304,11 +304,11 @@ func (m *Manager) initPlatformManager() {
304304
}
305305
}
306306

307-
func (m *Manager) TryToStartCronCheck() {
308-
if isTimerUnitFileExists(lastoreCronCheck) {
307+
func (m *Manager) TryToStartAutoCheck() {
308+
if isTimerUnitFileExists(lastoreAutoCheck) {
309309
return
310310
}
311-
m.startCheckPolicyTask()
311+
m.updateAutoCheckSystemUnit()
312312
}
313313

314314
func (m *Manager) delUpdatePackage(sender dbus.Sender, jobName string, packages string) (*Job, error) {
@@ -728,16 +728,52 @@ func (m *Manager) handleAutoCheckRegularlyEvent() error {
728728
}
729729

730730
func (m *Manager) handleAutoCheckEvent() error {
731-
if m.config.AutoCheckUpdates && !m.ImmutableAutoRecovery {
732-
_, err := m.updateSource(dbus.Sender(m.service.Conn().Names()[0]))
733-
if err != nil {
731+
if m.ImmutableAutoRecovery {
732+
return nil
733+
}
734+
735+
if !m.config.AutoCheckUpdates {
736+
return nil
737+
}
738+
739+
if m.config.PlatformUpdate {
740+
return m.handleAutoCheckWithPlatform()
741+
}
742+
743+
_, err := m.updateSource(dbus.Sender(m.service.Conn().Names()[0]))
744+
if err != nil {
745+
logger.Warning(err)
746+
return err
747+
}
748+
return nil
749+
}
750+
751+
func (m *Manager) handleAutoCheckWithPlatform() error {
752+
needUpdate, err := m.checkPlatformPolicy()
753+
if err != nil {
754+
logger.Warningf("check platform policy failed: %v", err)
755+
if _, err := m.updateSource(dbus.Sender(m.service.Conn().Names()[0])); err != nil {
756+
logger.Warning(err)
757+
}
758+
return err
759+
}
760+
761+
if needUpdate {
762+
if _, err := m.updateSource(dbus.Sender(m.service.Conn().Names()[0])); err != nil {
734763
logger.Warning(err)
735764
return err
736765
}
737766
}
738767
return nil
739768
}
740769

770+
func (m *Manager) checkPlatformPolicy() (bool, error) {
771+
if !m.config.PlatformUpdate {
772+
return true, nil
773+
}
774+
return m.updatePlatform.CheckPolicyChanged()
775+
}
776+
741777
func (m *Manager) handleAutoCleanEvent() error {
742778
const MaxCacheSize = 500.0 // size MB
743779
doClean := func() error {

src/lastore-daemon/manager_unit.go

Lines changed: 20 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@ const (
6060
lastoreAutoUpdateToken UnitName = "lastoreAutoUpdateToken"
6161
watchOsVersion UnitName = "watchOsVersion"
6262
lastoreInitIdleDownload UnitName = "lastoreInitIdleDownload"
63-
lastoreRegularlyUpdate UnitName = "lastoreRegularlyUpdate" // 到触发时间后开始检查更新->下载更新->安装更新
64-
lastoreCronCheck UnitName = "lastoreCronCheck"
63+
lastoreRegularlyUpdate UnitName = "lastoreRegularlyUpdate"
6564
lastorePostUpgrade UnitName = "lastorePostUpgrade"
6665
lastoreRetryPostMsg UnitName = "lastoreRetryPostMsg"
6766
)
@@ -79,8 +78,7 @@ func (m *Manager) getLastoreSystemUnitMap() lastoreUnitMap {
7978
unitMap := make(lastoreUnitMap)
8079
if (m.config.GetLastoreDaemonStatus()&config.DisableUpdate) == 0 && !m.ImmutableAutoRecovery { // 更新禁用未开启且无忧还原未开启时
8180
unitMap[lastoreAutoCheck] = genHandleEventCmdArgs([]string{
82-
// 随机数范围1800-21600,时间为0.5~6小时
83-
fmt.Sprintf("--on-active=%d", int(m.getNextUpdateDelay()/time.Second)+rand.New(rand.NewSource(time.Now().UnixNano())).Intn(m.config.StartCheckRange[1]-m.config.StartCheckRange[0])+m.config.StartCheckRange[0])}, AutoCheck) // 根据上次检查时间,设置下一次自动检查时间
81+
fmt.Sprintf("--on-active=%d", m.getNextAutoCheckDelay())}, AutoCheck)
8482
}
8583
unitMap[lastoreAutoClean] = genHandleEventCmdArgs([]string{
8684
"--on-active=600"}, AutoClean) // 10分钟后自动检查是否需要清理
@@ -260,31 +258,6 @@ func (m *Manager) updateTimerUnit(unitName UnitName) error {
260258
return nil
261259
}
262260

263-
func (m *Manager) startCheckPolicyTask() {
264-
if m.config.CheckPolicyInterval == 0 {
265-
logger.Info("config: not CheckPolicyInterval")
266-
return
267-
}
268-
269-
args := []string{
270-
fmt.Sprintf("--unit=%s", lastoreCronCheck),
271-
fmt.Sprintf("--on-active=%d", m.config.CheckPolicyInterval),
272-
fmt.Sprintf(`--on-unit-active=%d`, m.config.CheckPolicyInterval),
273-
"--uid=root",
274-
"/usr/bin/lastore-tools",
275-
"checkpolicy",
276-
}
277-
cmd := exec.Command(run, args...)
278-
logger.Info(cmd.String())
279-
var errBuffer bytes.Buffer
280-
cmd.Stderr = &errBuffer
281-
err := cmd.Run()
282-
if err != nil {
283-
logger.Warning(err)
284-
logger.Warning(errBuffer.String())
285-
}
286-
}
287-
288261
func (m *Manager) handleAutoDownload() {
289262
if m.ImmutableAutoRecovery {
290263
logger.Debug("Immutable auto recovery is enabled, don't allow to auto download")
@@ -332,6 +305,24 @@ func (m *Manager) getNextUpdateDelay() time.Duration {
332305
return remained + _minDelayTime
333306
}
334307

308+
func (m *Manager) getNextAutoCheckDelay() int {
309+
checkInterval := m.config.CheckInterval
310+
if checkInterval < 0 {
311+
checkInterval = 0
312+
}
313+
314+
elapsed := time.Since(m.config.LastCheckTime)
315+
remained := int((checkInterval - elapsed) / time.Second)
316+
if remained < 0 {
317+
remained = 0
318+
}
319+
320+
randomDelay := rand.New(rand.NewSource(time.Now().UnixNano())).Intn(m.config.StartCheckRange[1]-m.config.StartCheckRange[0]) + m.config.StartCheckRange[0]
321+
autoCheckDelay := remained + randomDelay
322+
logger.Infof("get next auto check delay, StartCheckRange=%v, randomDelay=%d, autoCheckDelay=%d", m.config.StartCheckRange, randomDelay, autoCheckDelay)
323+
return autoCheckDelay
324+
}
325+
335326
// isAllowedToTriggerSystemEvent checks if the uid is allowed to trigger system events
336327
func isAllowedToTriggerSystemEvent(uid uint32, eventType systemdEventType) bool {
337328
// Allow regular users to trigger OsVersionChanged event
@@ -384,7 +375,6 @@ func (m *Manager) delHandleSystemEvent(sender dbus.Sender, eventType string) err
384375
if err != nil {
385376
logger.Warning(err)
386377
}
387-
m.startCheckPolicyTask() // 在第一次自动检查更新后再加任务
388378
}()
389379
case AutoClean:
390380
go func() {

usr/share/dsg/configs/org.deepin.dde.lastore/org.deepin.dde.lastore.json

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -611,17 +611,6 @@
611611
"permissions": "readwrite",
612612
"visibility": "private"
613613
},
614-
"check-policy-interval": {
615-
"value": 0,
616-
"serial": 0,
617-
"flags": [
618-
"global"
619-
],
620-
"name": "CheckPolicyInterval",
621-
"description": "check policy interval (seconds)",
622-
"permissions": "readwrite",
623-
"visibility": "private"
624-
},
625614
"incremental-update": {
626615
"value": true,
627616
"serial": 0,

0 commit comments

Comments
 (0)