summaryrefslogtreecommitdiffstats
path: root/lduseradd
blob: d8689840af0f8faf65d1f1c547fa507503c66524 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
#!/bin/bash
# 
# neuere änderungen siehe git :)
# 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

if [ `id -u` -ne 0 ]; then
  echo "Muss als root ausgeführt werden!"
  echo "  sudo $0 $@"
  echo "(dann das eigene Passwort angeben)"
  exit 1
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=/var/log/lduseradd.log
TEMPLATE=/usr/local/src/usermanagement/contrib/account.tex.template
PENGUIN=/usr/local/src/usermanagement/contrib/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 3 auf /dev/null
# umgeleitet.
if [[ "$DEBUG" = "" ]]; then
  exec 3>/dev/null
else
  exec 3>&2
fi

# Als Beispiel: Das >&3 sagt, dass alles, was auf FD 1 (stdout)
# ausgegeben wird -- bei echo eben der Text -- auf FD 3 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" >&3

# 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" \
             | LC_ALL=C grep -E "^uid|^gecos" >&3 )
    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 | LC_ALL=C 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 | LC_ALL=C grep -E '(^[[:digit:]]|[^[:alpha:][:digit:]])' >&3 )
    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" \
                | LC_ALL=C grep -E "^uid|^gecos" >&3 )
    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 | LC_ALL=C grep -E '([^A-Za-z])' >&3 )
    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 | LC_ALL=C grep -E '([^A-Za-z])' >&3 )
    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 | LC_ALL=C grep -E '([^A-Za-z 0-9\.])' >&3 )
    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 | LC_ALL=C grep -E '[^[:digit:]]' >&3 )
    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 | LC_ALL=C grep -E '[^ \+()[:digit:]\/\-]' >&3 )
    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\" \
    #   | LC_ALL=C grep -E \"YES|NO\" | awk '{print \$1}'"
    #echo "Browser wird aufgerufen durch: $COMMAND" >&3
    #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='LC_ALL=C grep -v "^$\|^#" /etc/shells'
    echo AVAILABLESHELLSCOMMAND: $AVAILABLESHELLSCOMMAND >&3
    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 \
                   | LC_ALL=C 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"| LC_ALL=C grep -E "^uid:" >&3 )
  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 >&3

  # LaTeX und dvips aufrufen.
  latex account-$ACCOUNT.tex >&3
  dvips -o account-$ACCOUNT.ps account-$ACCOUNT.dvi 2>&3 >&3
  
  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 home hat und,
    if [[ -d /home/$ACCOUNT/ ]]
    then
      # wenn ja, dann den Antrag da hin schieben.
      mv -f $NEWNAME /home/$ACCOUNT/
      chmod go-r /home/$ACCOUNT/$NEWNAME
      echo
      echo "Der Antrag kann unter"
      echo "/home/$ACCOUNT/$NEWNAME"
      echo "abgerufen und dann ausgedruckt:"
      echo "    ssh $ACCOUNT@fob.spline.de"
      echo "    lp $NEWNAME"
      echo "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" >&3

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
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: $VNAME $NNAME
sn: $NNAME
givenName: $VNAME
displayName: $VNAME $NNAME
mail: $ACCOUNT@spline.inf.fu-berlin.de
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/ldap/slapd.secret -f /tmp/ld.new.$$ \
  || echo "Fehler beim Eintrag in die LDAP-Datenbank."

# Mal sehen, ob der Account jetzt da ist.
if ( id $ACCOUNT >&3 )
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
echo Home-Verzeichnis anlegen...
cp -a /etc/skel /home/$ACCOUNT


echo Forward-Datei erstellen...
# .forward erstellen (wenn FB-Account existiert)
if [[ "$INFACCOUNTTEST" != "NOTEST" ]]; then
  echo $INFACCOUNT@zedat.fu-berlin.de > /home/$ACCOUNT/.forward
else
  echo Übersprungen, weil Fachbereichsadresse nicht überprüft
fi

# 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.
mv -f $TMPDIR/$NEWNAME /home/$ACCOUNT/
chmod go-r /home/$ACCOUNT/$NEWNAME

# Und aufraeumen.
if [ -f "/home/$ACCOUNT/$NEWNAME" ]; then
    rm -rf "$TMPDIR"
fi

# Verzeichnisse samt Inhalt verschenken.
chown -R $ACCOUNT: /home/$ACCOUNT
chmod go-rw /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\"" 2>&3
SPLINUXEINTRAG="$BROWSER -dump \"http://lists.spline.inf.fu-berlin.de/mailman/subscribe/splinux?email=$ACCOUNT@spline.inf.fu-berlin.de&fullname=$REALNAMEESC\"" 2>&3

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\"" 2>&3
        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\"" 2>&3
fi

echo >&3
echo "Spline: $SPLINEEINTRAG" >&3
eval $SPLINEEINTRAG >&3

echo >&3
echo "Splinux: $SPLINUXEINTRAG" >&3
eval $SPLINUXEINTRAG >&3

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



mail -s 'Willkommen bei Spline' $ACCOUNT@spline.inf.fu-berlin.de <<EOF
Hallo $ACCOUNT,

Willkommen bei Spline.

Schau mal hier, da haben wir ein paar Infos fuer neu-Splinees:
<https://doku.spline.inf.fu-berlin.de/organisation/spline-intro>

Auf diese Mail zu antworten, funktioniert eher nicht.
Schreib bei Fragen einfach an unsere Mailingliste:
  spline@spline.de
EOF


echo
echo "Fertig. BenutzerIn komplett angelegt."
echo
echo "Der Antrag kann unter"
echo "/home/$ACCOUNT/$NEWNAME"
echo "abgerufen und dann ausgedruckt:"
echo "    ssh $ACCOUNT@fob.spline.de"
echo "    lp $NEWNAME"
echo "und unterschrieben werden."
echo

# scheint nicht mehr nötig zu sein
#echo
#echo "Bitte auf beep /usr/local/bin/userSubGenerate ausführen, da"
#echo "sonst keine subdomains erstellt werden." 
#echo