debug = false
stageName = ''
git_link = ''
script_git = 'https://git.psychobox.org/psycho/owrt_build_script.git'
git_folder = 'openwrt'
script_folder = 'owrt_build_script'
config_path = script_folder + '/configs/'
patch_path = script_folder + '/patches/'
scripts_path = script_folder + '/scripts/'
patch = patch_path + 'tl-wr841_16m.patch'
sftp_host = ''
sftp_user = ''
sftp_path = '/jenkins/owrt/'
isBuildNeeded = false
deleteUnbuild = true
force_build = false
pre_clean = true
post_clean = false
build_node = 'linux'
bin_path = 'bin'
core_count_str = '$((`nproc` + 1))'
statusCode = 0
mail_body = "<h1>${JOB_NAME} - Build # ${BUILD_NUMBER} - ${currentBuild.currentResult}:</h1>"
mail_subject = "${JOB_NAME} - Build # ${BUILD_NUMBER} - ${currentBuild.currentResult}!"

if(params.DEBUG)
{
   debug = true
}
if(params.GIT)
{
	git_link = params.GIT
}
if(params.SFTP_HOST)
{
	sftp_host = params.SFTP_HOST
}
if(params.SFTP_USER)
{
	sftp_user = params.SFTP_USER
}
if(params.SFTP_PATH)
{
	sftp_path = params.SFTP_PATH
}
if(params.KNOWN_HOSTS)
{
	known_hosts = params.KNOWN_HOSTS
}
if(params.DeleteUnbuild)
{
	deleteUnbuild = params.DeleteUnbuild
}
if(params.PRE_CLEAN)
{
	pre_clean = params.PRE_CLEAN
}
if(params.POST_CLEAN)
{
	post_clean = params.POST_CLEAN
}
if(params.BIN_PATH)
{
	bin_path = params.BIN_PATH
}
if(params.FORCE_BUILD)
{
	force_build = params.FORCE_BUILD
}
if(params.BUILD_NODE)
{
	build_node = params.BUILD_NODE
}

def printDebug(msg)
{
    println 'DEBUG: ' + msg
}

def add2mail(msg)
{
	mail_body += '<br>' + msg + '<br>'
}

printDebug(currentBuild.id.toString())
printDebug(JOB_NAME)


node(build_node)
{
	try
	{
		checkout()
		if(isBuildNeeded || force_build)
		{
			pre_build()
			build()
		}
	}
	catch (e)
	{
		printDebug(e.getMessage())
		add2mail(e.getMessage())
	}
	finally
	{
		post_build()
	}
	
}


def checkout()
{
	stage('checkout')
	{
		if(pre_clean)
		{
			cleanWs()
		}
		statusCode = sh label: 'checkout_configs', script: 'git clone ' + script_git + ' ' + script_folder, returnStatus:true
		if(statusCode != 0)
		{
			throw new Exception("Error checking out configs")
		}
		statusCode = sh label: 'checkout_openwrt', script: 'git clone ' + git_link + ' ' + git_folder, returnStatus:true
		if(statusCode != 0)
		{
			throw new Exception("Error checking out OWRT")
		}
		def ret = sh label: 'is_build_needed', script: 'set +x; python ' + scripts_path + 'sftp_test.py -a ' + sftp_host + ' -u ' + sftp_user + ' -p ' + params.SFTP_PASSWD + ' -g ' + git_folder + ' -f ' + scripts_path + known_hosts + ' -l ' + sftp_path + '; set -x', returnStdout: true
		if(ret.trim().equalsIgnoreCase('True'))
		{
			isBuildNeeded = true
		}
	}
}

def pre_build()
{
	stage('pre-build')
	{
		statusCode = sh label: 'patch_sources', script: 'cd ' + git_folder + '; patch -p1 < ../' + patch, returnStatus:true
		if(statusCode != 0)
		{
			throw new Exception("Error patching sources")
		}
		statusCode = sh label: 'feeds_update', script: 'cd ' + git_folder + '; ./scripts/feeds update -a', returnStatus:true
		if(statusCode != 0)
		{
			throw new Exception("Error updating feeds")
		}
		statusCode = sh label: 'feeds_install', script: 'cd ' + git_folder + '; ./scripts/feeds install -a', returnStatus:true
		if(statusCode != 0)
		{
			throw new Exception("Error installing feeds")
		}
	}
}

def build()
{
	stage('build')
	{
		sh label: 'copy_config', script: 'cp ' + config_path + 'tl_wr841_config ' + git_folder + '/.config'
		if(statusCode != 0)
		{
			throw new Exception("Error copying config")
		}
		statusCode = sh label: 'build', script: 'cd ' + git_folder + '; make defconfig; make download; make -j$((`nproc` + 1))', returnStatus:true
		if(statusCode != 0)
		{
			add2mail('multicore failed')
			printDebug('multicore build failed -> trying to build verbosely on a single core')
			statusCode = sh label: 'build_single_core', script: 'cd ' + git_folder + '; make defconfig; make download; make -j1 V=s', returnStatus:true
			if(statusCode != 0)
			{
				throw new Exception("Error building images")
			}
		}
	}
			
	stage('move_bin_to_ftp')
	{
		statusCode = sh label: 'copy_binaries', script: 'python ' + scripts_path + 'sftp_test.py -a ' + sftp_host + ' -u ' + sftp_user + ' -p ' + params.SFTP_PASSWD + ' -g ' + git_folder + ' -f ' + scripts_path + known_hosts + ' -l ' + sftp_path + ' -c ' + bin_path, returnStatus:true
		if(statusCode != 0)
		{
			throw new Exception("Error copying binaries")
		}
	}
}
		
def post_build()
{ 
	if(post_clean)
	{
		cleanWs()
	}
	
	send_mail()

	if((!isBuildNeeded && !force_build && deleteUnbuild))
	{
		//if no build is needed, then the last build is deleted and the next build number is set to previous build number
		def job = Jenkins.instance.getItem(JOB_NAME)
		job.getLastBuild().delete()
		job.save()
	}
}
	
def send_mail()
{
	//def body_text = "${JOB_NAME} - Build # ${BUILD_NUMBER} - ${currentBuild.currentResult}:<br>Check console output at ${BUILD_URL} to view the results."
	add2mail("Check console output at ${BUILD_URL} to view the results.")
	emailext body: mail_body, subject: mail_subject, to: 'psychowoife@gmail.com'
}