#!/bin/bash
# config-scripts/src/share/top--users/user.sh
#
#  Copyright: ©2010–2011, Güralp Systems Ltd.
#  Author: Bob Dunlop <rdunlop@guralp.com>
#  Author: Laurence Withers <lwithers@guralp.com>
#  License: GPLv3
#

id="$3"
create_mode=""
[ -z "$id" -o "X$id" == "X-" ] && create_mode=True


if [ "X$1" == "X--navbar" ]
then
    echo "usertop Users"
    if [ -n "$create_mode" ]
    then
        echo "user/- Create"
    else
        echo "user/$id $id"
    fi
    exit 0
fi


# Load support functions
script_dir=$(dirname $0)
. $script_dir/functions.sh



# Rules for group inheritance. Any rules that specify a user in group A must
# also be in group B are added here.
#  $1 → group to check
#  $2 → group to be a member of if $1 is true
do_group_inheritance_aux() {
    local g1var="new_grp_$1"
    local g2var="new_grp_$2"

    gcs_truefalse "${!g1var:-false}" && eval ${g2var}=True
}

do_group_inheritance() {
    do_group_inheritance_aux    instcfg         inst
    do_group_inheritance_aux    instcfg         dialout
    do_group_inheritance_aux    spyrus          gpio
}

# Cat the group file minus any comments
cat_group() {
    sed -e '/^#/d' < /etc/group
}

# Convert a group line into a True or False variable
set_True() {
    sed -e 's/\([^:]*\).*/o_grp_\1=True/'
}

set_False() {
    sed -e 's/\([^:]*\).*/o_grp_\1=False/'
}

do_read() {
    if [ -z "${create_mode}" ]
    then
        if ! id "$id" > /dev/null 2>&1
        then
            # Catch people being creative with the URL (or maybe just a stale
            # post) and force them into create mode.
            gcs_err msg "User $id does not exist, forcing create mode."
            create_mode=True
        fi
    fi

    if [ -n "$create_mode" ]
    then
        gcs_var o_create_mode True
        gcs_var o_id ""
        gcs_var o_name ""
        gcs_var o_timeout 0

        gcs_var "d_grp_sysctrl"     "True"
        gcs_var "d_grp_gpio"        "True"
        gcs_var "d_grp_inst"        "True"
        gcs_var "d_grp_data"        "True"
        gcs_var "d_grp_mstorage"    "True"

    else
        name=$(awk -v ID=$id -F : '{ if ( ID == $1 ) print $5 }' < /etc/passwd)
        [ -z "$name" ] && nam=$id

        gcs_var o_create_mode False
        gcs_var o_id $id
        gcs_var o_name "$name"

        # Turn /etc/group into a set of checkbox variables
        if [ "$id" == "root" ]
        then
            # Root is a member of all groups
            cat_group | set_True

            gcs_var o_isroot True
        else
            cat_group | grep    -E '[:,]'${id}'(,|$)' | set_True
            cat_group | grep -v -E '[:,]'${id}'(,|$)' | set_False
        fi

        # Get timeout from /etc/shadow_http
        timeout=$(gsl_adduser --showtime $id)
        gcs_var o_timeout ${timeout:-0}
    fi

    gcs_var o_passwd ""
    gcs_var o_delete_mode False
}

do_write_or_check() {
    local check="$1"
    local glist=""
    local g
    local g2
    local timeout=""
    local cmd="--modify"

    gcs_read_vars

    if gcs_truefalse "${new_delete_mode:-false}"
    then
        gsl_adduser --gcs $check --delete $new_id
        return
    fi

    gcs_truefalse "${new_create_mode:-false}" && cmd="--add"
    [ -n "$new_timeout" ] && timeout="--timeout ${new_timeout}"
    [ -n "$new_name" ] && gecos="--comment \'${new_name}\'"

    if [ "$new_id" != "root" ]
    then
        do_group_inheritance

        while read g
        do
            g2=new_grp_$g
            gcs_truefalse "${!g2:-false}" && glist="$glist $g"
        done < <(sed -e '/^#/d' -e 's/:.*//' /etc/group)
        [ -z "$glist" ] && glist="users"
    fi

    if [ -n "$new_name" ]
    then
        echo "${new_passwd:--n}" \
            | gsl_adduser --gcs $check $cmd $timeout --comment "$new_name" $new_id $glist
    else
        echo "${new_passwd:--n}" \
            | gsl_adduser --gcs $check $cmd $timeout $new_id $glist
    fi
}


case "X$1" in
X--check)
    do_write_or_check --check
    ;;

X--write)
    do_write_or_check ""
    ;;

X--read)
    do_read
    ;;
*)
    exit 1
    ;;
esac

gcs_cleanup
exit 0

# vim: ts=4:sw=4:expandtab
