source: trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Task/Delexpiredusers.pm @ 2439

Last change on this file since 2439 was 2439, checked in by nanardon, 4 years ago

Flag in log when change are made by SyncManager?

  • Property svn:executable set to *
File size: 10.1 KB
Line 
1package LATMOS::Accounts::Task::Delexpiredusers;
2
3use strict;
4use warnings;
5use base qw(LATMOS::Accounts::Task);
6use LATMOS::Accounts;
7use LATMOS::Accounts::Log;
8use LATMOS::Accounts::Utils;
9use DateTime;
10
11=head1 NAME
12
13LATMOS::Accounts::Task::Expiredusers - Warn and unexport expired user
14
15=head1 DESCRIPTION
16
17This module unexport user when they are expired since a given delay.
18
19Before deleting a warning can be sent to the manager.
20
21=head1 PARAMETER
22
23=head2 warndelay
24
25The number of days before warning manager the user will be unexported.
26
27If unset the warning is disable.
28
29=head2 unexportdelay
30
31The number of days after C<warndelay> the user is effectivelly unexported.
32
33If unset no user are unexported.
34
35=head2 modifdelay
36
37The time to wait in minutes after user modification before unexporting it.
38
39This time avoid the module deleting a user in the same time an administrator
40is trying to reactivate it.
41
42Default is 60 minutes.
43
44=head2 test
45
46If set only log are emitted but changes are not done and mail not really sent
47
48=head2 warn_manager
49
50If set, send a warning to manager of user after L<warndelay>.
51
52If not, a mail is sent only to L<summary> (if set).
53
54=head2 cc
55
56A copy of warning are sent to this email address
57
58=head2 summary
59
60If set, send a summmary to this address
61
62=head2 to
63
64Instead sending mail to manager mail are sent to this email address.
65
66=head1 warndelay/unexportdelay example
67
68Unexporting user immediatly /o any warning:
69
70    # warndelay = 0
71    unexportdelay = 0
72
73Warning manager with immediate unexport:
74
75    warndelay = 0
76    unexportdelay = 0
77
78Warning manager immediatelly but unexporting user 15 days later
79
80    warndelay = 0
81    unexportdelay = 15
82
83Wait 6 month after expiration, unexport user 15 days after warning:
84
85    warndelay = 180
86    unexportdelay = 15
87
88=cut
89
90# Run every 2 hours
91sub runDelay { 2 * 60 * 60 }
92
93# Wait 30 minutes
94sub waitDelay { 30 * 60 }
95
96sub _DATEFLAG { 'expireText' }
97
98sub init {
99    my ($self) = @_;
100    my $LA = $self->LA;
101    my $labase = $self->{base} ? $LA->base($self->{base}) : $LA->base;
102    $labase && $labase->load or die "Cannot load base";
103
104    $self->{_la} = $LA;
105    $self->{_base} = $labase;
106
107    1;
108}
109
110sub run {
111    my ($self) = @_;
112
113    $self->_unexport;
114
115    $self->_send_warning;
116
117    1;
118}
119
120sub _send_warning {
121    my ($self) = @_;
122
123    my $test = $self->{syncm}->ini->val($self->{name}, 'test');
124    my $warnDelay = $self->{syncm}->ini->val($self->{name}, 'warndelay');
125
126    my $modifDelay = $self->{syncm}->ini->val($self->{name}, 'modifdelay', 60);
127    my $waitAfterModif = DateTime->now->subtract( minutes => $modifDelay  )->iso8601;
128       
129    defined($warnDelay)  or do {
130        $self->{_base}->log(LA_DEBUG, "Don't warning manager because no warndelay given");
131        return;
132    };
133
134    my $expiredDate = DateTime->now()->subtract(days => $warnDelay);
135
136    my %expired;
137
138    foreach my $user ($self->{_base}->search_objects('user',
139            'exported=1',
140            'expire<' . $expiredDate->ymd('-'),
141            'date<' . $waitAfterModif,
142            'oalias=NULL'
143        )) {
144        my $ouser = $self->{_base}->get_object('user', $user) or next;
145
146        if ($ouser->get_attributes('nextEmployment')) {
147            # This user has expire account but a futur employement is coming
148            next;
149        }
150
151
152        my $manager = $ouser->get_attributes('manager') || 'N/A';
153 
154        $expired{$manager} ||= { users => [] };
155        push (@{$expired{$manager}{users}}, $ouser);
156    }
157
158    if ($self->{syncm}->ini->val('warn_manager')) {
159        my $lamail = LATMOS::Accounts::Mail->new(
160            $self->{_la},
161            'account_expired_reminder.mail',
162        );
163
164        my $MailSubject = $self->{_base}->la->val('_default_', 'mailSubject', 'LATMOS::Accounts');
165
166        foreach my $manager (sort keys %expired) {
167
168            my $omanager = $self->{_base}->get_object('user', $manager) or next;
169            my $mail = $omanager->get_attributes('mail') or next;
170
171            my $data = {
172                manager => $omanager,
173                users => [],
174            };
175
176            foreach my $ouser (@{ $expired{$manager}{users}}) {
177                if (my $val = $self->{_base}->get_global_value("expiredWarning.user." . $ouser->id)) {
178                    if ($val eq $ouser->get_attributes(_DATEFLAG)) {
179                        # Warning has been already sent
180                        next;
181                    }
182                }
183                $self->{_base}->log(
184                    LA_NOTICE,
185                    "%s Warning, user %s is expired (%s), manager %s",
186                    $test ? 'Test: ' : '',
187                    $ouser->id,
188                    $ouser->get_attributes('expireText'),
189                    $manager,
190                );
191                push(@{ $data->{users} }, $ouser);
192                $self->{_base}->set_global_value('expiredWarning.user.' . $ouser->id, $ouser->get_attributes(_DATEFLAG));
193            }
194            if (! @{ $data->{users} }) {
195                next;
196            }
197            $self->{_base}->commit;
198
199
200            my %mail = (
201                Subject => "$MailSubject: expired account",
202                'X-LATMOS-Reason' => 'Account destruction',
203            );
204
205            # to is for debuging
206            $mail{to} = $self->{syncm}->ini->val($self->{name}, 'to', $mail);
207            $mail{cc} = $self->{syncm}->ini->val($self->{name}, 'cc');
208
209            if ($test) {
210                $self->{_base}->log(LA_NOTICE, "Test: sending mail to %s for expired account %s",
211                    $omanager->id,
212                    join(', ', sort map { $_->id } @{ $data->{users} }),
213                );
214            } else {
215                if ($lamail->process(\%mail, $data)) {
216                    $self->{_base}->log(LA_NOTICE,
217                        "Expired account reminder mail sent to %s (%s) (cc: %s) for %s",
218                        $mail{to},
219                        $omanager->id,
220                        ($mail{cc} || ''),
221                        join(', ', sort map { $_->id } @{ $data->{users}}),
222                    );
223
224                }
225            }
226        }
227    }
228
229    if (my $sumto = $self->{syncm}->ini->val($self->{name}, 'summary')) {
230        my $MailSubject = $self->{_base}->la->val('_default_', 'mailSubject', 'LATMOS::Accounts');
231
232        my @summary;
233        foreach my $manager (sort keys %expired) {
234            foreach (@{$expired{$manager}{users}}) {
235
236                if (my $val = $self->{_base}->get_global_value("expiredWarning.usersummary." . $_->id)) {
237                    if ($val eq $_->get_attributes(_DATEFLAG)) {
238                        # Warning has been already sent
239                        next;
240                    }
241                }
242
243                push(@summary, sprintf("%s - %s (%s, %s)\n",
244                        $_->id,
245                        ($expired{$manager}{manager}
246                            ? $expired{$manager}{manager}->get_attributes('displayName')
247                            : $manager),
248                        $_->get_attributes('displayName'),
249                        $_->get_attributes('expireText'),
250                    )
251                );
252
253                $self->{_base}->set_global_value('expiredWarning.usersummary.' . $_->id, $_->get_attributes(_DATEFLAG));
254            }
255        }
256
257        $self->{_base}->commit;
258
259        if (@summary) {
260            if ($test) {
261                $self->{_base}->log(LA_NOTICE, "Test: no sending expired summary to $sumto for users");
262                $self->{_base}->log(LA_DEBUG, join('', @summary));
263            } else {
264                my %mail = (
265                    Subject => "$MailSubject: expired account (deactivation planned)",
266                    'X-LATMOS-Reason' => 'Account expiration',
267                    To => $sumto,
268                );
269                my $summail = LATMOS::Accounts::Mail->new(
270                    $self->{_la}, \join('', @summary), {}
271                );
272                if ($summail->process(\%mail)) {
273                    la_log(LA_NOTICE, "Expiration summary mail sent to %s",
274                        $sumto,
275                    );
276                }
277            }
278        }
279    }
280}
281
282sub _unexport {
283    my ($self) = @_;
284
285    my $test = $self->{syncm}->ini->val($self->{name}, 'test');
286
287    my $warnDelay     = $self->{syncm}->ini->val($self->{name}, 'warndelay', 0);
288    my $unexportDelay = $self->{syncm}->ini->val($self->{name}, 'unexportdelay');
289    defined($unexportDelay) or do {
290        $self->{_base}->log(LA_DEBUG, "Don't unexporting user because no unexportdelay given");
291        return;
292    };
293
294    my $expiredDate = DateTime->now()->subtract(days => $warnDelay + $unexportDelay);
295
296    my $modifDelay = $self->{syncm}->ini->val($self->{name}, 'modifdelay', 60);
297    my $waitAfterModif = DateTime->now->subtract( minutes => $modifDelay  )->iso8601;
298
299    foreach my $user ($self->{_base}->search_objects('user',
300            'exported=1',
301            'expire<' . $expiredDate->ymd('-'),
302            'date<' . $waitAfterModif,
303            'oalias=NULL'
304        )) {
305        my $ouser = $self->{_base}->get_object('user', $user) or next;
306        if ($ouser->get_attributes('currentEmployment') || $ouser->get_attributes('nextEmployment')) {
307            # This user has expire account but a futur employement is coming
308            next;
309        }
310
311        $self->{_base}->log(LA_NOTICE, "%sUser $user unexported because is expired (%s)",
312            $test ? 'Test: ' : '', $ouser->get_attributes('expireText'));
313
314        if (!$test) {
315            $ouser->_set_c_fields(
316                unexported => 1
317            );
318            $self->{_base}->del_global_value("expiredWarning.user.$user");
319            $self->{_base}->del_global_value("expiredWarning.usersummary.$user");
320            $ouser->ReportChange('Update', "Automatic unexport due to expiration");
321            $self->{_base}->commit;
322        }
323    }
324}
325
3261;
327
328__END__
329
330=head1 SEE ALSO
331
332L<LATMOS::Accounts>, L<LATMOS::Accounts::Task>
333
334=head1 AUTHOR
335
336Olivier Thauvin, E<lt>olivier.thauvin@latmos.ipsl.frE<gt>
337
338=head1 COPYRIGHT AND LICENSE
339
340Copyright (C) 2012 CNRS SA/CETP/LATMOS
341
342This library is free software; you can redistribute it and/or modify
343it under the same terms as Perl itself, either Perl version 5.10.0 or,
344at your option, any later version of Perl 5 you may have available.
345
346=cut
347
Note: See TracBrowser for help on using the repository browser.