]>
Commit | Line | Data |
---|---|---|
82782d70 | 1 | package PMG::CLI::pmgdb; |
8b91b776 DM |
2 | |
3 | use strict; | |
4 | use warnings; | |
5 | use Data::Dumper; | |
99447a91 | 6 | use Encode qw(encode); |
8b91b776 DM |
7 | |
8 | use PVE::SafeSyslog; | |
9 | use PVE::Tools qw(extract_param); | |
10 | use PVE::INotify; | |
595f5e50 | 11 | use PVE::CLIHandler; |
8b91b776 | 12 | |
75ce5866 | 13 | use PMG::Utils; |
80a43e18 | 14 | use PMG::RESTEnvironment; |
a355f100 | 15 | use PMG::DBTools; |
595f5e50 | 16 | use PMG::RuleDB; |
354ae1b2 | 17 | use PMG::Cluster; |
9f67f5b3 | 18 | use PMG::ClusterConfig; |
354ae1b2 | 19 | use PMG::Statistic; |
a355f100 | 20 | |
1c0bc64c DM |
21 | use PMG::API2::RuleDB; |
22 | ||
8b91b776 DM |
23 | use base qw(PVE::CLIHandler); |
24 | ||
80a43e18 DM |
25 | sub setup_environment { |
26 | PMG::RESTEnvironment->setup_default_cli_env(); | |
27 | } | |
28 | ||
c881fe35 DM |
29 | sub print_objects { |
30 | my ($ruledb, $og) = @_; | |
31 | ||
32 | my $objects = $ruledb->load_group_objects ($og->{id}); | |
33 | ||
34 | foreach my $obj (@$objects) { | |
8f67522b | 35 | my $type_text = $obj->otype_text(); |
99447a91 | 36 | my $desc = encode('UTF-8', $obj->short_desc()); |
8f67522b | 37 | print " OBJECT $type_text $obj->{id}: $desc\n"; |
c881fe35 DM |
38 | } |
39 | } | |
40 | ||
41 | sub print_rule { | |
ca23ef2f | 42 | my ($ruledb, $rule, $rule_status) = @_; |
c881fe35 | 43 | |
15b74634 DC |
44 | $ruledb->load_rule_attributes($rule); |
45 | ||
ca23ef2f SI |
46 | return if !$rule->{active} && $rule_status eq 'active'; |
47 | return if $rule->{active} && $rule_status eq 'inactive'; | |
48 | ||
0d161f4d SI |
49 | my $direction = { |
50 | 0 => 'in', | |
51 | 1 => 'out', | |
52 | 2 => 'in+out', | |
53 | }; | |
339ab429 | 54 | my $active = $rule->{active} ? 'ACTIVE' : 'inactive'; |
0d161f4d | 55 | my $dir = $direction->{$rule->{direction}}; |
99447a91 | 56 | my $rulename = encode('UTF-8', $rule->{name}); |
0d161f4d | 57 | |
f90390b5 | 58 | print "RULE $rule->{id} (prio: $rule->{priority}, $dir, $active): $rulename\n"; |
99447a91 SI |
59 | |
60 | my $print_group = sub { | |
15b74634 | 61 | my ($type, $og, $print_mode) = @_; |
99447a91 | 62 | my $oname = encode('UTF-8', $og->{name}); |
15b74634 DC |
63 | my $mode = ""; |
64 | if ($print_mode) { | |
65 | my $and = $og->{and} // 0; | |
66 | my $invert = $og->{invert} // 0; | |
67 | $mode = " (and=$and, invert=$invert)"; | |
68 | } | |
f90390b5 | 69 | print " $type group $og->{id}${mode}: $oname\n"; |
99447a91 SI |
70 | print_objects($ruledb, $og); |
71 | }; | |
c881fe35 | 72 | |
15b74634 DC |
73 | my $print_type_mode = sub { |
74 | my ($type) = @_; | |
75 | my $and = $rule->{"$type-and"}; | |
76 | my $invert = $rule->{"$type-invert"}; | |
77 | if (defined($and) || defined($invert)) { | |
78 | my $print_type = uc($type); | |
79 | print " $print_type mode: and=" . ($and // 0) . " invert=". ($invert // 0) . "\n"; | |
80 | } | |
81 | }; | |
82 | ||
c881fe35 DM |
83 | my ($from, $to, $when, $what, $action) = |
84 | $ruledb->load_groups($rule); | |
85 | ||
15b74634 | 86 | $print_type_mode->("from") if scalar(@$from); |
c881fe35 | 87 | foreach my $og (@$from) { |
15b74634 DC |
88 | $ruledb->load_group_attributes($og); |
89 | $print_group->("FROM", $og, 1); | |
c881fe35 | 90 | } |
15b74634 | 91 | $print_type_mode->("to") if scalar(@$to); |
c881fe35 | 92 | foreach my $og (@$to) { |
15b74634 DC |
93 | $ruledb->load_group_attributes($og); |
94 | $print_group->("TO", $og, 1); | |
c881fe35 | 95 | } |
15b74634 | 96 | $print_type_mode->("when") if scalar(@$when); |
c881fe35 | 97 | foreach my $og (@$when) { |
15b74634 DC |
98 | $ruledb->load_group_attributes($og); |
99 | $print_group->("WHEN", $og, 1); | |
c881fe35 | 100 | } |
15b74634 | 101 | $print_type_mode->("what") if scalar(@$what); |
c881fe35 | 102 | foreach my $og (@$what) { |
15b74634 DC |
103 | $ruledb->load_group_attributes($og); |
104 | $print_group->("WHAT", $og, 1); | |
c881fe35 DM |
105 | } |
106 | foreach my $og (@$action) { | |
99447a91 | 107 | $print_group->("ACTION", $og); |
c881fe35 DM |
108 | } |
109 | } | |
8b91b776 | 110 | |
8b91b776 DM |
111 | __PACKAGE__->register_method ({ |
112 | name => 'dump', | |
113 | path => 'dump', | |
114 | method => 'GET', | |
115 | description => "Print the PMG rule database.", | |
116 | parameters => { | |
117 | additionalProperties => 0, | |
34e5b44b | 118 | properties => { |
ca23ef2f SI |
119 | rules => { |
120 | description => "Which rules should be printed", | |
121 | type => 'string', | |
122 | enum => [qw(all active inactive)], | |
123 | default => 'all', | |
34e5b44b | 124 | optional => 1, |
34e5b44b SI |
125 | }, |
126 | }, | |
8b91b776 DM |
127 | }, |
128 | returns => { type => 'null'}, | |
129 | code => sub { | |
130 | my ($param) = @_; | |
131 | ||
ca23ef2f | 132 | my $rule_status = $param->{rules} // ''; |
c881fe35 DM |
133 | my $dbh = PMG::DBTools::open_ruledb("Proxmox_ruledb"); |
134 | my $ruledb = PMG::RuleDB->new($dbh); | |
135 | ||
c881fe35 DM |
136 | my $rules = $ruledb->load_rules(); |
137 | ||
138 | foreach my $rule (@$rules) { | |
ca23ef2f | 139 | print_rule($ruledb, $rule, $rule_status); |
c881fe35 DM |
140 | } |
141 | ||
142 | $ruledb->close(); | |
8b91b776 DM |
143 | |
144 | return undef; | |
145 | }}); | |
146 | ||
147 | ||
148 | __PACKAGE__->register_method ({ | |
149 | name => 'delete', | |
150 | path => 'delete', | |
151 | method => 'DELETE', | |
152 | description => "Delete PMG rule database.", | |
153 | parameters => { | |
154 | additionalProperties => 0, | |
6d9a036f | 155 | properties => {}, |
8b91b776 DM |
156 | }, |
157 | returns => { type => 'null'}, | |
158 | code => sub { | |
159 | my ($param) = @_; | |
160 | ||
f1bf78ff DM |
161 | my $list = PMG::DBTools::database_list(); |
162 | ||
163 | my $dbname = "Proxmox_ruledb"; | |
164 | ||
165 | die "Database '$dbname' does not exist\n" if !$list->{$dbname}; | |
a355f100 | 166 | |
8b91b776 DM |
167 | syslog('info', "delete rule database"); |
168 | ||
f1bf78ff | 169 | PMG::DBTools::delete_ruledb($dbname); |
8b91b776 DM |
170 | |
171 | return undef; | |
172 | }}); | |
173 | ||
8b91b776 | 174 | __PACKAGE__->register_method ({ |
dfcae855 DM |
175 | name => 'init', |
176 | path => 'init', | |
8b91b776 | 177 | method => 'POST', |
dfcae855 | 178 | description => "Initialize/Upgrade the PMG rule database.", |
8b91b776 DM |
179 | parameters => { |
180 | additionalProperties => 0, | |
181 | properties => { | |
f1bf78ff | 182 | force => { |
8b91b776 | 183 | type => 'boolean', |
f1bf78ff | 184 | description => "Delete existing database.", |
8b91b776 DM |
185 | optional => 1, |
186 | default => 0, | |
187 | }, | |
188 | statistics => { | |
189 | type => 'boolean', | |
dfcae855 | 190 | description => "Reset and update statistic database.", |
8b91b776 | 191 | optional => 1, |
dfcae855 | 192 | default => 0, |
8b91b776 DM |
193 | }, |
194 | } | |
195 | }, | |
196 | returns => { type => 'null'}, | |
197 | code => sub { | |
198 | my ($param) = @_; | |
199 | ||
75ce5866 DM |
200 | PMG::Utils::cond_add_default_locale(); |
201 | ||
f1bf78ff DM |
202 | my $list = PMG::DBTools::database_list(); |
203 | ||
204 | my $dbname = "Proxmox_ruledb"; | |
205 | ||
206 | if (!$list->{$dbname} || $param->{force}) { | |
8b91b776 | 207 | |
f1bf78ff DM |
208 | if ($list->{$dbname}) { |
209 | print "Destroy existing rule database\n"; | |
210 | PMG::DBTools::delete_ruledb($dbname); | |
211 | } | |
212 | ||
213 | print "Initialize rule database\n"; | |
214 | ||
215 | my $dbh = PMG::DBTools::create_ruledb ($dbname); | |
f4fe6fc4 | 216 | my $ruledb = PMG::RuleDB->new($dbh); |
0a580593 | 217 | PMG::DBTools::init_ruledb($ruledb); |
f1bf78ff DM |
218 | |
219 | $dbh->disconnect(); | |
220 | ||
221 | } else { | |
222 | ||
223 | my $dbh = PMG::DBTools::open_ruledb("Proxmox_ruledb"); | |
e7c865af | 224 | my $ruledb = PMG::RuleDB->new($dbh); |
f1bf78ff | 225 | |
0a580593 | 226 | print "Analyzing/Upgrading existing Databases..."; |
f4fe6fc4 | 227 | PMG::DBTools::upgradedb ($ruledb); |
0a580593 | 228 | print "done\n"; |
f1bf78ff DM |
229 | |
230 | # reset and update statistic databases | |
231 | if ($param->{statistics}) { | |
232 | print "Generating Proxmox Statistic Databases... "; | |
354ae1b2 DM |
233 | PMG::Statistic::clear_stats($dbh); |
234 | my $cinfo = PVE::INotify::read_file("cluster.conf"); | |
235 | PMG::Statistic::update_stats($dbh, $cinfo); | |
f1bf78ff DM |
236 | print "done\n"; |
237 | } | |
238 | ||
239 | $dbh->disconnect(); | |
240 | } | |
a355f100 | 241 | |
8b91b776 DM |
242 | return undef; |
243 | }}); | |
244 | ||
245 | ||
354ae1b2 DM |
246 | __PACKAGE__->register_method ({ |
247 | name => 'update', | |
248 | path => 'update', | |
249 | method => 'POST', | |
250 | description => "Update the PMG statistic database.", | |
251 | parameters => { | |
252 | additionalProperties => 0, | |
6d9a036f | 253 | properties => {}, |
354ae1b2 DM |
254 | }, |
255 | returns => { type => 'null'}, | |
256 | code => sub { | |
257 | my ($param) = @_; | |
258 | ||
259 | my $dbh = PMG::DBTools::open_ruledb("Proxmox_ruledb"); | |
1359baef | 260 | print "Updating Proxmox Statistic Databases... "; |
354ae1b2 DM |
261 | my $cinfo = PVE::INotify::read_file("cluster.conf"); |
262 | PMG::Statistic::update_stats($dbh, $cinfo); | |
263 | print "done\n"; | |
264 | $dbh->disconnect(); | |
265 | ||
266 | return undef; | |
267 | }}); | |
268 | ||
8b91b776 DM |
269 | our $cmddef = { |
270 | 'dump' => [ __PACKAGE__, 'dump', []], | |
271 | delete => [ __PACKAGE__, 'delete', []], | |
dfcae855 | 272 | init => [ __PACKAGE__, 'init', []], |
1c0bc64c | 273 | reset => [ 'PMG::API2::RuleDB', 'reset_ruledb', []], |
354ae1b2 | 274 | update => [ __PACKAGE__, 'update', []], |
8b91b776 DM |
275 | }; |
276 | ||
277 | 1; |