check chain name length (max 28 chars)
[pve-firewall.git] / pvefw
1 #!/usr/bin/perl -w
2
3 use strict;
4 use lib qw(.);
5 use PVE::Firewall;
6
7 use PVE::SafeSyslog;
8 use PVE::Cluster;
9 use PVE::INotify;
10 use PVE::RPCEnvironment;
11
12 use PVE::JSONSchema qw(get_standard_option);
13
14 use PVE::CLIHandler;
15
16 use base qw(PVE::CLIHandler);
17
18 $ENV{'PATH'} = '/sbin:/bin:/usr/sbin:/usr/bin';
19
20 initlog ('pvefw');
21
22 die "please run as root\n" if $> != 0;
23
24 PVE::INotify::inotify_init();
25
26 my $rpcenv = PVE::RPCEnvironment->init('cli');
27
28 $rpcenv->init_request();
29 $rpcenv->set_language($ENV{LANG});
30 $rpcenv->set_user('root@pam');
31
32 __PACKAGE__->register_method ({
33 name => 'compile',
34 path => 'compile',
35 method => 'POST',
36 description => "Compile amd print firewall rules. This is only for testing.",
37 parameters => {
38 additionalProperties => 0,
39 properties => {
40 verbose => {
41 description => "Verbose output.",
42 type => "boolean",
43 optional => 1,
44 default => 0,
45 },
46 },
47 },
48 returns => { type => 'null' },
49
50 code => sub {
51 my ($param) = @_;
52
53 my $code = sub {
54 my $ruleset = PVE::Firewall::compile();
55 PVE::Firewall::get_ruleset_status($ruleset, 1) if $param->{verbose};
56 };
57
58 PVE::Firewall::run_locked($code);
59
60 return undef;
61 }});
62
63 __PACKAGE__->register_method ({
64 name => 'start',
65 path => 'start',
66 method => 'POST',
67 description => "Start (or restart if already active) firewall.",
68 parameters => {
69 additionalProperties => 0,
70 properties => {
71 verbose => {
72 description => "Verbose output.",
73 type => "boolean",
74 optional => 1,
75 default => 0,
76 },
77 },
78 },
79 returns => { type => 'null' },
80
81 code => sub {
82 my ($param) = @_;
83
84 my $code = sub {
85 my $ruleset = PVE::Firewall::compile();
86 PVE::Firewall::apply_ruleset($ruleset, $param->{verbose});
87 };
88
89 PVE::Firewall::run_locked($code);
90
91 return undef;
92 }});
93
94 __PACKAGE__->register_method ({
95 name => 'stop',
96 path => 'stop',
97 method => 'POST',
98 description => "Stop firewall. This will remove all rules installed by this script. The host is then unprotected.",
99 parameters => {
100 additionalProperties => 0,
101 properties => {},
102 },
103 returns => { type => 'null' },
104
105 code => sub {
106 my ($param) = @_;
107
108 my $code = sub {
109 my $chash = PVE::Firewall::iptables_get_chains();
110 my $cmdlist = "*filter\n";
111 my $rule = "INPUT -j PVEFW-INPUT";
112 if (PVE::Firewall::iptables_rule_exist($rule)) {
113 $cmdlist .= "-D $rule\n";
114 }
115 $rule = "OUTPUT -j PVEFW-OUTPUT";
116 if (PVE::Firewall::iptables_rule_exist($rule)) {
117 $cmdlist .= "-D $rule\n";
118 }
119
120 $rule = "FORWARD -j PVEFW-FORWARD";
121 if (PVE::Firewall::iptables_rule_exist($rule)) {
122 $cmdlist .= "-D $rule\n";
123 }
124
125 foreach my $chain (keys %$chash) {
126 $cmdlist .= "-F $chain\n";
127 }
128 foreach my $chain (keys %$chash) {
129 $cmdlist .= "-X $chain\n";
130 }
131 $cmdlist .= "COMMIT\n";
132
133 PVE::Firewall::iptables_restore_cmdlist($cmdlist);
134 };
135
136 PVE::Firewall::run_locked($code);
137
138 return undef;
139 }});
140
141 my $nodename = PVE::INotify::nodename();
142
143 my $cmddef = {
144 compile => [ __PACKAGE__, 'compile', []],
145 start => [ __PACKAGE__, 'start', []],
146 stop => [ __PACKAGE__, 'stop', []],
147 };
148
149 my $cmd = shift;
150
151 PVE::CLIHandler::handle_cmd($cmddef, "pvefw", $cmd, \@ARGV, undef, $0);
152
153 exit(0);
154