Dieses Programm dient dazu, neue Benutzer anzulegen.
Dateiname: /usr/local/httpd/htdocs/admin/adduser.cgi.
#!/usr/bin/perl -w
# adduser.cgi: a utility to add users to the system
#
# Copyright (C) 1994 Ian A. Murdock <imurdock@shell.portal.com>
# Heavily modified by Thomas Bleher <thomas@gm.rt.schule-bw.de>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
use CGI;
use CGI::Carp qw(fatalsToBrowser);
my $q = new CGI;
print $q->header,$q->start_html(-title=>'Benutzereinrichtung');
if (not $q->param) {
# noch keine Daten eingegeben
print $q->h1('Benutzereinrichtung');
print $q->p,'Hier können Sie neue Benutzer einrichten. ';
&erzeuge_eingabefeld();
print <<'HERE';
<hr /><h2>Anmerkungen</h2>
<p><em>Vollständiger Name</em>: Hier sollte der wirkliche Name angegeben
werden, erlaubt sind alle Zeichen.</p>
<p><em>login-Name</em>: Unter diesem Namen muss sich der Benutzer am System
anmelden. Erlaubt sind die Buchstaben a-z, A-Z, die Zahlen 0-9 sowie die
Zeichen ".", "-" und "_". Erstes Zeichen muss ein Buchstabe sein.</p>
<p><em>Passwort</em>: Das Passwort ist auf 8 Zeichen beschränkt. Aus
Gründen der Systemsicherheit muss es mindestens 5 Zeichen lang sein.
Voreingestellt ist "<i>passwort</i>". Erlaubt sind alle Zeichen.</p>
HERE
print $q->end_html;
} else { # es wurden schon Daten eingegeben
$login=$q->param('login');
$name=$q->param('fullname');
$passwd=$q->param('passwort');
@rechte=$q->param('rechte');
create_user();
if (%fehler) {
print
"<h1>Fehlerhafte Eingabe!</h1>",
"<p>Der Benutzer konnte leider nicht eingerichtet werden, da ihre ",
"Eingaben fehlerhaft waren. Korrigieren Sie bitte ihre Eingabe ",
"und versuchen sie es noch einmal.</p>",
"<hr />",
"<h2>Fehler:</h2>",
"<strong>";
foreach (keys %fehler) {
print $_,"<br>\n";
}
print '</strong>';
# Fehlermeldung: Format ungueltig
erzeuge_eingabefeld();
} else {
print "<h1>Erfolgreiche Benutzereinrichtung!</h1>
<p>Der Benutzer <strong>$name</strong> wurde erfolgreich
eingerichtet!\n";
print $q->p;
$rechte = '';
foreach (keys %rechte) {
$rechte .= "$_ ";
}
$rechte = 'Schüler' if (not $rechte);
print <<HERE;
<h2>Daten</h2>
<table>
<tr><td>Vollständiger Name</td><td>$name</td></tr>
<tr><td>Login-Name</td><td>$login</td></tr>
<tr><td>Passwort</td><td>$passwd</td></tr>
<tr><td>Home-Verzeichnis</td><td>$dhome</td></tr>
<tr><td>Rechte</td><td>$rechte</td></tr>
<tr><td>e-Mail-Adresse</td><td>$login\@gm.rt.schule-bw.de</td></tr>
</table>
HERE
$url=$q->url(-relative=>1);
print "<p><a href=\"$url\">Neuen Benutzer einrichten</a><p>";
print $q->a({-href=>'/'},'Zurück zur Hauptseite');
print $q->end_html;
}
}
sub erzeuge_eingabefeld {
print $q->start_form(-action=>$ENV{SCRIPT_NAME});
print "\n",$q->p,'<table><tr><td>Vollständiger Name: </td><td>',
$q->textfield(-name=>'fullname',
-default=>'',
-size=>'30',
-maxlength=>'60');
print "\n</td></tr><tr><td>login-Name: </td><td>",
$q->textfield(-name=>'login',
-default=>'',
-size=>'16',
-maxlength=>'32');
print "\n</td></tr><tr><td>Passwort: </td><td>",
$q->password_field(-name=>'passwort',
'-value'=>'passwort',
-size=>'8',
-maxlength=>'8');
print "\n</td></tr></table><p><strong>Rechte: </strong>",$q->br,
$q->checkbox_group(-name=>'rechte',
-values=>['Lehrer','Systemadministrator']);
print "\n",$q->p,$q->submit('send','Benutzer erzeugen');
print $q->end_form;
}
sub create_user {
use English;
use File::Copy;
$dhome="/home";
$login = $q->param('login');
$name = $q->param('fullname');
$passwd = $q->param('passwort');
@rechte_a = $q->param('rechte');
foreach (@rechte_a) {
$rechte{$_}=1;
}
# Plausibilitaetspruefung:
if (length($passwd) > 8) {$fehler{'Passwort zu lang'}=1};
if (length($passwd) < 5) {$fehler{'Passwort zu kurz'}=1};
if ($login !~ /^[a-zA-Z][-a-zA-Z0-9._]+$/) {
$fehler{'login-Name nicht gültig'}=1
};
if ($login eq '') {$fehler{'login-Name zu kurz'}=1};
if ($name eq '') {$fehler{'Name zu kurz'}=1};
if (length($login) > 16) {$fehler{'login-Name zu lang'}=1};
if (length($name) > 60) {$fehler{'Name zu lang'}=1};
if (getpwnam $login) {$fehler{'Benutzer existiert schon'}=1};
if (%fehler) {return()};
# And now the program begins:
# Checkboxen auswerten (in Hash umwandeln?)
#Home-Verzeichnis
if (defined $rechte{'Lehrer'}) {$dhome .= "/lehrer/";}
else {$dhome .= "/schueler/";}
$dhome .= $login;
# Gruppenzugehörigkeit
$add_groups = $login;
add2group('users');
# $add_groups = 'users';
if (defined $rechte{'Lehrer'}) {
add2group('lehrer');
add2group('internet');
} else {
add2group('schueler');
}
if (defined $rechte{'Systemadministrator'}) {
add2group('admin')
}
$output = `sudo /usr/sbin/groupadd $login 2>&1`;
#print "Gruppe erzeugt (Output:\n$output\n)";
$enc_passwd = crypt ($passwd,
join('',('.','/', 0..9, 'A'..'Z', 'a'..'z')[rand 64, rand 64]));
setgrent;
eval {
local $SIG{ALRM} = sub {
die "Gruppe konnte nicht eingerichtet werden! (Timeout)\n"
};
alarm 120;
while (not defined($gid = getgrnam $login)) {endgrent;setgrent;}
#warten, bis die group vom System erkannt wird...
# Gefahr eines Deadlocks?
alarm 0;
};
endgrent;
if ($@) {$fehler{"$@"}=1; return();};
#print "User existiert\n";
my $cmd = "sudo /usr/sbin/useradd -c \'$name\' -d $dhome -g $gid ".
"-G $add_groups -p $enc_passwd -s \'/bin/false\' ".
"-m $login 2>&1";
$output = `$cmd`;
#print "useradd-output:\n$output\n";
if ($?) {$fehler{'<i>useradd</i> funktioniert nicht richtig!'}=1; return();}
#print "Benutzer erzeugt(Output:\n$output)\n";
system("sudo mkdir -m 0755 /home/public_html/$login");
eval {
local $SIG{ALRM} = sub {
die "Benutzer konnte nicht eingerichtet werden! (Timeout)\n"
};
alarm 120;
while (not defined($uid = getpwnam $login)) {}
alarm 0;
};
if ($@) {$fehler{"$@"}=1; return();};
#print "Benutzer existiert\n";
system("sudo chown $uid:$gid /home/public_html/$login");
system("sudo ln -s /home/public_html/$login /$dhome/public_html");
#system("sudo mkdir /usr/local/samba/profiles/$login");
#quotas setzen
system("sudo /usr/sbin/setquota $login 51200 51200 0 0 /dev/md0");
#print "Verzeichnisse erzeugt\n";
open PIPE, "|sudo smbpasswd -s -a $login > /dev/null"
or $fehler{"<i>smbpasswd</i> funktioniert nicht richtig ".
"(on PIPE-Open) ($!)"}=1, return();
print PIPE $passwd,"\n",$passwd,"\n"
or $fehler{"<i>smbpasswd</i> funktioniert nicht richtig ".
"(on passwd-print) ($!)"}=1, return();
close PIPE;
# or $fehler{"<i>smbpasswd</i> funktioniert nicht richtig ".
# "(on PIPE-close) ($!)"}=1, return();
#print "Samba-Passwort\n";
system "sudo /usr/local/sbin/generate_apache_auth";
system "sudo /usr/local/sbin/make_mozilla_config.pl $dhome/Mozilla ".
"\'$login\' \'$name\'";
#print "Rest erzeugt!";
}
sub add2group {
$add_groups .= ','.$_[0];
}
__END__ of adduser.cgi
Dateiname: /usr/local/sbin/make_mozilla_config.pl.
#!/usr/bin/perl -w
use File::Find;
my ($path,$login,$user) = @ARGV;
if (not $user) {$user =(getpwnam($login))[6]};
if (not $path) {die "Pfad nicht gültig";}
File::Find::find(\&change_files,$path);
sub change_files {
my $file = $_;
return unless -f $_;
open(FILE, "<$file") or return;
my $data = join('', <FILE>);
close(FILE);
my $orig = $data;
$data =~ s/\%user\%/$user/g;
$data =~ s/\%login\%/$login/g;
if ($data ne $orig) {
open FILE, ">$file" or return;
print FILE $data;
close FILE;
}
}