1# $OpenBSD: Makefile,v 1.13 2020/01/15 20:47:14 bluhm Exp $ 2 3# The following ports must be installed: 4# 5# python-2.7 interpreted object-oriented programming language 6# scapy powerful interactive packet manipulation in python 7 8.if ! exists(/usr/local/bin/python2.7) || ! exists(/usr/local/bin/scapy) 9.BEGIN: 10 @true 11regress: 12 @echo Install python and the scapy module for additional tests. 13 @echo SKIPPED 14.endif 15 16# This test needs a manual setup of two machines 17# Set up machines: LOCAL REMOTE 18# LOCAL is the machine where this makefile is running. 19# REMOTE is running OpenBSD, pf gets disabled to test the IPv6 stack. 20# OTHER is an address on REMOTE, but configured on another interface. 21# OTHER_FAKE source routed host, no packets reach this host, 22# it represents just bunch of addresses in the OTHER net. 23 24# Configure Addresses on the machines. 25# Adapt interface and address variables to your local setup. 26 27LOCAL_IF ?= em1 28LOCAL_MAC ?= 00:1b:21:0e:6e:8e 29REMOTE_MAC ?= 00:04:23:b0:68:8e 30 31LOCAL_ADDR6 ?= fdd7:e83e:66bc:81::21 32REMOTE_ADDR6 ?= fdd7:e83e:66bc:81::22 33OTHER_ADDR6 ?= fdd7:e83e:66bc:82::22 34OTHER_FAKE1_ADDR6 ?= fdd7:e83e:66bc:82::dead 35OTHER_FAKE2_ADDR6 ?= fdd7:e83e:66bc:82::beef 36 37REMOTE_SSH ?= 38 39.if empty (LOCAL_IF) || empty (LOCAL_MAC) || empty (REMOTE_MAC) || \ 40 empty (LOCAL_ADDR6) || empty (REMOTE_ADDR6) || empty(OTHER_ADDR6) || \ 41 empty (OTHER_FAKE1_ADDR6) || empty (OTHER_FAKE2_ADDR6) || \ 42 empty (REMOTE_SSH) 43.BEGIN: 44 @true 45regress: 46 @echo This tests needs a remote machine to operate on. 47 @echo LOCAL_IF LOCAL_MAC REMOTE_MAC LOCAL_ADDR6 REMOTE_ADDR6 48 @echo OTHER_ADDR6 OTHER_FAKE1_ADDR6 OTHER_FAKE2_ADDR6 REMOTE_SSH 49 @echo Fill out these variables for additional tests. 50 @echo SKIPPED 51.endif 52 53.MAIN: all 54 55.if make (regress) || make (all) 56.BEGIN: 57 @echo 58 ${SUDO} true 59 ssh -t ${REMOTE_SSH} ${SUDO} true 60 rm -f stamp-stack stamp-pf 61.endif 62 63# Create python include file containing the addresses. 64addr.py: Makefile 65 rm -f $@ $@.tmp 66 echo 'LOCAL_IF = "${LOCAL_IF}"' >>$@.tmp 67 echo 'LOCAL_MAC = "${LOCAL_MAC}"' >>$@.tmp 68 echo 'REMOTE_MAC = "${REMOTE_MAC}"' >>$@.tmp 69.for var in LOCAL_ADDR REMOTE_ADDR OTHER_FAKE1_ADDR OTHER_FAKE2_ADDR 70 echo '${var}6 = "${${var}6}"' >>$@.tmp 71.endfor 72 mv $@.tmp $@ 73 74# Set variables so that make runs with and without obj directory. 75# Only do that if necessary to keep visible output short. 76.if ${.CURDIR} == ${.OBJDIR} 77PYTHON = python2.7 -u ./ 78.else 79PYTHON = PYTHONPATH=${.OBJDIR} python2.7 -u ${.CURDIR}/ 80.endif 81 82stamp-stack: 83 @echo '\n======== $@ ========' 84 rm -f stamp-stack stamp-pf 85 -ssh ${REMOTE_SSH} ${SUDO} pfctl -d 86 ssh ${REMOTE_SSH} ${SUDO} pfctl -a regress -Fr 87 date >$@ 88 89# After running the tests, turn on pf on remote machine. 90# This is the expected default configuration. 91REGRESS_CLEANUP += stamp-pf 92stamp-pf: 93 @echo '\n======== $@ ========' 94 rm -f stamp-stack stamp-pf 95 echo 'pass proto tcp from port ssh no state\n'\ 96 'pass proto tcp to port ssh no state'|\ 97 ssh ${REMOTE_SSH} ${SUDO} pfctl -a regress -f - 98 -ssh ${REMOTE_SSH} ${SUDO} pfctl -e 99 date >$@ 100 101RH0_SCRIPTS !!= cd ${.CURDIR} && ls -1 rh0*.py 102 103.for s in ${RH0_SCRIPTS} 104REGRESS_TARGETS = run-${s} 105run-${s}: addr.py stamp-stack 106 @echo '\n======== $@ ========' 107 ${SUDO} ${PYTHON}${s} 108.endfor 109 110CLEANFILES += addr.py *.pyc *.log stamp-* 111 112.PHONY: check-setup check-setup-local check-setup-remote 113 114# Check wether the address, route and remote setup is correct 115check-setup: check-setup-local check-setup-remote 116 117check-setup-local: 118 @echo '\n======== $@ ========' 119 ping6 -n -c 1 ${LOCAL_ADDR6} # LOCAL_ADDR6 120 route -n get -inet6 ${LOCAL_ADDR6} |\ 121 grep -q 'flags: .*LOCAL' # LOCAL_ADDR6 122 ping6 -n -c 1 ${REMOTE_ADDR6} # REMOTE_ADDR6 123 route -n get -inet6 ${REMOTE_ADDR6} |\ 124 grep -q 'interface: ${LOCAL_IF}$$' # REMOTE_ADDR6 LOCAL_IF 125.for ip in OTHER_ADDR6 OTHER_FAKE1_ADDR6 OTHER_FAKE2_ADDR6 126 route -n get -inet6 ${${ip}} |\ 127 grep -q 'gateway: ${REMOTE_ADDR6}$$' # ${ip} REMOTE_ADDR6 128.endfor 129 ndp -n ${REMOTE_ADDR6} |\ 130 grep -q ' ${REMOTE_MAC} ' # REMOTE_ADDR6 REMOTE_MAC 131 132check-setup-remote: 133 @echo '\n======== $@ ========' 134 ssh ${REMOTE_SSH} ping6 -n -c 1 ${REMOTE_ADDR6} # REMOTE_ADDR6 135 ssh ${REMOTE_SSH} route -n get -inet6 ${REMOTE_ADDR6} |\ 136 grep -q 'flags: .*LOCAL' # REMOTE_ADDR6 137 ssh ${REMOTE_SSH} ping6 -n -c 1 ${LOCAL_ADDR6} # LOCAL_ADDR6 138 ssh ${REMOTE_SSH} ping6 -n -c 1 ${OTHER_ADDR6} # OTHER_ADDR6 139 ssh ${REMOTE_SSH} route -n get -inet6 ${OTHER_ADDR6} |\ 140 grep -q 'flags: .*LOCAL' # OTHER_ADDR6 141.for ip in OTHER_FAKE1_ADDR6 OTHER_FAKE2_ADDR6 142 ssh ${REMOTE_SSH} route -n get -inet6 ${${ip}} |\ 143 grep -q 'if address: ${OTHER_ADDR6}$$' # ${ip} OTHER_ADDR6 144.endfor 145 ssh ${REMOTE_SSH} ndp -n ${LOCAL_ADDR6} |\ 146 grep -q ' ${LOCAL_MAC} ' # LOCAL_ADDR6 LOCAL_MAC 147 148.include <bsd.regress.mk> 149