#!/bin/sh
# DF-0736 trigger setup: rebuilds netgraph.ko + ng_socket.ko + ng_ipfw.ko
# (patched to load standalone) + df736attack.ko, then triggers the panic.
set -e

echo "=== 1. Rebuild netgraph.ko from source ==="
cd /usr/src/sys/netgraph7/netgraph && make clean && make
cp /boot/kernel/netgraph.ko /boot/kernel/netgraph.ko.shipped 2>/dev/null || true
mount -uw /boot 2>/dev/null || mount -uw /
cp netgraph.ko /boot/kernel/netgraph.ko

echo "=== 2. Rebuild ng_socket.ko ==="
cd /usr/src/sys/netgraph7/socket && make clean && make
cp ng_socket.ko /boot/kernel/ng_socket.ko

echo "=== 3. Set up ng_ipfw.ko (with patched include + stripped MODULE_DEPEND) ==="
mkdir -p /usr/src/sys/netgraph7/ipfw/netinet
cp /usr/src/sys/netgraph7/ng_ipfw.c /usr/src/sys/netgraph7/ipfw/
cp /usr/src/sys/netgraph7/ng_ipfw.h /usr/src/sys/netgraph7/ipfw/
ln -sf /usr/src/sys/net/ipfw/ip_fw.h /usr/src/sys/netgraph7/ipfw/netinet/ip_fw.h
# Strip the MODULE_DEPEND on ipfw so it loads without ipfw2 firewall module
sed -i "" -e "/MODULE_DEPEND.*ng_ipfw.*ipfw/d" /usr/src/sys/netgraph7/ipfw/ng_ipfw.c
cat > /usr/src/sys/netgraph7/ipfw/Makefile <<EOF
KMOD=   ng_ipfw
SRCS=   ng_ipfw.c
WARNS=  0
KCFLAGS+= -I/usr/src/sys/netgraph7
.include <bsd.kmod.mk>
EOF
cd /usr/src/sys/netgraph7/ipfw && make clean && make

echo "=== 4. Load netgraph + ng_socket + ng_ipfw ==="
kldload netgraph
kldload ng_socket
kldload /usr/src/sys/netgraph7/ipfw/ng_ipfw.ko
echo "kldstat:"
kldstat | tail

echo "=== 5. Verify the ipfw netgraph node exists ==="
ngctl list

echo "=== DONE setup ==="
