]> git.ipfire.org Git - ipfire-2.x.git/blobdiff - config/cfgroot/ids-functions.pl
ids-functions.pl: Use GET method to fetch Header data of a file
[ipfire-2.x.git] / config / cfgroot / ids-functions.pl
index d8044b4e86bb3d6d5975c52e908e9a88ebb79224..afccf43263d813289e663bda433675f9f2e2b03d 100644 (file)
@@ -211,7 +211,7 @@ sub downloadruleset {
        }
 
        # Pass the requrested url to the downloader.
-       my $request = HTTP::Request->new(HEAD => $url);
+       my $request = HTTP::Request->new(GET => $url);
 
        # Accept the html header.
        $request->header('Accept' => 'text/html');
@@ -222,7 +222,7 @@ sub downloadruleset {
        # Check if there was any error.
        unless ($response->is_success) {
                # Obtain error.
-               my $error = $response->content;
+               my $error = $response->status_line();
 
                # Log error message.
                &_log_to_syslog("Unable to download the ruleset. \($error\)");
@@ -232,7 +232,7 @@ sub downloadruleset {
        }
 
        # Assign the fetched header object.
-       my $header = $response->headers;
+       my $header = $response->headers();
 
        # Grab the remote file size from the object and store it in the
        # variable.
@@ -387,6 +387,9 @@ sub _store_error_message ($) {
 
         # Close file.
         close (ERRORFILE);
+
+       # Set correct ownership for the file.
+       &set_ownership("$storederrorfile");
 }
 
 #
@@ -594,30 +597,58 @@ sub generate_home_net_file() {
 
        # Loop through the array of available network zones.
        foreach my $zone (@network_zones) {
-               # Skip the red network - It never can be part to the home_net!
-               next if($zone eq "red");
+               # Check if the current processed zone is red.
+               if($zone eq "red") {
+                       # Grab the IP-address of the red interface.
+                       my $red_address = &get_red_address();
+
+                       # Check if an address has been obtained.
+                       if ($red_address) {
+                               # Generate full network string.
+                               my $red_network = join("/", $red_address, "32");
+
+                               # Add the red network to the array of networks.
+                               push(@networks, $red_network);
+                       }
 
-               # Convert current zone name into upper case.
-               $zone = uc($zone);
+                       # Check if the configured RED_TYPE is static.
+                       if ($netsettings{'RED_TYPE'} eq "STATIC") {
+                               # Get configured and enabled aliases.
+                               my @aliases = &get_aliases();
 
-               # Generate key to access the required data from the netsettings hash.
-               my $zone_netaddress = $zone . "_NETADDRESS";
-               my $zone_netmask = $zone . "_NETMASK";
+                               # Loop through the array.
+                               foreach my $alias (@aliases) {
+                                       # Add "/32" prefix.
+                                       my $network = join("/", $alias, "32");
 
-               # Obtain the settings from the netsettings hash.
-               my $netaddress = $netsettings{$zone_netaddress};
-               my $netmask = $netsettings{$zone_netmask};
+                                       # Add the generated network to the array of networks.
+                                       push(@networks, $network);
+                               }
+                       }
+               # Process remaining network zones.
+               } else {
+                       # Convert current zone name into upper case.
+                       $zone = uc($zone);
+
+                       # Generate key to access the required data from the netsettings hash.
+                       my $zone_netaddress = $zone . "_NETADDRESS";
+                       my $zone_netmask = $zone . "_NETMASK";
+
+                       # Obtain the settings from the netsettings hash.
+                       my $netaddress = $netsettings{$zone_netaddress};
+                       my $netmask = $netsettings{$zone_netmask};
 
-               # Convert the subnetmask into prefix notation.
-               my $prefix = &Network::convert_netmask2prefix($netmask);
+                       # Convert the subnetmask into prefix notation.
+                       my $prefix = &Network::convert_netmask2prefix($netmask);
 
-               # Generate full network string.
-               my $network = join("/", $netaddress,$prefix);
+                       # Generate full network string.
+                       my $network = join("/", $netaddress,$prefix);
 
-               # Check if the network is valid.
-               if(&Network::check_subnet($network)) {
-                       # Add the generated network to the array of networks.
-                       push(@networks, $network);
+                       # Check if the network is valid.
+                       if(&Network::check_subnet($network)) {
+                               # Add the generated network to the array of networks.
+                               push(@networks, $network);
+                       }
                }
        }
 
@@ -838,4 +869,81 @@ sub set_ownership($) {
                chown($uid, $gid, "$target");
        }
 }
+
+#
+## Function to read-in the aliases file and returns all configured and enabled aliases.
+#
+sub get_aliases() {
+       # Location of the aliases file.
+       my $aliases_file = "${General::swroot}/ethernet/aliases";
+
+       # Array to store the aliases.
+       my @aliases;
+
+       # Check if the file is empty.
+       if (-z $aliases_file) {
+               # Abort nothing to do.
+               return;
+       }
+
+       # Open the aliases file.
+       open(ALIASES, $aliases_file) or die "Could not open $aliases_file. $!\n";
+
+       # Loop through the file content.
+       while (my $line = <ALIASES>) {
+               # Remove newlines.
+               chomp($line);
+
+               # Splitt line content into single chunks.
+               my ($address, $state, $remark) = split(/\,/, $line);
+
+               # Check if the state of the current processed alias is "on".
+               if ($state eq "on") {
+                       # Check if the address is valid.
+                       if(&Network::check_ip_address($address)) {
+                               # Add the alias to the array of aliases.
+                               push(@aliases, $address);
+                       }
+               }
+       }
+
+       # Close file handle.
+       close(ALIASES);
+
+       # Return the array.
+       return @aliases;
+}
+
+#
+## Function to grab the current assigned IP-address on red.
+#
+sub get_red_address() {
+       # File, which contains the current IP-address of the red interface.
+       my $file = "${General::swroot}/red/local-ipaddress";
+
+       # Check if the file exists.
+       if (-e $file) {
+               # Open the given file.
+               open(FILE, "$file") or die "Could not open $file.";
+
+               # Obtain the address from the first line of the file.
+               my $address = <FILE>;
+
+               # Close filehandle
+               close(FILE);
+
+               # Remove newlines.
+               chomp $address;
+
+               # Check if the grabbed address is valid.
+               if (&General::validip($address)) {
+                       # Return the address.
+                       return $address;
+               }
+       }
+
+       # Return nothing.
+       return;
+}
+
 1;