The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Пользователям Slackware (может пригодится)"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы OpenNET: Виртуальная конференция (Public)
Изначальное сообщение [ Отслеживать ]

"Пользователям Slackware (может пригодится)"  
Сообщение от tux2002 email on 08-Янв-09, 11:33 
#!/usr/bin/perl -w
######################################################################################
# 07.01.2009
# mailto:tux2002@front.ru
# Script print to STDOUT simple dependencies of package (on Slackware distribution)
# example cat /var/adm/packages/vim-7.2.018-i486-1 | ./pkgdep.pl
# STDOUT format:
# package_name:warnings(misiing librares):dep_package_name1 dep_package_name2 warnings(not found packages)
######################################################################################

my $pkgname = "";

my $grepcmd = "/usr/bin/grep";
my $testcmd = "/usr/bin/test";
my $lddcmd = "/usr/bin/ldd";

my $pkgdir = "/var/adm/packages/";
my $scriptdir = "/var/adm/scripts/";

my %librares;
my %packages;
my $pkgline;

while (<>){
    my $file = "\/".$_;
    $file =~ s/\s$//;    
    next if (/\"/);
    next if (/\'/);
    next if (/^$/);
    my $ret = system("$testcmd -x \"$file\" -a -f \"$file\"");

    if (/^PACKAGE\s+NAME:\s+(\S+)$/){
        if ($pkgname){
        show();
        }
        $pkgname = $1;
#        print "$pkgname\n";
    }
    next if ($ret != 0);

#    print "--------------------------------$file-------------------------\n";

    open(my $cmd, "$lddcmd $file 2>/dev/null | ");

    while (<$cmd>){
        if (/ld-linux/){
                   next;
        }
        if (/linux-gate/){
            next;
        }
        if (/^\s(\S+)\s\=\>\s(\S+)\s*\S*$/){
                       my $lib = $1;
                       my $libpath = $2;
            $librares{$lib} = $lib;
#            print "*****************\n";
#            print "$lib\n";
#            print "$libpath\n";
            if ($libpath eq "not"){
                $pkgline.="warning-".$lib."_not_found_lib ";
                next;
            }
            open(my $cmd2, "$lddcmd $libpath 2>/dev/null | ");
            while (<$cmd2>){
                if (/ld-linux/){
                           next;
                }
                if (/linux-gate/){
                    next;
                }
                if (/^\s(\S+)\s\=\>\s(\S+)\s*\S*$/){
                    my $nlib = $1;
                    $librares{$nlib} = $nlib;
#                    print "$nlib\n";
                }
                   }
            close($cmd2);
        }
    }
    close($cmd);
}

if ($pkgname){
    show();
}


sub show {
    $pkgline = $pkgname.":";
    $pkgline .= ":";
    foreach my $key (keys %librares){
    my $search=$key;
    my $found = 0;
    my $pkg;
    my $foundpkg;
    my %pkghash;
#    print "search: $search\n";
    open(my $cmd, "$grepcmd \"$search\" $pkgdir\* | ");
    while(<$cmd>){
        if (/$search/){
            $found = 1;
            $_=~/.*\/(\S+):.*/;
            $pkg = $1;
#            print "$pkg\n";
            $pkghash{$pkg} = $pkg;
        }
    }
    close($cmd);
    open($cmd, "$grepcmd \"$search\" $scriptdir\* | ");
    while(<$cmd>){
        if (/$search/){
            $found = 1;
            $_=~/.*\/(\S+):.*/;
            $pkg = $1;
#            print "$pkg\n";
            $pkghash{$pkg} = $pkg;            
        }
        }
    close($cmd);
    if ($found == 0){
            $pkg="warning-".$search."_not_found_pkg";
            $pkghash{$pkg} = $pkg;                        
#        print "$pkg\n";
    }
    if ($pkghash{$pkgname}){
    } else {
        foreach my $key2 (keys %pkghash){
#            print "$key2\n";
            $foundpkg .= "|".$key2;
        }
        $foundpkg =~ s/^\|//;
#        print "$foundpkg\n";
        $packages{$foundpkg} = $foundpkg;
    }
    }
    foreach my $key (keys %packages){
#    print "$key\n";
    $pkgline.="$key ";
    }
    %librares = ();
    %packages = ();
    $pkgline =~ s/\s$//;
    print "$pkgline\n";
    $pkgname = "";
    
}

################################################################

Конвертяшка в xml:
dep2xml.sh:

#/bin/bash
######################################################################################
# 07.01.2009
# mailto:tux2002@front.ru
# Script print to STDOUT xml version  SDOUT of pkgdep.pl
# example cat /var/adm/packages/* | ./pkgdep.pl | ./dep2xml.sh
######################################################################################
echo "<packages>"
while read line
do
    echo $line | /usr/bin/gawk " {split(\$0, a, \":\"); split(a[3], b, \"\ \"); print \"\t<package name='\"a[1]\"'\ warning='\"a[2]\"'>\"; \
    for (c in b) print \"\t\t<dep name='\"b[c]\"'/>\"; print \"\t</package>\"; }" 2>/dev/null
done
echo "</packages>"

##############################################################

Пример:
cat /var/adm/packages/vim* | ./pkgdep.pl | ./dep2xml.sh
<packages>
        <package name='vim-7.2.018-i486-1' warning=''>
                <dep name='acl-2.2.47_1-i486-1|aaa_elflibs-12.2.0-i486-1'/>
                <dep name='ncurses-5.6-i486-3|aaa_elflibs-12.2.0-i486-1'/>
                <dep name='gpm-1.20.1-i486-5|aaa_elflibs-12.2.0-i486-1'/>
                <dep name='glibc-solibs-2.7-i486-17|glibc-2.7-i486-17'/>
                <dep name='attr-2.4.41_1-i486-1|aaa_elflibs-12.2.0-i486-1'/>
        </package>
        <package name='vim-gvim-7.2.018-i486-1' warning=''>
                <dep name='gpm-1.20.1-i486-5|aaa_elflibs-12.2.0-i486-1'/>
                <dep name='libXinerama-1.0.3-i486-1'/>
                <dep name='cairo-1.6.4-i486-1'/>
                <dep name='libpng-1.2.32-i486-1|aaa_elflibs-12.2.0-i486-1'/>
                <dep name='libXau-1.0.4-i486-1'/>
                <dep name='libxcb-1.1-i486-1'/>
                <dep name='zlib-1.2.3-i486-2|aaa_elflibs-12.2.0-i486-1'/>
                <dep name='acl-2.2.47_1-i486-1|aaa_elflibs-12.2.0-i486-1'/>
                <dep name='libXdmcp-1.0.2-i486-1'/>
                <dep name='libXt-1.0.5-i486-1'/>
                <dep name='atk-1.23.5-i486-1'/>
                <dep name='libXcomposite-0.4.0-i486-1'/>
                <dep name='aaa_elflibs-12.2.0-i486-1|freetype-2.3.7-i486-1'/>
                <dep name='glib2-2.16.6-i486-1|aaa_elflibs-12.2.0-i486-1'/>
                <dep name='gtk+2-2.12.12-i486-1|libX11-1.1.5-i486-1'/>
                <dep name='attr-2.4.41_1-i486-1|aaa_elflibs-12.2.0-i486-1'/>
                <dep name='libXfixes-4.0.3-i486-1'/>
                <dep name='libICE-1.0.4-i486-1'/>
                <dep name='fontconfig-2.6.0-i486-2'/>
                <dep name='libXcursor-1.1.9-i486-1'/>
                <dep name='libXext-1.0.4-i486-1'/>
                <dep name='libXdamage-1.1.1-i486-1'/>
                <dep name='ncurses-5.6-i486-3|aaa_elflibs-12.2.0-i486-1'/>
                <dep name='glibc-solibs-2.7-i486-17|glibc-2.7-i486-17'/>
                <dep name='pango-1.20.5-i486-1'/>
                <dep name='libXrandr-1.2.3-i486-1'/>
                <dep name='expat-2.0.1-i486-1|aaa_elflibs-12.2.0-i486-1'/>
                <dep name='libXrender-0.9.4-i486-1'/>
                <dep name='libXi-1.1.3-i486-1'/>
                <dep name='gtk+2-2.12.12-i486-1'/>
                <dep name='pixman-0.12.0-i486-1'/>
                <dep name='libSM-1.0.3-i486-1'/>
        </package>
</packages>

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Пользователям Slackware (может пригодится)"  
Сообщение от tux2002 email on 08-Янв-09, 11:36 
Это по ldd, конечно не всё показывает. На все пакеты работает достаточно долго, но может показывать мусор - отсутствующие so, и so не из пакетов.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Пользователям Slackware (может пригодится)"  
Сообщение от tux2002 email on 08-Янв-09, 11:44 
Можно для бинарника:
(echo "PACKAGE NAME: vim" && echo "usr/bin/vim") | ./pkgdep.pl | ./dep2xml.sh
<packages>
        <package name='vim' warning=''>
                <dep name='acl-2.2.47_1-i486-1|aaa_elflibs-12.2.0-i486-1'/>
                <dep name='ncurses-5.6-i486-3|aaa_elflibs-12.2.0-i486-1'/>
                <dep name='gpm-1.20.1-i486-5|aaa_elflibs-12.2.0-i486-1'/>
                <dep name='glibc-solibs-2.7-i486-17|glibc-2.7-i486-17'/>
                <dep name='attr-2.4.41_1-i486-1|aaa_elflibs-12.2.0-i486-1'/>
        </package>
</packages>
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру