#!/bin/bash
# Definició de variables de configuració LDAP
domini_ldap=”dc=ldap,dc=grup1,dc=local”
admin_ldap=”cn=admin,dc=ldap,dc=grup1,dc=local”
contrasenya_ldap=”ldapgrup1″
# Funció per mostrar l’ús del script
usage() {
echo “Ús: $0 -a [nom_usuari] -b [grups] -c [ou]”
echo “Opcions:”
echo ” -a: Nom de l’usuari”
echo ” -b: Grups als quals pertanyerà l’usuari (separats per comes)”
echo ” -c: Unitat Organitzativa (OU) on es crearà l’usuari”
echo ” -l: Llistar OUs i grups disponibles”
exit 1
}
# Funció per llistar les OUs disponibles al directori LDAP
llistar_ous_jerarquicament() {
echo “Unitats Organitzatives (OUs) disponibles:”
ldapsearch -x -b “$domini_ldap” “(objectClass=organizationalUnit)” ou | grep “ou:” | awk ‘{print $2}’ | while read -r OU; do
OU_PARE=$(ldapsearch -x -b “$domini_ldap” “(ou=$OU)” | grep “dn:” | awk -F’,’ ‘{print $2}’ | awk -F’=’ ‘{print $2}’)
if [[ -n “$OU_PARE” ]]; then
echo ” $OU (dins de $OU_PARE)”
else
echo “$OU”
fi
done
}
# Funció per llistar els grups disponibles al LDAP
llistar_grups() {
echo “Grups disponibles:”
ldapsearch -x -b “$domini_ldap” “(objectClass=posixGroup)” cn | grep “cn:” | awk ‘{print $2}’
}
# Funció per mostrar tant OUs com grups
llistar_ous_i_grups() {
llistar_ous_jerarquicament
echo
llistar_grups
}
# Processament dels arguments
while getopts “:a:b:c:l” opt; do
case ${opt} in
a) nom_usuari=$OPTARG ;;
b) grups=$OPTARG ;;
c) ou=$OPTARG ;;
l) llistar_ous_i_grups; exit 0 ;;
*) usage ;;
esac
done
# Comprova si falten arguments obligatoris
if [[ -z “$nom_usuari” || -z “$grups” || -z “$ou” ]]; then
usage
fi
# Comprova si l’usuari ja existeix al LDAP
if ldapsearch -x -b “ou=$ou,$domini_ldap” “(uid=$nom_usuari)” | grep -q “dn:”; then
echo “Error: L’usuari ‘$nom_usuari’ ja existeix al LDAP.”
exit 1
fi
# Divideix els grups separats per comes en un array
IFS=’,’ read -r -a grups_array <<< “$grups”
# Comprova si cada grup existeix al LDAP
for grup in “${grups_array[@]}”; do
if ! ldapsearch -x -b “$domini_ldap” “(cn=$grup)” | grep -q “dn:”; then
echo “Error: El grup ‘$grup’ no existeix al LDAP.”
exit 1
fi
done
# Comprova si la Unitat Organitzativa (OU) existeix
if ! ldapsearch -x -b “ou=$ou,$domini_ldap” “(objectClass=organizationalUnit)” | grep -q “dn:”; then
echo “Error: La OU ‘$ou’ no existeix al LDAP.”
exit 1
fi
# Crea un fitxer LDIF temporal per afegir l’usuari
fitxer_ldif=$(mktemp)
cat << EOF > $fitxer_ldif
dn: uid=$nom_usuari,ou=$ou,$domini_ldap
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: $nom_usuari
sn: $nom_usuari
uid: $nom_usuari
uidNumber: $(ldapsearch -x -b “ou=$ou,$domini_ldap” “(uidNumber=*)” uidNumber | awk ‘/uidNumber:/ {print $2}’ | sort -n | tail -1 | awk ‘{print $1 + 1}’)
gidNumber: $(ldapsearch -x -b “$domini_ldap” “(cn=${grups_array[0]})” gidNumber | awk ‘/gidNumber:/ {print $2}’)
homeDirectory: /home/$nom_usuari
loginShell: /bin/bash
userPassword: $(slappasswd -s “password” 2>/dev/null || echo “password”)
EOF
# Afegeix l’usuari al directori LDAP
ldapadd -x -D “$admin_ldap” -w “$contrasenya_ldap” -f $fitxer_ldif
# Assigna l’usuari als grups
for grup in “${grups_array[@]}”; do
fitxer_grup_ldif=$(mktemp)
cat << EOF > $fitxer_grup_ldif
dn: cn=$grup,ou=${grup},$domini_ldap
changetype: modify
add: memberUid
memberUid: $nom_usuari
EOF
ldapmodify -x -D “$admin_ldap” -w “$contrasenya_ldap” -f $fitxer_grup_ldif
rm $fitxer_grup_ldif
done
# Esborra el fitxer temporal
rm $fitxer_ldif
echo “Usuari ‘$nom_usuari’ creat amb èxit a la OU ‘$ou’ i afegit als grups: $grups.”