#!/usr/bin/perl
#
# Interactive script for deinstalling 'leaf' FreeBSD packages.
#
# Copyright (c) 2007 Artem A. Kolpakov <artem.kolpakov at gmail.com>
#
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
$dbdir="/var/db/pkg";
die "Usage: pkg_deinstall.pl \'package_name\' or \'$dbdir/package_name\'.\n" if(!defined($ARGV[0]));
$pkg=$ARGV[0];
if(map /$dbdir/, $pkg) {
$pkg=~/$dbdir\/(\S+[^\/])/; $pkg=$1;
}
die "$pkg is not installed!\n" if((!map /\S+\d/, $pkg)||(!-e "$dbdir/$pkg"));
if(-w $dbdir) { $rw=1; } else { $rw=0; }
if(-s "$dbdir/$pkg/+REQUIRED_BY") {
open(REQ, "$dbdir/$pkg/+REQUIRED_BY");
while(<REQ>) { print "Found required dependence: $_"; $req_sum++; }
close(REQ);
}
die "Required dependencies: $req_sum. Remove is impossible.\n" if($req_sum);
open(DEP, "$dbdir/$pkg/+CONTENTS");
while(<DEP>) {
if(/\@pkgdep\s(\S+)\n/) {
$pkg_depends{$1}=1; print "Dependence: $1\n";
}
}
close(DEP);
die "You have not privilegies to complete operation.\n" if(!$rw);
$dep_sum=(keys %pkg_depends);
if($dep_sum) {
print "Total dependencies: $dep_sum. Removing package.\n";
}
else {
system "pkg_delete $pkg";
die "The package has been removed.\n";
}
system "pkg_delete $pkg";
print "Done, processing...\n";
while(scalar(keys %pkg_depends)) {
$level++;
if($level > 1) {
for $pkg_depends (keys %pkg_depends) {
if($pkg_depends{$pkg_depends} == $level-1) {
if(-e "$dbdir/$pkg_depends/+CONTENTS") {
open(DEP, "$dbdir/$pkg_depends/+CONTENTS");
while(<DEP>) {
if(/\@pkgdep\s(\S+)\n/) {
$pkg_depends{$1}=$level;
}
}
close(DEP);
open(COMMENT, "$dbdir/$pkg_depends/+COMMENT");
chomp($comment=<COMMENT>); close(COMMENT);
dialog:
print "Are you sure want to remove \'$pkg_depends\'? \- \'$comment\' [Y/n]: ";
chomp($in=<STDIN>);
if(($in eq "y")||($in eq "Y")||($in eq '')) {
system "pkg_delete $pkg_depends";
delete $pkg_depends{$pkg_depends}; $rm_dep_sum++;
}
elsif(($in eq "n")||($in eq "N")) {
delete $pkg_depends{$pkg_depends};
}
else { goto dialog; }
}
else {
delete $pkg_depends{$pkg_depends};
}
}
}
}
for $pkg_depends (keys %pkg_depends) {
if($pkg_depends{$pkg_depends} == $level) {
if(-s "$dbdir/$pkg_depends/+REQUIRED_BY") {
delete $pkg_depends{$pkg_depends};
}
}
}
}
if($rm_dep_sum) {
print "Removed $rm_dep_sum dependencies.\n";
}
else { print "No dependencies removed.\n"; }
|