use IPCC to read FW files if the are backed by pmxcfs
authorThomas Lamprecht <t.lamprecht@proxmox.com>
Thu, 11 Apr 2019 13:28:36 +0000 (15:28 +0200)
committerWolfgang Bumiller <w.bumiller@proxmox.com>
Wed, 17 Apr 2019 11:01:45 +0000 (13:01 +0200)
This allows us to profit from the IPCC pmxcfs restart mechanisms,
which will block this call for the grace period (~10 seconds) and
transparently try to reconnect to the IPCC interface of pmxcfs, if a
restart is detected..

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
src/PVE/Firewall.pm

index 72d5a69..4dfb7cc 100644 (file)
@@ -2801,21 +2801,27 @@ sub parse_alias {
 sub generic_fw_config_parser {
     my ($filename, $cluster_conf, $empty_conf, $rule_env) = @_;
 
-    my $fh = IO::File->new($filename, O_RDONLY);
-    return {} if !$fh;
-
     my $section;
     my $group;
 
     my $res = $empty_conf;
 
-    while (defined(my $line = <$fh>)) {
+    my $raw;
+    if ($filename =~ m!^/etc/pve/(.*)$!) {
+       $raw = PVE::Cluster::get_config($1);
+    } else {
+       $raw = eval { PVE::Tools::file_get_contents($filename) }; # ignore errors
+    }
+    return {} if !$raw;
+
+    my $linenr = 0;
+    while ($raw =~ /^\h*(.*?)\h*$/gm) {
+       my $line = $1;
+       $linenr++;
        next if $line =~ m/^#/;
        next if $line =~ m/^\s*$/;
-
        chomp $line;
 
-       my $linenr = $fh->input_line_number();
        my $prefix = "$filename (line $linenr)";
 
        if ($empty_conf->{options} && ($line =~ m/^\[options\]$/i)) {