#!/bin/sh
#----------------------------------------------------------------------------
# add-group - add a group
#
# Creation:     2001-11-04  fm
# Last Update:  $Id$
#
# Copyright (c) 2001-@@YEAR@@ the eisfair team, team(at)eisfair(dot)org
#
# usage:        add-group
#    or:        add-group [--quiet] [-r] group [gid]
#
#                          -q, --quiet   - suppress all screen output
#                          -r, --system  - create system group
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#----------------------------------------------------------------------------
# include eislib
. /var/install/include/eislib

#debug=true

if ${debug:-false}
then
    exec 2>/tmp/$(basename ${0})-trace$$.log
    set -x
    ask_debug=true
    export ask_debug
fi

ASK=/var/install/bin/ask
AWK=/usr/bin/gawk
CUT=/usr/bin/cut
GETENT=/usr/bin/getent
GREP=/usr/bin/grep
GROUPADD=/usr/sbin/groupadd
MKTEMP=/usr/bin/mktemp
RM=/usr/bin/rm

#----------------------------------------------------------------------------
# usage
#----------------------------------------------------------------------------
usage()
{
cat  <<EOF

 Usage:
 ${0}
                             - empty for interactive mode
               -r, --system  - create system group
               -q, --quiet   - suppress all screen output

 Example: ${0}
 Example: ${0} group
 Example: ${0} group gid
 Example: ${0} -r group

EOF
}

#----------------------------------------------------------------------------
# do exit
#----------------------------------------------------------------------------
do_exit()
{
    if "${interactive:-false}"
    then
        mecho
        anykey
    fi
    exit $1
}

#----------------------------------------------------------------------------
# myecho, do output to tty
#----------------------------------------------------------------------------
myecho()
{
    if ${interactive:-false} || ! "${quiet:-false}"
    then
        mecho ${1} "${2}"
    fi
}

#----------------------------------------------------------------------------
# set default GID range values
#----------------------------------------------------------------------------
set_defaults()
{
    if [ -f /etc/login.defs ]
    then
        # read default value from file
        # system group
        system_gidmin=$(${GREP} "^SYS_GID_MIN" /etc/login.defs | tr -s '[\t ]' ' ' | ${CUT} -d' ' -f2)
        system_gidmax=$(${GREP} "^SYS_GID_MAX" /etc/login.defs | tr -s '[\t ]' ' ' | ${CUT} -d' ' -f2)

        # user group
        user_gidmin=$(${GREP} "^GID_MIN" /etc/login.defs | tr -s '[\t ]' ' ' | ${CUT} -d' ' -f2)
        user_gidmax=$(${GREP} "^GID_MAX" /etc/login.defs | tr -s '[\t ]' ' ' | ${CUT} -d' ' -f2)
    fi

    # system group
    if [ -z "${system_gidmin}" ]
    then
        # legacy fixed default value: 200
        system_gidmin=100
    fi

    if [ -z "${system_gidmax}" ]
    then
        system_gidmax=499
    fi

    # user group
    if [ -z "${user_gidmin}" ]
    then
        user_gidmin=1000
    fi

    if [ -z "${user_gidmax}" ]
    then
        user_gidmax=60000
    fi
}

#----------------------------------------------------------------------------
# add group
#----------------------------------------------------------------------------
add_group()
{
    group="${1}"
    gid=${2}

    if "${interactive}"
    then
        clrhome
        myecho --info "Add group"
        myecho
    fi

    if [ -n "${gid}" ]
    then
        if [ ${gid} -ge ${user_gidmin} -a ${gid} -le ${user_gidmax} ]
        then
            # GID indicates user group
            if "${systemflag:-false}"
            then
                myecho
                myecho --warn "The GID '${gid}' indicates that you want to create a user group."
                myecho --warn "Please make sure that you use 'add-group <group>' in the future!"
            fi
            systemswitch=''
        fi
    fi

    # check if GID is already used
    if [ -n "${gid}" ]
    then
        gidmatch=$(${GETENT} group ${gid})

        if [ ${?} -eq 0 ]
        then
            # GID already used
            myecho --error "Given GID '${gid}' is already used by group '$(echo "${gidmatch}" | ${CUT} -d: -f1)'."
            do_exit 1
        fi

        # check if GID is in reserved range
        if [ ${gid} -ge ${user_gidmin} -a ${gid} -le ${user_gidmax} ] ||
           [ ${gid} -ge ${system_gidmin} -a ${gid} -le ${system_gidmax} ]
        then
            myecho --warn "Given GID '${gid}' is in in a reserved range."
        fi
    fi

    if [ -z "${group}" ]
    then
        _ask_tmpfile=$(${MKTEMP} -t .XXXXXXXXXXXXX)
        ${ASK} "Group (max. 32 characters, e.g. 'www'): " '' '*' > ${_ask_tmpfile}
        rc=${?}
        read group < ${_ask_tmpfile}
        ${RM} -f ${_ask_tmpfile}
        if [ ${rc} = 255 ]
        then
            exit 1
        fi

        if echo "${group}" | ${GREP} -q '^\-r'
        then
            systemswitch='-r'
            group="$(echo "${group}" | ${AWK} '{print $2}')"
        fi
    fi

    if [ -z "${group}" ]
    then
        myecho
        myecho --warn "No group added"
        do_exit 1
    fi

    if [ "${#group}" -gt 32 ]
    then
        myecho
        myecho --warn "Name of group is too long"
        do_exit 1
    fi

    # check if group name is already used
    gidmatch=$(${GETENT} group "${group}")

    if [ ${?} -eq 0 ]
    then
        myecho
        myecho --warn "Group '${group}' already exists with GID ' $(echo "${gidmatch}" | ${CUT} -d: -f3)'."
        do_exit 1
    fi

    group_gid=''
    if [ -n "${gid}" ]
    then
        # add GID to command line
        group_gid="-g ${gid}"
        systemswitch=''
    fi

   ${GROUPADD} ${systemswitch} ${group_gid} "${group}"
}

#----------------------------------------------------------------------------
# main
#----------------------------------------------------------------------------
main()
{
    group=''
    gid=''
    interactive=false
    systemswitch=''
    systemflag=false
    quiet=false
    last_date=20190901
    actual_date=$(/usr/bin/date +%Y%m%d)
    # get optional flags
    while [ 1 ]
    do
        case "${1}" in
        -r|--system)
            systemswitch='-r'
            systemflag=true
            shift
            ;;
        -q|--quiet)
            quiet=true
            shift
            ;;
        -h|--help)
            usage
            exit 0
            ;;
        *)
            break
            ;;
        esac
    done

    # get parameter
    case ${#} in
    0)
        interactive=true
        ;;
    1)
        if [ ${actual_date} -lt ${last_date} ]
        then
            systemswitch='-r'   # set for compatibility reason
        fi
        group="${1}"
        ;;
    2)
        group="${1}"
        gid=${2}
        systemswitch=''
        ;;
    *)
        usage
        exit 1
        ;;
    esac

    set_defaults
    add_group ${group} ${gid}
}

#----------------------------------------------------------------------------
# call function main
#----------------------------------------------------------------------------
main "${@}"

#----------------------------------------------------------------------------
# end
#----------------------------------------------------------------------------