LINUXVER = 2.6.29.1
SLACKWAREVER = 12.2
SNORTVER = 2.8.4.1

# Download Slackware packages from...
SLACKWAREMIRROR = http://slackware.mirrors.pair.com/slackware-$(SLACKWAREVER)/
SLACKWAREPKGS = aaa_base aaa_elflibs aaa_terminfo bash bin bzip2 coreutils cxxlibs dcron devs dialog e2fsprogs ed elvis etc findutils gawk gettext glibc-solibs glibc-zoneinfo grep gzip hdparm less syslinux mdadm openssl-solibs pkgtools procps sed shadow sysklogd sysvinit sysvinit-functions sysvinit-scripts tar time udev util-linux-ng which bc lsof screen glib glib2 libxml2 libxslt ncurses pcre readline zlib bridge-utils curl dhcpcd ethtool gnupg2 gnutls gpgme iproute2 iptables iputils libgcrypt libgpg-error lynx nc net-tools network-scripts nmap openssh openssl tcpdump traceroute vlan wget module-init-tools wireless-tools libidn openldap-client cyrus-sasl gnupg mysql ntp

# Download Snort packages from...
SNORTMIRROR = http://slackware.oc9.org/slackware-$(SLACKWAREVER)/
SNORTPKGS = postgresql libdnet

# Specifies path to search for various tools (bootfs and build)
BOOTFSTOOLS_PATH = /bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin
BOOTFSTOOLS = sh ls test cp cat grep true false kill mkdir rmdir tar gzip vi wc awk sed cut tr dd sleep chmod chown du yes date eject mount umount mke2fs ifconfig fdisk sfdisk ip arping mkswap swapon swapoff extlinux ethtool
BUILDTOOLS = cp ln rm du wc tr tar sed awk tac head find grep sort expr chmod mkdir gcc cat wget readlink basename ldd md5sum mkisofs genext2fs

all: snortbox.iso

checktools:
	PATH="$${PATH}:$(BOOTFSTOOLS_PATH)"; which $(BOOTFSTOOLS)
	which $(BUILDTOOLS)

snortbox.iso: checktools iso/installfs.tgz iso/boot/isolinux
	mkdir -p iso/boot
	cp installfs/boot/bzImage iso/boot/
	rm -rf iso/boot/isolinux
	cp -r isolinux iso/boot/
	find iso -type d -name .svn -print0 | xargs -0 rm -rf
	mkisofs -R -J -T -o "$@" -b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table iso/

iso/installfs.tgz: installfs/boot/bzImage installfs/bin
	mkdir -p iso
	find installfs -name .svn -type d -print0 | xargs -0 rm -rf
	cd installfs/ && tar -zcf ../iso/installfs.tgz *

iso/boot/isolinux: isolinux/* isolinux/initrd.img
	rm -rf iso/boot/isolinux
	mkdir -p iso/boot/isolinux
	cp -r isolinux/* iso/boot/isolinux/

isolinux/initrd.img: bootfs/sbin/init bootfs/bin bootfs/lib bootfs/dev/specfile
	genext2fs --squash --size-in-blocks $$(expr $$(du -sk bootfs | awk '{ print $$1 }') + 2048) --root bootfs --devtable bootfs/dev/specfile  "$@"

bootfs/bin: src/gen-random/* src/reboot/*
	$(MAKE) -C src/gen-random/ gen-random
	$(MAKE) -C src/reboot/ reboot
	mkdir -p bootfs/bin
	cp src/gen-random/gen-random src/reboot/reboot bootfs/bin/
	PATH="$${PATH}:$(BOOTFSTOOLS_PATH)"; for tool in $(BOOTFSTOOLS); do \
		echo cp "$$(which "$${tool}")" bootfs/bin/; \
		cp "$$(which "$${tool}")" bootfs/bin/; \
		chmod 755 "bootfs/bin/$${tool}"; \
	done
	ln -s sh bootfs/bin/bash

bootfs/lib:
	ln -s . bootfs/usr
	mkdir -p bootfs/lib
	for repeat in 1 2 3 4 5 6; do \
		for copyfile in $$(ldd bootfs/bin/* bootfs/lib/* 2>/dev/null | sed 's@^.*=> @@;s@ *(0x.*)@@;s@^[\t ]*@@' | sort -u | grep '^/.*lib'); do \
			cp "$${copyfile}" "bootfs/$${copyfile}"; \
			chmod 755 "bootfs/$${copyfile}"; \
		done; \
	done

installfs/boot/bzImage: archive/linux-$(LINUXVER).tar.bz2 config/config-$(LINUXVER)
	mkdir -p archive
	mkdir -p installfs/lib/modules installfs/boot
	tar -jxf archive/linux-$(LINUXVER).tar.bz2
	cp config/config-$(LINUXVER) linux-$(LINUXVER)/.config
	$(MAKE) -C linux-$(LINUXVER) oldconfig
	$(MAKE) -C linux-$(LINUXVER) bzImage
	$(MAKE) -C linux-$(LINUXVER) modules
	$(MAKE) -C linux-$(LINUXVER) modules_install INSTALL_MOD_PATH=$$(pwd)/installfs/
	cp linux-$(LINUXVER)/arch/x86/boot/bzImage linux-$(LINUXVER)/System.map installfs/boot/
	cp linux-$(LINUXVER)/.config installfs/boot/config-$(LINUXVER)

archive/linux-$(LINUXVER).tar.bz2:
	mkdir -p archive
	wget -O "archive/linux-$(LINUXVER).tar.bz2" http://www.kernel.org/pub/linux/kernel/v2.6/linux-$(LINUXVER).tar.bz2

installfs/bin: isolinux/message.txt archive/jesniffer-latest-noarch-1je.tgz archive/jesnort-latest-i486-1je.tgz
	mkdir -p archive
	bin/fetchandinstallpkgs installfs archive "$(SLACKWAREMIRROR)" $(SLACKWAREPKGS)
	bin/fetchandinstallpkgs installfs archive "$(SNORTMIRROR)" $(SNORTPKGS)
	bin/fetchandinstallpkgs installfs archive http://software.jaos.org/slackpacks/$(SLACKWAREVER)/ slapt-get
	bin/installpkg_chroot installfs "$$(readlink -f archive/jesniffer-latest-noarch-1je.tgz)"
	bin/installpkg_chroot installfs "$$(readlink -f archive/jesnort-latest-i486-1je.tgz)"

archive/jesniffer-latest-noarch-1je.tgz: installfs-local/* installfs-local/etc/rc.d/rc3.d/S99snort
	mkdir -p archive
	echo -ne '\033[2J\033[H' > installfs-local/etc/issue
	cat isolinux/message.txt >> installfs-local/etc/issue
	cp -a installfs-local installfs-local-tmp
	find installfs-local-tmp -type d -name .svn -print0 | xargs -0 rm -rf
	cd installfs-local-tmp; ../bin/makepkg -l y -c n "../archive/jesniffer-$$(cat ../installfs-local/etc/jesniffer-version)-noarch-1je.tgz"
	rm -rf installfs-local-tmp
	rm -f "archive/jesniffer-latest-noarch-1je.tgz"
	ln -s "jesniffer-$$(cat installfs-local/etc/jesniffer-version)-noarch-1je.tgz" "archive/jesniffer-latest-noarch-1je.tgz"

installfs-local/etc/rc.d/rc3.d/S99snort: installfs-local/etc/rc.d/init.d/snort
	rm -f "$@"
	ln -s ../init.d/snort "$@"

archive/jesnort-latest-i486-1je.tgz: installfs-snort/* installfs-snort/var/snort/so_rules/dos.so installfs-snort/usr/bin/snort
	mkdir -p archive
	cp -a installfs-snort installfs-snort-tmp
	find installfs-snort-tmp -type d -name .svn -print0 | xargs -0 rm -rf
	rm -rf installfs-snort-tmp/var/snort/local.rules installfs-snort-tmp/var/snort/Makefile installfs-snort-tmp/var/snort/patches
	rm -f installfs-snort-tmp/var/snort/so_rules/*.rules
	cd installfs-snort-tmp; ../bin/makepkg -l y -c n "../archive/jesnort-$(SNORTVER).0.$$(cat ../installfs-snort/etc/jesnort-version)-i486-1je.tgz"
	rm -rf installfs-snort-tmp
	rm -f "archive/jesnort-latest-i486-1je.tgz"
	ln -s "jesnort-$(SNORTVER).0.$$(cat installfs-snort/etc/jesnort-version)-i486-1je.tgz" "archive/jesnort-latest-i486-1je.tgz"

installfs-snort/var/snort/so_rules/dos.so installfs-snort/usr/bin/snort: archive/snortrules-latest-2.8.tar.gz
	cd installfs-snort/var/snort; tar -zxf ../../../archive/snortrules-latest-2.8.tar.gz
	$(MAKE) -C installfs-snort/var/snort all SLACKWAREVER="$(SLACKWAREVER)" SNORTVER="$(SNORTVER)"

archive/snortrules-latest-2.8.tar.gz:
	mkdir -p archive
	DATECODE=$$(date +%Y%m%d%H%M%S); wget -O "archive/snortrules-$${DATECODE}-2.8.tar.gz" "http://www.snort.org/pub-bin/oinkmaster.cgi/ef548f3cf09117dac4d555796827a19eeb995f7d/snortrules-snapshot-2.8.tar.gz" || exit 1; ln -s "snortrules-$${DATECODE}-2.8.tar.gz" "archive/snortrules-latest-2.8.tar.gz"

clean:
	$(MAKE) -C src/gen-random/ clean
	$(MAKE) -C src/reboot/ clean
	$(MAKE) -C installfs-snort/var/snort clean
	rm -f snortbox.iso isolinux/initrd.img bootfs/usr
	rm -rf iso/ bootfs/bin/ bootfs/lib/

distclean: clean
	-rm -f archive/*.TXT
	rm -f archive/jesniffer-latest-noarch-1je.tgz archive/jesnort-latest-i486-1je.tgz
	$(MAKE) -C installfs-snort/var/snort distclean
	rm -f installfs-local/etc/issue installfs-local/etc/rc.d/rc3.d/S99snort
	rm -rf installfs/ installfs-local-tmp/ installfs-snort-tmp/
	rm -rf linux-$(LINUXVER)/

test: snortbox.iso
	qemu -net nic -net nic -net user -hda hda -cdrom snortbox.iso -boot d

.PHONY: all test clean distclean checktools
