]>
Commit | Line | Data |
---|---|---|
82782d70 | 1 | package PMG::CLI::pmgdb; |
8b91b776 DM |
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; | |
595f5e50 | 10 | use PVE::CLIHandler; |
8b91b776 | 11 | |
75ce5866 | 12 | use PMG::Utils; |
80a43e18 | 13 | use PMG::RESTEnvironment; |
a355f100 | 14 | use PMG::DBTools; |
595f5e50 | 15 | use PMG::RuleDB; |
354ae1b2 | 16 | use PMG::Cluster; |
9f67f5b3 | 17 | use PMG::ClusterConfig; |
354ae1b2 | 18 | use PMG::Statistic; |
a355f100 | 19 | |
1c0bc64c DM |
20 | use PMG::API2::RuleDB; |
21 | ||
8b91b776 DM |
22 | use base qw(PVE::CLIHandler); |
23 | ||
80a43e18 DM |
24 | sub setup_environment { |
25 | PMG::RESTEnvironment->setup_default_cli_env(); | |
26 | } | |
27 | ||
c881fe35 DM |
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 | ||
0d161f4d SI |
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"; | |
c881fe35 DM |
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 | } | |
8b91b776 | 76 | |
8b91b776 DM |
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, | |
6d9a036f | 84 | properties => {}, |
8b91b776 DM |
85 | }, |
86 | returns => { type => 'null'}, | |
87 | code => sub { | |
88 | my ($param) = @_; | |
89 | ||
c881fe35 DM |
90 | my $dbh = PMG::DBTools::open_ruledb("Proxmox_ruledb"); |
91 | my $ruledb = PMG::RuleDB->new($dbh); | |
92 | ||
c881fe35 DM |
93 | my $rules = $ruledb->load_rules(); |
94 | ||
95 | foreach my $rule (@$rules) { | |
96 | print_rule($ruledb, $rule); | |
97 | } | |
98 | ||
99 | $ruledb->close(); | |
8b91b776 DM |
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, | |
6d9a036f | 112 | properties => {}, |
8b91b776 DM |
113 | }, |
114 | returns => { type => 'null'}, | |
115 | code => sub { | |
116 | my ($param) = @_; | |
117 | ||
f1bf78ff DM |
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}; | |
a355f100 | 123 | |
8b91b776 DM |
124 | syslog('info', "delete rule database"); |
125 | ||
f1bf78ff | 126 | PMG::DBTools::delete_ruledb($dbname); |
8b91b776 DM |
127 | |
128 | return undef; | |
129 | }}); | |
130 | ||
8b91b776 | 131 | __PACKAGE__->register_method ({ |
dfcae855 DM |
132 | name => 'init', |
133 | path => 'init', | |
8b91b776 | 134 | method => 'POST', |
dfcae855 | 135 | description => "Initialize/Upgrade the PMG rule database.", |
8b91b776 DM |
136 | parameters => { |
137 | additionalProperties => 0, | |
138 | properties => { | |
f1bf78ff | 139 | force => { |
8b91b776 | 140 | type => 'boolean', |
f1bf78ff | 141 | description => "Delete existing database.", |
8b91b776 DM |
142 | optional => 1, |
143 | default => 0, | |
144 | }, | |
145 | statistics => { | |
146 | type => 'boolean', | |
dfcae855 | 147 | description => "Reset and update statistic database.", |
8b91b776 | 148 | optional => 1, |
dfcae855 | 149 | default => 0, |
8b91b776 DM |
150 | }, |
151 | } | |
152 | }, | |
153 | returns => { type => 'null'}, | |
154 | code => sub { | |
155 | my ($param) = @_; | |
156 | ||
75ce5866 DM |
157 | PMG::Utils::cond_add_default_locale(); |
158 | ||
f1bf78ff DM |
159 | my $list = PMG::DBTools::database_list(); |
160 | ||
161 | my $dbname = "Proxmox_ruledb"; | |
162 | ||
163 | if (!$list->{$dbname} || $param->{force}) { | |
8b91b776 | 164 | |
f1bf78ff DM |
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); | |
f4fe6fc4 | 173 | my $ruledb = PMG::RuleDB->new($dbh); |
0a580593 | 174 | PMG::DBTools::init_ruledb($ruledb); |
f1bf78ff DM |
175 | |
176 | $dbh->disconnect(); | |
177 | ||
178 | } else { | |
179 | ||
180 | my $dbh = PMG::DBTools::open_ruledb("Proxmox_ruledb"); | |
e7c865af | 181 | my $ruledb = PMG::RuleDB->new($dbh); |
f1bf78ff | 182 | |
0a580593 | 183 | print "Analyzing/Upgrading existing Databases..."; |
f4fe6fc4 | 184 | PMG::DBTools::upgradedb ($ruledb); |
0a580593 | 185 | print "done\n"; |
f1bf78ff DM |
186 | |
187 | # reset and update statistic databases | |
188 | if ($param->{statistics}) { | |
189 | print "Generating Proxmox Statistic Databases... "; | |
354ae1b2 DM |
190 | PMG::Statistic::clear_stats($dbh); |
191 | my $cinfo = PVE::INotify::read_file("cluster.conf"); | |
192 | PMG::Statistic::update_stats($dbh, $cinfo); | |
f1bf78ff DM |
193 | print "done\n"; |
194 | } | |
195 | ||
196 | $dbh->disconnect(); | |
197 | } | |
a355f100 | 198 | |
8b91b776 DM |
199 | return undef; |
200 | }}); | |
201 | ||
202 | ||
354ae1b2 DM |
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, | |
6d9a036f | 210 | properties => {}, |
354ae1b2 DM |
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 | ||
8b91b776 DM |
226 | our $cmddef = { |
227 | 'dump' => [ __PACKAGE__, 'dump', []], | |
228 | delete => [ __PACKAGE__, 'delete', []], | |
dfcae855 | 229 | init => [ __PACKAGE__, 'init', []], |
1c0bc64c | 230 | reset => [ 'PMG::API2::RuleDB', 'reset_ruledb', []], |
354ae1b2 | 231 | update => [ __PACKAGE__, 'update', []], |
8b91b776 DM |
232 | }; |
233 | ||
234 | 1; |