summaryrefslogtreecommitdiffstats
path: root/lduseradd
diff options
context:
space:
mode:
Diffstat (limited to 'lduseradd')
-rwxr-xr-xlduseradd727
1 files changed, 727 insertions, 0 deletions
diff --git a/lduseradd b/lduseradd
new file mode 100755
index 0000000..c86c5bb
--- /dev/null
+++ b/lduseradd
@@ -0,0 +1,727 @@
+#!/bin/bash
+#
+# 2008-11-19 [alex] Anpassung an neuen Server
+# 2005-05-25 [yrm] Anpassung an neue public_html Struktur
+# 2003-10-24 [stb] Nach meinen Tests laeuft das wunderbar.
+# 2003-10-21 [stb] Erste Version.
+#
+# Kleine Teile (Numerische UID finden und so) kommen aus einem
+# Skript des IN Berlin.
+#
+
+PATH=/bin:/usr/bin:/usr/local/bin
+
+# Hilfe gewuenscht? Bitteschoen!
+if [[ "$1" = "--help" ]] || [[ "$1" = "-h" ]]
+then
+ echo "Benutzung: $(basename $0) [OPTION] [login]"
+ echo
+ echo "<login> ist beim Neuanlegen das gewuenschte Login und"
+ echo " beim Erstellen eines Antrages das bereits vorhandene."
+ echo
+ echo "Optionen:"
+ echo " --debug Debugging Informationen ausgeben."
+ echo " --antrag Antrag fuer einen vorhandenen Account erstellen."
+ echo " --nofbtest Den angegebenen Fachbereichsaccount nicht"
+ echo " ueberpruefen."
+ echo " --help Diese Kurzhilfe ausgeben."
+ exit 0
+fi
+
+# Verwendete Umgebungsvariablen sicherheitshalber loeschen
+unset ACCOUNT
+unset ACCOUNTTESTED
+unset ANTRAG
+unset BROWSER
+unset DEBUG
+unset INFACCOUNT
+unset INFACCOUNTTEST
+unset NEWSHELL
+unset NEWSHELLNUMWRONG
+unset NNAME
+unset ORT
+unset PLZ
+unset SPLINE
+unset STREET
+unset TEL
+unset VNAME
+
+LOG=/usr/local/bin/accountantrag/lduseradd.log
+TEMPLATE=/usr/local/bin/accountantrag/account.tex.template
+PENGUIN=/usr/local/bin/accountantrag/penguin.eps
+
+# Kommandozeilenoptionen abfragen
+while [[ "$1" = "--"* ]]
+do
+ case $1 in
+ "--debug") DEBUG="1";;
+ "--antrag") ANTRAG="1";;
+ "--nofbtest") INFACCOUNTTEST="NOTEST";;
+ *) echo "Unbekannte Option: $1"; exit 1;;
+ esac
+ shift
+done
+
+# Textbrowser suchen
+[[ -x /usr/bin/lynx ]] && BROWSER=/usr/bin/lynx
+[[ -x /usr/bin/links ]] && BROWSER=/usr/bin/links
+[[ -x /usr/bin/w3m ]] && BROWSER=/usr/bin/w3m
+[[ -x /usr/bin/wget ]] && BROWSER=/usr/bin/wget
+
+# Keiner gefunden? Mist.
+if [[ "$BROWSER" = "" ]]
+then
+ echo Kein Browser verfuegbar. Installiere bitte entweder
+ echo /usr/bin/lynx,
+ echo /usr/bin/links oder
+ echo /usr/bin/w3m.
+ echo /usr/bin/wget.
+ exit 1
+fi
+
+# Wenn das Skript nicht debuggen soll, wird FD 2 auf /dev/null
+# umgeleitet.
+[[ "$DEBUG" != "" ]] || exec 2>/dev/null
+
+# Als Beispiel: Das >&2 sagt, dass alles, was auf FD 1 (stdout)
+# ausgegeben wird -- bei echo eben der Text -- auf FD 2 umgeleitet
+# werden soll. Da das dann im Nicht-Debug-Modus wiederum auf
+# /dev/null umgeleitet wird, ist das dann nicht zu sehen.
+echo "Browser: $BROWSER" >&2
+
+# Wenn ein Account angegeben war, dann wird der jetzt in
+# Kleinbuchstaben umgewandelt.
+ACCOUNT=$(echo $1 | tr [A-Z] [a-z])
+
+# Die Variable fuer die grosse while-Schleife.
+OK="0"
+
+echo
+echo "Wenn bei der Eingabe ein Wert in eckigen Klammern steht,"
+echo "kann dieser mit RETURN uebernommen werden."
+echo
+
+# In dieser while-Schleife werden alle Daten abgefragt.
+while [[ "$OK" = "0" ]]
+do
+ # Das gewuenschte Login ...
+ if [[ "$ACCOUNT" = "" ]]
+ then
+ if [[ "$ANTRAG" = "" ]]
+ then
+ echo -n "Gewuenschtes "
+ fi
+
+ echo -n "Login: "
+ read ACCOUNT
+
+ # Umwandeln in Kleinbuchstaben.
+ ACCOUNT=$(echo $ACCOUNT | tr [A-Z] [a-z])
+
+ # Ein neues Login wurde angegeben, das demnach noch nicht
+ # ueberprueft ist.
+ unset ACCOUNTTESTED
+
+ # Durch die continues am Ende der if-Abfragen (die kommen
+ # haeufig vor) spare ich mir innere while-Schleifen.
+ continue
+ fi
+
+ # Es soll nur der Antrag erzeugt werden.
+ if [[ "$ANTRAG" = "1" ]] && [[ "$ACCOUNTTESTED" = "" ]]
+ then
+ # Gibt es dieses Login ueberhaupt?
+ if ( ! ldapsearch -b "dc=spline,dc=inf,dc=fu-berlin,dc=de" \
+ -x uid="$ACCOUNT" \
+ | grep -E "^uid|^gecos" >&2 )
+ then
+ # Noe.
+ echo "Es gibt keineN BenutzerIn mit dem Login $ACCOUNT."
+ unset ACCOUNT
+ continue
+ else
+ # Ja! Dann kann ja mal der Name aus der LDAP-Datenbasis geholt
+ # werden ...
+ FULLNAME=$(ldapsearch -LLL -x \
+ -b "dc=spline,dc=inf,dc=fu-berlin,dc=de" \
+ "(uid=$ACCOUNT)" cn | grep "^cn" | cut -d" " -f2-)
+ # ... und versucht werden, Nachnamen und Vornamen rauszufischen.
+ # Der Nachname ist alles nach dem letzten Leerzeichen ...
+ NNAMEHINT=$(echo $FULLNAME | sed 's/^.* \([^ ]\+\)$/\1/')
+ # ... und der Vorname alles davor.
+ VNAMEHINT=$(echo $FULLNAME | sed 's/^\(.*\) [^ ]\+$/\1/')
+ fi
+
+ # Ja, es gibt den Account.
+ ACCOUNTTESTED="DONE"
+ fi
+
+ # Der Account soll neu erstellt werden.
+ if [[ "$ACCOUNTTESTED" = "" ]] && [[ "$ANTRAG" = "" ]]
+ then
+ # Ungueltige Zeichen?
+ if ( echo $ACCOUNT | grep -E '(^[[:digit:]]|[^[:alpha:][:digit:]])' >&2 )
+ then
+ echo
+ echo "\"$ACCOUNT\" enthaelt unzulaessige Zeichen oder beginnt"
+ echo "mit einer Ziffer."
+ unset ACCOUNT
+ continue
+ fi
+
+ # zu lang?
+ if [[ "$ACCOUNT" = ?????????* ]]
+ then
+ echo "\"$ACCOUNT\" enthaelt zu viele Zeichen."
+ unset ACCOUNT
+ continue
+ fi
+
+ # Gibt es das Login schon?
+ if ( ldapsearch -b "dc=spline,dc=inf,dc=fu-berlin,dc=de" \
+ -x uid="$ACCOUNT" \
+ | grep -E "^uid|^gecos" >&2 )
+ then
+ echo
+ echo "$ACCOUNT ist bereits vergeben."
+ unset ACCOUNT
+ continue
+ fi
+
+ # hat schon irgendein Rechner den gleichen Namen/ das gleiche
+ # Alias wie das gewuenschte Login?
+ if [[ "$(checkDomain $ACCOUNT)" == "" ]]
+ then
+ echo
+ echo "Das Login $ACCOUNT ist zwar nicht vergeben, aber die"
+ echo "Domain $ACCOUNT.spline[.inf.fu-berlin].de kann nicht auf"
+ echo "/var/users/$ACCOUNT/public_html zeigen, da die Domain bereits"
+ echo "existiert. Um dies zu vermeiden, ist es sinnvoll, ein"
+ echo "anderes Login zu waehlen."
+ echo "Du kannst aber erstmal die anderen Daten eingeben; am"
+ echo "Schluss kommt ein Menue, in dem du das Login aendern kannst."
+ echo
+ fi
+
+ # Wenn das Skript hier angelangt ist, ist alles OK.
+ ACCOUNTTESTED="DONE"
+ fi
+
+ # Nachnamen abfragen.
+ if [[ "$NNAME" = "" ]]
+ then
+
+ echo -n "Nachname"
+
+ # Wenn ein Antrag fuer ein vorhandenes Login erstellt werden soll,
+ # wurde weiter oben versucht, den Nachnamen rauszufinden. Das ist
+ # dann hier verfuegbar und wird uebernommen, wenn einfach RETURN
+ # gedrueckt wird.
+ if [[ "$NNAMEHINT" != "" ]]
+ then
+ echo -n " [$NNAMEHINT]"
+ fi
+
+ echo -n ": "
+ read NNAME
+
+ NNAME=${NNAME:-$NNAMEHINT}
+
+ # Ungueltige Zeichen?
+ if ( echo $NNAME | grep -E '([^A-Za-z])' >&2 )
+ then
+ echo
+ echo "\"$NNAME\" enthaelt unzulaessige Zeichen (Umlaute?)."
+ unset NNAME
+ continue
+ fi
+
+ continue
+ fi
+
+ # Vornamen abfragen.
+ if [[ "$VNAME" = "" ]]
+ then
+ echo -n "Vorname"
+
+ # Das gleiche mit dem Vornamen.
+ if [[ "$VNAMEHINT" != "" ]]
+ then
+ echo -n " [$VNAMEHINT]"
+ fi
+
+ echo -n ": "
+ read VNAME
+
+ VNAME=${VNAME:-$VNAMEHINT}
+
+ # Ungueltige Zeichen?
+ if ( echo $VNAME | grep -E '([^A-Za-z])' >&2 )
+ then
+ echo
+ echo "\"$VNAME\" enthaelt unzulaessige Zeichen (Umlaute?)."
+ unset VNAME
+ continue
+ fi
+
+ continue
+ fi
+
+ # Die Strasse abfragen.
+ if [[ "$STREET" = "" ]]
+ then
+ echo -n "Strasse und Hausnummer: "
+ read STREET
+
+ # Ungueltige Zeichen?
+ if ( echo $STREET | grep -E '([^A-Za-z 0-9\.])' >&2 )
+ then
+ echo
+ echo "\"$STREET\" enthaelt unzulaessige Zeichen (Umlaute?)."
+ unset STREET
+ continue
+ fi
+
+ continue
+ fi
+
+ # Postleitzahl ...
+ if [[ "$PLZ" = "" ]]
+ then
+ echo -n "PLZ: "
+ read PLZ
+
+ # Wenn die PLZ etwas anderes als Ziffern enthaelt ...
+ if ( echo $PLZ | grep -E '[^[:digit:]]' >&2 )
+ then
+ echo
+ echo "Eine PLZ mit etwas anderem als Ziffern?"
+ unset PLZ
+ continue
+ fi
+
+ continue
+ fi
+
+ # Ort, default "Berlin"
+ if [[ "$ORT" = "" ]]
+ then
+ echo -n "Ort [Berlin]: "
+ read ORT
+ ORT=${ORT:-Berlin}
+ fi
+
+ # Telephonnummer
+ if [[ "$TEL" = "" ]]
+ then
+ echo -n "Telephonnummer: "
+ read TEL
+
+ # Aehnlich wie bei der PLZ, nur dass hier jetzt erstens auch andere
+ # Zeichen oder auch "keine" eingegeben werden darf.
+ # in der regex muss das "-" an's Ende!!
+ if [[ "$TEL" != "keine" ]] \
+ && ( echo $TEL | grep -E '[^ \+()[:digit:]\/\-]' >&2 )
+ then
+ echo
+ echo "Eine Telephonnummer mit etwas anderem als Ziffern"
+ echo "oder den Zeichen \"/\", \"-\", \"+\", \"(\", \")\", Leerzeichen?"
+ echo "Wenn es keine gibt, gib \"keine\" ein."
+ unset TEL
+ continue
+ fi
+
+ continue
+ fi
+
+ # Der Account am Fachbereich soll auch auf dem Antrag stehen.
+ if [[ "$INFACCOUNT" = "" ]]
+ then
+ echo -n "Accountname am Fachbereich: "
+ read INFACCOUNT
+ if [[ "$INFACCOUNTTEST" != "NOTEST" ]]
+ then
+ unset INFACCOUNTTEST
+ fi
+ continue
+ fi
+
+ # Wenn nicht --nofbtest als Kommandozeilenparameter angegeben war
+ # oder der Test uebergangen werden soll, dann wird hier jetzt
+ # geprueft, ob der angegebene Account existiert.
+ # TODO: Wie kann auch noch der Realname zum Account rausgefunden
+ # werden? In der passwd auf page.mi.fu-berlin.de steht der
+ # leider nicht drin.
+ if [[ "$INFACCOUNTTEST" != "YES" ]] \
+ && [[ "$INFACCOUNTTEST" != "NOTEST" ]]
+ then
+ # In meinem cgi-bin in der Inf gibt es ein CGI, das YES oder NO
+ # ausgibt, je nachdem, ob der uebergebene Account in der
+ # /etc/passwd auf page.mi.fu-berlin.de steht.
+
+ # fb test umgestellt auf eine ssh version --alex 4.11.08
+ #COMMAND="$BROWSER -dump \
+ # \"http://page.mi.fu-berlin.de/~berndts/cgi-bin/acc.sh?$INFACCOUNT\" \
+ # | grep -E \"YES|NO\" | awk '{print \$1}'"
+ #echo "Browser wird aufgerufen durch: $COMMAND" >&2
+ #INFACCOUNTTEST=$(eval $COMMAND)
+ INFACCOUNTTEST=$(echo "$INFACCOUNT" | ssh fbgetUser "~/.checkUser")
+
+ # Kein continue, damit gleich die Ueberpruefung des Ergebnisses
+ # vorgenommen wird.
+ fi
+
+ if [[ "$INFACCOUNTTEST" != "0" ]] \
+ && [[ "$INFACCOUNTTEST" != "NOTEST" ]]
+ then
+ echo
+ echo "Es existiert kein FB-Account $INFACCOUNT."
+ echo "(Oder irgendwas am Script ist kaputt.)"
+ echo "Wenn du trotzdem den FB-Account $INFACCOUNT eintragen moechtest,"
+ echo -n "gib jetzt JA ein (ausgeschrieben und gross): "
+ read INFACCOUNTTEST
+ if [[ "$INFACCOUNTTEST" = "JA" ]]
+ then
+ INFACCOUNTTEST="NOTEST"
+ else
+ unset INFACCOUNT
+ unset INFACCOUNTTEST
+ continue
+ fi
+ fi
+
+ # Wenn ein neuer Account erstellt wird, braucht der auch eine
+ # Shell.
+ # Ausnahmsweise eine innere while-Schleife.
+ while [[ "$NEWSHELL" = "" ]] && [[ "$ANTRAG" = "" ]]
+ do
+ # Stolz bin ich auf folgendes :)
+ # Alle nichtleeren Zeilen aus /etc/shells greppen und jeder
+ # durch das cat -n eine Nummer geben.
+ echo
+ AVAILABLESHELLSCOMMAND='grep -v "^$\|^#" /etc/shells'
+ echo AVAILABLESHELLSCOMMAND: $AVAILABLESHELLSCOMMAND >&2
+ eval $AVAILABLESHELLSCOMMAND | cat -n
+ echo
+
+ # Die bash soll durch druecken von RETURN ausgewaehlt werden
+ # koennen. Damit da dann trotzdem eine Zahl steht, muss die
+ # erstmal rausgefunden werden.
+ DEFAULTSHELL=$(eval $AVAILABLESHELLSCOMMAND \
+ | cat -n \
+ | grep -E "[[:blank:]]/bin/bash[[:blank:]]*$" \
+ | awk '{print $1}')
+
+ # Wenn im vorherigen Durchgang eine ungueltige Zahl eingegeben
+ # wurde, gibt es eine Fehlermeldung.
+ if [[ "$NEWSHELLNUMWRONG" != "" ]]
+ then
+ echo "$NEWSHELLNUMWRONG ist keine gueltige Wahl."
+ unset NEWSHELLNUMWRONG
+ fi
+
+ echo -n "Gewuenschte Shell [$DEFAULTSHELL]: "
+ read NEWSHELLNUM
+
+ NEWSHELLNUM=${NEWSHELLNUM:-$DEFAULTSHELL}
+ NEWSHELLNUMWRONG="$NEWSHELLNUM"
+
+ # Die richtige Zeile aus /etc/shells holen ...
+ NEWSHELL=$(eval $AVAILABLESHELLSCOMMAND \
+ | sed -n "s/[[:blank:]]//g;${NEWSHELLNUM}p")
+ done
+
+ # Wird jetzt nicht mehr gebraucht bzw. liefert Falschmeldungen.
+ unset NEWSHELLNUMWRONG
+
+ # Wird fuer den Test des FB-Accounts benutzt.
+ unset GEPRUEFT
+
+ # Wenn nicht getestet, dann steht das auch in der Zusammenfassung.
+ if [[ "$INFACCOUNTTEST" = "NOTEST"* ]]
+ then
+ GEPRUEFT=" nicht unbedingt"
+ fi
+
+ # Zusammenfassung ...
+ echo
+ echo "1 Login: $ACCOUNT"
+ echo "2 Name: $NNAME"
+ echo "3 Vorname: $VNAME"
+ echo "4 Strasse und Hausnummer: $STREET"
+ echo "5 PLZ: $PLZ"
+ echo "6 Ort: $ORT "
+ echo "7 Telephonnummer: $TEL"
+ echo "8 FB-Account: $INFACCOUNT (existiert${GEPRUEFT})"
+ [[ "x$ANTRAG" = "x" ]] && echo "9 Shell: $NEWSHELL"
+ echo
+ echo "x Abbrechen"
+ echo "0 Fertig"
+ echo
+ echo "Wenn du etwas aendern willst, gib die entsprechende Zahl ein,"
+ echo -n "ansonsten die 0 fuer \"Fertig\" oder x zum Abbrechen: "
+
+ read AENDERN
+
+ case $AENDERN in
+ "0") OK="1";;
+ "1") unset ACCOUNT;;
+ "2") unset NNAME;;
+ "3") unset VNAME;;
+ "4") unset STREET;;
+ "5") unset PLZ;;
+ "6") unset ORT;;
+ "7") unset TEL;;
+ "8") unset INFACCOUNT;;
+ "9") [[ "x$ANTRAG" = "x" ]] && unset NEWSHELL;;
+ "x") exit 0;;
+ "X") exit 0;;
+ esac
+done
+
+# Abfragen, wer die Daten eingegeben hat.
+while [[ "$SPLINE" = "" ]]
+do
+ echo
+ echo "Ach ja: du, die/ der gerade den Account"
+ echo -n "anlegt, bist wer? (login): "
+ read SPLINE
+
+ # Ueberpruefen, ob es den Account gibt.
+ if ( ! ldapsearch -b "dc=spline,dc=inf,dc=fu-berlin,dc=de" \
+ -x uid="$SPLINE"|grep -E "^uid:" >&2 )
+ then
+ echo
+ echo "Glaub' ich dir nicht."
+ unset SPLINE
+ fi
+done
+
+# Antrag erstellen
+DATUM=$(date -I)
+NEWNAME="account-$DATUM-$ACCOUNT.ps"
+TMPDIR=/tmp/account-$(date -Is)
+mkdir $TMPDIR
+
+# Jedenfalls dann, wenn das temporaere Verzeichnis zur Verfuegung steht.
+if [[ -d $TMPDIR ]]
+then
+ CURRENTDIR=$(pwd)
+ cd $TMPDIR
+
+ # Pinguin herkopieren.
+ cp $PENGUIN .
+
+ # Die Platzhalter im Template werden ersetzt ...
+ REPLACE="s%XXXACCOUNTXXX%$ACCOUNT%g;"
+ REPLACE=$REPLACE"s%XXXDATUMXXX%$DATUM%g;"
+ REPLACE=$REPLACE"s%XXXSPLINEXXX%$SPLINE%g;"
+ REPLACE=$REPLACE"s%XXXNNAMEXXX%$NNAME%g;"
+ REPLACE=$REPLACE"s%XXXVNAMEXXX%$VNAME%g;"
+ REPLACE=$REPLACE"s%XXXSTREETXXX%$STREET%g;"
+ REPLACE=$REPLACE"s%XXXPLZXXX%$PLZ%g;"
+ REPLACE=$REPLACE"s%XXXORTXXX%$ORT%g;"
+ REPLACE=$REPLACE"s%XXXTELEPHONXXX%$TEL%g;"
+ REPLACE=$REPLACE"s%XXXINFACCOUNTXXX%$INFACCOUNT%g"
+
+ # ... wenn sed aufgerufen wird.
+ sed "$REPLACE" $TEMPLATE > account-$ACCOUNT.tex
+
+ echo
+ echo -n "Das kann jetzt einen Moment dauern. Der Antrag wird generiert ... "
+
+ echo >&2
+
+ # LaTeX und dvips aufrufen.
+ latex account-$ACCOUNT.tex >&2
+ dvips -o account-$ACCOUNT.ps account-$ACCOUNT.dvi >&2
+
+ echo "fertig."
+
+ # und den Antrag umbenennen.
+ mv account-$ACCOUNT.ps $NEWNAME
+
+ # Wenn nur der Antrag erstellt werden soll,
+ if [[ "$ANTRAG" = "1" ]]
+ then
+ # pruefen, ob die Userin/ der User ein public_html hat und,
+ if [[ -d /var/users/$ACCOUNT/public_html/webroot ]]
+ then
+ # wenn ja, dann den Antrag da hin schieben.
+ mv -f $NEWNAME /var/users/$ACCOUNT/public_html/webroot/
+ echo
+ echo "Der Antrag kann unter"
+ echo "http://www.spline.inf.fu-berlin.de/~$ACCOUNT/$NEWNAME"
+ echo "abgerufen und dann ausgedruckt und unterschrieben werden."
+ else
+ # wenn nicht, dann eben ins root-home packen.
+ mv -f $NEWNAME /root/
+ echo
+ echo "Der Antrag ist als /root/$NEWNAME gespeichert."
+ fi
+ cd $CURRENTDIR
+ # fertig. Aufraeumen.
+ #rm -rf $TMPDIR
+ fi
+
+ cd $CURRENTDIR
+ unset CURRENTDIR
+else
+ echo "Konnte Benutzungsantrag nicht erstellen."
+fi
+
+# Nur der Antrag? Dann ist das jetzt fertig.
+[[ "$ANTRAG" = "1" ]] && exit 0
+
+# Maximale UID diesseits von 65000 bestimmen.
+UIDNUMBER=$(ldapsearch -b "dc=spline,dc=inf,dc=fu-berlin,dc=de" \
+ -x objectclass=shadowAccount uidNumber \
+ | awk -F: \
+ '/uidNumber:/ {if (max <= $2 && $2 < 65000 ) max = $2;} END {print max+1}')
+
+echo "Numerische UID: $UIDNUMBER" >&2
+
+touch $LOG
+chmod 600 $LOG
+
+echo "Angelegt am $(date -I) um $(date '+%H:%Mh') von $SPLINE" >> $LOG
+echo "Login: $ACCOUNT" >> $LOG
+echo "Numerische UID: $UIDNUMBER" >> $LOG
+echo "Name: $NNAME" >> $LOG
+echo "Vorname: $VNAME" >> $LOG
+echo "Strasse und Hausnummer: $STREET" >> $LOG
+echo "PLZ: $PLZ" >> $LOG
+echo "Ort: $ORT " >> $LOG
+echo "Telephonnummer: $TEL" >> $LOG
+echo "FB-Account: $INFACCOUNT (existiert${GEPRUEFT})" >> $LOG
+echo "Shell: $NEWSHELL" >> $LOG
+echo >> $LOG
+
+# Template fuer den LDAP-Eintrag fuellen.
+cat > /tmp/ld.new.$$ << EOF
+dn: uid=$ACCOUNT,ou=People,dc=spline,dc=inf,dc=fu-berlin,dc=de
+uid: $ACCOUNT
+cn: $VNAME $NNAME
+objectClass: account
+objectClass: posixAccount
+objectClass: top
+objectClass: shadowAccount
+userPassword: {crypt}5Y
+shadowLastChange: 10990
+shadowMax: 99999
+shadowWarning: 7
+uidNumber: $UIDNUMBER
+gidNumber: 100
+homeDirectory: /home/$ACCOUNT
+loginShell: $NEWSHELL
+gecos: $VNAME $NNAME
+EOF
+
+# Eintrag in die LDAP-Datenbank
+ldapadd -x -D "cn=admin,dc=spline,dc=inf,dc=fu-berlin,dc=de" \
+ -y /etc/ldapadd.secret -f /tmp/ld.new.$$ \
+ || echo "Fehler beim Eintrag in die LDAP-Datenbank."
+
+# Mal sehen, ob der Account jetzt da ist.
+if ( id $ACCOUNT >&2 )
+then
+ echo Account erfolgreich in das LDAP-Verzeichnis eingetragen.
+else
+ echo "Eintrag in das LDAP-Verzeichnis fehlgeschlagen."
+ echo "Vielleicht mal mit --debug aufrufen."
+ exit 1
+fi
+
+# Verzeichnisse anlegen
+cp -a /etc/skel /home/$ACCOUNT
+
+# public_html mit leerer index.html (gegen directory listings)
+ssh www-data@userpage.spline.inf.fu-berlin.de sudo mkdir -p /var/users/$ACCOUNT/public_html/webroot
+ssh www-data@userpage.spline.inf.fu-berlin.de sudo mkdir -p /var/users/$ACCOUNT/public_html/cgi-bin
+ssh www-data@userpage.spline.inf.fu-berlin.de sudo mkdir -p /var/users/$ACCOUNT/public_html/logs
+ssh www-data@userpage.spline.inf.fu-berlin.de sudo touch /var/users/$ACCOUNT/public_html/webroot/index.html
+ln -s /var/users/$ACCOUNT/public_html /home/$ACCOUNT/
+
+# Mail mit leerer Incoming, die dann auch noch die richtigen
+# Rechte bekommt.
+mkdir -p /home/$ACCOUNT/Mail
+touch /home/$ACCOUNT/Mail/Incoming
+chmod 600 /home/$ACCOUNT/Mail/Incoming
+
+# Accountantrag verschieben.
+ssh www-data@userpage.spline.inf.fu-berlin.de sudo chown -R www-data: /var/users/$ACCOUNT/
+scp $TMPDIR/$NEWNAME www-data@userpage.spline.inf.fu-berlin.de:/var/users/$ACCOUNT/public_html/webroot/
+ssh www-data@userpage.spline.inf.fu-berlin.de chmod 644 /var/users/$ACCOUNT/public_html/webroot/$NEWNAME
+
+# Und aufraeumen.
+#rm -rf $TMPDIR
+
+# Verzeichnisse samt Inhalt verschenken.
+chown -R $ACCOUNT: /home/$ACCOUNT
+ssh www-data@userpage.spline.inf.fu-berlin.de sudo chown -R $UIDNUMBER:users /var/users/$ACCOUNT/
+
+# Und aufraeumen.
+rm /tmp/ld.new.$$
+
+if [ -x /usr/local/bin/userSubGenerate ]
+then
+ echo "Generiere die Domains $ACCOUNT.spline.inf.fu-berlin.de und"
+ echo "$ACCOUNT.spline.de sowie die Verweise"
+ echo "http://$ACCOUNT.spline[.inf.fu-berlin].de/ ->"
+ echo " /home/$ACCOUNT/public_html/..."
+ echo
+ /usr/local/bin/userSubGenerate
+ echo
+fi
+
+# Abonnementrequests an die Mailinglisten spline und splinux absetzen.
+echo
+echo "Versuche, $ACCOUNT@spline.inf.fu-berlin.de auf den"
+echo "Mailinglisten spline und splinux einzutragen ..."
+
+# Im Realname muessen Leerzeichen und Umlaute webgerecht ersetzt werden.
+REALNAMEESC=$(perl -e'$e = shift; $e =~ s/([^\w])/'\''%'\''.sprintf("%X", ord($1))/ge; print $e;' "$VNAME $NNAME")
+
+# Das Abonnieren geht auch ueber das WWW.
+SPLINEEINTRAG="$BROWSER -dump \"http://lists.spline.inf.fu-berlin.de/mailman/subscribe/spline?email=$ACCOUNT@spline.inf.fu-berlin.de&fullname=$REALNAMEESC\""
+SPLINUXEINTRAG="$BROWSER -dump \"http://lists.spline.inf.fu-berlin.de/mailman/subscribe/splinux?email=$ACCOUNT@spline.inf.fu-berlin.de&fullname=$REALNAMEESC\""
+
+if [ "$BROWSER" == "/usr/bin/wget" ] ; then
+ SPLINEEINTRAG="$BROWSER --no-check-certificate -O /dev/null \"http://lists.spline.inf.fu-berlin.de/mailman/subscribe/spline?email=$ACCOUNT@spline.inf.fu-berlin.de&fullname=$REALNAMEESC\""
+ SPLINUXEINTRAG="$BROWSER --no-check-certificate -O /dev/null \"http://lists.spline.inf.fu-berlin.de/mailman/subscribe/splinux?email=$ACCOUNT@spline.inf.fu-berlin.de&fullname=$REALNAMEESC\""
+fi
+
+echo >&2
+echo "Spline: $SPLINEEINTRAG" >&2
+eval $SPLINEEINTRAG >&2
+
+echo >&2
+echo "Splinux: $SPLINUXEINTRAG" >&2
+eval $SPLINUXEINTRAG >&2
+
+echo "... versucht :) Nicht vergessen, Mails zu lesen!"
+echo "Mit einer .forward-Datei im Heimatverzeichnis "
+echo "kann die mail weitereleitet werden."
+
+# So lange versuchen, das Passwort zu setzen, bis es geklappt hat.
+echo
+echo "Passwort setzen:"
+while ( ! ldpasswd $ACCOUNT )
+do
+ echo
+ echo "Passwort setzen:"
+done
+
+echo
+echo "Fertig. BenutzerIn komplett angelegt."
+echo
+echo "Der Antrag / die Verpflichtungserklaerung kann unter"
+echo "http://www.spline.inf.fu-berlin.de/~$ACCOUNT/$NEWNAME"
+echo "abgerufen und dann ausgedruckt und unterschrieben werden."
+echo
+
+echo
+echo "Bitte auf beep /usr/local/bin/userSubGenerate ausführen, da"
+echo "sonst keine subdomains erstellt werden."
+echo "Stand: Mo 18. Okt 21:08:03 CEST 2010"
+echo