How to automate downloading, unzipping & loading of IP2Location DB24 data into Linux MySQL

Here is a guide for users to fully automate the updating of their IP2Location DB24 database. We will show how to download the IP2Location DB24 csv data from the web server and then unzip it before loading the data into a MySQL server on a Linux platform. The whole shell script code is at the end of this article. We will explain what each part of the code does as we go through the whole process.

Configure login details

Firstly, we need to set up some login details for the IP2Location web server as well as the MySQL server information. Under the Configuration section of the script, you will need to key in all the relevant login information in the fields below:

# Configuration
TOKEN="DOWNLOAD_TOKEN"
CODE="DB24CSV"
DBHOST="YOUR_DATABASE_HOST"
DBUSER="YOUR_DATABASE_USERNAME"
DBPASS="YOUR_DATABASE_PASSWORD"
DBNAME="YOUR_DATABASE_NAME"

For most cases, you shouldn’t have to modify anything else in the script but we will still explain what is going on in case you want to modify the code.

Checking for pre-requisites

Some Linux packages like wgetunzipmysqlwcfind and grep are needed for this script to run. If any of them are not installed, an error message will be shown and the script will terminate itself.

for a in wget unzip mysql wc find grep; do
    if [ -z "$(which $a)" ]; then
        error "Command \"$a\" not found."
        exit 0
    fi
done

 

Creating the temporary folder for storing the downloaded zipped data file

If the temporary folder does not exist, it will be created. An error message will be shown if the folder cannot be created and the script will terminate itself.

if [ ! -d /tmp/ip2location ]; then
    echo -n "Create temporary directory.......................... "
    mkdir /tmp/ip2location
    if [ ! -d /tmp/ip2location ]; then
        error "Failed to create /tmp/ip2location"
        exit 0
    fi
    success "[OK]"
fi

Downloading the zipped data file from the web server

If the download is not successful then an error message will be shown and the script will terminate itself.

wget -O database.zip -q https://www.ip2location.com/download?token=$TOKEN\&file=$CODE 2>&1
if [ ! -f database.zip ]; then
    error "Download failed."
    exit 0
fi
if [ ! -z "$(grep 'NO PERMISSION' database.zip)" ]; then
     error "Permission denied."
        exit 0
fi
if [ ! -z "$(grep '5 times' database.zip)" ]; then
         error "Download quota exceed."
        exit 0
fi
if [ $(wc -c < database.zip) -lt 102400 ]; then
    error "Download failed."
    exit 0
fi

Decompressing the zipped file

If decompression is not successful then an error message will be shown and the script will terminate itself.

unzip -q -o database.zip
if [ -z $(find . -name 'IP-COUNTRY*.CSV') ]; then
    echo "ERROR:"
    exit 0
fi
NAME="$(find . -name 'IP-COUNTRY*.CSV')"

 

Creating a temporary table in MySQL to load the data

Drops the temporary table if it already exists and then creates the table. If an error is encountered, an error message will be shown and the script will terminate itself.

RESULT="$(mysql -h $DBHOST -u $DBUSER -p$DBPASS $DBNAME -e 'DROP TABLE IF EXISTS `ip2location_database_tmp`;' 2>&1)"
if [ ! -z "$(echo $RESULT | grep 'connect')" ]; then
        error "Failed to connect MySQL host."
        exit 0
fi
if [ ! -z "$(echo $RESULT | grep 'Access denied')" ]; then
    error "MySQL authentication failed."
    exit 0
fi
RESULT="$(mysql -h $DBHOST -u $DBUSER -p$DBPASS $DBNAME -e 'CREATE TABLE `ip2location_database_tmp` (`ip_from` INT(10) UNSIGNED ZEROFILL NOT NULL,`ip_to` INT(10) UNSIGNED ZEROFILL NOT NULL,`country_code` CHAR(2) NOT NULL,`country_name` VARCHAR(64) NOT NULL,`region_name` VARCHAR(128) NOT NULL,`city_name` VARCHAR(128) NOT NULL,`latitude` DOUBLE NULL DEFAULT NULL,`longitude` DOUBLE NULL DEFAULT NULL,`zip_code` VARCHAR(12) NULL DEFAULT NULL,`time_zone` VARCHAR(8) NULL DEFAULT NULL,`isp` VARCHAR(255) NOT NULL,`domain` VARCHAR(128) NOT NULL,`net_speed` VARCHAR(8) NOT NULL,`idd_code` VARCHAR(5) NOT NULL,`area_code` VARCHAR(30) NOT NULL,`weather_station_code` VARCHAR(10) NOT NULL,`weather_station_name` VARCHAR(128) NOT NULL,`mcc` VARCHAR(128) NULL DEFAULT NULL,`mnc` VARCHAR(128) NULL DEFAULT NULL,`mobile_brand` VARCHAR(128) NULL DEFAULT NULL,`elevation` INT(10) NOT NULL,`usage_type` VARCHAR(11) NOT NULL,INDEX `idx_ip_from` (`ip_from`),INDEX `idx_ip_to` (`ip_to`),INDEX `idx_isp` (`isp`)) ENGINE=MyISAM;' 2>&1)"
if [ ! -z "$(echo $RESULT)" ]; then
    error "Unable to create temporary table."
    exit 0
fi

Loading the CSV data into the MySQL temporary table

Loads the CSV data into the temporary table. If an error is encountered, an error message will be shown and the script will terminate itself.

RESULT="$(mysql -h $DBHOST -u $DBUSER -p$DBPASS $DBNAME -e 'LOAD DATA LOCAL INFILE '\'''$NAME''\'' INTO TABLE `ip2location_database_tmp` FIELDS TERMINATED BY '\'','\'' ENCLOSED BY '\''\"'\'' LINES TERMINATED BY '\''\r\n'\'';' 2>&1)"
if [ ! -z "$(echo $RESULT)" ]; then
        error "Failed."
        exit 0
fi

Dropping the existing data table

Drops the existing data table. If an error is encountered, an error message will be shown and the script will terminate itself.

RESULT="$(mysql -h $DBHOST -u $DBUSER -p$DBPASS $DBNAME -e 'DROP TABLE IF EXISTS `ip2location_database`;' 2>&1)"
if [ ! -z "$(echo $RESULT)" ]; then
        error "Failed to drop \"ip2location_database\" table."
        exit 0
fi

Rename the temporary table to become the live data table

Renames the temporary table to become the live data table. If an error is encountered, an error message will be shown and the script will terminate itself.

RESULT="$(mysql -h $DBHOST -u $DBUSER -p$DBPASS $DBNAME -e 'RENAME TABLE `ip2location_database_tmp` TO `ip2location_database`;' 2>&1)"
if [ ! -z "$(echo $RESULT)" ]; then
        error "Failed to rename table."
        exit 0
fi

Remove temporary download folder and the downloaded data file

Remove the temporary download folder and all files in that folder.

rm -rf /tmp/ip2location

 


THE POWER OF IP GEOLOCATION

Find a solution that fits.


Was this article helpful?

Related Articles