Files
passwd-to-ldap/passwd-to-ldap-create

81 lines
2.4 KiB
Bash
Executable File

#!/bin/bash
# get the script dirname
BINPATH="$(readlink "$0" || echo "$0")"
DIRPATH="$(dirname "$BINPATH")"
if ! [ -r "$DIRPATH/config" ]; then echo "Unable to read config file"; exit 128; fi
source "$DIRPATH/config"
# run as root
if [ "$EUID" -ne 0 ]; then echo "Must be run as root"; exit 64; fi
# Get user details
USERNAME=$1
if [ -z "$USERNAME" ]; then echo "No username supplied"; exit 1; fi
PASSDB="$(getent passwd $USERNAME)"
if [ -z "$PASSDB" ]; then echo "User $USERNAME not found"; exit 2; fi
UIDNUMBER="$(echo $PASSDB | cut -f 3 -d :)"
# enforce uid limits
UIDNUMBER_MIN=900
UIDNUMBER_MAX=10000
if [ "$UIDNUMBER" -lt "$UIDNUMBER_MIN" ]; then echo "Refusing to add user below $UIDNUMBER_MIN"; exit 4; fi
if [ "$UIDNUMBER" -gt "$UIDNUMBER_MAX" ]; then echo "Refusing to add user above $UIDNUMBER_MAX"; exit 4; fi
GIDNUMBER="$(echo $PASSDB | cut -f 4 -d :)"
GECOS="$(echo $PASSDB | cut -f 5 -d : )"
HOMEDIR="$(echo $PASSDB | cut -f 6 -d :)"
LOGINSHELL="$(echo $PASSDB | cut -f 7 -d :)"
# parse gecos for given name
FULLNAME="$(echo "$GECOS" | cut -f 1 -d ,)"
GIVENNAME="$(echo "$FULLNAME" | tr -s ' ' | rev | cut -f 2- -d ' ' | rev)"
SURNAME="$(echo "$FULLNAME" | tr -s ' ' | rev | cut -f -1 -d ' ' | rev)"
if [ -z "$GIVENNAME" ]; then GIVENNAME="$USERNAME"; fi
if [ -z "$SURNAME" ]; then SURNAME=_; fi
# Get encrypted password hash
SHADOWDB="$(getent shadow "$USERNAME")"
if [ -z "$SHADOWDB" ]; then echo "$USERNAME password not found"; exit 8; fi
SECRET="$(echo "$SHADOWDB" | cut -f 2 -d :)"
# Get group info
GROUPDB="$(getent group "$GIDNUMBER")"
if [ -z "$GROUPDB" ]; then echo "$USERNAME gid $GIDNUMBER not found"; exit 16; fi
GROUPNAME="$(echo "$GROUPDB" | cut -f 1 -d :)"
# enforce gid limits
GIDNUMBER_MIN=900
GIDNUMBER_MAX=10000
if [ "$GIDNUMBER" -lt "$GIDNUMBER_MIN" ]; then echo "Refusing to add group below $GIDNUMBER_MIN"; exit 32; fi
if [ "$GIDNUMBER" -gt "$GIDNUMBER_MAX" ]; then echo "Refusing to add group above $GIDNUMBER_MAX"; exit 32; fi
ldapadd -D "$BIND" -w "$PASS" -H "$LDAPURL" <<-LDIF
dn: cn=$USERNAME,$USER_BASEDN
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: shadowAccount
cn: $USERNAME
uid: $USERNAME
givenName: $GIVENNAME
sn: $SURNAME
uidNumber: $UIDNUMBER
gidNumber: $GIDNUMBER
homeDirectory: $HOMEDIR
loginShell: $LOGINSHELL
userPassword: {CRYPT}$SECRET
dn: cn=$USERNAME,$GROUP_BASEDN
objectClass: posixGroup
cn: $USERNAME
gidNumber: $GIDNUMBER
LDIF