]> git.ipfire.org Git - thirdparty/xtables-addons.git/commitdiff
geoip: build tool should not rely on directory name
authorJan Engelhardt <jengelh@inai.de>
Fri, 7 Sep 2018 12:59:01 +0000 (14:59 +0200)
committerJan Engelhardt <jengelh@inai.de>
Fri, 7 Sep 2018 13:03:20 +0000 (15:03 +0200)
Fix this:

GeoLite2-Country-CSV_20180905$ /usr/lib/xtables-addons/xt_geoip_build

Use of uninitialized value $dir in concatenation (.) or string at
/usr/lib/xtables-addons/xt_geoip_build line 59.
Couldn't open list country names

Do not rely on any directory names (they change). Use the current
directory as the default source directory, similar to the older
xt_geoip_build (well, *.csv was passed as arguments).

doc/changelog.txt
geoip/xt_geoip_build
geoip/xt_geoip_build.1

index 5eecfbc99f7d5f6de5826a2c3c2177533d327639..e25b4f8426840014d2ed5ab19ee7c106422ad0b3 100644 (file)
@@ -1,6 +1,9 @@
 
 HEAD
 ====
+Changes:
+- rework xt_geoip_build to scan the immediate directory for .csv,
+  not to scan for GeoLite2-Country-CSV_\d+.
 
 
 v3.1 (2018-08-14)
index 1955fbdb7583554a54b211e8b9cf72386ddabc2b..3b158753d9cc962b9ff3dedb014e4752548b3d32 100755 (executable)
@@ -1,6 +1,6 @@
 #!/usr/bin/perl
 #
-#      Converter for MaxMind CSV database to binary, for xt_geoip
+#      Converter for MaxMind (GeoLite2) CSV database to binary, for xt_geoip
 #      Copyright Jan Engelhardt, 2008-2011
 #      Copyright Philip Prindeville, 2018
 #
@@ -16,53 +16,37 @@ my $csv = Text::CSV_XS->new({
        binary => 1,
        eol => $/,
 }); # or Text::CSV
+my $source_dir = ".";
 my $target_dir = ".";
 
 &Getopt::Long::Configure(qw(bundling));
 &GetOptions(
        "D=s" => \$target_dir,
+       "S=s" => \$source_dir,
 );
 
+if (!-d $source_dir) {
+       print STDERR "Source directory \"$source_dir\" does not exist.\n";
+       exit 1;
+}
 if (!-d $target_dir) {
-       print STDERR "Target directory $target_dir does not exist.\n";
+       print STDERR "Target directory \"$target_dir\" does not exist.\n";
        exit 1;
 }
 
 my %countryId;
 my %countryName;
-
-my $dir = findVersion();
-
 &loadCountries();
-
 &dump(&collect());
 
-sub findVersion
-{
-       my @dirs = ();
-
-       opendir(my $dh, '.') || die "Can't open .: $!\n";
-
-       while (readdir $dh) {
-               if ($_ =~ m/^GeoLite2-Country-CSV_\d{8}$/) {
-                       push(@dirs, $_);
-               }
-       }
-       closedir $dh;
-
-       @dirs = sort @dirs;
-       return pop(@dirs);
-}
-
 sub loadCountries
 {
-       my $file = "$dir/GeoLite2-Country-Locations-en.csv";
-
        sub id; sub cc; sub long; sub ct; sub cn;
 
        %countryId = ();
        %countryName = ();
 
+       my $file = "$source_dir/GeoLite2-Country-Locations-en.csv";
        open(my $fh, '<', $file) || die "Couldn't open list country names\n";
 
        # first line is headers
@@ -152,8 +136,7 @@ sub collect
                };
        }
 
-       $file = "$dir/GeoLite2-Country-Blocks-IPv4.csv";
-
+       $file = "$source_dir/GeoLite2-Country-Blocks-IPv4.csv";
        open($fh, '<', $file) || die "Can't open IPv4 database\n";
 
        # first line is headers
@@ -194,8 +177,7 @@ sub collect
        # clean up the namespace
        undef &net; undef &id; undef &rid; undef &proxy; undef &sat;
 
-       $file = "$dir/GeoLite2-Country-Blocks-IPv6.csv";
-
+       $file = "$source_dir/GeoLite2-Country-Blocks-IPv6.csv";
        open($fh, '<', $file) || die "Can't open IPv6 database\n";
 
        # first line is headers
@@ -281,4 +263,3 @@ sub writeCountry
        }
        close $fh;
 }
-
index 20d75b1eb57679355df6e275d568cfb7c970448a..3b6ead31edd405688e692d1244fd6726dd529875 100644 (file)
@@ -5,7 +5,7 @@ xt_geoip_build \(em convert GeoIP.csv to packed format for xt_geoip
 .SH Syntax
 .PP
 \fI/usr/libexec/xt_geoip/\fP\fBxt_geoip_build\fP [\fB\-D\fP
-\fItarget_dir\fP]
+\fItarget_dir\fP] [\fB\-S\fP \fIsource_dir\fP]
 .SH Description
 .PP
 xt_geoip_build is used to build packed raw representations of the range
@@ -16,20 +16,19 @@ required to be loaded into memory. The ranges in the packed database files are
 also ordered, as xt_geoip relies on this property for its bisection approach to
 work.
 .PP
-It expects to find a directory named
-.IR GeoLite2-Country-CSV_YYYYMMDD
-in the current directory, and will select the most recent if multiple
-instances are found.  The
-.IR xt_geoip_dl
-script can be used to populate this directory.
-.PP
 Since the script is usually installed to the libexec directory of the
 xtables-addons package and this is outside $PATH (on purpose), invoking the
 script requires it to be called with a path.
 .PP Options
 .TP
 \fB\-D\fP \fItarget_dir\fP
-Specify a target directory into which the files are to be put.
+Specifies the target directory into which the files are to be put. Defaults to ".".
+.TP
+\fB\-S\fP \fIsource_dir\fP
+Specifies the source directory from which to read the three files by the name
+of \fBGeoLite2\-Country\-Blocks\-IPv4.csv\fP,
+\fBGeoLite2\-Country\-Blocks\-IPv6.csv\fP and
+\fBGeoLite2\-Country\-Locations\-en.csv\fP. Defaults to ".".
 .SH Application
 .PP
 Shell commands to build the databases and put them to where they are expected: