Skip to content

Commit

Permalink
build: compact host IP if matching existing CIDR
Browse files Browse the repository at this point in the history
  • Loading branch information
duhow committed Nov 7, 2023
1 parent e394203 commit f25df3d
Showing 1 changed file with 56 additions and 4 deletions.
60 changes: 56 additions & 4 deletions build.sh
Original file line number Diff line number Diff line change
@@ -1,10 +1,40 @@
#!/bin/bash

set -eu
set -u

ip_in_block() {
local ip="$1"
local block="$2"
local ip2octets=( ${ip//./ } )
local network=( ${block%/*} )
local network2octets=( ${network//./ } )
local mask="${block#*/}"
local netmask=$(( 0xFFFFFFFF << (32 - mask) ))
local network_val=0
local ip_val=0

# HACK: as we don't go lower than /8 , exit quickly
if [ ${network2octets[0]} != ${ip2octets[0]} ]; then
return -1
fi

for octet in 0 1 2 3; do
network_val=$((network_val << 8 | network2octets[octet]))
ip_val=$((ip_val << 8 | ip2octets[octet]))
#echo "$network_val - $ip_val"
done

network_val=$((network_val & netmask))
ip_val=$((ip_val & netmask))

[ "$network_val" -eq "$ip_val" ]
}

FILE_SOURCE=source
TARGET=public/blocklist.ipset
mkdir -p public
TMPFILE=tmpfile
mkdir -p `dirname $TARGET`
[ -f "$TMPFILE" ] && rm -f $TMPFILE

# if no changes pending, everything is commited
if [ -z "`git status -s`" ]; then
Expand All @@ -14,10 +44,32 @@ else
DATE=`date`
COMMIT="latest"
fi
ENTRIES=`grep -ve '^#' -ve '^$' $FILE_SOURCE | wc -l`

# Generate entry file
grep -ve '^#' -ve '^$' $FILE_SOURCE | cut -d ' ' -f1 > $TMPFILE

if [ -z "${DONT_CLEAN}" ]; then
CIDR_LIST=`grep '/' $TMPFILE`

# Remove single IP addresses if matching in CIDR blocks
for BLOCK in $CIDR_LIST; do
NET="${BLOCK%/*}"
CIDR="${BLOCK#*/}"
#echo "DEBUG: $BLOCK"
while read -r line; do
if [[ "$line" == *"/"* ]]; then continue; fi
if ip_in_block "$line" "$BLOCK"; then
sed -i "/^${line}$/d" $TMPFILE
fi
done < $TMPFILE
done
fi

ENTRIES=`cat $TMPFILE | wc -l`

export DATE COMMIT ENTRIES

envsubst < template > $TARGET

grep -ve '^#' -ve '^$' $FILE_SOURCE | sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n | cut -d ' ' -f1 >> $TARGET
cat $TMPFILE | sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n | cut -d ' ' -f1 >> $TARGET
[ -f "$TMPFILE" ] && rm -f $TMPFILE

0 comments on commit f25df3d

Please sign in to comment.