parse_port_name_number_or_range fix range check
[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