#!/usr/bin/perl #- Mandriva cryptographic package hdlist and depslist generation tools. #- Copyright (C) 1999-2005 Mandriva (fpons@mandriva.com) #- #- This program is free software; you can redistribute it and/or modify #- it under the terms of the GNU General Public License as published by #- the Free Software Foundation; either version 2, or (at your option) #- any later version. #- #- This program is distributed in the hope that it will be useful, #- but WITHOUT ANY WARRANTY; without even the implied warranty of #- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #- GNU General Public License for more details. #- #- You should have received a copy of the GNU General Public License #- along with this program; if not, write to the Free Software #- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #- usage: gencryptofiles <crypto_dir> #- build an hdlist and depslist file for crypto, need rpmtools also. my %resolver = ( '/bin/sh' => 'bash', '/bin/bash' => 'bash', '/usr/bin/perl' => 'perl', '/usr/bin/perl5' => 'perl', 'libBrokenLocale.so' => 'glibc', 'libICE.so' => 'XFree86-libs', 'libSM.so' => 'XFree86-libs', 'libX11.so' => 'XFree86-libs', 'libXext.so' => 'XFree86-libs', 'libXmu.so' => 'XFree86-libs', 'libXpm.so' => 'xpm', 'libXt.so' => 'XFree86-libs', 'libc.so.6' => 'glibc', 'libgdbm.so' => 'gdbm', 'libgpm.so' => 'gpm', 'libm.so' => 'glibc', 'libncurses.so' => 'ncurses', 'libnsl.so' => 'glibc', 'libpam.so' => 'pam', 'libpthread.so' => 'glibc', 'libreadline.so' => 'readline', 'libstdc++-libc6.1-2.so' => 'libstdc++', 'libstdc++.so' => 'libstdc++-compat', 'libutil.so' => 'glibc', 'libz.so' => 'zlib', 'smtpdaemon' => 'postfix', ); sub gendepslist_crypto { my ($dir) = @_; my %depslist; #- get information about each rpm. local *DIR; opendir DIR, $dir or die "cannot open directory: $!\n"; while ($_ = readdir DIR) { my ($key) = /(.*)\..*\.rpm$/ or next; my ($name) = /(.*)-[^-]*-[^-]*-/; my $size = `rpm -qp --queryformat="%{SIZE}" $dir/$_`; my @filelist = split "\n", `rpm -qpl $dir/$_`; my @requires = split "\n", `rpm -qpR $dir/$_`; $depslist{$key} = { key => $key, size => $size, filelist => \@filelist, requires => \@requires, deps => [], }; foreach (@filelist) { $resolver{$_} = $name; m|.*/([^/]*)$| and $resolver{$1} = $name; } } close DIR; #- resolve the dependancies. foreach my $pkg (values %depslist) { foreach (@{$pkg->{requires}}) { $resolver{$_} and push(@{$pkg->{deps}}, $resolver{$_}), next; m|^([^\s\(]*)| and $resolver{$1} and push(@{$pkg->{deps}}, $resolver{$1}), next; m|^.*/([^/\s\(]*)| and $resolver{$1} and push(@{$pkg->{deps}}, $resolver{$1}), next; m|^([^\s\(]*\.so)| and $resolver{$1} and push(@{$pkg->{deps}}, $resolver{$1}), next; m|^.*/([^\s\(]*\.so)| and $resolver{$1} and push(@{$pkg->{deps}}, $resolver{$1}), next; m|^([\w-]*)(?:\s+.*)$| and push(@{$pkg->{deps}}, $1); #- last and default to package name. } } #- build depslist-crypto file. local *F; open F, ">$dir/depslist-crypto" or die "cannot open depslist-crypto file for writing: $!\n"; foreach (values %depslist) { my %deps; @deps{@{$_->{deps}}} = (); print F "$_->{key} $_->{size} ", join(" ", keys %deps), "\n"; } close F; } sub main { my ($dir) = @_; -d $dir or die "usage: gencryptofiles <crypto_dir>\n"; -x "/usr/bin/genhdlist_cz2" or die "I need rpmtools to work (ie /usr/bin/genhdlist_cz2)\n"; print `genhdlist_cz2 -o $dir/hdlist-crypto.cz2 $dir`; gendepslist_crypto($dir); } main(@ARGV);