#! /usr/bin/perl -w use strict ; use Repocafe ; my $TAB = 'repo_roots' ; my $prog = substr($0,rindex($0,'/')+1) ; my $Usage = < option add : add admin option c : use ---------------------------------------- - Create/delete repocafe admins. - For the database connection, db_owner and db_opswd are used. - However, if db_opswd is empty, db_user and db_pswd are used. ---------------------------------------- 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 add=s del=s c=s help) ) ; if ( $opt{help} ) { print $Usage ; exit 0 ; } Usage("Arg count\n") unless @ARGV == 0 ; Repocafe::set_opt ( %opt ) ; sub trim { my $x = shift ; $x =~ s/[\s;]+$// ; $x =~ s/^\s+// ; $x ; } sub get_tups { my $dbh = shift ; my $sql = shift ; my $tab = shift ; my $key = shift ; my @res = () ; my $sth = $dbh -> prepare ( $sql ) ; $sth -> execute ( @$tab ) ; while ( my $rec = $sth -> fetchrow_hashref ) { push @res, $rec ; } @res ; } sub table_cnt { my $db = shift ; my $tab = shift ; my $dbh = $db -> dbh ; my $sth = $dbh -> table_info ( '', 'public', $tab, undef ) ; my $res = undef ; if ( scalar @{ $sth -> fetchall_arrayref } == 1 ) { my $sql = "SELECT count(*) as count FROM $tab" ; my @tups = get_tups $dbh, $sql, [] ; if ( @tups ) { $res = $tups [ 0 ] -> { count } ; } else { Error "can't ($sql)" ; } } $res ; } sub find_user { my $db = shift ; my $adm = shift ; my $dbh = $db -> dbh ; my $sql = "SELECT * FROM $TAB where pid = ?" ; my @tups = get_tups $dbh, $sql, [ $adm ] ; @tups ? $tups [ 0 ] -> { pid } : '' ; } sub add_user { my $db = shift ; my $adm = shift ; my $dbh = $db -> dbh ; my $sql = "INSERT INTO $TAB (pid, actv) VALUES ( ?, ? )" ; my $sth = $dbh -> prepare ( $sql ) ; $sth -> execute ( $adm, 't' ) ; "DID add admin $adm (active)\n" ; } sub del_user { my $db = shift ; my $adm = shift ; my $dbh = $db -> dbh ; my $sql = "DELETE FROM $TAB where pid = ?" ; my $sth = $dbh -> prepare ( $sql ) ; $sth -> execute ( $adm ) ; "DID delete admin $adm\n" ; } sub find_users { my $db = shift ; my $dbh = $db -> dbh ; my $sql = "SELECT * FROM $TAB ORDER BY pid" ; map { $_ -> { pid } } get_tups $dbh, $sql, [] ; } sub verify_user { my $login = shift ; my $cafe = shift ; my $res = $cafe -> lookup ( $login ) ; exists $res -> { $login } ; } my $Cafe = Repocafe -> new ( $opt{c}, 'no_connect' ) ; my $conf = $Cafe -> conf ; my $db_owner = $conf -> db_owner ; my $db_opswd = $conf -> db_opswd ; Warn "db_owner empty or not configured" unless $db_owner ; Warn "db_opswd empty or not configured" unless $db_opswd ; my $ownr = $db_owner ; my $pswd = $db_opswd ; unless ( $pswd ) { $ownr = $conf -> db_user ; $pswd = $conf -> db_pswd ; Warn "using db_user, db_pswd for database connection" ; } $Cafe -> db_connect_as ( $ownr, $pswd ) ; my $db = $Cafe -> db ; my $dbh = $db -> dbh ; my $prefix = $conf -> db_pref ; $TAB = $prefix . $TAB ; Error "can't find table $TAB" unless defined table_cnt $db, $TAB ; printf "current admins:\n %s\n", ( join ', ', find_users $db ) || 'none' unless $opt{q} ; if ( $opt{add} ) { my $adm = $opt{add} ; unless ( verify_user $adm, $Cafe ) { printf "add : can't find user '$adm'\n" ; } elsif ( find_user $db, $adm ) { printf "add : already have admin '$adm'\n" ; } elsif ( $opt{f} ) { print add_user $db, $adm ; } else { print "WOULD add admin $adm\n" ; } } if ( $opt{del} ) { my $adm = $opt{del} ; unless ( find_user $db, $adm ) { printf "del : can't find admin '$adm'\n" ; } elsif ( $opt{f} ) { print del_user $db, $adm ; } else { print "WOULD delete admin $adm\n" ; } } printf "current admins:\n %s\n", ( join ', ', find_users $db ) || 'none' if ! $opt{q} and $opt{f} and ( $opt{add} or $opt{del} ) ;