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