-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdaemon.php
More file actions
228 lines (198 loc) · 11.1 KB
/
Copy pathdaemon.php
File metadata and controls
228 lines (198 loc) · 11.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
<?php
// Vérification cli
if(php_sapi_name() != 'cli') {
exit('Vous devez lancer ce script en "cli" (terminal)');
}
// Gestion options
$options = getopt('d:');
if (empty($options['d'])) {
$config['dir']['absolut']='.';
} else {
$config['dir']['absolut']=$options['d'];
}
if (!is_readable($config['dir']['absolut'].'/config.yaml')) {
exit("Error: The configuration file is not present, move config.yaml.default to config.yaml\n");
}
if (($config = yaml_parse_file($config['dir']['absolut'].'/config.yaml')) == false) {
exit("config.yaml syntax error, check with : http://www.yamllint.com/ \n");
}
include($config['dir']['absolut'].'/header.php');
// For interpret signal
declare(ticks = 1);
function sig_handler($sig) {
toLog(1, 'Daemon STOP');
exit;
}
pcntl_signal(SIGTERM, "sig_handler");
toLog(3, "Lancement du daemon");
$dayTask=0;
while (true) {
try {
$spoolerNext = $db->prepare("SELECT spooler.id, spooler.session_id, spooler.password, spooler.task, session.user, session.domain, session.dateCreate, session.imap_folder, session.dateStart, session.dateEnd, session.what, session.format, session.total_size, session.total_nb, open.imap_server, open.imap_port, open.imap_user, open.imap_secure, open.imap_auth, open.imap_cert FROM spooler, session, open
WHERE spooler.session_id = session.id
AND open.session_id = session.id
AND status = 2
ORDER BY date ASC");
$spoolerNext->bindParam('session_id', $_POST['session_id'], PDO::PARAM_INT);
$spoolerNext->execute();
} catch ( PDOException $e ) {
toLog(1, "SELECT spooler, error : ".$e->getMessage(), 0);
}
$spoolerNextArrayFetch = $spoolerNext->fetchAll();
if (count($spoolerNextArrayFetch) == 0) {
toLog(5, "Rien dans le spooler");
} else {
foreach($spoolerNextArrayFetch as $spoolerNextArray) {
if ($spoolerNextArray['imap_user'] == '%e') {
$spoolerNext_user = myDecrypt($spoolerNextArray['user']).'@'.$spoolerNextArray['domain'];
} else {
$spoolerNext_user = myDecrypt($spoolerNextArray['user']);
}
$req = $db->prepare("UPDATE spooler SET status = 3 WHERE id = :id");
$req->bindParam('id', $spoolerNextArray['id'], PDO::PARAM_INT);
$req->execute();
if ($spoolerNextArray['task'] == 1) {
toLog(3, "Archive demandé dans le spooler pour la session ".$spoolerNextArray['session_id']);
$imapGetData_return = imapGetData('archive', $spoolerNextArray['session_id'], $spoolerNextArray['imap_server'], $spoolerNextArray['imap_port'], $spoolerNext_user, myDecrypt($spoolerNextArray['password']), $spoolerNextArray['imap_secure'], $spoolerNextArray['imap_auth'], $spoolerNextArray['imap_cert'], json_decode($spoolerNextArray['imap_folder']), $spoolerNextArray['dateStart'], $spoolerNextArray['dateEnd'], $spoolerNextArray['what'], $spoolerNextArray['format']);
// Si ça c'est bien passé
if ($imapGetData_return['result'] == true) {
// Le nom du fichier généré sera :
$fileNameGen=substr(string2url($spoolerNextArray['session_id'].$spoolerNext_user.'.zip'), 0, 70);
toLog(5, "Copie du tableau html + des assests");
// On récupère le dossier "lib" + le "index.html"
// copy($config['dir']['templateTab']['html'], $config['dir']['archive']."/".$spoolerNextArray['session_id']."/");
// toLog(5, $config['dir']['templateTab']['html'] . '-'. $config['dir']['archive']."/".$spoolerNextArray['session_id']."/");
// Copy asset (lib)
recurse_copy($config['dir']['absolut'].'/'.$config['dir']['templateTab'], $config['dir']['absolut'].'/'.$config['dir']['archive']."/".$spoolerNextArray['session_id']);
// On zip
if (Zip($config['dir']['absolut'].'/'.$config['dir']['archive']."/".$spoolerNextArray['session_id']."/", $config['dir']['absolut'].'/'.$config['dir']['archive']."/".$fileNameGen)) {
toLog(2, "Le ZIP est fait, on l'enregistre : ".$fileNameGen);
// Enregistrement de l'archive :
$req = $db->prepare("INSERT INTO archive (session_id, file) VALUES (:session_id, :file)");
$req->bindParam('session_id', $spoolerNextArray['session_id'], PDO::PARAM_INT);
$req->bindParam('file', $fileNameGen, PDO::PARAM_STR);
$req->execute();
// Changement de status dans la bd
$req = $db->prepare("UPDATE spooler SET status = 5, password = null WHERE id = :id");
$req->bindParam('id', $spoolerNextArray['id'], PDO::PARAM_INT);
$req->execute();
// Ménage
rrmdir($config['dir']['absolut'].'/'.$config['dir']['archive']."/".$spoolerNextArray['session_id']."/");
// Notification archive prête
$urlSpool=$config['baseUrl'].'spool_'.$spoolerNextArray['session_id'];
$deleteApproval='';
if ($spoolerNextArray['what'] == 1) {
$deleteApproval='<br /><br />
'._('When you have downloaded your archive and you have checked that its content is readable, you can start the cleaning (deletion of archived messages) by this link (irrevocable decision):').' <a href="'.$urlSpool.'_DeleteApproval">'.$urlSpool.'_DeleteApproval</a>';
}
$mailSend_return = mailSend(username2email($spoolerNextArray['user'], $spoolerNextArray['domain']), _('Archive ready to download'), _('Hello').'<br /></br>
'._('Your archive is available for download until the').' '.date('Y-m-d', time()+$config['archive']['life']*86400).' '._('by this link:').' <a href="'.$config['url']['archive'].$fileNameGen.'">'.$config['url']['archive'].$fileNameGen.'</a>'.$deleteApproval);
if ($mailSend_return != true) {
toLog(1, 'Erreur mailSend '.$mailSend_return);
}
} else {
// Erreur à la création du zip
toLog(2, "Erreur dans le spooler à la création du ZIP sur la session ".$spoolerNextArray['session_id']);
$req = $db->prepare("UPDATE spooler SET status = 0 WHERE id = :id");
$req->bindParam('id', $spoolerNextArray['id'], PDO::PARAM_INT);
$req->execute();
$mailSend_return = mailSend(username2email($spoolerNextArray['user'], $spoolerNextArray['domain']), _('Archive error'), _('Hello').'<br /></br>
'._('Sorry but the archiving encountered too many errors for you to download.'));
if ($mailSend_return != true) {
toLog(1, 'Erreur mailSend '.$mailSend_return);
}
}
} else {
toLog(2, "Erreur dans le spooler sur la session ".$spoolerNextArray['session_id'].' : '.$imapGetData_return['resultMsg']);
$req = $db->prepare("UPDATE spooler SET status = 0 WHERE id = :id");
$req->bindParam('id', $spoolerNextArray['id'], PDO::PARAM_INT);
$req->execute();
$mailSend_return = mailSend(username2email($spoolerNextArray['user'], $spoolerNextArray['domain']), _('Archive error'), _('Hello').'<br /></br>
'._('Sorry but the archiving encountered too many errors for you to download.'));
if ($mailSend_return != true) {
toLog(1, 'Erreur mailSend '.$mailSend_return);
}
}
} else if ($spoolerNextArray['task'] == 2) {
toLog(3, "Suppression demandé dans le spooler pour la session ".$spoolerNextArray['session_id']);
$imapDeleteData_return = imapDeleteData($spoolerNextArray['session_id'], $spoolerNextArray['imap_server'], $spoolerNextArray['imap_port'], $spoolerNext_user, myDecrypt($spoolerNextArray['password']), $spoolerNextArray['imap_secure'], $spoolerNextArray['imap_auth'], $spoolerNextArray['imap_cert'], json_decode($spoolerNextArray['imap_folder']), $spoolerNextArray['dateStart'], $spoolerNextArray['dateEnd']);
// Changement de status dans la bd
if ($imapDeleteData_return['result'] == true) {
$req = $db->prepare("UPDATE spooler SET status = 5, password = null WHERE id = :id");
$req->bindParam('id', $spoolerNextArray['id'], PDO::PARAM_INT);
$req->execute();
$mailSend_return = mailSend(username2email($spoolerNextArray['user'], $spoolerNextArray['domain']), _('You have relieved your mailbox'), _('Hello').'<br /></br>
'._('Congratulations, you have relieved your mailbox of').' '.$spoolerNextArray['total_nb'].' '._('emails').' ('.convertOctect2humain($spoolerNextArray['total_size']).')');
if ($mailSend_return != true) {
toLog(1, 'Erreur mailSend '.$mailSend_return);
}
} else {
$req = $db->prepare("UPDATE spooler SET status = 0 WHERE id = :id");
$req->bindParam('id', $spoolerNextArray['id'], PDO::PARAM_INT);
$req->execute();
}
}
}
}
# Day task
if ($dayTask+86400 < time()) {
toLog(1, 'Lancement des tâches quotidiennes');
// Ménage dans els
try {
$archive = $db->prepare("SELECT session_id, file
FROM archive
WHERE dateCreate < '".date('Y-m-d', time()-$config['archive']['life']*86400)."'");
$archive->execute();
} catch ( PDOException $e ) {
toLog(1, "SELECT archive, error : ".$e->getMessage(), 0);
}
$archiveArrayFetch = $archive->fetchAll();
if (count($archiveArrayFetch) == 0) {
toLog(5, "Rien à supprimer dans les archives");
} else {
foreach($archiveArrayFetch as $archiveFetch) {
toLog(2, 'Suppression de l\'archives expiré : '.$archiveFetch['file']);
unlink($config['dir']['absolut'].'/'.$config['dir']['archive'].'/'.$archiveFetch['file']);
$req = $db->prepare("DELETE FROM archive WHERE session_id = :session_id");
$req->bindParam('session_id', $archiveFetch['session_id'], PDO::PARAM_INT);
$req->execute();
}
}
// Relance suppression
try {
$spoolerWait = $db->prepare("SELECT session.id, spooler.session_id, spooler.date, user, domain, archive.file
FROM spooler, session, archive
WHERE spooler.session_id = session.id
AND spooler.session_id = archive.session_id
AND what = 1
AND task = 2
AND status = 1");
$spoolerWait->execute();
} catch ( PDOException $e ) {
toLog(1, "SELECT archive, error : ".$e->getMessage(), 0);
}
$spoolerWaitArrayFetch = $spoolerWait->fetchAll();
if (count($spoolerWaitArrayFetch) == 0) {
toLog(5, "Aucune relance à faire");
} else {
foreach($spoolerWaitArrayFetch as $spoolerWaitFetch) {
foreach($config['delete']['relaunch'] as $relaunch) {
if (date('Y-m-d', strtotime($spoolerWaitFetch['date']. ' + '.$relaunch.' days')) == date('Y-m-d')) {
toLog(2, 'Relance à +'.$relaunch.' pour la session : '.$spoolerWaitFetch['id']);
$urlSpool=$config['baseUrl'].'spool_'.$spoolerWaitFetch['session_id'];
$mailSend_return = mailSend(username2email($spoolerWaitFetch['user'], $spoolerWaitFetch['domain']), '['._('Relaunch').'] '._('Archive ready to download'), _('Hello').'<br /></br>
'._('Your archive is available for download until the').' '.date('Y-m-d', time()+$config['archive']['life']*86400).' '._('by this link:').' <a href="'.$config['url']['archive'].$spoolerWaitFetch['file'].'">'.$config['url']['archive'].$spoolerWaitFetch['file'].'</a>'.'<br /><br />
'._('And above all, if you have already downloaded it:').'<br /><br />
<b>'._('You can start the cleaning (deletion of archived messages) by this link (irrevocable decision):').'</b> <a href="'.$urlSpool.'_DeleteApproval">'.$urlSpool.'_DeleteApproval</a>');
if ($mailSend_return != true) {
toLog(1, 'Erreur relance mailSend '.$mailSend_return);
}
}
}
}
}
$dayTask=time();
}
sleep($config["daemon"]["sleep"]);
}
?>