]> git.proxmox.com Git - pmg-api.git/blob - PMG/CLI/pmgdb.pm
extend `pmgdb dump`
[pmg-api.git] / PMG / CLI / pmgdb.pm
1 package PMG::CLI::pmgdb;
2
3 use strict;
4 use warnings;
5 use Data::Dumper;
6
7 use PVE::SafeSyslog;
8 use PVE::Tools qw(extract_param);
9 use PVE::INotify;
10 use PVE::CLIHandler;
11
12 use PMG::Utils;
13 use PMG::RESTEnvironment;
14 use PMG::DBTools;
15 use PMG::RuleDB;
16 use PMG::Cluster;
17 use PMG::ClusterConfig;
18 use PMG::Statistic;
19
20 use PMG::API2::RuleDB;
21
22 use base qw(PVE::CLIHandler);
23
24 sub setup_environment {
25 PMG::RESTEnvironment->setup_default_cli_env();
26 }
27
28 sub print_objects {
29 my ($ruledb, $og) = @_;
30
31 my $objects = $ruledb->load_group_objects ($og->{id});
32
33 foreach my $obj (@$objects) {
34 my $desc = $obj->short_desc ();
35 print " OBJECT $obj->{id}: $desc\n";
36 }
37 }
38
39 sub print_rule {
40 my ($ruledb, $rule) = @_;
41
42 my $direction = {
43 0 => 'in',
44 1 => 'out',
45 2 => 'in+out',
46 };
47 my $active = $rule->{active} ? 'active' : 'inactive';
48 my $dir = $direction->{$rule->{direction}};
49
50 print "Found RULE $rule->{id} (prio: $rule->{priority}, $dir, $active): $rule->{name}\n";
51
52 my ($from, $to, $when, $what, $action) =
53 $ruledb->load_groups($rule);
54
55 foreach my $og (@$from) {
56 print " FOUND FROM GROUP $og->{id}: $og->{name}\n";
57 print_objects($ruledb, $og);
58 }
59 foreach my $og (@$to) {
60 print " FOUND TO GROUP $og->{id}: $og->{name}\n";
61 print_objects($ruledb, $og);
62 }
63 foreach my $og (@$when) {
64 print " FOUND WHEN GROUP $og->{id}: $og->{name}\n";
65 print_objects($ruledb, $og);
66 }
67 foreach my $og (@$what) {
68 print " FOUND WHAT GROUP $og->{id}: $og->{name}\n";
69 print_objects($ruledb, $og);
70 }
71 foreach my $og (@$action) {
72 print " FOUND ACTION GROUP $og->{id}: $og->{name}\n";
73 print_objects($ruledb, $og);
74 }
75 }
76
77 __PACKAGE__->register_method ({
78 name => 'dump',
79 path => 'dump',
80 method => 'GET',
81 description => "Print the PMG rule database.",
82 parameters => {
83 additionalProperties => 0,
84 properties => {},
85 },
86 returns => { type => 'null'},
87 code => sub {
88 my ($param) = @_;
89
90 my $dbh = PMG::DBTools::open_ruledb("Proxmox_ruledb");
91 my $ruledb = PMG::RuleDB->new($dbh);
92
93 my $rules = $ruledb->load_rules();
94
95 foreach my $rule (@$rules) {
96 print_rule($ruledb, $rule);
97 }
98
99 $ruledb->close();
100
101 return undef;
102 }});
103
104
105 __PACKAGE__->register_method ({
106 name => 'delete',
107 path => 'delete',
108 method => 'DELETE',
109 description => "Delete PMG rule database.",
110 parameters => {
111 additionalProperties => 0,
112 properties => {},
113 },
114 returns => { type => 'null'},
115 code => sub {
116 my ($param) = @_;
117
118 my $list = PMG::DBTools::database_list();
119
120 my $dbname = "Proxmox_ruledb";
121
122 die "Database '$dbname' does not exist\n" if !$list->{$dbname};
123
124 syslog('info', "delete rule database");
125
126 PMG::DBTools::delete_ruledb($dbname);
127
128 return undef;
129 }});
130
131 __PACKAGE__->register_method ({
132 name => 'init',
133 path => 'init',
134 method => 'POST',
135 description => "Initialize/Upgrade the PMG rule database.",
136 parameters => {
137 additionalProperties => 0,
138 properties => {
139 force => {
140 type => 'boolean',
141 description => "Delete existing database.",
142 optional => 1,
143 default => 0,
144 },
145 statistics => {
146 type => 'boolean',
147 description => "Reset and update statistic database.",
148 optional => 1,
149 default => 0,
150 },
151 }
152 },
153 returns => { type => 'null'},
154 code => sub {
155 my ($param) = @_;
156
157 PMG::Utils::cond_add_default_locale();
158
159 my $list = PMG::DBTools::database_list();
160
161 my $dbname = "Proxmox_ruledb";
162
163 if (!$list->{$dbname} || $param->{force}) {
164
165 if ($list->{$dbname}) {
166 print "Destroy existing rule database\n";
167 PMG::DBTools::delete_ruledb($dbname);
168 }
169
170 print "Initialize rule database\n";
171
172 my $dbh = PMG::DBTools::create_ruledb ($dbname);
173 my $ruledb = PMG::RuleDB->new($dbh);
174 PMG::DBTools::init_ruledb($ruledb);
175
176 $dbh->disconnect();
177
178 } else {
179
180 my $dbh = PMG::DBTools::open_ruledb("Proxmox_ruledb");
181 my $ruledb = PMG::RuleDB->new($dbh);
182
183 print "Analyzing/Upgrading existing Databases...";
184 PMG::DBTools::upgradedb ($ruledb);
185 print "done\n";
186
187 # reset and update statistic databases
188 if ($param->{statistics}) {
189 print "Generating Proxmox Statistic Databases... ";
190 PMG::Statistic::clear_stats($dbh);
191 my $cinfo = PVE::INotify::read_file("cluster.conf");
192 PMG::Statistic::update_stats($dbh, $cinfo);
193 print "done\n";
194 }
195
196 $dbh->disconnect();
197 }
198
199 return undef;
200 }});
201
202
203 __PACKAGE__->register_method ({
204 name => 'update',
205 path => 'update',
206 method => 'POST',
207 description => "Update the PMG statistic database.",
208 parameters => {
209 additionalProperties => 0,
210 properties => {},
211 },
212 returns => { type => 'null'},
213 code => sub {
214 my ($param) = @_;
215
216 my $dbh = PMG::DBTools::open_ruledb("Proxmox_ruledb");
217 print "Updateing Proxmox Statistic Databases... ";
218 my $cinfo = PVE::INotify::read_file("cluster.conf");
219 PMG::Statistic::update_stats($dbh, $cinfo);
220 print "done\n";
221 $dbh->disconnect();
222
223 return undef;
224 }});
225
226 our $cmddef = {
227 'dump' => [ __PACKAGE__, 'dump', []],
228 delete => [ __PACKAGE__, 'delete', []],
229 init => [ __PACKAGE__, 'init', []],
230 reset => [ 'PMG::API2::RuleDB', 'reset_ruledb', []],
231 update => [ __PACKAGE__, 'update', []],
232 };
233
234 1;