#!/sbin/openrc-run
# Copyright 1999-2013 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

description="Load all configured profiles for the AppArmor security module."
description_reload="Reload all profiles"

extra_started_commands="reload"

aa_action() {
	local arg=$1
	local return

	shift
	$*
	return=$?

	if [ ${return} -eq 0 ]; then
		aa_log_success_msg $arg
	else
		aa_log_failure_msg arg
	fi

	return $return
}

aa_log_action_start() {
	ebegin $1
}

aa_log_action_end() {
	eend $1
}

aa_log_success_msg() {
	einfo $1
}

aa_log_warning_msg() {
	ewarn $1
}

aa_log_failure_msg() {
	eerror $1
}

aa_log_skipped_msg() {
	einfo $1
}

aa_log_daemon_msg() {
	einfo $1
}

aa_log_end_msg() {
	eend $1
}

. /usr/libexec/rc.apparmor.functions

start() {
	ebegin "Starting AppArmor"
	eindent

	if ! is_apparmor_loaded ; then
		load_module
		if [ $? -ne 0 ]; then
			eerror "AppArmor kernel support is not present"
			eend 1
			return 1
		fi
	fi

	parse_profiles load

	eoutdent
}

stop() {
	ebegin "Stopping AppArmor"
	eindent
	apparmor_stop
	eoutdent
}

reload() {
	# todo: split out clean_profiles into its own function upstream
	# so we can do parse_profiles reload && clean_profiles
	# and do a proper reload instead of restart
	apparmor_restart
}
