venerdì 19 dicembre 2008

Creare le share personalizzate per ogni utente in Samba (con LDAP)

Invece che utilizzare la classica share homes di Samba, ho installato su un server una condivisione personalizzata chiamata MyDoc, che deve essere esclusiva di ogni utente. Per fare questo occorre che la share punti sempre ad una cartella di proprietà esclusiva dell'utente che ha effettuato il login, cosa abbastanza semplice da realizzare tramite le variabili messe a disposizione da Samba, nel caso specifico %U (utente di login):

[MYDOC_SMB]
comment = Cartella documenti personalizzati per utenti
path = /mnt/samba/mydoc_smb/%U
browsable = yes
available = yes
writable = yes
printable = no
copy = perm_template
valid users = %U

A questo punto occorre però creare le cartelle di ogni singolo utente, che devono avere come nome il relativo login, e assegnare i diritti a tutte le cartelle in modo che siano di proprietà esclusiva dell'utente stesso. Su un sistema con OpenLDAP è possibile eseguire il seguente script per ottenere lo scopo:

#!/bin/bash

SEARCH_CMD=`which ldapsearch`
SEARCH_OPTIONS=" -x uid "

GREP_CMD=`which grep`
GREP_OPTIONS=" uid:"
AWK_CMD=`which awk`
AWK_OPTIONS="'{print \$2;}' "

EVAL_CMD="eval"

MKDIR_CMD=`which mkdir`
MKDIR_OPTIONS=" -p "

MYDOC_ROOT="/mnt/samba/mydoc_smb"

CHOWN_CMD=`which chown`
CHMOD_CMD=`which chmod`
CHMOD_OPTIONS=" 777 "

SUCCESSES=0
FAILURES=0


for utente in `$EVAL_CMD "$SEARCH_CMD $SEARCH_OPTIONS | $GREP_CMD $GREP_OPTIONS | $AWK_CMD $AWK_OPTIONS" `
do

# devo ottenere il gruppo di questo utente
SEARCH_OPTIONS_2=" -x \"(&(objectClass=posixGroup)(memberUid=$utente))\" "
GREP_OPTIONS_2=" cn: "

echo -en "Processo utente <$utente>..."
dstDir=${MYDOC_ROOT}/${utente}
$MKDIR_CMD $MKDIR_OPTIONS $dstDir > /dev/null 2>&1

if [ $? -eq 0 ]
then
echo -en "ok\n"

# devo cambiare il proprietario della directory. Siccome la directory potrebbe
# contenere piu' gruppi, devo ciclare su ognuno e assegno i permessi dell'ultimo gruppo.

for gruppo in `$EVAL_CMD "$SEARCH_CMD $SEARCH_OPTIONS_2 | $GREP_CMD $GREP_OPTIONS_2 | $AWK_CMD $AWK_OPTIONS" `
do
$CHOWN_CMD $utente:$gruppo $dstDir > /dev/null 2>&1
done

$CHMOD_CMD $CHMOD_OPTIONS $dstDir > /dev/null 2>&1

SUCCESSES=$(( SUCCESSES + 1 ))
else
echo -en "KO\n"
FAILURES=$(( FAILURES + 1 ))
fi

done


echo -en "\n\n\nFinito:\n\t $SUCCESSES processati correttamente,\n\t $FAILURES falliti\n"

In sostanza tramite ldapsearch si va a cercare ogni utente nel sistema, dopdoiché si effettua una ricerca per trovare i gruppi a cui questo utente appartiene. Siccome un utente può appartenere a più gruppi, come scelta implementativa si tiene valido l'ultimo gruppo trovato. Viene creata la directory e vengono impostati i permessi e il proprietario della directory stessa.

Nessun commento: