summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--installer/OpenSLX/OSSetup/Distro/Base.pm90
-rw-r--r--installer/OpenSLX/OSSetup/Distro/SUSE_10_1.pm52
-rw-r--r--installer/OpenSLX/OSSetup/Distro/SUSE_10_2.pm52
-rw-r--r--installer/OpenSLX/OSSetup/Engine.pm650
-rw-r--r--installer/OpenSLX/OSSetup/MetaPackager/Base.pm68
-rw-r--r--installer/OpenSLX/OSSetup/MetaPackager/yum.pm71
-rw-r--r--installer/OpenSLX/OSSetup/Packager/Base.pm84
-rw-r--r--installer/OpenSLX/OSSetup/Packager/rpm.pm88
-rwxr-xr-xinstaller/slxos-setup143
-rw-r--r--installer/systems/suse101/settings2
-rw-r--r--lib/OpenSLX/Basics.pm2
-rw-r--r--lib/distro-info/suse-10.1/prereqfiles/etc/group33
-rw-r--r--lib/distro-info/suse-10.1/prereqfiles/etc/passwd14
-rw-r--r--lib/distro-info/suse-10.1/prereqfiles/etc/shadow14
-rw-r--r--lib/distro-info/suse-10.1/settings107
-rw-r--r--lib/distro-info/suse-10.1/settings.local8
-rw-r--r--lib/distro-info/suse-10.1/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc17
-rw-r--r--lib/distro-info/suse-10.1/trusted-package-keys/gpg-pubkey-1d061a62-427a396f.asc19
-rw-r--r--lib/distro-info/suse-10.1/trusted-package-keys/gpg-pubkey-307e3d54-44201d5d.asc13
-rw-r--r--lib/distro-info/suse-10.1/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc30
-rw-r--r--lib/distro-info/suse-10.1/trusted-package-keys/gpg-pubkey-9c800aca-40d8063e.asc37
-rw-r--r--lib/distro-info/suse-10.1/trusted-package-keys/pubring.gpgbin0 -> 4330 bytes
-rw-r--r--lib/distro-info/suse-10.2/prereqfiles/etc/group33
-rw-r--r--lib/distro-info/suse-10.2/prereqfiles/etc/passwd14
-rw-r--r--lib/distro-info/suse-10.2/prereqfiles/etc/shadow14
-rw-r--r--lib/distro-info/suse-10.2/settings111
-rw-r--r--lib/distro-info/suse-10.2/settings.local8
27 files changed, 1772 insertions, 2 deletions
diff --git a/installer/OpenSLX/OSSetup/Distro/Base.pm b/installer/OpenSLX/OSSetup/Distro/Base.pm
new file mode 100644
index 00000000..cc0f7fd9
--- /dev/null
+++ b/installer/OpenSLX/OSSetup/Distro/Base.pm
@@ -0,0 +1,90 @@
+# Base.pm - provides empty base of the OpenSLX OSSetup API.
+#
+# (c) 2006 - OpenSLX.com
+#
+# Oliver Tappe <ot@openslx.com>
+#
+package OpenSLX::OSSetup::Distro::Base;
+
+use vars qw($VERSION);
+$VERSION = 1.01; # API-version . implementation-version
+
+use strict;
+use Carp;
+use File::Basename;
+use OpenSLX::Basics;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ confess "Creating OpenSLX::OSSetup::System::Base-objects directly makes no sense!";
+}
+
+sub initialize
+{
+ my $self = shift;
+ my $engine = shift;
+
+ $self->{'engine'} = $engine;
+
+ $self->{'stage1a-binaries'} = {
+ "$openslxConfig{'share-path'}/busybox/busybox" => 'bin',
+ };
+
+ $self->{'stage1b-faked-files'} = [
+ '/etc/mtab',
+ ];
+
+ $self->{'stage1c-faked-files'} = [
+ ];
+}
+
+sub fixPrerequiredFiles
+{
+}
+
+1;
+################################################################################
+
+=pod
+
+=head1 NAME
+
+OpenSLX::OSSetup::System::Base - the base class for all OSSetup backends
+
+=head1 SYNOPSIS
+
+ package OpenSLX::OSSetup::coolnewOS;
+
+ use vars qw(@ISA $VERSION);
+ @ISA = ('OpenSLX::OSSetup::Base');
+ $VERSION = 1.01;
+
+ use coolnewOS;
+
+ sub new
+ {
+ my $class = shift;
+ my $self = {};
+ return bless $self, $class;
+ }
+
+ # override all methods of OpenSLX::OSSetup::Base in order to implement
+ # a full OS-setup backend
+ ...
+
+I<The synopsis above outlines a class that implements a
+OSSetup backend for the (imaginary) operating system B<coolnewOS>>
+
+=head1 DESCRIPTION
+
+This class defines the OSSetup interface for the OpenSLX.
+
+Aim of the OSSetup abstraction is to make it possible to install a large set
+of different operating systems transparently.
+
+...
+
+=cut
diff --git a/installer/OpenSLX/OSSetup/Distro/SUSE_10_1.pm b/installer/OpenSLX/OSSetup/Distro/SUSE_10_1.pm
new file mode 100644
index 00000000..ebf8902b
--- /dev/null
+++ b/installer/OpenSLX/OSSetup/Distro/SUSE_10_1.pm
@@ -0,0 +1,52 @@
+# SUSE_10_2.pm
+# - provides SUSE-10.1-specific overrides of the OpenSLX OSSetup API.
+#
+# (c) 2006 - OpenSLX.com
+#
+# Oliver Tappe <ot@openslx.com>
+#
+package OpenSLX::OSSetup::Distro::SUSE_10_1;
+
+use vars qw(@ISA $VERSION);
+@ISA = ('OpenSLX::OSSetup::Distro::Base');
+$VERSION = 1.01; # API-version . implementation-version
+
+use strict;
+use Carp;
+use OpenSLX::Basics;
+use OpenSLX::OSSetup::Distro::Base 1.01;
+
+################################################################################
+### implementation
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {
+ 'base-name' => 'suse-10.1',
+ };
+ return bless $self, $class;
+}
+
+sub initialize
+{
+ my $self = shift;
+ my $engine = shift;
+
+ $self->SUPER::initialize($engine);
+ $self->{'packager-type'} = 'rpm';
+ $self->{'meta-packager-type'} = $ENV{SLX_META_PACKAGER} || 'yum';
+ $ENV{YAST_IS_RUNNING} = "instsys";
+}
+
+sub fixPrerequiredFiles
+{
+ my $self = shift;
+ my $stage1cDir = shift;
+
+ if (system("chown root: $stage1cDir/etc/{group,passwd,shadow}")) {
+ die _tr("unable to fix pre-required files (%s)", $!);
+ }
+}
+
+1; \ No newline at end of file
diff --git a/installer/OpenSLX/OSSetup/Distro/SUSE_10_2.pm b/installer/OpenSLX/OSSetup/Distro/SUSE_10_2.pm
new file mode 100644
index 00000000..59c2353c
--- /dev/null
+++ b/installer/OpenSLX/OSSetup/Distro/SUSE_10_2.pm
@@ -0,0 +1,52 @@
+# SUSE_10_2.pm
+# - provides SUSE-10.2-specific overrides of the OpenSLX OSSetup API.
+#
+# (c) 2006 - OpenSLX.com
+#
+# Oliver Tappe <ot@openslx.com>
+#
+package OpenSLX::OSSetup::Distro::SUSE_10_2;
+
+use vars qw(@ISA $VERSION);
+@ISA = ('OpenSLX::OSSetup::Distro::Base');
+$VERSION = 1.01; # API-version . implementation-version
+
+use strict;
+use Carp;
+use OpenSLX::Basics;
+use OpenSLX::OSSetup::Distro::Base 1.01;
+
+################################################################################
+### implementation
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {
+ 'base-name' => 'suse-10.2',
+ };
+ return bless $self, $class;
+}
+
+sub initialize
+{
+ my $self = shift;
+ my $engine = shift;
+
+ $self->SUPER::initialize($engine);
+ $self->{'packager-type'} = 'rpm';
+ $self->{'meta-packager-type'} = $ENV{SLX_META_PACKAGER} || 'yum';
+ $ENV{YAST_IS_RUNNING} = "instsys";
+}
+
+sub fixPrerequiredFiles
+{
+ my $self = shift;
+ my $stage1cDir = shift;
+
+ if (system("chown root: $stage1cDir/etc/{group,passwd,shadow}")) {
+ die _tr("unable to fix pre-required files (%s)", $!);
+ }
+}
+
+1; \ No newline at end of file
diff --git a/installer/OpenSLX/OSSetup/Engine.pm b/installer/OpenSLX/OSSetup/Engine.pm
new file mode 100644
index 00000000..b17a094b
--- /dev/null
+++ b/installer/OpenSLX/OSSetup/Engine.pm
@@ -0,0 +1,650 @@
+# Engine.pm - provides driver enginge for the OSSetup API.
+#
+# (c) 2006 - OpenSLX.com
+#
+# Oliver Tappe <ot@openslx.com>
+#
+package OpenSLX::OSSetup::Engine;
+
+use vars qw($VERSION);
+$VERSION = 1.01; # API-version . implementation-version
+
+use strict;
+use Carp;
+use File::Basename;
+use OpenSLX::Basics;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+
+ my $self = {
+ };
+
+ return bless $self, $class;
+}
+
+sub initialize
+{
+ my $self = shift;
+ my $distroName = shift;
+ my $protectSystemPath = shift;
+
+ # load module for the requested distro:
+ $distroName = uc($distroName);
+ $distroName =~ tr[-.][_];
+ my $distroModule = "OpenSLX::OSSetup::Distro::$distroName";
+ unless (eval "require $distroModule") {
+ if ($! == 2) {
+ die _tr("Distro-module <%s> not found!\n", $distroModule);
+ } else {
+ die _tr("Unable to load distro-module <%s> (%s)\n", $distroModule, $@);
+ }
+ }
+ my $modVersion = $distroModule->VERSION;
+ if ($modVersion < 1.01) {
+ die _tr('Could not load module <%s> (Version <%s> required, but <%s> found)',
+ $distroModule, 1.01, $modVersion);
+ }
+ $distroModule->import;
+ my $distro = $distroModule->new;
+ $distro->initialize($self);
+ $self->{distro} = $distro;
+
+ # setup path to distribution-specific info:
+ my $distroInfoDir = "../lib/distro-info/$distro->{'base-name'}";
+ if (!-d $distroInfoDir) {
+ die _tr("unable to find distro-info for system '%s'", $distro->{'base-name'})."\n";
+ }
+ $self->{'distro-info-dir'} = $distroInfoDir;
+ $self->readDistroInfo();
+
+ $self->setupSystemPaths($protectSystemPath);
+
+ $self->createPackager();
+ $self->createMetaPackager();
+}
+
+sub setupStage1A
+{
+ my $self = shift;
+
+ vlog 1, "setting up stage1a for $self->{distro}->{'base-name'}...";
+ $self->stage1A_createBusyboxEnvironment();
+ $self->stage1A_setupResolver();
+ $self->stage1A_copyPrerequiredFiles();
+ $self->stage1A_copyTrustedPackageKeys();
+ $self->stage1A_createRequiredFiles();
+}
+
+sub setupStage1B
+{
+ my $self = shift;
+
+ vlog 1, "setting up stage1b for $self->{distro}->{'base-name'}...";
+ $self->stage1B_chrootAndBootstrap();
+}
+
+sub setupStage1C
+{
+ my $self = shift;
+
+ vlog 1, "setting up stage1c for $self->{distro}->{'base-name'}...";
+ $self->stage1C_chrootAndInstallBasicSystem();
+}
+
+sub setupStage1D
+{
+ my $self = shift;
+
+ vlog 1, "setting up stage1d for $self->{distro}->{'base-name'}...";
+ $self->stage1D_setupPackageSources();
+ $self->stage1D_updateBasicSystem();
+ $self->stage1D_installPackageSelection();
+}
+
+sub setupStage1
+{
+ my $self = shift;
+
+ $self->setupStage1A();
+ my $pid = fork();
+ if (!$pid) {
+ # child, execute the tasks that involve a chrooted environment:
+ $self->setupStage1B();
+ $self->setupStage1C();
+ exit 0;
+ }
+
+ # parent, wait for child to do its work inside the chroot
+ waitpid($pid, 0);
+ $self->stage1C_cleanupBasicSystem();
+ $self->setupStage1D();
+}
+
+sub setupRepositories
+{
+ my $self = shift;
+
+ $self->setupStage1D();
+}
+
+sub fixPrerequiredFiles
+{
+}
+
+################################################################################
+### implementation methods
+################################################################################
+sub readDistroInfo
+{
+ my $self = shift;
+
+ vlog 1, "reading configuration info for $self->{distro}->{'base-name'}...";
+ my (%repository,
+ %selection,
+ $base_url,
+ $package_subdir,
+ $prereq_packages,
+ $bootstrap_prereq_packages,
+ $bootstrap_packages);
+ foreach my $fn ('settings', 'settings.local') {
+ my $file = "$self->{'distro-info-dir'}/$fn";
+ if (-e $file) {
+ vlog 3, "reading configuration file $file...";
+ my $config = slurpFile($file);
+ if (!eval $config) {
+ die _tr("error in config-file <%s> (%s)", $file, $@)."\n";
+ }
+ }
+ }
+ $self->{'distro-info'} = {
+ 'package-subdir' => $package_subdir,
+ 'prereq-packages' => $prereq_packages,
+ 'bootstrap-prereq-packages' => $bootstrap_prereq_packages,
+ 'bootstrap-packages' => $bootstrap_packages,
+ 'repository' => \%repository,
+ 'selection' => \%selection,
+ };
+ if ($openslxConfig{'verbose-level'} >= 2) {
+ # dump distro-info:
+ foreach my $r (sort keys %repository) {
+ vlog 2, "repository '$r':";
+ foreach my $k (sort keys %{$repository{$r}}) {
+ vlog 2, "\t$k = '$repository{$r}->{$k}'";
+ }
+ }
+ foreach my $s (sort keys %selection) {
+ my @selLines = split "\n", $selection{$s};
+ vlog 2, "selection '$s':";
+ foreach my $sl (@selLines) {
+ vlog 2, "\t$sl";
+ }
+ }
+ }
+}
+
+sub setupSystemPaths
+{
+ my $self = shift;
+ my $protectSystemPath = shift;
+
+ $self->{'system-path'}
+ = "$openslxConfig{'stage1-path'}/$self->{distro}->{'base-name'}";
+ vlog 1, "system will be installed to '$self->{'system-path'}'";
+ if ($protectSystemPath && -e $self->{'system-path'}) {
+ die _tr("'%s' already exists, giving up!", $self->{'system-path'});
+ }
+
+ # specify individual paths for the respective substages:
+ $self->{stage1aDir} = "$self->{'system-path'}/stage1a";
+ $self->{stage1bSubdir} = 'slxbootstrap';
+ $self->{stage1cSubdir} = 'slxfinal';
+
+ # we create *all* of the above folders by creating stage1cDir:
+ my $stage1cDir
+ = "$self->{'stage1aDir'}/$self->{'stage1bSubdir'}/$self->{'stage1cSubdir'}";
+ if (system("mkdir -p $stage1cDir")) {
+ die _tr("unable to create directory '%s', giving up! (%s)",
+ $stage1cDir, $!);
+ }
+}
+
+sub createPackager
+{
+ my $self = shift;
+
+ my $packagerModule
+ = "OpenSLX::OSSetup::Packager::$self->{distro}->{'packager-type'}";
+ unless (eval "require $packagerModule") {
+ if ($! == 2) {
+ die _tr("Packager-module <%s> not found!\n", $packagerModule);
+ } else {
+ die _tr("Unable to load packager-module <%s> (%s)\n", $packagerModule, $@);
+ }
+ }
+ my $modVersion = $packagerModule->VERSION;
+ if ($modVersion < 1.01) {
+ die _tr('Could not load module <%s> (Version <%s> required, but <%s> found)',
+ $packagerModule, 1.01, $modVersion);
+ }
+ $packagerModule->import;
+ my $packager = $packagerModule->new;
+ $packager->initialize($self);
+ $self->{'packager'} = $packager;
+}
+
+sub createMetaPackager
+{
+ my $self = shift;
+
+ my $metaPackagerModule
+ = "OpenSLX::OSSetup::MetaPackager::$self->{distro}->{'meta-packager-type'}";
+ unless (eval "require $metaPackagerModule") {
+ if ($! == 2) {
+ die _tr("Meta-packager-module <%s> not found!\n", $metaPackagerModule);
+ } else {
+ die _tr("Unable to load meta-packager-module <%s> (%s)\n", $metaPackagerModule, $@);
+ }
+ }
+ my $modVersion = $metaPackagerModule->VERSION;
+ if ($modVersion < 1.01) {
+ die _tr('Could not load module <%s> (Version <%s> required, but <%s> found)',
+ $metaPackagerModule, 1.01, $modVersion);
+ }
+ $metaPackagerModule->import;
+ my $metaPackager = $metaPackagerModule->new;
+ $metaPackager->initialize($self);
+ $self->{'meta-packager'} = $metaPackager;
+}
+
+sub selectBaseURL
+{
+ my $self = shift;
+ my $repoInfo = shift;
+
+ my $baseURL = $repoInfo->{url};
+ if (!defined $baseURL) {
+ my @baseURLs = string2Array($repoInfo->{urls});
+ # TODO: insert a closest mirror algorithm here!
+ $baseURL = $baseURLs[0];
+ }
+ return $baseURL;
+}
+
+sub stage1A_createBusyboxEnvironment
+{
+ my $self = shift;
+
+ # copy busybox and all required binaries into stage1a-dir:
+ vlog 1, "creating busybox-environment...";
+ copyFile("$openslxConfig{'share-path'}/busybox/busybox",
+ "$self->{stage1aDir}/bin");
+
+ # determine all required libraries and copy those, too:
+ vlog 2, "calling slxldd for busybox";
+ my $requiredLibsStr = `slxldd $openslxConfig{'share-path'}/busybox/busybox`;
+ chomp $requiredLibsStr;
+ vlog 2, "slxldd results:\n$requiredLibsStr";
+ foreach my $lib (split "\n", $requiredLibsStr) {
+ vlog 3, "copying lib '$lib'";
+ my $libDir = dirname($lib);
+ copyFile($lib, "$self->{stage1aDir}/$libDir");
+ }
+
+ # create all needed links to busybox:
+ my $links
+ = slurpFile("$openslxConfig{'share-path'}/busybox/busybox.links");
+ foreach my $linkTarget (split "\n", $links) {
+ linkFile('/bin/busybox', "$self->{stage1aDir}/$linkTarget");
+ }
+}
+
+sub stage1A_setupResolver
+{
+ my $self = shift;
+
+ copyFile('/etc/resolv.conf', "$self->{stage1aDir}/etc");
+ copyFile('/lib/libresolv*', "$self->{stage1aDir}/lib");
+ copyFile('/lib/libnss_dns*', "$self->{stage1aDir}/lib");
+
+ my $stage1cDir
+ = "$self->{'stage1aDir'}/$self->{'stage1bSubdir'}/$self->{'stage1cSubdir'}";
+ copyFile('/etc/resolv.conf', "$stage1cDir/etc");
+}
+
+sub stage1A_copyPrerequiredFiles
+{
+ my $self = shift;
+
+ return unless -d "$self->{'distro-info-dir'}/prereqfiles";
+
+ vlog 2, "copying folder with pre-required files...";
+ my $stage1cDir
+ = "$self->{'stage1aDir'}/$self->{'stage1bSubdir'}/$self->{'stage1cSubdir'}";
+ my $cmd = qq[
+ tar --exclude=.svn -cp -C $self->{'distro-info-dir'}/prereqfiles . \\
+ | tar -xp -C $stage1cDir
+ ];
+ if (system($cmd)) {
+ die _tr("unable to copy folder with pre-required files to folder <%s> (%s)",
+ $stage1cDir, $!);
+ }
+ $self->{distro}->fixPrerequiredFiles($stage1cDir);
+}
+
+sub stage1A_copyTrustedPackageKeys
+{
+ my $self = shift;
+
+ return unless -d "$self->{'distro-info-dir'}/trusted-package-keys";
+
+ vlog 2, "copying folder with trusted package keys...";
+ my $stage1bDir
+ = "$self->{'stage1aDir'}/$self->{'stage1bSubdir'}";
+ my $cmd = qq[
+ tar --exclude=.svn -cp -C $self->{'distro-info-dir'} trusted-package-keys \\
+ | tar -xp -C $stage1bDir
+ ];
+ if (system($cmd)) {
+ die _tr("unable to copy folder with trusted package keys to folder <%s> (%s)",
+ $stage1bDir, $!);
+ }
+ system("chmod 444 $stage1bDir/trusted-package-keys/*");
+
+ # install ultimately trusted keys (from distributor):
+ my $stage1cDir
+ = "$stage1bDir/$self->{'stage1cSubdir'}";
+ my $keyDir = "$self->{'distro-info-dir'}/trusted-package-keys";
+ copyFile("$keyDir/pubring.gpg", "$stage1cDir/usr/lib/rpm/gnupg");
+}
+
+sub stage1A_createRequiredFiles
+{
+ my $self = shift;
+
+ vlog 2, "creating required files...";
+ # fake all files required by stage1b (by creating them empty):
+ my $stage1bDir
+ = "$self->{'stage1aDir'}/$self->{'stage1bSubdir'}";
+ foreach my $fake (@{$self->{distro}->{'stage1b-faked-files'}}) {
+ fakeFile("$stage1bDir/$fake");
+ }
+
+ # fake all files required by stage1c (by creating them empty):
+ my $stage1cDir
+ = "$stage1bDir/$self->{'stage1cSubdir'}";
+ foreach my $fake (@{$self->{distro}->{'stage1c-faked-files'}}) {
+ fakeFile("$stage1cDir/$fake");
+ }
+
+ mkdir "$stage1cDir/dev";
+ if (system("mknod $stage1cDir/dev/null c 1 3")) {
+ die _tr("unable to create node <%s> (%s)", "$stage1cDir/dev/null", $!);
+ }
+}
+
+sub stage1B_chrootAndBootstrap
+{
+ my $self = shift;
+
+ vlog 2, "chrooting into $self->{stage1aDir}...";
+ # chdir into stage1aDir...
+ chdir $self->{stage1aDir}
+ or die _tr("unable to chdir into <%s> (%s)", $self->{stage1aDir}, $!);
+ # ...do chroot
+ chroot "."
+ or die _tr("unable to chroot into <%s> (%s)", $self->{stage1aDir}, $!);
+
+ $ENV{PATH} = "/bin:/sbin:/usr/bin:/usr/sbin";
+
+ # chdir into slxbootstrap, as we want to drop packages into there:
+ chdir "/$self->{stage1bSubdir}"
+ or die _tr("unable to chdir into <%s> (%s)", "/$self->{stage1bSubdir}", $!);
+
+ # fetch prerequired packages:
+ my $baseURL
+ = $self->selectBaseURL($self->{'distro-info'}->{repository}->{base});
+ my $pkgDirURL = $baseURL;
+ if (length($self->{'distro-info'}->{'package-subdir'})) {
+ $pkgDirURL .= "/$self->{'distro-info'}->{'package-subdir'}";
+ }
+ my @pkgs = string2Array($self->{'distro-info'}->{'prereq-packages'});
+ my @prereqPkgs = downloadFilesFrom(\@pkgs, $pkgDirURL);
+ $self->{packager}->unpackPackages(\@prereqPkgs);
+
+ @pkgs = string2Array($self->{'distro-info'}->{'bootstrap-prereq-packages'});
+ my @bootstrapPrereqPkgs = downloadFilesFrom(\@pkgs, $pkgDirURL);
+ $self->{'local-bootstrap-prereq-packages'} = \@bootstrapPrereqPkgs;
+
+ @pkgs = string2Array($self->{'distro-info'}->{'bootstrap-packages'});
+ my @bootstrapPkgs = downloadFilesFrom(\@pkgs, $pkgDirURL);
+ my @allPkgs = (@prereqPkgs, @bootstrapPrereqPkgs, @bootstrapPkgs);
+ $self->{'local-bootstrap-packages'} = \@allPkgs;
+}
+
+sub stage1C_chrootAndInstallBasicSystem
+{
+ my $self = shift;
+
+ my $stage1bDir = "/$self->{stage1bSubdir}";
+ vlog 2, "chrooting into $stage1bDir...";
+ # chdir into stage1bDir...
+ chdir $stage1bDir
+ or die _tr("unable to chdir into <%s> (%s)", $stage1bDir, $!);
+ # ...do chroot
+ chroot "."
+ or die _tr("unable to chroot into <%s> (%s)", $stage1bDir, $!);
+
+ $ENV{PATH} = "/bin:/sbin:/usr/bin:/usr/sbin";
+ my $stage1cDir = "/$self->{stage1cSubdir}";
+
+ # install all prerequired bootstrap packages
+ $self->{packager}->installPrerequiredPackages(
+ $self->{'local-bootstrap-prereq-packages'}, $stage1cDir
+ );
+
+ # import any additional trusted package keys to rpm-DB:
+ my $keyDir = "/trusted-package-keys";
+ opendir(KEYDIR, $keyDir)
+ or die _tr("unable to opendir <%s> (%s)", $keyDir, $!);
+ my @keyFiles
+ = map { "$keyDir/$_" }
+ grep { $_ !~ m[^(\.\.?|pubring.gpg)$] }
+ readdir(KEYDIR);
+ closedir(KEYDIR);
+ $self->{packager}->importTrustedPackageKeys(\@keyFiles, $stage1cDir);
+
+ # install all other bootstrap packages
+ $self->{packager}->installPackages(
+ $self->{'local-bootstrap-packages'}, $stage1cDir
+ );
+}
+
+sub stage1C_cleanupBasicSystem
+{
+ my $self = shift;
+
+ my $stage1cDir
+ = "$self->{'stage1aDir'}/$self->{'stage1bSubdir'}/$self->{'stage1cSubdir'}";
+ if (system("mv $stage1cDir/* $self->{'system-path'}/")) {
+ die _tr("unable to move final setup to <%s> (%s)",
+ $self->{'system-path'}, $!);
+ }
+ if (system("rm -rf $self->{stage1aDir}")) {
+ die _tr("unable to remove temporary folder <%s> (%s)",
+ $self->{stage1aDir}, $!);
+ }
+}
+
+sub stage1D_setupPackageSources()
+{
+ my $self = shift;
+
+ vlog 1, "setting up package sources for meta packager...";
+ my ($rk, $repo);
+ while(($rk, $repo) = each %{$self->{'distro-info'}->{repository}}) {
+ vlog 2, "setting up package source $rk...";
+ $self->{'meta-packager'}->setupPackageSource($rk, $repo);
+ }
+}
+
+sub stage1D_updateBasicSystem()
+{
+ my $self = shift;
+
+ # chdir into systemDir...
+ my $systemDir = $self->{'system-path'};
+ vlog 2, "chrooting into $systemDir...";
+ chdir $systemDir
+ or die _tr("unable to chdir into <%s> (%s)", $systemDir, $!);
+ # ...do chroot
+ chroot "."
+ or die _tr("unable to chroot into <%s> (%s)", $systemDir, $!);
+
+ vlog 1, "updating basic system...";
+ $self->{'meta-packager'}->updateBasicSystem();
+}
+
+sub stage1D_installPackageSelection
+{
+ my $self = shift;
+
+ vlog 1, "installing package selection...";
+}
+
+################################################################################
+### utility functions
+################################################################################
+sub copyFile
+{
+ my $fileName = shift;
+ my $dirName = shift;
+
+ my $baseName = basename($fileName);
+ my $targetName = "$dirName/$baseName";
+ if (!-e $targetName) {
+ my $targetDir = dirname($targetName);
+ system("mkdir -p $targetDir") unless -d $targetDir;
+ if (system("cp -p $fileName $targetDir/")) {
+ die _tr("unable to copy file '%s' to dir '%s' (%s)",
+ $fileName, $targetDir, $!);
+ }
+ }
+}
+
+sub fakeFile
+{
+ my $fullPath = shift;
+
+ my $targetDir = dirname($fullPath);
+ system("mkdir", "-p", $targetDir) unless -d $targetDir;
+ if (system("touch", $fullPath)) {
+ die _tr("unable to create file '%s' (%s)",
+ $fullPath, $!);
+ }
+}
+
+sub linkFile
+{
+ my $linkTarget = shift;
+ my $linkName = shift;
+
+ my $targetDir = dirname($linkName);
+ system("mkdir -p $targetDir") unless -d $targetDir;
+ if (system("ln -s $linkTarget $linkName")) {
+ die _tr("unable to create link '%s' to '%s' (%s)",
+ $linkName, $linkTarget, $!);
+ }
+}
+
+sub slurpFile
+{
+ my $file = shift;
+ open(F, "< $file")
+ or die _tr("could not open file '%s' for reading! (%s)", $file, $!);
+ $/ = undef;
+ my $text = <F>;
+ close(F);
+ return $text;
+}
+
+sub string2Array
+{
+ my $str = shift;
+
+ return
+ map { $_ =~ s[^\s*(.+?)\s*$][$1]; $_ }
+ grep { length($_) > 0 } split "\n", $str;
+}
+
+sub downloadFilesFrom
+{
+ my $files = shift;
+ my $baseURL = shift;
+
+ my @foundFiles;
+ foreach my $fileVariantStr (@$files) {
+ my $foundFile;
+ foreach my $file (split '\s+', $fileVariantStr) {
+ vlog 2, "fetching $file...";
+ if (system("wget", "$baseURL/$file") == 0) {
+ $foundFile = basename($file);
+ last;
+ }
+ }
+ if (!defined $foundFile) {
+ die _tr("unable to fetch <%s> from <%s> (%s)", $fileVariantStr,
+ $baseURL, $!);
+ }
+ push @foundFiles, $foundFile;
+ }
+ return @foundFiles;
+}
+
+1;
+################################################################################
+
+=pod
+
+=head1 NAME
+
+OpenSLX::OSSetup::System::Base - the base class for all OSSetup backends
+
+=head1 SYNOPSIS
+
+ package OpenSLX::OSSetup::coolnewOS;
+
+ use vars qw(@ISA $VERSION);
+ @ISA = ('OpenSLX::OSSetup::Base');
+ $VERSION = 1.01;
+
+ use coolnewOS;
+
+ sub new
+ {
+ my $class = shift;
+ my $self = {};
+ return bless $self, $class;
+ }
+
+ # override all methods of OpenSLX::OSSetup::Base in order to implement
+ # a full OS-setup backend
+ ...
+
+I<The synopsis above outlines a class that implements a
+OSSetup backend for the (imaginary) operating system B<coolnewOS>>
+
+=head1 DESCRIPTION
+
+This class defines the OSSetup interface for the OpenSLX.
+
+Aim of the OSSetup abstraction is to make it possible to install a large set
+of different operating systems transparently.
+
+...
+
+=cut
diff --git a/installer/OpenSLX/OSSetup/MetaPackager/Base.pm b/installer/OpenSLX/OSSetup/MetaPackager/Base.pm
new file mode 100644
index 00000000..0baa1a84
--- /dev/null
+++ b/installer/OpenSLX/OSSetup/MetaPackager/Base.pm
@@ -0,0 +1,68 @@
+# Base.pm - provides empty base of the OpenSLX OSSetup::MetaPackager API.
+#
+# (c) 2006 - OpenSLX.com
+#
+# Oliver Tappe <ot@openslx.com>
+#
+package OpenSLX::OSSetup::MetaPackager::Base;
+
+use vars qw($VERSION);
+$VERSION = 1.01; # API-version . implementation-version
+
+use strict;
+use Carp;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ confess "Creating OpenSLX::OSSetup::MetaPackager::Base-objects directly makes no sense!";
+}
+
+sub initialize
+{
+ my $self = shift;
+ my $engine = shift;
+
+ $self->{'engine'} = $engine;
+}
+
+sub setupPackageSource
+{
+}
+
+1;
+################################################################################
+
+=pod
+
+=head1 NAME
+
+OpenSLX::OSSetup::MetaPackager::Base - the base class for all OSSetup::MetaPackagers
+
+=head1 SYNOPSIS
+
+ package OpenSLX::OSSetup::MetaPackager::coolnewpkg;
+
+ use vars qw(@ISA $VERSION);
+ @ISA = ('OpenSLX::OSSetup::MetaPackager::Base');
+ $VERSION = 1.01;
+
+ use coolnewpkg;
+
+ sub new
+ {
+ my $class = shift;
+ my $self = {};
+ return bless $self, $class;
+ }
+
+ # override all methods of OpenSLX::OSSetup::MetaPackager::Base in order to
+ # implement the support for a new meta-packager
+ ...
+
+I<The synopsis above outlines a class that implements a
+OSSetup::MetaPackager for the (imaginary) meta-packager B<coolnewpkg>>
+
+=cut
diff --git a/installer/OpenSLX/OSSetup/MetaPackager/yum.pm b/installer/OpenSLX/OSSetup/MetaPackager/yum.pm
new file mode 100644
index 00000000..3673266d
--- /dev/null
+++ b/installer/OpenSLX/OSSetup/MetaPackager/yum.pm
@@ -0,0 +1,71 @@
+# yum.pm
+# - provides yum-specific overrides of the OpenSLX::OSSetup::MetaPackager API.
+#
+# (c) 2006 - OpenSLX.com
+#
+# Oliver Tappe <ot@openslx.com>
+#
+package OpenSLX::OSSetup::MetaPackager::yum;
+
+use vars qw(@ISA $VERSION);
+@ISA = ('OpenSLX::OSSetup::MetaPackager::Base');
+$VERSION = 1.01; # API-version . implementation-version
+
+use strict;
+use Carp;
+use OpenSLX::Basics;
+use OpenSLX::OSSetup::MetaPackager::Base 1.01;
+
+################################################################################
+### implementation
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {
+ 'name' => 'yum',
+ };
+ return bless $self, $class;
+}
+
+sub initialize
+{
+ my $self = shift;
+ my $engine = shift;
+
+ $self->SUPER::initialize($engine);
+ $ENV{LC_ALL} = 'POSIX';
+}
+
+sub setupPackageSource
+{
+ my $self = shift;
+ my $repoName = shift;
+ my $repoInfo = shift;
+
+ my $repoURL = $self->{engine}->selectBaseURL($repoInfo);
+ if (length($repoInfo->{'repo-subdir'})) {
+ $repoURL .= "/$repoInfo->{'repo-subdir'}";
+ }
+ my $repoDescr = "[$repoName]\nname=$repoInfo->{name}\nbaseurl=$repoURL\n";
+ system("cp /proc/cpuinfo $self->{engine}->{'system-path'}/proc");
+ system("mkdir -p $self->{engine}->{'system-path'}/etc/yum.repos.d");
+ my $repoFile
+ = "$self->{engine}->{'system-path'}/etc/yum.repos.d/$repoName.repo";
+ open(REPO, "> $repoFile")
+ or die _tr("unable to create repo-file <%s> (%s)", $repoFile, $1);
+ print REPO $repoDescr;
+ close(REPO);
+}
+
+sub updateBasicSystem
+{
+ my $self = shift;
+
+ if (system("yum -y update")) {
+ die _tr("unable to update basic system (%s)", $!);
+ }
+ system('rm /proc/cpuinfo');
+}
+
+1; \ No newline at end of file
diff --git a/installer/OpenSLX/OSSetup/Packager/Base.pm b/installer/OpenSLX/OSSetup/Packager/Base.pm
new file mode 100644
index 00000000..ca0fbbae
--- /dev/null
+++ b/installer/OpenSLX/OSSetup/Packager/Base.pm
@@ -0,0 +1,84 @@
+# Base.pm - provides empty base of the OpenSLX OSSetup::Packager API.
+#
+# (c) 2006 - OpenSLX.com
+#
+# Oliver Tappe <ot@openslx.com>
+#
+package OpenSLX::OSSetup::Packager::Base;
+
+use vars qw($VERSION);
+$VERSION = 1.01; # API-version . implementation-version
+
+use strict;
+use Carp;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ confess "Creating OpenSLX::OSSetup::Packager::Base-objects directly makes no sense!";
+}
+
+sub initialize
+{
+ my $self = shift;
+ my $distro = shift;
+
+ $self->{'distro'} = $distro;
+}
+
+sub unpackPackages
+{
+}
+
+sub unpackPackages
+{
+}
+
+sub importTrustedPackageKeys
+{
+}
+
+sub installPrerequiredPackages
+{
+}
+
+sub installPackages
+{
+}
+
+1;
+################################################################################
+
+=pod
+
+=head1 NAME
+
+OpenSLX::OSSetup::Packager::Base - the base class for all OSSetup::Packagers
+
+=head1 SYNOPSIS
+
+ package OpenSLX::OSSetup::Packager::coolnewpkg;
+
+ use vars qw(@ISA $VERSION);
+ @ISA = ('OpenSLX::OSSetup::Packager::Base');
+ $VERSION = 1.01;
+
+ use coolnewpkg;
+
+ sub new
+ {
+ my $class = shift;
+ my $self = {};
+ return bless $self, $class;
+ }
+
+ # override all methods of OpenSLX::OSSetup::Packager::Base in order to
+ # implement the support for a new packager
+ ...
+
+I<The synopsis above outlines a class that implements a
+OSSetup::Packager for the (imaginary) packager B<coolnewpkg>>
+
+=cut
diff --git a/installer/OpenSLX/OSSetup/Packager/rpm.pm b/installer/OpenSLX/OSSetup/Packager/rpm.pm
new file mode 100644
index 00000000..2fb2755b
--- /dev/null
+++ b/installer/OpenSLX/OSSetup/Packager/rpm.pm
@@ -0,0 +1,88 @@
+# rpm.pm
+# - provides rpm-specific overrides of the OpenSLX::OSSetup::Packager API.
+#
+# (c) 2006 - OpenSLX.com
+#
+# Oliver Tappe <ot@openslx.com>
+#
+package OpenSLX::OSSetup::Packager::rpm;
+
+use vars qw(@ISA $VERSION);
+@ISA = ('OpenSLX::OSSetup::Packager::Base');
+$VERSION = 1.01; # API-version . implementation-version
+
+use strict;
+use Carp;
+use OpenSLX::Basics;
+use OpenSLX::OSSetup::Packager::Base 1.01;
+
+################################################################################
+### implementation
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {
+ 'name' => 'rpm',
+ };
+ return bless $self, $class;
+}
+
+sub unpackPackages
+{
+ my $self = shift;
+ my $pkgs = shift;
+
+ foreach my $pkg (@$pkgs) {
+ vlog 2, "unpacking package $pkg...";
+ if (system("ash", "-c", "rpm2cpio $pkg | cpio -i -d")) {
+ die _tr("unable to unpack package <%s> (%s)", $pkg, $!);
+ }
+ }
+}
+
+sub importTrustedPackageKeys
+{
+ my $self = shift;
+ my $keyFiles = shift;
+ my $finalPath = shift;
+
+ return unless defined $keyFiles;
+
+ foreach my $keyFile (@$keyFiles) {
+ vlog 2, "importing package key $keyFile...";
+ if (system("rpm", "--root=$finalPath", "--import", "$keyFile")) {
+ die _tr("unable to import package key <%s> (%s)", $keyFile, $!);
+ }
+ }
+}
+
+sub installPrerequiredPackages
+{
+ my $self = shift;
+ my $pkgs = shift;
+ my $finalPath = shift;
+
+ return unless defined $pkgs && scalar(@$pkgs);
+
+ if (system("rpm", "--root=$finalPath", "-ivh", "--nodeps", "--noscripts",
+ "--force", @$pkgs)) {
+ die _tr("error during prerequired-package-installation (%s)", $!);
+ }
+ system("rm", "-rf", "$finalPath/var/lib/rpm");
+}
+
+sub installPackages
+{
+ my $self = shift;
+ my $pkgs = shift;
+ my $finalPath = shift;
+
+ return unless defined $pkgs && scalar(@$pkgs);
+
+ if (system("rpm", "--root=$finalPath", "-ivh", @$pkgs)) {
+ die _tr("error during package-installation (%s)", $!);
+ }
+}
+
+1; \ No newline at end of file
diff --git a/installer/slxos-setup b/installer/slxos-setup
new file mode 100755
index 00000000..30aa82dd
--- /dev/null
+++ b/installer/slxos-setup
@@ -0,0 +1,143 @@
+#! /usr/bin/perl
+#
+# slxos-setup -
+#
+# (c) 2006 - OpenSLX.com
+#
+# Oliver Tappe <ot@openslx.com>
+#
+use strict;
+
+my $abstract = q[
+slxos-setup
+ This script installs an operating system into a folder that can be used as
+ a stage1 system for OpenSLX.
+];
+
+use Getopt::Long qw(:config pass_through);
+use Pod::Usage;
+
+# add the folder this script lives in and the lib-folder to perl's
+# search path for modules:
+use FindBin;
+use lib "$FindBin::RealBin";
+use lib "$FindBin::RealBin/../lib";
+
+use OpenSLX::Basics;
+use OpenSLX::OSSetup::Engine;
+
+if ($> != 0) {
+ die _tr("Sorry, this script can only be executed by the superuser!\n");
+}
+
+my (
+ $helpReq,
+ $manReq,
+ $listReq,
+ $setupRepos,
+ $verbose,
+ $versionReq,
+);
+
+GetOptions(
+ 'help|?' => \$helpReq,
+ 'list' => \$listReq,
+ 'man' => \$manReq,
+ 'setup-repos' => \$setupRepos,
+ 'verbose' => \$verbose,
+ 'version' => \$versionReq,
+) or pod2usage(2);
+pod2usage(-msg => $abstract, -verbose => 0, -exitval => 1) if $helpReq;
+pod2usage(-verbose => 2) if $manReq;
+if ($versionReq) {
+ system('slxversion');
+ exit 1;
+}
+
+my @supportedDistros = (
+ 'debian-3.1',
+ 'debian-4.0',
+ 'fedora-6',
+ 'fedora-6-x86_64',
+ 'mandriva-2007.0',
+ 'suse-9.3',
+ 'suse-10.0',
+ 'suse-10.0-x86_64',
+ 'suse-10.1',
+ 'suse-10.1-x86_64',
+ 'suse-10.2',
+ 'suse-10.2-x86_64',
+ 'ubuntu-6.10',
+);
+
+openslxInit();
+
+if ($listReq) {
+ print _tr("List of supported distros:\n\t");
+ print join("\n\t", @supportedDistros)."\n";
+ exit 1;
+}
+
+if (scalar(@ARGV) != 1) {
+ print STDERR _tr("You need to specify exactly one distro name!\n");
+ pod2usage(2);
+}
+
+my $distroName = $ARGV[0];
+if (!grep { /^$distroName$/ } @supportedDistros) {
+ print _tr("Sorry, distro '%s' is unsupported.\n", $distroName);
+ print _tr("List of supported distros:\n\t");
+ print join("\n\t", @supportedDistros)."\n";
+ exit 1;
+}
+
+# we chdir into the script's folder such that all relative paths have
+# a known starting point:
+chdir($FindBin::RealBin)
+ or die _tr("can't chdir to script-path <%> (%s)", $FindBin::RealBin, $!);
+
+# create ossetup-engine and start it:
+my $engine = OpenSLX::OSSetup::Engine->new;
+if ($setupRepos) {
+ $engine->initialize($distroName, 0);
+ $engine->setupRepositories();
+} else {
+ $engine->initialize($distroName, 1);
+ $engine->setupStage1();
+}
+
+__END__
+
+=head1 NAME
+
+slxos-setup - OpenSLX-script to install an operating system into a folder which
+will be used as a stage1 system for OpenSLX.
+
+=head1 SYNOPSIS
+
+slxos-setup [options] <distro-name>
+
+ Options:
+ --help brief help message
+ --man show full documentation
+ --version show version
+
+=head1 OPTIONS
+
+=over 8
+
+=item B<--help>
+
+Prints a brief help message and exits.
+
+=item B<--man>
+
+Prints the manual page and exits.
+
+=item B<--version>
+
+Prints the version and exits.
+
+=back
+
+=cut \ No newline at end of file
diff --git a/installer/systems/suse101/settings b/installer/systems/suse101/settings
index bff9516a..8f0d223c 100644
--- a/installer/systems/suse101/settings
+++ b/installer/systems/suse101/settings
@@ -99,7 +99,7 @@ i586/libxml2-python-2.6.23-15.i586.rpm
i586/python-2.4.2-18.i586.rpm
i586/python-elementtree-1.2.6-18.i586.rpm
i586/python-sqlite-1.1.6-17.i586.rpm
-i586/python-urlgrabber-2.9.7-15.i586.rpm
+i586/python-urlgrabber-2.9.7-15.i586.rpm
i586/rpm-python-4.4.2-40.i586.rpm
i586/sqlite-3.2.8-14.i586.rpm
i586/yum-2.4.2-13.i586.rpm
diff --git a/lib/OpenSLX/Basics.pm b/lib/OpenSLX/Basics.pm
index db643dd8..3800d717 100644
--- a/lib/OpenSLX/Basics.pm
+++ b/lib/OpenSLX/Basics.pm
@@ -261,7 +261,7 @@ sub _tr
my $formatStr = $translations{$trKey};
if (!defined $formatStr) {
- vlog 1, "Translation key '$trKey' not found.";
+ vlog 2, "Translation key '$trKey' not found.";
$formatStr = $trOrig;
}
return sprintf($formatStr, @_);
diff --git a/lib/distro-info/suse-10.1/prereqfiles/etc/group b/lib/distro-info/suse-10.1/prereqfiles/etc/group
new file mode 100644
index 00000000..505cb221
--- /dev/null
+++ b/lib/distro-info/suse-10.1/prereqfiles/etc/group
@@ -0,0 +1,33 @@
+root:x:0:
+bin:x:1:daemon
+daemon:x:2:
+sys:x:3:
+tty:x:5:
+disk:x:6:
+lp:x:7:
+www:x:8:
+kmem:x:9:
+wheel:x:10:
+mail:x:12:
+news:x:13:
+uucp:x:14:
+shadow:x:15:
+dialout:x:16:
+audio:x:17:
+floppy:x:19:
+cdrom:x:20:
+console:x:21:
+utmp:x:22:
+public:x:32:
+video:x:33:
+games:x:40:
+xok:x:41:
+trusted:x:42:
+modem:x:43:
+ftp:x:49:
+man:x:62:
+users:x:100:
+nobody:x:65533:
+nogroup:x:65534:nobody
+messagebus:!:101:
+haldaemon:!:102:
diff --git a/lib/distro-info/suse-10.1/prereqfiles/etc/passwd b/lib/distro-info/suse-10.1/prereqfiles/etc/passwd
new file mode 100644
index 00000000..9b8fc4fe
--- /dev/null
+++ b/lib/distro-info/suse-10.1/prereqfiles/etc/passwd
@@ -0,0 +1,14 @@
+root:x:0:0:root:/root:/bin/bash
+bin:x:1:1:bin:/bin:/bin/bash
+daemon:x:2:2:Daemon:/sbin:/bin/bash
+lp:x:4:7:Printing daemon:/var/spool/lpd:/bin/bash
+mail:x:8:12:Mailer daemon:/var/spool/clientmqueue:/bin/false
+news:x:9:13:News system:/etc/news:/bin/bash
+uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash
+games:x:12:100:Games account:/var/games:/bin/bash
+man:x:13:62:Manual pages viewer:/var/cache/man:/bin/bash
+wwwrun:x:30:8:WWW daemon apache:/var/lib/wwwrun:/bin/false
+ftp:x:40:49:FTP account:/srv/ftp:/bin/bash
+nobody:x:65534:65533:nobody:/var/lib/nobody:/bin/bash
+messagebus:x:100:101:User for D-Bus:/var/run/dbus:/bin/false
+haldaemon:x:101:102:User for haldaemon:/var/run/hal:/bin/false
diff --git a/lib/distro-info/suse-10.1/prereqfiles/etc/shadow b/lib/distro-info/suse-10.1/prereqfiles/etc/shadow
new file mode 100644
index 00000000..cd100a5a
--- /dev/null
+++ b/lib/distro-info/suse-10.1/prereqfiles/etc/shadow
@@ -0,0 +1,14 @@
+root::13481::::::
+bin:*:13481::::::
+daemon:*:13481::::::
+lp:*:13481::::::
+mail:*:13481::::::
+news:*:13481::::::
+uucp:*:13481::::::
+games:*:13481::::::
+man:*:13481::::::
+wwwrun:*:13481::::::
+ftp:*:13481::::::
+nobody:*:13481::::::
+messagebus:!:13481:0::7:::
+haldaemon:!:13481:0::7:::
diff --git a/lib/distro-info/suse-10.1/settings b/lib/distro-info/suse-10.1/settings
new file mode 100644
index 00000000..b4b7d219
--- /dev/null
+++ b/lib/distro-info/suse-10.1/settings
@@ -0,0 +1,107 @@
+$repository{base} = {
+ 'urls' => "
+ http://ftp.gwdg.de/pub/opensuse/distribution/SL-10.1/inst-source
+ ftp://suse.inode.at/opensuse/distribution/SL-10.1/inst-source
+ http://mirrors.uol.com.br/pub/suse/distribution/SL-10.1/inst-source
+ ftp://klid.dk/opensuse/distribution/SL-10.1/inst-source
+ ftp://ftp.estpak.ee/pub/suse/opensuse/distribution/SL-10.1/inst-source
+ ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/SL-10.1/inst-source
+ ",
+ 'name' => 'SUSE Linux 10.1',
+ 'repo-subdir' => 'suse',
+};
+
+$repository{base_update} = {
+ 'urls' => "
+ http://ftp.gwdg.de/pub/suse/update/10.1
+ ",
+ 'name' => 'SUSE Linux 10.1 updates',
+ 'repo-subdir' => '',
+};
+
+$package_subdir = 'suse';
+
+$prereq_packages = "
+ i586/bzip2-1.0.3-15.i586.rpm
+ i586/glibc-2.4-25.i586.rpm i586/glibc-2.4-31.1.i586.rpm
+ i586/popt-1.7-268.i586.rpm
+ i586/rpm-4.4.2-40.i586.rpm i586/rpm-4.4.2-43.4.i586.rpm
+ i586/zlib-1.2.3-13.i586.rpm
+";
+
+$bootstrap_prereq_packages = "";
+
+$bootstrap_packages = "
+ i586/aaa_base-10.1-41.i586.rpm
+ i586/aaa_skel-2006.3.29-5.i586.rpm i586/aaa_skel-2006.5.19-0.2.i586.rpm
+ i586/ash-1.6.1-13.i586.rpm
+ i586/bash-3.1-22.i586.rpm i586/bash-3.1-24.3.i586.rpm
+ i586/blocxx-1.0.0-15.i586.rpm
+ i586/coreutils-5.93-20.i586.rpm
+ i586/cpio-2.6-17.i586.rpm
+ i586/cracklib-2.8.6-12.i586.rpm
+ i586/cyrus-sasl-2.1.21-18.i586.rpm
+ i586/db-4.3.29-13.i586.rpm
+ i586/diffutils-2.8.7-15.i586.rpm
+ i586/e2fsprogs-1.38-25.i586.rpm
+ i586/expat-2.0.0-11.i586.rpm
+ i586/file-4.16-13.i586.rpm i586/file-4.16-15.4.i586.rpm
+ i586/filesystem-10.1-5.i586.rpm
+ i586/fillup-1.42-116.i586.rpm
+ i586/findutils-4.2.27-12.i586.rpm
+ i586/gawk-3.1.5-18.i586.rpm
+ i586/gdbm-1.8.3-241.i586.rpm
+ i586/gpg-1.4.2-23.i586.rpm i586/gpg-1.4.2-23.7.i586.rpm
+ i586/grep-2.5.1a-18.i586.rpm
+ i586/gzip-1.3.5-157.i586.rpm i586/gzip-1.3.5-159.5.i586.rpm
+ i586/info-4.8-20.i586.rpm
+ i586/insserv-1.04.0-18.i586.rpm
+ i586/irqbalance-0.09-58.i586.rpm
+ i586/kernel-default-2.6.16.21-0.25.i586.rpm
+ i586/libacl-2.2.34-12.i586.rpm
+ i586/libattr-2.4.28-14.i586.rpm
+ i586/libcom_err-1.38-25.i586.rpm
+ i586/libgcc-4.1.0-25.i586.rpm
+ i586/libstdc++-4.1.0-25.i586.rpm
+ i586/libxcrypt-2.4-10.i586.rpm
+ i586/libzio-0.1-15.i586.rpm
+ i586/limal-1.1.6-8.i586.rpm
+ i586/limal-bootloader-1.1.2-7.i586.rpm
+ i586/limal-perl-1.1.6-8.i586.rpm
+ i586/logrotate-3.7.3-11.i586.rpm
+ i586/mdadm-2.2-30.i586.rpm
+ i586/mingetty-0.9.6s-86.i586.rpm
+ i586/mkinitrd-1.2-103.i586.rpm i586/mkinitrd-1.2-106.19.i586.rpm
+ i586/mktemp-1.5-742.i586.rpm
+ i586/module-init-tools-3.2.2-32.i586.rpm i586/module-init-tools-3.2.2-32.13.i586.rpm
+ i586/ncurses-5.5-16.i586.rpm
+ i586/net-tools-1.60-581.i586.rpm
+ i586/openldap2-client-2.3.19-18.i586.rpm
+ i586/openssl-0.9.8a-16.i586.rpm i586/openssl-0.9.8a-18.10.i586.rpm
+ i586/pam-0.99.3.0-25.i586.rpm i586/pam-0.99.3.0-29.3.i586.rpm
+ i586/pciutils-2.2.1-14.i586.rpm
+ i586/pcre-6.4-12.i586.rpm
+ i586/perl-5.8.8-12.i586.rpm
+ i586/perl-Bootloader-0.2.20-7.i586.rpm i586/perl-Bootloader-0.2.27-0.4.i586.rpm
+ i586/perl-gettext-1.05-11.i586.rpm
+ i586/permissions-2006.2.24-8.i586.rpm
+ i586/readline-5.1-22.i586.rpm
+ i586/reiserfs-3.6.19-17.i586.rpm
+ i586/sed-4.1.4-15.i586.rpm
+ i586/suse-release-10.1-9.i586.rpm
+ i586/sysvinit-2.86-19.i586.rpm
+ i586/udev-085-29.i586.rpm i586/udev-085-30.15.i586.rpm
+ i586/util-linux-2.12r-35.i586.rpm
+ noarch/suse-build-key-1.0-685.noarch.rpm
+ i586/libxml2-2.6.23-13.i586.rpm
+ i586/libxml2-python-2.6.23-15.i586.rpm
+ i586/python-2.4.2-18.i586.rpm
+ i586/python-elementtree-1.2.6-18.i586.rpm
+ i586/python-sqlite-1.1.6-17.i586.rpm
+ i586/python-urlgrabber-2.9.7-15.i586.rpm
+ i586/rpm-python-4.4.2-40.i586.rpm
+ i586/sqlite-3.2.8-14.i586.rpm
+ i586/yum-2.4.2-13.i586.rpm
+";
+
+$selection{default} = "list any packagenames here";
diff --git a/lib/distro-info/suse-10.1/settings.local b/lib/distro-info/suse-10.1/settings.local
new file mode 100644
index 00000000..cfd2e2cf
--- /dev/null
+++ b/lib/distro-info/suse-10.1/settings.local
@@ -0,0 +1,8 @@
+# Use local installation sources.
+$repository{base}->{url} = 'ftp://localhost/pub/opensuse/distribution/SL-10.1/inst-source';
+$repository{base_update}->{url} = 'ftp://localhost/pub/suse/update/10.1';
+
+# Add a new selection:
+$selection{kde} = "$selection{default} kdepim3
+even more packagenames here
+and more";
diff --git a/lib/distro-info/suse-10.1/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc b/lib/distro-info/suse-10.1/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc
new file mode 100644
index 00000000..7ec5c58d
--- /dev/null
+++ b/lib/distro-info/suse-10.1/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc
@@ -0,0 +1,17 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.2 (GNU/Linux)
+
+mQGiBEHtkpsRBACRHiXh3olS++6/Mp9N7ByGMmjaaE+Y8cJQLUPG1myrbW5aogIP
+0WenayhGbbgOHNWgd5dQ8KQpYYFoQuUHjFYzj5MvgrdOENOvD7ZNJ6+EmbkNh5cV
+zUYfNG9jdiGweZkyA1sh8DYS0JiUmQ4CzaBD/DotB/dCmDcyuNQFiw4qKwCglQah
+ATyueBRsOiXl0NIs1uB6dkkD/1A2YmQ6te1q38a1J+a8os6bDlMZhVnkZdhJdw6x
+eBwUb9XS0n7hyt/AKCcBnrDEUQJuhBMNgzctJvbuMv27yRMANAXZDQkp0ip/yHLJ
+PhUdSNTTRHOL9bV3t+JuZ9xmuclprwyrrJYUkEESXNc0tkuczHBP2c/RqA3OxYHt
+hrHLA/9Pqe2gEleeo8l26u/uFXs2dtwjh8EZmdhHoqGcOlpYR4DyAg2D+jYfh3RI
+oPzIwRlHVUR1ii5h8iPi98BVuEvukwfbbQ1K22Jwzxt6w3ihCXBKWKbeC3ElIMfA
+hVMchLFUbTAw+yodO/u3NHxKQ34+ginid9dVyxV5T0gpDEEHObQrT3BlbiBFbnRl
+cnByaXNlIFNlcnZlciA8c3VwcG9ydEBub3ZlbGwuY29tPoheBBMRAgAeBQJB7ZKb
+AhsDBgsJCAcDAgMVAgMDFgIBAh4BAheAAAoJEHPSXWMN+zGID4oAoJPTGZbZApW+
+tuU422mHYGwoqgjrAJ9fhzRhRbV3YsOxKUomNeuIfmWGXA==
+=Qv5+
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/lib/distro-info/suse-10.1/trusted-package-keys/gpg-pubkey-1d061a62-427a396f.asc b/lib/distro-info/suse-10.1/trusted-package-keys/gpg-pubkey-1d061a62-427a396f.asc
new file mode 100644
index 00000000..47973627
--- /dev/null
+++ b/lib/distro-info/suse-10.1/trusted-package-keys/gpg-pubkey-1d061a62-427a396f.asc
@@ -0,0 +1,19 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.2 (GNU/Linux)
+
+mQGiBEJ6OW8RBACVVHdTmdbEyYl7irkqhcpW0a7dDSxTR1+dHzhBKUqXs7K46XTj
+hfJfkHRgejAchbC6p+KEGBU/zTpa0O413WHBhYcaOFafMThDaiN70htBDocx0cNd
+Octd4ZIgHXH6dqVS7gkfh1+oLyl54N86PAPrwa0h9chuj5lliHoTvKCdNwCggtw9
+UNWr+Qe7FpL9qb3w1lzyaWsD/joTRsVu1DYmlmFgib5OGkht0uIF8YjLg5ubeyqm
+sm7dfeN2fo+DgRE7HYHAzEDPbtI+1t97xQo5EJuIWCjqtzF4o/H9OuT4B/rpDtIA
+SiJN2+ZhPwxSddBOfYhv46WcKnSZLyfIEu+KOMlI1RxhkGEjPE9mX2y7DtgXRM6K
+v5b8A/4rfX1eRugm45S2ghS8sTsJRoigbdIEA7eZIBWiKAZP+IgP6F3oUPoh2rwF
+HfxwERWoFgBQYV4cIBKszn86+WY+PQdHv9B0C/TVHoJfrO0vqv9RmWRwDzCVzdiq
+Fpy6hBs/KhLxUs1IYdsOgucYBUpmLBXWxEMjD9sQiUPhsiqjorQ9YnVpbGRAbm92
+ZWxsLmNvbSAoTm92ZWxsIExpbnV4IFByb2R1Y3RzKSA8c3VwcG9ydEBub3ZlbGwu
+Y29tPohfBBMRAgAfBQJCejlvBQkJZgGABAsHAwIDFQIDAxYCAQIeAQIXgAAKCRAq
+/hZCHQYaYp2yAJoD28kmYjNdM9W6Lssz5HpNWQBODACdHL9KRgNNfzl81er81rT+
+e5Q4N+mITAQTEQIADAUCQtOtxgWDCQyNKQAKCRCoTtronIAKyo1iAJ48A995oM0h
+AwtfFLFJ6ZsX4Fvq4wCfdTR6BbImJj3tmhYn3tC+Vy84ciQ=
+=Za9P
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/lib/distro-info/suse-10.1/trusted-package-keys/gpg-pubkey-307e3d54-44201d5d.asc b/lib/distro-info/suse-10.1/trusted-package-keys/gpg-pubkey-307e3d54-44201d5d.asc
new file mode 100644
index 00000000..5319bfe8
--- /dev/null
+++ b/lib/distro-info/suse-10.1/trusted-package-keys/gpg-pubkey-307e3d54-44201d5d.asc
@@ -0,0 +1,13 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.2 (GNU/Linux)
+
+mIsERCAdXQEEAL7MrBTz+3SBWpCm2ae2yaDqV3ezQcs2JlvqidJVhsZqQe9/jkxi
+KTEQW5+TXF/+BlQSiebunRI7oo3+9U8GyRCgs1sf+yRQWMLzZqRaarzRhw9w+Ihl
+edtqYl6/U2JZCb8Adp6d7RzlRliJdJ/VtsfXj2ef7Dwu7elOVSsmaBdtAAYptChT
+dVNFIFBhY2thZ2UgU2lnbmluZyBLZXkgPGJ1aWxkQHN1c2UuZGU+iLgEEwECACIF
+AkQgHV0CGwMFCQQ9AoAECwcDAgMVAgMDFgIBAh4BAheAAAoJEOOlw2Awfj1UjUIE
+AIf3SLlrfj2RsCDjyYThXen+A/WTYDPbY+NYmmVvFQilHNQY9ZrJ5cNohRQu6hA+
+Sccrf11Uy24tTHWSTzuG9VzFeeIAcIU02XHar0w3QbvTk6IqeG+OZlfOGJj1sdx4
+JKwpwk9mSdrq2ELhrkPZiVWS7RmRkPr2klwYgKGWbmOJ
+=ZmDA
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/lib/distro-info/suse-10.1/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc b/lib/distro-info/suse-10.1/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc
new file mode 100644
index 00000000..ead21308
--- /dev/null
+++ b/lib/distro-info/suse-10.1/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc
@@ -0,0 +1,30 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.2 (GNU/Linux)
+
+mQENAzbhLQQAAAEIAKAkXHe0lWRBXLpn38hMHy03F0I4Sszmoc8aaKJrhfhyMlOA
+BqvklPLE2f9UrI4Xc860gH79ZREwAgPt0pi6+SleNFLNcNFAuuHMLQOOsaMFatbz
+JR9i4m/lf6q929YROu5zB48rBAlcfTm+IBbijaEdnqpwGib45wE/Cfy6FAttBHQh
+1Kp+r/jPbf1mYAvljUfHKuvbg8t2EIQz/5yGp+n5trn9pElfQO2cRBq8LFpf1l+U
+P7EKjFmlOq+Gs/fF98/dP3DfniSd78LQPq5vp8RL8nr/o2i7jkAQ33m4f1wOBWd+
+cZovrKXYlXiR+Bf7m2hpZo+/sAzhd7LmAD0l09kABRG0JVN1U0UgU2VjdXJpdHkg
+VGVhbSA8c2VjdXJpdHlAc3VzZS5kZT6JARUDBRA24S1H5Fiyh7HKPEUBAVcOB/9b
+yHYji1/+4Xc2GhvXK0FSJN0MGgeXgW47yxDL7gmR4mNgjlIOUHZj0PEpVjWepOJ7
+tQS3L9oP6cpj1Fj/XxuLbkp5VCQ61hpt54coQAvYrnT9rtWEGN+xmwejT1WmYmDJ
+xG+EGBXKr+XP69oIUl1E2JO3rXeklulgjqRKos4cdXKgyjWZ7CP9V9daRXDtje63
+Om8gwSdU/nCvhdRIWp/Vwbf7Ia8iZr9OJ5YuQl0DBG4qmGDDrvImgPAFkYFzwlqo
+choXFQ9y0YVCV41DnR+GYhwl2qBd81T8aXhihEGPIgaw3g8gd8B5o6mPVgl+nJqI
+BkEYGBusiag2pS6qwznZiQEVAwUQNuEtBHey5gA9JdPZAQFtOAf+KVh939b0J94u
+v/kpg4xs1LthlhquhbHcKNoVTNspugiC3qMPyvSX4XcBr2PC0cVkS4Z9PY9iCfT+
+x9WM96g39dAF+le2CCx7XISk9XXJ4ApEy5g4AuK7NYgAJd39PPbERgWnxjxir9g0
+Ix30dS30bW39D+3NPU5Ho9TD/B7UDFvYT5AWHl3MGwo3a1RhTs6sfgL7yQ3U+mvq
+MkTExZb5mfN1FeaYKMopoI4VpzNVeGxQWIz67VjJHVyUlF20ekOz4kWVgsxkc8G2
+saqZd6yv2EwqYTi8BDAduweP33KrQc4KDDommQNDOXxaKOeCoESIdM4p7Esdjq1o
+L0oixF12CohGBBARAgAGBQI7HmHDAAoJEJ5A4xAACqukTlQAoI4QzP9yjPohY7OU
+F7J3eKBTzp25AJ42BmtSd3pvm5ldmognWF3Trhp+GYkAlQMFEDe3O8IWkDf+zvyS
+FQEBAfkD/3GG5UgJj18UhYmh1gfjIlDcPAeqMwSytEHDENmHC+vlZQ/p0mT9tPiW
+tp34io54mwr+bLPN8l6B5GJNkbGvH6M+mO7R8Lj4nHL6pyAv3PQr83WyLHcaX7It
+Klj371/4yzKV6qpz43SGRK4MacLo2rNZ/dNej7lwPCtzCcFYwqkiiEYEEBECAAYF
+AjoaQqQACgkQx1KqMrDf94ArewCfWnTUDG5gNYkmHG4bYL8fQcizyA4An2eVo/n+
+3J2KRWSOhpAMsnMxtPbB
+=Ay23
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/lib/distro-info/suse-10.1/trusted-package-keys/gpg-pubkey-9c800aca-40d8063e.asc b/lib/distro-info/suse-10.1/trusted-package-keys/gpg-pubkey-9c800aca-40d8063e.asc
new file mode 100644
index 00000000..b49e52d2
--- /dev/null
+++ b/lib/distro-info/suse-10.1/trusted-package-keys/gpg-pubkey-9c800aca-40d8063e.asc
@@ -0,0 +1,37 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.2 (GNU/Linux)
+
+mQGiBDnu9IERBACT8Y35+2vv4MGVKiLEMOl9GdST6MCkYS3yEKeueNWc+z/0Kvff
+4JctBsgs47tjmiI9sl0eHjm3gTR8rItXMN6sJEUHWzDP+Y0PFPboMvKx0FXl/A0d
+M+HFrruCgBlWt6FA+okRySQiliuI5phwqkXefl9AhkwR8xocQSVCFxcwvwCglVcO
+QliHu8jwRQHxlRE0tkwQQI0D+wfQwKdvhDplxHJ5nf7U8c/yE/vdvpN6lF0tmFrK
+XBUX+K7u4ifrZlQvj/81M4INjtXreqDiJtr99Rs6xa0ScZqITuZC4CWxJa9GynBE
+D3+D2t1V/f8l0smsuYoFOF7Ib49IkTdbtwAThlZp8bEhELBeGaPdNCcmfZ66rKUd
+G5sRA/9ovnc1krSQF2+sqB9/o7w5/q2qiyzwOSTnkjtBUVKn4zLUOf6aeBAoV6NM
+CC3Kj9aZHfA+ND0ehPaVGJgjaVNFhPi4x0e7BULdvgOoAqajLfvkURHAeSsxXIoE
+myW/xC1sBbDkDUIBSx5oej73XCZgnj/inphRqGpsb+1nKFvF+rQoU3VTRSBQYWNr
+YWdlIFNpZ25pbmcgS2V5IDxidWlsZEBzdXNlLmRlPohiBBMRAgAiBQJA2AY+AhsD
+BQkObd+9BAsHAwIDFQIDAxYCAQIeAQIXgAAKCRCoTtronIAKypCfAJ9RuZ6ZSV7Q
+W4pTgTIxQ+ABPp0sIwCffG9bCNnrETPlgOn+dGEkAWegKL+IRgQQEQIABgUCOnBe
+UgAKCRCeQOMQAAqrpNzOAKCL512FZvv4VZx94TpbA9lxyoAejACeOO1HIbActAev
+k5MUBhNeLZa/qM2JARUDBRA6cGBvd7LmAD0l09kBATWnB/9An5vfiUUE1VQnt+T/
+EYklES3tXXaJJp9pHMa4fzFa8jPVtv5UBHGee3XoUNDVwM2OgSEISZxbzdXGnqIl
+cT08TzBUD9i579uifklLsnr35SJDZ6ram51/CWOnnaVhUzneOA9gTPSr+/fT3WeV
+nwJiQCQ30kNLWVXWATMnsnT486eAOlT6UNBPYQLpUprF5Yryk23pQUPAgJENDEqe
+U6iIO9Ot1ZPtB0lniw+/xCi13D360o1tZDYOp0hHHJN3D3EN8C1yPqZd5CvvznYv
+B6bWBIpWcRgdn2DUVMmpU661jwqGlRz1F84JG/xe4jGuzgpJt9IXSzyohEJB6XG5
++D0BuQINBDnu9JIQCACEkdBN6Mxf5WvqDWkcMRy6wnrd9DYJ8UUTmIT2iQf07tRU
+KJJ9v0JXfx2Z4d08IQSMNRaq4VgSe+PdYgIy0fbj23Via5/gO7fJEpD2hd2f+pMn
+OWvH2rOOIbeYfuhzAc6BQjAKtmgR0ERUTafTM9Wb6F13CNZZNZfDqnFDP6L12w3z
+3F7FFXkz07Rs3AIto1ZfYZd4sCSpMr/0S5nLrHbIvGLp271hhQBeRmmoGEKO2JRe
+lGgUJ2CUzOdtwDIKT0LbCpvaP8PVnYF5IFoYJIWRHqlEt5ucTXstZy7vYjL6vTP4
+l5xs+LIOkNmPhqmfsgLzVo0UaLt80hOwc4NvDCOLAAMGB/9g+9V3ORzw4LvO1pwR
+YJqfDKUq/EJ0rNMMD4N8RLpZRhKHKJUm9nNHLbksnlZwrbSTM5LpC/U6sheLP+l0
+bLVoq0lmsCcUSyh+mY6PxWirLIWCn/IAZAGnXb6Zd6TtIJlGG6pqUN8QxGJYQnon
+l0uTJKHJENbI9sWHQdcTtBMc34gorHFCo1Bcvpnc1LFLrWn7mfoGx6INQjf3HGQp
+MXAWuSBQhzkazY6vaWFpa8bBJ+gKbBuySWzNm3rFtT5HRKMWpO+M9bHp4d+puY0L
+1YwN1OMatcMMpcWnZpiWiR83oi32+xtWUY2U7Ae38mMag8zFbpeqPQUsDv9V7CAJ
+1dbriEwEGBECAAwFAkDYBnoFCQ5t3+gACgkQqE7a6JyACspnpgCfRbYwxT3iq+9l
+/PgNTUNTZOlof2oAn25y0eGi0371jap9kOV6uq71sUuO
+=pJli
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/lib/distro-info/suse-10.1/trusted-package-keys/pubring.gpg b/lib/distro-info/suse-10.1/trusted-package-keys/pubring.gpg
new file mode 100644
index 00000000..3e5ccffa
--- /dev/null
+++ b/lib/distro-info/suse-10.1/trusted-package-keys/pubring.gpg
Binary files differ
diff --git a/lib/distro-info/suse-10.2/prereqfiles/etc/group b/lib/distro-info/suse-10.2/prereqfiles/etc/group
new file mode 100644
index 00000000..505cb221
--- /dev/null
+++ b/lib/distro-info/suse-10.2/prereqfiles/etc/group
@@ -0,0 +1,33 @@
+root:x:0:
+bin:x:1:daemon
+daemon:x:2:
+sys:x:3:
+tty:x:5:
+disk:x:6:
+lp:x:7:
+www:x:8:
+kmem:x:9:
+wheel:x:10:
+mail:x:12:
+news:x:13:
+uucp:x:14:
+shadow:x:15:
+dialout:x:16:
+audio:x:17:
+floppy:x:19:
+cdrom:x:20:
+console:x:21:
+utmp:x:22:
+public:x:32:
+video:x:33:
+games:x:40:
+xok:x:41:
+trusted:x:42:
+modem:x:43:
+ftp:x:49:
+man:x:62:
+users:x:100:
+nobody:x:65533:
+nogroup:x:65534:nobody
+messagebus:!:101:
+haldaemon:!:102:
diff --git a/lib/distro-info/suse-10.2/prereqfiles/etc/passwd b/lib/distro-info/suse-10.2/prereqfiles/etc/passwd
new file mode 100644
index 00000000..9b8fc4fe
--- /dev/null
+++ b/lib/distro-info/suse-10.2/prereqfiles/etc/passwd
@@ -0,0 +1,14 @@
+root:x:0:0:root:/root:/bin/bash
+bin:x:1:1:bin:/bin:/bin/bash
+daemon:x:2:2:Daemon:/sbin:/bin/bash
+lp:x:4:7:Printing daemon:/var/spool/lpd:/bin/bash
+mail:x:8:12:Mailer daemon:/var/spool/clientmqueue:/bin/false
+news:x:9:13:News system:/etc/news:/bin/bash
+uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash
+games:x:12:100:Games account:/var/games:/bin/bash
+man:x:13:62:Manual pages viewer:/var/cache/man:/bin/bash
+wwwrun:x:30:8:WWW daemon apache:/var/lib/wwwrun:/bin/false
+ftp:x:40:49:FTP account:/srv/ftp:/bin/bash
+nobody:x:65534:65533:nobody:/var/lib/nobody:/bin/bash
+messagebus:x:100:101:User for D-Bus:/var/run/dbus:/bin/false
+haldaemon:x:101:102:User for haldaemon:/var/run/hal:/bin/false
diff --git a/lib/distro-info/suse-10.2/prereqfiles/etc/shadow b/lib/distro-info/suse-10.2/prereqfiles/etc/shadow
new file mode 100644
index 00000000..cd100a5a
--- /dev/null
+++ b/lib/distro-info/suse-10.2/prereqfiles/etc/shadow
@@ -0,0 +1,14 @@
+root::13481::::::
+bin:*:13481::::::
+daemon:*:13481::::::
+lp:*:13481::::::
+mail:*:13481::::::
+news:*:13481::::::
+uucp:*:13481::::::
+games:*:13481::::::
+man:*:13481::::::
+wwwrun:*:13481::::::
+ftp:*:13481::::::
+nobody:*:13481::::::
+messagebus:!:13481:0::7:::
+haldaemon:!:13481:0::7:::
diff --git a/lib/distro-info/suse-10.2/settings b/lib/distro-info/suse-10.2/settings
new file mode 100644
index 00000000..98521087
--- /dev/null
+++ b/lib/distro-info/suse-10.2/settings
@@ -0,0 +1,111 @@
+$repository{base} = {
+ 'urls' => "
+ http://ftp.gwdg.de/pub/opensuse/distribution/10.2/repo/oss
+ ftp://suse.inode.at/opensuse/distribution/10.2/repo/oss
+ http://mirrors.uol.com.br/pub/suse/distribution/10.2/repo/oss
+ ftp://klid.dk/opensuse/distribution/10.2/repo/oss
+ ftp://ftp.estpak.ee/pub/suse/opensuse/distribution/10.2/repo/oss
+ ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/10.2/repo/oss
+ ",
+ 'name' => 'openSUSE 10.2',
+ 'repo-subdir' => '',
+};
+
+$repository{base_update} = {
+ 'urls' => "
+ http://ftp.gwdg.de/pub/suse/update/10.2
+ ",
+ 'name' => 'openSUSE 10.2 updates',
+ 'repo-subdir' => 'suse',
+};
+
+$package_subdir = 'suse';
+
+$prereq_packages = "
+ i586/bzip2-1.0.3-36.i586.rpm
+ i586/glibc-2.5-25.i586.rpm
+ i586/popt-1.7-304.i586.rpm
+ i586/rpm-4.4.2-76.i586.rpm
+ i586/zlib-1.2.3-33.i586.rpm
+";
+
+$bootstrap_prereq_packages = "";
+
+$bootstrap_packages = "
+ i586/aaa_base-10.2-38.i586.rpm
+ i586/aaa_skel-2006.5.19-20.i586.rpm
+ i586/audit-libs-1.2.6-20.i586.rpm
+ i586/bash-3.1-55.i586.rpm
+ i586/blocxx-1.0.0-36.i586.rpm
+ i586/coreutils-6.4-10.i586.rpm
+ i586/cpio-2.6-40.i586.rpm
+ i586/cracklib-2.8.9-20.i586.rpm
+ i586/cyrus-sasl-2.1.22-28.i586.rpm
+ i586/db-4.4.20-16.i586.rpm
+ i586/diffutils-2.8.7-38.i586.rpm
+ i586/e2fsprogs-1.39-21.i586.rpm
+ i586/file-4.17-23.i586.rpm
+ i586/filesystem-10.2-22.i586.rpm
+ i586/fillup-1.42-138.i586.rpm
+ i586/findutils-4.2.28-24.i586.rpm
+ i586/gawk-3.1.5-41.i586.rpm
+ i586/gdbm-1.8.3-261.i586.rpm
+ i586/gpg-1.4.5-24.i586.rpm
+ i586/grep-2.5.1a-40.i586.rpm
+ i586/gzip-1.3.5-178.i586.rpm
+ i586/info-4.8-43.i586.rpm
+ i586/insserv-1.04.0-42.i586.rpm
+ i586/irqbalance-0.09-80.i586.rpm
+ i586/kernel-default-2.6.18.2-34.i586.rpm
+ i586/libacl-2.2.34-33.i586.rpm
+ i586/libattr-2.4.28-38.i586.rpm
+ i586/libcom_err-1.39-21.i586.rpm
+ i586/libgcc41-4.1.2_20061115-5.i586.rpm
+ i586/libstdc++41-4.1.2_20061115-5.i586.rpm
+ i586/libvolume_id-103-12.i586.rpm
+ i586/libxcrypt-2.4-30.i586.rpm
+ i586/libzio-0.2-20.i586.rpm
+ i586/limal-1.2.9-5.i586.rpm
+ i586/limal-bootloader-1.2.4-6.i586.rpm
+ i586/limal-perl-1.2.9-5.i586.rpm
+ i586/logrotate-3.7.4-21.i586.rpm
+ i586/mdadm-2.5.3-17.i586.rpm
+ i586/mingetty-0.9.6s-107.i586.rpm
+ i586/mkinitrd-1.2-149.i586.rpm
+ i586/mktemp-1.5-763.i586.rpm
+ i586/module-init-tools-3.2.2-62.i586.rpm
+ i586/ncurses-5.5-42.i586.rpm
+ i586/net-tools-1.60-606.i586.rpm
+ i586/openldap2-client-2.3.27-25.i586.rpm
+ i586/openssl-0.9.8d-17.i586.rpm
+ i586/openSUSE-release-10.2-35.i586.rpm
+ i586/pam-0.99.6.3-24.i586.rpm
+ i586/pciutils-2.2.4-13.i586.rpm
+ i586/pcre-6.7-21.i586.rpm
+ i586/perl-5.8.8-32.i586.rpm
+ i586/perl-Bootloader-0.4.5-3.i586.rpm
+ i586/perl-gettext-1.05-31.i586.rpm
+ i586/permissions-2006.11.13-5.i586.rpm
+ i586/readline-5.1-55.i586.rpm
+ i586/reiserfs-3.6.19-37.i586.rpm
+ i586/sed-4.1.5-21.i586.rpm
+ i586/sysvinit-2.86-47.i586.rpm
+ i586/udev-103-12.i586.rpm
+ i586/util-linux-2.12r-61.i586.rpm
+ noarch/pciutils-ids-2006.11.18-2.noarch.rpm
+ noarch/suse-build-key-1.0-707.noarch.rpm
+ i586/glib2-2.12.4-15.i586.rpm
+ i586/gnome-filesystem-0.1-288.i586.rpm
+ i586/libxml2-2.6.26-26.i586.rpm
+ i586/libxml2-python-2.6.26-29.i586.rpm
+ i586/rpm-python-4.4.2-76.i586.rpm
+ i586/python-2.5-19.i586.rpm
+ i586/python-sqlite-1.1.8-11.i586.rpm
+ i586/python-urlgrabber-3.1.0-18.i586.rpm
+ i586/python-xml-2.5-19.i586.rpm
+ i586/sqlite-3.3.8-14.i586.rpm
+ i586/yum-3.0.1-9.i586.rpm
+ i586/yum-metadata-parser-1.0.2-23.i586.rpm
+";
+
+$selection{default} = "list any packagenames here";
diff --git a/lib/distro-info/suse-10.2/settings.local b/lib/distro-info/suse-10.2/settings.local
new file mode 100644
index 00000000..12750a41
--- /dev/null
+++ b/lib/distro-info/suse-10.2/settings.local
@@ -0,0 +1,8 @@
+# Use local installation sources.
+# $repository{base}->{url} = "ftp://gab/pub/opensuse/distribution/10.2/repo/oss";
+# $repository{update}->{url} = "ftp://gab/pub/suse/update/10.2";
+
+# Add a new selection:
+$selection{kde} = "$selection{default} kdepim3
+even more packagenames here
+and more";