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

Last change on this file since 817 was 817, checked in by nanardon, 14 years ago
  • postifx use a space in canonical (revaliases)
File size: 3.8 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
13sub new {
14    my ($class, %options) = @_;
15
16    my $base = {
17        file => {
18            aliases => $options{aliases} || '/etc/aliases',
19            revaliases => $options{revaliases} || '/etc/revaliases',
20        },
21        aliases => {},
22        revaliases => {},
23    };
24
25    bless($base, $class);
26}
27
28sub load {
29    my ($self) = @_;
30
31    # If aleady loaded just say ok !
32    $self->{_loaded} and return 1;
33
34    # warning, comment will be strip !
35    if (open(my $handle, '<', $self->{file}{aliases})) {
36        $self->log(LA_DEBUG, "Reading file %s", $self->{file}{aliases});
37        flock($handle, LOCK_EX);
38        while (my $line = <$handle>) {
39            chomp($line);
40            $line =~ s/^\s*#.*//;
41            $line or next;
42            my ($name, $forward) = $line =~ /^([^:]+):?\s*(.*)$/;
43            $name or do {
44                next;
45            };
46            $forward or next;
47            $self->{aliases}{$name} = $forward;
48        }
49        close($handle);
50    } else {
51        $self->log(LA_ERR, "Cannot open file '%s` for reading",
52            $self->{file}{aliases});
53        return;
54    }
55
56    if (open(my $handle, '<', $self->{file}{revaliases})) { 
57        $self->log(LA_DEBUG, "Reading file %s", $self->{file}{revaliases});
58        flock($handle, LOCK_EX);
59        while (my $line = <$handle>) {
60            chomp($line);
61            $line =~ s/^\s*#.*//;
62            my ($name, $as) = $line =~ /^(\S+)(?::\s*|\s+)(\S+)$/;
63            $name or next;
64            $as or do { warn $line; next};
65            $self->{revaliases}{$name} = $as;
66        }
67        close($handle);
68    } else {
69        $self->log(LA_ERR, "Cannot open file '%s` for reading",
70            $self->{file}{revaliases});
71        return;
72    }
73
74    $self->{_loaded} = 1;
75
76    return 1;
77}
78
79sub _commit {
80    my ($self) = @_;
81
82    if (open(my $handle, '>>', $self->{file}{aliases})) {
83        flock($handle, LOCK_EX);
84        truncate($handle, 0);
85        foreach (sort keys %{ $self->{aliases} }) {
86            printf $handle "%s:%s\n", $_, $self->{aliases}{$_};
87        }
88        close($handle);
89        $self->log(LA_INFO, $self->{file}{aliases} . " saved");
90    } else {
91        $self->log(LA_ERR, "Cannot open file '%s` for writing",
92            $self->{file}{aliases});
93        return;
94    }
95
96    if (open(my $handle, '>', $self->{file}{revaliases})) {
97        flock($handle, LOCK_EX);
98        truncate($handle, 0);
99        foreach (sort keys %{ $self->{revaliases} }) {
100            printf $handle "%s %s\n", $_, $self->{revaliases}{$_};
101        }
102        close($handle);
103        $self->log(LA_INFO, $self->{file}{revaliases} . " saved");
104    } else {
105        $self->log(LA_ERR, "Cannot open file '%s` for writing",
106            $self->{file}{revaliases});
107        return;
108    }
109
110}
111
112sub list_objects {
113    my ($self, $type) = @_;
114
115    $type = lc($type);
116    lc($type) =~ /^(aliases|revaliases)$/ or return;
117
118    return sort keys %{ $self->{$type} };
119}
120
121sub create_object {
122    my ($self, $otype, $id, %data) = @_;
123
124    $otype = lc($otype);
125    if ($self->{$otype}{$id}) {
126        return;
127    } elsif ($data{forward} && $otype =~ /^aliases$/i) {
128        $self->{$otype}{$id} = ref $data{forward}
129            ? join(',', @{$data{forward}})
130            : $data{forward};
131        return 1;
132    } elsif ($data{as} && $otype =~ /^revaliases$/i) {
133        $self->{$otype}{$id} = $data{as};
134        return 1;
135    } else {
136        return;
137    }
138}
139
140sub _delete_object {
141    my ($self, $otype, $id) = @_;
142   
143    $otype = lc($otype);
144    $otype =~ /^(aliases|revaliases)$/ or return;
145    if ($self->{$otype}{$id}) {
146        delete($self->{$otype}{$id});
147        return 1;
148    } else {
149        return;
150    }
151}
152
1531;
Note: See TracBrowser for help on using the repository browser.