#!/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 #----------------------------------------------------------------------------