# Close file.
close (ERRORFILE);
+
+ # Set correct ownership for the file.
+ &set_ownership("$storederrorfile");
}
#
# 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);
+ }
+
+ # Check if the configured RED_TYPE is static.
+ if ($netsettings{'RED_TYPE'} eq "STATIC") {
+ # Get configured and enabled aliases.
+ my @aliases = &get_aliases();
+
+ # Loop through the array.
+ foreach my $alias (@aliases) {
+ # Add "/32" prefix.
+ my $network = join("/", $alias, "32");
- # Convert current zone name into upper case.
- $zone = uc($zone);
+ # 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";
+ # 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};
+ # 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);
+ }
}
}
close(FILE);
}
+#
+## Function to set correct ownership for single files and directories.
+#
+
+sub set_ownership($) {
+ my ($target) = @_;
+
+ # User and group of the WUI.
+ my $uname = "nobody";
+ my $grname = "nobody";
+
+ # The chown function implemented in perl requies the user and group as nummeric id's.
+ my $uid = getpwnam($uname);
+ my $gid = getgrnam($grname);
+
+ # Check if the given target exists.
+ unless ($target) {
+ # Stop the script and print error message.
+ die "The $target does not exist. Cannot change the ownership!\n";
+ }
+
+ # Check weather the target is a file or directory.
+ if (-f $target) {
+ # Change ownership ot the single file.
+ chown($uid, $gid, "$target");
+ } elsif (-d $target) {
+ # Do a directory listing.
+ opendir(DIR, $target) or die $!;
+ # Loop through the direcory.
+ while (my $file = readdir(DIR)) {
+
+ # We only want files.
+ next unless (-f "$target/$file");
+
+ # Set correct ownership for the files.
+ chown($uid, $gid, "$target/$file");
+ }
+
+ closedir(DIR);
+
+ # Change ownership of the directory.
+ 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;