]>
git.proxmox.com Git - pmg-api.git/blob - PMG/Fetchmail.pm
1 package PMG
::Fetchmail
;
12 my $inotify_file_id = 'fetchmailrc';
13 my $config_filename = '/etc/pmg/fetchmailrc';
15 my $set_fetchmail_defaults = sub {
18 $item->{protocol
} //= 'pop3';
19 $item->{interval
} //= 1;
20 $item->{enable
} //= 0;
23 if ($item->{protocol
} eq 'pop3') {
29 } elsif ($item->{protocol
} eq 'imap') {
36 die "unknown fetchmail protocol '$item->{protocol}'\n";
43 sub read_fetchmail_conf
{
44 my ($filename, $fh) = @_;
50 # scan for proxmox marker - skip non proxmox lines
51 while (defined(my $line = <$fh>)) {
52 last if $line =~ m/^\#\s+proxmox\s+settings.*$/;
59 my $get_next_token = sub {
62 while ($data =~ /\G("([^"]*)"|\S+|)(?:\s|$)/g) {
63 my ($token, $string) = ($1, $2);
65 $string =~ s/\\x([0-9A-Fa-f]{2})/chr(hex($1))/eg
67 return wantarray ?
($token, $string) : $token;
71 $linenr = $fh->input_line_number();
72 } while (defined($data));
77 my $get_token_argument = sub {
78 my ($token, $string) = $get_next_token->();
79 die "line $linenr: missing token arguemnt\n" if !$token;
80 return $string // $token;
83 my $finalize_item = sub {
85 $cfg->{$item->{id
}} = $item;
89 while (my ($token, $string) = $get_next_token->()) {
90 last if !defined($token);
91 if ($token eq 'poll' || $token eq 'skip') {
92 $finalize_item->($item) if defined($item);
93 my $id = $get_token_argument->();
94 $item = { id
=> $id };
95 $item->{enable
} = $token eq 'poll' ?
1 : 0;
99 die "line $linenr: unexpected token '$token'\n"
102 if ($token eq 'user') {
103 $item->{user
} = $get_token_argument->();
104 } elsif ($token eq 'via') {
105 $item->{server
} = $get_token_argument->();
106 } elsif ($token eq 'pass') {
107 $item->{pass
} = $get_token_argument->();
108 } elsif ($token eq 'to') {
109 $item->{target
} = $get_token_argument->();
110 } elsif ($token eq 'protocol') {
111 $item->{protocol
} = $get_token_argument->();
112 } elsif ($token eq 'port') {
113 $item->{port
} = $get_token_argument->();
114 } elsif ($token eq 'interval') {
115 $item->{interval
} = $get_token_argument->();
116 } elsif ($token eq 'ssl' || $token eq 'keep' ||
117 $token eq 'dropdelivered') {
120 die "line $linenr: unexpected token '$token' inside entry '$item->{id}'\n";
123 $finalize_item->($item) if defined($item);
129 sub write_fetchmail_conf
{
130 my ($filename, $fh, $fmcfg) = @_;
134 # Note: we correctly quote data here to make fetchmailrc.tt simpler
136 foreach my $id (keys %$fmcfg) {
137 my $org = $fmcfg->{$id};
138 my $item = { id
=> $id };
139 foreach my $k (keys %$org) {
141 $v =~ s/([^A-Za-z0-9\:\@\-\._~])/sprintf "\\x%02x",ord($1)/eg;
144 $set_fetchmail_defaults->($item);
145 my $options = [ 'dropdelivered' ];
146 push @$options, 'ssl' if $item->{ssl
};
147 push @$options, 'keep' if $item->{keep
};
148 $item->{options
} = join(' ', @$options);
149 $data->{$id} = $item;
154 my $pmgcfg = PMG
::Config-
>new();
155 my $vars = $pmgcfg->get_template_vars();
156 $vars->{fetchmail_users
} = $data;
158 my $tt = PMG
::Config
::get_template_toolkit
();
159 $tt->process('fetchmailrc.tt', $vars, \
$raw) ||
160 die $tt->error() . "\n";
162 my (undef, undef, $uid, $gid) = getpwnam('fetchmail');
163 chown($uid, $gid, $fh) if defined($uid) && defined($gid);
166 PVE
::Tools
::safe_print
($filename, $fh, $raw);
169 PVE
::INotify
::register_file
(
170 $inotify_file_id, $config_filename,
171 \
&read_fetchmail_conf
,
172 \
&write_fetchmail_conf
,
174 always_call_parser
=> 1);