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
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";
|
|
}
|
|
|