]> git.proxmox.com Git - pve-firewall.git/blame - src/PVE/API2/Firewall/Host.pm
proxy host rule API calls to correct node
[pve-firewall.git] / src / PVE / API2 / Firewall / Host.pm
CommitLineData
8b27beb9
DM
1package PVE::API2::Firewall::Host;
2
3use strict;
4use warnings;
5use PVE::JSONSchema qw(get_standard_option);
a959126d 6use PVE::RPCEnvironment;
8b27beb9
DM
7
8use PVE::Firewall;
63c91681 9use PVE::API2::Firewall::Rules;
8b27beb9
DM
10
11use Data::Dumper; # fixme: remove
12
13use base qw(PVE::RESTHandler);
14
63c91681
DM
15__PACKAGE__->register_method ({
16 subclass => "PVE::API2::Firewall::HostRules",
17 path => 'rules',
18});
19
8b27beb9
DM
20__PACKAGE__->register_method({
21 name => 'index',
22 path => '',
23 method => 'GET',
24 permissions => { user => 'all' },
25 description => "Directory index.",
26 parameters => {
27 additionalProperties => 0,
28 properties => {
29 node => get_standard_option('pve-node'),
30 },
31 },
32 returns => {
33 type => 'array',
34 items => {
35 type => "object",
36 properties => {},
37 },
38 links => [ { rel => 'child', href => "{name}" } ],
39 },
40 code => sub {
41 my ($param) = @_;
42
43 my $result = [
44 { name => 'rules' },
45 { name => 'options' },
a959126d 46 { name => 'log' },
8b27beb9
DM
47 ];
48
49 return $result;
50 }});
51
6302c41f
DM
52my $option_properties = {
53 enable => {
54 description => "Enable host firewall rules.",
55 type => 'boolean',
56 optional => 1,
57 },
58 log_level_in => get_standard_option('pve-fw-loglevel', {
59 description => "Log level for incoming traffic." }),
60 log_level_out => get_standard_option('pve-fw-loglevel', {
61 description => "Log level for outgoing traffic." }),
62 tcp_flags_log_level => get_standard_option('pve-fw-loglevel', {
63 description => "Log level for illegal tcp flags filter." }),
64 smurf_log_level => get_standard_option('pve-fw-loglevel', {
65 description => "Log level for SMURFS filter." }),
66 nosmurfs => {
67 description => "Enable SMURFS filter.",
68 type => 'boolean',
69 optional => 1,
70 },
71 tcpflags => {
72 description => "Filter illegal combinations of TCP flags.",
73 type => 'boolean',
74 optional => 1,
75 },
6302c41f
DM
76 nf_conntrack_max => {
77 description => "Maximum number of tracked connections.",
78 type => 'integer',
79 optional => 1,
80 minimum => 32768,
81 },
82 nf_conntrack_tcp_timeout_established => {
83 description => "Conntrack established timeout.",
84 type => 'integer',
85 optional => 1,
86 minimum => 7875,
87 }
88};
89
90my $add_option_properties = sub {
91 my ($properties) = @_;
92
93 foreach my $k (keys %$option_properties) {
94 $properties->{$k} = $option_properties->{$k};
95 }
96
97 return $properties;
98};
99
100
8b27beb9
DM
101__PACKAGE__->register_method({
102 name => 'get_options',
103 path => 'options',
104 method => 'GET',
105 description => "Get host firewall options.",
106 proxyto => 'node',
107 parameters => {
108 additionalProperties => 0,
109 properties => {
110 node => get_standard_option('pve-node'),
111 },
112 },
113 returns => {
114 type => "object",
6302c41f
DM
115 #additionalProperties => 1,
116 properties => $option_properties,
8b27beb9
DM
117 },
118 code => sub {
119 my ($param) = @_;
120
121 my $hostfw_conf = PVE::Firewall::load_hostfw_conf();
122
5d38d64f 123 return PVE::Firewall::copy_opject_with_digest($hostfw_conf->{options});
8b27beb9
DM
124 }});
125
6302c41f
DM
126__PACKAGE__->register_method({
127 name => 'set_options',
128 path => 'options',
129 method => 'PUT',
130 description => "Set Firewall options.",
131 protected => 1,
132 proxyto => 'node',
133 parameters => {
134 additionalProperties => 0,
135 properties => &$add_option_properties({
136 node => get_standard_option('pve-node'),
137 delete => {
138 type => 'string', format => 'pve-configid-list',
139 description => "A list of settings you want to delete.",
140 optional => 1,
141 },
142 digest => get_standard_option('pve-config-digest'),
143 }),
144 },
145 returns => { type => "null" },
146 code => sub {
147 my ($param) = @_;
148
149 my $hostfw_conf = PVE::Firewall::load_hostfw_conf();
150
151 my (undef, $digest) = PVE::Firewall::copy_opject_with_digest($hostfw_conf->{options});
152 PVE::Tools::assert_if_modified($digest, $param->{digest});
153
154 if ($param->{delete}) {
155 foreach my $opt (PVE::Tools::split_list($param->{delete})) {
156 raise_param_exc({ delete => "no such option '$opt'" })
157 if !$option_properties->{$opt};
158 delete $hostfw_conf->{options}->{$opt};
159 }
160 }
161
162 if (defined($param->{enable})) {
163 $param->{enable} = $param->{enable} ? 1 : 0;
164 }
165
166 foreach my $k (keys %$option_properties) {
167 next if !defined($param->{$k});
168 $hostfw_conf->{options}->{$k} = $param->{$k};
169 }
170
171 PVE::Firewall::save_hostfw_conf($hostfw_conf);
172
173 return undef;
174 }});
175
a959126d
DM
176__PACKAGE__->register_method({
177 name => 'log',
178 path => 'log',
179 method => 'GET',
180 description => "Read firewall log",
181 proxyto => 'node',
182 permissions => {
183 check => ['perm', '/nodes/{node}', [ 'Sys.Syslog' ]],
184 },
185 protected => 1,
186 parameters => {
187 additionalProperties => 0,
188 properties => {
189 node => get_standard_option('pve-node'),
190 start => {
191 type => 'integer',
192 minimum => 0,
193 optional => 1,
194 },
195 limit => {
196 type => 'integer',
197 minimum => 0,
198 optional => 1,
199 },
200 },
201 },
202 returns => {
203 type => 'array',
204 items => {
205 type => "object",
206 properties => {
207 n => {
208 description=> "Line number",
209 type=> 'integer',
210 },
211 t => {
212 description=> "Line text",
213 type => 'string',
214 }
215 }
216 }
217 },
218 code => sub {
219 my ($param) = @_;
220
221 my $rpcenv = PVE::RPCEnvironment::get();
222 my $user = $rpcenv->get_user();
223 my $node = $param->{node};
224
225 my ($count, $lines) = PVE::Tools::dump_logfile("/var/log/pve-firewall.log", $param->{start}, $param->{limit});
226
227 $rpcenv->set_result_attrib('total', $count);
228
229 return $lines;
230 }});
231
8b27beb9 2321;