use Encode;
my $hostfw_conf_filename = "/etc/pve/local/host.fw";
-my $clusterfw_conf_filename = "/etc/pve/firewall/cluster.fw";
+my $pvefw_conf_dir = "/etc/pve/firewall";
+my $clusterfw_conf_filename = "$pvefw_conf_dir/cluster.fw";
# dynamically include PVE::QemuServer and PVE::OpenVZ
# to avoid dependency problems
my $vmfw_conf = {};
- $dir = "/etc/pve/firewall" if !defined($dir);
+ $dir = $pvefw_conf_dir if !defined($dir);
my $filename = "$dir/$vmid.fw";
if (my $fh = IO::File->new($filename, O_RDONLY)) {
my $raw = '';
my $options = $vmfw_conf->{options};
- $raw .= &$format_options($options) if scalar(keys %$options);
+ $raw .= &$format_options($options) if $options && scalar(keys %$options);
my $aliases = $vmfw_conf->{aliases};
- $raw .= &$format_aliases($aliases) if scalar(keys %$aliases);
+ $raw .= &$format_aliases($aliases) if $aliases && scalar(keys %$aliases);
- $raw .= &$format_ipsets($vmfw_conf);
+ $raw .= &$format_ipsets($vmfw_conf) if $vmfw_conf->{ipset};
my $rules = $vmfw_conf->{rules} || [];
- if (scalar(@$rules)) {
+ if ($rules && scalar(@$rules)) {
$raw .= "[RULES]\n\n";
$raw .= &$format_rules($rules, 1);
$raw .= "\n";
}
- my $filename = "/etc/pve/firewall/$vmid.fw";
+ mkdir $pvefw_conf_dir;
+
+ my $filename = "$pvefw_conf_dir/$vmid.fw";
PVE::Tools::file_set_contents($filename, $raw);
}
my $raw = '';
my $options = $cluster_conf->{options};
- $raw .= &$format_options($options) if scalar(keys %$options);
+ $raw .= &$format_options($options) if $options && scalar(keys %$options);
my $aliases = $cluster_conf->{aliases};
- $raw .= &$format_aliases($aliases) if scalar(keys %$aliases);
+ $raw .= &$format_aliases($aliases) if $aliases && scalar(keys %$aliases);
- $raw .= &$format_ipsets($cluster_conf);
+ $raw .= &$format_ipsets($cluster_conf) if $cluster_conf->{ipset};
my $rules = $cluster_conf->{rules};
- if (scalar(@$rules)) {
+ if ($rules && scalar(@$rules)) {
$raw .= "[RULES]\n\n";
$raw .= &$format_rules($rules, 1);
$raw .= "\n";
}
- foreach my $group (sort keys %{$cluster_conf->{groups}}) {
- my $rules = $cluster_conf->{groups}->{$group};
- if (my $comment = $cluster_conf->{group_comments}->{$group}) {
- my $utf8comment = encode('utf8', $comment);
- $raw .= "[group $group] # $utf8comment\n\n";
- } else {
- $raw .= "[group $group]\n\n";
- }
+ if ($cluster_conf->{groups}) {
+ foreach my $group (sort keys %{$cluster_conf->{groups}}) {
+ my $rules = $cluster_conf->{groups}->{$group};
+ if (my $comment = $cluster_conf->{group_comments}->{$group}) {
+ my $utf8comment = encode('utf8', $comment);
+ $raw .= "[group $group] # $utf8comment\n\n";
+ } else {
+ $raw .= "[group $group]\n\n";
+ }
- $raw .= &$format_rules($rules, 0);
- $raw .= "\n";
+ $raw .= &$format_rules($rules, 0);
+ $raw .= "\n";
+ }
}
+ mkdir $pvefw_conf_dir;
PVE::Tools::file_set_contents($clusterfw_conf_filename, $raw);
}
my $raw = '';
my $options = $hostfw_conf->{options};
- $raw .= &$format_options($options) if scalar(keys %$options);
+ $raw .= &$format_options($options) if $options && scalar(keys %$options);
my $rules = $hostfw_conf->{rules};
- if (scalar(@$rules)) {
+ if ($rules && scalar(@$rules)) {
$raw .= "[RULES]\n\n";
$raw .= &$format_rules($rules, 1);
$raw .= "\n";