next up previous contents index
suivant: Annexes monter: Programmes obtenus précédent: Fichier "mkpasswd.check"   Table des matières   Index


Fichier "mkpasswd"

#!/bin/sh
#
#
#   SERVICE DES ADMINISTRATEURS:
#       Traduction des bases OpenVMS vers Unix.
#
#   Fichier: $BIN_DIR/mkpasswd
#
#   Creation: S. Baudry
#
#   Modifications:
#
#-----------------------------------------------------------

$ECHO "`basename $0`: chargement en cours ...\c"

#-----------------------------------------------------------
#
# Repertoires par defaut
#
#-----------------------------------------------------------
MKPASSD_DIR=${MKPASSD_DIR:=/home/adm/users/convert}
export MKPASSD_DIR

BIN_DIR=${BIN_DIR:=$MKPASSD_DIR/bin}
export BIN_DIR

#-----------------------------------------------------------
#
# Chargement des definitions
#
#-----------------------------------------------------------

if [ ! -f $BIN_DIR/`basename $0`.define ]; then
	message="impossible de trouver le fichier de definition"
    echo "`basename $0`: $message $BIN_DIR/`basename $0`.define" >&2
    echo "`basename $0`: execution avortee" >&2
    exit
fi

. $BIN_DIR/`basename $0`.define

#-----------------------------------------------------------
#
# Chargement des fonctions
#
#-----------------------------------------------------------

if [ ! -f $BIN_DIR/`basename $0`.functions ]; then
	message="impossible de trouver le fichier de definition"
    echo "`basename $0`: $message $BIN_DIR/`basename $0`.functions" >&2
    echo "`basename $0`: execution avortee" >&2
    exit
fi

. $BIN_DIR/`basename $0`.functions

$ECHO " Ok."

#-----------------------------------------------------------
#
# Verification du contexte
#
#-----------------------------------------------------------
$ECHO "`basename $0`: Verifications ..."

if [ ! -x $BIN_DIR/`basename $0`.check ]; then
	message="impossible d'executer le fichier de controle"
    echo "`basename $0`: $message $BIN_DIR/`basename $0`.check" >&2
    echo "`basename $0`: execution avortee" >&2
    exit
fi

$BIN_DIR/`basename $0`.check `basename $0`
[ $? -ne 0 ] && exit

$ECHO "`basename $0`: verifications Ok."

trap "_stop_exec; exit" 1 9 15

#-----------------------------------------------------------
#
# Creation du fichier temporaire PASSWD_REF
#
#-----------------------------------------------------------
$ECHO "`basename $0`: creation de l'espace de travail ...\c"

$AWK '
    BEGIN { FS=":"}
    {
        field = substr ($5, 1, length($5) - 5)
        printf ("%s:%s:%s:%s:%s:%s:%s\n",
            $1, $2, $3, $4, field, $6, $7)
    }
' $PASSWD > $PASSWD_REF

#-----------------------------------------------------------
#
# Creation du fichier temporaire WHO_REF
#
#-----------------------------------------------------------

sed -e 's/ - [0-9][ABC].*$//' $WHO > $WHO_REF

$ECHO " Ok."

#-----------------------------------------------------------
#
# Extraction des anciennes entrees
#
#-----------------------------------------------------------

$ECHO "Extraction des anciennes entrees dans passwd : \c"
index=1

cat $LIST |\
while
    read username
do
    _waiting_chars $index
    name=`grep $username $WHO_REF  | cut -d! -f2 | cut -c2-`
    is_user=`$AWK -v name="$name" '
        BEGIN { FS=":" }
        $5 == name { print $0 }
    ' $PASSWD_REF`
    if [ "$is_user" != "" ]; then
        new_who=`grep $username $WHO`
        login=`echo $is_user | cut -d: -f1`
        new_who=`echo $new_who | cut -d! -f2 | cut -c2-`
        project="p`grep $username $LCLUAF | cut -d: -f1 | tr '[A-Z]' '[a-z]'`"
        uid=`echo $is_user | cut -d: -f3`
        gid=`echo $is_user | cut -d: -f4`
        part2=`echo $is_user | cut -d: -f6-`
        new_passwd=`echo $login | cut -c-4``date +%M%S`
        crypt_passwd="`$BUILDPASSWD $new_passwd`"
        echo "${login}:${crypt_passwd}:${uid}:${gid}:${new_who}:$part2" \
            >> $PASSWD_NEW
        echo "${login}  ${FS_SERVER}:${FS_STUDENTS}/${login}" >> $AUTO_USERS
        output="${login}:${crypt_passwd}:0:${PASSWD_WILL_CHANGE}"
        echo "${output}:${PASSWD_EXPIRATION_TIME}:${PASSWD_WILL_EXPIRE}::" \
            >> $SHADOW_NEW
        echo "${login}:${username}:${new_passwd}:${uid}:${project}" \
            >> $USERS_INFO_FILE
    fi
    index=`expr $index + 1`
done
echo " Ok."

#-----------------------------------------------------------
#
# Creation des nouvelles entrees dans passwd
#
#-----------------------------------------------------------

$ECHO "Creation des nouvelles entrees dans passwd : \c"
index=1

cat $LIST |\
while
    read username
do
    _waiting_chars $index

    is_defined=`$AWK -v username="$username" -F: '
        $2 == username { print $0 }
        ' $USERS_INFO_FILE `
    [ "$is_defined" != "" ] && continue

    login=`echo $username | tr '[A-Z]' '[a-z]'  | cut -d_ -f1`
    new_who=`grep $username $WHO | cut -d! -f2 | cut -c2-`

    login=`echo $login | cut -c-8`

    status=0
    while
        is_allocated=`grep "^${login}:" $PASSWD_NEW`
        [ "$is_allocated" != "" ]
    do
        echo "" >&2
        echo "`basename $0`: login $login deja alloue pour $username" >&2
        $ECHO "`basename $0`: Quel login : \c" >&2
        read login < /dev/tty
        status=1
    done
    [ $status -eq 1 ] && $ECHO "Creation des nouvelles entrees dans passwd : \c"

    project="p`grep $username $LCLUAF | cut -d: -f1 | tr '[A-Z]' '[a-z]'`"

    new_passwd=`echo $login | cut -c-4``date +%M%S`
    crypt_passwd="`$BUILDPASSWD $new_passwd`"
    uid=`$SEARCHID -u`
    gid=$STUDENT_GID
    student_home=${HOME_STUDENT}/$login

    output="${login}:${crypt_passwd}:${uid}:${gid}"
    echo "${output}:${new_who}:${student_home}:${LOGIN_SHELL}" >> $PASSWD_NEW
    echo "${login}  ${FS_SERVER}:${FS_STUDENTS}/${login}" >> $AUTO_USERS
    output="${login}:${crypt_passwd}:0:${PASSWD_WILL_CHANGE}"
    echo "${output}:${PASSWD_EXPIRATION_TIME}:${PASSWD_WILL_EXPIRE}::" \
        >> $SHADOW_NEW
    echo "${login}:${username}:${new_passwd}:${uid}:${project}" >> $USERS_INFO_FILE

    index=`expr $index + 1`
done
echo " Ok."


#-----------------------------------------------------------
#
# Suppression des anciens repertoires
#
#-----------------------------------------------------------
$ECHO "Suppression des anciens repertoires: \c"
index=1

cat $PASSWD_REF |\
while
    read line
do
    old_login=`echo $line | cut -d: -f1`
    is_present=`$AWK -F: -v old_login="$old_login" '
        $1 == old_login { print $1 }
        ' $USERS_INFO_FILE`
    if [ "$is_present" = "" ]; then
        [ -d $FS_STUDENTS/$old_login ] && \
            rm -rf $FS_STUDENTS/$old_login 2>&/dev/null
    fi
    index=`expr $index + 1`
done

echo " Ok."

#-----------------------------------------------------------
#
# Creation des nouvelles entrees dans group
#
#-----------------------------------------------------------

$ECHO "Creation des nouvelles entrees dans group : \c"
index=1

cat $LCLUAF |\
while
    read line
do
    _waiting_chars $index

    vms_project="`echo $line | cut -d: -f1 | tr '[A-Z]' '[a-z]'`"
    unix_project="p${vms_project}"
    project_gid=`$SEARCHID -g`
    $ECHO "${unix_project}:*:${project_gid}:\c" >> $GROUP_NEW
    members="`echo $line | cut -d: -f2 | sed -e 's/,/ /g'`"
    group_members=`for this_member in $members
    do
        awk -F: -v  this_member=$this_member '
            $2 == this_member { printf ("%s,",$1) }
            ' $USERS_INFO_FILE
    done`
    echo "$group_members" | sed -e 's/,$//' >> $GROUP_NEW
    echo "${unix_project}   ${FS_SERVER}:${FS_PROJECTS}/${unix_project}" \
        >> $AUTO_PROJECTS

    index=`expr $index + 1`

done

echo " Ok."

#-----------------------------------------------------------
#
# Creation des repertoires
#
#-----------------------------------------------------------

$ECHO "Creation des repertoires : \c"
index=1

cat $AUTO_USERS | cut -d: -f2 |\
while
    read directory
do
    _waiting_chars $index

    owner=`basename $directory`
    uid=`awk -F: -v owner=$owner '
        $1 == owner { print $3 }
        ' $PASSWD_NEW`
    if [ ! -d $directory ]; then
        mkdir -p $directory
        cp $HOME_PROTOTYPE/.[a-z]* $HOME_PROTOTYPE/.[A-Z]*      \
            $HOME_PROTOTYPE/* $FS_STUDENTS/$newname 2>/dev/null
        chown -R ${uid}.${STUDENT_GID} $directory
    fi
    index=`expr $index + 1`
done

cat $AUTO_PROJECTS | cut -d: -f2 |\
while
    read directory
do
    _waiting_chars $index

    group=`basename $directory`
    gid=`awk -F: -v group=$group '
        $1 == group { print $3 }
        ' $GROUP_NEW`
    if [ ! -d $directory ]; then
        mkdir -p $directory
        chown -R root.${gid} $directory
    fi
    index=`expr $index + 1`
done

echo " Ok."

#-----------------------------------------------------------
#
# Fin du programme
#
#-----------------------------------------------------------

trap '' 1 9 15
[ -f $PASSWD_REF ] && rm $PASSWD_REF
[ -f $WHO_REF ] && rm $WHO_REF



baudry@esme.fr