#!/bin/bash set -e -o pipefail DEFAULT_INFILE="http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip" DEFAULT_CACHEFILE="/etc/haproxy/GeoIPCountryCSV.zip" function usage() { cat >&2 << EOF Usage: $0 [-l] [-i ] [...] Options : -h display this help and exit -l applies a lowercase filter to the output -c when using an HTTP URL, defines where the file will be cached on disk. This prevents downloading a file that was not modified Default: $DEFAULT_CACHEFILE -i the input file containing the GeOIP database. it can be a local file or an HTTP URL. If the file name ends with ".zip", it will be automatically unzipped Default: $DEFAULT_INFILE if specified, only those countries will be sent to the output. If not specified, all of them will Example : $ $0 -l -i $DEFAULT_INFILE FR UK IT US EOF exit 1 } # Initialize the parameters from the command line filters="" infile=$DEFAULT_INFILE cachefile=$DEFAULT_CACHEFILE lowercase_opts=0 while getopts "c:i:hl" opt; do case $opt in c) cachefile=$OPTARG;; i) infile=$OPTARG;; l) lowercase_opts=1;; h | \?) usage;; esac done shift $(($OPTIND - 1)) # Fetch the file if it's a HTTP URL, then use the cache file as input if [[ "$infile" =~ ^http://.* ]]; then curl -fs -z $cachefile -o $cachefile $infile || { echo "Unable to fetch the GeoIP data file"; exit 1; } infile=$cachefile fi if [ ! -e $infile ]; then echo "Le fichier source de géolocalisation $infile n'existe pas". >&2 exit 1 fi # Should we decompress it on the fly ? if [[ "$infile" =~ ^.*\.zip ]]; then reader="funzip" else reader="cat" fi # Initialize the country filter countries="" for country in $*; do if [ "$countries" = "" ]; then countries="$country" else countries="$countries|$country" fi done if [ "$countries" != "" ]; then filters="$filters|grep -Ei '($countries)'" fi # Initialize the lowercase filter if [ $lowercase_opts -eq 1 ]; then filters="$filters|tr A-Z a-z" fi # Now we can launch the conversion process eval "$reader $infile | cut -d, -f1,2,5 | iprange | sed 's/\"//g' $filters" || { echo "GeoIP data conversion failure"; exit 1; }