1 <?php
2
3 4 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');
34
35 foreach ($allSqlfiles as $sqlFile) {
36 $timestamp = filectime($sqlFile);
37
38 if ($timestamp > $limit) {
39
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
57 continue;
58 }
59
60
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