#!/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>