]> git.proxmox.com Git - pmg-api.git/blame - src/PMG/CLI/pmgdb.pm
pmgdb: dump: replace active flag with rules enum
[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 {
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
269our $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
2771;