Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions scripts/maint/geoip/maxmind/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
geoipgen/target/
geoipgen/CArgo.lock
12 changes: 12 additions & 0 deletions scripts/maint/geoip/maxmind/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Navigate to the directory where the script is located

```
cd scripts/maint/geoip/maxmind
```

# Run the script

```
./update_geoipdb.sh
```

9 changes: 9 additions & 0 deletions scripts/maint/geoip/maxmind/geoipgen/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
[workspace]

[package]
name = "geoipgen"
version = "0.1.0"
edition = "2021"

[dependencies]
ipnetwork = "0.20"
57 changes: 57 additions & 0 deletions scripts/maint/geoip/maxmind/geoipgen/src/main.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
use std::collections::HashMap;
use std::fs::File;
use std::io::{BufRead, BufReader, Write};
use std::net::IpAddr;
use ipnetwork::IpNetwork;

fn ipv4_to_u32(ip: std::net::Ipv4Addr) -> u32 {
u32::from(ip)
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
let loc_file = BufReader::new(File::open("geoip-csv/GeoLite2-Country-Locations-en.csv")?);
let mut id_map = HashMap::new();

for line in loc_file.lines().skip(1) {
let line = line?;
let fields: Vec<&str> = line.split(',').collect();
Copy link

Copilot AI Apr 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider using a dedicated CSV parsing library (e.g., the 'csv' crate) to handle edge cases like quoted fields containing commas for improved data reliability.

Copilot uses AI. Check for mistakes.
if fields.len() > 5 && !fields[0].is_empty() && !fields[4].is_empty() {
id_map.insert(fields[0].to_string(), fields[4].to_string()); // geoname_id -> iso_code
}
}

let mut geoip = File::create("geoip")?;
let v4_file = BufReader::new(File::open("geoip-csv/GeoLite2-Country-Blocks-IPv4.csv")?);
for line in v4_file.lines().skip(1) {
let line = line?;
let fields: Vec<&str> = line.split(',').collect();
if fields.len() > 1 {
if let Some(iso) = id_map.get(fields[1]) {
if let Ok(IpNetwork::V4(net)) = fields[0].parse() {
let start = ipv4_to_u32(net.network());
let end = ipv4_to_u32(net.broadcast());
writeln!(geoip, "{},{},{}", start, end, iso)?;
}
}
}
}

let mut geoip6 = File::create("geoip6")?;
let v6_file = BufReader::new(File::open("geoip-csv/GeoLite2-Country-Blocks-IPv6.csv")?);
for line in v6_file.lines().skip(1) {
let line = line?;
let fields: Vec<&str> = line.split(',').collect();
if fields.len() > 1 {
if let Some(iso) = id_map.get(fields[1]) {
if let Ok(IpNetwork::V6(net)) = fields[0].parse() {
let start = net.network();
let end = net.broadcast();
writeln!(geoip6, "{},{},{}", start, end, iso)?;
}
}
}
}

println!("Done: wrote geoip and geoip6");
Ok(())
}
44 changes: 44 additions & 0 deletions scripts/maint/geoip/maxmind/update_geoipdb.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#!/bin/bash
set -e

if [ -z "$MAXMIND_LICENSE_KEY" ]; then
echo " MAXMIND_LICENSE_KEY env variable is not set"
exit 1
fi

if [ -z "$MAXMIND_ACCOUNT_ID" ]; then
echo " MAXMIND_ACCOUNT_ID env variable is not set"
exit 1
fi

LICENSE_KEY="$MAXMIND_LICENSE_KEY"
ACCOUNT_ID="$MAXMIND_ACCOUNT_ID"
ZIP_FILE="geoip.zip"
CSV_DIR="geoip-csv"
OUT_DIR="../../../../src/config"

cleanup() {
echo "Cleaning up..."
rm -f "$ZIP_FILE"
rm -rf "$CSV_DIR"
rm -f geoip geoip6
}
trap cleanup EXIT

echo "Downloading GeoLite2 CSV..."
curl -L -o "$ZIP_FILE" -u "$ACCOUNT_ID:$LICENSE_KEY" \
"https://download.maxmind.com/geoip/databases/GeoLite2-Country-CSV/download?suffix=zip"

echo "Extracting CSV files..."
mkdir -p "$CSV_DIR"
unzip -j "$ZIP_FILE" '*.csv' -d "$CSV_DIR"
ls -lh "$CSV_DIR"

echo "Running geoipgen Rust converter..."
cargo run --release --manifest-path=geoipgen/Cargo.toml

echo "Moving output files to $OUT_DIR..."
mkdir -p "$OUT_DIR"
mv geoip geoip6 "$OUT_DIR/"

echo "Done!"
Loading
Loading