Initial commit

This commit is contained in:
Reza Behzadan 2024-02-06 06:36:23 +03:30
commit f99973c247
3 changed files with 200 additions and 0 deletions

11
.gitignore vendored Normal file
View File

@ -0,0 +1,11 @@
build/
stash/
.archive/
.vagrant/
.env
.keys
*_[0-9]
*_[0-9][0-9]
*_????-??-??
*.zip

96
README.md Normal file
View File

@ -0,0 +1,96 @@
# GeoIP Database Updater Script
This script, automates the process of checking for new releases of GeoIP
databases on GitHub, downloading them if they're not already present, and
updating the local database files for use.
## Prerequisites
Ensure `wget` and `curl` are installed on your system.
## Setup Instructions
### 1. Create the Destination Directory
```bash
sudo mkdir -p /usr/local/share/GeoIP
```
### 2. Create a Group for GeoIP Users
Create a group to manage access to the GeoIP data.
```bash
sudo groupadd geoipusers
```
**Note: Log out and back in for the group change to take effect.**
### 3. Set Permissions and Ownership
Change the group ownership of the `/usr/local/share/GeoIP` directory to
`geoipusers`, and set the appropriate permissions.
```bash
sudo chown :geoipusers /usr/local/share/GeoIP
sudo chmod 775 /usr/local/share/GeoIP
```
### 4. Add Your User to the GeoIP Users Group
Add your user account to the `geoipusers` group to allow script execution and
access to the GeoIP directory.
```bash
sudo usermod -a -G geoipusers $USER
```
*Note: You may need to log out and log back in for the group changes to take effect.*
### 5. Install the Script
Copy the script to a globally accessible location and ensure it is executable:
```bash
sudo cp geoip_updater.sh /usr/local/bin/
sudo chown :geoipusers /usr/local/bin/geoip_updater.sh
sudo chmod +x /usr/local/bin/geoip_updater.sh
```
### 6. Schedule the Script in Crontab
Edit your crontab to run the script automatically:
```bash
crontab -e
```
Add the following line to schedule the script to run daily at 2 AM:
```bash
0 2 * * * /usr/local/bin/geoip_updater.sh >> /var/log/geoip_update.log 2>&1
```
### 7. Prepare the Log File
Make sure the script can write to the log file:
```bash
sudo touch /var/log/geoip_update.log
sudo chown :geoipusers /var/log/geoip_update.log
sudo chmod 664 /var/log/geoip_update.log
```
## Running the Script
The script will run as scheduled in the crontab. You can also execute it
manually at any time:
```bash
/usr/local/bin/geoip_updater.sh
```
## Troubleshooting
- Ensure the script is executable and the `/var/log/geoip_update.log` file is writable.
- Verify the crontab entry if the script does not run as expected.
- Check the log file `/var/log/geoip_update.log` for errors if the script fails.

93
geoip_updater.sh Executable file
View File

@ -0,0 +1,93 @@
#! /bin/bash
# Script Name: geoip_updater.sh
# Description: This script checks for new GeoLite2 City database releases from
# the specified GitHub repository, downloads the latest release
# if it's not already present, and updates the local database
# file. It ensures the destination directory is writable and
# handles download and extraction of the database.
# Usage: Execute without arguments. Designed to be run as a cron job or
# manually as needed.
# Exit immediately if a command exits with a non-zero status.
set -e
# Define variables
DATE="2024-02-02"
# DATE=$(date -I)
DEST_DIR="/usr/local/share/GeoIP"
FN="GeoLite2-City-${DATE//-/}.tar.gz"
URL="https://github.com/merkez/maxmind-databases/releases/download/${DATE}/${FN}"
MMDB="GeoLite2-City.mmdb"
DEST="${DEST_DIR}/GeoLite2-City-${DATE//-/}.mmdb"
# Check if the target file is already downloaded
check_if_file_is_already_downloaded() {
if [ -e "$DEST" ]; then
echo "File is already on the local filesystem"
ensure_symlink_exists
exit 0
fi
}
# Verify destination directory is writable
check_if_dest_dir_is_writable_by_user() {
if [ ! -w "$DEST_DIR" ]; then
echo "Destination directory is not writable: ${DEST_DIR}" >&2
exit 1
fi
}
# Check if the URL exists
check_url_exists() {
status_code=$(curl -o /dev/null -I -s -w "%{http_code}" "$URL")
if [[ "$status_code" -eq 404 ]]; then
echo "No new release for today!"
exit 0
elif [[ "$status_code" -ge 400 && "$status_code" -lt 500 ]]; then
echo "Client-side error detected: $status_code" >&2
exit 1
elif [[ "$status_code" -ge 500 && "$status_code" -lt 600 ]]; then
echo "Server-side error detected: $status_code" >&2
exit 1
fi
}
# Download the GeoIP package
download_geoip_package() {
echo "Downloading ${URL}"
wget -qO "/tmp/${FN}" "$URL"
}
# Extract the MMDB file from the downloaded package
extract_mmdb() {
MMDB_PATH=$(tar -tzf "/tmp/${FN}" | grep "${MMDB}" || true)
if [ -n "$MMDB_PATH" ]; then
tar -xzf "/tmp/${FN}" "${MMDB_PATH}" && mv "$MMDB_PATH" $DEST
else
echo "Failed to find ${MMDB} in the tarball." >&2
exit 1
fi
}
# Clean up the temporary files
clean_up() {
rm -rf "/tmp/${FN}" "/tmp/$(dirname "${MMDB_PATH}")"
}
# Ensure the symlink to the latest database exists
ensure_symlink_exists() {
ln -s -f "$DEST" "${DEST_DIR}/${MMDB}"
}
# Main execution flow
echo "Checking for the GeoLite2 City database release for ${DATE}"
check_if_file_is_already_downloaded
check_if_dest_dir_is_writable_by_user
check_url_exists
download_geoip_package
extract_mmdb
ensure_symlink_exists
clean_up
echo "GeoLite2 City database update completed."