-
Notifications
You must be signed in to change notification settings - Fork 0
/
cron.php
160 lines (130 loc) · 4.68 KB
/
cron.php
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
<?php
//
// Cron job to build weekly usage report for email delivery
// 0 16 * * 5 php /data/moodle/www/report/nys/cron.php
// For quarterly reports:
// 0 0 30 6,9 * php /data/moodle/www/report/nys/cron.php --quarterly
// 0 0 31 3,12 * php /data/moodle/www/report/nys/cron.php --quarterly
//
// Subscriptions are managed in: legethics.ini
//
require_once 'utils.php';
echo "Starting Moodle report generation at ".date('Ymd-His')."\n";
$cfg = get_config('legethics.ini');
if ($cfg === null) {
echo "ERROR: Unable to load config file\n";
exit(1);
}
// Confirm all four major sections of the config file are present.
foreach (['general','database','smtp','organizations'] as $sect) {
if (!isset($cfg[$sect])) {
echo "ERROR: Config file is missing the [$sect] section\n";
exit(1);
}
}
$dbcon = get_db_connection($cfg['database']);
if ($dbcon === false) {
echo "ERROR: Unable to connect to database\n";
exit(1);
}
$gen_config = $cfg['general'];
if (!isset($gen_config['report.dir']) || !isset($gen_config['phpmailer.dir'])) {
echo "ERROR: Both report.dir and phpmailer.dir must be set\n";
exit(1);
}
else {
$report_dir = $gen_config['report.dir'];
$phpmailer_dir = $gen_config['phpmailer.dir'];
if (is_dir($report_dir) == false || is_dir($phpmailer_dir) == false) {
echo "ERROR: Both report.dir and phpmailer.dir must exist\n";
exit(1);
}
}
$org_config = $cfg['organizations'];
if (isset($org_config['active'])) {
$active_orgs = explode(',', $org_config['active']);
}
else {
$active_orgs = [];
}
require_once "$phpmailer_dir/PHPMailer.php";
require_once "$phpmailer_dir/SMTP.php";
require_once "$phpmailer_dir/Exception.php";
// Define our own mailer called CronMailer, which simply extends the
// standard PHPMailer by overriding the default constructor.
// Newer versions of PHPMailer attempt to register a class autoloader.
// However, the version included with Moodle does not include the autoloader
// for performance reasons. We don't need it, so we override it.
// Otherwise, an error is thrown when PHPMailer is instantiated.
class CronMailer extends PHPMailer\PHPMailer\PHPMailer
{
public function __construct() { }
}
# CLI options
$opts = getopt('q', ['quarterly']);
$report_t = (isset($opts['quarterly'])) ? "Quarterly" : "Weekly";
// run through list of offices
foreach ($active_orgs as $org) {
$duration = (isset($opts['quarterly'])) ? 92 : $org_config[$org.'.duration']; ;
$from = date('U', strtotime('-'.$duration.' days'));
$to = date('U');
if (empty($org_config[$org.'.email'])) {
echo "WARN: No e-mail addresses specified for $org; skipping\n";
continue;
}
$to_emails = $org_config[$org.'.email'];
echo "Generating $org $report_t Report covering the past $duration days\n";
// date range the organization wants to see
$start_time = date('U', strtotime('-'.$duration.' days'));
$end_time = date('U');
// get matching records from database
$result = fetch_exam_results($dbcon, $org, $start_time, $end_time);
$out_fileinfo = generate_csv_file($report_dir, $org, $result);
if ($out_fileinfo) {
$recnum = $out_fileinfo['count'];
$filepath = $out_fileinfo['filepath'];
echo "$recnum records saved to $filepath\n";
$rc = send_email($org, $report_t, $cfg['smtp'], $to_emails, $filepath);
}
else {
echo "$org: No output file to e-mail\n";
}
echo "- - - - - - \n";
}
echo "Finished Moodle report generation at ".date('Ymd-His')."\n";
return 0;
function send_email($org, $rptType, $smtp, $emails, $attachment)
{
$mail = new CronMailer;
$mail->isSMTP();
$mail->Host = $smtp['host'];
$mail->SMTPAuth = $smtp['auth'];
$mail->setFrom($smtp['from'], $smtp['fromName']);
$mail->addReplyTo($smtp['replyTo'], $smtp['replyToName']);
if (empty($emails)) {
echo "WARN: $org has no e-mail addresses to send to\n";
return false;
}
foreach ($emails as $email) {
$mail->addAddress($email);
}
if (!empty($smtp['bcc']) && is_array($smtp['bcc'])) {
foreach ($smtp['bcc'] as $email) {
$mail->addBCC($email);
}
}
$mail->addAttachment($attachment, "$org $rptType Report.csv");
$mail->WordWrap = 80;
$mail->isHTML(false);
$mail->Subject = "$org Legislative Ethics $rptType training report";
$mail->Body = "Hello,\n\nPlease find attached to this e-mail the CSV file of $org employees who completed legislative ethics training this week, along with those employees who are still incomplete.\n\nIf you have any questions, please reply to this e-mail.\n\nThanks,\nLeg Ethics Report Server\n";
if ($mail->send()) {
echo "Message has been sent.\n";
return true;
}
else {
echo 'Message could not be sent.';
echo 'Mailer Error: '.$mail->ErrorInfo;
return false;
}
} // send_email()