source: trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Mail.pm @ 2136

Last change on this file since 2136 was 1822, checked in by nanardon, 8 years ago

Allow empty alias creation

File size: 4.7 KB
Line 
1package LATMOS::Accounts::Bases::Mail;
2
3use 5.010000;
4use strict;
5use warnings;
6
7use base qw(LATMOS::Accounts::Bases);
8use LATMOS::Accounts::Log;
9use Fcntl qw(:flock);
10
11our $VERSION = (q$Rev: 641 $ =~ /^Rev: (\d+) /)[0];
12
13=head1 NAME
14
15LATMOS::Accounts::Bases::Mail - Base support for mail files
16
17=head1 DESCRIPTION
18
19This base is designed to generated aliases/revaliases files used by postfix or
20sendmail. This allow to centralise all information and to automated alias
21generation from user real name.
22
23=cut
24
25sub new {
26    my ($class, %config) = @_;
27
28    my $base = {
29        file => {},
30        aliases => {},
31        revaliases => {},
32    };
33
34    foreach (qw(aliases revaliases)) {
35        if ($config{$_}) {
36            $base->{file}{$_} = $config{$_};
37        } elsif ($config{directory}) {
38            $base->{file}{$_} = $config{directory} . '/' . $_;
39        } else {
40            $base->{file}{$_} = "/etc/$_";
41        }
42    }
43
44
45    bless($base, $class);
46}
47
48sub load {
49    my ($self) = @_;
50
51    # If aleady loaded just say ok !
52    $self->{_loaded} and return 1;
53
54    # warning, comment will be strip !
55    if (open(my $handle, '<', $self->{file}{aliases})) {
56        $self->log(LA_DEBUG, "Reading file %s", $self->{file}{aliases});
57        flock($handle, LOCK_EX);
58        while (my $line = <$handle>) {
59            chomp($line);
60            $line =~ s/^\s*#.*//;
61            $line or next;
62            my ($name, $forward) = $line =~ /^([^:]+):?\s*(.*)$/;
63            $name or do {
64                next;
65            };
66            $forward or next;
67            $self->{aliases}{$name} = $forward;
68        }
69        close($handle);
70    } else {
71        $self->log(LA_ERR, "Cannot open file '%s` for reading",
72            $self->{file}{aliases});
73        return;
74    }
75
76    if (open(my $handle, '<', $self->{file}{revaliases})) { 
77        $self->log(LA_DEBUG, "Reading file %s", $self->{file}{revaliases});
78        flock($handle, LOCK_EX);
79        while (my $line = <$handle>) {
80            chomp($line);
81            $line =~ s/^\s*#.*//;
82            my ($name, $as) = $line =~ /^(\S+)(?::\s*|\s+)(\S+)$/;
83            $name or next;
84            $as or do { warn $line; next};
85            $self->{revaliases}{$name} = $as;
86        }
87        close($handle);
88    } else {
89        $self->log(LA_ERR, "Cannot open file '%s` for reading",
90            $self->{file}{revaliases});
91        return;
92    }
93
94    $self->{_loaded} = 1;
95
96    return 1;
97}
98
99sub _commit {
100    my ($self) = @_;
101
102    if (open(my $handle, '>>', $self->{file}{aliases})) {
103        flock($handle, LOCK_EX);
104        truncate($handle, 0);
105        foreach (sort keys %{ $self->{aliases} }) {
106            printf $handle "%s:%s\n", $_, $self->{aliases}{$_};
107        }
108        close($handle);
109        $self->log(LA_INFO, $self->{file}{aliases} . " saved");
110    } else {
111        $self->log(LA_ERR, "Cannot open file '%s` for writing",
112            $self->{file}{aliases});
113        return;
114    }
115
116    if (open(my $handle, '>', $self->{file}{revaliases})) {
117        flock($handle, LOCK_EX);
118        truncate($handle, 0);
119        foreach (sort keys %{ $self->{revaliases} }) {
120            printf $handle "%s %s\n", $_, $self->{revaliases}{$_};
121        }
122        close($handle);
123        $self->log(LA_INFO, $self->{file}{revaliases} . " saved");
124    } else {
125        $self->log(LA_ERR, "Cannot open file '%s` for writing",
126            $self->{file}{revaliases});
127        return;
128    }
129
130}
131
132sub list_objects {
133    my ($self, $type) = @_;
134
135    $type = lc($type);
136    lc($type) =~ /^(aliases|revaliases)$/ or return;
137
138    return sort keys %{ $self->{$type} };
139}
140
141sub create_object {
142    my ($self, $otype, $id, %data) = @_;
143
144    $otype = lc($otype);
145    if ($self->{$otype}{$id}) {
146        return;
147    } elsif ($otype =~ /^aliases$/i) {
148        $data{forward} ||= [];
149        $self->{$otype}{$id} = ref $data{forward}
150            ? join(',', @{$data{forward}})
151            : $data{forward};
152        return 1;
153    } elsif ($data{as} && $otype =~ /^revaliases$/i) {
154        $self->{$otype}{$id} = $data{as};
155        return 1;
156    } else {
157        return;
158    }
159}
160
161sub _delete_object {
162    my ($self, $otype, $id) = @_;
163   
164    $otype = lc($otype);
165    $otype =~ /^(aliases|revaliases)$/ or return;
166    if ($self->{$otype}{$id}) {
167        delete($self->{$otype}{$id});
168        return 1;
169    } else {
170        return;
171    }
172}
173
1741;
175
176__END__
177
178=head1 SEE ALSO
179
180=head1 AUTHOR
181
182Olivier Thauvin, E<lt>olivier.thauvin@aerov.jussieu.frE<gt>
183
184=head1 COPYRIGHT AND LICENSE
185
186Copyright (C) 2008, 2009, 2010, 2011, 2012 CNRS SA/CETP/LATMOS
187
188This library is free software; you can redistribute it and/or modify
189it under the same terms as Perl itself, either Perl version 5.10.0 or,
190at your option, any later version of Perl 5 you may have available.
191
192=cut
Note: See TracBrowser for help on using the repository browser.