]>
Commit | Line | Data |
---|---|---|
a7865a2b DM |
1 | package PMG::RuleDB::MatchField; |
2 | ||
3 | use strict; | |
4 | use warnings; | |
5 | use Carp; | |
6 | use DBI; | |
7 | use Digest::SHA; | |
8 | use MIME::Words; | |
9 | ||
3d5b36f0 DM |
10 | use PVE::SafeSyslog; |
11 | ||
758c7b6b | 12 | use PMG::Utils; |
a7865a2b DM |
13 | use PMG::RuleDB::Object; |
14 | ||
15 | use base qw(PMG::RuleDB::Object); | |
16 | ||
17 | sub otype { | |
18 | return 3002; | |
19 | } | |
20 | ||
21 | sub oclass { | |
22 | return 'what'; | |
23 | } | |
24 | ||
25 | sub otype_text { | |
26 | return 'Match Field'; | |
27 | } | |
28 | ||
29 | sub oicon { | |
30 | # fixme: | |
31 | return 'matchfield.gif'; | |
32 | } | |
33 | ||
34 | sub new { | |
35 | my ($type, $field, $field_value, $ogroup) = @_; | |
36 | ||
37 | my $class = ref($type) || $type; | |
38 | ||
39 | my $self = $class->SUPER::new(otype(), $ogroup); | |
40 | ||
41 | $self->{field} = $field; | |
42 | $self->{field_value} = $field_value; | |
43 | ||
44 | return $self; | |
45 | } | |
46 | ||
47 | sub load_attr { | |
48 | my ($type, $ruledb, $id, $ogroup, $value) = @_; | |
49 | ||
50 | my $class = ref($type) || $type; | |
51 | ||
52 | defined($value) || croak "undefined value: ERROR";; | |
53 | ||
54 | my ($field, $field_value) = $value =~ m/^([^:]*)\:(.*)$/; | |
55 | ||
56 | defined($field) || croak "undefined object attribute: ERROR"; | |
57 | defined($field_value) || croak "undefined object attribute: ERROR"; | |
58 | ||
3d5b36f0 DM |
59 | # use known constructor, bless afterwards (because sub class can have constructor |
60 | # with other parameter signature). | |
61 | my $obj = PMG::RuleDB::MatchField->new($field, $field_value, $ogroup); | |
62 | bless $obj, $class; | |
63 | ||
a7865a2b DM |
64 | $obj->{id} = $id; |
65 | ||
66 | $obj->{digest} = Digest::SHA::sha1_hex($id, $field, $field_value, $ogroup); | |
67 | ||
68 | return $obj; | |
69 | } | |
70 | ||
71 | sub save { | |
72 | my ($self, $ruledb) = @_; | |
73 | ||
74 | defined($self->{ogroup}) || croak "undefined ogroup: ERROR"; | |
75 | ||
76 | my $new_value = "$self->{field}:$self->{field_value}"; | |
77 | $new_value =~ s/\\/\\\\/g; | |
78 | ||
79 | if (defined ($self->{id})) { | |
80 | # update | |
81 | ||
82 | $ruledb->{dbh}->do( | |
83 | "UPDATE Object SET Value = ? WHERE ID = ?", | |
84 | undef, $new_value, $self->{id}); | |
85 | ||
86 | } else { | |
87 | # insert | |
88 | ||
89 | my $sth = $ruledb->{dbh}->prepare( | |
90 | "INSERT INTO Object (Objectgroup_ID, ObjectType, Value) " . | |
91 | "VALUES (?, ?, ?);"); | |
92 | ||
93 | $sth->execute($self->ogroup, $self->otype, $new_value); | |
94 | ||
758c7b6b | 95 | $self->{id} = PMG::Utils::lastid($ruledb->{dbh}, 'object_id_seq'); |
a7865a2b DM |
96 | } |
97 | ||
98 | return $self->{id}; | |
99 | } | |
100 | ||
101 | sub parse_entity { | |
102 | my ($self, $entity) = @_; | |
103 | ||
104 | return undef if !$self->{field}; | |
105 | ||
106 | my $res; | |
107 | ||
108 | if (my $id = $entity->head->mime_attr ('x-proxmox-tmp-aid')) { | |
109 | chomp $id; | |
110 | ||
111 | if (my $value = $entity->head->get ($self->{field})) { | |
112 | chomp $value; | |
113 | ||
114 | my $decvalue = MIME::Words::decode_mimewords($value); | |
115 | ||
116 | if ($decvalue =~ m|$self->{field_value}|i) { | |
117 | push @$res, $id; | |
118 | } | |
119 | } | |
120 | } | |
121 | ||
122 | foreach my $part ($entity->parts) { | |
123 | if (my $match = $self->parse_entity($part)) { | |
124 | push @$res, @$match; | |
125 | } | |
126 | } | |
127 | ||
128 | return $res; | |
129 | } | |
130 | ||
131 | sub what_match { | |
132 | my ($self, $queue, $entity, $msginfo) = @_; | |
133 | ||
134 | return $self->parse_entity ($entity); | |
135 | } | |
136 | ||
137 | sub short_desc { | |
138 | my $self = shift; | |
139 | ||
140 | return "$self->{field}=$self->{field_value}"; | |
3d5b36f0 | 141 | } |
a7865a2b DM |
142 | |
143 | 1; | |
144 | ||
145 | __END__ | |
146 | ||
147 | =head1 PMG::RuleDB::MatchField | |
148 | ||
149 | Match Header Fields |