From: Stefan Schantl Date: Fri, 14 Apr 2023 17:36:41 +0000 (+0200) Subject: ipset-functions.pl: Add ipset_load_set function. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=709e40d60d71dfc031da705f425f5ade4815e6a2;p=people%2Fstevee%2Fipfire-2.x.git ipset-functions.pl: Add ipset_load_set function. This function can be used to load/update a given set and it's data. Signed-off-by: Stefan Schantl --- diff --git a/config/cfgroot/ipset-functions.pl b/config/cfgroot/ipset-functions.pl index 85f8640481..e4c10b41b3 100644 --- a/config/cfgroot/ipset-functions.pl +++ b/config/cfgroot/ipset-functions.pl @@ -160,6 +160,77 @@ sub ipset_set_data($) { return &IPSet::get_set_data($session, $name); } +# +## Load ipset set function. +## +## This function is responsible to load/update a given set. +## +## It uses the ipset perl bindings to directly interact with ipset +## and load the list into the kernel. +## +## Params: +## The setname as a string as fist argument +## The data to load as an array as second argument +## +## Returns: +## The error message as a string if an error happend +# +sub ipset_load_set($@) { + my ($name, @data) = @_; + + # Check if the given set exists. + my $exists = &ipset_exists($name); + + # Call functions to detect and calculate the type and hashsize and + # omit the maxelems. + my $setname = $name; + my $type = &detect_hashtype(@data); + my $maxelem = @data; + my $hashsize = &calculate_hashsize($maxelem); + + # Get a a random set name. + my $rand_name = &random_setname(); + + # If the given set allready exists, assign the random generated name. + $setname = $rand_name if($exists); + + # Create a new empty set. + my $error = &ipset_create($setname, $type, $hashsize, $maxelem); + + # Abort and return the error if there was one. + return $error if(($error) && ($error ne "1")); + + # Add the data to the recently created set. + &add_to_set($setname, @data); + + # We are finished here and can return, if the set has not exist yet. + return unless($exists); + + # Get the data of the existing set. + my $set_data = &ipset_set_data($name); + + # Return if the data of the set could not be grabbed. + return "No data" unless($set_data); + + # Check if the old and the new types are eqal. + if ($set_data->{type} eq $type) { + # The type is the same and we easily can swap the sets. + &ipset_swap($setname, $name); + + # Remove the old one. + &ipset_remove($setname); + } else { + # Abort if the set is currently in use. + return "Set in use" if($set_data->{references} gt 0); + + # Drop the old set first. + &ipset_remove($name); + + # Rename the set + &ipset_rename($setname, $name); + } +} + # ## Tiny helper function to detect the hashtype, based on the given data. #