1*653fceecSbluhm# $OpenBSD: Makefile,v 1.10 2017/03/01 00:58:22 bluhm Exp $ 2694d4422Sbluhm 3694d4422Sbluhm# The following ports must be installed: 4694d4422Sbluhm# 5694d4422Sbluhm# python-2.7 interpreted object-oriented programming language 6694d4422Sbluhm# py-libdnet python interface to libdnet 7694d4422Sbluhm# scapy powerful interactive packet manipulation in python 8694d4422Sbluhm 90502cf93Stb.if ! (make(clean) || make(cleandir) || make(obj)) 10a91e3c70Sbluhm# Check wether all required python packages are installed. If some 11a91e3c70Sbluhm# are missing print a warning and skip the tests, but do not fail. 122d33a7beSbluhmPYTHON_IMPORT !!= python2.7 -c 'from scapy.all import *' 2>&1 || true 130502cf93Stb.endif 142d33a7beSbluhm 15a91e3c70Sbluhm.if ! empty(PYTHON_IMPORT) 167b3475a7Sbluhm.BEGIN: 177b3475a7Sbluhm @true 18a91e3c70Sbluhmregress: 19a91e3c70Sbluhm @echo '${PYTHON_IMPORT}' 202d33a7beSbluhm @echo Install python and the scapy module for additional tests. 2154eefd0cSbluhm @echo SKIPPED 22a91e3c70Sbluhm.endif 23a91e3c70Sbluhm 24694d4422Sbluhm# This test needs a manual setup of two machines 257b3475a7Sbluhm# Set up machines: LOCAL REMOTE 267b3475a7Sbluhm# LOCAL is the machine where this makefile is running. 277b3475a7Sbluhm# REMOTE is running OpenBSD, pf gets disabled to test the IPv6 stack. 287b3475a7Sbluhm# OTHER is an address on REMOTE, but configured on another interface. 297b3475a7Sbluhm# OTHER_FAKE source routed host, no packets reach this host, 307b3475a7Sbluhm# it represents just bunch of addresses in the OTHER net. 31694d4422Sbluhm 32694d4422Sbluhm# Configure Addresses on the machines. 33694d4422Sbluhm# Adapt interface and address variables to your local setup. 34694d4422Sbluhm 357b3475a7SbluhmLOCAL_IF ?= em1 367b3475a7SbluhmLOCAL_MAC ?= 00:1b:21:0e:6e:8e 377b3475a7SbluhmREMOTE_MAC ?= 00:04:23:b0:68:8e 38a91e3c70Sbluhm 397b3475a7SbluhmLOCAL_ADDR6 ?= fdd7:e83e:66bc:81::21 407b3475a7SbluhmREMOTE_ADDR6 ?= fdd7:e83e:66bc:81::22 417b3475a7SbluhmOTHER_ADDR6 ?= fdd7:e83e:66bc:82::22 427b3475a7SbluhmOTHER_FAKE1_ADDR6 ?= fdd7:e83e:66bc:82::dead 437b3475a7SbluhmOTHER_FAKE2_ADDR6 ?= fdd7:e83e:66bc:82::beef 447b3475a7Sbluhm 457b3475a7SbluhmREMOTE_SSH ?= 467b3475a7Sbluhm 477b3475a7Sbluhm.if empty (LOCAL_IF) || empty (LOCAL_MAC) || empty (REMOTE_MAC) || \ 487b3475a7Sbluhm empty (LOCAL_ADDR6) || empty (REMOTE_ADDR6) || empty(OTHER_ADDR6) || \ 497b3475a7Sbluhm empty (OTHER_FAKE1_ADDR6) || empty (OTHER_FAKE2_ADDR6) || \ 507b3475a7Sbluhm empty (REMOTE_SSH) 517b3475a7Sbluhm.BEGIN: 527b3475a7Sbluhm @true 53a91e3c70Sbluhmregress: 542d33a7beSbluhm @echo This tests needs a remote machine to operate on. 557b3475a7Sbluhm @echo LOCAL_IF LOCAL_MAC REMOTE_MAC LOCAL_ADDR6 REMOTE_ADDR6 567b3475a7Sbluhm @echo OTHER_ADDR6 OTHER_FAKE1_ADDR6 OTHER_FAKE2_ADDR6 REMOTE_SSH 572d33a7beSbluhm @echo Fill out these variables for additional tests. 5854eefd0cSbluhm @echo SKIPPED 59a91e3c70Sbluhm.endif 60694d4422Sbluhm 612d33a7beSbluhm.MAIN: all 622d33a7beSbluhm 632d33a7beSbluhm.if make (regress) || make (all) 642d33a7beSbluhm.BEGIN: addr.py 652d33a7beSbluhm @echo 662d33a7beSbluhm ${SUDO} true 67*653fceecSbluhm ssh -t ${REMOTE_SSH} ${SUDO} true 682d33a7beSbluhm rm -f stamp-stack stamp-pf 692d33a7beSbluhm.endif 702d33a7beSbluhm 71694d4422Sbluhmdepend: addr.py 72694d4422Sbluhm 73694d4422Sbluhm# Create python include file containing the addresses. 74694d4422Sbluhmaddr.py: Makefile 75694d4422Sbluhm rm -f $@ $@.tmp 767b3475a7Sbluhm echo 'LOCAL_IF = "${LOCAL_IF}"' >>$@.tmp 777b3475a7Sbluhm echo 'LOCAL_MAC = "${LOCAL_MAC}"' >>$@.tmp 787b3475a7Sbluhm echo 'REMOTE_MAC = "${REMOTE_MAC}"' >>$@.tmp 797b3475a7Sbluhm.for var in LOCAL_ADDR REMOTE_ADDR OTHER_FAKE1_ADDR OTHER_FAKE2_ADDR 80694d4422Sbluhm echo '${var}6 = "${${var}6}"' >>$@.tmp 81694d4422Sbluhm.endfor 82694d4422Sbluhm mv $@.tmp $@ 83694d4422Sbluhm 84a91e3c70Sbluhm# Set variables so that make runs with and without obj directory. 85a91e3c70Sbluhm# Only do that if necessary to keep visible output short. 86a91e3c70Sbluhm.if ${.CURDIR} == ${.OBJDIR} 87a91e3c70SbluhmPYTHON = python2.7 ./ 88a91e3c70Sbluhm.else 89a91e3c70SbluhmPYTHON = PYTHONPATH=${.OBJDIR} python2.7 ${.CURDIR}/ 90a91e3c70Sbluhm.endif 91a91e3c70Sbluhm 922d33a7beSbluhmstamp-stack: 932d33a7beSbluhm rm -f stamp-stack stamp-pf 94*653fceecSbluhm -ssh ${REMOTE_SSH} ${SUDO} pfctl -d 95*653fceecSbluhm ssh ${REMOTE_SSH} ${SUDO} pfctl -a regress -Fr 962d33a7beSbluhm date >$@ 972d33a7beSbluhm 982d33a7beSbluhmstamp-pf: 992d33a7beSbluhm rm -f stamp-stack stamp-pf 1002d33a7beSbluhm echo 'pass proto tcp from port ssh no state\n'\ 1012d33a7beSbluhm 'pass proto tcp to port ssh no state'|\ 102*653fceecSbluhm ssh ${REMOTE_SSH} ${SUDO} pfctl -a regress -f - 103*653fceecSbluhm -ssh ${REMOTE_SSH} ${SUDO} pfctl -e 1042d33a7beSbluhm date >$@ 1052d33a7beSbluhm 1062d33a7beSbluhmRH0_SCRIPTS !!= cd ${.CURDIR} && ls -1 rh0*.py 1072d33a7beSbluhm 1082d33a7beSbluhm.for s in ${RH0_SCRIPTS} 1092d33a7beSbluhmrun-regress-${s}: addr.py stamp-stack 110a91e3c70Sbluhm @echo '\n======== $@ ========' 1112d33a7beSbluhm ${SUDO} ${PYTHON}${s} 1122d33a7beSbluhm.endfor 113694d4422Sbluhm 1142d33a7beSbluhmREGRESS_TARGETS = ${RH0_SCRIPTS:S/^/run-regress-/} 115a91e3c70Sbluhm 1162d33a7beSbluhm# After running the tests, turn on pf on remote machine. 1172d33a7beSbluhm# This is the expected default configuration. 1182d33a7beSbluhmREGRESS_TARGETS += stamp-pf 119a91e3c70Sbluhm 1202d33a7beSbluhmCLEANFILES += addr.py *.pyc *.log stamp-* 121694d4422Sbluhm 1227b3475a7Sbluhm.PHONY: check-setup check-setup-local check-setup-remote 1237e8c0af0Sbluhm 1247e8c0af0Sbluhm# Check wether the address, route and remote setup is correct 1257b3475a7Sbluhmcheck-setup: check-setup-local check-setup-remote 1267b3475a7Sbluhm 1277b3475a7Sbluhmcheck-setup-local: 128c54bd846Sbluhm @echo '\n======== $@ ========' 1297b3475a7Sbluhm ping6 -n -c 1 ${LOCAL_ADDR6} # LOCAL_ADDR6 1307b3475a7Sbluhm route -n get -inet6 ${LOCAL_ADDR6} |\ 1317b3475a7Sbluhm grep -q 'flags: .*LOCAL' # LOCAL_ADDR6 1327b3475a7Sbluhm ping6 -n -c 1 ${REMOTE_ADDR6} # REMOTE_ADDR6 1337b3475a7Sbluhm route -n get -inet6 ${REMOTE_ADDR6} |\ 1347b3475a7Sbluhm grep -q 'interface: ${LOCAL_IF}$$' # REMOTE_ADDR6 LOCAL_IF 1357b3475a7Sbluhm.for ip in OTHER_ADDR6 OTHER_FAKE1_ADDR6 OTHER_FAKE2_ADDR6 1367b3475a7Sbluhm route -n get -inet6 ${${ip}} |\ 1377b3475a7Sbluhm grep -q 'gateway: ${REMOTE_ADDR6}$$' # ${ip} REMOTE_ADDR6 1387b3475a7Sbluhm.endfor 1397b3475a7Sbluhm ndp -n ${REMOTE_ADDR6} |\ 1407b3475a7Sbluhm grep -q ' ${REMOTE_MAC} ' # REMOTE_ADDR6 REMOTE_MAC 1417b3475a7Sbluhm 1427b3475a7Sbluhmcheck-setup-remote: 1437b3475a7Sbluhm @echo '\n======== $@ ========' 1447b3475a7Sbluhm ssh ${REMOTE_SSH} ping6 -n -c 1 ${REMOTE_ADDR6} # REMOTE_ADDR6 1457b3475a7Sbluhm ssh ${REMOTE_SSH} route -n get -inet6 ${REMOTE_ADDR6} |\ 1467b3475a7Sbluhm grep -q 'flags: .*LOCAL' # REMOTE_ADDR6 1477b3475a7Sbluhm ssh ${REMOTE_SSH} ping6 -n -c 1 ${LOCAL_ADDR6} # LOCAL_ADDR6 1487b3475a7Sbluhm ssh ${REMOTE_SSH} ping6 -n -c 1 ${OTHER_ADDR6} # OTHER_ADDR6 1497b3475a7Sbluhm ssh ${REMOTE_SSH} route -n get -inet6 ${OTHER_ADDR6} |\ 1507b3475a7Sbluhm grep -q 'flags: .*LOCAL' # OTHER_ADDR6 1517b3475a7Sbluhm.for ip in OTHER_FAKE1_ADDR6 OTHER_FAKE2_ADDR6 1527b3475a7Sbluhm ssh ${REMOTE_SSH} route -n get -inet6 ${${ip}} |\ 1537b3475a7Sbluhm grep -q 'if address: ${OTHER_ADDR6}$$' # ${ip} OTHER_ADDR6 1547b3475a7Sbluhm.endfor 1557b3475a7Sbluhm ssh ${REMOTE_SSH} ndp -n ${LOCAL_ADDR6} |\ 1567b3475a7Sbluhm grep -q ' ${LOCAL_MAC} ' # LOCAL_ADDR6 LOCAL_MAC 1577e8c0af0Sbluhm 158694d4422Sbluhm.include <bsd.regress.mk> 159