1 <?php
  2 
  3 /**
  4  * @package redaxo\backup
  5  */
  6 class rex_cronjob_export extends rex_cronjob
  7 {
  8     const DEFAULT_FILENAME = '%REX_SERVER_rex%REX_VERSION_%Y%m%d_%H%M';
  9 
 10     public function execute()
 11     {
 12         $filename = $this->getParam('filename', self::DEFAULT_FILENAME);
 13         $filename = str_replace('%REX_SERVER', parse_url(rex::getServer(), PHP_URL_HOST), $filename);
 14         $filename = str_replace('%REX_VERSION', rex::getVersion(), $filename);
 15         $filename = strftime($filename);
 16         $file = $filename;
 17         $dir = rex_backup::getDir() . '/';
 18         $ext = '.cronjob.sql';
 19         if (file_exists($dir . $file . $ext)) {
 20             $i = 1;
 21             while (file_exists($dir . $file . '_' . $i . $ext)) {
 22                 ++$i;
 23             }
 24             $file = $file . '_' . $i;
 25         }
 26 
 27         if (rex_backup::exportDb($dir . $file . $ext)) {
 28             $message = $file . $ext . ' created';
 29 
 30             if ($this->getParam('delete_interval')) {
 31                 $allSqlfiles = glob(rex_path::addonData('backup', '*'.$ext));
 32                 $backups = [];
 33                 $limit = strtotime('-1 month'); // Generelle Vorhaltezeit: 1 Monat
 34 
 35                 foreach ($allSqlfiles as $sqlFile) {
 36                     $timestamp = filectime($sqlFile);
 37 
 38                     if ($timestamp > $limit) {
 39                         // wenn es die generelle Vorhaltezeit unterschreitet
 40                         continue;
 41                     }
 42 
 43                     $backups[$sqlFile] = $timestamp;
 44                 }
 45 
 46                 asort($backups, SORT_NUMERIC);
 47 
 48                 $step = '';
 49                 $countDeleted = 0;
 50 
 51                 foreach ($backups as $backup => $timestamp) {
 52                     $stepLast = $step;
 53                     $step = date($this->getParam('delete_interval'), (int) $timestamp);
 54 
 55                     if ($stepLast !== $step) {
 56                         // wenn es zu diesem Interval schon ein Backup gibt
 57                         continue;
 58                     }
 59 
 60                     // dann löschen
 61                     rex_file::delete($backup);
 62                     ++$countDeleted;
 63                 }
 64 
 65                 if ($countDeleted) {
 66                     $message .= ', '.$countDeleted.' old backup(s) deleted';
 67                 }
 68             }
 69 
 70             if ($this->getParam('sendmail')) {
 71                 if (!rex_addon::get('phpmailer')->isAvailable()) {
 72                     $this->setMessage($message . ', mail not sent (addon "phpmailer" isn\'t activated)');
 73 
 74                     return false;
 75                 }
 76                 $mail = new rex_mailer();
 77                 $mail->AddAddress($this->getParam('mailaddress'));
 78                 $mail->Subject = rex_i18n::rawMsg('backup_mail_subject');
 79                 $mail->Body = rex_i18n::rawMsg('backup_mail_body', rex::getServerName());
 80                 $mail->AddAttachment($dir . $file . $ext, $filename . $ext);
 81                 if ($mail->Send()) {
 82                     $this->setMessage($message . ', mail sent');
 83 
 84                     return true;
 85                 }
 86                 $this->setMessage($message . ', mail not sent');
 87 
 88                 return false;
 89             }
 90 
 91             $this->setMessage($message);
 92 
 93             return true;
 94         }
 95         $this->setMessage($file . $ext . ' not created');
 96 
 97         return false;
 98     }
 99 
100     public function getTypeName()
101     {
102         return rex_i18n::msg('backup_database_export');
103     }
104 
105     public function getParamFields()
106     {
107         $fields = [
108             [
109                 'label' => rex_i18n::msg('backup_filename'),
110                 'name' => 'filename',
111                 'type' => 'text',
112                 'default' => self::DEFAULT_FILENAME,
113                 'notice' => rex_i18n::msg('backup_filename_notice'),
114             ],
115             [
116                 'name' => 'sendmail',
117                 'type' => 'checkbox',
118                 'options' => [1 => rex_i18n::msg('backup_send_mail')],
119             ],
120         ];
121         if (rex_addon::get('phpmailer')->isAvailable()) {
122             $fields[] = [
123                 'label' => rex_i18n::msg('backup_mailaddress'),
124                 'name' => 'mailaddress',
125                 'type' => 'text',
126                 'visible_if' => ['sendmail' => 1],
127             ];
128         } else {
129             $fields[1]['notice'] = rex_i18n::msg('backup_send_mail_notice');
130             $fields[1]['attributes'] = ['disabled' => 'disabled'];
131         }
132 
133         $fields[] = [
134             'label' => rex_i18n::msg('backup_delete_interval'),
135             'name' => 'delete_interval',
136             'type' => 'select',
137             'options' => [
138                 '0' => rex_i18n::msg('backup_delete_interval_off'),
139                 'YW' => rex_i18n::msg('backup_delete_interval_weekly'),
140                 'YM' => rex_i18n::msg('backup_delete_interval_monthly'), ],
141             'default' => 'YW',
142             'notice' => rex_i18n::msg('backup_delete_interval_notice'),
143         ];
144 
145         return $fields;
146     }
147 }
148