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