The OpenNET Project
 
Поиск (ключи):    ПРОГРАММЫ СТАТЬИ СОВЕТЫ ФОРУМ
  WIKI НОВОСТИ (+) MAN'ы ДОКУМЕНТАЦИЯ

Скрипт деинсталляции пакетов во FreeBSD вместе с зависимостями.
#!/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"; }
 
04.07.2007 , Автор: Artem A. Kolpakov
Раздел:    Корень / Администратору / Система / FreeBSD специфика / Установка и апгрейд FreeBSD и приложений.

Обсуждение [ RSS ]
 
  • 1.1, ws, 19:42, 06/07/2007 [ответить] [смотреть все]
  • +/
    А что pkg_delete -r name уже не в моде?
     
     
  • 2.4, Artem A. Kolpakov, 16:52, 10/07/2007 [^] [ответить] [смотреть все]
  • +/
    >А что pkg_delete -r name уже не в моде?

    "pkg_delete -r" здесь непричем. Будте внимательны.

     
     
  • 3.10, ws, 14:26, 23/07/2007 [^] [ответить] [смотреть все]
  • +/
    Прошу прощения. Не сразу понял - ваш скрипт делает обратное действие...
     
  • 1.2, ws, 20:23, 06/07/2007 [ответить] [смотреть все]
  • +/
    а надо обязательно свой пятак сунуть? Не,не в моде.
     
  • 1.3, rootuas, 23:07, 06/07/2007 [ответить] [смотреть все]
  • +/
    Мда, и правда  - зачем тогда вообще пишут ports-mgmt ?
     
  • 1.5, luka, 13:49, 11/07/2007 [ответить] [смотреть все]  
  • +/
    Интересный скрипт, нужно будет опробовать.

    2ws, вы уж меня простите, но не стоит комментировать то, в чем не сильно разбираетесь....

     
  • 1.6, grayich, 14:46, 14/07/2007 [ответить] [смотреть все]  
  • +/
    /usr/ports/ports-mgmt/pkg_rmleaves/
     
  • 1.7, grv, 20:12, 14/07/2007 [ответить] [смотреть все]  
  • +/
    А руководство по использованию скрипта будет или я совсем ничего не понял --... весь текст скрыт [показать]
     
     
  • 2.9, savant, 20:58, 15/07/2007 [^] [ответить] [смотреть все]  
  • +/
    AFAIK это BSD-like
     
  • 1.8, vantoo, 17:36, 15/07/2007 [ответить] [смотреть все]  
  • +/
    Здесь люди не дискуссируют, а работают, все дискусси на ЛОР
     

    Ваш комментарий
    Имя:         
    E-Mail:      
    Заголовок:
    Текст:

     Добавить заметку
     Версия для печати
     
     Поиск заметки:
     

    Последние заметки
    - 12.05 Организация шифрованного бэкапа с помощью rdiff-backup, encfs и Dropbox
    - 11.05 Настройка беспроводного соединения в Debian GNU/Linux
    - 07.05 Использование Google Drive в Linux
    - 18.04 Использование нескольких сетевых стеков в Linux
    - 15.04 Восстановление стандартного KDE меню после его удаления (например, wine)
    - 11.04 Настройка gmirror при использовании GPT во FreeBSD 9
    - 09.04 Маршрутизатор на базе FreeBSD с приоритизация трафика средствами PF и ALTQ
    - 02.04 Частичное восстановление данных MySQL из бэкапа, созданного с использованием LVM
    - 21.03 Настройка DNSSEC в BIND 9.9
    - 17.03 Набор номера на Cisco IP Phone 7960/7940 из скрипта
    RSS | Следующие 15 записей >>


    ПОДПИШИСЬ НА ЖУРНАЛ Linux Format 2012!

    Журнал "Linux Format" (Линукс Формат)- Единственный в России и странах СНГ журнал на русском языке, посвящённый Linux и свободному ПО. Журнал для IT-директоров, IT-менеджеров, программистов, системных администраторов, учителей школ и преподавателей ВУЗов и всех пользователей ПК. В каждом выпуске: Новости индустрии OpenSource, обзоры новинок свободного ПО, обучающие и методические статьи.

    Каждый, кто оформит подписку, получает бонусы и подарки- объёмные наклейки на системный блок, диск с архивом номеров за 2005-2011 г.г. и ежемесячно электронную версию журнала в pdf-формате.

    Оформить подписку на год


      Закладки на сайте
      Проследить за страницей
    Created 1996-2012 by Maxim Chirkov  
    ДобавитьРекламаВебмастеруГИД  
    RUNNet TopList