#!/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 \n"; } else { $SVNROOT = $2; } } # # User eingabe # print "Aktuelles SVNROOT ist $SVNROOT\nMit Return bestätigen oder neuen Pfad eingeben\nINPUT: "; $derInput = ; 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? "; $antwort = ; 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 = ; $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 = ; $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 = ; $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 = ; $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 = ; $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 = ; close(PWDCONF); $userliste_start = 0; for ( @userliste ) { print " "x3,$_ if ( $userliste_start == 1 ); $userliste_start = 1 if ( m/^\[users\].*/ ); } print "-eof-\n"; }