]> git.proxmox.com Git - pmg-api.git/blob - src/PMG/RuleDB/ModField.pm
ruledb: properly substitute prox_vars in headers
[pmg-api.git] / src / PMG / RuleDB / ModField.pm
1 package PMG::RuleDB::ModField;
2
3 use strict;
4 use warnings;
5 use DBI;
6 use Digest::SHA;
7 use Encode qw(encode decode);
8
9 use PMG::Utils;
10 use PMG::ModGroup;
11 use PMG::RuleDB::Object;
12
13 use base qw(PMG::RuleDB::Object);
14
15 sub otype {
16 return 4003;
17 }
18
19 sub oclass {
20 return 'action';
21 }
22
23 sub otype_text {
24 return 'Header Attribute';
25 }
26
27 sub final {
28 return 0;
29 }
30
31 sub priority {
32 return 10;
33 }
34
35 sub new {
36 my ($type, $field, $field_value, $ogroup) = @_;
37
38 my $class = ref($type) || $type;
39
40 my $self = $class->SUPER::new($class->otype(), $ogroup);
41
42 $self->{field} = $field;
43 $self->{field_value} = $field_value;
44
45 return $self;
46 }
47
48 sub load_attr {
49 my ($type, $ruledb, $id, $ogroup, $value) = @_;
50
51 my $class = ref($type) || $type;
52
53 defined($value) || return undef;
54
55 my ($field, $field_value) = $value =~ m/^([^\:]*)\:(.*)$/;
56
57 (defined($field) && defined($field_value)) || return undef;
58
59 my $obj = $class->new($field, $field_value, $ogroup);
60 $obj->{id} = $id;
61
62 $obj->{digest} = Digest::SHA::sha1_hex($id, $field, $field_value, $ogroup);
63
64 return $obj;
65 }
66
67 sub save {
68 my ($self, $ruledb) = @_;
69
70 defined($self->{ogroup}) || return undef;
71
72 my $new_value = "$self->{field}:$self->{field_value}";
73
74 if (defined ($self->{id})) {
75 # update
76
77 $ruledb->{dbh}->do(
78 "UPDATE Object SET Value = ? WHERE ID = ?",
79 undef, $new_value, $self->{id});
80
81 } else {
82 # insert
83
84 my $sth = $ruledb->{dbh}->prepare(
85 "INSERT INTO Object (Objectgroup_ID, ObjectType, Value) " .
86 "VALUES (?, ?, ?);");
87
88 $sth->execute($self->ogroup, $self->otype, $new_value);
89
90 $self->{id} = PMG::Utils::lastid($ruledb->{dbh}, 'object_id_seq');
91 }
92
93 return $self->{id};
94 }
95
96 sub execute {
97 my ($self, $queue, $ruledb, $mod_group, $targets,
98 $msginfo, $vars, $marks) = @_;
99
100 my $fvalue = PMG::Utils::subst_values_for_header($self->{field_value}, $vars);
101
102 my $subgroups = $mod_group->subgroups($targets);
103
104 foreach my $ta (@$subgroups) {
105 my ($tg, $e) = (@$ta[0], @$ta[1]);
106 $e->head->replace($self->{field}, $fvalue);
107 }
108 }
109
110 sub short_desc {
111 my $self = shift;
112
113 return "modify field: $self->{field}:$self->{field_value}";
114 }
115
116 sub properties {
117 my ($class) = @_;
118
119 return {
120 field => {
121 description => "The Field",
122 type => 'string',
123 pattern => '[0-9a-zA-Z\/\\\[\]\+\-\.\*\_]+',
124 maxLength => 1024,
125 },
126 value => {
127 description => "The Value",
128 type => 'string',
129 maxLength => 1024,
130 },
131 };
132 }
133
134 sub get {
135 my ($self) = @_;
136
137 return {
138 field => $self->{field},
139 value => $self->{field_value},
140 };
141 }
142
143 sub update {
144 my ($self, $param) = @_;
145
146 $self->{field_value} = $param->{value};
147 $self->{field} = $param->{field};
148 }
149
150 1;
151
152 __END__
153
154 =head1 PMG::RuleDB::ModField
155
156 Modify fields of a message.