#!/usr/bin/env perl # # ios-ownership check/adjust Image and OS ownership # 16-Mar-2020 chuck@ece.cmu.edu # use strict; use Getopt::Long qw(:config require_order); ############################################################################## # # global default config (edit to change the defaults) # my($g_db, $g_mysql); $g_db = "tbdb"; $g_mysql = "/usr/local/bin/mysql"; ############################################################################## # # helper functions # # # load_usr_idx(datbase,mysql,user) # sub load_usr_idx { my($db, $msq, $user) = @_; my($cmd, $fh, $cnt, $idx); $cmd = sprintf "'select uid_idx from users where uid=\"%s\"'", $user; unless (open($fh, "$msq $db -N -e $cmd |")) { print "load_usr_idx: pipe open failed ($!)\n"; return(0); } $cnt = 0; while (<$fh>) { chop; $idx = int($_); $cnt++; } close($fh); die "load_usr_idx: failed for user $user ($cnt)" unless ($cnt == 1 && $idx > 0); return($idx); } # # list_info(table,type,want,des,prj,usr) # sub list_info { my($tab, $typ, $wnt, $des, $prj, $usr) = @_; my($cmd, $fh, $cnt); $cmd = sprintf "'select %s from %s'", "$wnt,pid,creator,creator_idx", $tab; unless (open($fh, "$g_mysql $g_db -N -e $cmd |")) { print "list: pipe open failed ($!)\n"; die "fatal error"; } $cnt = 0; while (<$fh>) { chop; my($name,$pid,$cre,$crei) = split(/\t/); next if ($des ne '' && $name ne $des); next if ($prj ne '' && $pid ne $prj); next if ($usr ne '' && $cre ne $usr); printf "$typ listing\n%32s%16s%16s %s\n", 'name', 'pid', 'cre', 'creidx' if ($cnt == 0); printf "%32s%16s%16s %d\n", $name, $pid, $cre, $crei; $cnt++; } close($fh); return(0); } # # main block # $| = 1; my($rv, $desc, $iflag, $oflag, $proj, $newowner, $user); $rv = GetOptions ( 'd|descriptor=s' => \$desc, 'i|image' => \$iflag, 'n|newowner=s' => \$newowner, 'o|osinfo' => \$oflag, 'p|proj=s' => \$proj, 'u|user=s' => \$user, ); sub usage { my($err) = @_; print "$err\n\n" if (defined($err)); print "usage: ios-ownership [options]\n"; print "where options are:\n"; print "\t-d / --descriptor [d] descriptor of interest\n"; print "\t-i / --image list images only\n"; print "\t-n / --newowner [n] set new owner for matching images\n"; print "\t-o / --osinfo list os_info only\n"; print "\t-p / --proj [p] project of interest\n"; print "\t-u / --user [u] user of interest (old user for upd)\n"; print "\n"; print "Must specify '-p' and '-u' for setting new owner with '-n'\n"; print "The -i/-o flags are only used for listing (i.e. no -n flag)\n"; exit(1); } usage() if ($rv != 1 || $#ARGV >= 0); usage("cannot use -i/-i with -n") if ($newowner ne '' && ($iflag || $oflag)); usage("cannot spec both -i and -o") if ($iflag && $oflag); usage("must specify -p, and -u when using -n") if ($newowner ne '' && ($proj eq '' || $user eq '')); my($newidx, $table, $type, $want, $cmd, $cmd2, $fh, $cnt, $xtra); if ($newowner ne '') { $newidx = load_usr_idx($g_db, $g_mysql, $newowner); # printf "(new owner %s has index %d)\n", $newowner, $newidx; } # just listing info? if ($newowner eq '') { list_info("image_versions", "image", "imagename", $desc, $proj, $user) unless ($oflag); print "\n"; list_info("os_info_versions", "os info", "osname", $desc, $proj, $user) unless ($iflag); print "\n(use -h for command line usage)\n"; exit(0); } # changing ownership print "Set new creator to $newowner ($newidx) for all that match:\n"; print "\tname = $desc\n" if ($desc ne ''); print "\tproject = $proj\n"; print "\told creator = $user\n"; $xtra = sprintf " and osname=\"%s\"", $desc if ($desc ne ''); $cmd = sprintf "'update %s set creator=\"%s\", creator_idx=\"%d\" where " . "pid=\"%s\" and creator=\"%s\"%s'", "os_info_versions", $newowner, $newidx, $proj, $user, $xtra; $xtra = sprintf " and imagename=\"%s\"", $desc if ($desc ne ''); $cmd2 = sprintf "'update %s set creator=\"%s\", creator_idx=\"%d\" where " . "pid=\"%s\" and creator=\"%s\"%s'", "image_versions", $newowner, $newidx, $proj, $user, $xtra; print "\nsleep 5...\n"; # debug ### print "the commands are:\n$cmd\n\n$cmd2\n"; sleep(5); unless (open($fh, "$g_mysql $g_db -N -e $cmd |")) { print "update: pipe open failed ($!)\n"; die "fatal error"; } while (<$fh>) { print; } close($fh); unless (open($fh, "$g_mysql $g_db -N -e $cmd2 |")) { print "update: pipe open failed ($!)\n"; die "fatal error"; } while (<$fh>) { print; } close($fh); print "done\n"; exit(0);