@@ -29,6 +29,7 @@ type APTSystem struct {
2929 CmdSet map [string ]* system.Command
3030 Indicator system.Indicator
3131 IncrementalUpdate bool
32+ DeliveryIndicator system.DeliveryIndicator
3233}
3334
3435func NewSystem (nonUnknownList []string , otherList []string , incrementalUpdate bool ) system.System {
@@ -56,6 +57,53 @@ func parseProgressField(v string) (float64, error) {
5657 return progress , nil
5758}
5859
60+ func parseDeliveryDownloadInfo (id , line string ) (system.JobDeliveryDownloadInfo , error ) {
61+ if strings .Contains (line , "102 Status" ) {
62+ var jobDeliveryDownloadInfo system.JobDeliveryDownloadInfo
63+ jobDeliveryDownloadInfo .JobId = id
64+ line = strings .TrimPrefix (line , "102 Status[" )
65+ line = strings .TrimSuffix (line , "]" )
66+ parts := strings .Split (line , "} {" )
67+ var isFinish bool
68+ var err error
69+ var speed int64
70+ var proto string
71+ for i := range parts {
72+ parts [i ] = strings .Trim (parts [i ], "{} " )
73+ }
74+ for _ , part := range parts {
75+ kv := strings .SplitN (part , " " , 2 )
76+ if len (kv ) != 2 {
77+ continue
78+ }
79+ key := kv [0 ]
80+ value := kv [1 ]
81+
82+ if key != "IsFinish" && key != "Speed" && key != "Proto" {
83+ continue
84+ } else if key == "IsFinish" {
85+ isFinish , err = strconv .ParseBool (value )
86+ if err != nil {
87+ logger .Warningf ("failed to parse isFinish %v" , err )
88+ isFinish = true
89+ }
90+ } else if key == "Speed" {
91+ speed , _ = strconv .ParseInt (value , 10 , 64 )
92+ } else if key == "Proto" {
93+ proto = value
94+ }
95+ }
96+ if ! isFinish {
97+ jobDeliveryDownloadInfo .Speed = speed
98+ jobDeliveryDownloadInfo .Proto = proto
99+ } else {
100+ jobDeliveryDownloadInfo .Speed = - 1
101+ }
102+ return jobDeliveryDownloadInfo , nil
103+ }
104+ return system.JobDeliveryDownloadInfo {JobId : id }, nil
105+ }
106+
59107func parseProgressInfo (id , line string ) (system.JobProgressInfo , error ) {
60108 fs := strings .SplitN (line , ":" , 4 )
61109 if len (fs ) != 4 {
@@ -109,6 +157,10 @@ func (p *APTSystem) AttachIndicator(f system.Indicator) {
109157 p .Indicator = f
110158}
111159
160+ func (p * APTSystem ) AttachDeliveryIndicator (f system.DeliveryIndicator ) {
161+ p .DeliveryIndicator = f
162+ }
163+
112164func WaitDpkgLockRelease () {
113165 for {
114166 msg , wait := system .CheckLock ("/var/lib/dpkg/lock" )
@@ -268,7 +320,7 @@ func (p *APTSystem) DownloadPackages(jobId string, packages []string, environ ma
268320 if err != nil {
269321 return err
270322 }
271- c := newAPTCommand (p , jobId , system .DownloadJobType , p .Indicator , append (packages , OptionToArgs (args )... ))
323+ c := newAPTCommand (p , jobId , system .DownloadJobType , p .Indicator , p . DeliveryIndicator , append (packages , OptionToArgs (args )... ))
272324 c .SetEnv (environ )
273325 return c .Start ()
274326}
@@ -300,11 +352,11 @@ func (p *APTSystem) DownloadSource(jobId string, packages []string, environ map[
300352 environ ["DEEPIN_IMMUTABLE_UPGRADE_APT_OPTION" ] = upgradeArgString
301353 logger .Info ("DownloadSource set env DEEPIN_IMMUTABLE_UPGRADE_APT_OPTION:" , upgradeArgString )
302354
303- c := newAPTCommand (p , jobId , system .IncrementalDownloadJobType , p .Indicator , cmdArgs )
355+ c := newAPTCommand (p , jobId , system .IncrementalDownloadJobType , p .Indicator , p . DeliveryIndicator , cmdArgs )
304356 c .SetEnv (environ )
305357 return c .Start ()
306358 }
307- c := newAPTCommand (p , jobId , system .PrepareDistUpgradeJobType , p .Indicator , append (packages , OptionToArgs (args )... ))
359+ c := newAPTCommand (p , jobId , system .PrepareDistUpgradeJobType , p .Indicator , p . DeliveryIndicator , append (packages , OptionToArgs (args )... ))
308360 c .SetEnv (environ )
309361 return c .Start ()
310362}
@@ -316,7 +368,7 @@ func (p *APTSystem) Remove(jobId string, packages []string, environ map[string]s
316368 return err
317369 }
318370
319- c := newAPTCommand (p , jobId , system .RemoveJobType , p .Indicator , packages )
371+ c := newAPTCommand (p , jobId , system .RemoveJobType , p .Indicator , p . DeliveryIndicator , packages )
320372 environ ["IMMUTABLE_DISABLE_REMOUNT" ] = "false"
321373 c .SetEnv (environ )
322374 return safeStart (c )
@@ -328,7 +380,7 @@ func (p *APTSystem) Install(jobId string, packages []string, environ map[string]
328380 if err != nil {
329381 return err
330382 }
331- c := newAPTCommand (p , jobId , system .InstallJobType , p .Indicator , append (OptionToArgs (args ), packages ... ))
383+ c := newAPTCommand (p , jobId , system .InstallJobType , p .Indicator , p . DeliveryIndicator , append (OptionToArgs (args ), packages ... ))
332384 environ ["IMMUTABLE_DISABLE_REMOUNT" ] = "false"
333385 c .SetEnv (environ )
334386 return safeStart (c )
@@ -365,12 +417,12 @@ func (p *APTSystem) DistUpgrade(jobId string, packages []string, environ map[str
365417 environ ["DEEPIN_IMMUTABLE_UPGRADE_APT_OPTION" ] = upgradeArgString
366418 logger .Info ("DistUpgrade set env DEEPIN_IMMUTABLE_UPGRADE_APT_OPTION:" , upgradeArgString )
367419
368- c := newAPTCommand (p , jobId , system .IncrementalUpdateJobType , p .Indicator , cmdArgs )
420+ c := newAPTCommand (p , jobId , system .IncrementalUpdateJobType , p .Indicator , p . DeliveryIndicator , cmdArgs )
369421 c .SetEnv (environ )
370422 return c .Start ()
371423 }
372424
373- c := newAPTCommand (p , jobId , system .DistUpgradeJobType , p .Indicator , append (OptionToArgs (args ), packages ... ))
425+ c := newAPTCommand (p , jobId , system .DistUpgradeJobType , p .Indicator , p . DeliveryIndicator , append (OptionToArgs (args ), packages ... ))
374426 environ ["IMMUTABLE_DISABLE_REMOUNT" ] = "false"
375427 c .SetEnv (environ )
376428 return safeStart (c )
@@ -384,7 +436,7 @@ func (p *APTSystem) UpdateSource(jobId string, environ map[string]string, args m
384436 logger .Warningf ("Failed to update remotes: %v, %s" , err , string (output ))
385437 }
386438 }
387- c := newAPTCommand (p , jobId , system .UpdateSourceJobType , p .Indicator , OptionToArgs (args ))
439+ c := newAPTCommand (p , jobId , system .UpdateSourceJobType , p .Indicator , p . DeliveryIndicator , OptionToArgs (args ))
388440 c .AtExitFn = func () bool {
389441 // 无网络时检查更新失败,exitCode为0,空间不足(不确定exit code)导致需要特殊处理
390442 if c .ExitCode == system .ExitSuccess && bytes .Contains (c .Stderr .Bytes (), []byte ("Some index files failed to download" )) {
@@ -402,7 +454,7 @@ func (p *APTSystem) UpdateSource(jobId string, environ map[string]string, args m
402454}
403455
404456func (p * APTSystem ) Clean (jobId string ) error {
405- c := newAPTCommand (p , jobId , system .CleanJobType , p .Indicator , nil )
457+ c := newAPTCommand (p , jobId , system .CleanJobType , p .Indicator , p . DeliveryIndicator , nil )
406458 return c .Start ()
407459}
408460
@@ -422,7 +474,7 @@ func (p *APTSystem) AbortWithFailed(jobId string) error {
422474
423475func (p * APTSystem ) FixError (jobId string , errType string , environ map [string ]string , args map [string ]string ) error {
424476 WaitDpkgLockRelease ()
425- c := newAPTCommand (p , jobId , system .FixErrorJobType , p .Indicator , append ([]string {errType }, OptionToArgs (args )... ))
477+ c := newAPTCommand (p , jobId , system .FixErrorJobType , p .Indicator , p . DeliveryIndicator , append ([]string {errType }, OptionToArgs (args )... ))
426478 environ ["IMMUTABLE_DISABLE_REMOUNT" ] = "false"
427479 c .SetEnv (environ )
428480 if system .JobErrorType (errType ) == system .ErrorDependenciesBroken { // 修复依赖错误的时候,会有需要卸载dde的情况,因此需要用safeStart来进行处理
@@ -655,7 +707,7 @@ func parseBackupJobError(stdErrStr string, stdOutStr string) *system.JobError {
655707}
656708
657709func (p * APTSystem ) OsBackup (jobId string ) error {
658- c := newAPTCommand (p , jobId , system .BackupJobType , p .Indicator , nil )
710+ c := newAPTCommand (p , jobId , system .BackupJobType , p .Indicator , p . DeliveryIndicator , nil )
659711 c .ParseJobError = parseBackupJobError
660712 c .ParseProgressInfo = func (id , line string ) (system.JobProgressInfo , error ) {
661713 type info struct {
0 commit comments