geoip: build tool should not rely on directory name

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).
This commit is contained in:
Jan Engelhardt
2018-09-07 14:59:01 +02:00
parent 30fb410003
commit 5e19871613
3 changed files with 22 additions and 39 deletions

View File

@@ -1,6 +1,9 @@
HEAD 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) v3.1 (2018-08-14)

View File

@@ -1,6 +1,6 @@
#!/usr/bin/perl #!/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 Jan Engelhardt, 2008-2011
# Copyright Philip Prindeville, 2018 # Copyright Philip Prindeville, 2018
# #
@@ -16,53 +16,37 @@ my $csv = Text::CSV_XS->new({
binary => 1, binary => 1,
eol => $/, eol => $/,
}); # or Text::CSV }); # or Text::CSV
my $source_dir = ".";
my $target_dir = "."; my $target_dir = ".";
&Getopt::Long::Configure(qw(bundling)); &Getopt::Long::Configure(qw(bundling));
&GetOptions( &GetOptions(
"D=s" => \$target_dir, "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) { 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; exit 1;
} }
my %countryId; my %countryId;
my %countryName; my %countryName;
my $dir = findVersion();
&loadCountries(); &loadCountries();
&dump(&collect()); &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 sub loadCountries
{ {
my $file = "$dir/GeoLite2-Country-Locations-en.csv";
sub id; sub cc; sub long; sub ct; sub cn; sub id; sub cc; sub long; sub ct; sub cn;
%countryId = (); %countryId = ();
%countryName = (); %countryName = ();
my $file = "$source_dir/GeoLite2-Country-Locations-en.csv";
open(my $fh, '<', $file) || die "Couldn't open list country names\n"; open(my $fh, '<', $file) || die "Couldn't open list country names\n";
# first line is headers # 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"; open($fh, '<', $file) || die "Can't open IPv4 database\n";
# first line is headers # first line is headers
@@ -194,8 +177,7 @@ sub collect
# clean up the namespace # clean up the namespace
undef &net; undef &id; undef &rid; undef &proxy; undef &sat; 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"; open($fh, '<', $file) || die "Can't open IPv6 database\n";
# first line is headers # first line is headers
@@ -281,4 +263,3 @@ sub writeCountry
} }
close $fh; close $fh;
} }

View File

@@ -5,7 +5,7 @@ xt_geoip_build \(em convert GeoIP.csv to packed format for xt_geoip
.SH Syntax .SH Syntax
.PP .PP
\fI/usr/libexec/xt_geoip/\fP\fBxt_geoip_build\fP [\fB\-D\fP \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 .SH Description
.PP .PP
xt_geoip_build is used to build packed raw representations of the range 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 also ordered, as xt_geoip relies on this property for its bisection approach to
work. work.
.PP .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 Since the script is usually installed to the libexec directory of the
xtables-addons package and this is outside $PATH (on purpose), invoking the xtables-addons package and this is outside $PATH (on purpose), invoking the
script requires it to be called with a path. script requires it to be called with a path.
.PP Options .PP Options
.TP .TP
\fB\-D\fP \fItarget_dir\fP \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 .SH Application
.PP .PP
Shell commands to build the databases and put them to where they are expected: Shell commands to build the databases and put them to where they are expected: