You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

364 lines
7.0 KiB
Perl

#!/usr/bin/perl -w
require Tie::File;
#
# Willkommen in meinem ersten PERL Adventure
# GameEngine: perl
# GameDesigner: appriv
#
#
# Level 0: -Levelinit
#
$SVNSERVER = "svnserve"; # servercmd ohne path
$SVNROOT = "/srv/svn/repos"; # default svnroot
$SVNMOD = 0700; # für repos anlegen
$SVNUSR = 1000; # für repos anlegen
$SVNGRP = 1000; # für repos anlegen
$SVNPASSWORD_DB = "../../passwd"; #relativ zum SVNROOT, besser wär absolut
$SVNAUTHZ_DB = "../../authz"; #relativ zum SVNROOT, besser wär absolut
$SVNDEFAULT_REALM = "Level One's SubVersion Server";
#
# Level 1: -finde heraus ob du wichtig bist
# Hinweis: wichtig ist der ROOT
#
$ergebnis = `whoami`;
$ergebnis =~ s/\s//g; #kryptisch? entfernt bloss alle whitespace zeichen, und somit das \n am ende
print "Starte PERL Adventure [ mysvnadmin ] als ";
print $ergebnis;
print "\n";
if( $ergebnis ne "root" )
{
die "Bitte das programm als root starten\n"
}
#
# Level 2: -test ob der subversion server läuft
#
#
@erzeile = `ps -C $SVNSERVER h -o cmd` ;
# ps optionen:
# -C fname..ps gezielt für fname (ohne pfad)
# h ........kein header (titel)
# -o cmd ...nur command mit optionen ausgeben
$anz = @erzeile;
if( $anz <= 0 )
{
print "Zur zeit lauft kein subversion server\n";
}
else
{
#es läuft ein server, am besten gleich die anzahl
#testen.
@list = `ps -C $SVNSERVER h -o pid`;
if ( @list > 1 )
{
print "Es sollte nur ein server laufen.\n";
print "pids der svnserver:\n @list \n";
die "Bitte killen\n";
}
}
#
# Level 2: -BOSS, hier das erste Endmonster
# um das Endmonster zu besiegen muss ein Verzeichnis
# für SVNROOT eingegeben werden.
# Falls ein svnserver lauft wird ihm das -r argument geklaut.
#
if( $anz > 0 )
{
$strng = "@erzeile";
$strng =~ m/(-r)\s(\S+)\b/;
if( ! defined $2 )
{
print "Warnung: svnserver lauft ohne -r <repositorypath>\n";
}
else
{
$SVNROOT = $2;
}
}
#
# User eingabe
#
print "Aktuelles SVNROOT ist $SVNROOT\nMit Return bestätigen oder neuen Pfad eingeben\nINPUT: ";
$derInput = <STDIN>;
if( $derInput ne "\n" )
{
$SVNROOT = $derInput;
}
$SVNROOT =~ s/\s$//; #newline von eventueller eingabe entfernen
#
# Level 2: -Endmonster liegt bereits am boden aber wir müssen trotzdem noch
# SVNROOT testen obs ein verzeichnis ist oder nicht
#
if ( ! -d $SVNROOT ) #test auf dir
{
print "$SVNROOT nicht vorhanden\n";
print "\nVerzeichnis $SVNROOT anlegen? <j/n> ";
$antwort = <STDIN>;
if( $antwort =~ m/[jJyY]/ )
{
&SubVersionRoot_Anlegen($SVNROOT);
}
else
{
die "Ohne SVNROOT hats echt keinen Sinn";
}
}
#
# Level 3: -SVNROOT wurde gefunden, angelegt, was auch immer
# jetzt das repository anlegen
#
#
chdir ( $SVNROOT );
$eingabe="";
while( ! ($eingabe =~ m/[xX]/) )
{
&menuAnzeigen();
$eingabe = <STDIN>;
$eingabe =~ s/\s$//; #newline entfernen
if( $eingabe eq "1" )
{
&NeuesRepositoryAnlegen();
}
elsif( $eingabe eq "2" )
{
&UserAdden();
}
elsif( $eingabe eq "l" )
{
&UserListe();
}
}
################################################################ ENDE, jetzt nurmehr subroutinen
#
# Subroutine Verzeichnisbaum anlegen
# Wenn darunterliegende Verzeichniss existieren,
# dann werden die permisssions belassen,
# es werden nur von neu angelegten Verzeichnisse die
# Permissions umgesetzt.
#
sub SubVersionRoot_Anlegen()
{
my $Verzeichnis = shift;
if( -d $Verzeichnis ) {
return 1; #verzeichnis existiert bereits
}
my $parent = $Verzeichnis;
if( $parent =~ s/\/[^\/]+$// )
{
#besitzt parent? dann anlegen
&SubVersionRoot_Anlegen($parent); #recursive durch
mkdir ($Verzeichnis) || die "Abbruch: $Verzeichnis kann nicht angelegt werden.";
print "$Verzeichnis wurde angelegt\n";
#permissions vergeben
chown( $SVNUSR, $SVNGRP, $Verzeichnis );
chmod( $SVNMOD, $Verzeichnis );
}
}
#
# MyAdmin Menu Ausgabe
#
sub menuAnzeigen()
{
print "*"x40, "\n";
print "S V N A D M I N\n";
print " 1...Repository anlegen\n";
print " 2...User add/del/pw\n";
print " l...User liste\n";
print " X...Ende\n";
print "Input: ";
}
#
# aktuelles Directory ist bereist SVNROOT
# svnadmin muss im pfad liegen um das repository zu erzeugen.
# dannach werden die configfiles gelöscht und ein
# neues generiert.
#
sub NeuesRepositoryAnlegen()
{
print "Name des neuen repository? ";
$eingabe = <STDIN>;
$eingabe =~ s/\s$//; #newline entfernen
if( -d $eingabe )
{
print "$eingabe exisitert bereits\n";
return 1;
}
`svnadmin create $eingabe`;
if( $? != 0 ) { die "svnadmin create $eingabe .. nicht erfolgreich "};
# permissions
# chmod funktioniert nicht wegen dem einem stickybit für verz. db
#
`chown -R $SVNUSR:$SVNGRP $eingabe` ;
print "$eingabe angelegt\n";
`rm $eingabe/conf/*`;
print "automatisch generierte configs gelöscht.\n";
#
# User anlegen
#
@svnserv_conf = ( "[general]",
"anon-access = none",
"auth-access = write",
"password-db = $SVNPASSWORD_DB",
"authz-db = $SVNAUTHZ_DB",
"realm = $SVNDEFAULT_REALM" );
open ( SVNCONF , ">$eingabe/conf/svnserve.conf" ) or die "kann $SVNROOT/eingabe/conf/svnserver.conf nicht öffnen.";
foreach ( @svnserv_conf ) { print SVNCONF "$_\n"; } # svnserv_conf liste schreiben
close( SVNCONF );
my $file="$eingabe/conf/svnserve.conf" ;
chown( $SVNUSR, $SVNGRP, $file );
chmod( $SVNMOD, $file );
print "$SVNROOT/$eingabe/conf/svnserve.conf generiert.\n";
print "Neues repository erfolgreich angelegt.\n"
}
#
# User adden. User werden in das Haupt-Passwd hinzugefügt
#
sub UserAdden()
{
print "Name des neuen Users? ";
$eingabe = <STDIN>;
$eingabe =~ s/\s$//; #newline entfernen
tie my @passwdconf, 'Tie::File', "$SVNROOT/passwd" or die $!;
$user_existiert = 0 ;
$index = 0;
for $pwzeile ( @passwdconf )
{
if ( $pwzeile =~ m/^$eingabe/ )
{
$user_existiert=1;
print "User $eingabe Optionen:\n[d].. löschen\n[p].. neues passwort\n[x].. abbruch\nINPUT: ";
$antwort = <STDIN>;
$antwort =~ s/\s$//;
if( $antwort eq "d" )
{
splice @passwdconf, $index, 1;
print "User wurde gelöscht\n";
}
elsif( $antwort eq "p" )
{
$pwneu = &PasswortEingabe( $eingabe );
$pwzeile = "$eingabe = $pwneu";
print "passwort wurde geändert auf $pwneu\n";
}
}
$index ++;
}
if( $user_existiert == 0 )
{
$pwneu = &PasswortEingabe( $eingabe );
push @passwdconf, "$eingabe = $pwneu";
print "User $eingabe wurde mit passwort $pwneu angelegt\n";
}
untie @passwdconf;
}
#
# Parameter: username
#
sub PasswortEingabe()
{
my $user = shift;
print "passwort eingeben für user $user : ";
$neuespasswort = <STDIN>;
$neuespasswort =~ s/\s$//;
if( $neuespasswort eq "" ) {
$neuespasswort = "$eingabe";
$neuespasswort .= "99";
}
return $neuespasswort;
}
#
# Gibt userliste aus
#
sub UserListe()
{
open( PWDCONF, "<$SVNROOT/passwd" ) or die "Kann $SVNROOT/passwd nicht öffnen";
@userliste = <PWDCONF>;
close(PWDCONF);
$userliste_start = 0;
for ( @userliste )
{
print " "x3,$_ if ( $userliste_start == 1 );
$userliste_start = 1 if ( m/^\[users\].*/ );
}
print "-eof-\n";
}