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

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