@@ -170,44 +170,68 @@ public function backup_action($action_name, $data) {
170170 $ app ->uses ('ini_parser,file,getconf ' );
171171
172172 $ server_config = $ app ->getconf ->get_server_config ($ conf ['server_id ' ], 'server ' );
173- $ mail_config = $ app ->getconf ->get_server_config ($ conf ['server_id ' ], 'mail ' );
174-
175- $ domain_rec = $ app ->db ->queryOneRecord ("SELECT * FROM mail_domain WHERE domain_id = " .intval ($ mail_backup ['parent_domain_id ' ]));
176-
177- $ backup_dir = $ server_config ['backup_dir ' ].'/mail ' .$ domain_rec ['domain_id ' ];
178- $ mail_backup_file = $ backup_dir .'/ ' .$ mail_backup ['filename ' ];
179-
180- $ sql = "SELECT * FROM mail_user WHERE server_id = ' " .$ conf ['server_id ' ]."' AND mailuser_id = " .intval ($ mail_backup ['mailuser_id ' ]);
181- $ record = $ app ->db ->queryOneRecord ($ sql );
182-
183- //* strip mailbox from maildir
184- $ domain_dir =explode ('/ ' ,$ record ['maildir ' ]);
185- $ _temp =array_pop ($ domain_dir );unset($ _temp );
186- $ domain_dir =implode ('/ ' ,$ domain_dir );
187- if (file_exists ($ mail_backup_file ) && $ record ['homedir ' ] != '' && $ record ['homedir ' ] != '/ ' && !stristr ($ mail_backup_file ,'.. ' ) && !stristr ($ mail_backup_file ,'etc ' ) && $ mail_config ['homedir_path ' ] == $ record ['homedir ' ] && is_dir ($ domain_dir )) {
188- if ($ mail_backup ['backup_mode ' ] == 'userzip ' ) {
189- $ command = 'sudo -u ' .$ mail_config ['mailuser_name ' ].' unzip -qq -o ' .escapeshellarg ($ mail_backup_file ).' -d ' .escapeshellarg ($ domain_dir ).' 2> /dev/null ' ;
190- exec ($ command ,$ tmp_output , $ retval );
191- if ($ retval == 0 ){
192- $ app ->log ('Restored Mail backup ' .$ mail_backup_file ,LOGLEVEL_DEBUG );
193- } else {
194- $ app ->log ('Unable to restore Mail backup ' .$ mail_backup_file .' ' .$ tmp_output ,LOGLEVEL_ERROR );
195- }
173+ $ backup_dir = $ server_config ['backup_dir ' ];
174+
175+ //* mount backup directory, if necessary
176+ $ backup_dir_is_ready = true ;
177+ $ server_config ['backup_dir_mount_cmd ' ] = trim ($ server_config ['backup_dir_mount_cmd ' ]);
178+ if ($ server_config ['backup_dir_is_mount ' ] == 'y ' && $ server_config ['backup_dir_mount_cmd ' ] != '' ){
179+ if (!$ app ->system ->is_mounted ($ backup_dir )){
180+ exec (escapeshellcmd ($ server_config ['backup_dir_mount_cmd ' ]));
181+ sleep (1 );
182+ if (!$ app ->system ->is_mounted ($ backup_dir )) $ backup_dir_is_ready = false ;
196183 }
197- if ($ mail_backup ['backup_mode ' ] == 'rootgz ' ) {
198- $ command ='tar xfz ' .escapeshellarg ($ mail_backup_file ).' --directory ' .escapeshellarg ($ domain_dir );
199- exec ($ command ,$ tmp_output , $ retval );
200- if ($ retval == 0 ){
201- $ app ->log ('Restored Mail backup ' .$ mail_backup_file ,LOGLEVEL_DEBUG );
202- } else {
203- $ app ->log ('Unable to restore Mail backup ' .$ mail_backup_file .' ' .$ tmp_output ,LOGLEVEL_ERROR );
184+ }
185+
186+ if ($ backup_dir_is_ready ){
187+ $ mail_config = $ app ->getconf ->get_server_config ($ conf ['server_id ' ], 'mail ' );
188+ $ domain_rec = $ app ->db ->queryOneRecord ("SELECT * FROM mail_domain WHERE domain_id = " .intval ($ mail_backup ['parent_domain_id ' ]));
189+
190+ $ backup_dir = $ server_config ['backup_dir ' ].'/mail ' .$ domain_rec ['domain_id ' ];
191+ $ mail_backup_file = $ backup_dir .'/ ' .$ mail_backup ['filename ' ];
192+
193+ $ sql = "SELECT * FROM mail_user WHERE server_id = ' " .$ conf ['server_id ' ]."' AND mailuser_id = " .intval ($ mail_backup ['mailuser_id ' ]);
194+ $ record = $ app ->db ->queryOneRecord ($ sql );
195+
196+ //* strip mailbox from maildir
197+ $ domain_dir =explode ('/ ' ,$ record ['maildir ' ]);
198+ $ _temp =array_pop ($ domain_dir );unset($ _temp );
199+ $ domain_dir =implode ('/ ' ,$ domain_dir );
200+
201+ if (!is_dir ($ domain_dir )) {
202+ mkdir ($ domain_dir , 0700 ); //* never create the full path
203+ chown ($ domain_dir , $ mail_config ['mailuser_name ' ]);
204+ chgrp ($ domain_dir , $ mail_config ['mailuser_group ' ]);
205+ }
206+
207+ if (file_exists ($ mail_backup_file ) && $ record ['homedir ' ] != '' && $ record ['homedir ' ] != '/ ' && !stristr ($ mail_backup_file ,'.. ' ) && !stristr ($ mail_backup_file ,'etc ' ) && $ mail_config ['homedir_path ' ] == $ record ['homedir ' ] && is_dir ($ domain_dir )) {
208+ if ($ mail_backup ['backup_mode ' ] == 'userzip ' ) {
209+ copy ($ mail_backup_file , $ domain_dir .'/ ' .$ mail_backup ['filename ' ]);
210+ chgrp ($ domain_dir .'/ ' .$ mail_backup ['filename ' ], $ mail_config ['mailuser_group ' ]);
211+ $ command = 'sudo -u ' .$ mail_config ['mailuser_name ' ].' unzip -qq -o ' .escapeshellarg ($ domain_dir .'/ ' .$ mail_backup ['filename ' ]).' -d ' .escapeshellarg ($ domain_dir ).' 2> /dev/null ' ;
212+ exec ($ command ,$ tmp_output , $ retval );
213+ unlink ($ domain_dir .'/ ' .$ mail_backup ['filename ' ]);
214+ if ($ retval == 0 ){
215+ $ app ->log ('Restored Mail backup ' .$ mail_backup_file ,LOGLEVEL_DEBUG );
216+ } else {
217+ $ app ->log ('Unable to restore Mail backup ' .$ mail_backup_file .' ' .$ tmp_output ,LOGLEVEL_ERROR );
218+ }
219+ }
220+ if ($ mail_backup ['backup_mode ' ] == 'rootgz ' ) {
221+ $ command ='tar xfz ' .escapeshellarg ($ mail_backup_file ).' --directory ' .escapeshellarg ($ domain_dir );
222+ exec ($ command ,$ tmp_output , $ retval );
223+ if ($ retval == 0 ){
224+ $ app ->log ('Restored Mail backup ' .$ mail_backup_file ,LOGLEVEL_DEBUG );
225+ } else {
226+ $ app ->log ('Unable to restore Mail backup ' .$ mail_backup_file .' ' .$ tmp_output ,LOGLEVEL_ERROR );
227+ }
204228 }
205229 }
206230 } else {
207- $ app ->log ('Unable to restore Mail backup ' . $ mail_backup_file . ' due to misconfiguration ' , LOGLEVEL_ERROR );
231+ $ app ->log ('Backup directory not ready. ' , LOGLEVEL_DEBUG );
208232 }
209233 } else {
210- $ app ->log ('No backup with ID ' .$ backup_id .' found. ' ,LOGLEVEL_DEBUG );
234+ $ app ->log ('No backup with ID ' .$ backup_id .' found. ' , LOGLEVEL_DEBUG );
211235 }
212236
213237 return 'ok ' ;
0 commit comments