prt-auf: improved the handling of locked ports
This commit is contained in:
parent
6356b9f98c
commit
6162bf44d9
@ -14,7 +14,7 @@ use strict;
|
||||
my $title="prt-auf"; my $version=0.5;
|
||||
my $CONFDIR = "/var/lib/pkg"; my $prtalias="/etc/prt-get.aliases";
|
||||
my $pkgdb="$CONFDIR/db"; my $prtlocker="$CONFDIR/prt-get.locker";
|
||||
my $prtcache="$CONFDIR/prt-get.cache"; my $LOCKED; my %ALIASES; my %DEPENDS;
|
||||
my $prtcache="$CONFDIR/prt-get.cache"; my @LOCKED; my %ALIASES; my %DEPENDS;
|
||||
my @allports; my %V_REPO; my %V_INST; my %DESC;
|
||||
my @results; my $strf; my $ind; my $hh; my $portpath; my $built_pkg;
|
||||
my %osearch = ( cache => 0, regex => 0, path => 0, exact => 0, verbose => 0 );
|
||||
@ -43,7 +43,7 @@ if ($action !~ /^(quickdep|search|dsearch|fsearch|info|dup|readme|cat)$/) {
|
||||
close (DB);
|
||||
}
|
||||
|
||||
if ($action =~ /^(diff|quickdiff|listlocked|depends|deptree|install|update|depinst|sysup)$/) {
|
||||
if ($action =~ /^(diff|quickdiff|listlocked|depends|deptree|remove|install|update|depinst|sysup)$/) {
|
||||
get_locked_and_aliased();
|
||||
}
|
||||
|
||||
@ -184,11 +184,11 @@ sub parse_args {
|
||||
my @query;
|
||||
$osearch{cache} = 1 if ($0 =~ /cache$/);
|
||||
while (my $arg = shift) {
|
||||
if ($arg =~ /^(search|dsearch|fsearch|path|info|list|dup)$/) { $action = $1;
|
||||
if ($arg =~ /^(search|dsearch|fsearch|path|info|list|remove)$/) { $action = $1;
|
||||
} elsif ($arg =~ /^(install|update|depinst|grpinst|sysup)$/) { $action = $1;
|
||||
} elsif ($arg =~ /^(lock|unlock|listlocked|current|isinst)$/) { $action = $1;
|
||||
} elsif ($arg =~ /^(diff|quickdiff|listinst|listorphans)$/) { $action = $1;
|
||||
} elsif ($arg =~ /^(depends|deptree|quickdep|dependent)$/) { $action = $1;
|
||||
} elsif ($arg =~ /^(depends|deptree|quickdep|dependent|dup)$/) { $action = $1;
|
||||
} elsif ($arg =~ /^(readme|cat|edit|ls|help|version|cache)$/) { $action = $1;
|
||||
} elsif ($arg eq "--tree") { $odepends{tree} = 1; $odepends{recursive} = 1;
|
||||
} elsif ($arg eq "--all") { $odepends{all} = 1;
|
||||
@ -200,14 +200,15 @@ sub parse_args {
|
||||
} elsif ($arg eq "--cache") { $osearch{cache} = 1;
|
||||
} elsif ($arg eq "--test") { $opkg{test} = "yes";
|
||||
} elsif ($arg eq "-fr") { $opkg{margs} .= " -f";
|
||||
} elsif ($arg =~ /^(-uf|-if|-us|-is|-ns|-kw)$/) { $opkg{margs} .= $1;
|
||||
} elsif ($arg =~ /^(-uf|-if|-us|-is|-ns|-kw)$/) { $opkg{margs} .= " $1";
|
||||
} elsif ($arg =~ /^--margs=(.*)/) { $opkg{margs} .= $1;
|
||||
} elsif ($arg =~ /^--aargs=(-r|--root)=(.*)/) { $opkg{aargs} .= "$1 $2";
|
||||
} elsif ($arg =~ /^--rargs=(-r|--root)=(.*)/) { $opkg{rargs} .= "$1 $2";
|
||||
} elsif ($arg =~ /^-/) {
|
||||
print "'$arg' is not a recognized option.\n"; exit 1;
|
||||
print "'$arg' is not a recognized option.\n";
|
||||
} else { push (@query, $arg); }
|
||||
}
|
||||
if (! $action) { print_help(); }
|
||||
if (($#query > -1) and
|
||||
($action =~ /^(diff|quickdiff|cache|list|dup|sysup)/)) {
|
||||
print "warning: $1 takes no arguments; ignoring those given.\n";
|
||||
@ -281,12 +282,16 @@ sub find_dups {
|
||||
|
||||
sub get_locked_and_aliased {
|
||||
local $/ = "\n";
|
||||
open (AL, $prtalias) or return;
|
||||
while (<AL>) { $ALIASES{$1} = $2 if m/^\s*(.*)\s*:\s*(.*)/; }
|
||||
close (AL);
|
||||
open (LK, $prtlocker) or return;
|
||||
while (<LK>) { $LOCKED .= " $_"; }
|
||||
close (LK);
|
||||
if (-f $prtalias) {
|
||||
open (AL, $prtalias);
|
||||
while (<AL>) { $ALIASES{$1} = $2 if m/^\s*(.*)\s*:\s*(.*)/; }
|
||||
close (AL);
|
||||
}
|
||||
if (-f $prtlocker) {
|
||||
open (LK, $prtlocker) or return;
|
||||
while (<LK>) { push (@LOCKED, $_) unless /^\s*$/; }
|
||||
close (LK);
|
||||
}
|
||||
}
|
||||
|
||||
sub who_aliased_to {
|
||||
@ -368,7 +373,7 @@ sub get_pkgfile_fields {
|
||||
|
||||
if (shift) {
|
||||
return $Name, $portpath, $Version, $Release, $descrip, $Dependencies, $url,
|
||||
$packager, $maintainer, $readme, $preInstall, $postInstall, $built_pkg;
|
||||
$packager, $maintainer, $readme, $preInstall, $postInstall;
|
||||
} else { return $Version, $Release, $descrip, $Dependencies; }
|
||||
}
|
||||
|
||||
@ -411,7 +416,6 @@ sub find_port_by_name {
|
||||
my $query = shift; my $exact=shift; my $fullpath=shift; my $exhaustive=shift;
|
||||
$query =~ s/\+/\\\+/g unless ($osearch{regex}==1);
|
||||
$query =~ s/\./\\\./g unless ($osearch{regex}==1);
|
||||
# $query =~ s/\^/\// if (($osearch{regex}==1) and ($exact==0));
|
||||
my $pattern = ($exact==1) ? qr/^$query$/s : qr/$query/is;
|
||||
my %names_only = map { ($_ => (split /\//, $_)[-1]) } @allports;
|
||||
my @hits = grep { $names_only{$_} =~ $pattern } @allports;
|
||||
@ -430,13 +434,14 @@ sub uninstall {
|
||||
foreach my $t (@targets) {
|
||||
($opkg{test} eq "no") ? system($PKGRM,$opkg{rargs},$t) : print "$PKGRM $opkg{rargs} $t\n";
|
||||
$removed{$t}=1 if ($?>>8 == 0);
|
||||
if ((" $LOCKED " =~ / $t /) and ($opkg{test} eq "no")) { port_unlock($t); }
|
||||
if ((grep /^$t$/, @LOCKED) and ($opkg{test} eq "no")) { port_unlock($t); }
|
||||
}
|
||||
return \%removed;
|
||||
}
|
||||
|
||||
sub port_lock {
|
||||
my @newlocks = grep { " $LOCKED " !~ / $_ / } @_;
|
||||
my %oldlocks = map { $_ => "L" } @LOCKED;
|
||||
my @newlocks = grep { ! defined $oldlocks{$_} } @_;
|
||||
if (@newlocks) {
|
||||
open (LK,'>>',$prtlocker) or die "cannot open $prtlocker for writing.\n";
|
||||
foreach my $lp (@newlocks) {
|
||||
@ -447,10 +452,10 @@ sub port_lock {
|
||||
}
|
||||
|
||||
sub port_unlock {
|
||||
foreach my $ul (@_) { $LOCKED =~ s/ $ul / /; }
|
||||
my @newlocks = split / /, $LOCKED;
|
||||
my %unlocks = map { $_ => "U" } @_;
|
||||
my @newlocks = grep { ! defined $unlocks{$_} } @LOCKED;
|
||||
open (LL, $prtlocker."-tmp",">");
|
||||
foreach my $nl (@newlocks) { print LL "$nl\n"; }
|
||||
foreach my $nl (@newlocks) { print LL "$nl\n" unless $nl =~ /^\s*$/; }
|
||||
close (LL);
|
||||
system ("mv",$prtlocker."-tmp",$prtlocker);
|
||||
}
|
||||
@ -471,7 +476,7 @@ sub list_ports {
|
||||
push (@found, $lp) if (-f "$lp/Pkgfile");
|
||||
}
|
||||
} elsif ($filter eq "inst") { @found = keys %V_INST;
|
||||
} elsif ($filter eq "locked") { @found=split / /, $LOCKED;
|
||||
} elsif ($filter eq "locked") { @found=@LOCKED;
|
||||
} elsif ($filter =~ /^(orphans|dependent)$/) {
|
||||
my $seed=shift;
|
||||
if ( ((! $seed) and ($filter eq "dependent")) or
|
||||
@ -538,7 +543,7 @@ sub port_diff { # returns a scalar indicating how many differences were found
|
||||
if ($dtype !~ /^(current|isinst|utd)/) {
|
||||
printf "$format", "Port", "Installed", "In Repository" if (! $dtype);
|
||||
foreach my $p (keys %V_INST) {
|
||||
next if (($LOCKED =~ /$p/) and ($odepends{all}==0));
|
||||
next if ((grep /$p/, @LOCKED) and ($odepends{all}==0));
|
||||
$lastcol = ($V_REPO{$p}) ? $V_REPO{$p} : "MISSING!";
|
||||
|
||||
if ($lastcol ne $V_INST{$p}) {
|
||||
@ -619,17 +624,17 @@ sub deporder {
|
||||
}
|
||||
|
||||
sub up_inst { # returns scalar references to five arrays;
|
||||
my $type=shift; my @requested=@_;
|
||||
my $type=shift; my @requested=@_; my %EXEMPT; my %WANTED;
|
||||
my $PKGMK=$opkg{makecommand}; my $PKGADD=$opkg{addcommand};
|
||||
my $SUDO="/usr/bin/doas"; my $FAKEROOT="/usr/bin/fakeroot";
|
||||
|
||||
$SUDO = (-x $SUDO) ? $SUDO : "/usr/bin/sudo";
|
||||
$SUDO = (-x $SUDO) ? $SUDO : "/usr/bin/su -c";
|
||||
$FAKEROOT = (-x $FAKEROOT) ? $FAKEROOT : "/usr/bin/su -c";
|
||||
$FAKEROOT = (-x $FAKEROOT) ? $FAKEROOT : $SUDO;
|
||||
|
||||
# prepend commands with sudo/doas/fakeroot if the effective user id is not root
|
||||
if ($> != 0) { $PKGADD = "$SUDO $PKGADD";
|
||||
$PKGMK = "$FAKEROOT $PKGMK"; }
|
||||
if ($> != 0) { $PKGADD = "$SUDO $PKGADD"; }
|
||||
# $PKGMK = "$FAKEROOT $PKGMK"; }
|
||||
|
||||
# resolve all dependencies unless the command was 'grpinst'
|
||||
my @targets=($type eq "grpinst") ? @_ : deporder("quickdep",@_);
|
||||
@ -638,9 +643,11 @@ sub up_inst { # returns scalar references to five arrays;
|
||||
@targets = grep { (join " ", @allports) =~ / $_ / } @targets if ($type eq "grpinst");
|
||||
|
||||
# exempt any locked ports from an sysup operation
|
||||
if ($action eq "sysup") { @targets = grep {" $LOCKED " !~ / $_ /} @targets;
|
||||
%EXEMPT = map { $_ => 0 } @LOCKED;
|
||||
%WANTED = map { $_ => 1 } @requested;
|
||||
if ($action eq "sysup") { @targets = grep {defined $EXEMPT{$_}} @targets;
|
||||
} else {
|
||||
@targets = grep {(" $LOCKED " !~ / $_ /) or (grep /$_/, @requested)} @targets;
|
||||
@targets = grep {(defined $EXEMPT{$_}) or (defined $WANTED{$_})} @targets;
|
||||
}
|
||||
|
||||
# first determine the directories from which pkgmk must be called
|
||||
@ -710,7 +717,7 @@ sub sysup {
|
||||
|
||||
sub find_built_pkg {
|
||||
my $target = shift; my $CONF="/etc/pkgmk.conf"; local $/="\n";
|
||||
my $COMPRESSION; my $PKG_DIR; my $portpath = (find_port_by_name($target,1,1,0))[0];
|
||||
my $COMPRESSION; my $PKG_DIR; my $portpath = (find_port_by_name($target,1,1,0));
|
||||
my ($version, $release) = (get_pkgfile_fields($portpath))[0..1];
|
||||
|
||||
open (CF,$CONF) or return;
|
||||
|
Loading…
Reference in New Issue
Block a user