#!/bin/sh

alterator_api_version=1

. alterator-sh-functions

. shell-quote
. shell-var

#files
bacula_sysconf_dir=/etc/bacula
bacula_fd_file="$bacula_sysconf_dir/bacula-fd.conf"
bacula_fd_password_file="$bacula_sysconf_dir/bacula-fd-password.conf"

daemon_status()
{
    test -n "$1" || return
    local IFS=' '
    local runlevel="$(/sbin/runlevel | cut -c3)"

    LANG=C LC_ALL=C /sbin/chkconfig --list "$1"|grep -qs "${runlevel}:on" || return 1
    /sbin/service "$1" status >/dev/null || return 1
}

daemon_on()
{
    test -n "$1" || return
    daemon_status "$1" && return 0

    /sbin/chkconfig "$1" on
    /sbin/service "$1" start >&2 || :
}

daemon_off()
{
    test -n "$1" || return
    /sbin/service "$1" condstop >&2
    /sbin/chkconfig "$1" off
}

__section_range()
{
    local section
    quote_sed_regexp_variable section "$1"
    echo "/^[[:space:]]*$section[[:space:]]*{[[:space:]]*\(#.*\)\?\$/,/^[[:space:]]*}[[:space:]]*\$/"
}

bacula_config_set()
{
    local file="$1";shift
    local section="$1";shift
    local name="$1";shift
    local value="$1";shift
    local quote="${1:-1}"

    [ "$quote" = "0" ] || value="\"$value\""

    local qname qvalue
    quote_sed_regexp_variable qname "$name"
    quote_sed_regexp_variable qvalue "$value"

    sed \
	-e "$(__section_range "$section") s/^#\?\([[:space:]]*$qname[[:space:]]*=[[:space:]]*\).*/\1$qvalue/" \
	-i "$file"
}

bacula_config_get()
{
    local file="$1";shift
    local section="$1";shift
    local name="$1";shift

    local qname
    quote_sed_regexp_variable qname "$name"

    sed \
        -n \
	-e "$(__section_range "$section") s/^[[:space:]]*$qname[[:space:]]*=[[:space:]]*\"\?\([^\"]\+\)\"\?[[:space:]]*$/\1/p" \
	"$file"
}

bacula_file_get_director()
{
	bacula_config_get "$bacula_fd_file" Director Name
}

bacula_get_include_from_section()
{
	local file="$1";shift
	local section="$1";shift
	sed \
		-n \
		-e "$(__section_range "$section") s/^@//p" \
		"$file"
}

bacula_file_get_password()
{
	name=Password
	local qname
	quote_sed_regexp_variable qname "$name"
	local file="$(bacula_get_include_from_section "$bacula_fd_file" Director)"
	sed \
		-n \
		-e "s/^[[:space:]]*$qname[[:space:]]*=[[:space:]]*\"\?\([^\"]\+\)\"\?[[:space:]]*$/\1/p" \
		"$file"
}

bacula_file_set_director()
{
    local name="$1";shift

    local qname
    quote_sed_regexp_variable qname "$name"

    # update Messages
    local v="$(bacula_config_get "$bacula_fd_file" Messages director)"
    v="$(echo "$v"|sed "s/^[[:space:]]*[^[:space:]]\+\([[:space:]]*=.*\)/$qname\1/")" #"
    bacula_config_set "$bacula_fd_file" Messages director "$v" 0

    # update Director
    bacula_config_set "$bacula_fd_file" Director Name "$name"
}

bacula_file_set_password()
{
    local value
    quote_sed_regexp_variable value "$1"
    sed \
	-e "s/\(^[[:space:]]*Password[[:space:]]*=[[:space:]]*\).*/\1\"$value\"/" \
	-i "$bacula_fd_password_file"
}

on_message()
{
	case "$in_action" in
		read)
		    ! daemon_status bacula-fd
		    write_bool_param file_server "$?"
		    #local director_name="$(bacula_director_get_name)"
		    local director_name="$(bacula_file_get_director)"

		    write_string_param passphrase ""
		    write_string_param director_name "$director_name"
		    ;;
		write)
		    if [ -z $in_director_name ]; then
			    write_error "`_ "Empty director name"`"
			    return
		    else bacula_file_set_director "$in_director_name"
		    fi
		    
		    if [ -n "$in_passphrase" ];then
			bacula_file_set_password "$in_passphrase"
		    elif [ -z "$(bacula_file_get_password)" ];then
			write_error "`_ "Client password not specified!"`"
                	return
		    fi

		    if test_bool "$in_file_server"; then
			daemon_on bacula-fd
		      else
			daemon_off bacula-fd
		    fi
		    service bacula-fd condrestart
		;;
	esac
}

message_loop

