#! /usr/bin/perl -w # strictly local for 'uu.nl' ; use strict ; use Repocafe ; my $prog = substr($0,rindex($0,'/')+1) ; my $Usage = <.xxx.name repo's ---------------------------------------- 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 r g s stf edu) ) ; Usage("Arg count\n") unless @ARGV == 1 ; my $SIDE = shift ; $opt{v} ||= $opt{d} ; if ( $opt{r} and not ( $opt{stf} or $opt{edu} ) ) { Usage "with opt -r, specify -stf or -edu\n" ; } my $Cafe = make_cafe ( %opt ) ; my $conf = $Cafe -> conf ; my $dbh = $Cafe -> _dbh ; my $trees = join ' ', sort keys %{ $conf -> tree } ; unless ( exists $conf -> tree -> { $SIDE } ) { Error "no such 'tree' ($SIDE) ; use one of ($trees)" ; } sub get_tups { my $dbh = shift ; my $sql = shift ; my $tab = shift ; my @res = () ; my $sth = $dbh -> prepare ( $sql ) ; $sth -> execute ( @$tab ) ; while ( my $rec = $sth -> fetchrow_hashref ) { push @res, $rec ; } [ @res ] ; } my $person_sql = "SELECT * FROM person " . "WHERE admtag IS NOT NULL and solis_id IS NOT NULL" ; my $persons = get_tups $dbh, $person_sql, [] ; my $stud_sql = "SELECT * FROM account_edu " . "WHERE purpose = 'student' and studentnummer IS NOT NULL" ; my $studs = get_tups $dbh, $stud_sql, [] ; printf "staff(%d)\n", scalar @$persons ; printf "studs(%d)\n", scalar @$studs ; printf "trees(%s)\n", join ',', sort keys %{ $conf -> tree } ; my %sid4admtag ; if ( $opt{stf} ) { for my $pers ( @$persons ) { $sid4admtag { $pers -> { admtag } } = lc $pers -> { solis_id } ; } } if ( $opt{edu} ) { for my $stud ( @$studs ) { $sid4admtag { $stud -> { login } } = $stud -> { studentnummer } ; } } sub repr { my $b = shift ; $b ? 't' : 'f' ; } sub insert_rr { my $rec = shift ; my %rec = %$rec ; my $keys = 'man,mod,pid,rid,wat' ; my @keys = split /,/, $keys ; $rec { man } = repr $rec { man } ; $rec { wat } = repr $rec { wat } ; my $vals = join ',', map { "'$_'" } @rec { @keys } ; print < repo_name ; print $repo -> dmp if $opt{d} ; } my $ownr = $repo -> { ownr } ; unless ( exists $repo -> rights -> { $ownr } ) { my $rec = { man => 'TRUE' , mod => 'rw' , pid => $ownr , rid => $repo -> { id } , wat => $repo -> { wtch } } ; insert_rr $rec ; $repo -> rights -> { $ownr } = $rec ; } for my $rr ( values %{ $repo -> rights } ) { my $pid = $rr -> { pid } ; my $sid = $sid4admtag { $pid } ; if ( defined $sid ) { unless ( exists $rr -> { $sid } ) { my $cpy = { %$rr } ; $cpy -> { pid } = $sid ; $cpy -> { wat } = 'FALSE' ; printf "# add %s for %s\n", $sid, $pid if $opt{v} ; insert_rr $cpy ; } } else { printf "# *** no sid for %s\n", $pid if $opt{v} ; } } } sub add_all_rrs { my $repos = shift ; for my $repo ( sort { $a -> repo_name cmp $b -> repo_name } @$repos ) { add_rrs $repo ; } } sub insert_mem { my $rec = shift ; my %rec = %$rec ; my $keys = 'pid,gid,mem,man' ; my @keys = split /,/, $keys ; $rec { mem } = repr $rec { mem } ; $rec { man } = repr $rec { man } ; my $vals = join ',', map { "'$_'" } @rec { @keys } ; print < name ; print $group -> dmp if $opt{d} ; } my $mems = $group -> members ; for my $pid ( sort keys %$mems ) { my $mem = $group -> members -> { $pid } ; my $sid = $sid4admtag { $pid } ; if ( defined $sid ) { unless ( exists $mems -> { $sid } ) { my $cpy = { %$mem } ; $cpy -> { pid } = $sid ; printf "# add %s for %s\n", $sid, $pid if $opt{v} ; insert_mem $cpy ; } } else { printf "# *** no sid for %s\n", $pid if $opt{v} ; } } } sub add_all_mems { my $groups = shift ; for my $group ( sort { $a -> name cmp $b -> name } @$groups ) { add_mems $group ; } } if ( $opt{r} ) { my @repos = $Cafe -> repos -> select ( -where => "side = '$SIDE'" ) ; add_all_rrs ( \@repos ) ; } if ( $opt{g} ) { add_all_mems ( $Cafe -> groups -> get_by_qwe ( '' ) ) ; }