#!/bin/sh

repositorydir=/etc/alterator/mirror/repositories
configdir=/etc/alterator/mirror/config
mirrordir=/etc/alterator/mirror/mirrors
destdir=/var/lib/alterator/mirror

alterator_api_version=1

. alterator-sh-functions
. shell-quote
. shell-config

### low level

repository_awk()
{
    alterator-dump-desktop \
        -v lang="$in_language" \
        -v out="Filename;X-Alterator-Path;X-Alterator-Has-Noarch;Name" \
        -v def="noname;/notfound;no" \
	"$@"
}

mirror_awk()
{
    alterator-dump-desktop \
        -v lang="$in_language" \
        -v out="X-Alterator-Repositories;X-Alterator-RSYNC-URI" \
        -v def="all" \
	"$@"
}


list_uri()
{
    local path="$(quote_sed_regexp "$1")"
    sed -n "s/$prefix_re$path[[:space:]]\+.*/\2/p" $sourcelist
}

config_get()
{
    local v="$(shell_config_get "$configdir/$1" "$2")"
    string_quote_remove "$v"
}

config_set()
{
    local f="$configdir/$1"
    [  -s "$f" ] || echo ". $configdir/.common" >"$f"

    shell_config_set "$f" "$2" "\"$3\""
}

### high level

list_repository()
{
    repository_awk $repositorydir/*.desktop|
	while read name path noarch description;do
	    name="${name##*/}"
	    name="${name%.desktop}"

	    local uri="$(config_get "$name" SRCROOT)"
	    local arch="$(config_get "$name" ARCH)"

	    [ -n "$uri" ] || uri="`_ "no mirroring"`"
	    arch="${arch%% noarch}"

	    local dusage="$(du -sh "$destdir/$path" 2>/dev/null|cut -f1)"
	    [ -n "$dusage" ] || dusage="0 K"


	    write_table_item \
		name "$name" \
		description "$description" \
		uri "$uri" \
		arch "$arch" \
		du "$dusage"
	done
}

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

    write_enum_item "none" "`_ "no mirroring"`"

    mirror_awk $mirrordir/*.desktop|
	while read repo uri; do
	    [ -n "$uri" ] || continue
	    repo=";$repo;"
	    [ "$repo" = ";all;" -o -z "${repo##*;$name;*}" ] || continue
	    echo "$uri"
	done | write_enum
}

list_arch()
{
    write_enum_item "i586"
    write_enum_item "x86_64"
}


read_storage()
{
    df -lhP |
	sed 1d |
	sort -r -k 6,6 |
	while read fs total use avail percent mpoint; do
	    [ -z "${destdir##$mpoint*}" ] || continue
	    write_string_param "storage_avail" "$avail"
	    break
	done
}

on_message()
{
	case "$in_action" in
		list)
			case "$in__objects" in
			    avail_repository)
				list_repository;;
			    avail_arch)
				list_arch;;
			    avail_mirror)
				[ -n "$in_name" ] && list_mirror "$in_name" ;;
			esac
			;;
		read)
			case "$in__objects" in
			    /)
				! grep -qs "^$(quote_sed_regexp "$destdir")[[:space:]]" /etc/exports
				write_bool_param export_nfs "$?"
				write_bool_param enabled "$(shell_config_get "$configdir/.common" ALTERATOR_ENABLED)"
				read_storage
				;;
			    repository)
				[ -n "$in_name" ] || return

				repository_awk $repositorydir/$in_name.desktop|
				    (read name path noarch description;
					write_string_param description "$description")

				local uri="$(config_get "$in_name" SRCROOT)"
				local arch="$(config_get "$in_name" ARCH|tr ' ' ';')"
				[ -n "$uri" ] || uri="none"

				write_string_param uri "$uri"
				write_string_param arch "$arch"
				;;
			esac
			;;
		write)
		    case "$in__objects" in
			/)
			    ! test_bool "$in_enabled"
			    shell_config_set "$configdir/.common" ALTERATOR_ENABLED "$?"
			    if test_bool "$in_export_nfs" ;then
				grep -qs "^$(quote_sed_regexp "$destdir")[[:space:]]" /etc/exports ||
				    echo "$destdir *(ro,all_squash,sync)" >>/etc/exports
			    else
				sed "/^$(quote_sed_regexp "$destdir")[[:space:]]/d" -i /etc/exports
			    fi
			    /sbin/service nfs restart >/dev/null 2>/dev/null
			;;
			repository)
			    if [ -n "$in_clear" -a -n "$in_name" ];then
				repository_awk $repositorydir/$in_name.desktop|
				(read name path noarch description;
				    [ -n "$path" ] && rm -rf "$destdir/$path")
			    elif [ -n "$in_commit" ];then
				repository_awk $repositorydir/$in_name.desktop|
				(read name path noarch description;
				    config_set "$in_name" LIST "$path"

				    [ -n "$in_arch" -a "$noarch" = "yes" ] &&
					in_arch="${in_arch};noarch"

				    [ "$in_uri" != "none" ] || in_uri=""
				    config_set "$in_name" SRCROOT "$in_uri"
				    config_set "$in_name" ARCH "$(echo $in_arch|tr ';' ' ')")
			    fi
		    esac
		    ;;
		write)
			;;
	esac
}

message_loop
