#!/usr/bin/perl -w use strict; my $prog=$0; $0=~s!.*/!!; my $repository=shift || usage(); my $dstdir=shift || usage(); opendir(DIR, $repository) || die("$0: opendir $repository: $!\n"); my @avail=grep { /\.i386\.rpm$/ || /\.noarch\.rpm$/ } readdir(DIR); closedir(DIR) || die("$0: closedir $repository: $!\n"); my %avail; for (@avail) { # NAME VER REL ARCH RPM /^(.*)-[^-]+-[^-]+\.[^\.]+.rpm$/ || die("$0: Couldn't parse RPM name: $_\n"); die("$0: Duplicate RPM for $1: $_ vs $avail{$1}\n") if exists($avail{$1}); $avail{$1}=$_; } my @rpm; while () { chomp; next if $_ eq ""; die("$0: Can't find wanted rpm: $_\n") unless exists($avail{$_}); push(@rpm, $avail{$_}); } die("$0: Can't find destination directory: $dstdir\n") unless (-d $dstdir); die("$0: Destination directory already contains a RedHat installation\n") if (-d "$dstdir/var"); mkdir("$dstdir/var", 0755) && mkdir("$dstdir/var/lib", 0755) && mkdir("$dstdir/var/lib/rpm", 0755) && mkdir("$dstdir/ram", 0755) || die("Couldn't make initial directories in $dstdir: $!\n"); system("rpm", "-r", $dstdir, "--initdb") == 0 || die("rpm --initdb failed (\$?=$?)\n"); my @excludedirs=qw(/etc/locale /usr/lib/locale /usr/share/locale /usr/include /usr/lib/gconv /usr/share/zoneinfo /usr/share/i18n /usr/share/terminfo); system("rpm", "-r", $dstdir, "--excludedocs", (map { ("--excludepath", $_) } @excludedirs), "-ivh", map { "$repository/$_"} @rpm); # == 0 # || die("rpm -i failed (\$?=$?)\n"); system("rm", "-r", "-f", map { "$dstdir/$_" } @excludedirs); sub usage { die("Usage: $0 repository destination-directory\n"); }