]> git.proxmox.com Git - pmg-api.git/blob - PMG/RuleDB/BCC.pm
add more ruledb classes
[pmg-api.git] / PMG / RuleDB / BCC.pm
1 package PMG::RuleDB::BCC;
2
3 use strict;
4 use warnings;
5 use Carp;
6 use DBI;
7
8
9 use PVE::SafeSyslog;
10
11 use PMG::Utils;
12 use PMG::ModGroup;
13 use PMG::RuleDB::Object;
14
15 use base qw(PMG::RuleDB::Object);
16
17 sub otype {
18 return 4005;
19 }
20
21 sub oclass {
22 return 'action';
23 }
24
25 sub otype_text {
26 return 'BCC';
27 }
28
29 sub oicon {
30 return 'bcc.gif';
31 }
32
33 sub oinfo {
34 return 'Blind carbon copy.';
35 }
36
37 sub oisedit {
38 return 1;
39 }
40
41 sub final {
42 return 0;
43 }
44
45 sub priority {
46 return 80;
47 }
48
49 sub new {
50 my ($type, $target, $original, $ogroup) = @_;
51
52 my $class = ref($type) || $type;
53
54 my $self = $class->SUPER::new(otype(), $ogroup);
55
56 $self->{target} = $target || 'receiver@domain.tld';
57
58 defined ($original) || ($original = 1);
59
60 $self->{original} = $original;
61
62 return $self;
63 }
64
65 sub load_attr {
66 my ($type, $ruledb, $id, $ogroup, $value) = @_;
67
68 my $class = ref($type) || $type;
69
70 defined($value) || return undef;
71
72 $value =~ m/^([01]):(.*)/ || return undef;
73
74 my ($target, $original) = ($2, $1);
75
76 my $obj = $class->new($target, $original, $ogroup);
77 $obj->{id} = $id;
78
79 $obj->{digest} = Digest::SHA::sha1_hex($id, $target, $original, $ogroup);
80
81 return $obj;
82 }
83
84 sub save {
85 my ($self, $ruledb) = @_;
86
87 defined($self->{ogroup}) || croak "undefined object attribute: ERROR";
88 defined($self->{target}) || croak "undefined object attribute: ERROR";
89 defined($self->{original}) || croak "undefined object attribute: ERROR";
90
91 if ($self->{original}) {
92 $self->{original} = 1;
93 } else {
94 $self->{original} = 0;
95 }
96
97 my $value = "$self->{original}:$self->{target}";
98
99 if (defined($self->{id})) {
100 # update
101
102 $ruledb->{dbh}->do(
103 "UPDATE Object SET Value = ? WHERE ID = ?",
104 undef, $value, $self->{id});
105
106 } else {
107 # insert
108
109 my $sth = $ruledb->{dbh}->prepare(
110 "INSERT INTO Object (Objectgroup_ID, ObjectType, Value) " .
111 "VALUES (?, ?, ?);");
112
113 $sth->execute($self->{ogroup}, $self->otype, $value);
114
115 $self->{id} = PMG::Utils::lastid($ruledb->{dbh}, 'object_id_seq');
116 }
117
118 return $self->{id};
119 }
120
121 sub execute {
122 my ($self, $queue, $ruledb, $mod_group, $targets,
123 $msginfo, $vars, $marks) = @_;
124
125 my $subgroups = $mod_group->subgroups($targets, 1);
126
127 my $bcc_to = PMG::Utils::subst_values($self->{target}, $vars);
128
129 if ($bcc_to =~ m/^\s*$/) {
130 # this happens if a notification is triggered by bounce mails
131 # which notifies the sender <> - we just log and then ignore it
132 syslog('info', "%s: bcc to <> (ignored)", $queue->{logid});
133 return;
134 }
135
136 my @bcc_targets = split (/\s*,\s*/, $bcc_to);
137
138 if ($self->{original}) {
139 $subgroups = [[\@bcc_targets, $mod_group->{entity}]];
140 }
141
142 foreach my $ta (@$subgroups) {
143 my ($tg, $entity) = (@$ta[0], @$ta[1]);
144
145 $entity = $entity->dup();
146 Proxmox::Utils::remove_marks ($entity);
147
148 if ($msginfo->{testmode}) {
149 my $fh = $msginfo->{test_fh};
150 print $fh "bcc from: $msginfo->{sender}\n";
151 printf $fh "bcc to: %s\n", join (',', @$tg);
152 print $fh "bcc content:\n";
153 $entity->print ($fh);
154 print $fh "bcc end\n";
155 } else {
156 my $qid = PMG::Utils::reinject_mail(
157 $entity, $msginfo->{sender}, \@bcc_targets,
158 $msginfo->{xforward}, $msginfo->{fqdn}, 1);
159 foreach (@bcc_targets) {
160 if ($qid) {
161 syslog('info', "%s: bcc to <%s> (%s)", $queue->{logid}, $_, $qid);
162 } else {
163 syslog('err', "%s: bcc to <%s> failed", $queue->{logid}, $_);
164 }
165 }
166 }
167 }
168
169 # warn if no subgroups
170 }
171
172 sub short_desc {
173 my $self = shift;
174
175 return "send bcc to: $self->{target}";
176 }
177
178 1;
179
180 __END__
181
182 =head1 PMG::RuleDB::BCC
183
184 Send BCC.