use strict;
use lib qw(.);
use PVE::Firewall;
-use File::Path;
-use IO::File;
-use Data::Dumper;
use PVE::SafeSyslog;
use PVE::Cluster;
use PVE::INotify;
use PVE::RPCEnvironment;
-use PVE::QemuServer;
use PVE::JSONSchema qw(get_standard_option);
$rpcenv->set_language($ENV{LANG});
$rpcenv->set_user('root@pam');
+__PACKAGE__->register_method({
+ name => 'enabletaprules',
+ path => 'enabletaprules',
+ method => 'POST',
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ vmid => get_standard_option('pve-vmid'),
+ netid => {
+ type => 'string',
+ },
+
+ },
+ },
+ returns => { type => 'null' },
+ code => sub {
+ my ($param) = @_;
-sub parse_fw_rules {
- my ($filename, $fh) = @_;
-
- my $section;
-
- my $res = { in => [], out => [] };
-
- my $macros = PVE::Firewall::get_shorewall_macros();
-
- while (defined(my $line = <$fh>)) {
- next if $line =~ m/^#/;
- next if $line =~ m/^\s*$/;
-
- if ($line =~ m/^\[(in|out)\]\s*$/i) {
- $section = lc($1);
- next;
- }
- next if !$section;
-
- my ($action, $iface, $source, $dest, $proto, $dport, $sport) =
- split(/\s+/, $line);
-
- if (!$action) {
- warn "skip incomplete line\n";
- next;
- }
-
- my $service;
- if ($action =~ m/^(ACCEPT|DROP|REJECT)$/) {
- # OK
- } elsif ($action =~ m/^(\S+)\((ACCEPT|DROP|REJECT)\)$/) {
- ($service, $action) = ($1, $2);
- if (!$macros->{$service}) {
- warn "unknown service '$service'\n";
- next;
- }
- } else {
- warn "unknown action '$action'\n";
- next;
- }
-
- $iface = undef if $iface && $iface eq '-';
- if ($iface && $iface !~ m/^(net0|net1|net2|net3|net4|net5)$/) {
- warn "unknown interface '$iface'\n";
- next;
- }
-
- $proto = undef if $proto && $proto eq '-';
- if ($proto && $proto !~ m/^(icmp|tcp|udp)$/) {
- warn "unknown protokol '$proto'\n";
- next;
- }
-
- $source = undef if $source && $source eq '-';
-
-# if ($source !~ m/^(XYZ)$/) {
-# warn "unknown source '$source'\n";
-# next;
-# }
-
- $dest = undef if $dest && $dest eq '-';
-# if ($dest !~ m/^XYZ)$/) {
-# warn "unknown destination '$dest'\n";
-# next;
-# }
-
- $dport = undef if $dport && $dport eq '-';
- $sport = undef if $sport && $sport eq '-';
-
- my $rule = {
- action => $action,
- service => $service,
- iface => $iface,
- source => $source,
- dest => $dest,
- proto => $proto,
- dport => $dport,
- sport => $sport,
- };
-
- push @{$res->{$section}}, $rule;
- }
-
- return $res;
-}
+ # test if VM exists
+ my $vmid = $param->{vmid};
+ my $netid = $param->{netid};
-sub read_local_vm_config {
+ my $conf = PVE::QemuServer::load_config($vmid);
+ my $net = PVE::QemuServer::parse_net($conf->{$netid});
- my $openvz = {};
+ PVE::Firewall::generate_tap_rules($net, $netid, $vmid);
- my $qemu = {};
+ return undef;
+ }});
- my $list = PVE::QemuServer::config_list();
+__PACKAGE__->register_method({
+ name => 'disabletaprules',
+ path => 'disabletaprules',
+ method => 'POST',
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ vmid => get_standard_option('pve-vmid'),
+ netid => {
+ type => 'string',
+ },
+
+ },
+ },
+ returns => { type => 'null' },
+ code => sub {
+ my ($param) = @_;
- foreach my $vmid (keys %$list) {
- # next if $vmid ne '100';
- my $cfspath = PVE::QemuServer::cfs_config_path($vmid);
- if (my $conf = PVE::Cluster::cfs_read_file($cfspath)) {
- $qemu->{$vmid} = $conf;
- }
- }
-
- my $vmdata = { openvz => $openvz, qemu => $qemu };
-
- return $vmdata;
-};
+ # test if VM exists
+ my $vmid = $param->{vmid};
+ my $netid = $param->{netid};
-sub read_vm_firewall_rules {
- my ($vmdata) = @_;
- my $rules = {};
- foreach my $vmid (keys %{$vmdata->{qemu}}, keys %{$vmdata->{openvz}}) {
- my $filename = "/etc/pve/firewall/$vmid.fw";
- my $fh = IO::File->new($filename, O_RDONLY);
- next if !$fh;
+ my $conf = PVE::QemuServer::load_config($vmid);
+ my $net = PVE::QemuServer::parse_net($conf->{$netid});
- $rules->{$vmid} = parse_fw_rules($filename, $fh);
- }
+ PVE::Firewall::flush_tap_rules($net, $netid, $vmid);
- return $rules;
-}
+ return undef;
+ }});
__PACKAGE__->register_method ({
name => 'compile',
code => sub {
my ($param) = @_;
- my $vmdata = read_local_vm_config();
- my $rules = read_vm_firewall_rules($vmdata);
+ PVE::Firewall::compile();
- # print Dumper($vmdata);
+ return undef;
+ }});
- my $swdir = '/etc/shorewall';
- mkdir $swdir;
+__PACKAGE__->register_method ({
+ name => 'start',
+ path => 'start',
+ method => 'POST',
+ description => "Start firewall.",
+ parameters => {
+ additionalProperties => 0,
+ properties => {},
+ },
+ returns => { type => 'null' },
- PVE::Firewall::compile($swdir, $vmdata, $rules);
+ code => sub {
+ my ($param) = @_;
- PVE::Tools::run_command(['shorewall', 'compile']);
+ PVE::Firewall::compile_and_start();
return undef;
-
}});
__PACKAGE__->register_method ({
- name => 'start',
- path => 'start',
+ name => 'restart',
+ path => 'restart',
method => 'POST',
- description => "Start firewall.",
+ description => "Restart firewall.",
parameters => {
additionalProperties => 0,
properties => {},
code => sub {
my ($param) = @_;
- PVE::Tools::run_command(['shorewall', 'start']);
+ PVE::Firewall::compile_and_start(1);
return undef;
}});
my $cmddef = {
compile => [ __PACKAGE__, 'compile', []],
start => [ __PACKAGE__, 'start', []],
+ restart => [ __PACKAGE__, 'restart', []],
stop => [ __PACKAGE__, 'stop', []],
clear => [ __PACKAGE__, 'clear', []],
+ enabletaprules => [ __PACKAGE__, 'enabletaprules', []],
+ disabletaprules => [ __PACKAGE__, 'disabletaprules', []],
};
my $cmd = shift;