NAME := ripcalc
DOC := $(NAME)
VERSION := $(shell grep ^version Cargo.toml | sed -e 's/.* = "//g;s/"$$//g' )
MDDATE := $(shell find ripcalc.md -printf "%Td %TB %TY\n" )
RELEASE := ./target/release/ripcalc
all: build test bintest doc
build:
cargo build --release
doc:
( cat $(DOC).md | sed -e 's/^footer: .*$$/footer: $(NAME) $(VERSION)/g' -e 's/^date:.*/date: $(MDDATE)/g' ) > $(DOC).md.tmp && mv $(DOC).md.tmp $(DOC).md
cat $(DOC).md | sed -e 's,\([^ `-]\)--\([a-zA-Z]\),\1\\--\2,g' -e '/^|/s/\\n/\\\\n/g' -e '/^|/s/\\t/\\\\t/g' > $(DOC).man.md
pandoc --standalone --ascii --to man $(DOC).man.md -o $(DOC).1
rm $(DOC).man.md
test:
cargo test
bintest:
printf "127.0.0.1\n" | $(RELEASE) --available --list --format short -s - 127.0.0.1/30 | wc -l | tr -d '[:blank:]' | grep -x 3 >/dev/null
printf "127.0.0.1\n" | $(RELEASE) --list --format short -s - 127.0.0.1/30 | wc -l | tr -d '[:blank:]' | grep -x 5 >/dev/null
printf '10.0.0.0/30\n' | $(RELEASE) --list --format short -s - 127.0.0.1/30 | wc -l | tr -d '[:blank:]' | grep -x 8 >/dev/null
( printf '10.0.0.0/30\n127.0.0.1/30' | $(RELEASE) --list --format short -s - --outside 10.0.0.0/24; if test $$? -ne 1; then exit 1; fi; exit 0 ) | wc -l | tr -d '[:blank:]' | grep -x 4 >/dev/null
printf '10.0.0.0/28\n127.0.0.1/30' | $(RELEASE) --list --format short -s - --inside 10.0.0.0/24 | wc -l | tr -d '[:blank:]' | grep -x 16 >/dev/null
printf '10.0.0.0/28\n127.0.0.1/30' | $(RELEASE) --list --format short --inside 10.0.0.0/24 | wc -l | tr -d '[:blank:]' | grep -x 16 >/dev/null
printf '85.119.82.90\n' | $(RELEASE) -s - --inside 85.119.82.99/16 192.73.234.6/24 45.77.251.199/24 --format short | grep 85.119.82.90 | wc -l | tr -d '[:blank:]' | grep -x 1 >/dev/null
printf '10.0.0.0/28\n127.0.0.1/30' | $(RELEASE) --list --format short -s - --inside 10.0.0.0/24 192.168.1.1/16 | wc -l | tr -d '[:blank:]' | grep -x 16 >/dev/null
printf '127.0.0.1\n' | $(RELEASE) --format short -s - --inside 10.0.0.0/24 192.168.1.1/16 127.0.0.1/28 | wc -l | tr -d '[:blank:]' | grep -x 1 >/dev/null
$(RELEASE) --format '%k.all.s5h.net' 127.0.0.2 | grep 2.0.0.127.all.s5h.net >/dev/null echo 192.168.1.2 | $(RELEASE) -l --inside 192.168.1.1/28 --format 'short' | wc -l | tr -d '[:blank:]' | grep -x 1 >/dev/null
echo 192.168.0.0/16 | $(RELEASE) -l --inside 192.168.0.0/24 --format 'short' | wc -l | tr -d '[:blank:]' | grep -x 0 >/dev/null
echo 192.168.0.0/28 | $(RELEASE) --list --noexpand --inside 192.168.0.0/24 --format 'short' | wc -l | tr -d '[:blank:]' | grep -x 1 >/dev/null
echo 192.168.0.0/28 | $(RELEASE) --list -a --noexpand --inside 192.168.0.0/24 --format 'short' | wc -l | tr -d '[:blank:]' | grep -x 1 >/dev/null
echo 338288524927261089655243473518709748348 | $(RELEASE) --base 10 -s - --format 'short' | tr -d '[:blank:]' | grep -x fe80::10fe:91ff:fe64:b27c >/dev/null
echo 3558236161 | $(RELEASE) --base 10 -s - --format 'short' | tr -d '[:blank:]' | grep -x 212.22.96.1 >/dev/null
echo '185.27.20.54' | $(RELEASE) --outside 185.27.20.54/23 --format short | wc -l | tr -d '[:blank:]' | grep -Fx 0 >/dev/null
printf '192.168.1.1\n192.168.2.1\n127.0.0.1\n10.10.10.10\n192.168.3.1\n' | $(RELEASE) --inside 192.168.1.0/24 192.168.2.0/24 --format short | wc -l | tr -d '[:blank:]' | grep -Fx 2 >/dev/null
printf '192.168.1.1\n' | $(RELEASE) --format short --inside 80.87.128.0/20 185.27.20.0/22 216.116.64.0/20 67.214.98.0/24 2606:1F00::/32 2a04:1300::/29 | wc -l | tr -d '[:blank:]' | grep -Fx 0 >/dev/null
printf '192.168.1.1\n' | $(RELEASE) --format short --outside 80.87.128.0/20 185.27.20.0/22 216.116.64.0/20 67.214.98.0/24 2606:1F00::/32 2a04:1300::/29 | wc -l | tr -d '[:blank:]' | grep -Fx 1 >/dev/null
printf 'https://www.usenix.org.uk/content/\n' | $(RELEASE) --format short -s - | wc -l | tr -d '[:blank:]' | grep -Fx 1 >/dev/null
printf '2001067c26600425001d0000000003d2' | $(RELEASE) --base 16 --format short -s - | wc -l | tr -d '[:blank:]' | grep -Fx 1 >/dev/null
$(RELEASE) -e 10.0.0.0 10.10.0.0 --format cidr | grep 10.0.0.0/12 >/dev/null
printf '10.0.0.0/24\n10.0.0.1/24\n' | $(RELEASE) -e -s - --format cidr | grep 10.0.0.0/24 | wc -l | tr -d '[:blank:]' | grep -Fx 1 >/dev/null
printf '192.168.0.0/16' | $(RELEASE) --format cidr | grep 192.168.0.0/16 | wc -l | tr -d '[:blank:]' | grep -Fx 1 >/dev/null
$(RELEASE) 192.168.0.0/16 --format cidr | grep 192.168.0.0/16 | wc -l | tr -d '[:blank:]' | grep -Fx 1 >/dev/null
printf "127.0.0.1/8\n" | $(RELEASE) | grep "IP is: 127.0.0.1/8" | wc -l | tr -d '[:blank:]' | grep -Fx 1 >/dev/null
printf " 127.0.0.1/8 \n " | $(RELEASE) | grep "IP is: 127.0.0.1/8" | wc -l | tr -d '[:blank:]' | grep -Fx 1 >/dev/null
$(RELEASE) --base 10 -6 55835323703435061617372717077650323870 | grep "IP is: 2a01:7e00::f03c:92ff:fe35:b99e/128" | wc -l | tr -d '[:blank:]' | grep -Fx 1 >/dev/null
printf '10.0.1.0 10.0.255.0' | $(RELEASE) -e --format cidr | grep "10.0.0.0/16" | wc -l | tr -d '[:blank:]' | grep -Fx 1 >/dev/null
printf '10.0.1.0 10.0.255.0\n10.2.0.0 10.2.2.2\n10.3.0.0\n10.10.10.10\n' | $(RELEASE) --format cidr | wc -l | tr -d '[:blank:]' | grep -Fx 6 >/dev/null
printf '2a0a:1100:1002::/48' | $(RELEASE) --networks 64 | tr -d '[:blank:]' | grep -Fx "Networks(64):65536" >/dev/null
printf '2a0a:1100:1002::/48' | $(RELEASE) --networks 64 --format '%D:%N' | grep -Fx '64:65536' >/dev/null
for i in 1 2 3 4; do for j in 1 2 3 4; do echo 192.$$i.$$j.1; done; done | $(RELEASE) --group 16 --format short --encapsulating | wc -l | tr -d '[:blank:]' | grep -Fx 4 >/dev/null
printf 'name,network\na,192.168.0.0/16\n' >ips.csv; $(RELEASE) --csv ips.csv 127.0.0.1 --allowemptyrow --format '%{name} %a/%c\n' | grep -Fx '{name} 127.0.0.1/32' >/dev/null && rm ips.csv
printf 'name,network\na,192.168.0.0\n' >ips.csv; $(RELEASE) --csv ips.csv 127.0.0.1 --allowemptyrow --format '%{name} %a/%c\n' | grep -Fx '{name} 127.0.0.1/32' >/dev/null && rm ips.csv
printf 'name,network\na,2001:db8::\n' >ips.csv; $(RELEASE) --csv ips.csv 2001:db8::0 --allowemptyrow --format '%{name} %a/%c\n' | grep -Fx 'a 2001:db8::/128' >/dev/null && rm ips.csv
printf 'name,network\na,192.168.0.0/24\n' >ips.csv; $(RELEASE) --csv ips.csv 192.168.0.1 --allowemptyrow --format '%{name} %a/%c\n' | grep -Fx 'a 192.168.0.1/24' >/dev/null && rm ips.csv
printf 'name,network\na,192.168.0.0/24\n' >ips.csv; echo 192.168.0.1 | $(RELEASE) --csv ips.csv --allowemptyrow --format '%{name} %a/%c\n' | grep -Fx 'a 192.168.0.1/24' >/dev/null && rm ips.csv
printf 'name,network\nloop,127.0.0.0/8\nprinters,172.16.0.0/12\niot1,192.168.0.0/24\niot2,192.168.1.0/24\niot3,192.168.2.0/24\niot4,192.168.3.0/24' >ips.csv; echo 192.168.0.1 | $(RELEASE) --csv ips.csv --allowemptyrow --format '%{name} %a/%c\n' | grep -Fx 'iot1 192.168.0.1/24' >/dev/null && rm ips.csv
$(RELEASE) 8.8.4.4 --format '%p\n' | grep -Fx dns.google >/dev/null
$(RELEASE) -e 10.10.10.10 10.20.10.10 10.20.10.20 --group 24 --format '%a %c %C\n' | wc -l | grep -Fx 2 >/dev/null
for i in `seq 1 20`; do for j in `seq 1 50`; do printf '192.168.%d.%d\n' $$i $$j; done; done | $(RELEASE) --group 24 --encapsulating --format '%a/%c %C\n' | grep '/26 50$$' | wc -l | grep -Fx 20 >/dev/null
for i in `seq 1 20`; do for j in `seq 1 50`; do printf '192.168.%d.%d\n' $$i $$j; done; done | $(RELEASE) --group 24 --inside 192.168.1.1/24 --encapsulating --format '%a/%c %C\n' | grep '/26 50$$' | wc -l | grep -Fx 1 >/dev/null
for i in `seq 1 20`; do for j in `seq 1 50`; do printf '192.168.%d.%d\n' $$i $$j; done; done | $(RELEASE) --group 24 --outside 192.168.1.1 --encapsulating --format '%a/%c %C\n' | grep '/26 50$$' | wc -l | grep -Fx 19 >/dev/null
printf '3558236161\n' | $(RELEASE) --base 10 --format '%a\n' | grep -Fx 212.22.96.1 >/dev/null
printf -- '-736731135\n' | $(RELEASE) --base -10 --format '%a\n' | grep -Fx 212.22.96.1 >/dev/null
printf -- '-13259686110696736936355904651228348417\n' | $(RELEASE) --base -10 --format '%a\n' | grep -Fx f606:4700:3035:0:ffff:ffff:ffff:ffff >/dev/null
printf -- '42540766411282592856903984951653826560\n' | $(RELEASE) --base 10 --format '%a\n' | grep -Fx 2001:db8:: >/dev/null
$(RELEASE) -e 10.0.0.0 10.10.0.0 --group 24 --format '%a/%c %C ' | grep -Fx '10.0.0.0/32 1 10.10.0.0/32 1 ' >/dev/null
$(RELEASE) -e 10.0.0.0 10.10.0.0 10.10.0.1 --group 24 --format '%a/%c %C ' | grep -Fx '10.0.0.0/32 1 10.10.0.0/31 2 ' >/dev/null
printf '10.0.0.0 10.10.0.0 10.10.0.1\n' | $(RELEASE) -e --group 24 --format '%a/%c %C ' | sort -n | paste -sd' ' | grep -Fx '10.0.0.0/32 1 10.10.0.0/31 2 ' >/dev/null
$(RELEASE) --encapsulating 10.10.0.1 10.10.0.2 10.10.0.3 --format cidr | grep 10.10.0.0/30 >/dev/null
$(RELEASE) 192.168.1.1 --format '%r\n' | grep 'RFC 1918' >/dev/null
$(RELEASE) 127.0.0.1 --format '%r\n' | grep 'Used for loopback addresses to the local host.' >/dev/null
printf "192.168.1.1 this should match\n192.168.1.10 so should this\n192.168.2.1 this should not\n" | $(RELEASE) --filter --inside 192.168.1.0/24 --format cidr | wc -l | grep -Fx 2 >/dev/null
printf "192.168.1.1 this should match\n192.168.1.10 so should this\n192.168.2.1 this should not\n" | $(RELEASE) --filter 192.168.1.0/24 --format cidr --outside | wc -l | grep -Fx 1 >/dev/null
printf "this should match 192.168.1.1\nthis should match 192.168.1.20\nthis should not 192.168.10.1\n" | $(RELEASE) --filternum 4 --inside 192.168.1.0/24 --format cidr | wc -l | grep -Fx 2 >/dev/null
printf "this should match 192.168.1.1\nthis should match 192.168.1.20\nthis should not 192.168.10.1\n" | $(RELEASE) --filternum 4 --outside 192.168.1.0/24 --format cidr | wc -l | grep -Fx 1 >/dev/null
for i in `seq 1 100`; do printf "192.168.10.1\n"; done | $(RELEASE) --countseen --encapsulating --format '%C %a/%c\n' | grep -Fx "100 192.168.10.1/32" >/dev/null
for i in `seq 1 100`; do printf "192.168.10.1\n"; done | $(RELEASE) --countseen --format '%C %a/%c\n' | grep -Fx "100 192.168.10.1/32" >/dev/null
for i in `seq 1 100`; do printf "2a0a:1100:1002:ed::1\n"; done | $(RELEASE) --countseen --format '%C %a/%c\n' | grep -Fx "100 2a0a:1100:1002:ed::1/128" >/dev/null
for i in `seq 1 100`; do printf "192.168.1.$$i\n"; done | $(RELEASE) --countseen --group 24 --format '%C %a/%c\n' | grep -Fx '100 192.168.1.0/25' >/dev/null
for i in `seq 1 255`; do printf "192.168.1.$$i\n"; done | $(RELEASE) --countseen --group 24 --format '%C %a/%c\n' | grep -Fx '255 192.168.1.0/24' >/dev/null
printf "127.0.0.1 foo 192.168.1.1 bar 10.10.10.10\n" | $(RELEASE) --filterany --inside 10.20.30.0/24 | wc -l | tr -d '[:blank:]' | grep -Fx 0 >/dev/null
$(RELEASE) 2001:DB8:2::/128 2001:DB8:1::/128 --encapsulating --format cidr | grep 2001:db8::/46 >/dev/null
$(RELEASE) 2001:DB8:2::/128 2001:DB8:1::/128 --encapsulating --format cidr --group6 64 | grep 2001:db8:[12]::/128 -c | grep '^2$$' >/dev/null
install: all
command -v please && please install -m 0755 -s $(RELEASE) /usr/local/bin || sudo install -m 0755 -s $(RELEASE) /usr/local/bin
get_add:
mkdir -p data/`date +%Y%m%d` \
&& cd data/`date +%Y%m%d` \
&& wget -O data-raw-table https://thyme.apnic.net/.combined/data-raw-table \
&& wget -O ipv6-raw-table https://thyme.apnic.net/.combined/ipv6-raw-table
cd data && for i in data-raw-table ipv6-raw-table; do \
ln -sf `date +%Y%m%d`/$$i $$i; \
done
get_as:
mkdir -p data/`date +%Y%m%d` \
&& cd data/`date +%Y%m%d` \
&& wget -O data-used-autnums https://thyme.apnic.net/.combined/data-used-autnums
cd data && for i in data-used-autnums; do \
ln -sf `date +%Y%m%d`/$$i $$i; \
done
makecdb:
perl cdb_maker.pl data/data-raw-table data/data-used-autnums data/ipv6-raw-table | $(RELEASE) --makecdb ipdb.cdb
ipdb: get_add get_as makecdb