#!/bin/bash
# This is a procedure for automatic deployment/installation/configuration of systems. # TODO: document! (readme, notes about deployment profiles, examples, ...)
# check /usr/share/aif/examples for some example config files.
# This procedure can easily replace the old quickinst script if you look at the "generic install" config file
# Look at the base procedure to see the phases and which workers they'll execute.
# It should be:
# phase_preparation=(configure intro sysprep select_source runtime_network runtime_repositories runtime_packages)
# phase_basics=(set_clock prepare_disks)
# phase_system=(package_list install_packages auto_fstab auto_networkTODO auto_locale auto_keymap_font configure_system mkinitcpio locales install_bootloader)
# phase_finish=(msg_report)

# In theory, the only manual thing should maybe be configuring the runtime network and putting the configfile in place
# TODO: I don't know if you can do non-interactive dm_crypt stuff.. maybe by pulling luks keyfiles from svn/git/..?
# TODO: for worker_configure_system, we probably want the user to specify hostname, root pass etc.
# TODO: implement setting hostname, keymap, consolefont, network settings
# for a list of recognized variables, see examples/generic-install-on-sda

depend_procedure core base

var_OPTS_STRING="c:"
var_ARGS_USAGE="-c <config>: Specify a configfile (profile) to be used"
var_AUTOMATIC_PROFILE=""
# TODO: if the user does aif -p automatic -c, then $1 is ":-" ??? if you do -c <something> then it's ok.
process_args ()
{
	if [ "$1" = '-c' ]
	then
		[ -z "$2" ] && die_error "You must specify a config"
		var_AUTOMATIC_PROFILE=$2
	else
		usage
		exit 5
        fi
}


worker_intro ()
{
	notify "Automatic procedure running profile $var_AUTOMATIC_PROFILE ...\n$DISCLAIMER"
}


worker_configure ()
{
	var_UI_TYPE=${arg_ui_type:-cli}
	ui_init
	[ -z "$var_AUTOMATIC_PROFILE" ] && die_error "You must specify a config file to use this procedure"
	source $var_AUTOMATIC_PROFILE   || die_error "Could not source config $var_AUTOMATIC_PROFILE"
	# Check mandatory options
	[ -z "$PARTITIONS" ] && die_error "You did not specify a partition scheme"
	[ -z "$BLOCKDATA"  ] && die_error "You did not specify a partition scheme"
	[ -z "$GRUB_DEVICE" ] && die_error "You did not specify a grub device"
	# initialize internal variables based on variables set by the user (some of the vars are handled in other workers):
	var_RUNTIME_REPOSITORIES=$RUNTIME_REPOSITORIES
	var_RUNTIME_PACKAGES=$RUNTIME_PACKAGES
	var_GRUB_DEVICE=$GRUB_DEVICE
	var_PARTITIONS=$PARTITIONS
	var_BLOCKDATA=$BLOCKDATA
	HARDWARECLOCK=${HARDWARECLOCK:-localtime}
	TIMEZONE=${TIMEZONE:-Canada/Pacific}
}

worker_select_source ()
{
        var_PKG_SOURCE_TYPE=${SOURCE:-cd}
        var_FILE_URL=${FILE_URL:-file:///src/core/pkg}
        var_SYNC_URL=${SYNC_URL:-}
}

worker_runtime_network ()
{
	true # for now. we assume the user has taken care of this himself already. doing this interactively wouldn't be a good default anyway.
	# maybe check if network works, if not, try dhcp. let user override by using a static config in his config file
	#if ask_yesno "Do you want to (re)-configure your networking?"
	#then
	#	interactive_runtime_network
	#else
	#	infofy "Ok. skipping network config"
	#fi
}


worker_prepare_disks ()
{
	echo "$var_PARTITIONS" > $TMP_PARTITIONS
	echo "$var_BLOCKDATA" > $TMP_BLOCKDEVICES
	process_disks       || die_error "Could not process_disks"
	if ! process_filesystems
	then
		show_warning 'Disk processing' "Could not process_filesystems"
		txt='also failed to execute properly'
		rollback_filesystems && txt='ended successfully'
		die_error "Something failed while processing the filesystem.  A rollback was executed, which $txt"
	fi
	infofy "Partitions and filesystems made successfully"

	# TODO: fstab? auto-add to fstab with libs? auto mkdir's on target_dir?
	true	
}

worker_package_list ()
{
	var_TARGET_PACKAGES=$TARGET_PACKAGES
	var_TARGET_GROUPS=$TARGET_GROUPS
	var_TARGET_PACKAGES_EXCLUDE=$TARGET_PACKAGES_EXCLUDE
	[ -z "$var_TARGET_PACKAGES" -a -z "$var_TARGET_GROUPS" ] && var_TARGET_GROUPS=base
}


worker_install_packages ()
{
        target_prepare_pacman core extra community #TODO: it would be better if this was a separate worker, i think
        installpkg
}


worker_set_clock ()
{
	#TODO implement this
	true
}


worker_auto_network () {
	# temporary override because i need to implement this
	true
}


worker_configure_system () {
	prefill_configs
}

worker_install_bootloader ()
{
    get_grub_map
	grub-install $var_GRUB_DEVICE --root-directory=/mnt
    # check if we have a seperate bootdev (/boot)
    # ToDo: This is double-work, find a better place!
    # See comment in generate_grub_menulst and interactive_grub
    bootdev=$(mount | grep $var_TARGET_DIR/boot | cut -d' ' -f 1)
	generate_grub_menulst
}
