#! /usr/bin/perl -w # make the database scheme use strict ; use File::Path qw(mkpath) ; use Repocafe ; my $prog = substr($0,rindex($0,'/')+1) ; my $Usage = < ---------------------------------------- - Must run as root or configured , unless in dry-runs. - creates and/or chowns the configured data files and directories ---------------------------------------- USAGE sub Usage { die "$_[0]$Usage" ; } sub Error { die "$prog: $_[0]\n" ; } sub Warn { warn "$prog: $_[0]\n" ; } # usage: &GetOptions(ARG,ARG,..) defines $opt_ID as 1 or user spec'ed value # usage: &GetOptions(\%opt,ARG,ARG,..) defines $opt{ID} as 1 or user value # ARG = 'ID' | 'ID=SPC' | 'ID:SPC' for no-arg, required-arg or optional-arg # ID = perl identifier # SPC = i|f|s for integer, fixedpoint real or string argument use Getopt::Long ; Getopt::Long::config('no_ignore_case') ; our %opt = () ; Usage('') unless GetOptions ( \%opt, qw(v q d f p c=s sql help) ) ; Usage("Arg count\n") unless @ARGV == 0 ; if ( $opt{help} ) { print $Usage ; exit 0 ; } Repocafe::set_opt ( %opt ) ; my $CLEAN = 1 ; if ( $< != 0 ) { my $msg = "run as root (for 'chown www_user:www_group ...')" ; if ( $opt{f} ) { Error "must $msg" ; } else { printf "Warning : should %s\n", $msg ; } } my $Cafe = Repocafe -> new ( $opt{c}, 'no_connect' ) ; my $conf = $Cafe -> conf ; my $dir_admin = $conf -> dir_admin ; my $dir_data = $conf -> dir_data ; my $dir_www = $conf -> dir_www ; my $admin_user = $conf -> admin_user ; my $admin_group = $conf -> admin_group ; my $www_user = $conf -> www_user ; my $www_group = $conf -> www_group ; my $tag = $opt{f} ? 'DID' : 'WOULD' ; # $CONF_ROOT = "/home/csg/svn/dev-admin/repocafe.conf" ; sub create_local { my $line = shift ; my $path = shift ; my $txt = sprintf "\n", $line ; if ( $path and $opt{f} ) { open LOCAL, ">$path" or die "can't write $path ($!)" ; print LOCAL $txt ; close LOCAL ; } $txt ; } sub check_local_ppp { my $path_local = $dir_www . '/local.ppp' ; my $path_conf = $dir_admin . '/' . $conf -> root ; my $line = sprintf '$CONF_ROOT = "%s" ;', $path_conf ; unless ( -f $path_local ) { printf "%s create %s :\n%s", , $tag , $path_local , create_local $line ; create_local $line, $path_local if $opt{f} ; } } sub cp_commit_email { my $name = 'commit-email.pl' ; my $src = "lib/$name" ; my $dst = $name ; unless ( -f $src ) { print "weird : can't find $src\n" ; } elsif ( -f $dst ) { printf "exists : %s\n", $name if $opt{v} ; } else { printf "%s copy $src $dst\n", $tag, $src, $dst ; if ( $opt{f} ) { open SRC, $src or Error "can't open $src ($!)" ; open DST, ">$dst" or Error "can't write $dst ($!)" ; print DST ; close SRC ; close DST ; } } } sub get_xid { my $usr = shift ; my $grp = shift ; my $uid = getpwnam $usr ; my $gid = getgrnam $grp ; Error "can't get uid for user $usr" unless defined $uid ; Error "can't get gid for group $grp" unless defined $gid ; return $uid, $gid ; } sub Mkdir { my $dir = shift ; my $opt = shift ; printf "looking at '$dir' ...\n" if $opt{d} ; if ( -d $dir ) { my ( $UID, $GID ) = ( stat _ ) [ 4, 5 ] ; my @args = @{ $opt } { qw(owner group) } ; my ( $uid, $gid ) = get_xid @args ; if ( $uid != $UID or $gid != $GID ) { $CLEAN = 0 ; printf "$tag chown %s %s %s\n", @args, $dir ; if ( $opt{f} ) { chown $uid, $gid, $dir or die "can't chown $uid, $gid, $dir" ; } } } else { $CLEAN = 0 ; print "$tag mkdir -p $dir\n" ; mkpath ( $dir, $opt ) if $opt{f} ; } } my $opt_www = { mode => 0755, owner => $www_user , group => $www_group } ; my $opt_adm = { mode => 0755, owner => $admin_user, group => $admin_group } ; Mkdir $dir_admin, $opt_adm ; Mkdir $dir_data , $opt_www ; Mkdir $dir_www , $opt_adm ; for my $dir( qw(tmp) ) { Mkdir "$dir_admin/$dir", $opt_adm ; } for my $dir( qw(admin archive logs repos) ) { Mkdir "$dir_data/$dir", $opt_www ; } check_local_ppp ; cp_commit_email ; print "$prog: nothing to do\n" if $CLEAN ;