@@ -10,6 +10,7 @@ import (
1010
1111 "github.com/1Panel-dev/1Panel/agent/app/model"
1212 "github.com/1Panel-dev/1Panel/agent/app/repo"
13+ "github.com/1Panel-dev/1Panel/agent/app/task"
1314 "github.com/1Panel-dev/1Panel/agent/buserr"
1415 "github.com/1Panel-dev/1Panel/agent/constant"
1516 "github.com/1Panel-dev/1Panel/agent/global"
@@ -31,36 +32,26 @@ func (u *CronjobService) HandleJob(cronjob *model.Cronjob) {
3132 if len (cronjob .Script ) == 0 {
3233 return
3334 }
34- record .Records = u .generateLogsPath (* cronjob , record .StartTime )
35- _ = cronjobRepo .UpdateRecords (record .ID , map [string ]interface {}{"records" : record .Records })
36- err = u .handleShell (* cronjob , record .Records )
37- u .removeExpiredLog (* cronjob )
35+ err = u .handleShell (* cronjob , record .TaskID )
3836 case "curl" :
3937 if len (cronjob .URL ) == 0 {
4038 return
4139 }
42- record .Records = u .generateLogsPath (* cronjob , record .StartTime )
43- _ = cronjobRepo .UpdateRecords (record .ID , map [string ]interface {}{"records" : record .Records })
44- err = cmd .ExecShell (record .Records , 24 * time .Hour , "bash" , "-c" , "curl" , cronjob .URL )
45- u .removeExpiredLog (* cronjob )
40+ err = u .handleCurl (* cronjob , record .TaskID )
4641 case "ntp" :
47- err = u .handleNtpSync ()
48- u .removeExpiredLog (* cronjob )
42+ err = u .handleNtpSync (* cronjob , record .TaskID )
4943 case "cutWebsiteLog" :
5044 var messageItem []string
5145 messageItem , record .File , err = u .handleCutWebsiteLog (cronjob , record .StartTime )
5246 message = []byte (strings .Join (messageItem , "\n " ))
5347 case "clean" :
54- messageItem := ""
55- messageItem , err = u .handleSystemClean ()
56- message = []byte (messageItem )
57- u .removeExpiredLog (* cronjob )
48+ err = u .handleSystemClean (* cronjob , record .TaskID )
5849 case "website" :
59- err = u .handleWebsite (* cronjob , record .StartTime )
50+ err = u .handleWebsite (* cronjob , record .StartTime , record . TaskID )
6051 case "app" :
61- err = u .handleApp (* cronjob , record .StartTime )
52+ err = u .handleApp (* cronjob , record .StartTime , record . TaskID )
6253 case "database" :
63- err = u .handleDatabase (* cronjob , record .StartTime )
54+ err = u .handleDatabase (* cronjob , record .StartTime , record . TaskID )
6455 case "directory" :
6556 if len (cronjob .SourceDir ) == 0 {
6657 return
@@ -70,7 +61,7 @@ func (u *CronjobService) HandleJob(cronjob *model.Cronjob) {
7061 err = u .handleSystemLog (* cronjob , record .StartTime )
7162 case "snapshot" :
7263 _ = cronjobRepo .UpdateRecords (record .ID , map [string ]interface {}{"records" : record .Records })
73- err = u .handleSnapshot (* cronjob , record .StartTime )
64+ err = u .handleSnapshot (* cronjob , record .StartTime , record . TaskID )
7465 }
7566
7667 if err != nil {
@@ -90,53 +81,95 @@ func (u *CronjobService) HandleJob(cronjob *model.Cronjob) {
9081 }()
9182}
9283
93- func (u * CronjobService ) handleShell (cronjob model.Cronjob , logPath string ) error {
94- if len (cronjob .ContainerName ) != 0 {
95- command := "sh"
96- if len (cronjob .Command ) != 0 {
97- command = cronjob .Command
98- }
99- scriptFile , _ := os .ReadFile (cronjob .Script )
100- return cmd .ExecShell (logPath , 24 * time .Hour , "docker" , "exec" , cronjob .ContainerName , command , "-c" , strings .ReplaceAll (string (scriptFile ), "\" " , "\\ \" " ))
101- }
102- if len (cronjob .Executor ) == 0 {
103- cronjob .Executor = "bash"
84+ func (u * CronjobService ) handleShell (cronjob model.Cronjob , taskID string ) error {
85+ taskItem , err := task .NewTaskWithOps (fmt .Sprintf ("cronjob-%s" , cronjob .Name ), task .TaskHandle , task .TaskScopeCronjob , taskID , cronjob .ID )
86+ if err != nil {
87+ global .LOG .Errorf ("new task for exec shell failed, err: %v" , err )
88+ return err
10489 }
105- if cronjob .ScriptMode == "input" {
106- fileItem := pathUtils .Join (global .CONF .System .BaseDir , "1panel" , "task" , "shell" , cronjob .Name , cronjob .Name + ".sh" )
107- _ = os .MkdirAll (pathUtils .Dir (fileItem ), os .ModePerm )
108- shellFile , err := os .OpenFile (fileItem , os .O_CREATE | os .O_WRONLY | os .O_TRUNC , constant .FilePerm )
109- if err != nil {
110- return err
90+
91+ taskItem .AddSubTask (i18n .GetWithName ("HandleShell" , cronjob .Name ), func (t * task.Task ) error {
92+ if len (cronjob .ContainerName ) != 0 {
93+ command := "sh"
94+ if len (cronjob .Command ) != 0 {
95+ command = cronjob .Command
96+ }
97+ scriptFile , _ := os .ReadFile (cronjob .Script )
98+ return cmd .ExecShellWithTask (taskItem , 24 * time .Hour , "docker" , "exec" , cronjob .ContainerName , command , "-c" , strings .ReplaceAll (string (scriptFile ), "\" " , "\\ \" " ))
11199 }
112- defer shellFile .Close ()
113- if _ , err := shellFile .WriteString (cronjob .Script ); err != nil {
114- return err
100+ if len (cronjob .Executor ) == 0 {
101+ cronjob .Executor = "bash"
102+ }
103+ if cronjob .ScriptMode == "input" {
104+ fileItem := pathUtils .Join (global .CONF .System .BaseDir , "1panel" , "task" , "shell" , cronjob .Name , cronjob .Name + ".sh" )
105+ _ = os .MkdirAll (pathUtils .Dir (fileItem ), os .ModePerm )
106+ shellFile , err := os .OpenFile (fileItem , os .O_CREATE | os .O_WRONLY | os .O_TRUNC , constant .FilePerm )
107+ if err != nil {
108+ return err
109+ }
110+ defer shellFile .Close ()
111+ if _ , err := shellFile .WriteString (cronjob .Script ); err != nil {
112+ return err
113+ }
114+ if len (cronjob .User ) == 0 {
115+ return cmd .ExecShellWithTask (taskItem , 24 * time .Hour , cronjob .Executor , fileItem )
116+ }
117+ return cmd .ExecShellWithTask (taskItem , 24 * time .Hour , "sudo" , "-u" , cronjob .User , cronjob .Executor , fileItem )
115118 }
116119 if len (cronjob .User ) == 0 {
117- return cmd .ExecShell ( logPath , 24 * time .Hour , cronjob .Executor , fileItem )
120+ return cmd .ExecShellWithTask ( taskItem , 24 * time .Hour , cronjob .Executor , cronjob . Script )
118121 }
119- return cmd .ExecShell (logPath , 24 * time .Hour , "sudo" , "-u" , cronjob .User , cronjob .Executor , fileItem )
120- }
121- if len (cronjob .User ) == 0 {
122- return cmd .ExecShell (logPath , 24 * time .Hour , cronjob .Executor , cronjob .Script )
123- }
124- return cmd .ExecShell (logPath , 24 * time .Hour , "sudo" , "-u" , cronjob .User , cronjob .Executor , cronjob .Script )
122+ if err := cmd .ExecShellWithTask (taskItem , 24 * time .Hour , "sudo" , "-u" , cronjob .User , cronjob .Executor , cronjob .Script ); err != nil {
123+ return err
124+ }
125+ return nil
126+ },
127+ nil ,
128+ )
129+ return taskItem .Execute ()
125130}
126131
127- func (u * CronjobService ) handleNtpSync ( ) error {
128- ntpServer , err := settingRepo . Get ( settingRepo . WithByKey ( "NtpSite" ) )
132+ func (u * CronjobService ) handleCurl ( cronjob model. Cronjob , taskID string ) error {
133+ taskItem , err := task . NewTaskWithOps ( fmt . Sprintf ( "cronjob-%s" , cronjob . Name ), task . TaskHandle , task . TaskScopeCronjob , taskID , cronjob . ID )
129134 if err != nil {
135+ global .LOG .Errorf ("new task for exec shell failed, err: %v" , err )
130136 return err
131137 }
132- ntime , err := ntp .GetRemoteTime (ntpServer .Value )
138+
139+ taskItem .AddSubTask (i18n .GetWithName ("HandleShell" , cronjob .Name ), func (t * task.Task ) error {
140+ if err := cmd .ExecShellWithTask (taskItem , 24 * time .Hour , "bash" , "-c" , "curl" , cronjob .URL ); err != nil {
141+ return err
142+ }
143+ return nil
144+ },
145+ nil ,
146+ )
147+ return taskItem .Execute ()
148+ }
149+
150+ func (u * CronjobService ) handleNtpSync (cronjob model.Cronjob , taskID string ) error {
151+ taskItem , err := task .NewTaskWithOps (fmt .Sprintf ("cronjob-%s" , cronjob .Name ), task .TaskHandle , task .TaskScopeCronjob , taskID , cronjob .ID )
133152 if err != nil {
153+ global .LOG .Errorf ("new task for exec shell failed, err: %v" , err )
134154 return err
135155 }
136- if err := ntp .UpdateSystemTime (ntime .Format (constant .DateTimeLayout )); err != nil {
137- return err
138- }
139- return nil
156+
157+ taskItem .AddSubTask (i18n .GetMsgByKey ("HandleNtpSync" ), func (t * task.Task ) error {
158+ ntpServer , err := settingRepo .Get (settingRepo .WithByKey ("NtpSite" ))
159+ if err != nil {
160+ return err
161+ }
162+ taskItem .Logf ("ntp server: %s" , ntpServer .Value )
163+ ntime , err := ntp .GetRemoteTime (ntpServer .Value )
164+ if err != nil {
165+ return err
166+ }
167+ if err := ntp .UpdateSystemTime (ntime .Format (constant .DateTimeLayout )); err != nil {
168+ return err
169+ }
170+ return nil
171+ }, nil )
172+ return taskItem .Execute ()
140173}
141174
142175func (u * CronjobService ) handleCutWebsiteLog (cronjob * model.Cronjob , startTime time.Time ) ([]string , string , error ) {
@@ -201,8 +234,13 @@ func backupLogFile(dstFilePath, websiteLogDir string, fileOp files.FileOp) error
201234 return nil
202235}
203236
204- func (u * CronjobService ) handleSystemClean () (string , error ) {
205- return NewIDeviceService ().CleanForCronjob ()
237+ func (u * CronjobService ) handleSystemClean (cronjob model.Cronjob , taskID string ) error {
238+ taskItem , err := task .NewTaskWithOps (fmt .Sprintf ("cronjob-%s" , cronjob .Name ), task .TaskHandle , task .TaskScopeCronjob , taskID , cronjob .ID )
239+ if err != nil {
240+ global .LOG .Errorf ("new task for system clean failed, err: %v" , err )
241+ return err
242+ }
243+ return systemClean (taskItem )
206244}
207245
208246func (u * CronjobService ) uploadCronjobBackFile (cronjob model.Cronjob , accountMap map [string ]backupClientHelper , file string ) (string , error ) {
@@ -274,16 +312,6 @@ func (u *CronjobService) removeExpiredLog(cronjob model.Cronjob) {
274312 }
275313}
276314
277- func (u * CronjobService ) generateLogsPath (cronjob model.Cronjob , startTime time.Time ) string {
278- dir := fmt .Sprintf ("%s/task/%s/%s" , constant .DataDir , cronjob .Type , cronjob .Name )
279- if _ , err := os .Stat (dir ); err != nil && os .IsNotExist (err ) {
280- _ = os .MkdirAll (dir , os .ModePerm )
281- }
282-
283- path := fmt .Sprintf ("%s/%s.log" , dir , startTime .Format (constant .DateTimeSlimLayout ))
284- return path
285- }
286-
287315func hasBackup (cronjobType string ) bool {
288316 return cronjobType == "app" || cronjobType == "database" || cronjobType == "website" || cronjobType == "directory" || cronjobType == "snapshot" || cronjobType == "log"
289317}
0 commit comments