]>
git.proxmox.com Git - pmg-api.git/blob - src/PMG/Postfix.pm
13 my $spooldir = "/var/spool/postfix";
15 my $postfix_rec_get = sub {
19 return if !defined($r);
24 while (defined(my $lb = getc($fh))) {
26 $l |= ($o & 0x7f) << $shift ;
27 last if (($o & 0x80) == 0);
29 return if ($shift > 7); # XXX: max rec len of 4096
33 return unless ($l == 0 || read($fh, $d, $l) == $l);
37 my $postfix_qenv = sub {
40 my $fh = new IO
::File
($filename, "r");
41 return undef if !defined($fh);
44 my $res = { receivers
=> [] };
45 while (my ($r, $l, $d) = $postfix_rec_get->($fh)) {
46 #print "test:$r:$l:$d\n";
47 if ($r eq "C") { $dlen = $1 if $d =~ /^\s*(\d+)\s+\d+\s+\d+/; }
48 elsif ($r eq 'T') { $res->{time} = $1 if $d =~ /^\s*(\d+)\s\d+/; }
49 elsif ($r eq 'S') { $res->{sender
} = $d; }
50 elsif ($r eq 'R') { push @{$res->{receivers
}}, $d; }
52 if ($d =~ m/^Subject:\s+(.*)$/i) {
54 } elsif (!$res->{messageid
} && $d =~ m/^Message-Id:\s+<(.*)>$/i) {
55 $res->{messageid
} = $1;
58 #elsif ($r eq "M") { last unless defined $dlen; seek($fh, $dlen, 1); }
59 elsif ($r eq "E") { last; }
65 # Fixme: it is a bad idea to scan everything - list can be too large
66 sub show_deferred_queue
{
69 my $queue = 'deferred';
72 my $path = $File::Find
::name
;
75 my ($dev, $ino, $mode) = lstat($path);
77 return if !defined($mode);
78 return if !(-f _
&& (($mode & 07777) == 0700));
80 if (my $rec = $postfix_qenv->($path)) {
81 $rec->{queue
} = $queue;
82 $rec->{qid
} = $filename;
87 find
($callback, "$spooldir/deferred");
95 open(my $fh, '-|', '/usr/sbin/qshape', $queues) || die "ERROR: unable to run qshape: $!\n";
98 if (!$line || !($line =~ m/^\s+T\s+5\s+10\s+20\s+40\s+80\s+160\s+320\s+640\s+1280\s+1280\+$/)) {
99 die "ERROR: unable to parse qshape output: - $line";
104 while (($count++ < 10000) && (defined($line = <$fh>))) {
105 if ($line =~ m/^\s+(\S+\s+\d+\s+\d+\s+\d+\s+\d+\s+\d+\s+\d+\s+\d+\s+\d+\s+\d+\s+\d+\s+\d+)$/) {
106 my @d = split(/\s+/, $1);
128 my ($queue, $filter, $start, $limit) = @_;
130 open(my $fh, '-|', '/usr/sbin/postqueue', '-j') || die "ERROR: unable to run postqueue - $!\n";
134 $start = 0 if !$start;
135 $limit = 50 if !$limit;
139 while (defined($line = <$fh>)) {
140 my $rec = decode_json
($line);
141 my $recipients = $rec->{recipients
};
142 next if $rec->{queue_name
} ne $queue;
144 foreach my $entry (@$recipients) {
145 if (!$filter || $entry->{address
} =~ m/$filter/i ||
146 $rec->{sender
} =~ m/$filter/i) {
147 next if $count++ < $start;
148 next if $limit-- <= 0;
151 foreach my $k (qw(queue_name queue_id arrival_time message_size sender)) {
152 $data->{$k} = $rec->{$k};
154 $data->{receiver
} = $entry->{address
};
155 $data->{reason
} = $entry->{delay_reason
};
161 return ($count, $res);
165 my ($queue_id, $header, $body) = @_;
167 die "no option specified (select header or body or both)"
168 if !($header || $body);
172 push @opts, '-h' if $header;
173 push @opts, '-b' if $body;
175 push @opts, '-q', $queue_id;
177 open(my $fh, '-|', '/usr/sbin/postcat', @opts) || die "ERROR: unable to run postcat - $!\n";
180 while (defined(my $line = <$fh>)) {
187 # flush all queuespostconf -d|grep enable_long_queue_ids
189 PVE
::Tools
::run_command
(['/usr/sbin/postqueue', '-f']);
192 # flush a single mail
193 sub flush_queued_mail
{
196 PVE
::Tools
::run_command
(['/usr/sbin/postqueue', '-i', $queue_id]);
199 sub delete_queued_mail
{
200 my ($queue, $queue_id) = @_;
202 PVE
::Tools
::run_command
(['/usr/sbin/postsuper', '-d', $queue_id, $queue]);
208 my $cmd = ['/usr/sbin/postsuper', '-d', 'ALL'];
209 push @$cmd, $queue if defined($queue);
211 PVE
::Tools
::run_command
($cmd);
214 sub discard_verify_cache
{
215 unlink "/var/lib/postfix/verify_cache.db";
217 PMG
::Utils
::service_cmd
('postfix', 'reload');