cfe45dadae
Signed-off-by: Dean Troyer <dtroyer@gmail.com>
123 lines
2.9 KiB
Perl
Executable File
123 lines
2.9 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
|
|
# Copy/pasted from http://www.smorgasbork.com/content/gather_packages.txt
|
|
# As referenced by http://www.smorgasbork.com/2012/01/04/building-a-custom-centos-7-kickstart-disc-part-2/
|
|
|
|
use XML::Simple;
|
|
|
|
my ($comps_file, $rpm_src_path, $rpm_dst_path, $arch, @extra_groups_and_packages) = @ARGV;
|
|
|
|
if (!-e $comps_file)
|
|
{
|
|
print_usage ("Can't find '$comps_file'");
|
|
}
|
|
if (!-e $rpm_src_path)
|
|
{
|
|
print_usage ("RPM source path '$rpm_src_path' does not exist");
|
|
}
|
|
if (!-e $rpm_dst_path)
|
|
{
|
|
print_usage ("RPM destination path '$rpm_dst_path' does not exist");
|
|
}
|
|
if (!$arch)
|
|
{
|
|
print_usage ("Architecture not specified");
|
|
}
|
|
|
|
#### we always gather core and base; note that for CentOS 7, we also need
|
|
#### to include the grub2 package, or installation will fail
|
|
@desired_groups = ('core', 'base', 'grub2');
|
|
foreach (@extra_groups_and_packages)
|
|
{
|
|
push (@desired_groups, $_);
|
|
}
|
|
|
|
$regex = '^(' . join ('|', @desired_groups) . ')$';
|
|
|
|
print "reading $comps_file...\n";
|
|
print "getting RPMs from $rpm_src_path...\n";
|
|
|
|
$xml = new XML::Simple;
|
|
$comps = $xml->XMLin($comps_file);
|
|
|
|
$cmd = "rm $rpm_dst_path/*";
|
|
print "$cmd\n";
|
|
`$cmd`;
|
|
|
|
%copied_groups = {};
|
|
%copied_packages = {};
|
|
|
|
foreach $group (@{$comps->{group}})
|
|
{
|
|
$id = $group->{id};
|
|
if ($id !~ m#$regex#)
|
|
{
|
|
next;
|
|
}
|
|
|
|
print "#### group \@$id\n";
|
|
$packagelist = $group->{packagelist};
|
|
foreach $pr (@{$packagelist->{packagereq}})
|
|
{
|
|
if ($pr->{type} eq 'optional' || $pr->{type} eq 'conditional')
|
|
{
|
|
next;
|
|
}
|
|
|
|
$cmd = "cp $rpm_src_path/" . $pr->{content} . "-[0-9]*.$arch.rpm"
|
|
. " $rpm_src_path/" . $pr->{content} . "-[0-9]*.noarch.rpm $rpm_dst_path";
|
|
print "$cmd\n";
|
|
`$cmd 2>&1`;
|
|
|
|
$copied_packages{$pr->{content}} = 1;
|
|
}
|
|
|
|
$copied_groups{$group} = 1;
|
|
}
|
|
|
|
#### assume that any strings that weren't matched in the comps file's group list
|
|
#### are actually packages
|
|
|
|
foreach $group (@desired_groups)
|
|
{
|
|
if ($copied_groups{$group})
|
|
{
|
|
next;
|
|
}
|
|
|
|
$cmd = "cp $rpm_src_path/" . $group . "-[0-9]*.$arch.rpm"
|
|
. " $rpm_src_path/" . $group . "-[0-9]*.noarch.rpm $rpm_dst_path";
|
|
print "$cmd\n";
|
|
`$cmd 2>&1`;
|
|
}
|
|
|
|
sub print_usage
|
|
{
|
|
my ($msg) = @_;
|
|
|
|
($msg) && print "$msg\n\n";
|
|
|
|
print <<__TEXT__;
|
|
|
|
parse_comps.pl comps_file rpm_src_path arch [xtra_grps_and_pkgs]
|
|
|
|
comps_file the full path to the comps.xml file (as provided
|
|
in the original distro
|
|
|
|
rpm_src_path the full path to the directory of all RPMs from
|
|
the distro
|
|
|
|
rpm_dst_path the full path to the directory where you want
|
|
to save the RPMs for your kickstart
|
|
|
|
arch the target system architecture (e.g. x86_64)
|
|
|
|
xtra_grps_and_pkgs a list of extra groups and packages, separated by spaces
|
|
|
|
|
|
__TEXT__
|
|
|
|
exit;
|
|
}
|
|
|