#!/usr/bin/env bash # START set -e # VARIABLES URL_DNS_LIST="https://pgl.yoyo.org/adservers/serverlist.php?showintro=0&mimetype=plaintext" URL_DNS_LIST_CUSTOM="" NAME_OSX="Darwin" THIS_OS=$(uname -mrs) PROGNAME=$(basename "$0") [[ -z "${XDG_CONFIG_HOME}" ]] && CONFIG=$HOME/.config/maza/ || CONFIG=$XDG_CONFIG_HOME/maza/ HOST_FILE=/etc/hosts COLOR_RED=$(tput setaf 1) COLOR_GREEN=$(tput setaf 2) COLOR_RESET=$(tput sgr0) LIST="list" LIST_DNSMASQ="dnsmasq.conf" CUSTOM_DOMAINS="custom-domains" IGNORE_LIST_DEFAULT="localhost \ localhost.localdomain \ local \ broadcasthost \ ip6-localhost \ ip6-loopback \ ip6-localnet \ ip6-mcastprefix \ ip6-allnodes \ ip6-allrouters \ ip6-allhosts \ 0.0.0.0" IGNORE_LIST_FILE="ignore" START_TAG="## MAZA - List ad blocking" PROJECT="### https://github.com/tanrax/maza-ad-blocking" AUTHOR="### Created by Andros Fenollosa (https://andros.dev/)" END_TAG="## END MAZA" # Create sed cross system custom-sed() { if [[ $THIS_OS = *$NAME_OSX* ]]; then # Check if OSX and install GSED if [ -x "$(command -v gsed)" ]; then gsed "$@" else echo "${COLOR_RED}ERROR. You must install gsed if you are using OSX${COLOR_RESET}" exit 1 fi else # Linux sed "$@" fi } export -f custom-sed # FUNCTIONS ## HELP usage() { if [ "$*" != "" ] ; then echo "Error: $*" fi cat << EOF Usage: $PROGNAME [OPTION] Simple and efficient local ad blocking throughout the network. Options: status Check if it's active or not update Update the list of DNS to be blocked start Activate blocking DNS. stop Stop blocking DNS. --help Display this usage message and exit EOF exit 1 } status() { if grep -qF "$START_TAG" "$HOST_FILE";then echo "${COLOR_GREEN}ENABLED${COLOR_RESET}" else echo "${COLOR_RED}DISABLED${COLOR_RESET}" fi } update() { local local_url_dns_list="$URL_DNS_LIST" # Default if [ -n "$URL_DNS_LIST_CUSTOM" ]; then echo "si" local_url_dns_list="$URL_DNS_LIST_CUSTOM" # Custom fi # Make conf folder rm -f "$CONFIG$LIST" rm -f "$CONFIG$LIST_DNSMASQ" mkdir -p "$CONFIG" # Download DNS list curl -L -s "$local_url_dns_list" -o "$CONFIG$LIST" ## Remove comments ### Start with # custom-sed -i.bak '/^#/ d' "$CONFIG$LIST" ### Remove comments in middle of line custom-sed -i.bak 's/#.*$//g' "$CONFIG$LIST" ### Remove spaces in end of line custom-sed -i.bak 's/ *$//g' "$CONFIG$LIST" ## Remove "0.0.0.0" or "127.0.0.1" custom-sed -i.bak 's/0.0.0.0 //g' "$CONFIG$LIST" custom-sed -i.bak 's/127.0.0.1 //g' "$CONFIG$LIST" # Make ignore list if [ ! -f "$CONFIG$IGNORE_LIST_FILE" ]; then echo "$IGNORE_LIST_DEFAULT" | tr " " "\n" > "$CONFIG$IGNORE_LIST_FILE" fi # Remove ignore list while read -r line; do custom-sed -i.bak "/$line/d" "$CONFIG$LIST" done < "$CONFIG$IGNORE_LIST_FILE" # Make custom domains ## Check if file exists if [ ! -f "$CONFIG$CUSTOM_DOMAINS" ]; then ## Create file touch "$CONFIG$CUSTOM_DOMAINS" fi ## Include custom domains cat "$CONFIG$CUSTOM_DOMAINS" >> "$CONFIG$LIST" echo "" >> "$CONFIG$LIST" # Remove empty lines custom-sed -i.bak '/^$/d' "$CONFIG$LIST" # Update HOST_FILE ## Remove old list custom-sed -i "/$START_TAG/,/$END_TAG/d" "$HOST_FILE" ## Add List to host file. # Add start tag DNS list in first line echo "$START_TAG" >> "$HOST_FILE" echo "$PROJECT" >> "$HOST_FILE" echo "$AUTHOR" >> "$HOST_FILE" # Transform "mydomain.com" to "127.0.0.1 mydomain.com" except comments custom-sed "/^#/!s/^/127.0.0.1 /g" "$CONFIG$LIST" >> "$HOST_FILE" # Add end tag DNS list in first line echo "$END_TAG" >> "$HOST_FILE" # Make dnsmasq format cp "$CONFIG$LIST" "$CONFIG$LIST_DNSMASQ" ## Remove triple "-". Example: "my---domain.com" to "my-domain.com". Only in dnsmasq. custom-sed -i.bak "s/---/-/g" "$CONFIG$LIST_DNSMASQ" ## Remove double "-". Example: "my--domain.com" to "my-domain.com". Only in dnsmasq. custom-sed -i.bak "s/--/-/g" "$CONFIG$LIST_DNSMASQ" ## mydomain.com to address=/mydomain.com/127.0.0.1 custom-sed -i.bak "s|\(.*\)|address=/\1/127.0.0.1|" "$CONFIG$LIST_DNSMASQ" ## Add start tag DNS list in first line custom-sed -i.bak "1i\\$AUTHOR" "$CONFIG$LIST" custom-sed -i.bak "1i\\$PROJECT" "$CONFIG$LIST" custom-sed -i.bak "1i\\$START_TAG" "$CONFIG$LIST" ## Add end tag DNS list in first line echo "$END_TAG" >> "$CONFIG$LIST" ## Add start tag DNS dnsmasq in first line custom-sed -i.bak "1i\\$AUTHOR" "$CONFIG$LIST_DNSMASQ" custom-sed -i.bak "1i\\$PROJECT" "$CONFIG$LIST_DNSMASQ" custom-sed -i.bak "1i\\$START_TAG" "$CONFIG$LIST_DNSMASQ" ## Add end tag DNS DNSMASQ in first line echo "$END_TAG" >> "$CONFIG$LIST_DNSMASQ" # Remove temp file rm "$CONFIG$LIST.bak" rm "$CONFIG$LIST_DNSMASQ.bak" # Notify user echo "${COLOR_GREEN}List updated!${COLOR_RESET}" } start() { update # Notify user echo "${COLOR_GREEN}ENABLED!${COLOR_RESET}" } stop() { # Remove list to host file custom-sed -i "/$START_TAG/,/$END_TAG/d" "$HOST_FILE" # Remove DNSMASQ cat /dev/null > "$CONFIG$LIST_DNSMASQ" # Notify user echo "${COLOR_GREEN}DISABLED!${COLOR_RESET}" } # CONTROLE ARGUMENTS isArg="" while [ $# -gt 0 ] ; do case "$1" in --help) usage ;; status) isArg="1" status ;; update) isArg="1" update ;; start) isArg="1" start ;; stop) isArg="1" stop ;; *) esac shift done if [ -z $isArg ] ; then usage "Not enough arguments" fi