|
DataMuseum.dkPresents historical artifacts from the history of: Regnecentalen RC-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Regnecentalen RC-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T u
Length: 9011 (0x2333) Types: TextFile Names: »usr/admin/menu/usermgmt/adduser «
└─⟦3d8f416b2⟧ Bits:30004042/core2.imd SW95705I 386/ix Multi-user Release 1.2 └─⟦this⟧ »usr/admin/menu/usermgmt/adduser «
#ident "@(#)adduser 1.3 -87/01/29" #menu# add a user to the system #help# #help# Adduser installs a new login ID on the machine. You are asked #help# a series of questions about the user and then the new entry is #help# made. You can enter more than one user at a time. Once this #help# procedure is finished, the new login ID is available. # Implementation note: # Tack an X onto expr expressions because it will treat a slash (/) # as a division operation, colon (:) as a separator, etc. defgroup=1 # Default group, "other" defparent=/usr # Default parent of login directory loginlen=8 # Maximum login ID length minid=100 # Minimum user and group ID maxid=50000 # Maximum user and group ID (not the absolute max, but safe) if [ -r ${MENUTOP:?}/defadduser ] then # This file allows easy modification of the defaults. . ${MENUTOP}/defadduser fi trap 'exit 0' 1 2 15 flags="-qq -k$$" defunamef= defuname= deflidf= deflid= defuid= defgidf= defgid= echo '\nAnytime you want to quit, type "q". If you are not sure how to answer any prompt, type "?" for help, or see the Owner/Operator Manual. \nIf a default appears in the question, press <RETURN> for the default. ' while true do username=`checkre ${flags} -H' This is the name of the person who owns the login.' \ -fe"${defunamef}" "Enter user's full name${defuname} [?, q]: " \ '^[ -z]*$' 'Answer contains an illegal character. Only numbers, spaces, punctuation marks, and letters are permitted.' \ '[a-zA-Z]' 'You must enter a value.' \ '^[^:]*$' "The user's name cannot contain a colon (:). Try again."` while true do loginid=`checkre ${flags} -H' This is the "name" that the computer uses to identify the user. It also is used to identify data that belongs to the user. The login ID may be any combination of numbers and letters not already used by someone else. Typically, people choose their initials, first or last name, or nickname. See the GETTING STARTED chapter of the Owner/Operator Manual for more information.' \ -fe"${deflidf}" "Enter user's login ID${deflid} [?, q]: " \ '.' "You must enter a value, not more than ${loginlen} characters long." \ '^[a-z0-9]*$' 'Answer contains an illegal character. Only numbers and lower case letters are permitted.' \ "^.\{1,${loginlen}\}$" "Answer is too long. No more than ${loginlen} characters are permitted."` if grep "^${loginid}:" /etc/passwd >/dev/null then echo "\\tLogin ID '${loginid}' already exists. Choose another." continue fi break done if [ -z "${defuid}" ] then # Sort 3rd field in /etc/passwd then cut 3rd field # from last line. Increment this field by 1 to # come up with a unique new user ID number. defuid=`sort -t: +2n /etc/passwd | tail -1 | cut -d: -f3` defuid=`expr ${defuid} + 1` # don't allow user ID numbers less than minid if [ ${defuid} -lt ${minid} ] then defuid=${minid} fi fi while true do userid=`checkre ${flags} -fe -D ${defuid} -H" This number is used inside the computer to associate data files with your login ID. It can be any unique number at least ${minid} and no more than ${maxid}. The computer will use ${defuid} if you just press <RETURN>." \ "Enter user ID number (default ${defuid}) [?, q]: " \ '^[0-9]\{1,\}$' 'Answer must be only digits or <RETURN>.'` if [ ${userid} -eq ${defuid} ] then break fi if [ "${userid}" -le ${maxid} -a "${userid}" -ge ${minid} ] then # Look for logins that already use specified # user ID number. Consider IDs with leading zeros. x=`sed -n "/^[^:]*:[^:]*:0*${userid}:/ s/\([^:]*\):.*/\1/p" /etc/passwd` if [ -n "${x}" ] then echo \\t\'${x}\' "already uses that ID number. Normally that is not desirable." if checkyn ${flags} -f " Do you want to pick another?" then continue fi fi break # Got it! fi echo "\\tUser ID must be all digits, at least ${minid} and not larger than ${maxid}. q for quit" done while true do groupid=`checkre ${flags} -D "${defgidf:-${defgroup}}" -H" This is the number or name used by the computer to identify users belonging to the same group that share common files and directories. If you enter a number instead of a name, it must be at least ${minid} and no more than ${maxid}. The computer will pick an appropriate value if you just press <RETURN>. See the GETTING STARTED chapter of the Owner/Operator Manual for more information on how to assign group numbers." \ -fe "Enter group ID number or group name ${defgid:-(default $defgroup)} [?, q]: " \ '^[0-9a-z]*$' 'Answer contains an illegal character.'` x=`grep "^${groupid}:" /etc/group | cut -d: -f3` if [ -n "${x}" ] then if [ "${x}" -lt ${minid} -a "${x}" -ne 1 ] then echo "\\t${groupid} has group ID ${x} which is less than ${minid}. q for quit" continue else groupname="${groupid}" groupid=${x} break fi fi if num "${groupid}" then if [ "${groupid}" -le ${maxid} -a \ \( "${groupid}" -ge ${minid} -o "${groupid}" -eq 1 \) ] then groupname=`cut -d: -f1,3 /etc/group | grep ":${groupid}$" | cut -d: -f1` break fi echo "\\tGroup ID must be all digits. Permitted values are 1, or at least ${minid} and not larger than ${maxid}. q for quit" else echo "\\t${groupid} is not a known group name. Known groups (group ID):" \ "\\n`cut -d: -f1,3 /etc/group | sort | sed 's/:\(.*\)/ (\1)/' | pr -o4 -t -3`" \ '\nq for quit' fi done deflogindir=${defparent}/${loginid} while true do logdir=`checkre ${flags} -D "${deflogindir}" -H' This is the directory where your files are kept.' \ -fe "Enter user's login (home) directory name. (default '${deflogindir}') [?, q]: " \ '^/' 'Login directory name must begin with a "/".' \ '^/[^/]\{1,\}/' 'Login directory must not be in the "/" directory.' \ '^/[^/]\{1,14\}/' 'No more than 14 characters in each part of the directory name.' \ '/[^/]\{1,14\}$' '' \ '^[-./a-zA-Z0-9]*$' "Login directory name contains an illegal character. Only letters, numbers, '.', '-', and '/' are permitted."` if [ -f "${logdir}" ] then echo "\\t${logdir} is already a file name. Choose another." continue fi if [ -d "${logdir}" ] then echo "\\t${logdir} directory already exists. Choose another." continue fi # Grab characters beginning with the first slash (/) up to # but not including the second slash -- assume this is a # file system. fs=`expr "X${logdir}" : 'X\(/[^/]*\)'` # If we are running this program, /usr is already mounted if [ "$fs" -ne "/usr" ] then x=`/etc/mount | grep "^${fs} "` case "${x}" in *'read only'* ) echo "\\tFile system ${fs} is not writable. Choose another. Possible file systems -- " `/etc/mount | cut -d' ' -f1 | egrep -v '^/$|^/tmp$'` continue ;; '/ '* | '/tmp '* ) echo "\\tCannot put login directories into / or /tmp. Choose another." continue ;; # '' ) # echo "\\t${fs} is not a file system. Choose another. # Possible file systems -- # " `/etc/mount | cut -d' ' -f1 | egrep -v '^/$|^/tmp$'` # continue # ;; esac fi if [ ! -d `dirname "${logdir}"` ] then echo "\\tThe parent directory for ${logdir} does not exist. Choose another." continue fi break done if [ -n "${groupname}" ] then groupname="(${groupname})" fi echo "\\nThis is the information for the new login: User's name: ${username} login ID: ${loginid} user ID: ${userid} group ID: ${groupid} ${groupname} home directory: ${logdir}" case `checklist ${flags} -fep 'Do you want to install, edit, or skip this entry [i, e, s, q]?' install edit skip` in install ) export loginid userid groupid username logdir /bin/sh -c ' trap "" 1 2 3 15 set -e echo "${loginid}::${userid}:${groupid}:${username}:${logdir}:" >>/etc/passwd umask 002 mkdir ${logdir} chgrp ${groupid} ${logdir} chown ${userid} ${logdir} if [ -r /etc/stdprofile ] then /bin/su ${loginid} -c " cd ${logdir} cp /etc/stdprofile .profile chmod 644 .profile" else echo "\\tNo /etc/stdprofile, no .profile created in user'\''s home directory." fi echo Login installed. if checkyn -f "Do you want to give the user a password?" then /bin/su ${loginid} -c " exec /bin/passwd ${loginid}" || exit 0 fi exit 0 ' || { admerr $0 'Failure in attempting to create new user.' exit 1 } ;; edit ) defunamef="D${username}" defuname=" (default \"${username}\")" deflidf="D${loginid}" deflid=" (default \"${loginid}\")" defuid="${userid}" defgidf="${groupid}" defgid=" (default ${groupid} ${groupname})" continue ;; skip ) ;; esac defunamef= defuname= deflidf= deflid= defuid= defgidf= defgid= if checkyn ${flags} -f 'Do you want to add another login?' then continue fi break done