# Copyright (C) 2013 by the University of Southern California
# $Id$
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License,
# version 2, as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.

CC = gcc
CPP= g++
LD = g++
CFLAGS = -g -Wall
CXXFLAGS = -g -Wall -std=c++11
#CFLAGS = -g -O1 -Wall -std=c++11
LDFLAGS= -ltrace -lcrypto -lldns

.PHONY: clean all

DESTDIR=
PREFIX=/usr
BINDIR=$(PREFIX)/bin
MAN1DIR=$(PREFIX)/share/man/man1


all: dnsanon anon_names

clean:
	rm -f *.o *.fsdb *~ dnsanon *.bz2 *.d anon_names

parse.cc.o: parse.cc parse.hh
scramble_crypt.c.o: scramble_crypt.c scramble_crypt.h
main.cc.o: main.cc global_var.h
anon.cc.o: anon.cc anon.hh
aes_util.cc.o: aes_util.cc aes_util.hh
utility.cc.o: utility.cc utility.hh
anon_names.o: anon_names.cc
base64_util.o: base64_util.cc base64_util.hh
table.o: table.cc table.hh

anon_names: anon_names.o scramble_crypt.o base64_util.o anon.o aes_util.o utility.o
	$(LD) -lcrypto -o anon_names $^

dnsanon: main.o scramble_crypt.o parse.o anon.o aes_util.o base64_util.o table.o utility.o \
		dsc_pcap.o dsc_glue.o dsc_hashtbl.o dsc_xmalloc.o dsc_inX_addr.o
	$(LD) $(LDFLAGS) -o dnsanon $^ 

.c.o:
	$(CC) $(CFLAGS) -MT $@ -MD -MP -c -o $@ $<
.cc.o:
	$(CXX) $(CXXFLAGS) -MT $@ -MD -MP -c -o $@ $<

dnsanon.1: dnsanon.md
	pandoc -f markdown -t man -o dnsanon.1 dnsanon.md

install: dnsanon.1 dnsanon
	-mkdir -p $(DESTDIR)$(BINDIR)
	cp dnsanon $(DESTDIR)$(BINDIR)/$(PROGRAM)
	chmod u=rwx,go-rx $(DESTDIR)$(BINDIR)/$(PROGRAM)
	-mkdir -p $(DESTDIR)$(MAN1DIR)
	-cp dnsanon.1 |gzip >$(DESTDIR)$(MAN1DIR)/dnsanon.1.gz

VERSION=$(shell sed -e 's/^[^"]*"//' -e 's/"[^"]*$$//' version.h)


######################################################################
#
# testing
#

test_enc:
	cat domain_names |./anon_names -k keyfile
test_dec:
	cat domain_names |./anon_names -k keyfile | ./anon_names -k keyfile -r 
test_validate:
	cat domain_names |./anon_names -k keyfile | ./anon_names -k keyfile -r  | diff - domain_names

test_samples: ./dnsanon
	( cd sample_data && make test )

DATA_DIR=sample_data
TEST_DIR=.dnsanon_test
test: dnsanon
	rm -rf $(TEST_DIR) && mkdir -pv $(TEST_DIR)
	dn=(output_151226_Q output_151226_Qm output_151226_mqr);\
	for d in "$${dn[@]}"; do\
		OUT_DIR=$(TEST_DIR)/$$d;\
		mkdir -p $$OUT_DIR;\
		OPT=`echo $$d | cut -d _ -f 3`;\
		./dnsanon -i $(DATA_DIR)/input_151226.pcap -o $$OUT_DIR -p $$OPT -c none;\
		diff -I ^# $$OUT_DIR $(DATA_DIR)/$$d || exit 1; \
	done
	dn=(output_2_Q output_2_Qm output_2_mqr);\
	for d in "$${dn[@]}"; do\
		OUT_DIR=$(TEST_DIR)/$$d;\
		mkdir -p $$OUT_DIR;\
		OPT=`echo $$d | cut -d _ -f 3`;\
		./dnsanon -i $(DATA_DIR)/input2.pcap -o $$OUT_DIR -p $$OPT -c none;\
		diff -I ^# $$OUT_DIR $(DATA_DIR)/$$d || exit 1; \
	done
	OUT_DIR=$(TEST_DIR)/anon_output_151226_mqr;\
	mkdir -p $$OUT_DIR;\
	./dnsanon -i $(DATA_DIR)/input_151226.pcap -o $$OUT_DIR -p mqr -c none -a all -k keyfile --pass4 16 --pass6 64;\
	diff -I ^# $$OUT_DIR $(DATA_DIR)/anon_output_151226_mqr || exit 1;\
	echo "[info] test is successful";\
	rm -rf $(TEST_DIR)

update_test: dnsanon
	dn=(output_151226_Q output_151226_Qm output_151226_mqr);\
	for d in "$${dn[@]}"; do\
		OUT_DIR=$(DATA_DIR)/$$d;\
		mkdir -p $$OUT_DIR;\
		OPT=`echo $$d | cut -d _ -f 3`;\
		./dnsanon -i $(DATA_DIR)/input_151226.pcap -o $$OUT_DIR -p $$OPT -c none;\
	done
	dn=(output_2_Q output_2_Qm output_2_mqr);\
	for d in "$${dn[@]}"; do\
		OUT_DIR=$(DATA_DIR)/$$d;\
		mkdir -p $$OUT_DIR;\
		OPT=`echo $$d | cut -d _ -f 3`;\
		./dnsanon -i $(DATA_DIR)/input2.pcap -o $$OUT_DIR -p $$OPT -c none;\
	done

######################################################################
#
# packaging
#

# generic

tar.gz:
	ln -s . dnsanon-$(VERSION)
	tar -chvzf dnsanon-$(VERSION).tar.gz \
		dnsanon-$(VERSION)/README \
		dnsanon-$(VERSION)/COPYING \
		dnsanon-$(VERSION)/Makefile \
		dnsanon-$(VERSION)/*.{cc,hh,c,h} \
		dnsanon-$(VERSION)/dnsanon.{1,md} \
		dnsanon-$(VERSION)/dnsanon.spec{,.in} \
		dnsanon-$(VERSION)/sample_data
	rm dnsanon-$(VERSION)

# fedora

dnsanon.spec:  dnsanon.spec.in
	<dnsanon.spec.in sed 's/@VERSION@/'$(VERSION)'/g' >$@

rpms: dnsanon.spec 
	cp dnsanon-$(VERSION).tar.gz $$HOME/rpmbuild/SOURCES
	cp dnsanon.spec $$HOME/rpmbuild/SPECS
	( cd $$HOME/rpmbuild; rpmbuild --sign -ba SPECS/dnsanon.spec; )
	cp $$HOME/rpmbuild/RPMS/x86_64/dnsanon-$(VERSION)-1$(RPM_DIST).*.x86_64.rpm .
	cp $$HOME/rpmbuild/SRPMS/dnsanon-$(VERSION)-1$(RPM_DIST).*.src.rpm .

rpmlint:
	rpmlint dnsanon-$(VERSION)-1.*.src.rpm

# release
INTERNAL_WEBSITE=../../../../ANT/WWW/ant_2015/software/dnsanon
release:
	@echo "You should have done: \"make tar.gz; make rpms; make rpmlint\""
	cp dnsanon-$(VERSION).tar.gz dnsanon-$(VERSION)-1$(RPM_DIST).*.src.rpm $(INTERNAL_WEBSITE)
	( cd $(INTERNAL_WEBSITE); git add dnsanon-$(VERSION).tar.gz dnsanon-$(VERSION)-1$(RPM_DIST).*.src.rpm; )
	@echo "now (edit _data/software.yaml); git tag -s -u 0x4c6cd6f2 -m 'dnsanon-$(VERSION) release' dnsanon-$(VERSION); cd $(INTERNAL_WEBSITE); git commit -m 'release $(VERSION)'; git push;"
