@@ -9,17 +9,11 @@ import (
99 "bytes"
1010 "errors"
1111 "fmt"
12- "io"
1312 "os"
1413 "os/exec"
1514 "strings"
1615 "sync"
1716 "syscall"
18- "time"
19- )
20-
21- const (
22- FlushName = "/tmp/lastore_update_detail.log"
2317)
2418
2519type CommandSet interface {
@@ -47,8 +41,6 @@ type Command struct {
4741 Stdout bytes.Buffer
4842 Stderr bytes.Buffer
4943 AtExitFn func () bool
50-
51- ff * fileFlush
5244}
5345
5446func (c * Command ) String () string {
@@ -86,11 +78,6 @@ func (c *Command) SetEnv(envVarMap map[string]string) {
8678
8779func (c * Command ) Start () error {
8880 var err error
89- c .ff , err = OpenFlush (FlushName )
90- if err != nil {
91- return err
92- }
93-
9481 rr , ww , err := os .Pipe ()
9582 if err != nil {
9683 return fmt .Errorf ("aptCommand.Start pipe : %v" , err )
@@ -102,16 +89,10 @@ func (c *Command) Start() error {
10289
10390 // Print command start information
10491 cmdStr := strings .Join (c .Cmd .Args , " " )
105- startMsg := fmt .Sprintf ("=== Job %s running: %s ===\n " , c .JobId , cmdStr )
106- if c .ff != nil {
107- c .ff .SetFlushCmd (c .Cmd )
108- _ , err := c .ff .WriteString (startMsg )
109- if err != nil {
110- logger .Warning ("failed to write start message to log file:" , err )
111- } else {
112- c .ff .Sync ()
113- }
114- }
92+ c .Indicator (JobProgressInfo {
93+ OnlyLog : true ,
94+ OriginalLog : fmt .Sprintf ("=== Job %s running: %s ===\n " , c .JobId , cmdStr ),
95+ })
11596
11697 c .Cmd .ExtraFiles = append (c .Cmd .ExtraFiles , ww )
11798
@@ -173,26 +154,10 @@ func (c *Command) atExit() {
173154 statusStr = "UNKNOWN"
174155 }
175156
176- cmdStr := strings .Join (c .Cmd .Args , " " )
177- endMsg := fmt .Sprintf ("=== Job %s end: %s [Status: %s] ===\n " , c .JobId , cmdStr , statusStr )
178- logger .Info (endMsg )
179- if c .ff != nil {
180- _ , err := c .ff .WriteString (endMsg )
181- if err != nil {
182- logger .Warning ("failed to write end message to log file:" , err )
183- } else {
184- c .ff .Sync ()
185- }
186- }
187-
188- // Close log file when process exits
189- if c .ff != nil {
190- err := c .ff .Close ()
191- if err != nil {
192- logger .Warning ("failed to close log file:" , err )
193- }
194- }
195-
157+ c .Indicator (JobProgressInfo {
158+ OnlyLog : true ,
159+ OriginalLog : fmt .Sprintf ("=== Job %s end: %s [Status: %s] ===\n " , c .JobId , strings .Join (c .Cmd .Args , " " ), statusStr ),
160+ })
196161 logger .Infof ("job %s Stdout: %s" , c .JobId , c .Stdout .Bytes ())
197162 logger .Infof ("job %s Stderr: %s" , c .JobId , c .Stderr .Bytes ())
198163
@@ -214,6 +179,10 @@ func (c *Command) atExit() {
214179 Cancelable : false ,
215180 })
216181 case ExitFailure :
182+ c .Indicator (JobProgressInfo {
183+ OnlyLog : true ,
184+ OriginalLog : c .Stderr .String (),
185+ })
217186 err := c .ParseJobError (c .Stderr .String (), c .Stdout .String ())
218187 if err != nil {
219188 c .Indicator (JobProgressInfo {
@@ -248,23 +217,8 @@ func (c *Command) IndicateFailed(errType JobErrorType, errDetail string, isFatal
248217 logger .Warningf ("IndicateFailed: type: %s, detail: %s" , errType , errDetail )
249218
250219 // Print command end information with failed status and close log file
251- cmdStr := strings .Join (c .Cmd .Args , " " )
252- endMsg := fmt .Sprintf ("=== Job %s end: %s [Status: FAILED - %s] ===\n " , c .JobId , cmdStr , errType )
220+ endMsg := fmt .Sprintf ("=== Job %s end: %s [Status: FAILED - %s] ===\n " , c .JobId , strings .Join (c .Cmd .Args , " " ), errType .String ())
253221 logger .Info (endMsg )
254- if c .ff != nil {
255- _ , err := c .ff .WriteString (endMsg )
256- if err != nil {
257- logger .Warning ("failed to write end message to log file:" , err )
258- } else {
259- c .ff .Sync ()
260- }
261- // Close log file when indicating failed
262- err = c .ff .Close ()
263- if err != nil {
264- logger .Warning ("failed to close log file:" , err )
265- }
266- }
267-
268222 progressInfo := JobProgressInfo {
269223 JobId : c .JobId ,
270224 Progress : - 1.0 ,
@@ -274,7 +228,8 @@ func (c *Command) IndicateFailed(errType JobErrorType, errDetail string, isFatal
274228 ErrType : errType ,
275229 ErrDetail : errDetail ,
276230 },
277- FatalError : isFatalErr ,
231+ FatalError : isFatalErr ,
232+ OriginalLog : endMsg ,
278233 }
279234 c .CmdSet .RemoveCMD (c .JobId )
280235 c .Indicator (progressInfo )
@@ -323,109 +278,14 @@ func (c *Command) updateProgress() {
323278 info , err := c .ParseProgressInfo (c .JobId , line )
324279 if err != nil {
325280 logger .Errorf ("aptCommand.updateProgress %v -> %v\n " , info , err )
281+ c .Indicator (JobProgressInfo {
282+ OnlyLog : true ,
283+ OriginalLog : line ,
284+ })
326285 continue
327286 }
328-
287+ info . OriginalLog = line
329288 c .Cancelable = info .Cancelable
330289 c .Indicator (info )
331290 }
332291}
333-
334- type fileFlush struct {
335- fileName string
336- file * os.File
337- fileMu sync.Mutex
338- }
339-
340- func OpenFlush (file string ) (* fileFlush , error ) {
341- if file == "" {
342- return nil , fmt .Errorf ("file name is empty" )
343- }
344-
345- ff := & fileFlush {fileName : file }
346- ff .fileMu .Lock ()
347- defer ff .fileMu .Unlock ()
348-
349- var err error
350- ff .file , err = os .OpenFile (ff .fileName , os .O_CREATE | os .O_WRONLY | os .O_APPEND , 0644 )
351- if err != nil {
352- return nil , err
353- }
354-
355- return ff , nil
356- }
357-
358- func (ff * fileFlush ) Close () error {
359- ff .fileMu .Lock ()
360- defer ff .fileMu .Unlock ()
361- if ff .file != nil {
362- return ff .file .Close ()
363- }
364- return nil
365- }
366-
367- func (ff * fileFlush ) SetFlushCmd (cmd * exec.Cmd ) error {
368- ff .fileMu .Lock ()
369- defer ff .fileMu .Unlock ()
370- if ff .file == nil {
371- return fmt .Errorf ("file is not open" )
372- }
373-
374- // Handle case where cmd.Stdout/Stderr might be nil
375- if cmd .Stdout != nil {
376- cmd .Stdout = io .MultiWriter (cmd .Stdout , ff )
377- } else {
378- cmd .Stdout = ff
379- }
380-
381- if cmd .Stderr != nil {
382- cmd .Stderr = io .MultiWriter (cmd .Stderr , ff )
383- } else {
384- cmd .Stderr = ff
385- }
386-
387- return nil
388- }
389-
390- func (ff * fileFlush ) Write (data []byte ) (int , error ) {
391- ff .fileMu .Lock ()
392- defer ff .fileMu .Unlock ()
393- if ff .file == nil {
394- return 0 , fmt .Errorf ("file is not open" )
395- }
396-
397- // Add timestamp to each line
398- timestamp := time .Now ().Format ("2006-01-02 15:04:05" )
399- lines := strings .Split (string (data ), "\n " )
400- var timestampedLines []string
401-
402- for _ , line := range lines {
403- if line != "" {
404- timestampedLines = append (timestampedLines , fmt .Sprintf ("[%s] %s" , timestamp , line ))
405- } else {
406- timestampedLines = append (timestampedLines , "" )
407- }
408- }
409-
410- timestampedData := []byte (strings .Join (timestampedLines , "\n " ))
411- _ , err := ff .file .Write (timestampedData )
412- if err != nil {
413- return 0 , err
414- }
415-
416- // 重要:必须返回原始数据的长度,不是时间戳数据的长度
417- return len (data ), nil
418- }
419-
420- func (ff * fileFlush ) WriteString (data string ) (int , error ) {
421- return ff .Write ([]byte (data ))
422- }
423-
424- func (ff * fileFlush ) Sync () error {
425- ff .fileMu .Lock ()
426- defer ff .fileMu .Unlock ()
427- if ff .file == nil {
428- return fmt .Errorf ("file is not open" )
429- }
430- return ff .file .Sync ()
431- }
0 commit comments