#!/usr/bin/env python
from __future__ import print_function
import os
import sys
from distutils.core import setup
from distutils.dir_util import remove_tree

# Python2/3 compliance
try:
	raw_input
except NameError:
	raw_input = input

def cleanup_build_directory():
	# Requires to chdir into the src directory first
	try:
		remove_tree("build")
	except KeyboardInterrupt as e:
		raise e
	except Exception:
		pass

def cleanup_module_directory():
	# Installing doesn't remove old files that may have been deleted from the module.
	if "install" in sys.argv:
		try:
			import binwalk
			for path in binwalk.__path__:
				try:
					remove_tree(path + os.path.sep + "*")
				except OSError as e:
					pass
		except ImportError:
			pass

# Change to the binwalk src directory
def warning(lines, terminate=True, prompt=True):
	WIDTH = 115

	if not IGNORE_WARNINGS:
		print("\n" + "*" * WIDTH)
		for line in lines:
			print(line)
		print("*" * WIDTH, "\n")

		if prompt:
			if raw_input('Continue installation anyway (Y/n)? ').lower().startswith('n'):
				terminate = True
			else:
				terminate = False

		if terminate:
			sys.exit(1)
		
# This is super hacky.
if "--yes" in sys.argv:
	sys.argv.pop(sys.argv.index("--yes"))
	IGNORE_WARNINGS = True
else:
	IGNORE_WARNINGS = False

# cd into the src directory, no matter where setup.py was invoked from
os.chdir(os.path.join(os.path.dirname(os.path.realpath(__file__)), "src"))

print("checking pre-requisites")
try:
	import magic
	try:
		magic.MAGIC_NO_CHECK_TEXT
	except AttributeError as e:
		msg = ["Pre-requisite failure: " + str(e),
			"It looks like you have an old or incompatible magic module installed.",
			"Please install the official python-magic module, or download and install it from source: ftp://ftp.astron.com/pub/file/"
		]
		
		warning(msg)
except ImportError as e:
	msg = ["Pre-requisite failure:", str(e),
		"Please install the python-magic module, or download and install it from source: ftp://ftp.astron.com/pub/file/",
	]
	
	warning(msg)

try:
	import pyqtgraph
except ImportError as e:
	msg = ["Pre-requisite check warning: " + str(e),
		"To take advantage of this tool's graphing capabilities, please install the pyqtgraph module.",
	]
	
	warning(msg, prompt=True)

# Build / install C compression libraries
c_lib_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), "C")
c_lib_makefile = os.path.join(c_lib_dir, "Makefile")

working_directory = os.getcwd()
os.chdir(c_lib_dir)
status = 0

if not os.path.exists(c_lib_makefile):
	status |= os.system("./configure")

status |= os.system("make")

if status != 0:
	msg = ["Build warning: failed to build C libraries.",
		"Some features will not work without these libraries."
	]
	warning(msg, prompt=True)
elif "install" in sys.argv:
	if os.system("make install") != 0:
		msg = ["Install warning: failed to install C libraries.",
			   "Some features will not work without these libraries."
		]
		warning(msg, prompt=True)

os.system("make distclean")
	
os.chdir(working_directory)

cleanup_build_directory()
cleanup_module_directory()

# Generate a new magic file from the files in the magic directory
print("creating binwalk magic file")
magic_files = os.listdir("magic")
magic_files.sort()
fd = open("binwalk/magic/binwalk", "wb")
for magic in magic_files:
	fpath = os.path.join("magic", magic)
	if os.path.isfile(fpath):
		fd.write(open(fpath, "rb").read())
fd.close()

# The data files to install along with the binwalk module
install_data_files = ["magic/*", "config/*", "plugins/*", "modules/*", "core/*"]

# Install the binwalk module, script and support files
setup(	name = "binwalk",
	version = "2.0.0 beta",
	description = "Firmware analysis tool",
	author = "Craig Heffner",
	url = "https://github.com/devttys0/binwalk",

	requires = ["magic", "pyqtgraph"],
	packages = ["binwalk"],
	package_data = {"binwalk" : install_data_files},
	scripts = ["scripts/binwalk"],
)

cleanup_build_directory()