summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSebastian Schmelzer2010-09-02 17:50:49 +0200
committerSebastian Schmelzer2010-09-02 17:50:49 +0200
commit416ab8a37f1b07dc9f6c0fb3ff1a8ff2036510b5 (patch)
tree4715f7d742fec50931017f38fe6ff0a89d4ceccc /src
parentFix for the problem reported on the list (sed filter forgotten for the (diff)
downloadcore-416ab8a37f1b07dc9f6c0fb3ff1a8ff2036510b5.tar.gz
core-416ab8a37f1b07dc9f6c0fb3ff1a8ff2036510b5.tar.xz
core-416ab8a37f1b07dc9f6c0fb3ff1a8ff2036510b5.zip
change dir structure
Diffstat (limited to 'src')
-rwxr-xr-xsrc/bin/devel-tools/determineMinimumPackageSet.pl183
-rwxr-xr-xsrc/bin/devel-tools/extractTranslations.pl242
-rwxr-xr-xsrc/bin/devel-tools/generateSettings.pl207
-rwxr-xr-xsrc/bin/devel-tools/parseSusePatterns.pl163
-rwxr-xr-xsrc/bin/slxldd128
-rwxr-xr-xsrc/bin/slxsettings381
-rw-r--r--src/boot-env/OpenSLX/BootEnvironment/Base.pm160
-rw-r--r--src/boot-env/OpenSLX/BootEnvironment/PBS.pm247
-rw-r--r--src/boot-env/OpenSLX/BootEnvironment/PXE.pm336
-rw-r--r--src/boot-env/OpenSLX/BootEnvironment/Preboot.pm209
-rw-r--r--src/boot-env/OpenSLX/BootEnvironment/Preboot/Base.pm111
-rw-r--r--src/boot-env/OpenSLX/BootEnvironment/Preboot/CD.pm155
-rw-r--r--src/boot-env/OpenSLX/MakeInitRamFS/Distro/Base.pm48
-rw-r--r--src/boot-env/OpenSLX/MakeInitRamFS/Distro/Debian.pm61
-rw-r--r--src/boot-env/OpenSLX/MakeInitRamFS/Distro/Scilin.pm61
-rw-r--r--src/boot-env/OpenSLX/MakeInitRamFS/Distro/Suse.pm62
-rw-r--r--src/boot-env/OpenSLX/MakeInitRamFS/Distro/Ubuntu.pm73
-rw-r--r--src/boot-env/OpenSLX/MakeInitRamFS/Distro/Ubuntu_9.pm38
-rw-r--r--src/boot-env/OpenSLX/MakeInitRamFS/Engine/Base.pm453
-rw-r--r--src/boot-env/OpenSLX/MakeInitRamFS/Engine/PBS.pm42
-rw-r--r--src/boot-env/OpenSLX/MakeInitRamFS/Engine/Preboot.pm143
-rw-r--r--src/boot-env/OpenSLX/MakeInitRamFS/Engine/SlxBoot.pm264
-rwxr-xr-xsrc/boot-env/pbs/uclib-rootfs/bin/bbinit19
-rwxr-xr-xsrc/boot-env/pbs/uclib-rootfs/bin/handleEvents38
-rwxr-xr-xsrc/boot-env/pbs/uclib-rootfs/etc/bbinit.d/example32
-rw-r--r--src/boot-env/pbs/uclib-rootfs/etc/events/example2
-rwxr-xr-xsrc/boot-env/pbs/uclib-rootfs/init234
-rw-r--r--src/boot-env/pbs/uclib-rootfs/preboot/preboot-scripts/dialog.functions105
-rw-r--r--src/boot-env/preboot/conf/apache-openslx-preboot.conf24
-rwxr-xr-xsrc/boot-env/preboot/http-server/user_settings.pl97
-rwxr-xr-xsrc/boot-env/preboot/http-server/users.pl90
-rw-r--r--src/boot-env/preboot/preboot-scripts/dialog.functions105
-rwxr-xr-xsrc/boot-env/preboot/preboot.sh95
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/init216
l---------src/boot-env/preboot/uclib-rootfs/lib/libcurses.so1
l---------src/boot-env/preboot/uclib-rootfs/lib/libncurses.so1
l---------src/boot-env/preboot/uclib-rootfs/lib/libncurses.so.51
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/lib/libncurses.so.5.6bin0 -> 229164 bytes
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/usr/bin/clearbin0 -> 5156 bytes
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/usr/bin/dialogbin0 -> 108520 bytes
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/usr/bin/w3mbin0 -> 1093832 bytes
l---------src/boot-env/preboot/uclib-rootfs/usr/lib/libcrypto.so1
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/usr/lib/libcrypto.so.0.9.8bin0 -> 1143120 bytes
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/usr/lib/libcurses.so11
l---------src/boot-env/preboot/uclib-rootfs/usr/lib/libform.so1
l---------src/boot-env/preboot/uclib-rootfs/usr/lib/libform.so.51
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/usr/lib/libform.so.5.6bin0 -> 39044 bytes
l---------src/boot-env/preboot/uclib-rootfs/usr/lib/libmenu.so1
l---------src/boot-env/preboot/uclib-rootfs/usr/lib/libmenu.so.51
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/usr/lib/libmenu.so.5.6bin0 -> 21968 bytes
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/usr/lib/libncurses.so11
l---------src/boot-env/preboot/uclib-rootfs/usr/lib/libpanel.so1
l---------src/boot-env/preboot/uclib-rootfs/usr/lib/libpanel.so.51
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/usr/lib/libpanel.so.5.6bin0 -> 9212 bytes
l---------src/boot-env/preboot/uclib-rootfs/usr/lib/libssl.so1
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/usr/lib/libssl.so.0.9.8bin0 -> 237392 bytes
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/usr/sbin/kdumpbin0 -> 5200 bytes
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/usr/sbin/kexecbin0 -> 104068 bytes
-rw-r--r--src/boot-env/syslinux/LICENSE3
-rw-r--r--src/boot-env/syslinux/README.iso6
-rw-r--r--src/boot-env/syslinux/README.pxe68
-rwxr-xr-xsrc/boot-env/syslinux/extlinuxbin0 -> 52294 bytes
-rw-r--r--src/boot-env/syslinux/initramfs-shutdownbin0 -> 665088 bytes
-rw-r--r--src/boot-env/syslinux/isolinux.binbin0 -> 14336 bytes
-rw-r--r--src/boot-env/syslinux/kernel-shutdownbin0 -> 688752 bytes
-rwxr-xr-xsrc/boot-env/syslinux/mboot.c32bin0 -> 30380 bytes
-rw-r--r--src/boot-env/syslinux/mbr.binbin0 -> 440 bytes
-rwxr-xr-xsrc/boot-env/syslinux/menu.c32bin0 -> 54836 bytes
-rw-r--r--src/boot-env/syslinux/pxechain.combin0 -> 998 bytes
-rw-r--r--src/boot-env/syslinux/pxelinux.0bin0 -> 16662 bytes
-rw-r--r--src/boot-env/syslinux/pxemenu-bottom.example39
-rw-r--r--src/boot-env/syslinux/pxemenu-include.example58
-rwxr-xr-xsrc/boot-env/syslinux/syslinuxbin0 -> 25472 bytes
-rw-r--r--src/boot-env/syslinux/themes/openslx/openslx.pngbin0 -> 20453 bytes
-rw-r--r--src/boot-env/syslinux/themes/openslx/theme.conf40
-rw-r--r--src/boot-env/syslinux/themes/openslxpbs/openslx.pngbin0 -> 168728 bytes
-rw-r--r--src/boot-env/syslinux/themes/openslxpbs/theme.conf40
-rwxr-xr-xsrc/boot-env/syslinux/vesamenu.c32bin0 -> 147996 bytes
-rw-r--r--src/config-db/OpenSLX/AttributeRoster.pm537
-rw-r--r--src/config-db/OpenSLX/ConfigDB.pm3190
-rw-r--r--src/config-db/OpenSLX/ConfigExport/DHCP/ISC.pm45
-rw-r--r--src/config-db/OpenSLX/DBSchema.pm832
-rw-r--r--src/config-db/OpenSLX/MetaDB/Base.pm1220
-rw-r--r--src/config-db/OpenSLX/MetaDB/DBI.pm1540
-rw-r--r--src/config-db/OpenSLX/MetaDB/SQLite.pm130
-rw-r--r--src/config-db/OpenSLX/MetaDB/mysql.pm179
-rwxr-xr-xsrc/config-db/slxconfig1785
-rwxr-xr-xsrc/config-db/slxconfig-demuxer918
-rw-r--r--src/config-db/t/01-basics.t23
-rw-r--r--src/config-db/t/10-vendor-os.t258
-rw-r--r--src/config-db/t/11-export.t247
-rw-r--r--src/config-db/t/12-system.t360
-rw-r--r--src/config-db/t/13-client.t320
-rw-r--r--src/config-db/t/14-group.t384
-rw-r--r--src/config-db/t/15-global_info.t43
-rw-r--r--src/config-db/t/20-client_system_ref.t208
-rw-r--r--src/config-db/t/21-group_system_ref.t195
-rw-r--r--src/config-db/t/22-group_client_ref.t186
-rw-r--r--src/config-db/t/25-attributes.t677
-rw-r--r--src/config-db/t/29-transaction.t58
-rwxr-xr-xsrc/config-db/t/run-all-tests.pl36
-rw-r--r--src/initramfs/distro-specs/debian/functions-4.014
-rw-r--r--src/initramfs/distro-specs/debian/functions-default209
-rw-r--r--src/initramfs/distro-specs/scilin/functions-4.715
-rw-r--r--src/initramfs/distro-specs/scilin/functions-5.342
-rw-r--r--src/initramfs/distro-specs/scilin/functions-5.442
-rw-r--r--src/initramfs/distro-specs/scilin/functions-5.542
-rw-r--r--src/initramfs/distro-specs/scilin/functions-default315
-rw-r--r--src/initramfs/distro-specs/suse/functions-10.282
-rw-r--r--src/initramfs/distro-specs/suse/functions-10.326
-rw-r--r--src/initramfs/distro-specs/suse/functions-11.190
-rw-r--r--src/initramfs/distro-specs/suse/functions-11.295
-rw-r--r--src/initramfs/distro-specs/suse/functions-11.397
-rw-r--r--src/initramfs/distro-specs/suse/functions-default608
-rw-r--r--src/initramfs/distro-specs/ubuntu/functions-10.0416
-rw-r--r--src/initramfs/distro-specs/ubuntu/functions-8.04296
-rw-r--r--src/initramfs/distro-specs/ubuntu/functions-8.10296
-rw-r--r--src/initramfs/distro-specs/ubuntu/functions-9.04293
-rw-r--r--src/initramfs/distro-specs/ubuntu/functions-9.1016
-rw-r--r--src/initramfs/distro-specs/ubuntu/functions-default286
-rwxr-xr-xsrc/initramfs/eglibc-packages/compcache/usr/bin/rzscontrolbin0 -> 7040 bytes
-rw-r--r--src/initramfs/eglibc-packages/hwinfo/lib/libdbus-1.so.3bin0 -> 231492 bytes
-rw-r--r--src/initramfs/eglibc-packages/hwinfo/lib/librt.so.1bin0 -> 30684 bytes
-rw-r--r--src/initramfs/eglibc-packages/hwinfo/usr/lib/libhal.so.1bin0 -> 61852 bytes
-rw-r--r--src/initramfs/eglibc-packages/hwinfo/usr/lib/libhd.so.16bin0 -> 1865944 bytes
-rwxr-xr-xsrc/initramfs/eglibc-packages/hwinfo/usr/sbin/hwinfobin0 -> 28020 bytes
-rw-r--r--src/initramfs/eglibc-packages/mksquashfs/lib/libm.so.6bin0 -> 149392 bytes
-rwxr-xr-xsrc/initramfs/eglibc-packages/mksquashfs/lib/libpthread.so.0bin0 -> 117105 bytes
-rwxr-xr-xsrc/initramfs/eglibc-packages/mksquashfs/usr/bin/mksquashfs_3_3bin0 -> 93192 bytes
-rwxr-xr-xsrc/initramfs/eglibc-packages/mksquashfs/usr/bin/mksquashfs_4bin0 -> 97460 bytes
-rwxr-xr-xsrc/initramfs/eglibc-packages/nbd-client/sbin/nbd-clientbin0 -> 11836 bytes
-rwxr-xr-xsrc/initramfs/eglibc-packages/plymouth/bin/plymouthbin0 -> 27428 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/lib/libply-splash-core.so.2bin0 -> 62216 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/lib/libply.so.2bin0 -> 75816 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/lib/librt.so.1bin0 -> 30684 bytes
-rwxr-xr-xsrc/initramfs/eglibc-packages/plymouth/sbin/plymouthdbin0 -> 53124 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/details/details.plymouth4
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/fade-in/bullet.pngbin0 -> 296 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/fade-in/entry.pngbin0 -> 350 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/fade-in/fade-in.plymouth7
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/fade-in/lock.pngbin0 -> 29126 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/fade-in/star.pngbin0 -> 1057 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/box.pngbin0 -> 870 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/bullet.pngbin0 -> 131 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/entry.pngbin0 -> 367 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/glow.plymouth11
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/lock.pngbin0 -> 1896 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-00.pngbin0 -> 519 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-01.pngbin0 -> 599 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-02.pngbin0 -> 644 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-03.pngbin0 -> 704 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-04.pngbin0 -> 736 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-05.pngbin0 -> 786 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-06.pngbin0 -> 780 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-07.pngbin0 -> 775 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-08.pngbin0 -> 776 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-09.pngbin0 -> 769 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-10.pngbin0 -> 866 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-11.pngbin0 -> 970 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-12.pngbin0 -> 1014 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-13.pngbin0 -> 1107 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-14.pngbin0 -> 1120 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-15.pngbin0 -> 1078 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-16.pngbin0 -> 955 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-17.pngbin0 -> 1091 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-18.pngbin0 -> 1194 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-19.pngbin0 -> 1249 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-20.pngbin0 -> 1239 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-21.pngbin0 -> 1306 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-22.pngbin0 -> 1287 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-23.pngbin0 -> 1279 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-24.pngbin0 -> 1202 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-25.pngbin0 -> 1299 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-26.pngbin0 -> 1380 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-27.pngbin0 -> 1453 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-28.pngbin0 -> 1468 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-29.pngbin0 -> 1498 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-30.pngbin0 -> 1529 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-31.pngbin0 -> 1519 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-32.pngbin0 -> 1383 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-00.pngbin0 -> 2627 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-01.pngbin0 -> 3338 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-02.pngbin0 -> 4077 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-03.pngbin0 -> 4766 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-04.pngbin0 -> 6316 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-05.pngbin0 -> 6390 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-06.pngbin0 -> 8920 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-07.pngbin0 -> 9482 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-08.pngbin0 -> 9623 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-09.pngbin0 -> 9337 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-10.pngbin0 -> 8867 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-11.pngbin0 -> 8698 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-12.pngbin0 -> 8258 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-13.pngbin0 -> 12244 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-14.pngbin0 -> 11344 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-15.pngbin0 -> 6761 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-16.pngbin0 -> 6899 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-17.pngbin0 -> 6937 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-18.pngbin0 -> 6936 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-19.pngbin0 -> 6959 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/box.pngbin0 -> 870 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/bullet.pngbin0 -> 296 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/entry.pngbin0 -> 350 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/lock.pngbin0 -> 1896 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/progress_bar.pngbin0 -> 173 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/progress_box.pngbin0 -> 196 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/script.plymouth11
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/script.script164
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/box.pngbin0 -> 870 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/bullet.pngbin0 -> 296 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/entry.pngbin0 -> 350 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/lock.pngbin0 -> 1896 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/progress_bar.pngbin0 -> 246 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/solar.plymouth7
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/star.pngbin0 -> 355666 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/box.pngbin0 -> 870 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/bullet.pngbin0 -> 296 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/entry.pngbin0 -> 350 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/lock.pngbin0 -> 1896 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/spinfinity.plymouth7
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-00.pngbin0 -> 244 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-01.pngbin0 -> 304 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-02.pngbin0 -> 370 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-03.pngbin0 -> 424 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-04.pngbin0 -> 508 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-05.pngbin0 -> 563 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-06.pngbin0 -> 589 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-07.pngbin0 -> 562 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-08.pngbin0 -> 567 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-09.pngbin0 -> 560 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-10.pngbin0 -> 526 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-11.pngbin0 -> 492 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-12.pngbin0 -> 424 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-13.pngbin0 -> 360 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-14.pngbin0 -> 300 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-15.pngbin0 -> 244 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-16.pngbin0 -> 213 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-17.pngbin0 -> 245 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-18.pngbin0 -> 306 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-19.pngbin0 -> 372 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-20.pngbin0 -> 424 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-21.pngbin0 -> 513 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-22.pngbin0 -> 551 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-23.pngbin0 -> 595 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-24.pngbin0 -> 571 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-25.pngbin0 -> 570 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-26.pngbin0 -> 566 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-27.pngbin0 -> 521 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-28.pngbin0 -> 480 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-29.pngbin0 -> 424 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-30.pngbin0 -> 356 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-31.pngbin0 -> 293 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-32.pngbin0 -> 243 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-33.pngbin0 -> 213 bytes
-rw-r--r--src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/text/text.plymouth4
-rwxr-xr-xsrc/initramfs/eglibc-packages/strace/usr/bin/stracebin0 -> 207880 bytes
l---------src/initramfs/eglibc-rootfs/bin/ash1
l---------src/initramfs/eglibc-rootfs/bin/bash1
-rwxr-xr-xsrc/initramfs/eglibc-rootfs/bin/busyboxbin0 -> 377052 bytes
l---------src/initramfs/eglibc-rootfs/bin/cat1
l---------src/initramfs/eglibc-rootfs/bin/chgrp1
l---------src/initramfs/eglibc-rootfs/bin/chmod1
l---------src/initramfs/eglibc-rootfs/bin/chown1
l---------src/initramfs/eglibc-rootfs/bin/cp1
l---------src/initramfs/eglibc-rootfs/bin/cpio1
l---------src/initramfs/eglibc-rootfs/bin/cttyhack1
l---------src/initramfs/eglibc-rootfs/bin/date1
l---------src/initramfs/eglibc-rootfs/bin/dd1
l---------src/initramfs/eglibc-rootfs/bin/df1
l---------src/initramfs/eglibc-rootfs/bin/dmesg1
l---------src/initramfs/eglibc-rootfs/bin/echo1
l---------src/initramfs/eglibc-rootfs/bin/egrep1
l---------src/initramfs/eglibc-rootfs/bin/false1
l---------src/initramfs/eglibc-rootfs/bin/grep1
l---------src/initramfs/eglibc-rootfs/bin/gunzip1
l---------src/initramfs/eglibc-rootfs/bin/gzip1
l---------src/initramfs/eglibc-rootfs/bin/ip1
l---------src/initramfs/eglibc-rootfs/bin/ipcalc1
l---------src/initramfs/eglibc-rootfs/bin/kill1
l---------src/initramfs/eglibc-rootfs/bin/ln1
l---------src/initramfs/eglibc-rootfs/bin/ls1
l---------src/initramfs/eglibc-rootfs/bin/mkdir1
l---------src/initramfs/eglibc-rootfs/bin/mknod1
l---------src/initramfs/eglibc-rootfs/bin/mount1
l---------src/initramfs/eglibc-rootfs/bin/mv1
l---------src/initramfs/eglibc-rootfs/bin/nice1
l---------src/initramfs/eglibc-rootfs/bin/pidof1
l---------src/initramfs/eglibc-rootfs/bin/ping1
l---------src/initramfs/eglibc-rootfs/bin/ps1
l---------src/initramfs/eglibc-rootfs/bin/pwd1
l---------src/initramfs/eglibc-rootfs/bin/rev1
l---------src/initramfs/eglibc-rootfs/bin/rm1
l---------src/initramfs/eglibc-rootfs/bin/sed1
l---------src/initramfs/eglibc-rootfs/bin/sh1
l---------src/initramfs/eglibc-rootfs/bin/sleep1
l---------src/initramfs/eglibc-rootfs/bin/sync1
l---------src/initramfs/eglibc-rootfs/bin/tar1
l---------src/initramfs/eglibc-rootfs/bin/touch1
l---------src/initramfs/eglibc-rootfs/bin/true1
l---------src/initramfs/eglibc-rootfs/bin/umount1
l---------src/initramfs/eglibc-rootfs/bin/uname1
l---------src/initramfs/eglibc-rootfs/bin/usleep1
l---------src/initramfs/eglibc-rootfs/bin/vi1
l---------src/initramfs/eglibc-rootfs/bin/zcat1
-rwxr-xr-xsrc/initramfs/eglibc-rootfs/lib/ld-2.11.2.sobin0 -> 113964 bytes
l---------src/initramfs/eglibc-rootfs/lib/ld-linux.so.21
-rwxr-xr-xsrc/initramfs/eglibc-rootfs/lib/libc.so.6bin0 -> 1315080 bytes
-rw-r--r--src/initramfs/eglibc-rootfs/lib/libdbus-1.so.3bin0 -> 231492 bytes
-rw-r--r--src/initramfs/eglibc-rootfs/lib/libdl.so.2bin0 -> 9736 bytes
-rw-r--r--src/initramfs/eglibc-rootfs/lib/libm.so.6bin0 -> 149392 bytes
-rw-r--r--src/initramfs/eglibc-rootfs/lib/librt.so.1bin0 -> 30684 bytes
l---------src/initramfs/eglibc-rootfs/sbin/bootchartd1
l---------src/initramfs/eglibc-rootfs/sbin/fbsplash1
l---------src/initramfs/eglibc-rootfs/sbin/fdisk1
l---------src/initramfs/eglibc-rootfs/sbin/getty1
l---------src/initramfs/eglibc-rootfs/sbin/halt1
l---------src/initramfs/eglibc-rootfs/sbin/hdparm1
l---------src/initramfs/eglibc-rootfs/sbin/hwclock1
l---------src/initramfs/eglibc-rootfs/sbin/inotifyd1
l---------src/initramfs/eglibc-rootfs/sbin/insmod1
l---------src/initramfs/eglibc-rootfs/sbin/klogd1
-rwxr-xr-xsrc/initramfs/eglibc-rootfs/sbin/ldconfigbin0 -> 651456 bytes
l---------src/initramfs/eglibc-rootfs/sbin/loadkmap1
l---------src/initramfs/eglibc-rootfs/sbin/logread1
l---------src/initramfs/eglibc-rootfs/sbin/lsmod1
l---------src/initramfs/eglibc-rootfs/sbin/lspci1
l---------src/initramfs/eglibc-rootfs/sbin/lsusb1
l---------src/initramfs/eglibc-rootfs/sbin/mdev1
l---------src/initramfs/eglibc-rootfs/sbin/mkdosfs1
l---------src/initramfs/eglibc-rootfs/sbin/mkfs.vfat1
l---------src/initramfs/eglibc-rootfs/sbin/mkswap1
l---------src/initramfs/eglibc-rootfs/sbin/modinfo1
l---------src/initramfs/eglibc-rootfs/sbin/modprobe1
l---------src/initramfs/eglibc-rootfs/sbin/poweroff1
l---------src/initramfs/eglibc-rootfs/sbin/reboot1
l---------src/initramfs/eglibc-rootfs/sbin/rmmod1
l---------src/initramfs/eglibc-rootfs/sbin/route1
l---------src/initramfs/eglibc-rootfs/sbin/start-stop-daemon1
l---------src/initramfs/eglibc-rootfs/sbin/swapoff1
l---------src/initramfs/eglibc-rootfs/sbin/swapon1
l---------src/initramfs/eglibc-rootfs/sbin/switch_root1
l---------src/initramfs/eglibc-rootfs/sbin/sysctl1
l---------src/initramfs/eglibc-rootfs/sbin/syslogd1
l---------src/initramfs/eglibc-rootfs/sbin/tunctl1
l---------src/initramfs/eglibc-rootfs/sbin/udhcpc1
l---------src/initramfs/eglibc-rootfs/sbin/vconfig1
l---------src/initramfs/eglibc-rootfs/sbin/watchdog1
l---------src/initramfs/eglibc-rootfs/sbin/zcip1
l---------src/initramfs/eglibc-rootfs/usr/bin/[1
l---------src/initramfs/eglibc-rootfs/usr/bin/[[1
l---------src/initramfs/eglibc-rootfs/usr/bin/ar1
l---------src/initramfs/eglibc-rootfs/usr/bin/arping1
l---------src/initramfs/eglibc-rootfs/usr/bin/awk1
l---------src/initramfs/eglibc-rootfs/usr/bin/basename1
l---------src/initramfs/eglibc-rootfs/usr/bin/bunzip21
l---------src/initramfs/eglibc-rootfs/usr/bin/bzcat1
l---------src/initramfs/eglibc-rootfs/usr/bin/bzip21
l---------src/initramfs/eglibc-rootfs/usr/bin/chvt1
l---------src/initramfs/eglibc-rootfs/usr/bin/cut1
l---------src/initramfs/eglibc-rootfs/usr/bin/deallocvt1
l---------src/initramfs/eglibc-rootfs/usr/bin/du1
l---------src/initramfs/eglibc-rootfs/usr/bin/dumpleases1
l---------src/initramfs/eglibc-rootfs/usr/bin/eject1
l---------src/initramfs/eglibc-rootfs/usr/bin/env1
l---------src/initramfs/eglibc-rootfs/usr/bin/expr1
l---------src/initramfs/eglibc-rootfs/usr/bin/fgconsole1
l---------src/initramfs/eglibc-rootfs/usr/bin/find1
l---------src/initramfs/eglibc-rootfs/usr/bin/flock1
l---------src/initramfs/eglibc-rootfs/usr/bin/free1
l---------src/initramfs/eglibc-rootfs/usr/bin/ftpget1
l---------src/initramfs/eglibc-rootfs/usr/bin/ftpput1
l---------src/initramfs/eglibc-rootfs/usr/bin/head1
l---------src/initramfs/eglibc-rootfs/usr/bin/id1
l---------src/initramfs/eglibc-rootfs/usr/bin/killall1
-rwxr-xr-xsrc/initramfs/eglibc-rootfs/usr/bin/ldbin0 -> 529192 bytes
-rwxr-xr-xsrc/initramfs/eglibc-rootfs/usr/bin/ldd193
l---------src/initramfs/eglibc-rootfs/usr/bin/less1
l---------src/initramfs/eglibc-rootfs/usr/bin/logger1
l---------src/initramfs/eglibc-rootfs/usr/bin/lspci1
l---------src/initramfs/eglibc-rootfs/usr/bin/lsusb1
l---------src/initramfs/eglibc-rootfs/usr/bin/lzcat1
l---------src/initramfs/eglibc-rootfs/usr/bin/lzma1
l---------src/initramfs/eglibc-rootfs/usr/bin/lzmacat1
l---------src/initramfs/eglibc-rootfs/usr/bin/md5sum1
l---------src/initramfs/eglibc-rootfs/usr/bin/nc1
l---------src/initramfs/eglibc-rootfs/usr/bin/nmeter1
l---------src/initramfs/eglibc-rootfs/usr/bin/openvt1
l---------src/initramfs/eglibc-rootfs/usr/bin/printf1
l---------src/initramfs/eglibc-rootfs/usr/bin/readahead1
l---------src/initramfs/eglibc-rootfs/usr/bin/readlink1
l---------src/initramfs/eglibc-rootfs/usr/bin/realpath1
l---------src/initramfs/eglibc-rootfs/usr/bin/rpm2cpio1
l---------src/initramfs/eglibc-rootfs/usr/bin/smemcap1
l---------src/initramfs/eglibc-rootfs/usr/bin/sort1
l---------src/initramfs/eglibc-rootfs/usr/bin/strings1
l---------src/initramfs/eglibc-rootfs/usr/bin/tail1
l---------src/initramfs/eglibc-rootfs/usr/bin/test1
l---------src/initramfs/eglibc-rootfs/usr/bin/tftp1
l---------src/initramfs/eglibc-rootfs/usr/bin/time1
l---------src/initramfs/eglibc-rootfs/usr/bin/timeout1
l---------src/initramfs/eglibc-rootfs/usr/bin/tr1
l---------src/initramfs/eglibc-rootfs/usr/bin/uniq1
l---------src/initramfs/eglibc-rootfs/usr/bin/unlzma1
l---------src/initramfs/eglibc-rootfs/usr/bin/unxz1
l---------src/initramfs/eglibc-rootfs/usr/bin/uptime1
l---------src/initramfs/eglibc-rootfs/usr/bin/wc1
l---------src/initramfs/eglibc-rootfs/usr/bin/wget1
l---------src/initramfs/eglibc-rootfs/usr/bin/which1
l---------src/initramfs/eglibc-rootfs/usr/bin/whoami1
l---------src/initramfs/eglibc-rootfs/usr/bin/xargs1
l---------src/initramfs/eglibc-rootfs/usr/bin/xz1
l---------src/initramfs/eglibc-rootfs/usr/bin/xzcat1
-rw-r--r--src/initramfs/eglibc-rootfs/usr/lib/libbfd-2.20.1-system.20100303.sobin0 -> 862364 bytes
-rw-r--r--src/initramfs/eglibc-rootfs/usr/lib/libfusion-1.2.so.9bin0 -> 32432 bytes
-rw-r--r--src/initramfs/eglibc-rootfs/usr/lib/libgcc_s.so.1bin0 -> 116600 bytes
-rw-r--r--src/initramfs/eglibc-rootfs/usr/lib/libhal.so.1bin0 -> 61852 bytes
-rw-r--r--src/initramfs/eglibc-rootfs/usr/lib/libhd.so.16bin0 -> 1865944 bytes
l---------src/initramfs/eglibc-rootfs/usr/lib/libm.so1
-rw-r--r--src/initramfs/eglibc-rootfs/usr/lib/libpcre.so.3bin0 -> 194216 bytes
-rw-r--r--src/initramfs/eglibc-rootfs/usr/lib/libz.so.1bin0 -> 79980 bytes
l---------src/initramfs/eglibc-rootfs/usr/sbin/brctl1
l---------src/initramfs/eglibc-rootfs/usr/sbin/chroot1
l---------src/initramfs/eglibc-rootfs/usr/sbin/dhcprelay1
l---------src/initramfs/eglibc-rootfs/usr/sbin/fbset1
l---------src/initramfs/eglibc-rootfs/usr/sbin/httpd1
-rwxr-xr-xsrc/initramfs/eglibc-rootfs/usr/sbin/hwinfobin0 -> 28020 bytes
l---------src/initramfs/eglibc-rootfs/usr/sbin/loadfont1
l---------src/initramfs/eglibc-rootfs/usr/sbin/rdate1
l---------src/initramfs/eglibc-rootfs/usr/sbin/setlogcons1
l---------src/initramfs/eglibc-rootfs/usr/sbin/udhcpd1
-rwxr-xr-xsrc/initramfs/stage3-stuff/bin/dhcpmkconfig47
-rwxr-xr-xsrc/initramfs/stage3-stuff/bin/hwautocfg299
-rwxr-xr-xsrc/initramfs/stage3-stuff/bin/init-wrapper60
-rwxr-xr-xsrc/initramfs/stage3-stuff/bin/servconfig308
-rw-r--r--src/initramfs/stage3-stuff/etc/functions1029
-rw-r--r--src/initramfs/stage3-stuff/etc/ldap-functions75
-rw-r--r--src/initramfs/stage3-stuff/etc/messages204
-rw-r--r--src/initramfs/stage3-stuff/etc/messages.de215
-rwxr-xr-xsrc/initramfs/stage3-stuff/init1030
-rwxr-xr-xsrc/initramfs/tools/hwinfo/bin/hwinfo-13.11bin0 -> 78772 bytes
-rwxr-xr-xsrc/initramfs/tools/hwinfo/bin/hwinfo-14.19bin0 -> 84276 bytes
-rwxr-xr-xsrc/initramfs/tools/hwinfo/bin/hwinfo-15.21bin0 -> 84560 bytes
-rwxr-xr-xsrc/initramfs/tools/hwinfo/bin/hwinfo-15.3bin0 -> 84632 bytes
-rwxr-xr-xsrc/initramfs/tools/hwinfo/bin/hwinfo-16.0bin0 -> 28020 bytes
-rw-r--r--src/initramfs/tools/hwinfo/db/hwinfo.db.tgzbin0 -> 10637 bytes
-rwxr-xr-xsrc/initramfs/tools/hwinfo/lib/libhd.so.13.11bin0 -> 2955703 bytes
-rwxr-xr-xsrc/initramfs/tools/hwinfo/lib/libhd.so.14.19bin0 -> 3216601 bytes
-rwxr-xr-xsrc/initramfs/tools/hwinfo/lib/libhd.so.15.21bin0 -> 3300198 bytes
-rwxr-xr-xsrc/initramfs/tools/hwinfo/lib/libhd.so.15.3bin0 -> 3226851 bytes
-rw-r--r--src/initramfs/tools/hwinfo/lib/libhd.so.16.0bin0 -> 1865944 bytes
-rwxr-xr-xsrc/initramfs/tools/mksquashfs/3.3/mksquashfsbin0 -> 76316 bytes
-rwxr-xr-xsrc/initramfs/tools/mksquashfs/3.3/unsquashfsbin0 -> 38660 bytes
-rwxr-xr-xsrc/initramfs/tpm/bin/detect-tpm.sh60
-rwxr-xr-xsrc/initramfs/tpm/bin/fetch-sshkeys.sh28
-rwxr-xr-xsrc/initramfs/tpm/bin/mygetty.sh10
-rwxr-xr-xsrc/initramfs/tpm/bin/showmac.sh9
-rw-r--r--src/initramfs/tpm/etc/bash.bashrc3
-rw-r--r--src/initramfs/tpm/etc/hosts3
-rw-r--r--src/initramfs/tpm/etc/inputrc1
-rw-r--r--src/initramfs/tpm/etc/ld.so.preload1
-rw-r--r--src/initramfs/tpm/etc/libdeps34
-rw-r--r--src/initramfs/tpm/etc/passwd5
-rw-r--r--src/initramfs/tpm/var/lib/tpm/system.databin0 -> 606 bytes
l---------src/initramfs/uclib-rootfs.old/bin/ash1
-rwxr-xr-xsrc/initramfs/uclib-rootfs.old/bin/busyboxbin0 -> 379176 bytes
l---------src/initramfs/uclib-rootfs.old/bin/cat1
l---------src/initramfs/uclib-rootfs.old/bin/chgrp1
l---------src/initramfs/uclib-rootfs.old/bin/chmod1
l---------src/initramfs/uclib-rootfs.old/bin/chown1
l---------src/initramfs/uclib-rootfs.old/bin/cp1
l---------src/initramfs/uclib-rootfs.old/bin/cpio1
l---------src/initramfs/uclib-rootfs.old/bin/cttyhack1
l---------src/initramfs/uclib-rootfs.old/bin/date1
l---------src/initramfs/uclib-rootfs.old/bin/dd1
l---------src/initramfs/uclib-rootfs.old/bin/df1
l---------src/initramfs/uclib-rootfs.old/bin/dmesg1
l---------src/initramfs/uclib-rootfs.old/bin/echo1
l---------src/initramfs/uclib-rootfs.old/bin/egrep1
l---------src/initramfs/uclib-rootfs.old/bin/false1
l---------src/initramfs/uclib-rootfs.old/bin/grep1
l---------src/initramfs/uclib-rootfs.old/bin/gunzip1
l---------src/initramfs/uclib-rootfs.old/bin/gzip1
l---------src/initramfs/uclib-rootfs.old/bin/ip1
l---------src/initramfs/uclib-rootfs.old/bin/ipcalc1
l---------src/initramfs/uclib-rootfs.old/bin/kill1
-rwxr-xr-xsrc/initramfs/uclib-rootfs.old/bin/ldconfigbin0 -> 61808 bytes
l---------src/initramfs/uclib-rootfs.old/bin/ln1
l---------src/initramfs/uclib-rootfs.old/bin/ls1
l---------src/initramfs/uclib-rootfs.old/bin/mkdir1
l---------src/initramfs/uclib-rootfs.old/bin/mknod1
l---------src/initramfs/uclib-rootfs.old/bin/mount1
l---------src/initramfs/uclib-rootfs.old/bin/mv1
l---------src/initramfs/uclib-rootfs.old/bin/nice1
l---------src/initramfs/uclib-rootfs.old/bin/pidof1
l---------src/initramfs/uclib-rootfs.old/bin/ping1
l---------src/initramfs/uclib-rootfs.old/bin/ps1
l---------src/initramfs/uclib-rootfs.old/bin/pwd1
l---------src/initramfs/uclib-rootfs.old/bin/rm1
l---------src/initramfs/uclib-rootfs.old/bin/sed1
l---------src/initramfs/uclib-rootfs.old/bin/sh1
l---------src/initramfs/uclib-rootfs.old/bin/sleep1
l---------src/initramfs/uclib-rootfs.old/bin/sync1
l---------src/initramfs/uclib-rootfs.old/bin/tar1
l---------src/initramfs/uclib-rootfs.old/bin/touch1
l---------src/initramfs/uclib-rootfs.old/bin/true1
l---------src/initramfs/uclib-rootfs.old/bin/umount1
l---------src/initramfs/uclib-rootfs.old/bin/uname1
l---------src/initramfs/uclib-rootfs.old/bin/usleep1
l---------src/initramfs/uclib-rootfs.old/bin/vi1
l---------src/initramfs/uclib-rootfs.old/bin/zcat1
-rw-r--r--src/initramfs/uclib-rootfs.old/etc/ld.so.cachebin0 -> 1032 bytes
-rw-r--r--src/initramfs/uclib-rootfs.old/etc/terminfo/a/ansibin0 -> 1481 bytes
-rw-r--r--src/initramfs/uclib-rootfs.old/etc/terminfo/d/dumbbin0 -> 308 bytes
-rw-r--r--src/initramfs/uclib-rootfs.old/etc/terminfo/l/linuxbin0 -> 1740 bytes
-rw-r--r--src/initramfs/uclib-rootfs.old/etc/terminfo/r/rxvtbin0 -> 2029 bytes
-rw-r--r--src/initramfs/uclib-rootfs.old/etc/terminfo/s/screenbin0 -> 1550 bytes
-rw-r--r--src/initramfs/uclib-rootfs.old/etc/terminfo/s/sunbin0 -> 997 bytes
-rw-r--r--src/initramfs/uclib-rootfs.old/etc/terminfo/v/vt100bin0 -> 1194 bytes
-rw-r--r--src/initramfs/uclib-rootfs.old/etc/terminfo/v/vt102bin0 -> 1188 bytes
l---------src/initramfs/uclib-rootfs.old/etc/terminfo/v/vt2001
-rw-r--r--src/initramfs/uclib-rootfs.old/etc/terminfo/v/vt220bin0 -> 1279 bytes
-rw-r--r--src/initramfs/uclib-rootfs.old/etc/terminfo/v/vt52bin0 -> 466 bytes
-rw-r--r--src/initramfs/uclib-rootfs.old/etc/terminfo/x/xtermbin0 -> 2522 bytes
-rw-r--r--src/initramfs/uclib-rootfs.old/etc/terminfo/x/xterm-colorbin0 -> 1551 bytes
-rw-r--r--src/initramfs/uclib-rootfs.old/etc/terminfo/x/xterm-xfree86bin0 -> 2522 bytes
-rwxr-xr-xsrc/initramfs/uclib-rootfs.old/lib/ld-uClibc-0.9.30.1.sobin0 -> 21196 bytes
l---------src/initramfs/uclib-rootfs.old/lib/ld-uClibc.so.01
l---------src/initramfs/uclib-rootfs.old/lib/libc.so.01
-rwxr-xr-xsrc/initramfs/uclib-rootfs.old/lib/libcrypt-0.9.30.1.sobin0 -> 8872 bytes
l---------src/initramfs/uclib-rootfs.old/lib/libcrypt.so.01
-rwxr-xr-xsrc/initramfs/uclib-rootfs.old/lib/libdl-0.9.30.1.sobin0 -> 9088 bytes
l---------src/initramfs/uclib-rootfs.old/lib/libdl.so.01
-rwxr-xr-xsrc/initramfs/uclib-rootfs.old/lib/libm-0.9.30.1.sobin0 -> 53980 bytes
l---------src/initramfs/uclib-rootfs.old/lib/libm.so.01
-rwxr-xr-xsrc/initramfs/uclib-rootfs.old/lib/libnsl-0.9.30.1.sobin0 -> 4684 bytes
l---------src/initramfs/uclib-rootfs.old/lib/libnsl.so.01
-rwxr-xr-xsrc/initramfs/uclib-rootfs.old/lib/libpthread-0.9.30.1.sobin0 -> 79690 bytes
l---------src/initramfs/uclib-rootfs.old/lib/libpthread.so.01
-rwxr-xr-xsrc/initramfs/uclib-rootfs.old/lib/libresolv-0.9.30.1.sobin0 -> 4688 bytes
l---------src/initramfs/uclib-rootfs.old/lib/libresolv.so.01
-rwxr-xr-xsrc/initramfs/uclib-rootfs.old/lib/librt-0.9.30.1.sobin0 -> 4672 bytes
l---------src/initramfs/uclib-rootfs.old/lib/librt.so.01
-rwxr-xr-xsrc/initramfs/uclib-rootfs.old/lib/libthread_db-0.9.30.1.sobin0 -> 13156 bytes
l---------src/initramfs/uclib-rootfs.old/lib/libthread_db.so.11
-rwxr-xr-xsrc/initramfs/uclib-rootfs.old/lib/libuClibc-0.9.30.1.sobin0 -> 285772 bytes
-rwxr-xr-xsrc/initramfs/uclib-rootfs.old/lib/libutil-0.9.30.1.sobin0 -> 4800 bytes
l---------src/initramfs/uclib-rootfs.old/lib/libutil.so.01
l---------src/initramfs/uclib-rootfs.old/lib/libz.so1
l---------src/initramfs/uclib-rootfs.old/lib/libz.so.11
-rwxr-xr-xsrc/initramfs/uclib-rootfs.old/lib/libz.so.1.2.3bin0 -> 62760 bytes
-rwxr-xr-xsrc/initramfs/uclib-rootfs.old/sbin/dnbd-clientbin0 -> 9652 bytes
l---------src/initramfs/uclib-rootfs.old/sbin/fbsplash1
l---------src/initramfs/uclib-rootfs.old/sbin/fdisk1
l---------src/initramfs/uclib-rootfs.old/sbin/getty1
l---------src/initramfs/uclib-rootfs.old/sbin/halt1
l---------src/initramfs/uclib-rootfs.old/sbin/hdparm1
l---------src/initramfs/uclib-rootfs.old/sbin/hwclock1
-rwxr-xr-xsrc/initramfs/uclib-rootfs.old/sbin/ifrenamebin0 -> 21716 bytes
l---------src/initramfs/uclib-rootfs.old/sbin/inotifyd1
l---------src/initramfs/uclib-rootfs.old/sbin/insmod1
l---------src/initramfs/uclib-rootfs.old/sbin/klogd1
l---------src/initramfs/uclib-rootfs.old/sbin/loadkmap1
l---------src/initramfs/uclib-rootfs.old/sbin/logread1
l---------src/initramfs/uclib-rootfs.old/sbin/lsmod1
l---------src/initramfs/uclib-rootfs.old/sbin/mdev1
l---------src/initramfs/uclib-rootfs.old/sbin/mkdosfs1
l---------src/initramfs/uclib-rootfs.old/sbin/mkfs.vfat1
l---------src/initramfs/uclib-rootfs.old/sbin/mkswap1
l---------src/initramfs/uclib-rootfs.old/sbin/modprobe1
-rwxr-xr-xsrc/initramfs/uclib-rootfs.old/sbin/nbd-clientbin0 -> 9664 bytes
l---------src/initramfs/uclib-rootfs.old/sbin/poweroff1
l---------src/initramfs/uclib-rootfs.old/sbin/reboot1
l---------src/initramfs/uclib-rootfs.old/sbin/rmmod1
l---------src/initramfs/uclib-rootfs.old/sbin/route1
l---------src/initramfs/uclib-rootfs.old/sbin/start-stop-daemon1
l---------src/initramfs/uclib-rootfs.old/sbin/swapoff1
l---------src/initramfs/uclib-rootfs.old/sbin/swapon1
l---------src/initramfs/uclib-rootfs.old/sbin/switch_root1
l---------src/initramfs/uclib-rootfs.old/sbin/sysctl1
l---------src/initramfs/uclib-rootfs.old/sbin/syslogd1
l---------src/initramfs/uclib-rootfs.old/sbin/tunctl1
l---------src/initramfs/uclib-rootfs.old/sbin/udhcpc1
l---------src/initramfs/uclib-rootfs.old/sbin/vconfig1
l---------src/initramfs/uclib-rootfs.old/sbin/watchdog1
l---------src/initramfs/uclib-rootfs.old/sbin/zcip1
l---------src/initramfs/uclib-rootfs.old/usr/bin/[1
l---------src/initramfs/uclib-rootfs.old/usr/bin/[[1
l---------src/initramfs/uclib-rootfs.old/usr/bin/ar1
l---------src/initramfs/uclib-rootfs.old/usr/bin/arping1
l---------src/initramfs/uclib-rootfs.old/usr/bin/awk1
l---------src/initramfs/uclib-rootfs.old/usr/bin/basename1
l---------src/initramfs/uclib-rootfs.old/usr/bin/bunzip21
l---------src/initramfs/uclib-rootfs.old/usr/bin/bzcat1
l---------src/initramfs/uclib-rootfs.old/usr/bin/bzip21
l---------src/initramfs/uclib-rootfs.old/usr/bin/chvt1
l---------src/initramfs/uclib-rootfs.old/usr/bin/cut1
l---------src/initramfs/uclib-rootfs.old/usr/bin/deallocvt1
l---------src/initramfs/uclib-rootfs.old/usr/bin/du1
l---------src/initramfs/uclib-rootfs.old/usr/bin/eject1
l---------src/initramfs/uclib-rootfs.old/usr/bin/env1
l---------src/initramfs/uclib-rootfs.old/usr/bin/expr1
l---------src/initramfs/uclib-rootfs.old/usr/bin/find1
l---------src/initramfs/uclib-rootfs.old/usr/bin/free1
l---------src/initramfs/uclib-rootfs.old/usr/bin/ftpget1
l---------src/initramfs/uclib-rootfs.old/usr/bin/ftpput1
-rwxr-xr-xsrc/initramfs/uclib-rootfs.old/usr/bin/getent43
l---------src/initramfs/uclib-rootfs.old/usr/bin/head1
l---------src/initramfs/uclib-rootfs.old/usr/bin/id1
l---------src/initramfs/uclib-rootfs.old/usr/bin/killall1
-rwxr-xr-xsrc/initramfs/uclib-rootfs.old/usr/bin/lddbin0 -> 11702 bytes
l---------src/initramfs/uclib-rootfs.old/usr/bin/less1
l---------src/initramfs/uclib-rootfs.old/usr/bin/logger1
l---------src/initramfs/uclib-rootfs.old/usr/bin/lzmacat1
l---------src/initramfs/uclib-rootfs.old/usr/bin/md5sum1
l---------src/initramfs/uclib-rootfs.old/usr/bin/nc1
-rwxr-xr-xsrc/initramfs/uclib-rootfs.old/usr/bin/ncurses5-config156
l---------src/initramfs/uclib-rootfs.old/usr/bin/nmeter1
l---------src/initramfs/uclib-rootfs.old/usr/bin/openvt1
l---------src/initramfs/uclib-rootfs.old/usr/bin/printf1
l---------src/initramfs/uclib-rootfs.old/usr/bin/readahead1
l---------src/initramfs/uclib-rootfs.old/usr/bin/readlink1
l---------src/initramfs/uclib-rootfs.old/usr/bin/realpath1
l---------src/initramfs/uclib-rootfs.old/usr/bin/rpm2cpio1
l---------src/initramfs/uclib-rootfs.old/usr/bin/sort1
-rwxr-xr-xsrc/initramfs/uclib-rootfs.old/usr/bin/stracebin0 -> 173636 bytes
l---------src/initramfs/uclib-rootfs.old/usr/bin/strings1
l---------src/initramfs/uclib-rootfs.old/usr/bin/tail1
l---------src/initramfs/uclib-rootfs.old/usr/bin/test1
l---------src/initramfs/uclib-rootfs.old/usr/bin/tftp1
l---------src/initramfs/uclib-rootfs.old/usr/bin/time1
l---------src/initramfs/uclib-rootfs.old/usr/bin/timeout1
l---------src/initramfs/uclib-rootfs.old/usr/bin/tr1
l---------src/initramfs/uclib-rootfs.old/usr/bin/uniq1
l---------src/initramfs/uclib-rootfs.old/usr/bin/unlzma1
l---------src/initramfs/uclib-rootfs.old/usr/bin/uptime1
l---------src/initramfs/uclib-rootfs.old/usr/bin/wc1
l---------src/initramfs/uclib-rootfs.old/usr/bin/wget1
l---------src/initramfs/uclib-rootfs.old/usr/bin/which1
l---------src/initramfs/uclib-rootfs.old/usr/bin/whoami1
l---------src/initramfs/uclib-rootfs.old/usr/bin/xargs1
-rwxr-xr-xsrc/initramfs/uclib-rootfs.old/usr/lib/libc.so5
l---------src/initramfs/uclib-rootfs.old/usr/lib/libcrypt.so1
l---------src/initramfs/uclib-rootfs.old/usr/lib/libdl.so1
l---------src/initramfs/uclib-rootfs.old/usr/lib/libm.so1
l---------src/initramfs/uclib-rootfs.old/usr/lib/libnsl.so1
l---------src/initramfs/uclib-rootfs.old/usr/lib/libpthread.so1
l---------src/initramfs/uclib-rootfs.old/usr/lib/libresolv.so1
l---------src/initramfs/uclib-rootfs.old/usr/lib/librt.so1
l---------src/initramfs/uclib-rootfs.old/usr/lib/libthread_db.so1
l---------src/initramfs/uclib-rootfs.old/usr/lib/libutil.so1
-rwxr-xr-xsrc/initramfs/uclib-rootfs.old/usr/lib/libz.so11
l---------src/initramfs/uclib-rootfs.old/usr/sbin/brctl1
l---------src/initramfs/uclib-rootfs.old/usr/sbin/chroot1
l---------src/initramfs/uclib-rootfs.old/usr/sbin/fbset1
l---------src/initramfs/uclib-rootfs.old/usr/sbin/httpd1
l---------src/initramfs/uclib-rootfs.old/usr/sbin/loadfont1
l---------src/initramfs/uclib-rootfs.old/usr/sbin/rdate1
l---------src/initramfs/uclib-rootfs.old/usr/sbin/setlogcons1
l---------src/initramfs/uclib-rootfs.old/usr/sbin/udhcpd1
l---------src/initramfs/uclib-rootfs/bin/ash1
l---------src/initramfs/uclib-rootfs/bin/bash1
-rwxr-xr-xsrc/initramfs/uclib-rootfs/bin/busyboxbin0 -> 377052 bytes
l---------src/initramfs/uclib-rootfs/bin/cat1
l---------src/initramfs/uclib-rootfs/bin/chgrp1
l---------src/initramfs/uclib-rootfs/bin/chmod1
l---------src/initramfs/uclib-rootfs/bin/chown1
l---------src/initramfs/uclib-rootfs/bin/cp1
l---------src/initramfs/uclib-rootfs/bin/cpio1
l---------src/initramfs/uclib-rootfs/bin/cttyhack1
l---------src/initramfs/uclib-rootfs/bin/date1
l---------src/initramfs/uclib-rootfs/bin/dd1
l---------src/initramfs/uclib-rootfs/bin/df1
l---------src/initramfs/uclib-rootfs/bin/dmesg1
l---------src/initramfs/uclib-rootfs/bin/echo1
l---------src/initramfs/uclib-rootfs/bin/egrep1
l---------src/initramfs/uclib-rootfs/bin/false1
l---------src/initramfs/uclib-rootfs/bin/grep1
l---------src/initramfs/uclib-rootfs/bin/gunzip1
l---------src/initramfs/uclib-rootfs/bin/gzip1
l---------src/initramfs/uclib-rootfs/bin/ip1
l---------src/initramfs/uclib-rootfs/bin/ipcalc1
l---------src/initramfs/uclib-rootfs/bin/kill1
l---------src/initramfs/uclib-rootfs/bin/ln1
l---------src/initramfs/uclib-rootfs/bin/ls1
l---------src/initramfs/uclib-rootfs/bin/mkdir1
l---------src/initramfs/uclib-rootfs/bin/mknod1
l---------src/initramfs/uclib-rootfs/bin/mount1
l---------src/initramfs/uclib-rootfs/bin/mv1
l---------src/initramfs/uclib-rootfs/bin/nice1
l---------src/initramfs/uclib-rootfs/bin/pidof1
l---------src/initramfs/uclib-rootfs/bin/ping1
l---------src/initramfs/uclib-rootfs/bin/ps1
l---------src/initramfs/uclib-rootfs/bin/pwd1
l---------src/initramfs/uclib-rootfs/bin/rev1
l---------src/initramfs/uclib-rootfs/bin/rm1
l---------src/initramfs/uclib-rootfs/bin/sed1
l---------src/initramfs/uclib-rootfs/bin/sh1
l---------src/initramfs/uclib-rootfs/bin/sleep1
l---------src/initramfs/uclib-rootfs/bin/sync1
l---------src/initramfs/uclib-rootfs/bin/tar1
l---------src/initramfs/uclib-rootfs/bin/touch1
l---------src/initramfs/uclib-rootfs/bin/true1
l---------src/initramfs/uclib-rootfs/bin/umount1
l---------src/initramfs/uclib-rootfs/bin/uname1
l---------src/initramfs/uclib-rootfs/bin/usleep1
l---------src/initramfs/uclib-rootfs/bin/vi1
l---------src/initramfs/uclib-rootfs/bin/zcat1
-rwxr-xr-xsrc/initramfs/uclib-rootfs/lib/ld-2.11.2.sobin0 -> 113964 bytes
l---------src/initramfs/uclib-rootfs/lib/ld-linux.so.21
-rw-r--r--src/initramfs/uclib-rootfs/lib/libc.so.6bin0 -> 1315080 bytes
-rw-r--r--src/initramfs/uclib-rootfs/lib/libdbus-1.so.3bin0 -> 231492 bytes
-rw-r--r--src/initramfs/uclib-rootfs/lib/libdl.so.2bin0 -> 9736 bytes
-rw-r--r--src/initramfs/uclib-rootfs/lib/libhal.so.1bin0 -> 61852 bytes
-rw-r--r--src/initramfs/uclib-rootfs/lib/libm.so.6bin0 -> 149392 bytes
-rwxr-xr-xsrc/initramfs/uclib-rootfs/lib/libpthread.so.0bin0 -> 117105 bytes
-rw-r--r--src/initramfs/uclib-rootfs/lib/librt.so.1bin0 -> 30684 bytes
l---------src/initramfs/uclib-rootfs/sbin/bootchartd1
l---------src/initramfs/uclib-rootfs/sbin/fbsplash1
l---------src/initramfs/uclib-rootfs/sbin/fdisk1
l---------src/initramfs/uclib-rootfs/sbin/getty1
l---------src/initramfs/uclib-rootfs/sbin/halt1
l---------src/initramfs/uclib-rootfs/sbin/hdparm1
l---------src/initramfs/uclib-rootfs/sbin/hwclock1
l---------src/initramfs/uclib-rootfs/sbin/inotifyd1
l---------src/initramfs/uclib-rootfs/sbin/insmod1
l---------src/initramfs/uclib-rootfs/sbin/klogd1
-rwxr-xr-xsrc/initramfs/uclib-rootfs/sbin/ldconfigbin0 -> 651456 bytes
l---------src/initramfs/uclib-rootfs/sbin/loadkmap1
l---------src/initramfs/uclib-rootfs/sbin/logread1
l---------src/initramfs/uclib-rootfs/sbin/lsmod1
l---------src/initramfs/uclib-rootfs/sbin/lspci1
l---------src/initramfs/uclib-rootfs/sbin/lsusb1
l---------src/initramfs/uclib-rootfs/sbin/mdev1
l---------src/initramfs/uclib-rootfs/sbin/mkdosfs1
l---------src/initramfs/uclib-rootfs/sbin/mkfs.vfat1
l---------src/initramfs/uclib-rootfs/sbin/mkswap1
l---------src/initramfs/uclib-rootfs/sbin/modinfo1
l---------src/initramfs/uclib-rootfs/sbin/modprobe1
l---------src/initramfs/uclib-rootfs/sbin/poweroff1
l---------src/initramfs/uclib-rootfs/sbin/reboot1
l---------src/initramfs/uclib-rootfs/sbin/rmmod1
l---------src/initramfs/uclib-rootfs/sbin/route1
l---------src/initramfs/uclib-rootfs/sbin/start-stop-daemon1
l---------src/initramfs/uclib-rootfs/sbin/swapoff1
l---------src/initramfs/uclib-rootfs/sbin/swapon1
l---------src/initramfs/uclib-rootfs/sbin/switch_root1
l---------src/initramfs/uclib-rootfs/sbin/sysctl1
l---------src/initramfs/uclib-rootfs/sbin/syslogd1
l---------src/initramfs/uclib-rootfs/sbin/tunctl1
l---------src/initramfs/uclib-rootfs/sbin/udhcpc1
l---------src/initramfs/uclib-rootfs/sbin/vconfig1
l---------src/initramfs/uclib-rootfs/sbin/watchdog1
l---------src/initramfs/uclib-rootfs/sbin/zcip1
l---------src/initramfs/uclib-rootfs/usr/bin/[1
l---------src/initramfs/uclib-rootfs/usr/bin/[[1
l---------src/initramfs/uclib-rootfs/usr/bin/ar1
l---------src/initramfs/uclib-rootfs/usr/bin/arping1
l---------src/initramfs/uclib-rootfs/usr/bin/awk1
l---------src/initramfs/uclib-rootfs/usr/bin/basename1
l---------src/initramfs/uclib-rootfs/usr/bin/bunzip21
l---------src/initramfs/uclib-rootfs/usr/bin/bzcat1
l---------src/initramfs/uclib-rootfs/usr/bin/bzip21
l---------src/initramfs/uclib-rootfs/usr/bin/chvt1
l---------src/initramfs/uclib-rootfs/usr/bin/cut1
l---------src/initramfs/uclib-rootfs/usr/bin/deallocvt1
l---------src/initramfs/uclib-rootfs/usr/bin/du1
l---------src/initramfs/uclib-rootfs/usr/bin/dumpleases1
l---------src/initramfs/uclib-rootfs/usr/bin/eject1
l---------src/initramfs/uclib-rootfs/usr/bin/env1
l---------src/initramfs/uclib-rootfs/usr/bin/expr1
l---------src/initramfs/uclib-rootfs/usr/bin/fgconsole1
l---------src/initramfs/uclib-rootfs/usr/bin/find1
l---------src/initramfs/uclib-rootfs/usr/bin/flock1
l---------src/initramfs/uclib-rootfs/usr/bin/free1
l---------src/initramfs/uclib-rootfs/usr/bin/ftpget1
l---------src/initramfs/uclib-rootfs/usr/bin/ftpput1
l---------src/initramfs/uclib-rootfs/usr/bin/head1
l---------src/initramfs/uclib-rootfs/usr/bin/id1
l---------src/initramfs/uclib-rootfs/usr/bin/killall1
-rwxr-xr-xsrc/initramfs/uclib-rootfs/usr/bin/ldbin0 -> 529192 bytes
-rwxr-xr-xsrc/initramfs/uclib-rootfs/usr/bin/ldd193
l---------src/initramfs/uclib-rootfs/usr/bin/less1
l---------src/initramfs/uclib-rootfs/usr/bin/logger1
l---------src/initramfs/uclib-rootfs/usr/bin/lspci1
l---------src/initramfs/uclib-rootfs/usr/bin/lsusb1
l---------src/initramfs/uclib-rootfs/usr/bin/lzcat1
l---------src/initramfs/uclib-rootfs/usr/bin/lzma1
l---------src/initramfs/uclib-rootfs/usr/bin/lzmacat1
l---------src/initramfs/uclib-rootfs/usr/bin/md5sum1
l---------src/initramfs/uclib-rootfs/usr/bin/nc1
l---------src/initramfs/uclib-rootfs/usr/bin/nmeter1
l---------src/initramfs/uclib-rootfs/usr/bin/openvt1
l---------src/initramfs/uclib-rootfs/usr/bin/printf1
l---------src/initramfs/uclib-rootfs/usr/bin/readahead1
l---------src/initramfs/uclib-rootfs/usr/bin/readlink1
l---------src/initramfs/uclib-rootfs/usr/bin/realpath1
l---------src/initramfs/uclib-rootfs/usr/bin/rpm2cpio1
-rwxr-xr-xsrc/initramfs/uclib-rootfs/usr/bin/rzscontrolbin0 -> 7040 bytes
l---------src/initramfs/uclib-rootfs/usr/bin/smemcap1
l---------src/initramfs/uclib-rootfs/usr/bin/sort1
-rwxr-xr-xsrc/initramfs/uclib-rootfs/usr/bin/stracebin0 -> 207880 bytes
l---------src/initramfs/uclib-rootfs/usr/bin/strings1
l---------src/initramfs/uclib-rootfs/usr/bin/tail1
l---------src/initramfs/uclib-rootfs/usr/bin/test1
l---------src/initramfs/uclib-rootfs/usr/bin/tftp1
l---------src/initramfs/uclib-rootfs/usr/bin/time1
l---------src/initramfs/uclib-rootfs/usr/bin/timeout1
l---------src/initramfs/uclib-rootfs/usr/bin/tr1
l---------src/initramfs/uclib-rootfs/usr/bin/uniq1
l---------src/initramfs/uclib-rootfs/usr/bin/unlzma1
l---------src/initramfs/uclib-rootfs/usr/bin/unxz1
l---------src/initramfs/uclib-rootfs/usr/bin/uptime1
l---------src/initramfs/uclib-rootfs/usr/bin/wc1
l---------src/initramfs/uclib-rootfs/usr/bin/wget1
l---------src/initramfs/uclib-rootfs/usr/bin/which1
l---------src/initramfs/uclib-rootfs/usr/bin/whoami1
l---------src/initramfs/uclib-rootfs/usr/bin/xargs1
l---------src/initramfs/uclib-rootfs/usr/bin/xz1
l---------src/initramfs/uclib-rootfs/usr/bin/xzcat1
-rw-r--r--src/initramfs/uclib-rootfs/usr/lib/libbfd-2.20.1-system.20100303.sobin0 -> 862364 bytes
-rw-r--r--src/initramfs/uclib-rootfs/usr/lib/libfusion-1.2.so.9bin0 -> 32432 bytes
-rw-r--r--src/initramfs/uclib-rootfs/usr/lib/libgcc_s.so.1bin0 -> 116600 bytes
-rw-r--r--src/initramfs/uclib-rootfs/usr/lib/libhal.so.1bin0 -> 61852 bytes
-rw-r--r--src/initramfs/uclib-rootfs/usr/lib/libhd.so.16bin0 -> 1865944 bytes
l---------src/initramfs/uclib-rootfs/usr/lib/libm.so1
-rw-r--r--src/initramfs/uclib-rootfs/usr/lib/libpcre.so.3bin0 -> 194216 bytes
-rw-r--r--src/initramfs/uclib-rootfs/usr/lib/libz.so.1bin0 -> 79980 bytes
l---------src/initramfs/uclib-rootfs/usr/sbin/brctl1
l---------src/initramfs/uclib-rootfs/usr/sbin/chroot1
l---------src/initramfs/uclib-rootfs/usr/sbin/dhcprelay1
l---------src/initramfs/uclib-rootfs/usr/sbin/fbset1
l---------src/initramfs/uclib-rootfs/usr/sbin/httpd1
-rwxr-xr-xsrc/initramfs/uclib-rootfs/usr/sbin/hwinfobin0 -> 28020 bytes
l---------src/initramfs/uclib-rootfs/usr/sbin/loadfont1
l---------src/initramfs/uclib-rootfs/usr/sbin/rdate1
l---------src/initramfs/uclib-rootfs/usr/sbin/setlogcons1
l---------src/initramfs/uclib-rootfs/usr/sbin/udhcpd1
-rw-r--r--src/installer/OpenSLX/OSExport/BlockDevice/AoE.pm95
-rw-r--r--src/installer/OpenSLX/OSExport/BlockDevice/Base.pm77
-rw-r--r--src/installer/OpenSLX/OSExport/BlockDevice/DNBD2.pm91
-rw-r--r--src/installer/OpenSLX/OSExport/BlockDevice/LBD.pm76
-rw-r--r--src/installer/OpenSLX/OSExport/BlockDevice/NBD.pm87
-rw-r--r--src/installer/OpenSLX/OSExport/Distro/Any.pm66
-rw-r--r--src/installer/OpenSLX/OSExport/Distro/Base.pm71
-rw-r--r--src/installer/OpenSLX/OSExport/Distro/Debian.pm60
-rw-r--r--src/installer/OpenSLX/OSExport/Distro/Fedora.pm65
-rw-r--r--src/installer/OpenSLX/OSExport/Distro/Gentoo.pm59
-rw-r--r--src/installer/OpenSLX/OSExport/Distro/SciLin.pm94
-rw-r--r--src/installer/OpenSLX/OSExport/Distro/Suse.pm145
-rw-r--r--src/installer/OpenSLX/OSExport/Distro/Ubuntu.pm108
-rw-r--r--src/installer/OpenSLX/OSExport/Engine.pm364
-rw-r--r--src/installer/OpenSLX/OSExport/FileSystem/Base.pm148
-rw-r--r--src/installer/OpenSLX/OSExport/FileSystem/NFS.pm238
-rw-r--r--src/installer/OpenSLX/OSExport/FileSystem/SquashFS.pm410
-rw-r--r--src/installer/OpenSLX/OSSetup/Distro/Any_Clone.pm31
-rw-r--r--src/installer/OpenSLX/OSSetup/Distro/Base.pm371
-rw-r--r--src/installer/OpenSLX/OSSetup/Distro/Debian.pm135
-rw-r--r--src/installer/OpenSLX/OSSetup/Distro/Debian_3_1.pm74
-rw-r--r--src/installer/OpenSLX/OSSetup/Distro/Fedora.pm48
-rw-r--r--src/installer/OpenSLX/OSSetup/Distro/Gentoo.pm33
-rw-r--r--src/installer/OpenSLX/OSSetup/Distro/Scilin.pm48
-rw-r--r--src/installer/OpenSLX/OSSetup/Distro/Suse.pm98
-rw-r--r--src/installer/OpenSLX/OSSetup/Distro/Ubuntu.pm119
-rw-r--r--src/installer/OpenSLX/OSSetup/Engine.pm1929
-rw-r--r--src/installer/OpenSLX/OSSetup/MetaPackager/Base.pm98
-rw-r--r--src/installer/OpenSLX/OSSetup/MetaPackager/apt.pm142
-rw-r--r--src/installer/OpenSLX/OSSetup/MetaPackager/smart.pm127
-rw-r--r--src/installer/OpenSLX/OSSetup/MetaPackager/yum.pm117
-rw-r--r--src/installer/OpenSLX/OSSetup/MetaPackager/zypper.pm122
-rw-r--r--src/installer/OpenSLX/OSSetup/Packager/Base.pm98
-rw-r--r--src/installer/OpenSLX/OSSetup/Packager/dpkg.pm102
-rw-r--r--src/installer/OpenSLX/OSSetup/Packager/rpm.pm89
-rwxr-xr-xsrc/installer/slxos-export323
-rwxr-xr-xsrc/installer/slxos-setup402
-rw-r--r--src/lib/OpenSLX/Basics.pm856
-rw-r--r--src/lib/OpenSLX/ConfigFolder.pm154
-rw-r--r--src/lib/OpenSLX/DistroUtils.pm90
-rw-r--r--src/lib/OpenSLX/DistroUtils/Base.pm429
-rw-r--r--src/lib/OpenSLX/DistroUtils/Engine.pm58
-rw-r--r--src/lib/OpenSLX/DistroUtils/InitFile.pm232
-rw-r--r--src/lib/OpenSLX/DistroUtils/Suse.pm174
-rw-r--r--src/lib/OpenSLX/DistroUtils/Ubuntu.pm172
-rw-r--r--src/lib/OpenSLX/LibScanner.pm262
-rw-r--r--src/lib/OpenSLX/ScopedResource.pm174
-rw-r--r--src/lib/OpenSLX/Syscall.pm129
-rw-r--r--src/lib/OpenSLX/Translations/de.pm359
-rw-r--r--src/lib/OpenSLX/Translations/posix.pm359
-rw-r--r--src/lib/OpenSLX/Utils.pm701
-rw-r--r--src/lib/distro-info/clone-filter.example14
-rw-r--r--src/lib/distro-info/debian-3.1/mirrors/base287
-rw-r--r--src/lib/distro-info/debian-3.1/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/debian-3.1/prereqfiles/var/cache/debconf/slx-defaults.dat16
-rw-r--r--src/lib/distro-info/debian-3.1/settings.default41
-rw-r--r--src/lib/distro-info/debian-3.1/settings.example17
-rw-r--r--src/lib/distro-info/debian-4.0/mirrors/base287
-rw-r--r--src/lib/distro-info/debian-4.0/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/debian-4.0/settings.default32
-rw-r--r--src/lib/distro-info/debian-4.0/settings.example17
-rw-r--r--src/lib/distro-info/debian-4.0_amd64/mirrors/base287
-rw-r--r--src/lib/distro-info/debian-4.0_amd64/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/debian-4.0_amd64/settings.default41
-rw-r--r--src/lib/distro-info/debian-4.0_amd64/settings.example17
-rw-r--r--src/lib/distro-info/debian-5.0/mirrors/base287
-rw-r--r--src/lib/distro-info/debian-5.0/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/debian-5.0/settings.default32
-rw-r--r--src/lib/distro-info/debian-5.0/settings.example17
-rw-r--r--src/lib/distro-info/fedora-6/export-filter.example15
-rw-r--r--src/lib/distro-info/fedora-6/mirrors/base105
-rw-r--r--src/lib/distro-info/fedora-6/mirrors/base_update90
-rw-r--r--src/lib/distro-info/fedora-6/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/fedora-6/settings.default125
-rw-r--r--src/lib/distro-info/fedora-6/settings.example20
-rw-r--r--src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY34
-rw-r--r--src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-beta32
-rw-r--r--src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-fedora27
-rw-r--r--src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-fedora-extras35
-rw-r--r--src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-fedora-legacy30
-rw-r--r--src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-fedora-rawhide21
-rw-r--r--src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-fedora-test20
-rw-r--r--src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-rawhide24
-rw-r--r--src/lib/distro-info/fedora-6_x86_64/export-filter.example15
-rw-r--r--src/lib/distro-info/fedora-6_x86_64/mirrors/base101
-rw-r--r--src/lib/distro-info/fedora-6_x86_64/mirrors/base_update90
-rw-r--r--src/lib/distro-info/fedora-6_x86_64/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/fedora-6_x86_64/settings.default125
-rw-r--r--src/lib/distro-info/fedora-6_x86_64/settings.example20
-rw-r--r--src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY34
-rw-r--r--src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-beta32
-rw-r--r--src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-fedora27
-rw-r--r--src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-fedora-extras35
-rw-r--r--src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-fedora-legacy30
-rw-r--r--src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-fedora-rawhide21
-rw-r--r--src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-fedora-test20
-rw-r--r--src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-rawhide24
-rw-r--r--src/lib/distro-info/scilin-4.7/export-filter.example15
-rw-r--r--src/lib/distro-info/scilin-4.7/prereqfiles/etc/group33
-rw-r--r--src/lib/distro-info/scilin-4.7/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/scilin-4.7/prereqfiles/etc/passwd14
-rw-r--r--src/lib/distro-info/scilin-4.7/prereqfiles/etc/shadow14
-rw-r--r--src/lib/distro-info/scilin-4.7/settings.default30
-rw-r--r--src/lib/distro-info/scilin-4.7/settings.example17
-rw-r--r--src/lib/distro-info/scilin-5.3/export-filter.example15
-rw-r--r--src/lib/distro-info/scilin-5.3/prereqfiles/etc/group33
-rw-r--r--src/lib/distro-info/scilin-5.3/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/scilin-5.3/prereqfiles/etc/passwd14
-rw-r--r--src/lib/distro-info/scilin-5.3/prereqfiles/etc/shadow14
-rw-r--r--src/lib/distro-info/scilin-5.3/settings.default30
-rw-r--r--src/lib/distro-info/scilin-5.3/settings.example17
-rw-r--r--src/lib/distro-info/scilin-5.4/export-filter.example15
-rw-r--r--src/lib/distro-info/scilin-5.4/prereqfiles/etc/group33
-rw-r--r--src/lib/distro-info/scilin-5.4/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/scilin-5.4/prereqfiles/etc/passwd14
-rw-r--r--src/lib/distro-info/scilin-5.4/prereqfiles/etc/shadow14
-rw-r--r--src/lib/distro-info/scilin-5.4/settings.default30
-rw-r--r--src/lib/distro-info/scilin-5.4/settings.example17
-rw-r--r--src/lib/distro-info/scilin-5.4_x86_64/export-filter.example15
-rw-r--r--src/lib/distro-info/scilin-5.4_x86_64/prereqfiles/etc/group33
-rw-r--r--src/lib/distro-info/scilin-5.4_x86_64/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/scilin-5.4_x86_64/prereqfiles/etc/passwd14
-rw-r--r--src/lib/distro-info/scilin-5.4_x86_64/prereqfiles/etc/shadow14
-rw-r--r--src/lib/distro-info/scilin-5.4_x86_64/settings.default30
-rw-r--r--src/lib/distro-info/scilin-5.4_x86_64/settings.example17
-rw-r--r--src/lib/distro-info/scilin-5.5/export-filter.example15
-rw-r--r--src/lib/distro-info/scilin-5.5/prereqfiles/etc/group33
-rw-r--r--src/lib/distro-info/scilin-5.5/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/scilin-5.5/prereqfiles/etc/passwd14
-rw-r--r--src/lib/distro-info/scilin-5.5/prereqfiles/etc/shadow14
-rw-r--r--src/lib/distro-info/scilin-5.5/settings.default30
-rw-r--r--src/lib/distro-info/scilin-5.5/settings.example17
-rw-r--r--src/lib/distro-info/scilin-5.5_x86_64/export-filter.example15
-rw-r--r--src/lib/distro-info/scilin-5.5_x86_64/prereqfiles/etc/group33
-rw-r--r--src/lib/distro-info/scilin-5.5_x86_64/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/scilin-5.5_x86_64/prereqfiles/etc/passwd14
-rw-r--r--src/lib/distro-info/scilin-5.5_x86_64/prereqfiles/etc/shadow14
-rw-r--r--src/lib/distro-info/scilin-5.5_x86_64/settings.default30
-rw-r--r--src/lib/distro-info/scilin-5.5_x86_64/settings.example17
-rw-r--r--src/lib/distro-info/suse-10.2/export-filter.example15
-rw-r--r--src/lib/distro-info/suse-10.2/mirrors/base2
-rw-r--r--src/lib/distro-info/suse-10.2/mirrors/base_non-oss2
-rw-r--r--src/lib/distro-info/suse-10.2/mirrors/base_update6
-rw-r--r--src/lib/distro-info/suse-10.2/prereqfiles/etc/group33
-rw-r--r--src/lib/distro-info/suse-10.2/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/suse-10.2/prereqfiles/etc/passwd14
-rw-r--r--src/lib/distro-info/suse-10.2/prereqfiles/etc/shadow14
-rw-r--r--src/lib/distro-info/suse-10.2/settings.default1061
-rw-r--r--src/lib/distro-info/suse-10.2/settings.example23
-rw-r--r--src/lib/distro-info/suse-10.2/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc17
-rw-r--r--src/lib/distro-info/suse-10.2/trusted-package-keys/gpg-pubkey-307e3d54-44201d5d.asc13
-rw-r--r--src/lib/distro-info/suse-10.2/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc30
-rw-r--r--src/lib/distro-info/suse-10.2/trusted-package-keys/gpg-pubkey-7e2e3b05-44748aba.asc20
-rw-r--r--src/lib/distro-info/suse-10.2/trusted-package-keys/gpg-pubkey-9c800aca-40d8063e.asc37
-rw-r--r--src/lib/distro-info/suse-10.2/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc31
-rw-r--r--src/lib/distro-info/suse-10.2/trusted-package-keys/pubring.gpgbin0 -> 5604 bytes
-rw-r--r--src/lib/distro-info/suse-10.2_x86_64/export-filter.example15
-rw-r--r--src/lib/distro-info/suse-10.2_x86_64/mirrors/base2
-rw-r--r--src/lib/distro-info/suse-10.2_x86_64/mirrors/base_non-oss2
-rw-r--r--src/lib/distro-info/suse-10.2_x86_64/mirrors/base_update5
-rw-r--r--src/lib/distro-info/suse-10.2_x86_64/prereqfiles/etc/group33
-rw-r--r--src/lib/distro-info/suse-10.2_x86_64/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/suse-10.2_x86_64/prereqfiles/etc/passwd14
-rw-r--r--src/lib/distro-info/suse-10.2_x86_64/prereqfiles/etc/shadow14
-rw-r--r--src/lib/distro-info/suse-10.2_x86_64/settings.default1061
-rw-r--r--src/lib/distro-info/suse-10.2_x86_64/settings.example23
-rw-r--r--src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc17
-rw-r--r--src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/gpg-pubkey-307e3d54-44201d5d.asc13
-rw-r--r--src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc30
-rw-r--r--src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/gpg-pubkey-7e2e3b05-44748aba.asc20
-rw-r--r--src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/gpg-pubkey-9c800aca-40d8063e.asc37
-rw-r--r--src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc31
-rw-r--r--src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/pubring.gpgbin0 -> 5604 bytes
-rw-r--r--src/lib/distro-info/suse-10.3/export-filter.example15
-rw-r--r--src/lib/distro-info/suse-10.3/mirrors/base250
-rw-r--r--src/lib/distro-info/suse-10.3/mirrors/base_non-oss248
-rw-r--r--src/lib/distro-info/suse-10.3/mirrors/base_update251
-rw-r--r--src/lib/distro-info/suse-10.3/prereqfiles/etc/group33
-rw-r--r--src/lib/distro-info/suse-10.3/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/suse-10.3/prereqfiles/etc/passwd14
-rw-r--r--src/lib/distro-info/suse-10.3/prereqfiles/etc/shadow14
-rw-r--r--src/lib/distro-info/suse-10.3/settings.default1064
-rw-r--r--src/lib/distro-info/suse-10.3/settings.example23
-rw-r--r--src/lib/distro-info/suse-10.3/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc17
-rw-r--r--src/lib/distro-info/suse-10.3/trusted-package-keys/gpg-pubkey-307e3d54-44201d5d.asc13
-rw-r--r--src/lib/distro-info/suse-10.3/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc30
-rw-r--r--src/lib/distro-info/suse-10.3/trusted-package-keys/gpg-pubkey-7e2e3b05-44748aba.asc20
-rw-r--r--src/lib/distro-info/suse-10.3/trusted-package-keys/gpg-pubkey-9c800aca-40d8063e.asc37
-rw-r--r--src/lib/distro-info/suse-10.3/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc31
-rw-r--r--src/lib/distro-info/suse-10.3/trusted-package-keys/pubring.gpgbin0 -> 5604 bytes
-rw-r--r--src/lib/distro-info/suse-10.3_x86_64/export-filter.example15
-rw-r--r--src/lib/distro-info/suse-10.3_x86_64/mirrors/base246
-rw-r--r--src/lib/distro-info/suse-10.3_x86_64/mirrors/base_non-oss241
-rw-r--r--src/lib/distro-info/suse-10.3_x86_64/mirrors/base_update246
-rw-r--r--src/lib/distro-info/suse-10.3_x86_64/prereqfiles/etc/group33
-rw-r--r--src/lib/distro-info/suse-10.3_x86_64/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/suse-10.3_x86_64/prereqfiles/etc/passwd14
-rw-r--r--src/lib/distro-info/suse-10.3_x86_64/prereqfiles/etc/shadow14
-rw-r--r--src/lib/distro-info/suse-10.3_x86_64/settings.default972
-rw-r--r--src/lib/distro-info/suse-10.3_x86_64/settings.example23
-rw-r--r--src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc17
-rw-r--r--src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/gpg-pubkey-307e3d54-44201d5d.asc13
-rw-r--r--src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc30
-rw-r--r--src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/gpg-pubkey-7e2e3b05-44748aba.asc20
-rw-r--r--src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/gpg-pubkey-9c800aca-40d8063e.asc37
-rw-r--r--src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc31
-rw-r--r--src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/pubring.gpgbin0 -> 5604 bytes
-rw-r--r--src/lib/distro-info/suse-11.0/export-filter.example15
-rw-r--r--src/lib/distro-info/suse-11.0/mirrors/base252
-rw-r--r--src/lib/distro-info/suse-11.0/mirrors/base_non-oss246
-rw-r--r--src/lib/distro-info/suse-11.0/mirrors/base_update252
-rw-r--r--src/lib/distro-info/suse-11.0/prereqfiles/etc/group33
-rw-r--r--src/lib/distro-info/suse-11.0/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/suse-11.0/prereqfiles/etc/passwd14
-rw-r--r--src/lib/distro-info/suse-11.0/prereqfiles/etc/shadow14
-rw-r--r--src/lib/distro-info/suse-11.0/settings.default1145
-rw-r--r--src/lib/distro-info/suse-11.0/settings.example23
-rw-r--r--src/lib/distro-info/suse-11.0/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc17
-rw-r--r--src/lib/distro-info/suse-11.0/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc13
-rw-r--r--src/lib/distro-info/suse-11.0/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc30
-rw-r--r--src/lib/distro-info/suse-11.0/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc20
-rw-r--r--src/lib/distro-info/suse-11.0/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc37
-rw-r--r--src/lib/distro-info/suse-11.0/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc31
-rw-r--r--src/lib/distro-info/suse-11.0/trusted-package-keys/pubring.gpgbin0 -> 5604 bytes
-rw-r--r--src/lib/distro-info/suse-11.0_x86_64/mirrors/base248
-rw-r--r--src/lib/distro-info/suse-11.0_x86_64/mirrors/base_non-oss240
-rw-r--r--src/lib/distro-info/suse-11.0_x86_64/mirrors/base_update246
-rw-r--r--src/lib/distro-info/suse-11.0_x86_64/prereqfiles/etc/group33
-rw-r--r--src/lib/distro-info/suse-11.0_x86_64/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/suse-11.0_x86_64/prereqfiles/etc/passwd14
-rw-r--r--src/lib/distro-info/suse-11.0_x86_64/prereqfiles/etc/shadow14
-rw-r--r--src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc17
-rw-r--r--src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc13
-rw-r--r--src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc30
-rw-r--r--src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc20
-rw-r--r--src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc37
-rw-r--r--src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc31
-rw-r--r--src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/pubring.gpgbin0 -> 5604 bytes
-rw-r--r--src/lib/distro-info/suse-11.1/export-filter.example15
-rw-r--r--src/lib/distro-info/suse-11.1/mirrors/base252
-rw-r--r--src/lib/distro-info/suse-11.1/mirrors/base_non-oss250
-rw-r--r--src/lib/distro-info/suse-11.1/mirrors/base_update252
-rw-r--r--src/lib/distro-info/suse-11.1/prereqfiles/etc/group33
-rw-r--r--src/lib/distro-info/suse-11.1/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/suse-11.1/prereqfiles/etc/passwd14
-rw-r--r--src/lib/distro-info/suse-11.1/prereqfiles/etc/shadow14
-rw-r--r--src/lib/distro-info/suse-11.1/settings.default1126
-rw-r--r--src/lib/distro-info/suse-11.1/settings.example23
-rw-r--r--src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc17
-rw-r--r--src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc13
-rw-r--r--src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc30
-rw-r--r--src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-3dbdc284-49144c3f.asc19
-rw-r--r--src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-56b4177a-47965b33.asc19
-rw-r--r--src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc20
-rw-r--r--src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc37
-rw-r--r--src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc31
-rw-r--r--src/lib/distro-info/suse-11.1/trusted-package-keys/pubring.gpgbin0 -> 6926 bytes
-rw-r--r--src/lib/distro-info/suse-11.1_x86_64/mirrors/base247
-rw-r--r--src/lib/distro-info/suse-11.1_x86_64/mirrors/base_non-oss246
-rw-r--r--src/lib/distro-info/suse-11.1_x86_64/mirrors/base_update246
-rw-r--r--src/lib/distro-info/suse-11.1_x86_64/prereqfiles/etc/group33
-rw-r--r--src/lib/distro-info/suse-11.1_x86_64/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/suse-11.1_x86_64/prereqfiles/etc/passwd14
-rw-r--r--src/lib/distro-info/suse-11.1_x86_64/prereqfiles/etc/shadow14
-rw-r--r--src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc17
-rw-r--r--src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc13
-rw-r--r--src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc30
-rw-r--r--src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-3dbdc284-49144c3f.asc19
-rw-r--r--src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-56b4177a-47965b33.asc19
-rw-r--r--src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc20
-rw-r--r--src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc37
-rw-r--r--src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc31
-rw-r--r--src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/pubring.gpgbin0 -> 6926 bytes
-rw-r--r--src/lib/distro-info/suse-11.2/export-filter.example15
-rw-r--r--src/lib/distro-info/suse-11.2/mirrors/base252
-rw-r--r--src/lib/distro-info/suse-11.2/mirrors/base_non-oss250
-rw-r--r--src/lib/distro-info/suse-11.2/mirrors/base_update252
-rw-r--r--src/lib/distro-info/suse-11.2/prereqfiles/etc/group33
-rw-r--r--src/lib/distro-info/suse-11.2/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/suse-11.2/prereqfiles/etc/passwd14
-rw-r--r--src/lib/distro-info/suse-11.2/prereqfiles/etc/shadow14
-rw-r--r--src/lib/distro-info/suse-11.2/settings.default1126
-rw-r--r--src/lib/distro-info/suse-11.2/settings.example23
-rw-r--r--src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc17
-rw-r--r--src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc13
-rw-r--r--src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc30
-rw-r--r--src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-3dbdc284-49144c3f.asc19
-rw-r--r--src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-56b4177a-47965b33.asc19
-rw-r--r--src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc20
-rw-r--r--src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc37
-rw-r--r--src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc31
-rw-r--r--src/lib/distro-info/suse-11.2/trusted-package-keys/pubring.gpgbin0 -> 6926 bytes
-rw-r--r--src/lib/distro-info/suse-11.2_x86_64/mirrors/base247
-rw-r--r--src/lib/distro-info/suse-11.2_x86_64/mirrors/base_non-oss246
-rw-r--r--src/lib/distro-info/suse-11.2_x86_64/mirrors/base_update246
-rw-r--r--src/lib/distro-info/suse-11.2_x86_64/prereqfiles/etc/group33
-rw-r--r--src/lib/distro-info/suse-11.2_x86_64/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/suse-11.2_x86_64/prereqfiles/etc/passwd14
-rw-r--r--src/lib/distro-info/suse-11.2_x86_64/prereqfiles/etc/shadow14
-rw-r--r--src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc17
-rw-r--r--src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc13
-rw-r--r--src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc30
-rw-r--r--src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-3dbdc284-49144c3f.asc19
-rw-r--r--src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-56b4177a-47965b33.asc19
-rw-r--r--src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc20
-rw-r--r--src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc37
-rw-r--r--src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc31
-rw-r--r--src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/pubring.gpgbin0 -> 6926 bytes
-rw-r--r--src/lib/distro-info/suse-11.3/export-filter.example15
-rw-r--r--src/lib/distro-info/suse-11.3/mirrors/base252
-rw-r--r--src/lib/distro-info/suse-11.3/mirrors/base_non-oss250
-rw-r--r--src/lib/distro-info/suse-11.3/mirrors/base_update252
-rw-r--r--src/lib/distro-info/suse-11.3/prereqfiles/etc/group33
-rw-r--r--src/lib/distro-info/suse-11.3/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/suse-11.3/prereqfiles/etc/passwd14
-rw-r--r--src/lib/distro-info/suse-11.3/prereqfiles/etc/shadow14
-rw-r--r--src/lib/distro-info/suse-11.3/settings.default1126
-rw-r--r--src/lib/distro-info/suse-11.3/settings.example23
-rw-r--r--src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc17
-rw-r--r--src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-307e3d54-4be01a65.asc13
-rw-r--r--src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc30
-rw-r--r--src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-3dbdc284-4be1884d.asc19
-rw-r--r--src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-56b4177a-4be18cab.asc19
-rw-r--r--src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-7e2e3b05-4be037ca.asc18
-rw-r--r--src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-9c800aca-4be01999.asc30
-rw-r--r--src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc31
-rw-r--r--src/lib/distro-info/suse-11.3/trusted-package-keys/pubring.gpg0
-rw-r--r--src/lib/distro-info/suse-11.3_x86_64/mirrors/base247
-rw-r--r--src/lib/distro-info/suse-11.3_x86_64/mirrors/base_non-oss246
-rw-r--r--src/lib/distro-info/suse-11.3_x86_64/mirrors/base_update246
-rw-r--r--src/lib/distro-info/suse-11.3_x86_64/prereqfiles/etc/group33
-rw-r--r--src/lib/distro-info/suse-11.3_x86_64/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/suse-11.3_x86_64/prereqfiles/etc/passwd14
-rw-r--r--src/lib/distro-info/suse-11.3_x86_64/prereqfiles/etc/shadow14
-rw-r--r--src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc17
-rw-r--r--src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc13
-rw-r--r--src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc30
-rw-r--r--src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-3dbdc284-49144c3f.asc19
-rw-r--r--src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-56b4177a-47965b33.asc19
-rw-r--r--src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc20
-rw-r--r--src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc37
-rw-r--r--src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc31
-rw-r--r--src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/pubring.gpgbin0 -> 6926 bytes
-rw-r--r--src/lib/distro-info/ubuntu-10.04/mirrors/base162
-rw-r--r--src/lib/distro-info/ubuntu-10.04/mirrors/base_security162
-rw-r--r--src/lib/distro-info/ubuntu-10.04/mirrors/base_updates171
-rw-r--r--src/lib/distro-info/ubuntu-10.04/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/ubuntu-10.04/settings.default76
-rw-r--r--src/lib/distro-info/ubuntu-10.04/settings.example23
-rw-r--r--src/lib/distro-info/ubuntu-8.04/mirrors/base171
-rw-r--r--src/lib/distro-info/ubuntu-8.04/mirrors/base_security163
-rw-r--r--src/lib/distro-info/ubuntu-8.04/mirrors/base_updates171
-rw-r--r--src/lib/distro-info/ubuntu-8.04/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/ubuntu-8.04/settings.default76
-rw-r--r--src/lib/distro-info/ubuntu-8.04/settings.example23
-rw-r--r--src/lib/distro-info/ubuntu-8.04_amd64/mirrors/base171
-rw-r--r--src/lib/distro-info/ubuntu-8.04_amd64/mirrors/base_security163
-rw-r--r--src/lib/distro-info/ubuntu-8.04_amd64/mirrors/base_updates171
-rw-r--r--src/lib/distro-info/ubuntu-8.04_amd64/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/ubuntu-8.04_amd64/settings.default76
-rw-r--r--src/lib/distro-info/ubuntu-8.04_amd64/settings.example23
-rw-r--r--src/lib/distro-info/ubuntu-8.10/mirrors/base171
-rw-r--r--src/lib/distro-info/ubuntu-8.10/mirrors/base_security163
-rw-r--r--src/lib/distro-info/ubuntu-8.10/mirrors/base_updates171
-rw-r--r--src/lib/distro-info/ubuntu-8.10/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/ubuntu-8.10/settings.default76
-rw-r--r--src/lib/distro-info/ubuntu-8.10/settings.example23
-rw-r--r--src/lib/distro-info/ubuntu-9.04/mirrors/base162
-rw-r--r--src/lib/distro-info/ubuntu-9.04/mirrors/base_security162
-rw-r--r--src/lib/distro-info/ubuntu-9.04/mirrors/base_updates171
-rw-r--r--src/lib/distro-info/ubuntu-9.04/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/ubuntu-9.04/settings.default76
-rw-r--r--src/lib/distro-info/ubuntu-9.04/settings.example23
-rw-r--r--src/lib/distro-info/ubuntu-9.04_amd64/mirrors/base171
-rw-r--r--src/lib/distro-info/ubuntu-9.04_amd64/mirrors/base_security163
-rw-r--r--src/lib/distro-info/ubuntu-9.04_amd64/mirrors/base_updates171
-rw-r--r--src/lib/distro-info/ubuntu-9.04_amd64/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/ubuntu-9.04_amd64/settings.default76
-rw-r--r--src/lib/distro-info/ubuntu-9.04_amd64/settings.example23
-rw-r--r--src/lib/distro-info/ubuntu-9.10/mirrors/base162
-rw-r--r--src/lib/distro-info/ubuntu-9.10/mirrors/base_security162
-rw-r--r--src/lib/distro-info/ubuntu-9.10/mirrors/base_updates171
-rw-r--r--src/lib/distro-info/ubuntu-9.10/prereqfiles/etc/hosts1
-rw-r--r--src/lib/distro-info/ubuntu-9.10/settings.default76
-rw-r--r--src/lib/distro-info/ubuntu-9.10/settings.example23
-rw-r--r--src/os-plugins/OpenSLX/OSPlugin/Base.pm631
-rw-r--r--src/os-plugins/OpenSLX/OSPlugin/Engine.pm857
-rw-r--r--src/os-plugins/OpenSLX/OSPlugin/Roster.pm213
-rw-r--r--src/os-plugins/plugins/bootsplash/OpenSLX/OSPlugin/bootsplash.pm253
-rw-r--r--src/os-plugins/plugins/bootsplash/XX_bootsplash.sh56
-rw-r--r--src/os-plugins/plugins/bootsplash/files/lib/libglib-2.0.so.0bin0 -> 822344 bytes
-rw-r--r--src/os-plugins/plugins/bootsplash/files/lib/libsplashy.so.1bin0 -> 18948 bytes
-rw-r--r--src/os-plugins/plugins/bootsplash/files/lib/libsplashycnf.so.1bin0 -> 7804 bytes
-rwxr-xr-xsrc/os-plugins/plugins/bootsplash/files/sbin/splashybin0 -> 54215 bytes
-rwxr-xr-xsrc/os-plugins/plugins/bootsplash/files/sbin/splashy_configbin0 -> 66416 bytes
-rwxr-xr-xsrc/os-plugins/plugins/bootsplash/files/sbin/splashy_updatebin0 -> 9611 bytes
-rw-r--r--src/os-plugins/plugins/bootsplash/files/themes/openslx/blank.ttf0
-rw-r--r--src/os-plugins/plugins/bootsplash/files/themes/openslx/openslx.pngbin0 -> 89872 bytes
-rw-r--r--src/os-plugins/plugins/bootsplash/files/themes/openslx/theme.xml138
-rw-r--r--src/os-plugins/plugins/bootsplash/files/usr/lib/libdirect-1.2.so.9bin0 -> 80552 bytes
-rw-r--r--src/os-plugins/plugins/bootsplash/files/usr/lib/libdirectfb-1.2.so.9bin0 -> 474652 bytes
-rw-r--r--src/os-plugins/plugins/bootsplash/files/usr/lib/libmagic.so.1bin0 -> 105596 bytes
-rw-r--r--src/os-plugins/plugins/bootsplash/init-hooks/05-have-kernelvars/bootsplash.sh18
-rw-r--r--src/os-plugins/plugins/bootsplash/init-hooks/10-nw-if-config/bootsplash.sh1
-rw-r--r--src/os-plugins/plugins/bootsplash/init-hooks/20-nw-bridge-config/bootsplash.sh1
-rw-r--r--src/os-plugins/plugins/bootsplash/init-hooks/25-have-ip-config/bootsplash.sh1
-rw-r--r--src/os-plugins/plugins/bootsplash/init-hooks/35-have-network-root/bootsplash.sh1
-rw-r--r--src/os-plugins/plugins/bootsplash/init-hooks/40-started-hw-config/bootsplash.sh1
-rw-r--r--src/os-plugins/plugins/bootsplash/init-hooks/50-have-layered-fs/bootsplash.sh1
-rw-r--r--src/os-plugins/plugins/bootsplash/init-hooks/60-have-servconfig/bootsplash.sh1
-rw-r--r--src/os-plugins/plugins/bootsplash/init-hooks/70-before-plugins/bootsplash.sh1
-rw-r--r--src/os-plugins/plugins/bootsplash/init-hooks/80-after-plugins/bootsplash.sh1
-rw-r--r--src/os-plugins/plugins/bootsplash/init-hooks/85-have-initial-boot/bootsplash.sh1
-rw-r--r--src/os-plugins/plugins/bootsplash/init-hooks/90-postinit-done/bootsplash.sh1
-rw-r--r--src/os-plugins/plugins/bootsplash/init-hooks/95-cleanup/bootsplash.sh1
-rw-r--r--src/os-plugins/plugins/bootsplash/init-hooks/99-handing-over/bootsplash.sh1
-rw-r--r--src/os-plugins/plugins/desktop/OpenSLX/Distro/Base.pm432
-rw-r--r--src/os-plugins/plugins/desktop/OpenSLX/Distro/Debian.pm63
-rw-r--r--src/os-plugins/plugins/desktop/OpenSLX/Distro/Fedora.pm30
-rw-r--r--src/os-plugins/plugins/desktop/OpenSLX/Distro/Gentoo.pm30
-rw-r--r--src/os-plugins/plugins/desktop/OpenSLX/Distro/Scilin.pm132
-rw-r--r--src/os-plugins/plugins/desktop/OpenSLX/Distro/Suse.pm162
-rw-r--r--src/os-plugins/plugins/desktop/OpenSLX/Distro/Suse_10_2.pm54
-rw-r--r--src/os-plugins/plugins/desktop/OpenSLX/Distro/Ubuntu.pm169
-rw-r--r--src/os-plugins/plugins/desktop/OpenSLX/Distro/Ubuntu_8.pm161
-rw-r--r--src/os-plugins/plugins/desktop/OpenSLX/Distro/Ubuntu_9_04.pm161
-rw-r--r--src/os-plugins/plugins/desktop/OpenSLX/OSPlugin/desktop.pm712
-rw-r--r--src/os-plugins/plugins/desktop/XX_desktop.sh33
l---------src/os-plugins/plugins/desktop/themes/gdm/openslx-legacy1
-rwxr-xr-xsrc/os-plugins/plugins/desktop/themes/gdm/openslx/GdmGreeterTheme.desktop8
-rw-r--r--src/os-plugins/plugins/desktop/themes/gdm/openslx/color.pngbin0 -> 177 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/gdm/openslx/environment.pngbin0 -> 4296 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/gdm/openslx/language-selector.pngbin0 -> 2253 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/gdm/openslx/language-selector_inactive.pngbin0 -> 2198 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/gdm/openslx/main-runner.pngbin0 -> 153 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/gdm/openslx/openslx-logo-main.pngbin0 -> 82050 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/gdm/openslx/openslx-logo.pngbin0 -> 9113 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/gdm/openslx/sessions.pngbin0 -> 4245 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/gdm/openslx/sessions_inactive.pngbin0 -> 4066 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/gdm/openslx/system.pngbin0 -> 4257 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/gdm/openslx/system_inactive.pngbin0 -> 4091 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/gdm/openslx/theme.xml224
-rw-r--r--src/os-plugins/plugins/desktop/themes/gdm/openslx/welcome-time-shadowed.pngbin0 -> 1580 bytes
-rwxr-xr-xsrc/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/GdmGreeterTheme.desktop8
-rwxr-xr-xsrc/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/KdmGreeterTheme.desktop8
-rw-r--r--src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/color.pngbin0 -> 177 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/enter.pngbin0 -> 4260 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/enter_inactive.pngbin0 -> 4072 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/environment.pngbin0 -> 5076 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/main-runner.pngbin0 -> 143 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/openslx-logo-main.pngbin0 -> 82050 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/openslx-logo.pngbin0 -> 9113 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/sessions.pngbin0 -> 4245 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/sessions_inactive.pngbin0 -> 4066 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/system.pngbin0 -> 4257 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/system_inactive.pngbin0 -> 4091 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/theme.xml204
-rw-r--r--src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/welcome-time-shadowed.pngbin0 -> 1580 bytes
-rwxr-xr-xsrc/os-plugins/plugins/desktop/themes/kdm/openslx/KdmGreeterTheme.desktop8
-rw-r--r--src/os-plugins/plugins/desktop/themes/kdm/openslx/color.pngbin0 -> 177 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/kdm/openslx/enter.pngbin0 -> 4260 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/kdm/openslx/enter_inactive.pngbin0 -> 4072 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/kdm/openslx/environment.pngbin0 -> 5076 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/kdm/openslx/main-runner.pngbin0 -> 153 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/kdm/openslx/openslx-logo-main.pngbin0 -> 82050 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/kdm/openslx/openslx-logo.pngbin0 -> 9113 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/kdm/openslx/sessions.pngbin0 -> 4245 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/kdm/openslx/sessions_inactive.pngbin0 -> 4066 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/kdm/openslx/system.pngbin0 -> 4257 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/kdm/openslx/system_inactive.pngbin0 -> 4091 bytes
-rw-r--r--src/os-plugins/plugins/desktop/themes/kdm/openslx/theme.xml232
-rw-r--r--src/os-plugins/plugins/desktop/themes/kdm/openslx/welcome-time-shadowed.pngbin0 -> 1580 bytes
-rw-r--r--src/os-plugins/plugins/dropbear/OpenSLX/OSPlugin/dropbear.pm104
-rw-r--r--src/os-plugins/plugins/dropbear/XX_dropbear.sh58
-rwxr-xr-xsrc/os-plugins/plugins/dropbear/files/dropbearmultibin0 -> 160408 bytes
-rwxr-xr-xsrc/os-plugins/plugins/dropbear/init-hooks/95-cleanup/dropbear.sh1
-rw-r--r--src/os-plugins/plugins/example/OpenSLX/OSPlugin/example.pm154
-rw-r--r--src/os-plugins/plugins/example/XX_example.sh47
-rw-r--r--src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Base.pm60
-rw-r--r--src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Debian.pm32
-rw-r--r--src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Fedora.pm32
-rw-r--r--src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Gentoo.pm32
-rw-r--r--src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Scilin.pm32
-rw-r--r--src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Suse.pm32
-rw-r--r--src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Ubuntu.pm44
-rw-r--r--src/os-plugins/plugins/infoscreen/OpenSLX/OSPlugin/infoscreen.pm112
-rw-r--r--src/os-plugins/plugins/infoscreen/XX_infoscreen.sh58
-rw-r--r--src/os-plugins/plugins/infoscreen/files/empty.xbm6
-rw-r--r--src/os-plugins/plugins/infoscreen/files/infoscreenClient.tgzbin0 -> 267172 bytes
-rwxr-xr-xsrc/os-plugins/plugins/infoscreen/files/kiosk.dpms27
-rw-r--r--src/os-plugins/plugins/kiosk/OpenSLX/Distro/Base.pm65
-rw-r--r--src/os-plugins/plugins/kiosk/OpenSLX/Distro/Debian.pm32
-rw-r--r--src/os-plugins/plugins/kiosk/OpenSLX/Distro/Fedora.pm32
-rw-r--r--src/os-plugins/plugins/kiosk/OpenSLX/Distro/Gentoo.pm32
-rw-r--r--src/os-plugins/plugins/kiosk/OpenSLX/Distro/Scilin.pm32
-rw-r--r--src/os-plugins/plugins/kiosk/OpenSLX/Distro/Suse.pm32
-rw-r--r--src/os-plugins/plugins/kiosk/OpenSLX/Distro/Ubuntu.pm47
-rw-r--r--src/os-plugins/plugins/kiosk/OpenSLX/OSPlugin/kiosk.pm123
-rw-r--r--src/os-plugins/plugins/kiosk/XX_kiosk.sh60
-rwxr-xr-xsrc/os-plugins/plugins/kiosk/files/kgettybin0 -> 14524 bytes
l---------src/os-plugins/plugins/kiosk/files/profiles/plain/.bashrc1
-rw-r--r--src/os-plugins/plugins/kiosk/files/profiles/plain/bashrc4
-rw-r--r--src/os-plugins/plugins/kiosk/files/profiles/vmchooser/.bash_profile2
l---------src/os-plugins/plugins/kiosk/files/profiles/vmchooser/.bashrc1
l---------src/os-plugins/plugins/kiosk/files/profiles/vmchooser/.xinitrc1
-rw-r--r--src/os-plugins/plugins/kiosk/files/profiles/vmchooser/bashrc4
-rw-r--r--src/os-plugins/plugins/kiosk/files/profiles/vmchooser/xinitrc7
-rw-r--r--src/os-plugins/plugins/openvz/OpenSLX/OSPlugin/openvz.pm110
-rw-r--r--src/os-plugins/plugins/openvz/XX_openvz.sh66
-rw-r--r--src/os-plugins/plugins/openvz/files/machine.include0
-rw-r--r--src/os-plugins/plugins/openvz/files/run-virt.include37
-rwxr-xr-xsrc/os-plugins/plugins/openvz/init-hooks/20-nw-bridge-config/bridge.sh30
-rw-r--r--src/os-plugins/plugins/profile/OpenSLX/Distro/Base.pm84
-rw-r--r--src/os-plugins/plugins/profile/OpenSLX/Distro/Debian.pm32
-rw-r--r--src/os-plugins/plugins/profile/OpenSLX/Distro/Fedora.pm32
-rw-r--r--src/os-plugins/plugins/profile/OpenSLX/Distro/Gentoo.pm32
-rw-r--r--src/os-plugins/plugins/profile/OpenSLX/Distro/Scilin.pm32
-rw-r--r--src/os-plugins/plugins/profile/OpenSLX/Distro/Suse.pm68
-rw-r--r--src/os-plugins/plugins/profile/OpenSLX/Distro/Ubuntu.pm66
-rw-r--r--src/os-plugins/plugins/profile/OpenSLX/Distro/Ubuntu_10.pm66
-rw-r--r--src/os-plugins/plugins/profile/OpenSLX/OSPlugin/profile.pm174
-rw-r--r--src/os-plugins/plugins/profile/XX_profile.sh31
-rw-r--r--src/os-plugins/plugins/pvs/OpenSLX/Distro/Base.pm46
-rw-r--r--src/os-plugins/plugins/pvs/OpenSLX/Distro/Debian.pm29
-rw-r--r--src/os-plugins/plugins/pvs/OpenSLX/Distro/Fedora.pm28
-rw-r--r--src/os-plugins/plugins/pvs/OpenSLX/Distro/Gentoo.pm28
-rw-r--r--src/os-plugins/plugins/pvs/OpenSLX/Distro/Suse.pm28
-rw-r--r--src/os-plugins/plugins/pvs/OpenSLX/Distro/Ubuntu.pm23
-rw-r--r--src/os-plugins/plugins/pvs/OpenSLX/OSPlugin/pvs.pm127
-rw-r--r--src/os-plugins/plugins/pvs/XX_pvs.sh46
-rwxr-xr-xsrc/os-plugins/plugins/pvs/files/pvs-vncsrv105
-rw-r--r--src/os-plugins/plugins/qemukvm/OpenSLX/Distro/Base.pm63
-rw-r--r--src/os-plugins/plugins/qemukvm/OpenSLX/Distro/Debian.pm43
-rw-r--r--src/os-plugins/plugins/qemukvm/OpenSLX/Distro/Suse.pm42
-rw-r--r--src/os-plugins/plugins/qemukvm/OpenSLX/Distro/Ubuntu.pm24
-rw-r--r--src/os-plugins/plugins/qemukvm/OpenSLX/OSPlugin/qemukvm.pm256
-rw-r--r--src/os-plugins/plugins/qemukvm/XX_qemukvm.sh112
-rw-r--r--src/os-plugins/plugins/qemukvm/files/ifdown34
-rw-r--r--src/os-plugins/plugins/qemukvm/files/ifup75
-rw-r--r--src/os-plugins/plugins/qemukvm/files/run-virt.include306
-rw-r--r--src/os-plugins/plugins/qemukvm/init-hooks/20-nw-bridge-config/bridge.sh30
-rwxr-xr-xsrc/os-plugins/plugins/qemukvm/init-hooks/60-have-servconfig/vm-dhcpd.sh60
-rw-r--r--src/os-plugins/plugins/syslog/OpenSLX/Distro/Base.pm93
-rw-r--r--src/os-plugins/plugins/syslog/OpenSLX/Distro/Suse.pm41
-rw-r--r--src/os-plugins/plugins/syslog/OpenSLX/OSPlugin/syslog.pm322
-rw-r--r--src/os-plugins/plugins/syslog/XX_syslog.sh31
-rw-r--r--src/os-plugins/plugins/syslog/init-hooks/15-have-ip-config/syslog.sh18
-rw-r--r--src/os-plugins/plugins/syslog/init-hooks/95-cleanup/syslog.sh12
-rw-r--r--src/os-plugins/plugins/sysrqshutdown/OpenSLX/OSPlugin/sysrqshutdown.pm101
-rw-r--r--src/os-plugins/plugins/sysrqshutdown/XX_sysrqshutdown.sh38
-rw-r--r--src/os-plugins/plugins/sysrqshutdown/files/shutdown54
-rw-r--r--src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Base.pm59
-rw-r--r--src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Debian.pm52
-rw-r--r--src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Suse.pm48
-rw-r--r--src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Ubuntu.pm54
-rw-r--r--src/os-plugins/plugins/virtualbox/OpenSLX/OSPlugin/virtualbox.pm284
-rw-r--r--src/os-plugins/plugins/virtualbox/XX_virtualbox.sh98
-rw-r--r--src/os-plugins/plugins/virtualbox/files/empty-diff.vdi.gzbin0 -> 282 bytes
-rw-r--r--src/os-plugins/plugins/virtualbox/files/machine.include132
-rw-r--r--src/os-plugins/plugins/virtualbox/files/run-virt.include372
-rw-r--r--src/os-plugins/plugins/virtualbox/files/rwimg.vdi.gzbin0 -> 268 bytes
-rw-r--r--src/os-plugins/plugins/virtualbox/files/virtualbox.include47
-rw-r--r--src/os-plugins/plugins/virtualbox/init-hooks/20-nw-bridge-config/bridge.sh30
-rw-r--r--src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Base.pm64
-rw-r--r--src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Debian.pm49
-rw-r--r--src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Suse.pm47
-rw-r--r--src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Ubuntu.pm50
-rw-r--r--src/os-plugins/plugins/vmchooser/OpenSLX/OSPlugin/vmchooser.pm143
-rw-r--r--src/os-plugins/plugins/vmchooser/README21
-rw-r--r--src/os-plugins/plugins/vmchooser/XX_vmchooser.sh57
-rw-r--r--src/os-plugins/plugins/vmchooser/files/default.desktop10
-rwxr-xr-xsrc/os-plugins/plugins/vmchooser/files/mesgdispbin0 -> 222820 bytes
l---------src/os-plugins/plugins/vmchooser/files/mkdosfs1
-rwxr-xr-xsrc/os-plugins/plugins/vmchooser/files/printer.sh10
-rw-r--r--src/os-plugins/plugins/vmchooser/files/run-virt.sh402
-rwxr-xr-xsrc/os-plugins/plugins/vmchooser/files/scanner.sh4
-rwxr-xr-xsrc/os-plugins/plugins/vmchooser/files/vm-template.xml60
-rw-r--r--src/os-plugins/plugins/vmchooser/files/vmchooserbin0 -> 1364048 bytes
-rwxr-xr-xsrc/os-plugins/plugins/vmchooser/files/xmlfilter.sh50
-rw-r--r--src/os-plugins/plugins/vmchooser/init-hooks/40-started-hw-config/run-virt.sh21
-rw-r--r--src/os-plugins/plugins/vmchooser/init-hooks/80-after-plugins/virtualization.sh144
-rw-r--r--src/os-plugins/plugins/vmgrid/OpenSLX/OSPlugin/vmgrid.pm319
-rw-r--r--src/os-plugins/plugins/vmgrid/XX_vmgrid.sh104
-rw-r--r--src/os-plugins/plugins/vmgrid/files/run-vmgrid.sh430
-rw-r--r--src/os-plugins/plugins/vmgrid/files/vmgrid154
-rw-r--r--src/os-plugins/plugins/vmgrid/init-hooks/80-after-plugins/virtualization.sh144
-rw-r--r--src/os-plugins/plugins/vmware/OpenSLX/Distro/Base.pm47
-rw-r--r--src/os-plugins/plugins/vmware/OpenSLX/Distro/Debian.pm227
-rw-r--r--src/os-plugins/plugins/vmware/OpenSLX/Distro/Fedora.pm29
-rw-r--r--src/os-plugins/plugins/vmware/OpenSLX/Distro/Gentoo.pm28
-rw-r--r--src/os-plugins/plugins/vmware/OpenSLX/Distro/Suse.pm28
-rw-r--r--src/os-plugins/plugins/vmware/OpenSLX/Distro/Ubuntu.pm23
-rw-r--r--src/os-plugins/plugins/vmware/OpenSLX/OSPlugin/vmware.pm836
-rw-r--r--src/os-plugins/plugins/vmware/XX_vmware.sh201
-rw-r--r--src/os-plugins/plugins/vmware/files/README12
-rw-r--r--src/os-plugins/plugins/vmware/files/install-vmpl.sh284
-rw-r--r--src/os-plugins/plugins/vmware/files/nvrambin0 -> 8664 bytes
-rw-r--r--src/os-plugins/plugins/vmware/files/run-virt.include448
-rwxr-xr-xsrc/os-plugins/plugins/vmware/init-hooks/20-nw-bridge-config/bridge.sh30
-rwxr-xr-xsrc/os-plugins/plugins/vmware/init-hooks/60-have-servconfig/vm-dhcpd.sh60
-rw-r--r--src/os-plugins/plugins/vmware/init-hooks/80-after-plugins/adapt-tmpfs.sh24
-rw-r--r--src/os-plugins/plugins/wlanboot/OpenSLX/OSPlugin/wlanboot.pm154
-rw-r--r--src/os-plugins/plugins/wlanboot/XX_wlanboot.sh27
-rwxr-xr-xsrc/os-plugins/plugins/wlanboot/files/bin/iwconfigbin0 -> 17596 bytes
-rwxr-xr-xsrc/os-plugins/plugins/wlanboot/files/bin/iweventbin0 -> 13496 bytes
-rwxr-xr-xsrc/os-plugins/plugins/wlanboot/files/bin/iwgetidbin0 -> 9300 bytes
-rwxr-xr-xsrc/os-plugins/plugins/wlanboot/files/bin/iwlistbin0 -> 25840 bytes
-rwxr-xr-xsrc/os-plugins/plugins/wlanboot/files/bin/iwprivbin0 -> 9340 bytes
-rwxr-xr-xsrc/os-plugins/plugins/wlanboot/files/bin/iwspybin0 -> 9328 bytes
-rw-r--r--src/os-plugins/plugins/wlanboot/files/bin/iwtest1
-rw-r--r--src/os-plugins/plugins/wlanboot/files/firmware/README8
-rw-r--r--src/os-plugins/plugins/wlanboot/files/firmware/iwlwifi-3945-1.ucodebin0 -> 149652 bytes
-rw-r--r--src/os-plugins/plugins/wlanboot/files/firmware/iwlwifi-3945-2.ucodebin0 -> 149816 bytes
-rw-r--r--src/os-plugins/plugins/wlanboot/files/firmware/iwlwifi-4965-1.ucodebin0 -> 187608 bytes
-rw-r--r--src/os-plugins/plugins/wlanboot/files/firmware/iwlwifi-4965-2.ucodebin0 -> 187764 bytes
-rw-r--r--src/os-plugins/plugins/wlanboot/files/firmware/iwlwifi-5000-1.ucodebin0 -> 345008 bytes
l---------src/os-plugins/plugins/wlanboot/files/lib/libiw.so1
-rwxr-xr-xsrc/os-plugins/plugins/wlanboot/files/lib/libiw.so.29bin0 -> 25892 bytes
-rwxr-xr-xsrc/os-plugins/plugins/wlanboot/init-hooks/10-nw-if-config/wlanboot.sh75
-rw-r--r--src/os-plugins/plugins/x11vnc/OpenSLX/Distro/Base.pm94
-rw-r--r--src/os-plugins/plugins/x11vnc/OpenSLX/Distro/Debian.pm88
-rw-r--r--src/os-plugins/plugins/x11vnc/OpenSLX/Distro/Fedora.pm30
-rw-r--r--src/os-plugins/plugins/x11vnc/OpenSLX/Distro/Gentoo.pm30
-rw-r--r--src/os-plugins/plugins/x11vnc/OpenSLX/Distro/Suse.pm91
-rw-r--r--src/os-plugins/plugins/x11vnc/OpenSLX/Distro/Ubuntu.pm23
-rw-r--r--src/os-plugins/plugins/x11vnc/OpenSLX/OSPlugin/x11vnc.pm221
-rw-r--r--src/os-plugins/plugins/x11vnc/XX_x11vnc.sh135
-rwxr-xr-xsrc/os-plugins/plugins/x11vnc/files/x11vnc-init83
-rw-r--r--src/os-plugins/plugins/xen/OpenSLX/OSPlugin/xen.pm185
-rw-r--r--src/os-plugins/plugins/xen/XX_xen.sh73
-rw-r--r--src/os-plugins/plugins/xen/files/hvm.include209
-rw-r--r--src/os-plugins/plugins/xen/files/machine.include167
-rw-r--r--src/os-plugins/plugins/xen/files/run-virt.include157
-rw-r--r--src/os-plugins/plugins/xen/init-hooks/10-nw-if-config/xennet.sh4
-rwxr-xr-xsrc/os-plugins/plugins/xen/init-hooks/20-nw-bridge-config/bridge.sh30
-rw-r--r--src/os-plugins/plugins/xserver/OpenSLX/Distro/Base.pm212
-rw-r--r--src/os-plugins/plugins/xserver/OpenSLX/Distro/Debian.pm50
-rw-r--r--src/os-plugins/plugins/xserver/OpenSLX/Distro/Suse.pm89
-rw-r--r--src/os-plugins/plugins/xserver/OpenSLX/Distro/Suse_10.pm63
-rw-r--r--src/os-plugins/plugins/xserver/OpenSLX/Distro/Suse_11_0.pm360
-rw-r--r--src/os-plugins/plugins/xserver/OpenSLX/Distro/Suse_11_1.pm361
-rw-r--r--src/os-plugins/plugins/xserver/OpenSLX/Distro/Suse_11_2.pm53
-rw-r--r--src/os-plugins/plugins/xserver/OpenSLX/Distro/Ubuntu.pm96
-rw-r--r--src/os-plugins/plugins/xserver/OpenSLX/Distro/Ubuntu_8.pm73
-rw-r--r--src/os-plugins/plugins/xserver/OpenSLX/Distro/Ubuntu_9.pm30
-rw-r--r--src/os-plugins/plugins/xserver/OpenSLX/OSPlugin/xserver.pm396
-rw-r--r--src/os-plugins/plugins/xserver/XX_xserver.sh351
-rw-r--r--src/os-plugins/plugins/xserver/files/README77
-rwxr-xr-xsrc/os-plugins/plugins/xserver/files/ati-install.sh24
-rwxr-xr-xsrc/os-plugins/plugins/xserver/files/nvidia-install.sh138
-rwxr-xr-xsrc/os-plugins/plugins/xserver/files/suse-gfx-install.sh330
-rwxr-xr-xsrc/os-plugins/plugins/xserver/files/ubuntu-gfx-install.sh124
-rwxr-xr-xsrc/os-plugins/plugins/xserver/files/ubuntu-ng-gfx-install.sh236
-rw-r--r--src/os-plugins/plugins/xserver/init-hooks/00-started/xserver.sh53
-rwxr-xr-xsrc/os-plugins/slxos-plugin525
-rw-r--r--src/tools/README.busybox10
-rwxr-xr-xsrc/tools/mksquashfsbin0 -> 88416 bytes
-rw-r--r--src/tools/mksquashfs-filter-patch201
-rwxr-xr-xsrc/tools/uclibc-wrapper28
1496 files changed, 84561 insertions, 0 deletions
diff --git a/src/bin/devel-tools/determineMinimumPackageSet.pl b/src/bin/devel-tools/determineMinimumPackageSet.pl
new file mode 100755
index 00000000..52d13fc5
--- /dev/null
+++ b/src/bin/devel-tools/determineMinimumPackageSet.pl
@@ -0,0 +1,183 @@
+#! /usr/bin/perl
+# -----------------------------------------------------------------------------
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+use strict;
+use warnings;
+
+my $abstract = q[
+determineMinimumPackageSet.pl
+ This script is a tool for OpenSLX developers that allows to extract
+ the minimal package-set from all the installed rpm packages.
+ "Minimum" here means those packages only that are not
+ required by other installed packages (a.k.a. the leaves of the RPM
+ dependency graph).
+ This minimal set is useful to simplify the commandline for yum when
+ it is invoked to install a specific selection.
+];
+
+use Getopt::Long;
+use Pod::Usage;
+
+my (
+ $helpReq,
+ $verbose,
+ $versionReq,
+
+ %pkgs,
+ @leafPkgs,
+);
+
+my $rpmOutFile = "/tmp/minpkgset.rpmout";
+my $rpmErrFile = "/tmp/minpkgset.rpmerr";
+
+GetOptions(
+ 'help|?' => \$helpReq,
+ 'verbose' => \$verbose,
+ 'version' => \$versionReq,
+) or pod2usage(2);
+pod2usage(-msg => $abstract, -verbose => 0, -exitval => 1) if $helpReq;
+if ($versionReq) {
+ system('slxversion');
+ exit 1;
+}
+
+determineMinimumPackageSet();
+
+print "THE MINIMUM PACKAGE LIST:\n";
+print(('-' x 40)."\n");
+print join("\n", sort @leafPkgs)."\n";
+
+exit;
+
+sub slurpFile
+{
+ my $file = shift;
+
+ my $fh;
+ open($fh, '<', $file)
+ or die _tr("could not open file '%s' for reading! (%s)", $file, $!);
+ local $/ = undef;
+ my $text = <$fh>;
+ close($fh);
+ return $text;
+}
+
+sub rpmDie
+{
+ my $rpmCmd = shift;
+
+ print "\n*** An error occurred when executing the following rpm-command:\n";
+ print "\t$rpmCmd\n";
+ my $err = slurpFile($rpmErrFile);
+ print "*** The error was:\n";
+ print "\t$err\n";
+ exit 5;
+}
+
+sub callRpm
+{
+ my $rpmCmd = shift;
+
+ my $res = system("$rpmCmd >$rpmOutFile 2>$rpmErrFile");
+ exit 1 if ($res & 127); # child caught a signal
+ rpmDie($rpmCmd) if -s $rpmErrFile;
+ my $out = slurpFile($rpmOutFile);
+ return ($res, $out);
+}
+
+sub handlePackage
+{
+ my $pkgName = shift;
+
+ # if any other package requires it, the current package is not a leaf!
+ print "\tdirectly required..." if $verbose;
+ my ($rpmRes, $rpmOut) = callRpm(qq[rpm -q --whatrequires "$pkgName"]);
+ print $rpmRes ? "no\n" : "yes\n" if $verbose;
+ return 0 unless $rpmRes;
+
+ print "\tany of its provides required..." if $verbose;
+ ($rpmRes, $rpmOut) = callRpm(qq[rpm -q --provides "$pkgName"]);
+ my $provides
+ = join ' ',
+ map {
+ my $rpm = $_;
+ $rpm =~ s[^\s*(.+?)\s*$][$1];
+ qq["$rpm"];
+ }
+ split "\n", $rpmOut;
+ ($rpmRes, $rpmOut) = callRpm(qq[rpm -q --whatrequires $provides]);
+ if ($rpmRes == 0) {
+ # ignore if rpm tells us that a provides is required by
+ # the package that provides it:
+ $rpmRes = 1;
+ while($rpmOut =~ m[^\s*(.+?)\s*]gm) {
+ if ($1 ne $pkgName) {
+ $rpmRes = 0;
+ last;
+ }
+ }
+ }
+ print $rpmRes ? "no\n" : "yes\n" if $verbose;
+ return 0 unless $rpmRes;
+
+ print "!!! adding $pkgName\n" if $verbose;
+ push @leafPkgs, $pkgName;
+ return 1;
+}
+
+sub determineMinimumPackageSet
+{
+ my ($rpmRes, $allPkgs)
+ = callRpm(qq[rpm -qa --queryformat "%{NAME}\n"]);
+ foreach my $p (sort split "\n", $allPkgs) {
+ print "$p...\n" if $verbose;
+ print "." unless $verbose;
+ handlePackage($p);
+ }
+ return;
+}
+
+__END__
+
+=head1 NAME
+
+determineMinimumPackageSet.pl - OpenSLX script to extract the minimum package
+set from all the installed rpm packages.
+
+=head1 SYNOPSIS
+
+determineMinimumPackageSet.pl [options]
+
+ Options:
+ --help brief help message
+ --verbose show files as they are being processed
+ --version show version
+
+=head1 OPTIONS
+
+=over 8
+
+=item B<--help>
+
+Prints a brief help message and exits.
+
+=item B<--verbose>
+
+Prints information about each installed package as it is being processed.
+
+=item B<--version>
+
+Prints the version and exits.
+
+=back
+
+=cut \ No newline at end of file
diff --git a/src/bin/devel-tools/extractTranslations.pl b/src/bin/devel-tools/extractTranslations.pl
new file mode 100755
index 00000000..789a70ad
--- /dev/null
+++ b/src/bin/devel-tools/extractTranslations.pl
@@ -0,0 +1,242 @@
+#! /usr/bin/perl
+# -----------------------------------------------------------------------------
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# extractTranslations.pl
+# - OpenSLX-script to extract translatable strings from other scripts
+# and modules.
+# -----------------------------------------------------------------------------
+use strict;
+use warnings;
+
+my $abstract = q[
+extractTranslations.pl
+ This script is a tool for OpenSLX developers that allows to extract
+ translatable strings from all OpenSLX perl-scripts and modules found
+ in and below a given path.
+
+ Optionally, all the translatable strings that were found can automatically
+ be integrated into all existing translation modules. During this process,
+ any translations already existing in these modules will be preserved.
+];
+
+use Cwd;
+use File::Find;
+use Getopt::Long;
+use Pod::Usage;
+
+use OpenSLX::Utils;
+
+my (
+ $helpReq,
+ $show,
+ $update,
+ $verbose,
+ $versionReq,
+
+ %translatableStrings,
+ $fileCount,
+);
+
+GetOptions(
+ 'help|?' => \$helpReq,
+ 'update' => \$update,
+ 'show' => \$show,
+ 'verbose' => \$verbose,
+ 'version' => \$versionReq,
+) or pod2usage(2);
+pod2usage(-msg => $abstract, -verbose => 0, -exitval => 1) if $helpReq;
+if ($versionReq) {
+ system('slxversion');
+ exit 1;
+}
+
+# chdir to the repository's root folder:
+use FindBin;
+my $path = "$FindBin::RealBin/../..";
+chdir($path)
+ or die "can't chdir to repository-root <$path> ($!)";
+print "searching in ".cwd()."\n";
+
+find(\&ExtractTrStrings, '.');
+
+my $trCount = scalar keys %translatableStrings;
+print "Found $trCount translatable strings in $fileCount files.\n";
+
+if ($show) {
+ foreach my $tr (sort {lc($a) cmp lc($b)} keys %translatableStrings) {
+ print "\tqq{$tr}\n\t\t=> qq{$tr}\n";
+ }
+}
+
+if ($update) {
+ find(\&UpdateTrModule, 'lib/OpenSLX/Translations');
+}
+
+exit;
+
+sub ExtractTrStrings
+{
+ $File::Find::prune = 1 if ($_ eq '.svn'
+ || $_ eq 'Translations'
+ || $_ eq 'devel-tools');
+ return if -d;
+ my $text = slurpFile($_);
+ if ($File::Find::name !~ m[\.pm$] && $text !~ m[^#!.+/perl]im) {
+ # ignore anything other than perl-modules and -scripts
+ return;
+ }
+ print "$File::Find::name...\n";
+ $fileCount++;
+ while($text =~ m[_tr\s*\(\s*(.+?)\s*\);]gos) {
+ # NOTE: that cheesy regex relies on the string ');' not being used
+ # inside of translatable strings... so SLX_DONT_DO_THAT!
+ # As an alternative, we could implement a real parser, but
+ # I'd like to postpone that until the current scheme proves
+ # simply not good enough.
+ my $tr = $1;
+ if (!($tr =~ m[^'([^']+)'\s*(,.+?)*\s*$]os
+ || $tr =~ m[^\"([^"]+)\"\s*(,.+?)*\s*$]os
+ || $tr =~ m{^qq?\[([^\]]+)\]\s*(,.+?)*\s*$}os)) {
+ die "$File::Find::name: could not parse _tr()-argument \n"
+ ."\t$tr\nPlease correct and retry.\n";
+ }
+ $tr = $1;
+ if ($tr =~ m[(\$\w+)]) {
+ die "$File::Find::name: _tr()-argument\n\t$tr\n"
+ ."contains variable '$1'.\nPlease correct and retry.\n";
+ }
+ $tr =~ s[\n][\\n]g;
+ $tr =~ s[\t][\\t]g;
+ $translatableStrings{$tr} = $tr;
+ print "\t$tr\n" if $verbose;
+ }
+}
+
+sub UpdateTrModule
+{
+ $File::Find::prune = 1 if ($_ eq '.svn');
+ return if -d || !/.pm$/;
+ print "updating $File::Find::name...\n";
+ my $trModule = $_;
+ my $useKeyAsTranslation = ($trModule eq 'posix.pm');
+ my $text = slurpFile($trModule);
+ if ($text !~ m[%translations\s*=\s*\(\s*(.+)\s*\);]os) {
+ print "\t*** No translations found - file will be skipped! ***\n";
+ return;
+ }
+ my %translations;
+ # evaluate the hash read from file into %translations:
+ if (!eval "$&") {
+ print "\t*** translations can't be evaluated - file will be skipped! ***\n";
+ return;
+ }
+ my $updatedTranslations = "%translations = (\n";
+ my $keepCount = 0;
+ my $newCount = 0;
+ foreach my $tr (sort {lc($a) cmp lc($b)} keys %translatableStrings) {
+ if (!length($translations{$tr})) {
+ if ($useKeyAsTranslation) {
+ # POSIX language (English): use key as translation:
+ $updatedTranslations
+ .= "\tq{$tr}\n\t=>\n\tqq{$tr},\n\n";
+ $newCount++;
+ } else {
+ # no translation available, we mark the key, such that a
+ # search for this key will fall back to the english message:
+ my $trMark = "NEW:$tr";
+ if (exists $translations{$trMark}) {
+ # the marked string already exists, we keep the translation
+ # if any (usually, of course, there is none):
+ my $trValue = $translations{$trMark};
+ $trValue =~ s[\n][\\n]g;
+ $trValue =~ s[\t][\\t]g;
+ $updatedTranslations
+ .= "\tq{$trMark}\n\t=>\n\tqq{$trValue},\n\n";
+ $keepCount++;
+ } else {
+ $updatedTranslations
+ .= "\tq{$trMark}\n\t=>\n\tqq{},\n\n";
+ $newCount++;
+ }
+ }
+ } else {
+ # use existing translation for key:
+ my $trValue = $translations{$tr};
+ $trValue =~ s[\n][\\n]g;
+ $trValue =~ s[\t][\\t]g;
+ $updatedTranslations
+ .= "\tq{$tr}\n\t=>\n\tqq{$trValue},\n\n";
+ $keepCount++;
+ }
+ }
+ my $delCount = scalar(keys %translations) - $keepCount;
+ $text =~ s[%translations\s*=\s*\(\s*(.+)\s*\);]
+ [$updatedTranslations);]os;
+ if ($newCount + $delCount) {
+ chomp $text;
+ spitFile($trModule, $text."\n");
+ print "\tadded $newCount strings, kept $keepCount and removed $delCount.\n";
+ } else {
+ print "\tnothing changed\n";
+ }
+}
+
+__END__
+
+=head1 NAME
+
+extractTranslations.pl - OpenSLX-script to extract translatable strings from
+all scripts and modules found in and below the given path.
+
+=head1 SYNOPSIS
+
+extractTranslations.pl [options]
+
+ Options:
+ --help brief help message
+ --update update the OpenSLX locale modules
+ (in lib/OpenSLX/Translations)
+ --show show overview of all strings found
+ --verbose show for each file which strings are found
+ --version show version
+
+=head1 OPTIONS
+
+=over 8
+
+=item B<--help>
+
+Prints a brief help message and exits.
+
+=item B<--show>
+
+Prints sorted list of all translatable strings that were found.
+
+=item B<--update>
+
+Integrates the found translatable strings into all OpenSLX locale modules found
+under lib/OpenSLX/Translations.
+Every module will be updated with the found strings, existing
+translations will not be changed (unless the corresponding key doesn't exist
+anymore, in which case they will be removed).
+
+=item B<--verbose>
+
+Prints information about what's going on during execution of the script.
+
+=item B<--version>
+
+Prints the version and exits.
+
+=back
+
+=cut \ No newline at end of file
diff --git a/src/bin/devel-tools/generateSettings.pl b/src/bin/devel-tools/generateSettings.pl
new file mode 100755
index 00000000..b0e1b447
--- /dev/null
+++ b/src/bin/devel-tools/generateSettings.pl
@@ -0,0 +1,207 @@
+#! /usr/bin/perl
+# -----------------------------------------------------------------------------
+# Copyright (c) 2006 - 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+use strict;
+use warnings;
+use Data::Dumper;
+my $abstract = q[
+determineMinimumPackageSet.pl
+ This script is a tool for OpenSLX developers that is meant to generate a
+ packageset for settings.default. It can be used to generate
+ bootstrap-packages for example.
+];
+
+use Getopt::Long;
+use Pod::Usage;
+
+my (
+ $helpReq,
+ $verbose,
+ $versionReq,
+ $inputfile,
+ $outputfile,
+ $url,
+ $errorfile,
+
+ @Pkgs,
+ @files,
+ @GivenNames,
+ @filelisting,
+ @errors,
+);
+
+$errorfile="/tmp/genSettings.err";
+GetOptions(
+ 'help|?' => \$helpReq,
+ 'verbose' => \$verbose,
+ 'version' => \$versionReq,
+ 'if=s' => \$inputfile,
+ 'of=s' => \$outputfile,
+ 'url=s' => \$url,
+) or pod2usage(2);
+pod2usage(-msg => $abstract, -verbose => 0, -exitval => 1) if $helpReq;
+if ($versionReq) {
+ system('slxversion');
+ exit 1;
+}
+
+open(INPUTFILE,$inputfile) || die("Can't open input-file $inputfile!");
+ while (my $zeile=<INPUTFILE>){
+ if ($zeile ne "") {
+ push (@GivenNames,$zeile);
+ }
+ }
+close(INPUTFILE);
+
+print "getting filelisting:\n" if $verbose;
+if (substr($url,0,3) eq "ftp") {
+ print "\trecognized mirror as ftp - $url\n" if $verbose;
+ @filelisting=_getPackageListingFtp($url);
+} elsif (substr($url,0,4) eq "http") {
+ print "\trecognized mirror as http - $url\n" if $verbose;
+ @filelisting=_getPackageListingHttp($url);
+} else {
+ die "Unable to get mirror type (ftp or http)";
+}
+print "\tgot file listing from $url\n" if $verbose;
+print "resolving names:\n" if $verbose;
+foreach my $name (@GivenNames) {
+ $name=~ s/^[\s\t]+//; #removes whitespaces
+ $name=~ s/[\n\t\r]$//; #removes new lines
+ my @possiblepackages = grep(/^\Q$name\E*/i,@filelisting);
+ my $res;
+ if ($possiblepackages[0]) {
+ $res = $possiblepackages[0];
+ } else {
+ push (@errors,$name);
+ }
+ print "\t$name->$res\n" if $verbose;
+ push (@Pkgs,$res) if $res;
+}
+open (OUTPUTFILE,">>$outputfile") || die("Can't open output-file $outputfile!");
+foreach my $package (@Pkgs) {
+ print OUTPUTFILE "$package\n";
+}
+close (OUTPUTFILE);
+open (ERRORFILE,">>$errorfile") || die("Can't open output-file $errorfile!");
+ foreach my $error (@errors) {
+ print ERRORFILE "$error\n";
+}
+close (ERRORFILE);
+print "\n";
+
+if ($verbose) {
+ print "THE PACKAGE LIST:\n";
+ print(('=' x 40)."\n");
+ print join("\n", sort @Pkgs)."\n";
+}
+
+exit;
+
+
+sub _getPackageListingFtp {
+ my $url = shift;
+ use Net::FTP;
+ use URI;
+ require URI::_generic;
+
+ my $urlObject = URI->new($url);
+ my $path = shift;
+ my $ftp = Net::FTP->new($urlObject->host( ), Timeout => 240)
+ or die _tr("Unable to connect to FTP-Server");
+ $ftp->login("anonymous", "mailaddress@");
+ $ftp->cwd($urlObject->path( ));
+ return $ftp->ls();
+}
+
+sub _getPackageListingHttp {
+ my $url = shift;
+ use URI;
+ use URI::http;
+ use URI::_foreign;
+ use HTTP::Request;
+ use LWP::UserAgent;
+ use LWP::Protocol::http;
+
+ my @filelisting;
+ my $ua = LWP::UserAgent->new;
+ $ua->agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8) Gecko/20051111 Firefox/1.5");
+ my $req;
+ $req = HTTP::Request->new(GET => $url);
+ $req->header('Accept' => 'text/html');
+
+ # send request
+ my $res = $ua->request($req);
+ # check the outcome
+ if ($res->is_success) {
+ print "\tThe given URL is : $url\n" if $verbose;
+ @filelisting = ($res->decoded_content =~ m/<a href=\"([^\"]*.rpm)/g);
+ foreach my $i (@filelisting){
+ print $i."\n" if $verbose;
+ }
+ print "\tgot list of files from mirror.\n" if $verbose;
+ return @filelisting;
+ }
+ die("Error: " . $res->status_line . "\n");
+}
+
+
+__END__
+
+=head1 NAME
+
+generateSettings.pl - OpenSLX script to extract full package names
+from a given mirror.
+
+=head1 SYNOPSIS
+
+generateSettings.pl [options]
+
+ Options:
+ --if inputfile
+ --of outputfile
+ --url url of the mirror
+ --help brief help message
+ --verbose show files as they are being processed
+ --version show version
+
+=head1 OPTIONS
+
+=over 8
+
+=item B<--if>
+
+Select input file with package names in each line.
+
+=item B<--of>
+
+Select output file for complete package names to append.
+
+=item B<--url>
+
+Select a mirror directory for the desired distribution
+
+=item B<--help>
+
+Prints a brief help message and exits.
+
+=item B<--verbose>
+
+Prints information about each installed package as it is being processed.
+
+=item B<--version>
+
+Prints the version and exits.
+
+=back
+
+=cut
diff --git a/src/bin/devel-tools/parseSusePatterns.pl b/src/bin/devel-tools/parseSusePatterns.pl
new file mode 100755
index 00000000..a286cd71
--- /dev/null
+++ b/src/bin/devel-tools/parseSusePatterns.pl
@@ -0,0 +1,163 @@
+#! /usr/bin/perl
+# -----------------------------------------------------------------------------
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# parseSusePatterns.pl
+# - OpenSLX script to extract a package list from a given list of
+# SUSE-pattern-files (*.pat).
+# -----------------------------------------------------------------------------
+use strict;
+use warnings;
+
+my $abstract = q[
+parseSusePatterns.pl
+ This script is a tool for OpenSLX developers that allows to extract
+ package lists from a given set of SUSE pattern files.
+];
+
+use Getopt::Long;
+use Pod::Usage;
+
+my (
+ $helpReq,
+ $versionReq,
+
+ %patternNames,
+ %packageNames,
+);
+
+GetOptions(
+ 'help|?' => \$helpReq,
+ 'version' => \$versionReq,
+) or pod2usage(2);
+pod2usage(-msg => $abstract, -verbose => 0, -exitval => 1) if $helpReq;
+if ($versionReq) {
+ system('slxversion');
+ exit 1;
+}
+
+if ($ARGV[0] !~ m[^(\w+)-(.+)$]) {
+ die "can't extract architecture from pattern file name '$ARGV[0]'";
+}
+my $arch = $2;
+
+foreach my $patternFile (@ARGV) {
+ parsePatternFile($patternFile, 1);
+}
+
+print join("\n", sort keys %packageNames)."\n";
+
+exit;
+
+sub parsePatternFile
+{
+ my $patternFile = shift;
+ my $outmost = shift;
+
+ my $patFH;
+ if (!open($patFH, '<', $patternFile)) {
+ return unless $outmost;
+ die "unable to open $patternFile";
+ }
+ undef $/;
+ my $content = <$patFH>;
+ close($patFH);
+ $patternNames{$patternFile} = 1;
+
+ if ($content =~ m[^\=Sum.de:\s*(.+?)\s*$]ms) {
+ print "+ $1\n";
+ }
+ if ($content =~ m[^\+Sug:\s*?$(.+?)^\-Sug:\s*?$]ms) {
+ addSubPatterns($1);
+ }
+ if ($content =~ m[^\+Req:\s*?$(.+?)^\-Req:\s*?$]ms) {
+ addSubPatterns($1);
+ }
+ if ($content =~ m[^\+Rec:\s*?$(.+?)^\-Rec:\s*?$]ms) {
+ addSubPatterns($1);
+ }
+ if ($content =~ m[^\+Prq:\s*?$(.+?)^\-Prq:\s*?$]ms) {
+ addPkgNames($1);
+ }
+ if ($content =~ m[^\+Prc:\s*?$(.+?)^\-Prc:\s*?$]ms) {
+ addPkgNames($1);
+ }
+ return;
+}
+
+sub addSubPatterns
+{
+ my $patternNames = shift;
+
+ my @subPatterns
+ = grep { length($_) > 0 }
+ map {
+ my $pattern = $_;
+ $pattern =~ s[^\s*(.+?)\s*$][$1];
+ $pattern;
+ }
+ split "\n", $patternNames;
+
+ foreach my $subPattern (@subPatterns) {
+ my $subPatternFile = "$subPattern-$arch";
+ if (!exists $patternNames{$subPatternFile}) {
+ parsePatternFile($subPatternFile);
+ }
+ }
+ return;
+}
+
+sub addPkgNames
+{
+ my $pkgs = shift;
+
+ my @pkgNames
+ = grep { length($_) > 0 }
+ map {
+ my $pkg = $_;
+ $pkg =~ s[^\s*(.+?)\s*$][$1];
+ $pkg;
+ }
+ split "\n", $pkgs;
+ foreach my $pkgName (@pkgNames) {
+ $packageNames{$pkgName} = 1;
+ }
+ return;
+}
+
+=head1 NAME
+
+parseSusePatterns.pl - OpenSLX script to extract a package list from
+a given list of SUSE-pattern-files (*.pat).
+
+=head1 SYNOPSIS
+
+parseSusePatterns.pl [options] <pattern-file> ...
+
+ Options:
+ --help brief help message
+ --version show version
+
+=head1 OPTIONS
+
+=over 8
+
+=item B<--help>
+
+Prints a brief help message and exits.
+
+=item B<--version>
+
+Prints the version and exits.
+
+=back
+
+=cut \ No newline at end of file
diff --git a/src/bin/slxldd b/src/bin/slxldd
new file mode 100755
index 00000000..16d07b9c
--- /dev/null
+++ b/src/bin/slxldd
@@ -0,0 +1,128 @@
+#! /usr/bin/perl
+# -----------------------------------------------------------------------------
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# slxldd
+# - OpenSLX-rewrite of ldd that works on multiple architectures.
+# -----------------------------------------------------------------------------
+use strict;
+use warnings;
+
+my $abstract = q[
+slxldd
+ This script reimplements ldd in a way that should work for all
+ binary formats supported by the binutils installed on the host system.
+
+ An example: if you have a folder containing an x86_64 system, you can
+ invoke this script on a x86_32-host in order to determine all the libraries
+ required by a binary of the x86_64 target system.
+];
+
+# add the lib-folder to perl's search path for modules:
+use FindBin;
+use lib "$FindBin::RealBin/../lib";
+
+use File::Glob ':globally';
+use Getopt::Long;
+use Pod::Usage;
+
+use OpenSLX::Basics;
+use OpenSLX::LibScanner;
+
+my %option = (
+ rootPath => '/',
+);
+GetOptions(
+ 'help|?' => \$option{helpReq},
+ 'man' => \$option{manReq},
+ 'root-path=s' => \$option{rootPath},
+ 'verbose' => \$option{verbose},
+ 'version' => \$option{versionReq},
+ )
+ or pod2usage(2);
+pod2usage(-msg => $abstract, -verbose => 0, -exitval => 1) if $option{helpReq};
+pod2usage(-verbose => 2) if $option{manReq};
+if ($option{versionReq}) {
+ system('slxversion');
+ exit 1;
+}
+
+openslxInit();
+
+if (!$option{rootPath}) {
+ print STDERR _tr("You need to specify the root-path!\n");
+ pod2usage(2);
+}
+
+$option{rootPath} =~ s[/+$][];
+# remove trailing slashes
+
+if (!@ARGV) {
+ print STDERR _tr("You need to specify at least one file!\n");
+ pod2usage(2);
+}
+
+my $libScanner = OpenSLX::LibScanner->new({
+ 'root-path' => $option{rootPath},
+ 'verbose' => $option{verbose},
+});
+
+my @libs = $libScanner->determineRequiredLibs(@ARGV);
+print join("\n", @libs), "\n";
+
+=head1 NAME
+
+slxldd - OpenSLX-script to determine the libraries required by any given
+binary file.
+
+=head1 SYNOPSIS
+
+slxldd [options] file [...more files]
+
+ Options:
+ --help brief help message
+ --man show full documentation
+ --root-path=<string> path to the root folder for library search
+ --verbose show what's going on during execution
+ --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<--root-path=<string>>
+
+Sets the root folder that is used when searching for libraries. In order to
+collect the loader-settings, etc/ld.so.conf is read relative to this path and
+all libraries are sought relative to this path, too (a.k.a. a virtual chroot).
+
+Defaults to '/'.
+
+=item B<--verbose>
+
+Prints info about the files as they are being scanned.
+
+=item B<--version>
+
+Prints the version and exits.
+
+=back
+
+=cut
+
diff --git a/src/bin/slxsettings b/src/bin/slxsettings
new file mode 100755
index 00000000..8c6a823d
--- /dev/null
+++ b/src/bin/slxsettings
@@ -0,0 +1,381 @@
+#! /usr/bin/perl
+# -----------------------------------------------------------------------------
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# slxsettings
+# - OpenSLX-script to show & change local settings
+# -----------------------------------------------------------------------------
+use strict;
+use warnings;
+
+my $abstract = q[
+slxsettings
+ This script can be used to show or change the local settings for OpenSLX.
+
+ Any cmdline-argument passed to this script will change the local OpenSLX
+ settings file (usually /etc/opt/openslx/settings).
+
+ If you invoke the script without any arguments, it will print the current
+ settings and exit.
+
+ Please use the --man option in order to read the full manual.
+];
+
+# add the lib-folder and the folder this script lives in to perl's search
+# path for modules:
+use FindBin;
+use lib "$FindBin::RealBin/../lib";
+use lib "$FindBin::RealBin";
+# development path to config-db stuff
+
+use Config::General;
+use Getopt::Long qw(:config pass_through);
+use Pod::Usage;
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+my (@reset, %givenSettings, %option);
+
+GetOptions(
+ 'quiet' => \$option{quiet},
+ 'help|?' => \$option{helpReq},
+ 'man' => \$option{manReq},
+ 'version' => \$option{versionReq},
+);
+pod2usage(-msg => $abstract, -verbose => 0, -exitval => 1) if $option{helpReq};
+pod2usage(-verbose => 2) if $option{manReq};
+if ($option{versionReq}) {
+ system('slxversion');
+ exit 1;
+}
+
+if ($> != 0) {
+ die _tr("Sorry, this script can only be executed by the superuser!\n");
+}
+
+openslxInit() or pod2usage(2);
+
+# some settings must match a certain pattern:
+my %configPattern = (
+ 'db-type' => '(SQLite|mysql)',
+);
+
+# the remaining cmdline arguments are set or reset actions, each followed
+# by a single argument:
+while (scalar @ARGV) {
+ my $action = shift || '';
+ my $arg = shift || '';
+ if ($action eq 'set') {
+ if ($arg !~ m[^([-\w]+)=(.+)$]) {
+ die _tr(
+ "set-argument '%s' has unknown format, expected '<key>=<value>!'",
+ $arg
+ );
+ }
+ $givenSettings{$1} = $2;
+ }
+ elsif ($action eq 'reset') {
+ push @reset, $arg;
+ }
+ else {
+ die _tr(unshiftHereDoc(<<' END-OF-HERE'), $arg, $0);
+ action '%s' is not understood! Known actions are:
+ set
+ reset
+ Try '%s --help' for more info.
+ END-OF-HERE
+ }
+}
+
+# fetch current content of local settings file...
+my $fileName = "$openslxConfig{'config-path'}/settings";
+if (!-e $fileName) {
+ # create empty default settings file with tight mode (root-only access)
+ # [I know this isn't *secure* as such, but it's still better than nothing]
+ slxsystem("touch $fileName && chmod 0600 $fileName");
+}
+my $configObj = Config::General->new(
+ -ConfigFile => $fileName,
+ -SplitDelimiter => '\s*=\s*',
+ -SplitPolicy => 'custom',
+ -StoreDelimiter => '=',
+);
+my %settings = $configObj->getall();
+
+my %changed;
+
+# ...set new values...
+foreach my $key (keys %givenSettings) {
+ my $value = $givenSettings{$key};
+ next if !defined $value;
+ if (!exists $openslxConfig{$key}) {
+ die _tr("option '%s' is not known!", $key);
+ }
+ if ($key =~ m{^(base-path|config-path)$}) {
+ die _tr("option '%s' is fixed!", $key);
+ }
+ if (exists $configPattern{$key} && $value !~ m{$configPattern{$key}}) {
+ die _tr(
+ "option '%s' must match pattern '%s'!", $key, $configPattern{$key}
+ );
+ }
+
+ vlog(0, _tr("setting %s to '%s'", $key, $value)) unless $option{quiet};
+ my $externalKey = externalKeyFor($key);
+ if (!exists $settings{$externalKey} || $settings{$externalKey} ne $value) {
+ $settings{$externalKey} = $value;
+ }
+ $changed{$key}++;
+}
+
+# reset specified keys to fall back to default:
+foreach my $key (@reset) {
+ my $externalKey = externalKeyFor($key);
+ if (exists $settings{$externalKey}) {
+ delete $settings{$externalKey};
+ vlog(0,
+ _tr("removing option '%s' from local settings", $key))
+ unless $option{quiet};
+ } else {
+ vlog(0,
+ _tr("option '%s' didn't exist in local settings!", $key))
+ unless $option{quiet};
+ }
+ $changed{$key}++;
+}
+
+# ... and write local settings file if necessary
+if (keys %changed) {
+ $configObj->save_file($fileName, \%settings);
+
+ openslxInit();
+
+ foreach my $key (keys %changed) {
+ changedHandler($key, $openslxConfig{$key});
+ }
+}
+
+if (!keys %changed) {
+ print _tr("paths fixed at installation time:\n");
+ print qq[\tbase-path='$openslxConfig{'base-path'}'\n];
+ print qq[\tconfig-path='$openslxConfig{'config-path'}'\n];
+ my $text =
+ keys %changed
+ ? "resulting base settings (cmdline options):\n"
+ : "current base settings (cmdline options):\n";
+ print $text;
+ my @baseSettings = grep { exists $cmdlineConfig{$_} } keys %openslxConfig;
+ foreach my $key (sort @baseSettings) {
+ my $val = $openslxConfig{$key} || '';
+ print qq[\t$key='$val'\n];
+ }
+ print _tr("extended settings:\n");
+ my @extSettings = grep { !exists $cmdlineConfig{$_} } keys %openslxConfig;
+ foreach my $key (sort @extSettings) {
+ next if $key =~ m[^(base-path|config-path)$];
+ my $val = $openslxConfig{$key};
+ if (defined $val) {
+ print qq[\t$key='$val'\n];
+ }
+ else {
+ print qq[\t$key=<unset>\n];
+ }
+ }
+}
+
+sub externalKeyFor
+{
+ my $key = shift;
+
+ $key =~ tr[-][_];
+ return "SLX_" . uc($key);
+}
+
+sub changedHandler
+{
+ my $key = shift;
+ my $value = shift;
+
+ # invoke a key-specific change handler if it exists:
+ $key =~ tr[-][_];
+
+ # we do the following function call in an eval as that function may simply
+ # not exist:
+ eval {
+ no strict 'refs'; ## no critic (ProhibitNoStrict)
+ "${key}_changed_handler"->();
+ };
+
+ return;
+}
+
+sub private_path_changed_handler
+{
+ # create the default config folders (for default system only):
+ require OpenSLX::ConfigFolder;
+ OpenSLX::ConfigFolder::createConfigFolderForDefaultSystem();
+
+ return;
+}
+
+=head1 NAME
+
+slxsettings - OpenSLX-script to show & change local settings
+
+=head1 SYNOPSIS
+
+slxsettings [options] [action ...]
+
+=head3 Script Actions
+
+ set <option-name=value> sets the option to the given value
+ reset <option-name> resets the given option to its default
+
+=head3 List of Known Option Names
+
+ db-name=<string> name of database
+ db-spec=<string> full DBI-specification of database
+ db-type=<string> type of database to connect to
+ locale=<string> locale to use for translations
+ log-level=<int> level of logging verbosity (0-3)
+ logfile=<string> file to write logging output to
+ private-path=<string> path to private data
+ public-path=<string> path to public (client-accesible) data
+ temp-path=<string> path to temporary data
+
+=head3 General Options
+
+ --help brief help message
+ --man full documentation
+ --quiet do not print anything
+ --version show version
+
+=head3 Actions
+
+=over 8
+
+=item B<< set <openslx-option>=<value> >>
+
+sets the specified option to the given value
+
+=item B<< reset <setting> >>
+
+removes the given setting from the local settings (resets it to its default
+value)
+
+=back
+
+=head1 DESCRIPTION
+
+B<slxsettings> can be used to show or change the local settings for OpenSLX.
+
+Any cmdline-argument passed to this script will change the local OpenSLX
+settings file (usually /etc/opt/openslx/settings).
+
+If you invoke the script without any arguments, it will print the current
+settings and exit.
+
+=head1 OPTIONS
+
+=head3 Known Option Names
+
+=over 8
+
+=item B<< db-name=<string> >>
+
+Gives the name of the database to connect to.
+
+Default is $SLX_DB_NAME (usually C<openslx>).
+
+=item B<< db-spec=<string> >>
+
+Gives the full DBI-specification of database to connect to. Content depends
+on the db-type.
+
+Default is $SLX_DB_SPEC (usually empty as it will be built automatically).
+
+=item B<< db-type=<string> >>
+
+Sets the type of database to connect to (SQLite, mysql, ...).
+
+Default $SLX_DB_TYPE (usually C<SQLite>).
+
+=item B<< locale=<string> >>
+
+Sets the locale to use for translations.
+
+Defaults to the system's standard locale.
+
+=item B<< logfile=<string> >>
+
+Specifies a file where logging output will be written to.
+
+Default is to log to STDERR.
+
+=item B<< private-path=<string> >>
+
+Sets path to private data, where the config-db, vendor_oses and configurational
+extensions will be stored.
+
+Default is $SLX_PRIVATE_PATH (usually F</var/opt/openslx>.
+
+=item B<< public-path=<string> >>
+
+Sets path to public (client-accesible) data.
+
+Default is $SLX_PUBLIC_PATH (usually F</srv/openslx>.
+
+=item B<< temp-path=<string> >>
+
+Sets path to temporary data.
+
+Default is $SLX_TEMP_PATH (usually F</tmp>.
+
+=item B<< log-level=<int> >>
+
+Sets the level of logging verbosity (0-3).
+Prints additional output for debugging. N is a number between 0 and 3. Level
+1 provides more information than the default, while 2 provides traces. With
+level 3 you get extreme debug output, e.g. database commands are printed.
+
+Default is $SLX_VERBOSE_LEVEL (usually 0, no logging).
+
+=back
+
+=head3 General Options
+
+=over 8
+
+=item B< --help>
+
+Prints a brief help message and exits.
+
+=item B< --man>
+
+Prints the manual page and exits.
+
+=item B< --quiet>
+
+Runs the script without printing anything.
+
+=item B< --version>
+
+Prints the version and exits.
+
+=back
+
+=head1 SEE ALSO
+
+slxos-setup, slxos-export, slxconfig, slxconfig-demuxer
+
+=cut
+
diff --git a/src/boot-env/OpenSLX/BootEnvironment/Base.pm b/src/boot-env/OpenSLX/BootEnvironment/Base.pm
new file mode 100644
index 00000000..aa4cbe5b
--- /dev/null
+++ b/src/boot-env/OpenSLX/BootEnvironment/Base.pm
@@ -0,0 +1,160 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# BootEnvironment::Base.pm
+# - provides empty base of the BootEnvironment API.
+# -----------------------------------------------------------------------------
+package OpenSLX::BootEnvironment::Base;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+use Clone qw(clone);
+use File::Basename;
+use File::Path;
+
+use OpenSLX::Basics;
+use OpenSLX::ConfigDB;
+use OpenSLX::MakeInitRamFS::Engine::SlxBoot;
+use OpenSLX::Utils;
+
+our %initramfsMap;
+
+sub new
+{
+ my $class = shift;
+
+ my $self = {};
+
+ return bless $self, $class;
+}
+
+sub initialize
+{
+ my $self = shift;
+ my $params = shift;
+
+ $self->{'dry-run'} = $params->{'dry-run'};
+
+ return 1;
+}
+
+sub finalize
+{
+ my $self = shift;
+ my $delete = shift;
+
+ return 1 if $self->{'dry-run'};
+
+ my $rsyncDeleteClause = $delete ? '--delete' : '';
+ my $rsyncCmd
+ = "rsync -a $rsyncDeleteClause --delay-updates $self->{'target-path'}/ $self->{'original-path'}/";
+ slxsystem($rsyncCmd) == 0
+ or die _tr(
+ "unable to rsync files from '%s' to '%s'! (%s)",
+ $self->{'target-path'}, $self->{'original-path'}, $!
+ );
+ rmtree([$self->{'target-path'}]);
+
+ return 1;
+}
+
+sub requiresDefaultClientConfig
+{
+ my $self = shift;
+
+ return $self->{'requires-default-client-config'};
+}
+
+sub writeBootloaderMenuFor
+{
+ my $self = shift;
+ my $client = shift;
+ my $externalClientID = shift;
+ my $systemInfos = shift;
+
+ return;
+}
+
+sub writeFilesRequiredForBooting
+{
+ my $self = shift;
+ my $info = shift;
+ my $buildPath = shift;
+
+ my $kernelFile = $info->{'kernel-file'};
+ my $kernelName = basename($kernelFile);
+
+ my $vendorOSPath = "$self->{'target-path'}/$info->{'vendor-os'}->{name}";
+ mkpath $vendorOSPath unless -e $vendorOSPath || $self->{'dry-run'};
+
+ my $targetKernel = "$vendorOSPath/$kernelName";
+ if (!-e $targetKernel) {
+ vlog(1, _tr('copying kernel %s to %s', $kernelFile, $targetKernel));
+ slxsystem(qq[cp -p "$kernelFile" "$targetKernel"])
+ unless $self->{'dry-run'};
+ }
+
+ # create initramfs:
+ my $initramfsName = "$vendorOSPath/$info->{'initramfs-name'}";
+ vlog(1, _tr('generating initialramfs %s', $initramfsName));
+ $self->_makeInitRamFS($info, $initramfsName);
+ return 1;
+}
+
+sub _makeInitRamFS
+{
+ my $self = shift;
+ my $info = shift;
+ my $initramfs = shift;
+
+ my $vendorOS = $info->{'vendor-os'};
+ my $kernelFile = basename(followLink($info->{'kernel-file'}));
+
+ my $attrs = clone($info->{attrs} || {});
+
+ chomp(my $slxVersion = qx{slxversion});
+
+ my $params = {
+ 'attrs' => $attrs,
+ 'export-name' => $info->{export}->{name},
+ 'export-uri' => $info->{'export-uri'},
+ 'initramfs' => $initramfs,
+ 'kernel-params'
+ => [ split ' ', ($info->{attrs}->{kernel_params} || '') ],
+ 'kernel-version' => $kernelFile =~ m[-(.+)$] ? $1 : '',
+ 'plugins' => $info->{'active-plugins'},
+ 'root-path'
+ => "$openslxConfig{'private-path'}/stage1/$vendorOS->{name}",
+ 'slx-version' => $slxVersion,
+ 'system-name' => $info->{name},
+ };
+
+ # TODO: make debug-level an explicit attribute, it's used in many places!
+ my $kernelParams = $info->{attrs}->{kernel_params} || '';
+ if ($kernelParams =~ m{debug(?:=(\d+))?}) {
+ my $debugLevel = defined $1 ? $1 : '1';
+ $params->{'debug-level'} = $debugLevel;
+ }
+
+ my $makeInitRamFSEngine
+ = OpenSLX::MakeInitRamFS::Engine::SlxBoot->new($params);
+ $makeInitRamFSEngine->execute($self->{'dry-run'});
+
+ # copy back kernel-params, as they might have been changed (by plugins)
+ $info->{attrs}->{kernel_params}
+ = join ' ', $makeInitRamFSEngine->kernelParams();
+
+ return;
+}
+
+1;
diff --git a/src/boot-env/OpenSLX/BootEnvironment/PBS.pm b/src/boot-env/OpenSLX/BootEnvironment/PBS.pm
new file mode 100644
index 00000000..2072884b
--- /dev/null
+++ b/src/boot-env/OpenSLX/BootEnvironment/PBS.pm
@@ -0,0 +1,247 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# BootEnvironment::Preboot.pm
+# - provides general preboot implementation of the BootEnvironment API.
+# -----------------------------------------------------------------------------
+package OpenSLX::BootEnvironment::PBS;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::BootEnvironment::Base);
+
+use OpenSLX::MakeInitRamFS::Engine::PBS;
+
+use Clone qw(clone);
+use File::Basename;
+use File::Path;
+
+use Data::Dumper;
+
+use JSON;
+use HTTP::Request::Common;
+use LWP::UserAgent;
+
+use OpenSLX::Basics;
+use OpenSLX::ConfigDB qw(:support);
+use OpenSLX::Utils;
+
+sub initialize
+{
+ my $self = shift;
+ my $params = shift;
+
+ return if !$self->SUPER::initialize($params);
+
+ $self->{'original-path'} = "$openslxConfig{'public-path'}/pbs";
+ $self->{'target-path'} = "$openslxConfig{'public-path'}/pbs.new";
+
+ $self->{'requires-default-client-config'} = 0;
+ # we do not need a default.tgz since there's always an explicit client
+
+
+ if (!$self->{'dry-run'}) {
+ mkpath([$self->{'original-path'}]);
+ rmtree($self->{'target-path'});
+ mkpath("$self->{'target-path'}/client-config");
+ }
+
+ return 1;
+}
+
+sub writeBootloaderMenuFor
+{
+ my $self = shift;
+ my $client = shift;
+ my $externalClientID = shift;
+ my $systemInfos = shift || [];
+
+ my $prebootSystemInfo
+ = clone($self->_pickSystemWithNewestKernel($systemInfos));
+
+ vlog(
+ 0,
+ _tr(
+ "\nsend preboot information for client '%s' to pbs (%s)\n".
+ " (image templates provided based of %s) ...",
+ $client->{name}, $client->{attrs}->{preboot_server}, $prebootSystemInfo->{name}
+ )
+ );
+
+ $self->_createPrebootStuff($client, $prebootSystemInfo);
+
+ my $kernel = "$self->{'target-path'}/imagebase/vmlinuz";
+ my $initramfs = "$self->{'target-path'}/imagebase/initramfs";
+
+ my $kernel_md5 = qx/md5sum $kernel | awk '{print \$1}'/;
+ my $initramfs_md5 = qx/md5sum $initramfs | awk '{print \$1}'/;
+
+ my $data_json = to_json({
+ 'slxinfo' => qx/slxversion/,
+ 'kernel' => basename($prebootSystemInfo->{'kernel-file'}),
+ 'kernel_md5' => trim($kernel_md5),
+ 'initramfs_md5' => trim($initramfs_md5),
+ 'systems' => $systemInfos
+ });
+ my $ua = LWP::UserAgent->new;
+ my $res = $ua->request(POST 'http://pbs.experimental.openslx.org/backend/system/sync', [data => $data_json]);
+
+ if ($res->is_success) {
+ my $resData = from_json($res->content);
+ if ($resData->{'getKernel'} eq 'fresh') {
+ $res = $ua->request(POST 'http://pbs.experimental.openslx.org/backend/system/addkernel',
+ ['kernel' => basename($prebootSystemInfo->{'kernel-file'}),
+ 'kernelFile' => ["$self->{'target-path'}/imagebase/vmlinuz"],
+ 'initramfsFile' => ["$self->{'target-path'}/imagebase/initramfs"],
+ ],
+ 'Content_Type' => 'form-data'
+ );
+
+ print Dumper($res->content);
+
+ } else {
+ if ($resData->{'getKernel'} eq 'update') {
+ $res = $ua->request(POST 'http://pbs.experimental.openslx.org/backend/system/updatekernel',
+ ['kernel' => basename($prebootSystemInfo->{'kernel-file'}),
+ 'kernelFile' => ["$self->{'target-path'}/imagebase/vmlinuz"],
+ ],
+ 'Content_Type' => 'form-data'
+ );
+
+ print Dumper($res->content);
+ } else {
+ # do nothing
+ }
+ if ($resData->{'getInitramfs'} eq 'update') {
+ $res = $ua->request(POST 'http://pbs.experimental.openslx.org/backend/system/updateinitramfs',
+ ['kernel' => basename($prebootSystemInfo->{'kernel-file'}),
+ 'initramfsFile' => ["$self->{'target-path'}/imagebase/initramfs"],
+ ],
+ 'Content_Type' => 'form-data'
+ );
+
+ print Dumper($res->content);
+ } else {
+ # do nothing
+ }
+ }
+ } else {
+ vlog(0, 'communication with pbs failed.. please check and rerun..');
+ }
+
+ return 1;
+}
+
+sub _createPrebootStuff
+{
+ my $self = shift;
+ my $client = shift;
+ my $info = shift;
+
+ my $prebootClass = instantiateClass(
+ "OpenSLX::BootEnvironment::Preboot::Base"
+ );
+
+ my $imagebase = "$self->{'target-path'}/imagebase";
+
+ $prebootClass->initialize($self);
+ $client->{attrs}->{boot_uri} = $client->{attrs}->{preboot_server};
+ mkpath("$imagebase");
+ $self->_makePBSInitRamFS($info, "$imagebase/initramfs", $client);
+
+ my $kernelFile = $info->{'kernel-file'};
+ my $kernelName = basename($kernelFile);
+ slxsystem(qq{cp -p "$kernelFile" "$imagebase/vmlinuz"})
+ unless $self->{'dry-run'};
+
+ return 1;
+}
+
+sub _pickSystemWithNewestKernel
+{
+ my $self = shift;
+ my $systemInfos = shift;
+
+ my $systemWithNewestKernel;
+ my $newestKernelFileSortKey = '';
+ foreach my $system (@$systemInfos) {
+ next unless $system->{'kernel-file'} =~ m{
+ (?:vmlinuz|x86)-(\d+)\.(\d+)\.(\d+)(?:\.(\d+))?-(\d+(?:\.\d+)?)
+ }x;
+ my $sortKey
+ = sprintf("%02d.%02d.%02d.%02d-%2.1f", $1, $2, $3, $4||0, $5);
+ if ($newestKernelFileSortKey lt $sortKey) {
+ $systemWithNewestKernel = $system;
+ $newestKernelFileSortKey = $sortKey;
+ }
+ }
+
+ if (!defined $systemWithNewestKernel) {
+ die _tr("unable to pick a system to be used for preboot!");
+ }
+ return $systemWithNewestKernel;
+}
+
+sub _makePBSInitRamFS
+{
+ my $self = shift;
+ my $info = shift;
+ my $initramfs = shift;
+ my $client = shift;
+
+ my $vendorOS = $info->{'vendor-os'};
+ my $kernelFile = basename(followLink($info->{'kernel-file'}));
+
+ my $attrs = clone($info->{attrs} || {});
+
+ my $bootURI = $client->{attrs}->{boot_uri};
+ if (!$bootURI) {
+ die _tr("client $client->{name} needs an URI in attribute 'boot_uri' to be used for preboot!");
+ }
+
+ chomp(my $slxVersion = qx{slxversion});
+
+ my $params = {
+ 'attrs' => $attrs,
+ 'export-name' => undef,
+ 'export-uri' => undef,
+ 'initramfs' => $initramfs,
+ 'kernel-params'
+ => [ split ' ', ($info->{attrs}->{kernel_params} || '') ],
+ 'kernel-version' => $kernelFile =~ m[-(.+)$] ? $1 : '',
+ 'plugins' => '',
+ 'root-path'
+ => "$openslxConfig{'private-path'}/stage1/$vendorOS->{name}",
+ 'slx-version' => $slxVersion,
+ 'system-name' => $info->{name},
+ 'preboot-id' => $client->{name},
+ 'boot-uri' => $bootURI,
+ };
+
+ # TODO: make debug-level an explicit attribute, it's used in many places!
+ my $kernelParams = $info->{attrs}->{kernel_params} || '';
+ if ($kernelParams =~ m{debug(?:=(\d+))?}) {
+ my $debugLevel = defined $1 ? $1 : '1';
+ $params->{'debug-level'} = $debugLevel;
+ }
+
+ my $makeInitRamFSEngine
+ = OpenSLX::MakeInitRamFS::Engine::PBS->new($params);
+ $makeInitRamFSEngine->execute($self->{'dry-run'});
+
+ # copy back kernel-params, as they might have been changed (by plugins)
+ $info->{attrs}->{kernel_params}
+ = join ' ', $makeInitRamFSEngine->kernelParams();
+
+ return;
+}
+
+1;
diff --git a/src/boot-env/OpenSLX/BootEnvironment/PXE.pm b/src/boot-env/OpenSLX/BootEnvironment/PXE.pm
new file mode 100644
index 00000000..d46786d0
--- /dev/null
+++ b/src/boot-env/OpenSLX/BootEnvironment/PXE.pm
@@ -0,0 +1,336 @@
+# Copyright (c) 2008..2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# BootEnvironment::PXE.pm
+# - provides PXE-specific implementation of the BootEnvironment API.
+# -----------------------------------------------------------------------------
+package OpenSLX::BootEnvironment::PXE;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::BootEnvironment::Base);
+
+use File::Basename;
+use File::Path;
+# for sha1 passwd encryption
+use Digest::SHA1;
+use MIME::Base64;
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+sub initialize
+{
+ my $self = shift;
+ my $params = shift;
+
+ return if !$self->SUPER::initialize($params);
+
+ $self->{'original-path'} = "$openslxConfig{'public-path'}/tftpboot";
+ $self->{'target-path'} = "$openslxConfig{'public-path'}/tftpboot.new";
+
+ $self->{'requires-default-client-config'} = 1;
+
+ if (!$self->{'dry-run'}) {
+ mkpath([$self->{'original-path'}]);
+ rmtree($self->{'target-path'});
+ mkpath("$self->{'target-path'}/client-config");
+ }
+
+ return 1;
+}
+
+sub writeBootloaderMenuFor
+{
+ my $self = shift;
+ my $client = shift;
+ my $externalClientID = shift;
+ my $systemInfos = shift;
+
+ $self->_prepareBootloaderConfigFolder()
+ unless $self->{preparedBootloaderConfigFolder};
+
+ my $pxePath = $self->{'target-path'};
+ my $pxeConfigPath = "$pxePath/pxelinux.cfg";
+
+ my $pxeConfig = $self->_getTemplate();
+ my $pxeFile = "$pxeConfigPath/$externalClientID";
+ my $clientAppend = $client->{attrs}->{kernel_params_client} || '';
+ my $bootURI = $client->{attrs}->{boot_uri} || '';
+ vlog(1, _tr("writing PXE-file %s", $pxeFile));
+
+ # set label for each system
+ foreach my $info (@$systemInfos) {
+ my $label = $info->{label} || '';
+ if (!length($label) || $label eq $info->{name}) {
+ if ($info->{name} =~ m{^(.+)::(.+)$}) {
+ my $system = $1;
+ my $exportType = $2;
+ $label = $system . ' ' x (40-length($system)) . $exportType;
+ } else {
+ $label = $info->{name};
+ }
+ }
+ $info->{menuLabel} = $label;
+ }
+# if kernel=*xen* then run sub _xenLabel from xen.pm
+ my $slxLabels = '';
+ foreach my $info (sort { $a->{label} cmp $b->{label} } @$systemInfos) {
+ my $vendorOSName = $info->{'vendor-os'}->{name};
+ my $kernelName = basename($info->{'kernel-file'});
+ my $append = $info->{attrs}->{kernel_params};
+ my $pxeLabel = $info->{'external-id'};
+ $pxeLabel =~ s/::/-/g;
+ my $pxePrefix = '';
+ my $tftpPrefix = '';
+ $info->{'pxe_prefix_ip'} ||= '';
+
+ # pxe_prefix_ip set and looks like a ip
+ if ($info->{'pxe_prefix_ip'} =~ m/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/) {
+ $pxePrefix = "$info->{'pxe_prefix_ip'}::";
+ $tftpPrefix = "tftp://$info->{'pxe_prefix_ip'}"
+ if ! length($bootURI);
+ }
+
+ # set default menu entry
+ my $pxeDefault = "";
+ if (defined $openslxConfig{'pxe-default-menu-entry'}) {
+ if ($openslxConfig{'pxe-default-menu-entry'} eq
+ $info->{'external-id'})
+ {
+ $pxeDefault = "\tMENU DEFAULT\n";
+ }
+ }
+ $append .= " initrd=$pxePrefix$vendorOSName/$info->{'initramfs-name'}";
+ $append .= " file=$bootURI" if length($bootURI);
+ $append .= " file=$tftpPrefix" if length($tftpPrefix);
+ $append .= " $clientAppend";
+ $slxLabels .= "LABEL openslx-$pxeLabel\n";
+ $slxLabels .= $pxeDefault;
+ $slxLabels .= "\tMENU LABEL ^$info->{menuLabel}\n";
+ $slxLabels .= "\tKERNEL $pxePrefix$vendorOSName/$kernelName\n";
+ $slxLabels .= "\tAPPEND $append\n";
+ $slxLabels .= "\tIPAPPEND 3\n";
+# if kernel=*xen* then run sub _xenBootEntry from xen.pm
+# if (!defined $xenKernel) {...}
+ my $helpText = $info->{description} || '';
+ if (length($helpText)) {
+ # make sure that text matches the given margin
+ my $menuMargin;
+ while ($pxeConfig =~ m{^\s*MENU MARGIN (\S+?)\s*$}gims) {
+ chomp($menuMargin = $1);
+ }
+ my $margin
+ = defined $menuMargin
+ ? "$menuMargin"
+ : "0";
+ my $marginAsText = ' ' x $margin;
+
+ my $menuWidth;
+ while ($pxeConfig =~ m{^\s*MENU WIDTH (\S+?)\s*$}gims) {
+ chomp($menuWidth = $1);
+ }
+ my $width
+ = defined $menuWidth
+ ? "$menuWidth"
+ : "80";
+ $width = $width - 2* $margin + 2;
+
+ my @atomicHelpText = split(/ /, $helpText);
+ my $lineCounter = 0;
+
+ $helpText = "";
+
+ foreach my $word (@atomicHelpText){
+ if ($lineCounter + length($word) + 1 < $width) {
+ $helpText .= "$word ";
+ $lineCounter += length($word) + 1;
+ } else {
+ my $nobreak = 1;
+ while ($nobreak == 1) {
+ my $pos = index($word,"-");
+ $nobreak = 0;
+ if ($pos != -1) {
+ if ($lineCounter + $pos + 1 < $width) {
+ $helpText .= substr($word, 0, $pos+1);
+ $word = substr($word, $pos + 1, length($word));
+ $nobreak = 1;
+ }
+ }
+ }
+ $helpText .= "\n$word ";
+ $lineCounter = length($word);
+ }
+ }
+
+ $helpText =~ s{^}{$marginAsText}gms;
+ $slxLabels .= "\tTEXT HELP\n";
+ $slxLabels .= "$helpText\n";
+ $slxLabels .= "\tENDTEXT\n";
+ }
+ }
+ # now add the slx-labels (inline or appended) and write the config file
+ if (!($pxeConfig =~ s{\@\@\@SLX_LABELS\@\@\@}{$slxLabels})) {
+ $pxeConfig .= $slxLabels;
+ # fetch PXE-bottom iclude, if exists (overwrite existing definitions)
+ my $pxeBottomFile
+ = "$openslxConfig{'config-path'}/boot-env/syslinux/pxemenu-bottom";
+ if (-e $pxeBottomFile) {
+ $pxeConfig .= "\n# configuration from include $pxeBottomFile\n";
+ $pxeConfig .= slurpFile($pxeBottomFile);
+ }
+ }
+
+ # PXE uses 'cp850' (codepage 850) but our string is in utf-8, we have
+ # to convert in order to avoid showing gibberish on the client side...
+ spitFile($pxeFile, $pxeConfig, { 'io-layer' => 'encoding(cp850)' } )
+ unless $self->{'dry-run'};
+
+ return 1;
+}
+
+sub _getTemplate
+{
+ my $self = shift;
+
+ return $self->{'pxe-template'} if $self->{'pxe-template'};
+
+ my $basePath = $openslxConfig{'base-path'};
+ my $configPath = $openslxConfig{'config-path'};
+ my $pxeTheme = $openslxConfig{'syslinux-theme'};
+
+ my ($sec, $min, $hour, $day, $mon, $year) = (localtime);
+ $mon++;
+ $year += 1900;
+ my $callDate = sprintf('%04d-%02d-%02d', $year, $mon, $day);
+ my $callTime = sprintf('%02d:%02d:%02d', $hour, $min, $sec);
+
+ # generate PXE-Menu
+ my $pxeTemplate =
+ "# generated by slxconfig-demuxer (on $callDate at $callTime)\n";
+ $pxeTemplate .= "\nDEFAULT vesamenu.c32\n";
+ # include static defaults
+ $pxeTemplate .= "\n# static configuration (override with include file)\n";
+ $pxeTemplate .= "NOESCAPE 0\n";
+ $pxeTemplate .= "PROMPT 0\n";
+
+ # first check for theme
+ # let user stuff in config path win over our stuff in base path
+ my $pxeThemePath;
+ my $pxeThemeInConfig
+ = "$configPath/boot-env/syslinux/themes/${pxeTheme}";
+ my $pxeThemeInBase
+ = "$basePath/share/boot-env/syslinux/themes/${pxeTheme}";
+ if (-e "$pxeThemeInConfig/theme.conf") {
+ $pxeThemePath = $pxeThemeInConfig;
+ }
+ else {
+ if (-e "$pxeThemeInBase/theme.conf") {
+ $pxeThemePath = $pxeThemeInBase;
+ }
+ }
+ # include theme specific stuff
+ if (defined $pxeThemePath) {
+ $pxeTemplate .= "\n# theme specific configuration from $pxeThemePath\n";
+ $pxeTemplate .= slurpFile("$pxeThemePath/theme.conf");
+ }
+
+ # copy background picture if exists
+ my $pic;
+ if (defined $pxeTheme) {
+ while ($pxeTemplate =~ m{^\s*MENU BACKGROUND (\S+?)\s*$}gims) {
+ chomp($pic = $1);
+ }
+ }
+ if (defined $pic) {
+ my $pxeBackground = "$pxeThemePath/$pic";
+ if (-e $pxeBackground && !$self->{'dry-run'}) {
+ slxsystem(qq[cp "$pxeBackground" $self->{'target-path'}/]);
+ }
+ }
+
+ # include slxsettings
+ $pxeTemplate .= "\n# slxsettings configuration\n";
+ $pxeTemplate .= "TIMEOUT $openslxConfig{'pxe-timeout'}\n" || "";
+ $pxeTemplate .= "TOTALTIMEOUT $openslxConfig{'pxe-totaltimeout'}\n" || "";
+ my $sha1pass = $self->_sha1pass($openslxConfig{'pxe-passwd'});
+ $pxeTemplate .= "MENU MASTER PASSWD $sha1pass\n" || "";
+ $pxeTemplate .= "MENU TITLE $openslxConfig{'pxe-title'}\n" || "";
+
+ # fetch PXE-include, if exists (overwrite existing definitions)
+ my $pxeIncludeFile
+ = "$openslxConfig{'config-path'}/boot-env/syslinux/pxemenu-include";
+ if (-e $pxeIncludeFile) {
+ $pxeTemplate .= "\n# configuration from include $pxeIncludeFile\n";
+ $pxeTemplate .= slurpFile($pxeIncludeFile);
+ }
+
+ $pxeTemplate .= "\n# slxsystems:\n";
+ $self->{'pxe-template'} = $pxeTemplate;
+
+ return $pxeTemplate;
+}
+
+sub _prepareBootloaderConfigFolder
+{
+ my $self = shift;
+
+ my $basePath = $openslxConfig{'base-path'};
+ my $pxePath = $self->{'target-path'};
+ my $pxeConfigPath = "$pxePath/pxelinux.cfg";
+
+ if (!$self->{'dry-run'}) {
+ rmtree($pxeConfigPath);
+ mkpath($pxeConfigPath);
+
+ for my $file ('pxelinux.0', 'pxechain.com', 'vesamenu.c32',
+ 'mboot.c32', 'kernel-shutdown', 'initramfs-shutdown') {
+ if (!-e "$pxePath/$file") {
+ slxsystem(
+ qq[cp -p "$basePath/share/boot-env/syslinux/$file" $pxePath/]
+ );
+ }
+ }
+ }
+
+ $self->{preparedBootloaderConfigFolder} = 1;
+
+ return 1;
+}
+
+# from syslinux 3.73: http://syslinux.zytor.com
+sub _random_bytes
+{
+ my $self = shift;
+ my $n = shift;
+ my($v, $i);
+
+ # using perl rand because of problems with encoding(cp850) and 'bytes'
+ srand($$ ^ time);
+ $v = '';
+ for ( $i = 0 ; $i < $n ; $i++ ) {
+ $v .= ord(int(rand() * 256));
+ }
+
+ return $v;
+}
+
+sub _sha1pass
+{
+ my $self = shift;
+ my $pass = shift;
+ my $salt = shift || MIME::Base64::encode($self->_random_bytes(6), '');
+ $pass = Digest::SHA1::sha1_base64($salt, $pass);
+
+ return sprintf('$4$%s$%s$', $salt, $pass);
+}
+
+1;
diff --git a/src/boot-env/OpenSLX/BootEnvironment/Preboot.pm b/src/boot-env/OpenSLX/BootEnvironment/Preboot.pm
new file mode 100644
index 00000000..b06de7d2
--- /dev/null
+++ b/src/boot-env/OpenSLX/BootEnvironment/Preboot.pm
@@ -0,0 +1,209 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# BootEnvironment::Preboot.pm
+# - provides general preboot implementation of the BootEnvironment API.
+# -----------------------------------------------------------------------------
+package OpenSLX::BootEnvironment::Preboot;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::BootEnvironment::Base);
+
+use Clone qw(clone);
+use File::Basename;
+use File::Path;
+
+use OpenSLX::Basics;
+use OpenSLX::ConfigDB qw(:support);
+use OpenSLX::Utils;
+
+sub initialize
+{
+ my $self = shift;
+ my $params = shift;
+
+ return if !$self->SUPER::initialize($params);
+
+ $self->{'original-path'} = "$openslxConfig{'public-path'}/preboot";
+ $self->{'target-path'} = "$openslxConfig{'public-path'}/preboot.new";
+
+ $self->{'requires-default-client-config'} = 0;
+ # we do not need a default.tgz since there's always an explicit client
+
+ if (!$self->{'dry-run'}) {
+ mkpath([$self->{'original-path'}]);
+ rmtree($self->{'target-path'});
+ mkpath("$self->{'target-path'}/client-config");
+ }
+
+ return 1;
+}
+
+sub writeBootloaderMenuFor
+{
+ my $self = shift;
+ my $client = shift;
+ my $externalClientID = shift;
+ my $systemInfos = shift || [];
+
+ $self->_prepareBootloaderConfigFolder()
+ unless $self->{preparedBootloaderConfigFolder};
+
+ my $prebootSystemInfo
+ = clone($self->_pickSystemWithNewestKernel($systemInfos));
+
+ $self->_createImages($client, $prebootSystemInfo);
+
+ my $externalClientName = externalConfigNameForClient($client);
+ my $bootloaderPath = "$self->{'target-path'}/bootloader";
+ my $bootloaderConfigPath = "$bootloaderPath/$externalClientName";
+ mkpath($bootloaderConfigPath) unless $self->{'dry-run'};
+ my $menuFile = "$bootloaderConfigPath/bootmenu.dialog";
+
+ my $clientAppend = $client->{attrs}->{kernel_params_client} || '';
+ vlog(1, _tr("writing bootmenu %s", $menuFile));
+
+ # set label for each system
+ foreach my $info (@$systemInfos) {
+ my $label = $info->{label} || '';
+ if (!length($label) || $label eq $info->{name}) {
+ $label = $info->{name};
+ }
+ $info->{label} = $label;
+ }
+ my $bootmenuEntries = '';
+ my $entryState = 'on';
+ my $counter = 1;
+ foreach my $info (sort { $a->{label} cmp $b->{label} } @$systemInfos) {
+ my $vendorOSName = $info->{'vendor-os'}->{name};
+ my $kernelName = basename($info->{'kernel-file'});
+ my $append = $info->{attrs}->{kernel_params} || '';
+ $append .= " $clientAppend";
+ $bootmenuEntries .= qq{ "$counter" "$info->{label}" };
+ $entryState = 'off';
+
+ # create a file containing the boot-configuration for this system
+ my $systemDescr = unshiftHereDoc(<<" End-of-Here");
+ label="$info->{label}"
+ kernel="$vendorOSName/$kernelName"
+ initramfs="$vendorOSName/$info->{'initramfs-name'}"
+ append="$append"
+ End-of-Here
+ my $systemFile = "$bootloaderConfigPath/$info->{name}";
+ spitFile(
+ $systemFile, $systemDescr, { 'io-layer' => 'encoding(iso8859-1)' }
+ ) unless $self->{'dry-run'};
+ slxsystem(qq{ln -sf $info->{name} $bootloaderConfigPath/$counter});
+ $counter++;
+ }
+
+ my $entryCount = @$systemInfos;
+ my $bootmenu = unshiftHereDoc(<<" End-of-Here");
+ --no-cancel --menu "OpenSLX Boot Menu" 20 65 $entryCount $bootmenuEntries
+ End-of-Here
+
+ if (!$self->{'dry-run'}) {
+ # default to iso encoding, let's see how uclibc copes with it ...
+ spitFile($menuFile, $bootmenu, { 'io-layer' => 'encoding(iso8859-1)' });
+
+ # copy the preboot script into the folder to be tared
+ my $prebootBasePath
+ = "$openslxConfig{'base-path'}/share/boot-env/preboot";
+ slxsystem(qq{cp $prebootBasePath/preboot.sh $bootloaderConfigPath/});
+ slxsystem(qq{cp -r $prebootBasePath/preboot-scripts $bootloaderConfigPath/});
+ slxsystem(qq{chmod a+x $bootloaderConfigPath/preboot.sh});
+
+ # create a tar which can/will be downloaded by prebooting clients
+ my $tarCMD
+ = qq{cd $bootloaderConfigPath; tar -czf "${bootloaderConfigPath}.env" *};
+ slxsystem($tarCMD);
+ rmtree($bootloaderConfigPath);
+ }
+
+ return 1;
+}
+
+sub _createImages
+{
+ my $self = shift;
+ my $client = shift;
+ my $info = shift;
+
+ my %mediaMap = (
+ 'cd' => 'CD',
+ );
+ my $prebootMedia = $client->{attrs}->{preboot_media} || '';
+ if (!$prebootMedia) {
+ warn _tr(
+ "no preboot-media defined for client %s, no images will be generated!",
+ $client->{name}
+ );
+ return 0;
+ }
+ foreach my $mediumName (split m{, }, $prebootMedia) {
+ my $moduleName = $mediaMap{$mediumName}
+ or die _tr(
+ "'%s' is not one of the supported preboot-medias (cd)",
+ $mediumName
+ );
+
+ my $prebootMedium = instantiateClass(
+ "OpenSLX::BootEnvironment::Preboot::$moduleName"
+ );
+ $prebootMedium->initialize($self);
+ $prebootMedium->createImage($client, $info);
+ }
+
+ return 1;
+}
+
+sub _prepareBootloaderConfigFolder
+{
+ my $self = shift;
+
+ my $bootloaderPath = "$self->{'target-path'}/bootloader";
+ if (!$self->{'dry-run'}) {
+ rmtree($bootloaderPath);
+ mkpath($bootloaderPath);
+ }
+
+ $self->{preparedBootloaderConfigFolder} = 1;
+
+ return 1;
+}
+
+sub _pickSystemWithNewestKernel
+{
+ my $self = shift;
+ my $systemInfos = shift;
+
+ my $systemWithNewestKernel;
+ my $newestKernelFileSortKey = '';
+ foreach my $system (@$systemInfos) {
+ next unless $system->{'kernel-file'} =~ m{
+ (?:vmlinuz|x86)-(\d+)\.(\d+)\.(\d+)(?:\.(\d+))?-(\d+(?:\.\d+)?)
+ }x;
+ my $sortKey
+ = sprintf("%02d.%02d.%02d.%02d-%2.1f", $1, $2, $3, $4||0, $5);
+ if ($newestKernelFileSortKey lt $sortKey) {
+ $systemWithNewestKernel = $system;
+ $newestKernelFileSortKey = $sortKey;
+ }
+ }
+
+ if (!defined $systemWithNewestKernel) {
+ die _tr("unable to pick a system to be used for preboot!");
+ }
+ return $systemWithNewestKernel;
+}
+
+1;
diff --git a/src/boot-env/OpenSLX/BootEnvironment/Preboot/Base.pm b/src/boot-env/OpenSLX/BootEnvironment/Preboot/Base.pm
new file mode 100644
index 00000000..89f0e07e
--- /dev/null
+++ b/src/boot-env/OpenSLX/BootEnvironment/Preboot/Base.pm
@@ -0,0 +1,111 @@
+# Copyright (c) 2008-2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# BootEnvironment::Preboot::Base.pm
+# - base of the Preboot-BootEnvironment API.
+# -----------------------------------------------------------------------------
+package OpenSLX::BootEnvironment::Preboot::Base;
+
+use strict;
+use warnings;
+
+use File::Basename;
+
+use Clone qw(clone);
+
+use OpenSLX::Basics;
+use OpenSLX::MakeInitRamFS::Engine::Preboot;
+use OpenSLX::Utils;
+
+sub new
+{
+ my $class = shift;
+
+ my $self = {};
+
+ return bless $self, $class;
+}
+
+sub initialize
+{
+ my $self = shift;
+ my $params = shift;
+
+ $self->{'dry-run'} = $params->{'dry-run'};
+
+ return 1;
+}
+
+sub makePrebootInitRamFS
+{
+ my $self = shift;
+ my $info = shift;
+ my $initramfs = shift;
+ my $client = shift;
+
+ my $vendorOS = $info->{'vendor-os'};
+ my $kernelFile = basename(followLink($info->{'kernel-file'}));
+
+ my $attrs = clone($info->{attrs} || {});
+
+ my $bootURI = $client->{attrs}->{boot_uri};
+ if (!$bootURI) {
+ die _tr("client $client->{name} needs an URI in attribute 'boot_uri' to be used for preboot!");
+ }
+
+ chomp(my $slxVersion = qx{slxversion});
+
+ my $params = {
+ 'attrs' => $attrs,
+ 'export-name' => undef,
+ 'export-uri' => undef,
+ 'initramfs' => $initramfs,
+ 'kernel-params'
+ => [ split ' ', ($info->{attrs}->{kernel_params} || '') ],
+ 'kernel-version' => $kernelFile =~ m[-(.+)$] ? $1 : '',
+ 'plugins' => '',
+ 'root-path'
+ => "$openslxConfig{'private-path'}/stage1/$vendorOS->{name}",
+ 'slx-version' => $slxVersion,
+ 'system-name' => $info->{name},
+ 'preboot-id' => $client->{name},
+ 'boot-uri' => $bootURI,
+ };
+
+ # TODO: make debug-level an explicit attribute, it's used in many places!
+ my $kernelParams = $info->{attrs}->{kernel_params} || '';
+ if ($kernelParams =~ m{debug(?:=(\d+))?}) {
+ my $debugLevel = defined $1 ? $1 : '1';
+ $params->{'debug-level'} = $debugLevel;
+ }
+
+ my $makeInitRamFSEngine
+ = OpenSLX::MakeInitRamFS::Engine::Preboot->new($params);
+ $makeInitRamFSEngine->execute($self->{'dry-run'});
+
+ # copy back kernel-params, as they might have been changed (by plugins)
+ $info->{attrs}->{kernel_params}
+ = join ' ', $makeInitRamFSEngine->kernelParams();
+
+ return;
+}
+
+sub createImage
+{
+ my $self = shift;
+ my $client = shift;
+ my $info = shift;
+
+ # override in subclasses!
+
+ return 1;
+}
+
+1;
diff --git a/src/boot-env/OpenSLX/BootEnvironment/Preboot/CD.pm b/src/boot-env/OpenSLX/BootEnvironment/Preboot/CD.pm
new file mode 100644
index 00000000..a6c36cd7
--- /dev/null
+++ b/src/boot-env/OpenSLX/BootEnvironment/Preboot/CD.pm
@@ -0,0 +1,155 @@
+# Copyright (c) 2008-2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# BootEnvironment::Preboot::CD.pm
+# - provides CD-specific implementation of the Preboot-BootEnvironment API.
+# -----------------------------------------------------------------------------
+package OpenSLX::BootEnvironment::Preboot::CD;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::BootEnvironment::Preboot::Base);
+
+use File::Basename;
+use File::Path;
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+sub createImage
+{
+ my $self = shift;
+ my $client = shift;
+ my $info = shift;
+
+ vlog(
+ 0,
+ _tr(
+ "\ncreating CD-image for client %s (based on %s) ...",
+ $client->{name}, $info->{name}
+ )
+ );
+
+ my $imageDir = "$openslxConfig{'public-path'}/images/$client->{name}/cd";
+ my $isoDir = "$imageDir/iso/isolinux";
+ mkpath($isoDir) unless $self->{'dry-run'};
+
+ # copy static data
+ my $dataDir = "$openslxConfig{'base-path'}/share/boot-env/syslinux";
+ for my $file ('LICENSE', 'README.iso', 'vesamenu.c32', 'isolinux.bin') {
+ if (!-e "$isoDir/$file") {
+ slxsystem(
+ qq[cp -p "$dataDir/$file" "$isoDir/"]
+ )
+ unless $self->{'dry-run'};
+ }
+ }
+
+ # copy kernel (take the one from the given system info)
+ my $kernelFile = $info->{'kernel-file'};
+ my $kernelName = basename($kernelFile);
+ slxsystem(qq{cp -p "$kernelFile" "$isoDir/vmlinuz"})
+ unless $self->{'dry-run'};
+
+ # create initramfs
+ my $initramfsName = qq{"$isoDir/initramfs"};
+ $self->makePrebootInitRamFS($info, $initramfsName, $client);
+
+ # write trivial isolinux config
+ # include static defaults
+ my $isolinuxConfig = "DEFAULT vesamenu.c32\n";
+ $isolinuxConfig .= "PROMPT 0\n";
+ $isolinuxConfig .= "TIMEOUT 100\n";
+
+ # theme stuff
+ my $basePath = $openslxConfig{'base-path'};
+ my $configPath = $openslxConfig{'config-path'};
+ my $isoTheme = $openslxConfig{'syslinux-theme'};
+
+ my $isoThemePath;
+ my $isoThemeInConfig
+ = "$configPath/boot-env/syslinux/themes/${isoTheme}";
+ my $isoThemeInBase
+ = "$basePath/share/boot-env/syslinux/themes/${isoTheme}";
+ if (-e "$isoThemeInConfig/theme.conf") {
+ $isoThemePath = $isoThemeInConfig;
+ }
+ else {
+ if (-e "$isoThemeInBase/theme.conf") {
+ $isoThemePath = $isoThemeInBase;
+ }
+ }
+ # include theme specific stuff
+ if (defined $isoThemePath) {
+ $isolinuxConfig .= slurpFile("$isoThemePath/theme.conf");
+ }
+
+ # copy background picture if exists
+ my $pic;
+ if (defined $isoTheme) {
+ while ($isolinuxConfig =~ m{^\s*MENU BACKGROUND (\S+?)\s*$}gims) {
+ chomp($pic = $1);
+ }
+ }
+ if (defined $pic) {
+ my $isoBackground = "$isoThemePath/$pic";
+ if (-e $isoBackground && !$self->{'dry-run'}) {
+ slxsystem(qq[cp "$isoBackground" "$isoDir/"]);
+ }
+ }
+
+ # write trivial isolinux config
+ $isolinuxConfig .= unshiftHereDoc(<<" End-of-Here");
+ MENU TITLE Welcome to OpenSLX PreBoot ISO/CD (Mini Linux/Kexec)
+ LABEL SLXSTDBOOT
+ MENU LABEL OpenSLX PreBoot - Stateless Netboot Linux ...
+ MENU DEFAULT
+ KERNEL vmlinuz
+ APPEND initrd=initramfs vga=0x317
+ TEXT HELP
+ Use this (default) entry if you have configured your client.
+ You have chance to edit the kernel commandline by hitting
+ the TAB key (e.g. for adding debug=3 to it for bug hunting).
+ ENDTEXT
+ LABEL LOCALBOOT
+ MENU LABEL Boot locally (skip OpenSLX PreBoot) ...
+ LOCALBOOT -1
+ TEXT HELP
+ Gets you out of here by booting from next device in BIOS
+ boot order.
+ ENDTEXT
+ End-of-Here
+ spitFile("$isoDir/isolinux.cfg", $isolinuxConfig);
+
+ my $mkisoCmd = unshiftHereDoc(<<" End-of-Here");
+ mkisofs
+ -o "$imageDir/../$client->{name}.iso"
+ -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4
+ -r -J -l -boot-info-table -joliet-long
+ -publisher "OpenSLX Project - http://www.openslx.org"
+ -p "OpenSLX Project - openslx-devel\@openslx.org"
+ -V "OpenSLX BootISO"
+ -volset "OpenSLX Project - PreBoot ISO/CD for non PXE/TFTP start of a Linux Stateless Client"
+ -c isolinux/boot.cat "$imageDir/iso"
+ End-of-Here
+ $mkisoCmd =~ s{\n\s*}{ }gms;
+ my $logFile = "$imageDir/../$client->{name}.iso.log";
+ if (slxsystem(qq{$mkisoCmd 2>"$logFile"})) {
+ my $log = slurpFile($logFile);
+ die _tr("unable to create ISO-image - log follows:\n%s", $log);
+ }
+
+ rmtree($imageDir);
+
+ return 1;
+}
+
+1;
diff --git a/src/boot-env/OpenSLX/MakeInitRamFS/Distro/Base.pm b/src/boot-env/OpenSLX/MakeInitRamFS/Distro/Base.pm
new file mode 100644
index 00000000..9be218e8
--- /dev/null
+++ b/src/boot-env/OpenSLX/MakeInitRamFS/Distro/Base.pm
@@ -0,0 +1,48 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# MakeInitRamFS::Distro::Base.pm
+# - provides empty base of the distro-specific part of the OpenSLX
+# MakeInitRamFS API.
+# -----------------------------------------------------------------------------
+package OpenSLX::MakeInitRamFS::Distro::Base;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+use OpenSLX::Basics;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {
+ 'base-name' => 'base',
+ };
+ return bless $self, $class;
+}
+
+sub applyChanges
+{
+}
+
+sub determineMatchingHwinfoVersion
+{
+ my $self = shift;
+ my $distroVersion = shift;
+
+ return '15.3';
+}
+
+1;
diff --git a/src/boot-env/OpenSLX/MakeInitRamFS/Distro/Debian.pm b/src/boot-env/OpenSLX/MakeInitRamFS/Distro/Debian.pm
new file mode 100644
index 00000000..7174474d
--- /dev/null
+++ b/src/boot-env/OpenSLX/MakeInitRamFS/Distro/Debian.pm
@@ -0,0 +1,61 @@
+# Copyright (c) 2006..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# MakeInitRamFS::Distro::Debian.pm
+# - provides Debian-specific overrides of the MakeInitRamFS::Distro API.
+# -----------------------------------------------------------------------------
+package OpenSLX::MakeInitRamFS::Distro::Debian;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::MakeInitRamFS::Distro::Base);
+
+use OpenSLX::Basics;
+
+################################################################################
+### implementation
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {
+ 'base-name' => 'debian',
+ };
+ return bless $self, $class;
+}
+
+sub applyChanges
+{
+ my $self = shift;
+ my $engine = shift;
+
+ $engine->_addFilteredKernelModules( qw( af_packet hid hid-bright unix ));
+
+ return;
+}
+
+sub determineMatchingHwinfoVersion
+{
+ my $self = shift;
+ my $distroVersion = shift;
+
+ # to be checked
+ my %versionMap = (
+ '3.0' => '13.11',
+ '4.0' => '14.19',
+ '5.0' => '15.3',
+ '6.0' => '16.0',
+ );
+ return $versionMap{$distroVersion}
+ || $self->SUPER::determineMatchingHwinfoVersion($distroVersion);
+}
+
+1;
diff --git a/src/boot-env/OpenSLX/MakeInitRamFS/Distro/Scilin.pm b/src/boot-env/OpenSLX/MakeInitRamFS/Distro/Scilin.pm
new file mode 100644
index 00000000..f2372f8f
--- /dev/null
+++ b/src/boot-env/OpenSLX/MakeInitRamFS/Distro/Scilin.pm
@@ -0,0 +1,61 @@
+# Copyright (c) 2009..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# MakeInitRamFS::Distro::Scilin.pm
+# - provides Scientific Linux specific overrides of the
+# MakeInitRamFS::Distro API.
+# -----------------------------------------------------------------------------
+package OpenSLX::MakeInitRamFS::Distro::Scilin;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::MakeInitRamFS::Distro::Base);
+
+use OpenSLX::Basics;
+
+################################################################################
+### implementation
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {
+ 'base-name' => 'scilin',
+ };
+ return bless $self, $class;
+}
+
+sub applyChanges
+{
+ my $self = shift;
+ my $engine = shift;
+ # filter modules which are part of the main kernel already
+ $engine->_addFilteredKernelModules( qw( af_packet hid hid-bright usbhid unix vesafb fbcon ));
+
+ return;
+}
+
+sub determineMatchingHwinfoVersion
+{
+ my $self = shift;
+ my $distroVersion = shift;
+
+ my %versionMap = (
+ '4.7' => '13.11',
+ '5.3' => '15.3',
+ '5.4' => '15.21',
+ '5.5' => '16.0',
+ );
+ return $versionMap{$distroVersion}
+ || $self->SUPER::determineMatchingHwinfoVersion($distroVersion);
+}
+
+1;
diff --git a/src/boot-env/OpenSLX/MakeInitRamFS/Distro/Suse.pm b/src/boot-env/OpenSLX/MakeInitRamFS/Distro/Suse.pm
new file mode 100644
index 00000000..cb106924
--- /dev/null
+++ b/src/boot-env/OpenSLX/MakeInitRamFS/Distro/Suse.pm
@@ -0,0 +1,62 @@
+# Copyright (c) 2006..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# MakeInitRamFS::Distro::SUSE.pm
+# - provides SUSE-specific overrides of the MakeInitRamFS::Distro API.
+# -----------------------------------------------------------------------------
+package OpenSLX::MakeInitRamFS::Distro::Suse;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::MakeInitRamFS::Distro::Base);
+
+use OpenSLX::Basics;
+
+################################################################################
+### implementation
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {
+ 'base-name' => 'suse',
+ };
+ return bless $self, $class;
+}
+
+sub applyChanges
+{
+ my $self = shift;
+ my $engine = shift;
+
+ $engine->_addFilteredKernelModules( qw( hid hid-bright unix vesafb fbcon ));
+
+ return;
+}
+
+sub determineMatchingHwinfoVersion
+{
+ my $self = shift;
+ my $distroVersion = shift;
+
+ my %versionMap = (
+ '10.2' => '13.11',
+ '10.3' => '14.19',
+ '11.0' => '15.3',
+ '11.1' => '15.21',
+ '11.2' => '16.0',
+ '11.3' => '16.0'
+ );
+ return $versionMap{$distroVersion}
+ || $self->SUPER::determineMatchingHwinfoVersion($distroVersion);
+}
+
+1;
diff --git a/src/boot-env/OpenSLX/MakeInitRamFS/Distro/Ubuntu.pm b/src/boot-env/OpenSLX/MakeInitRamFS/Distro/Ubuntu.pm
new file mode 100644
index 00000000..2c59bbae
--- /dev/null
+++ b/src/boot-env/OpenSLX/MakeInitRamFS/Distro/Ubuntu.pm
@@ -0,0 +1,73 @@
+ # Copyright (c) 2006..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# MakeInitRamFS::Distro::Ubuntu.pm
+# - provides Ubuntu-specific overrides of the MakeInitRamFS::Distro API.
+# -----------------------------------------------------------------------------
+package OpenSLX::MakeInitRamFS::Distro::Ubuntu;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::MakeInitRamFS::Distro::Base);
+
+use OpenSLX::Basics;
+
+################################################################################
+### implementation
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {
+ 'base-name' => 'ubuntu',
+ };
+ return bless $self, $class;
+}
+
+# filter out modules not present (e.g. because compiled into the kernel)
+sub applyChanges
+{
+ my $self = shift;
+ my $engine = shift;
+
+ #if ($engine->{'distro-name'} =~ m{-([^-]+)$}) {
+ # my $distroVersion = 0.0 + $1;
+ # if ($distroVersion <= 8.10) {
+ # $engine->_addFilteredKernelModules( qw( unix hid-bright ));
+ # }
+ # else {
+ # $engine->_addFilteredKernelModules( qw( unix hid-bright af_packet uhci-hcd ohci-hcd ));
+ # }
+ #}
+ $engine->_addFilteredKernelModules( qw( unix hid-bright af_packet uhci-hcd ohci-hcd ));
+
+ return;
+}
+
+sub determineMatchingHwinfoVersion
+{
+ my $self = shift;
+ my $distroVersion = shift;
+
+ # Please check, if correct
+ my %versionMap = (
+ '7.10' => '14.19',
+ '8.04' => '15.3',
+ '8.10' => '15.21',
+ '9.04' => '15.21',
+ '9.10' => '16.0',
+ '10.04' => '16.0',
+ );
+ return $versionMap{$distroVersion}
+ || $self->SUPER::determineMatchingHwinfoVersion($distroVersion);
+}
+
+1;
diff --git a/src/boot-env/OpenSLX/MakeInitRamFS/Distro/Ubuntu_9.pm b/src/boot-env/OpenSLX/MakeInitRamFS/Distro/Ubuntu_9.pm
new file mode 100644
index 00000000..b0087253
--- /dev/null
+++ b/src/boot-env/OpenSLX/MakeInitRamFS/Distro/Ubuntu_9.pm
@@ -0,0 +1,38 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# MakeInitRamFS::Distro::Ubuntu_9.pm
+# - provides Ubuntu-9.X-specific overrides of the MakeInitRamFS::Distro API.
+# -----------------------------------------------------------------------------
+package OpenSLX::MakeInitRamFS::Distro::Ubuntu_9;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::MakeInitRamFS::Distro::Ubuntu);
+
+use OpenSLX::Basics;
+
+################################################################################
+### implementation
+################################################################################
+sub applyChanges
+{
+ my $self = shift;
+ my $engine = shift;
+
+ $engine->_addFilteredKernelModules(
+ qw( af_packet unix hid uhci-hcd ohci-hcd )
+ );
+
+ return;
+}
+
+1;
diff --git a/src/boot-env/OpenSLX/MakeInitRamFS/Engine/Base.pm b/src/boot-env/OpenSLX/MakeInitRamFS/Engine/Base.pm
new file mode 100644
index 00000000..b09543dc
--- /dev/null
+++ b/src/boot-env/OpenSLX/MakeInitRamFS/Engine/Base.pm
@@ -0,0 +1,453 @@
+# Copyright (c) 2006..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# MakeInitialRamFS::Engine::Base.pm
+# - provides basic driver engine for MakeInitialRamFS API.
+# -----------------------------------------------------------------------------
+package OpenSLX::MakeInitRamFS::Engine::Base;
+
+use strict;
+use warnings;
+use Switch;
+
+use File::Basename;
+use POSIX qw(strftime);
+
+use OpenSLX::Basics;
+use OpenSLX::LibScanner;
+use OpenSLX::OSPlugin::Roster;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $params = shift || {};
+
+ checkParams($params, {
+ 'attrs' => '!',
+ 'debug-level' => '?',
+ 'export-name' => '!',
+ 'export-uri' => '!',
+ 'initramfs' => '!',
+ 'kernel-params' => '!',
+ 'kernel-version' => '!',
+ 'plugins' => '!',
+ 'root-path' => '!',
+ 'slx-version' => '!',
+ 'system-name' => '!',
+ 'preboot-id' => '?',
+ 'boot-uri' => '?',
+ } );
+
+ my $self = $params;
+
+ $self->{'system-name'} =~ m{^([^\-]+)-([^:\-]+)}
+ or die "unable to extract distro-info from $self->{'system-name'}!";
+
+ $self->{'distro-name'} = lc($1);
+ $self->{'distro-ver'} = $2;
+
+ my $fullDistroName = lc($1) . '-' . $2;
+
+ $self->{distro} = loadDistroModule({
+ distroName => $fullDistroName,
+ distroScope => 'OpenSLX::MakeInitRamFS::Distro',
+ });
+ if (!$self->{distro}) {
+ die _tr(
+ 'unable to load any MakeInitRamFS::Distro module for system %s!',
+ $self->{'system-name'}
+ );
+ }
+
+ $self->{'lib-scanner'}
+ = OpenSLX::LibScanner->new({ 'root-path' => $self->{'root-path'} });
+
+ $self->{'suggested-kernel-modules'} = [];
+ $self->{'filtered-kernel-modules'} = [];
+
+ return bless $self, $class;
+}
+
+sub execute
+{
+ my $self = shift;
+ my $dryRun = shift;
+
+ $self->_collectCMDs();
+
+ vlog(1, _tr("creating initramfs '%s' ...", $self->{'initramfs'}));
+ $self->_executeCMDs() unless $dryRun;
+
+ return;
+}
+
+sub haveKernelParam
+{
+ my $self = shift;
+ my $param = shift;
+
+ return ref $param eq 'Regexp'
+ ? grep { $_ =~ $param } @{ $self->{'kernel-params'} }
+ : grep { $_ eq $param } @{ $self->{'kernel-params'} };
+}
+
+sub addKernelParams
+{
+ my $self = shift;
+
+ push @{ $self->{'kernel-params'} }, @_;
+
+ return;
+}
+
+sub kernelParams
+{
+ my $self = shift;
+
+ return @{ $self->{'kernel-params'} };
+}
+
+sub addKernelModules
+{
+ my $self = shift;
+
+ push @{ $self->{'suggested-kernel-modules'} }, @_;
+
+ return;
+}
+
+################################################################################
+### implementation methods
+################################################################################
+sub _executeCMDs
+{
+ my $self = shift;
+
+ foreach my $cmd (@{$self->{CMDs}}) {
+ if (ref($cmd) eq 'HASH') {
+ vlog(3, "writing $cmd->{file}");
+ my $flags = defined $cmd->{mode} ? { mode => $cmd->{mode} } : undef;
+ spitFile($cmd->{file}, $cmd->{content}, $flags);
+ }
+ else {
+ vlog(3, "executing: $cmd");
+ if (slxsystem($cmd)) {
+ die _tr(
+ "unable to execute shell-cmd\n\t%s", $cmd
+ );
+ }
+ }
+ }
+
+ return;
+}
+
+sub addCMD
+{
+ my $self = shift;
+ my $cmd = shift;
+
+ push @{$self->{CMDs}}, $cmd;
+
+ return;
+}
+
+sub _findBinary
+{
+ my $self = shift;
+ my $binary = shift;
+
+ my @binDirs = qw(
+ bin sbin usr/bin usr/sbin usr/local/bin usr/local/sbin usr/bin/X11
+ );
+ foreach my $binDir (@binDirs) {
+ my $binPath = "$self->{'root-path'}/$binDir/$binary";
+ return $binPath if -f $binPath && -x $binPath;
+ }
+
+ return;
+}
+
+sub _addFilteredKernelModules
+{
+ my $self = shift;
+
+ push @{ $self->{'filtered-kernel-modules'} }, @_;
+
+ return;
+}
+
+sub _copyKernelModules
+{
+ my $self = shift;
+
+ # read modules.dep and use it to determine module dependencies
+ my $sourcePath = "$self->{'root-path'}/lib/modules/$self->{'kernel-version'}";
+ my @modulesDep = slurpFile("$sourcePath/modules.dep")
+ or die _tr('unable to open %s!', "$sourcePath/modules.dep");
+ my (%dependentModules, %modulePath, %modulesToBeCopied);
+ foreach my $modulesDep (@modulesDep) {
+ next if $modulesDep !~ m{^(.+?)/([^/]+)\.ko:\s*(.*?)\s*$};
+ my $path = $1;
+ if (substr($path, 0, 5) ne '/lib/') {
+ # some distros (e.g. ubuntu-9) use a local path instead of an
+ # absolute path, we need to make it absolute:
+ $path = "/lib/modules/$self->{'kernel-version'}/$path";
+ }
+ my $module = $2;
+ my $dependentsList = $3;
+ my $fullModulePath = "$path/$module.ko";
+ $modulePath{$module} = [] if !exists $modulePath{$module};
+ push @{$modulePath{$module}}, $fullModulePath;
+ $dependentModules{$fullModulePath} = [
+ map {
+ if (substr($_, 0, 5) ne '/lib/') {
+ # some distros (e.g. ubuntu-9) use a local path instead of an
+ # absolute path, we need to make it absolute:
+ $_ = "/lib/modules/$self->{'kernel-version'}/$_";
+ }
+ $_;
+ }
+ split ' ', $dependentsList
+ ];
+ }
+
+ my $targetPath
+ = "$self->{'build-path'}/lib/modules/$self->{'kernel-version'}";
+ $self->addCMD("mkdir -p $targetPath");
+ $self->addCMD("cp -p $sourcePath/modules.* $targetPath/");
+
+ # add a couple of kernel modules that we expect to be used in stage3
+ # (some of these modules do not exist on all distros, so they will be
+ # filtered out again by the respective distro object):
+ my @kernelModules = qw(
+ af_packet unix hid hid-bright usbhid uhci-hcd ohci-hcd vesafb fbcon
+ );
+ push @kernelModules, @{ $self->{'suggested-kernel-modules'} };
+
+ push @kernelModules, split ' ', $self->{attrs}->{ramfs_fsmods};
+ push @kernelModules, split ' ', $self->{attrs}->{ramfs_miscmods};
+ push @kernelModules, split ' ', $self->{attrs}->{ramfs_nicmods};
+
+ if ($self->{attrs}->{ramfs_nicmods} =~ m{virtio}i) {
+ push @kernelModules, qw( virtio_pci virtio_net );
+ }
+
+ # a function that determines dependent modules recursively
+ my $addDependentsSub;
+ $addDependentsSub = sub {
+ my $modulePath = shift;
+ foreach my $dependentModule (@{$dependentModules{$modulePath}}) {
+ next if $modulesToBeCopied{$dependentModule};
+ $modulesToBeCopied{$dependentModule} = 1;
+ $addDependentsSub->($dependentModule);
+ }
+ };
+
+ # start with the given kernel modules (names) and build a list of all
+ # required modules
+ foreach my $kernelModule (@kernelModules) {
+ if (!$modulePath{$kernelModule}) {
+ if (! grep { $_ eq $kernelModule }
+ @{ $self->{'filtered-kernel-modules'} }
+ ) {
+ warn _tr(
+ 'kernel module "%s" not found (in modules.dep)',
+ $kernelModule
+ );
+ }
+ }
+ foreach my $modulePath (@{$modulePath{$kernelModule}}) {
+ next if $modulesToBeCopied{$modulePath};
+ $modulesToBeCopied{$modulePath} = 1;
+ $addDependentsSub->($modulePath);
+ }
+ }
+
+ # build a list of required firmwares out of the list of modules - not
+ # totally optimal
+ my @firmwares;
+ $self->addCMD("mkdir -p $self->{'build-path'}/lib/firmware/$self->{'kernel-version'}");
+ foreach my $moduleToBeCopied(%modulesToBeCopied) {
+ $moduleToBeCopied =~ /.*\/(.*?)$/;
+ # implies usage of switch
+ vlog(1,$1);
+ switch ($1){
+ case "e100.ko" {push @firmwares, split ' ', "e100"}
+ case "iwlwifi" {
+ push @firmwares, split ' ',
+ "iwlwifi-3945-1.ucode iwlwifi-3945-2.ucode iwlwifi-4965-1.ucode iwlwifi-4965-2.ucode iwlwifi-5000-1.ucode"
+ }
+ case "tg3.ko" {push @firmwares, split ' ', "tigon/"}
+ # modules required for graphic adaptors (bootsplash, Xorg)
+ case "radeon.ko" {push @firmwares, split ' ', "radeon/"}
+ case "mga.ko" {push @firmwares, split ' ', "matrox/"}
+ case "r128.ko" {push @firmwares, split ' ', "r128/"}
+ }
+ }
+ # copy all the firmwares that we think are required
+ foreach my $firmwareToBeCopied (@firmwares) {
+ my $source = followLink(
+ "$self->{'root-path'}/lib/firmware/$self->{'kernel-version'}/$firmwareToBeCopied", $self->{'root-path'}
+ );
+ if (-e $source){
+ my $target = "$self->{'build-path'}/lib/firmware/";
+
+ $self->addCMD("cp -pr --dereference $source $target");
+ } else {
+ vlog(3,"unable to find $source for copying purposes");
+ }
+ }
+
+ # copy all the modules that we think are required
+ foreach my $moduleToBeCopied (sort keys %modulesToBeCopied) {
+ my $source = followLink(
+ "$self->{'root-path'}$moduleToBeCopied", $self->{'root-path'}
+ );
+ my $target = "$self->{'build-path'}$moduleToBeCopied";
+ my ($targetdir) = $target =~m/(.*\/).*$/;
+ vlog(5,"Trying to make directory: $targetdir");
+ $self->addCMD("mkdir -p $targetdir");
+ $self->addCMD("cp -p --dereference $source $target");
+ }
+
+ return;
+}
+
+sub _platformSpecificFileFor
+{
+ my $self = shift;
+ my $binary = shift;
+
+ if ($self->{'system-name'} =~ m{64}) {
+ return $binary . '.x86_64';
+ }
+ return $binary . '.i586';
+}
+
+sub _writeInitramfsSetup
+{
+ my $self = shift;
+
+ # generate initramfs-setup file containing attributes that are
+ # relevant for the initramfs only (before there's a root-FS):
+ my $initramfsAttrs = {
+ 'host_name' => 'slx-client', # just to have something at all
+ 'ramfs_fsmods' => $self->{attrs}->{ramfs_fsmods} || '',
+ 'ramfs_miscmods' => $self->{attrs}->{ramfs_miscmods} || '',
+ 'ramfs_nicmods' => $self->{attrs}->{ramfs_nicmods} || '',
+ 'ramfs_firmmods' => $self->{attrs}->{ramfs_firmmods} || '',
+ 'rootfs' => $self->{'export-uri'} || '',
+ 'hw_local_disk' => $self->{attrs}->{hw_local_disk} || '',
+ };
+ my $content = "# attributes set by slxconfig-demuxer:\n";
+ foreach my $attr (keys %$initramfsAttrs) {
+ $content .= qq[$attr="$initramfsAttrs->{$attr}"\n];
+ }
+ $self->addCMD( {
+ file => "$self->{'build-path'}/etc/initramfs-setup",
+ content => $content
+ } );
+
+ return;
+}
+
+sub _writeSlxSystemConf
+{
+ my $self = shift;
+
+ # generate slxsystem.conf file with variables that are needed
+ # in stage3 init.
+ # TODO: either put this stuff into initramfs-setup or find another solution
+ my $date = strftime("%d.%m.%Y", localtime);
+ my $slxConf = unshiftHereDoc(<<" End-of-Here");
+ slxconf_date=$date
+ slxconf_kernver=$self->{'kernel-version'}
+ slxconf_listnwmod="$self->{attrs}->{ramfs_nicmods}"
+ slxconf_distro_name=$self->{'distro-name'}
+ slxconf_distro_ver=$self->{'distro-ver'}
+ slxconf_system_name=$self->{'system-name'}
+ slxconf_slxver="$self->{'slx-version'}"
+ End-of-Here
+ $self->addCMD( {
+ file => "$self->{'build-path'}/etc/slxsystem.conf",
+ content => $slxConf
+ } );
+
+ # check if default directories available and copy them to /etc
+ my $defaultDirConfig = "$self->{'root-path'}/etc/opt/openslx/openslx.conf";
+ my $configTargetPath = "$self->{'build-path'}/etc";
+ #my $defaultConfVer = slurpFile("$defaultDirConfig");
+ #my $actConfVer = "Version 0.2";
+
+ if (-r $defaultDirConfig) {
+ $self->addCMD("cp -p $defaultDirConfig $configTargetPath/");
+# if ($defaultConfVer =~ m{$actConfVer}) {
+# warn _tr(
+# "Your version of default dir file (openslx.conf) is to old!\n".
+# "Eventually the system won't work.\n" .
+# "Please run install, update or clone of this system again!\n");
+# }
+ } else {
+ die _tr(
+ "No default directories defined!\n" .
+ "Please run install, update or clone of this system again!\n");
+ }
+
+ return;
+}
+
+sub _calloutToPlugins
+{
+ my $self = shift;
+
+ my $pluginInitdPath = "$self->{'build-path'}/etc/plugin-init.d";
+ my $initHooksPath = "$self->{'build-path'}/etc/init-hooks";
+ $self->addCMD("mkdir -p $pluginInitdPath $initHooksPath");
+
+ foreach my $pluginName (@{$self->{'plugins'}}) {
+ my $plugin = OpenSLX::OSPlugin::Roster->getPlugin($pluginName);
+ next if !$plugin;
+
+ # create a hash only containing the attributes relating to the
+ # current plugin
+ my $allAttrs = $self->{attrs};
+ my %pluginAttrs;
+ for my $attrName (grep { $_ =~ m{^${pluginName}::} } keys %$allAttrs) {
+ $pluginAttrs{$attrName} = $allAttrs->{$attrName};
+ }
+
+ # let plugin setup itself in the initramfs
+ $plugin->setupPluginInInitramfs(\%pluginAttrs, $self);
+ }
+ return;
+}
+
+sub _createInitRamFS
+{
+ my $self = shift;
+
+ my $buildPath = $self->{'build-path'};
+ $self->addCMD("chroot $buildPath ldconfig");
+ $self->addCMD(
+ "cd $buildPath "
+ . "&& find . "
+ . "| cpio -H newc --quiet --create "
+ . "| gzip -9 >$self->{initramfs}"
+ );
+
+ return;
+}
+
+1;
diff --git a/src/boot-env/OpenSLX/MakeInitRamFS/Engine/PBS.pm b/src/boot-env/OpenSLX/MakeInitRamFS/Engine/PBS.pm
new file mode 100644
index 00000000..571057ad
--- /dev/null
+++ b/src/boot-env/OpenSLX/MakeInitRamFS/Engine/PBS.pm
@@ -0,0 +1,42 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# MakeInitialRamFS::Engine::PBS.pm
+# - provides driver engine for MakeInitialRamFS API, implementing the
+# base of all preboot variants.
+# -----------------------------------------------------------------------------
+package OpenSLX::MakeInitRamFS::Engine::PBS;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::MakeInitRamFS::Engine::Preboot);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+sub _copyPrebootSpecificFiles
+{
+ my $self = shift;
+
+ # write secondary rootfs-layer (including init) on top of base layer
+ my $prebootRootfs
+ = "$openslxConfig{'base-path'}/share/boot-env/preboot/uclib-rootfs";
+ $self->addCMD("rsync -rlpt $prebootRootfs/ $self->{'build-path'}");
+
+ # overwrite preboot defaults
+ my $pbsRootfs
+ = "$openslxConfig{'base-path'}/share/boot-env/pbs/uclib-rootfs";
+ $self->addCMD("rsync -rlpt $pbsRootfs/ $self->{'build-path'}");
+
+ return 1;
+}
+
+1;
diff --git a/src/boot-env/OpenSLX/MakeInitRamFS/Engine/Preboot.pm b/src/boot-env/OpenSLX/MakeInitRamFS/Engine/Preboot.pm
new file mode 100644
index 00000000..aecfd00f
--- /dev/null
+++ b/src/boot-env/OpenSLX/MakeInitRamFS/Engine/Preboot.pm
@@ -0,0 +1,143 @@
+# Copyright (c) 2006-2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# MakeInitialRamFS::Engine::Preboot.pm
+# - provides driver engine for MakeInitialRamFS API, implementing the
+# base of all preboot variants.
+# -----------------------------------------------------------------------------
+package OpenSLX::MakeInitRamFS::Engine::Preboot;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::MakeInitRamFS::Engine::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### implementation methods
+################################################################################
+sub _collectCMDs
+{
+ my $self = shift;
+
+ $self->{CMDs} = [];
+
+ $self->_setupBuildPath();
+
+ $self->_writeInitramfsSetup();
+ $self->_writeSlxSystemConf();
+
+ $self->_copyUclibcRootfs();
+ $self->_copyPrebootSpecificFiles();
+
+ $self->{distro}->applyChanges($self);
+
+ $self->_copyKernelModules();
+
+ $self->_createInitRamFS();
+
+ return;
+}
+
+sub _setupBuildPath
+{
+ my $self = shift;
+
+ my $buildPath = "$openslxConfig{'temp-path'}/slx-initramfs";
+ $self->addCMD("rm -rf $buildPath");
+
+ my @stdFolders = qw(
+ bin
+ dev
+ etc
+ lib
+ mnt
+ proc
+ root
+ sbin
+ sys
+ tmp
+ var/lib
+ var/run
+ );
+ $self->addCMD(
+ 'mkdir -p ' . join(' ', map { "$buildPath/$_"; } @stdFolders)
+ );
+
+ $self->{'build-path'} = $buildPath;
+
+ return;
+}
+
+sub _writeInitramfsSetup
+{
+ my $self = shift;
+
+ # generate initramfs-setup file containing attributes that are
+ # relevant for the initramfs only (before there's a root-FS) -
+ # this override adds the name of the client such that the booting
+ # system has an ID to use for accessing the corresponding boot environment
+ # on the server
+ my $initramfsAttrs = {
+ 'host_name' => 'slx-client', # just to have something at all
+ 'ramfs_miscmods' => $self->{attrs}->{ramfs_miscmods} || '',
+ 'ramfs_nicmods' => $self->{attrs}->{ramfs_nicmods} || '',
+ 'ramfs_firmmods' => $self->{attrs}->{ramfs_firmmods} || '',
+ 'preboot_id' => $self->{'preboot-id'} || '',
+ 'boot_uri' => $self->{'boot-uri'} || '',
+ };
+ my $content = "# attributes set by slxconfig-demuxer:\n";
+ foreach my $attr (keys %$initramfsAttrs) {
+ $content .= qq[$attr="$initramfsAttrs->{$attr}"\n];
+ }
+ $self->addCMD( {
+ file => "$self->{'build-path'}/etc/initramfs-setup",
+ content => $content
+ } );
+
+ return;
+}
+
+sub _copyUclibcRootfs
+{
+ my $self = shift;
+
+ my $uclibcRootfs = "$openslxConfig{'base-path'}/share/uclib-rootfs";
+
+ my @excludes = qw(
+ );
+
+ # exclude strace unless this system is in debug mode
+ if (!$self->{'debug-level'}) {
+ push @excludes, 'strace';
+ }
+
+ my $exclOpts = join ' ', map { "--exclude $_" } @excludes;
+
+ $self->addCMD("rsync $exclOpts -rlpt $uclibcRootfs/ $self->{'build-path'}");
+
+ return 1;
+}
+
+sub _copyPrebootSpecificFiles
+{
+ my $self = shift;
+
+ # write secondary rootfs-layer (including init) on top of base layer
+ my $prebootRootfs
+ = "$openslxConfig{'base-path'}/share/boot-env/preboot/uclib-rootfs";
+ $self->addCMD("rsync -rlpt $prebootRootfs/ $self->{'build-path'}");
+
+ return 1;
+}
+
+1;
diff --git a/src/boot-env/OpenSLX/MakeInitRamFS/Engine/SlxBoot.pm b/src/boot-env/OpenSLX/MakeInitRamFS/Engine/SlxBoot.pm
new file mode 100644
index 00000000..1334c444
--- /dev/null
+++ b/src/boot-env/OpenSLX/MakeInitRamFS/Engine/SlxBoot.pm
@@ -0,0 +1,264 @@
+# Copyright (c) 2006-2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# MakeInitialRamFS::Engine::SlxBoot.pm
+# - provides driver engine for MakeInitialRamFS API, implementing the
+# standard slx boot behaviour (i.e. booting a system remotely).
+# -----------------------------------------------------------------------------
+package OpenSLX::MakeInitRamFS::Engine::SlxBoot;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::MakeInitRamFS::Engine::Base);
+
+use File::Find;
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### implementation methods
+################################################################################
+sub _collectCMDs
+{
+ my $self = shift;
+
+ $self->{CMDs} = [];
+
+ $self->_setupBuildPath();
+
+ $self->_addRequiredFSMods();
+
+ $self->_writeInitramfsSetup();
+ $self->_writeSlxSystemConf();
+
+ $self->_copyUclibcRootfs();
+ $self->_copyHwinfo();
+ $self->_copyDistroSpecificFiles();
+ $self->_copyInitramfsFiles();
+
+ $self->_copyPreAndPostinitFiles();
+
+ $self->_calloutToPlugins();
+
+ $self->{distro}->applyChanges($self);
+
+ $self->_copyKernelModules();
+
+ $self->_createInitRamFS();
+
+ return;
+}
+
+sub _setupBuildPath
+{
+ my $self = shift;
+
+ my $buildPath = "$openslxConfig{'temp-path'}/slx-initramfs";
+ $self->addCMD("rm -rf $buildPath");
+
+ my @stdFolders = qw(
+ bin
+ dev
+ etc
+ etc/init-hooks
+ lib
+ mnt
+ proc
+ root
+ sbin
+ sys
+ tmp
+ usr/share
+ var/lib
+ var/lib/nfs/state
+ var/run
+ );
+ $self->addCMD(
+ 'mkdir -p ' . join(' ', map { "$buildPath/$_"; } @stdFolders)
+ );
+
+ $self->{'build-path'} = $buildPath;
+
+ return;
+}
+
+sub _copyDistroSpecificFiles
+{
+ my $self = shift;
+
+ my $distroSpecsPath = "$openslxConfig{'base-path'}/share/distro-specs";
+
+ my $distroName = $self->{'distro-name'};
+ my $distroVer = $self->{'distro-ver'};
+
+ # concatenate default- and distro-specific functions into one file
+ my $functions = slurpFile("$distroSpecsPath/$distroName/functions-default");
+ $functions .= "\n";
+ $functions .= slurpFile(
+ "$distroSpecsPath/$distroName/functions-$distroVer",
+ { failIfMissing => 0 }
+ );
+ $self->addCMD( {
+ file => "$self->{'build-path'}/etc/distro-functions",
+ content => $functions,
+ } );
+
+ return 1;
+}
+
+sub _copyUclibcRootfs
+{
+ my $self = shift;
+
+ my $uclibcRootfs = "$openslxConfig{'base-path'}/share/uclib-rootfs";
+
+ my @excludes = qw(
+ dialog
+ kexec
+ libcurses.so*
+ libncurses.so*
+ mconf
+ );
+
+ # exclude strace unless this system is in debug mode
+ if (!$self->{'debug-level'}) {
+ push @excludes, 'strace';
+ }
+
+ my $exclOpts = join ' ', map { "--exclude $_" } @excludes;
+
+ $self->addCMD("rsync $exclOpts -rlpt $uclibcRootfs/ $self->{'build-path'}");
+
+ return 1;
+}
+
+sub _copyHwinfo
+{
+ my $self = shift;
+
+ my $baseDir = "$openslxConfig{'base-path'}/share/ramfstools/hwinfo";
+
+ my $version = $self->{distro}->determineMatchingHwinfoVersion(
+ $self->{'distro-ver'}
+ );
+
+ # copy db modifications
+ $self->addCMD("tar xfz $baseDir/db/hwinfo.db.tgz -C $self->{'build-path'}/");
+
+ $self->addCMD("cp $baseDir/bin/hwinfo-$version $self->{'build-path'}/usr/bin/hwinfo");
+ my $libHD = "libhd.so.$version";
+ $self->addCMD("cp $baseDir/lib/$libHD $self->{'build-path'}/usr/lib");
+ my $libName = $libHD;
+ while($libName =~ s{\.\d+$}{}g) {
+ $self->addCMD("ln -sf $libHD $self->{'build-path'}/usr/lib/$libName");
+ }
+
+ return 1;
+}
+
+sub _copyInitramfsFiles
+{
+ my $self = shift;
+
+ my $initramfsPath = "$openslxConfig{'base-path'}/share/initramfs";
+
+ find(
+ {
+ wanted => sub {
+ my $len = length($initramfsPath);
+ my $file = $File::Find::name;
+ my $relName = length($file) > $len ? substr($file, $len+1) : '';
+ if (-d) {
+ $self->addCMD("mkdir -p $self->{'build-path'}/$relName");
+ } elsif (-l $file) {
+ my $target = readlink $file;
+ $self->addCMD(
+ "ln -sf $target $self->{'build-path'}/$relName"
+ );
+ } elsif (qx{file $file} =~ m{ELF}) {
+ $self->addCMD(
+ "cp -p $file $self->{'build-path'}/$relName"
+ );
+ } else {
+ my $text = slurpFile($file, { 'io-layer' => 'bytes' } );
+
+ # replace macros
+ # TODO: find out what these mean and maybe find a
+ # different, better solution
+ my %macro = (
+ 'COMDIRINDXS' => '/tmp/scratch /var/lib/nobody',
+ # keep serverip as it is (it is handled by init itself)
+ 'serverip' => '@@@serverip@@@',
+ );
+ $text =~ s{\@\@\@([^\@]+)\@\@\@}{
+ if (!exists $macro{$1}) {
+ warn _tr(
+ 'unknown macro @@@%s@@@ found in %s',
+ $1, $File::Find::name
+ );
+ '';
+ } else {
+ $macro{$1};
+ }
+ }eogms;
+
+ # force shebang with ash (deprecated with new busybox)
+ #$text =~ s{\A#!\s*/bin/.+?$}{#!/bin/ash}ms;
+
+ $self->addCMD( {
+ file => "$self->{'build-path'}/$relName",
+ content => $text,
+ mode => (-x $file ? 0755 : undef),
+ } );
+ }
+ },
+ no_chdir => 1,
+ },
+ $initramfsPath
+ );
+
+ return;
+}
+
+sub _copyPreAndPostinitFiles
+{
+ my $self = shift;
+
+ foreach my $cfg (
+ 'default/initramfs/preinit.local',
+ "$self->{'system-name'}/initramfs/preinit.local",
+ 'default/initramfs/postinit.local',
+ "$self->{'system-name'}/initramfs/postinit.local"
+ ) {
+ my $cfgPath = "$openslxConfig{'private-path'}/config/$cfg";
+ next if !-f $cfgPath;
+ $self->addCMD("cp -p $cfgPath $self->{'build-path'}/bin/");
+ }
+ return;
+}
+
+sub _addRequiredFSMods
+{
+ my $self = shift;
+
+ my $osExportEngine = instantiateClass("OpenSLX::OSExport::Engine");
+ $osExportEngine->initializeFromExisting($self->{'export-name'});
+ my $fsMods = $self->{attrs}->{ramfs_fsmods} || '';
+ foreach my $fsMod ($osExportEngine->requiredFSMods()) {
+ $fsMods .= " $fsMod" if $fsMods !~ m{$fsMod};
+ }
+ $self->{attrs}->{ramfs_fsmods} = $fsMods;
+
+ return;
+}
+
+1;
diff --git a/src/boot-env/pbs/uclib-rootfs/bin/bbinit b/src/boot-env/pbs/uclib-rootfs/bin/bbinit
new file mode 100755
index 00000000..3fd67612
--- /dev/null
+++ b/src/boot-env/pbs/uclib-rootfs/bin/bbinit
@@ -0,0 +1,19 @@
+#!/bin/hush
+
+# create clean setup
+mkdir -p /etc/events.conf
+mkdir -p /etc/events.d
+rm /etc/events.d/*
+for f in $(ls -1 /etc/events)
+do
+ ln -sf /etc/events/$f /etc/events.d/$f
+done
+
+mkdir -p /tmp/event
+rm /tmp/event/*
+rm /tmp/events
+
+# start bbinit
+inotifyd /bin/handleEvents /tmp/event/:n &
+# initial call (executing all zero dependent scipts)
+handleEvents
diff --git a/src/boot-env/pbs/uclib-rootfs/bin/handleEvents b/src/boot-env/pbs/uclib-rootfs/bin/handleEvents
new file mode 100755
index 00000000..9bb78951
--- /dev/null
+++ b/src/boot-env/pbs/uclib-rootfs/bin/handleEvents
@@ -0,0 +1,38 @@
+#!/bin/hush
+
+# wait for lock
+while [ -f /tmp/bbinit.lock ]
+do
+ sleep 0.1
+done
+
+# lock eventhandler
+touch /tmp/bbinit.lock
+
+# source list of finished events
+[ -f /tmp/events ] && . /tmp/events
+
+# go through all unhandled events
+for f in $( ls -1 /etc/events.d/ )
+do
+ . /etc/events.d/$f
+
+ # check dependencies
+ eval dep=\$${f}_depends
+ havealldeps=1
+ for d in $dep
+ do
+ eval havedep=\$have${d}
+ [ "x$havedep" == "x1" ] || havealldeps=0
+ done
+
+ # if nothing is missing execute script
+ if [ "x$havealldeps" == "x1" ]; then
+ echo executing $f
+ /etc/bbinit.d/$f &
+ rm /etc/events.d/$f
+ fi
+done
+
+# unlock eventhandler
+rm /tmp/bbinit.lock
diff --git a/src/boot-env/pbs/uclib-rootfs/etc/bbinit.d/example b/src/boot-env/pbs/uclib-rootfs/etc/bbinit.d/example
new file mode 100755
index 00000000..122cf566
--- /dev/null
+++ b/src/boot-env/pbs/uclib-rootfs/etc/bbinit.d/example
@@ -0,0 +1,32 @@
+#!/bin/hush
+
+me=$(basename $0)
+
+# read event parameters
+. /etc/events/$me
+eval provides=\$${me}_provides
+
+# get config output of the dependencies
+eval dep=\$${me}_depends
+for d in $dep
+do
+ [ -f /etc/event.conf/$d ] && . /etc/event.conf/$d
+done
+
+# do some stuff
+echo "[$me] starting .."
+for i in 1 2 3 4 5 6
+do
+ echo "[$me] $i"
+ sleep 1
+done
+echo "[$me] finished .."
+
+# write configuration output
+value="test"
+echo "${provides}_someconfig=\"$value\"" >> /etc/event.conf/$provides
+
+# trigger eventhandler
+echo "have${provides}=1" >> /tmp/events
+touch /tmp/event/$me
+
diff --git a/src/boot-env/pbs/uclib-rootfs/etc/events/example b/src/boot-env/pbs/uclib-rootfs/etc/events/example
new file mode 100644
index 00000000..75768967
--- /dev/null
+++ b/src/boot-env/pbs/uclib-rootfs/etc/events/example
@@ -0,0 +1,2 @@
+example_depends=""
+example_provides="example"
diff --git a/src/boot-env/pbs/uclib-rootfs/init b/src/boot-env/pbs/uclib-rootfs/init
new file mode 100755
index 00000000..847cad87
--- /dev/null
+++ b/src/boot-env/pbs/uclib-rootfs/init
@@ -0,0 +1,234 @@
+#!/bin/ash
+# Copyright (c) 2008..2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# Main script for preboot initial ramfs - preloading environment for running
+# OpenSLX linux stateless clients version 5.
+
+fetchip () {
+# we expect to get an ip address within 10++ seconds
+( sleep 6 ; killall udhcpc >/dev/null 2>&1 ) &
+for i in 1 2 ; do
+ udhcpc -f -n -q $vci -s /usr/share/udhcpc/default.script -i $nwif 2>/dev/null
+ if grep "ip=" /tmp/ipstuff >/dev/null 2>&1 ; then
+ . /tmp/ipstuff
+ for ns in $dns ; do
+ echo "nameserver $ns" >>/etc/resolv.conf
+ done
+ # simply add a single dns server for passing via kernel cmdline to stage3
+ # (quickhack, just the last, list of dns might be better ...)
+ echo "dnssrv=$ns" >>/tmp/ipstuff
+ return
+ else
+ if [ $i -eq 1 ] ; then
+ sleep 1
+ else
+ dialog --msgbox "Did not get any proper IP configuration: Please check \
+that your Ethernet card is supported, the machine is connected to the network \
+and a DHCP server is answering your requests." 7 65
+ ash
+ echo "o" >/proc/sysrq-trigger
+ fi
+ fi
+done
+}
+
+#############################################################################
+# PreBoot init main part
+
+# device files get their own filesystem
+devdir="/dev"
+mount -n -t tmpfs -o 'size=25%,mode=0755' mdev ${devdir}
+mkdir -p /dev/pts
+mount -t devpts devpts /dev/pts
+echo /sbin/mdev > /proc/sys/kernel/hotplug
+cat > /etc/mdev.conf << "EOF"
+sda* 0:6 0660
+sdb* 0:6 0660
+sg* 0:6 0660
+hda* 0:6 0660
+hdb* 0:6 0660
+EOF
+
+mdev -s
+
+export DEBUGLEVEL=0
+
+# create basic device files an directories in dev
+for i in "/dev/mem c 1 1" "/dev/null c 1 3" "/dev/zero c 1 5" \
+ "/dev/urandom c 1 9" "/dev/kmsg c 1 11" "/dev/tty0 c 4 0" \
+ "/dev/tty1 c 4 1" "/dev/tty2 c 4 2" "/dev/tty3 c 4 3" \
+ "/dev/tty4 c 4 4" "/dev/tty5 c 4 5" "/dev/tty6 c 4 6" \
+ "/dev/tty7 c 4 7" "/dev/tty8 c 4 8" "/dev/tty9 c 4 9" \
+ "/dev/tty10 c 4 10" "/dev/tty c 5 0" "/dev/console c 5 1" \
+ "/dev/ptmx c 5 2" "/dev/psaux c 10 1" "/dev/agpgart c 10 175" \
+ "/dev/fb0 c 29 0" "/dev/bootsplash p" "/dev/xconsole p"; do
+ mknod $i
+done
+mkdir -p ${devdir}/pts ${devdir}/shm
+export PATH=/bin:/sbin:/usr/bin/:/usr/sbin
+
+# redirect kernel messages to tty10 instead of tty1
+getty -i -n -l /bin/cat 38400 tty10 &
+setlogcons 10
+
+# initramfs-setup configuration (common settings for all clients using a
+# certain InitRamFS generated by slxmkramfs/mkdxsinitrd)
+[ -f /etc/initramfs-setup ] && . /etc/initramfs-setup 2>/dev/null
+
+# set a default LAN interface, has to be modified for WLAN or on machines
+# with more than one ethernet card built in
+nwif="eth0"
+
+# mount the important standard directories
+[ ! -f /proc/cpuinfo ] && mount -n -t proc proc /proc
+[ ! -d /sys/class ] && mount -n -t sysfs sysfs /sys
+
+# load framebuffer modules if needed
+for mod in vesafb fbcon; do
+ if [ x != x$(find /lib/modules -name ${mod}.ko) ]; then
+ modprobe $mod || \
+ dialog --infobox "Module $mod did not load for some reason." 3 65
+ usleep 1000
+ fi
+done
+
+# give startup information
+dialog --infobox "Starting OpenSLX preboot environment ..." 3 65
+
+# load usb keyboard and network adaptor modules
+for mod in ${ramfs_nicmods} af_packet unix hid hid-bright usbhid \
+ uhci-hcd ohci-hcd ; do
+ if [ x != x$(find /lib/modules -name ${mod}.ko) ]; then
+ modprobe $mod || \
+ dialog --infobox "Module $mod did not load for some reason." 3 65
+ usleep 10000
+ fi
+done
+
+# set the default for boot type and read kernel commandline (for this and
+# other options)
+export TYPE=fastboot
+read KCMDLINE </proc/cmdline
+# read the system wide machine-setup and then the kernel commandline
+for opts in ${KCMDLINE} ; do
+ case ${opts} in
+ debug)
+ DEBUGLEVEL=1;;
+ # ... or a specified debug level (will be passed to next stage)
+ debug=*)
+ DEBUGLEVEL=${opts#debug=};;
+ # WLAN ssid (most probably passed that way, unused yet ...)
+ ssid=*)
+ SSID=${opts#SSID=};;
+ # Boot type (fastboot)/directkiosk/cfgkiosk/slxconfig
+ type=*)
+ TYPE=${opts#type=};;
+ pbsId=*)
+ PBS_ID=${opts#pbsId=};;
+ esac
+done
+
+# start a watchdog to ensure an automated reboot or halt of the machine if the
+# preboot init does not succeed (e.g. missing kernel module/firmware for the
+# network adaptor)
+if [ "${DEBUGLEVEL}" -eq 0 ] ; then
+ cat<<EOF >/bin/watchdog
+#!/bin/ash
+echo \$$ > /tmp/watchdogpid
+[ ! -f /proc/version ] && mount -n -t proc proc /proc
+sleep 120 2>/dev/null
+echo "o" >/proc/sysrq-trigger
+EOF
+ chmod u+x /bin/watchdog
+ watchdog &
+else
+ getty -i -n -l /bin/ash 38400 tty2 &
+fi
+
+if [ -n "${SSID}" ] ; then
+ # WLAN setup will most probably change the network interface name stored in
+ # nwif (to wlan0 or something like that)
+ [ $DEBUGLEVEL -gt 0 ] && echo "set essid to ${essid}";
+ #value of essid unchecked yet
+ # load network adaptor modules
+ cd /lib/modules/$(ls /lib/modules/)/kernel/drivers/net/wireless
+ for mod in $(find . | grep .ko | sed 's,.*/\([^/]*\).ko,\1',); do
+ echo "Mod:";
+ echo $mod;
+ modprobe $mod || echo "module $mod did not load for some reason"
+ usleep 10000
+ done
+ cd /
+ wlanif=$(iwconfig 2>/dev/null|sed -n "/ESSID:/p"|sed "s/ .*//")
+ [ $DEBUGLEVEL -gt 0 ] && echo "wlancard recognized as ${wlanif}";
+ ip link set dev ${wlanif} up
+ if iwconfig ${wlanif} mode managed essid "${essid}"; then
+ nwif=${wlanif}
+ else
+ error " Unable to configure the WLAN interface."
+ fi
+ :
+else
+ # check here for the active Ethernet link
+ ip link show dev eth1 >/dev/null 2>&1 && \
+ dialog --msgbox "More than one network interface found. This could cause \
+some trouble as their activation and ordering depends on the module load \
+order ..." 7 65
+fi
+
+# set up loopback networking and power up ethernet
+ip link set dev lo up
+ip addr add 127.0.0.1/8 dev lo
+ip link set dev $nwif up || echo "I did not find any usable network adaptor."
+
+# run udhcpc and start a debug shell if no lease could be obtained
+mkdir -p /usr/share/udhcpc
+echo -e "#!/bin/ash\nunset infomsg HOME IFS mask lease interface DEBUGLEVEL \
+BOOT_IMAGE\nset >/tmp/ipstuff" >/usr/share/udhcpc/default.script
+chmod u+x /usr/share/udhcpc/default.script
+modprobe -q af_packet
+[ -n $vci ] && vci="-V $vci"
+fetchip
+ip addr add $ip/$(ipcalc -s -p $ip $subnet|sed s/.*=//) dev $nwif
+ip route add default via $router
+
+# get the mac address of the boot network adaptor
+macaddr=$(ip link show dev $nwif 2>/dev/null | \
+ sed -n "/ether [0-9e-f]\{2\}:.*/p" | sed -e "s/.*ether //;s/ .*//")
+echo "macaddr=$macaddr" >>/etc/initramfs-setup
+
+# at this point a little selection script could be downloaded, which lets the
+# user choose what kind of SLX client he wants to get
+dialog --infobox "Fetching preboot interactive part and configuration from \
+the net ($boot_uri) ..." 4 65
+mkdir -p /preboot
+wget -q -O /preboot/preboot.init ${boot_uri}bootloader/env/getinit/formedia/$PBS_ID
+chmod u+x /preboot/preboot.init
+
+echo "pbs_id=$PBS_ID" >> /etc/pbs.conf
+
+# start a debug shell if needed, else set quiet kernel parameter
+if [ "${DEBUGLEVEL}" -gt 0 ] ; then
+ echo "Starting shell, leaving it would continue init."
+ /bin/ash
+else
+ # no debugging output for stage3 run
+ echo "quiet=quiet" >>/etc/initramfs-setup
+fi
+# run the preboot interactive part which finally will execute kexec
+cd /preboot
+exec ./preboot.init
+# we should never return from that one ...
+dialog --msgbox "The execution of the main preboot component failed. Please \
+check network access of your box. Is $boot_uri reachable!?" 6 65
+# ping -c 1 $boot_uri
+sleep 20 && echo "o" >/proc/sysrq-trigger
+
diff --git a/src/boot-env/pbs/uclib-rootfs/preboot/preboot-scripts/dialog.functions b/src/boot-env/pbs/uclib-rootfs/preboot/preboot-scripts/dialog.functions
new file mode 100644
index 00000000..7c6dd784
--- /dev/null
+++ b/src/boot-env/pbs/uclib-rootfs/preboot/preboot-scripts/dialog.functions
@@ -0,0 +1,105 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# dialog.functions
+# provides shell scripts for dialog handling
+# -----------------------------------------------------------------------------
+
+# set -x
+
+if [ "x" == "x$DIALOG_HEIGHT" ]; then
+ DIALOG_HEIGHT="10"
+fi
+
+if [ "x" == "x$DIALOG_WIDTH" ]; then
+ DIALOG_WIDTH="40"
+fi
+
+_ddownload_checkpercentage () {
+ local lf=$1
+ percentage=$(tail -n 5 $lf | sed 's/\.//g' | awk '{print $2}'| sed -n "s/%//p"| tail -n 1)
+ return $percentage
+}
+
+ddownload () {
+ local dl_url=$1
+ local dl_titel=$2
+ local dl_outfile=$3
+ local dl_logfile=$4
+
+ local dl_server=$(dirname $dl_url)
+ local dl_file=$(basename $dl_url)
+
+ local dl_count
+
+ if [ "x" == "x$dl_logfile" ]; then
+ dl_logfile="/tmp/logfile.$$"
+ fi
+
+ if [ "x" == "x$dl_outfile" ]; then
+ dl_outfile="$dl_file"
+ fi
+
+ if [ "x" == "x$dl_title" ]; then
+ dl_title="Downloading $dl_file .."
+ fi
+
+ if [ -f "$dl_logfile" ]; then
+ rm $dl_logfile
+ fi
+
+ # start wget in background
+ wget -v -b $dl_url -o "$dl_logfile" -O $dl_outfile
+
+ sleep 0.1;
+ _ddownload_checkpercentage "$dl_logfile"
+
+ dl_count=$?
+
+ while [ $dl_count -le 99 ];
+ do
+ echo $dl_count |dialog --gauge "$dl_title" $DIALOG_HEIGHT $DIALOG_WIDTH
+ sleep 0.5
+ _ddownload_checkpercentage "$dl_logfile"
+ dl_count=$?
+ done
+
+ local finished=0
+ while [ ! $finished ]; do
+ finished=$(tail -n 4 $dl_logfile | grep -c "$dl_file");
+ done
+
+ echo 100 | dialog --gauge "$dl_title" $DIALOG_HEIGHT $DIALOG_WIDTH;
+
+}
+
+
+
+menu_firststart () {
+ while [ "x$(cat result)" = "x" ] ; do
+ dialog --menu "OpenSLX" 30 60 22 \
+ 01 "Kiosk" \
+ 02 "Kiosk Setup" \
+ 03 "Custom System" \
+ 2>result
+ done
+}
+
+menu_oldconfig () {
+ oldconf=$1;
+ while [ "x$(cat result)" = "x" ] ; do
+ dialog --menu "OpenSLX" 30 60 22 \
+ 01 "Kiosk" \
+ 02 "Kiosk Setup" \
+ 03 "Custom System" \
+ 04 "Custom System"
+ 2>result
+ done
+}
diff --git a/src/boot-env/preboot/conf/apache-openslx-preboot.conf b/src/boot-env/preboot/conf/apache-openslx-preboot.conf
new file mode 100644
index 00000000..4eb58809
--- /dev/null
+++ b/src/boot-env/preboot/conf/apache-openslx-preboot.conf
@@ -0,0 +1,24 @@
+ ScriptAlias /openslx-preboot/cgi-bin/ "/opt/openslx/share/boot-env/preboot/http-server/"
+
+ Alias "/openslx-preboot/users/" "/srv/openslx/preboot-users/"
+ <Directory "/srv/openslx/preboot-users/">
+ Options -Indexes -ExecCGI FollowSymLinks MultiViews
+ AllowOverride None
+ Order allow,deny
+ allow from all
+ </Directory>
+
+ Alias /openslx-preboot/ "/srv/openslx/preboot/"
+ <Directory "/srv/openslx/preboot/">
+ Options -Indexes -ExecCGI FollowSymLinks MultiViews
+ AllowOverride None
+ Order allow,deny
+ allow from all
+ </Directory>
+
+ <Directory "/opt/openslx/share/boot-env/preboot/http-server/">
+ AllowOverride None
+ Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
+ Order allow,deny
+ Allow from all
+ </Directory>
diff --git a/src/boot-env/preboot/http-server/user_settings.pl b/src/boot-env/preboot/http-server/user_settings.pl
new file mode 100755
index 00000000..6c135267
--- /dev/null
+++ b/src/boot-env/preboot/http-server/user_settings.pl
@@ -0,0 +1,97 @@
+#!/usr/bin/perl -w
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# cgi-bin script that accepts user settings and stores them in a special
+# folder on the openslx server
+
+use strict;
+use warnings;
+
+use CGI;
+use CGI::Carp qw(fatalsToBrowser);
+use File::Path;
+
+# add openslx stuff to @INC
+use FindBin;
+use lib "$FindBin::RealBin/../../../../lib";
+use lib "$FindBin::RealBin";
+
+# read default config
+use OpenSLX::Basics;
+openslxInit();
+
+# die "*** Taint mode must be active! ***" unless ${^TAINT};
+
+my $cgi = CGI->new;
+
+my $system = $cgi->param('system') || '';
+my $client = $cgi->param('client') || '';
+my $prebootID = $cgi->param('preboot_id') || '';
+my $type = $cgi->param('type') || 'directkiosk';
+my $errormsg = 'None';
+
+die "must give 'system' ($system), 'client' ($client) and 'preboot_id' ($prebootID)!\n"
+ unless $system && $client && $prebootID;
+
+my $webPath = "$openslxConfig{'public-path'}/preboot";
+my $src = "$webPath/client-config/$system/$prebootID.tgz";
+my $destPath = "$webPath/$prebootID/client-config/$system";
+
+# if fastboot (default) is selected and a ConfTGZ exist just proceed ...
+if ($type eq "fastboot" && !-e "$destPath/$client.tgz") { $type = "slxconfig"; }
+# directkiosk/cfgkiosk/slxconfig
+if ($type ne "fastboot") {
+ mkpath($destPath."/".$client);
+ system(qq{tar -xzf $src -C $destPath/$client/});
+
+
+ # from here on the modifications of client configuration should take place
+ # within $destPath/$client directory
+ if ($type eq "slxconfig") {
+ # configuration of a WAN boot SLX client
+ print STDERR "slxconfig sub";
+ }
+ elsif ($type eq "cfgkiosk") {
+ # configuration of a WAN boot SLX kiosk
+ }
+ elsif (!$type || $type eq "directkiosk") {
+ # deactivate the desktop plugin for the kiosk mode
+ open (CFGFILE, ">>$destPath/$client/initramfs/plugin-conf/desktop.conf");
+ print CFGFILE 'desktop_active="0"';
+ close (CFGFILE);
+ # activate the kiosk plugin
+ if (!-e "$destPath/$client/initramfs/plugin-conf/kiosk.conf") {
+ $errormsg = "The kiosk plugin seems not to be installed";
+ print STDERR $errormsg;
+ } else {
+ open (CFGFILE, ">>$destPath/$client/initramfs/plugin-conf/kiosk.conf");
+ print CFGFILE 'kiosk_active="1"';
+ close (CFGFILE);
+ }
+ }
+ else {
+ # unknown type
+ $errormsg = "You have passed an unknown boot type $type";
+ print STDERR $errormsg;
+ }
+ system(qq{cd $destPath/$client; tar -czf $destPath/$client.tgz *});
+ rmtree($destPath."/".$client);
+}
+
+# resulting page is not shown to the user (error reporting that way, or
+# completely empty reply?)
+print
+ $cgi->header(-charset => 'iso8859-1'),
+ $cgi->start_html('...');
+if ($errormsg) { print $cgi->p("Error: $errormsg"); }
+print
+ $cgi->end_html();
+
diff --git a/src/boot-env/preboot/http-server/users.pl b/src/boot-env/preboot/http-server/users.pl
new file mode 100755
index 00000000..cde3d227
--- /dev/null
+++ b/src/boot-env/preboot/http-server/users.pl
@@ -0,0 +1,90 @@
+#!/usr/bin/perl -w
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# cgi-bin script that accepts user settings and stores them in a special
+# folder on the openslx server
+
+use strict;
+use warnings;
+
+use CGI;
+use CGI::Carp qw(fatalsToBrowser);
+use File::Path;
+use Switch;
+
+# add openslx stuff to @INC
+use FindBin;
+use lib "$FindBin::RealBin/../../../../lib";
+use lib "$FindBin::RealBin";
+
+# read default config
+use OpenSLX::Basics;
+openslxInit();
+
+my $cgi = CGI->new;
+my $mac = $cgi->param('user') || '';
+my $action = $cgi->param('action');
+my $data = $cgi->param('data');
+
+# global requirements
+die "must give 'mac' ($mac)!\n"
+ unless $mac;
+
+my $webPath = "$openslxConfig{'public-path'}/preboot-users";
+my $userConfFile = "$webPath/$mac.conf";
+
+# makes only sense if public path is writeable for www-data
+# otherwise you have to create directory manualy
+if ( ! -e $webPath ) {
+ mkpath ($webPath) or die _tr("Can't create user config directory (%s). Reason: %s", $webPath, @_);
+}
+
+my $output = "";
+my $error;
+
+switch ($action) {
+ case 'set' {
+ if ($data) {
+ open (MYFILE, ">$userConfFile");
+ print MYFILE $data;
+ close (MYFILE);
+ } else {
+ $error = "no data";
+ }
+ }
+ case 'read' {
+ if ( -e $userConfFile ) {
+ open (MYFILE, $userConfFile);
+ while (<MYFILE>) {
+ chomp;
+ $output .= "$_\n";
+ }
+ close (MYFILE);
+ } else {
+ $error = "foobar";
+ }
+
+ }
+ else {
+ #default case check if we have a user config
+ if ( -e $userConfFile ) { $output = "1"; }
+ else { $output = "0"; };
+ }
+}
+
+print $cgi->header('Content-type: text/plain');
+if ($error) {
+ print $error;
+} else {
+ print $output;
+}
+
+exit 0;
diff --git a/src/boot-env/preboot/preboot-scripts/dialog.functions b/src/boot-env/preboot/preboot-scripts/dialog.functions
new file mode 100644
index 00000000..7c6dd784
--- /dev/null
+++ b/src/boot-env/preboot/preboot-scripts/dialog.functions
@@ -0,0 +1,105 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# dialog.functions
+# provides shell scripts for dialog handling
+# -----------------------------------------------------------------------------
+
+# set -x
+
+if [ "x" == "x$DIALOG_HEIGHT" ]; then
+ DIALOG_HEIGHT="10"
+fi
+
+if [ "x" == "x$DIALOG_WIDTH" ]; then
+ DIALOG_WIDTH="40"
+fi
+
+_ddownload_checkpercentage () {
+ local lf=$1
+ percentage=$(tail -n 5 $lf | sed 's/\.//g' | awk '{print $2}'| sed -n "s/%//p"| tail -n 1)
+ return $percentage
+}
+
+ddownload () {
+ local dl_url=$1
+ local dl_titel=$2
+ local dl_outfile=$3
+ local dl_logfile=$4
+
+ local dl_server=$(dirname $dl_url)
+ local dl_file=$(basename $dl_url)
+
+ local dl_count
+
+ if [ "x" == "x$dl_logfile" ]; then
+ dl_logfile="/tmp/logfile.$$"
+ fi
+
+ if [ "x" == "x$dl_outfile" ]; then
+ dl_outfile="$dl_file"
+ fi
+
+ if [ "x" == "x$dl_title" ]; then
+ dl_title="Downloading $dl_file .."
+ fi
+
+ if [ -f "$dl_logfile" ]; then
+ rm $dl_logfile
+ fi
+
+ # start wget in background
+ wget -v -b $dl_url -o "$dl_logfile" -O $dl_outfile
+
+ sleep 0.1;
+ _ddownload_checkpercentage "$dl_logfile"
+
+ dl_count=$?
+
+ while [ $dl_count -le 99 ];
+ do
+ echo $dl_count |dialog --gauge "$dl_title" $DIALOG_HEIGHT $DIALOG_WIDTH
+ sleep 0.5
+ _ddownload_checkpercentage "$dl_logfile"
+ dl_count=$?
+ done
+
+ local finished=0
+ while [ ! $finished ]; do
+ finished=$(tail -n 4 $dl_logfile | grep -c "$dl_file");
+ done
+
+ echo 100 | dialog --gauge "$dl_title" $DIALOG_HEIGHT $DIALOG_WIDTH;
+
+}
+
+
+
+menu_firststart () {
+ while [ "x$(cat result)" = "x" ] ; do
+ dialog --menu "OpenSLX" 30 60 22 \
+ 01 "Kiosk" \
+ 02 "Kiosk Setup" \
+ 03 "Custom System" \
+ 2>result
+ done
+}
+
+menu_oldconfig () {
+ oldconf=$1;
+ while [ "x$(cat result)" = "x" ] ; do
+ dialog --menu "OpenSLX" 30 60 22 \
+ 01 "Kiosk" \
+ 02 "Kiosk Setup" \
+ 03 "Custom System" \
+ 04 "Custom System"
+ 2>result
+ done
+}
diff --git a/src/boot-env/preboot/preboot.sh b/src/boot-env/preboot/preboot.sh
new file mode 100755
index 00000000..703af974
--- /dev/null
+++ b/src/boot-env/preboot/preboot.sh
@@ -0,0 +1,95 @@
+#!/bin/ash
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# preboot script for user interaction with OpenSLX preloading environment for
+# Linux stateless clients (fetched by Preboot init over the net)
+
+# get configuration
+. /etc/initramfs-setup
+. ./preboot-scripts/dialog.functions
+
+# bring the mac address into the standard format 01-<MAC>
+client=$(echo 01-$macaddr|sed "s/:/-/g")
+
+# check if already a configuration is available to decide if user interaction
+# is required (path is to be fixed)
+wget -q -O /tmp/have-user-config "$boot_uri/users.pl?user=${client}"
+have_user_config=$(cat /tmp/have-user-config);
+
+if [ "x1" == "x$have_user_config" ]; then
+ wget -q -O /tmp/oldconfig "$boot_uri/users.pl?user=${client}&action=read"
+ . /tmp/oldconfig
+ menu_oldconfig $oldconfig
+else
+ menu_firststart
+fi
+rm result;
+
+# Switch here for several boot TYPE=fastboot/directkiosk/cfgkiosk/slxconfig
+# fastboot - no interaction use system from client config
+# directkiosk - start the default slx system into kiosk (using vmchooser)
+# cfgkiosk - offer the user changes to his kiosk system (GUI environment)
+# slxconfig - offer the user set of configuration options, like setting a non-
+# priviledged user, root password, standard gui, plugins to activate ...
+
+# we expect to have a system selection dialog file in /preboot/bootmenu.dialog
+while [ "x$(cat result)" = "x" ] ; do
+ dialog --file bootmenu.dialog 2>result
+done
+# source the system to boot configuration ($kernel, $initramfs, $append,
+# $label)
+sysname=$(cat result)
+. ./$sysname
+sysname=$(readlink $sysname)
+
+# set basic post data information
+postdata="system=${sysname}&preboot_id=${preboot_id}&client=${client}"
+
+# ask for desired debug level in stage3 if debug!=0 in preboot
+echo "0" >result
+[ x$DEBUGLEVEL != x0 ] && dialog --no-cancel --menu "Choose Debug Level:" \
+ 20 65 10 "0" "no debug output (splash)" \
+ "2" "standard debug output" \
+ "3" "debug output and shell" 2>result
+
+# change debug level here if required (adjusted for the rest of the interactive
+# part)
+DEBUGLEVEL=$(cat result)
+if [ x$DEBUGLEVEL != x0 ]; then
+ debug="debug=$DEBUGLEVEL"
+else
+ debug=""
+fi
+
+# send information to configuration host via http
+wget --post-data "$postdata" -O /tmp/cfg-error \
+ $boot_uri/cgi-bin/user_settings.pl
+
+[ "x$DEBUGLEVEL" != x0 -a grep -qe "Error:" /tmp/cfg-error 2>/dev/null ] && \
+ dialog --msgbox "An error occured ..." # to be elaborated
+
+# fetch kernel and initramfs of selected system
+dialog --infobox "Loading kernel of ${sysname} ..." 3 65
+wget -q -O /tmp/kernel $boot_uri/$kernel
+dialog --infobox "Loading initial ramfs of ${sysname} ..." 3 65
+wget -q -O /tmp/initramfs $boot_uri/$initramfs
+
+# read primary IP configuration to pass it on (behaviour like IPAPPEND=1 of
+# PXElinux)
+. /tmp/ipstuff
+
+[ "x$DEBUGLEVEL" != x0 ] && { clear; ash; }
+
+# start the new kernel with initialramfs and composed cmdline
+dialog --infobox "Booting OpenSLX client $label ..." 3 65
+kexec -l /tmp/kernel --initrd=/tmp/initramfs \
+ --append="$append file=$boot_uri/${preboot_id}/client-config/${sysname}/${client}.tgz $quiet ip=$ip:$siaddr:$router:$subnet:$dnssrv $debug" 2>/dev/null
+kexec -e >/dev/null 2>&1
diff --git a/src/boot-env/preboot/uclib-rootfs/init b/src/boot-env/preboot/uclib-rootfs/init
new file mode 100755
index 00000000..ab2f9ca0
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/init
@@ -0,0 +1,216 @@
+#!/bin/ash
+# Copyright (c) 2008..2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# Main script for preboot initial ramfs - preloading environment for running
+# OpenSLX linux stateless clients version 5.
+
+fetchip () {
+# we expect to get an ip address within 10++ seconds
+( sleep 10 ; killall udhcpc >/dev/null 2>&1 ) &
+for i in 1 2 ; do
+ udhcpc -f -n -q $vci -s /usr/share/udhcpc/default.script -i $nwif 2>/dev/null
+ if grep "ip=" /tmp/ipstuff >/dev/null 2>&1 ; then
+ . /tmp/ipstuff
+ for ns in $dns ; do
+ echo "nameserver $ns" >>/etc/resolv.conf
+ done
+ # simply add a single dns server for passing via kernel cmdline to stage3
+ # (quickhack, just the last, list of dns might be better ...)
+ echo "dnssrv=$ns" >>/tmp/ipstuff
+ return
+ else
+ if [ $i -eq 1 ] ; then
+ sleep 1
+ else
+ dialog --msgbox "Did not get any proper IP configuration: Please check \
+that your Ethernet card is supported, the machine is connected to the network \
+and a DHCP server is answering your requests." 7 65
+ ash
+ echo "o" >/proc/sysrq-trigger
+ fi
+ fi
+done
+}
+
+#############################################################################
+# PreBoot init main part
+
+# device files get their own filesystem
+devdir="/dev"
+mount -n -t tmpfs -o 'size=25%,mode=0755' initramfsdevs ${devdir}
+export DEBUGLEVEL=0
+
+# create basic device files an directories in dev
+for i in "/dev/mem c 1 1" "/dev/null c 1 3" "/dev/zero c 1 5" \
+ "/dev/urandom c 1 9" "/dev/kmsg c 1 11" "/dev/tty0 c 4 0" \
+ "/dev/tty1 c 4 1" "/dev/tty2 c 4 2" "/dev/tty3 c 4 3" \
+ "/dev/tty4 c 4 4" "/dev/tty5 c 4 5" "/dev/tty6 c 4 6" \
+ "/dev/tty7 c 4 7" "/dev/tty8 c 4 8" "/dev/tty9 c 4 9" \
+ "/dev/tty10 c 4 10" "/dev/tty c 5 0" "/dev/console c 5 1" \
+ "/dev/ptmx c 5 2" "/dev/psaux c 10 1" "/dev/agpgart c 10 175" \
+ "/dev/fb0 c 29 0" "/dev/bootsplash p" "/dev/xconsole p"; do
+ mknod $i
+done
+mkdir -p ${devdir}/pts ${devdir}/shm
+export PATH=/bin:/sbin:/usr/bin/:/usr/sbin
+
+# redirect kernel messages to tty10 instead of tty1
+getty -i -n -l /bin/cat 38400 tty10 &
+setlogcons 10
+
+# initramfs-setup configuration (common settings for all clients using a
+# certain InitRamFS generated by slxmkramfs/mkdxsinitrd)
+[ -f /etc/initramfs-setup ] && . /etc/initramfs-setup 2>/dev/null
+
+# set a default LAN interface, has to be modified for WLAN or on machines
+# with more than one ethernet card built in
+nwif="eth0"
+
+# mount the important standard directories
+[ ! -f /proc/cpuinfo ] && mount -n -t proc proc /proc
+[ ! -d /sys/class ] && mount -n -t sysfs sysfs /sys
+
+# load framebuffer modules if needed
+for mod in vesafb fbcon; do
+ if [ x != x$(find /lib/modules -name ${mod}.ko) ]; then
+ modprobe $mod || \
+ dialog --infobox "Module $mod did not load for some reason." 3 65
+ usleep 1000
+ fi
+done
+
+# give startup information
+dialog --infobox "Starting OpenSLX preboot environment ..." 3 65
+
+# load usb keyboard and network adaptor modules
+for mod in ${ramfs_nicmods} af_packet unix hid hid-bright usbhid \
+ uhci-hcd ohci-hcd ; do
+ if [ x != x$(find /lib/modules -name ${mod}.ko) ]; then
+ modprobe $mod || \
+ dialog --infobox "Module $mod did not load for some reason." 3 65
+ usleep 10000
+ fi
+done
+
+# set the default for boot type and read kernel commandline (for this and
+# other options)
+export TYPE=fastboot
+read KCMDLINE </proc/cmdline
+# read the system wide machine-setup and then the kernel commandline
+for opts in ${KCMDLINE} ; do
+ case ${opts} in
+ debug)
+ DEBUGLEVEL=1;;
+ # ... or a specified debug level (will be passed to next stage)
+ debug=*)
+ DEBUGLEVEL=${opts#debug=};;
+ # WLAN ssid (most probably passed that way, unused yet ...)
+ ssid=*)
+ SSID=${opts#SSID=};;
+ # Boot type (fastboot)/directkiosk/cfgkiosk/slxconfig
+ type=*)
+ TYPE=${opts#type=};;
+ esac
+done
+
+# start a watchdog to ensure an automated reboot or halt of the machine if the
+# preboot init does not succeed (e.g. missing kernel module/firmware for the
+# network adaptor)
+if [ "${DEBUGLEVEL}" -eq 0 ] ; then
+ cat<<EOF >/bin/watchdog
+#!/bin/ash
+echo \$$ > /tmp/watchdogpid
+[ ! -f /proc/version ] && mount -n -t proc proc /proc
+sleep 120 2>/dev/null
+echo "o" >/proc/sysrq-trigger
+EOF
+ chmod u+x /bin/watchdog
+ watchdog &
+else
+ getty -i -n -l /bin/ash 38400 tty2 &
+fi
+
+if [ -n "${SSID}" ] ; then
+ # WLAN setup will most probably change the network interface name stored in
+ # nwif (to wlan0 or something like that)
+ [ $DEBUGLEVEL -gt 0 ] && echo "set essid to ${essid}";
+ #value of essid unchecked yet
+ # load network adaptor modules
+ cd /lib/modules/$(ls /lib/modules/)/kernel/drivers/net/wireless
+ for mod in $(find . | grep .ko | sed 's,.*/\([^/]*\).ko,\1',); do
+ echo "Mod:";
+ echo $mod;
+ modprobe $mod || echo "module $mod did not load for some reason"
+ usleep 10000
+ done
+ cd /
+ wlanif=$(iwconfig 2>/dev/null|sed -n "/ESSID:/p"|sed "s/ .*//")
+ [ $DEBUGLEVEL -gt 0 ] && echo "wlancard recognized as ${wlanif}";
+ ip link set dev ${wlanif} up
+ if iwconfig ${wlanif} mode managed essid "${essid}"; then
+ nwif=${wlanif}
+ else
+ error " Unable to configure the WLAN interface."
+ fi
+ :
+else
+ # check here for the active Ethernet link
+ ip link show dev eth1 >/dev/null 2>&1 && \
+ dialog --msgbox "More than one network interface found. This could cause \
+some trouble as their activation and ordering depends on the module load \
+order ..." 7 65
+fi
+
+# set up loopback networking and power up ethernet
+ip link set dev lo up
+ip addr add 127.0.0.1/8 dev lo
+ip link set dev $nwif up || echo "I did not find any usable network adaptor."
+
+# run udhcpc and start a debug shell if no lease could be obtained
+mkdir -p /usr/share/udhcpc
+echo -e "#!/bin/ash\nunset infomsg HOME IFS mask lease interface DEBUGLEVEL \
+BOOT_IMAGE\nset >/tmp/ipstuff" >/usr/share/udhcpc/default.script
+chmod u+x /usr/share/udhcpc/default.script
+modprobe -q af_packet
+[ -n $vci ] && vci="-V $vci"
+fetchip
+ip addr add $ip/$(ipcalc -s -p $ip $subnet|sed s/.*=//) dev $nwif
+ip route add default via $router
+
+# get the mac address of the boot network adaptor
+macaddr=$(ip link show dev $nwif 2>/dev/null | \
+ sed -n "/ether [0-9e-f]\{2\}:.*/p" | sed -e "s/.*ether //;s/ .*//")
+echo "macaddr=$macaddr" >>/etc/initramfs-setup
+
+# at this point a little selection script could be downloaded, which lets the
+# user choose what kind of SLX client he wants to get
+dialog --infobox "Fetching preboot interactive part and configuration from \
+the net ($boot_uri) ..." 4 65
+wget -q -O /tmp/preboot.env $boot_uri/bootloader/${preboot_id}.env
+mkdir /preboot
+tar -xzf /tmp/preboot.env -C /preboot
+# start a debug shell if needed, else set quiet kernel parameter
+if [ "${DEBUGLEVEL}" -gt 0 ] ; then
+ echo "Starting shell, leaving it would continue init."
+ /bin/ash
+else
+ # no debugging output for stage3 run
+ echo "quiet=quiet" >>/etc/initramfs-setup
+fi
+# run the preboot interactive part which finally will execute kexec
+cd /preboot
+exec ./preboot.sh
+# we should never return from that one ...
+dialog --msgbox "The execution of the main preboot component failed. Please \
+check network access of your box. Is $boot_uri reachable!?" 6 65
+# ping -c 1 $boot_uri
+sleep 20 && echo "o" >/proc/sysrq-trigger
+
diff --git a/src/boot-env/preboot/uclib-rootfs/lib/libcurses.so b/src/boot-env/preboot/uclib-rootfs/lib/libcurses.so
new file mode 120000
index 00000000..c7b1e02a
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/lib/libcurses.so
@@ -0,0 +1 @@
+libncurses.so.5.6 \ No newline at end of file
diff --git a/src/boot-env/preboot/uclib-rootfs/lib/libncurses.so b/src/boot-env/preboot/uclib-rootfs/lib/libncurses.so
new file mode 120000
index 00000000..7257b6af
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/lib/libncurses.so
@@ -0,0 +1 @@
+libncurses.so.5 \ No newline at end of file
diff --git a/src/boot-env/preboot/uclib-rootfs/lib/libncurses.so.5 b/src/boot-env/preboot/uclib-rootfs/lib/libncurses.so.5
new file mode 120000
index 00000000..c7b1e02a
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/lib/libncurses.so.5
@@ -0,0 +1 @@
+libncurses.so.5.6 \ No newline at end of file
diff --git a/src/boot-env/preboot/uclib-rootfs/lib/libncurses.so.5.6 b/src/boot-env/preboot/uclib-rootfs/lib/libncurses.so.5.6
new file mode 100755
index 00000000..a395c6b7
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/lib/libncurses.so.5.6
Binary files differ
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/bin/clear b/src/boot-env/preboot/uclib-rootfs/usr/bin/clear
new file mode 100755
index 00000000..acc13246
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/bin/clear
Binary files differ
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/bin/dialog b/src/boot-env/preboot/uclib-rootfs/usr/bin/dialog
new file mode 100755
index 00000000..6929569f
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/bin/dialog
Binary files differ
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/bin/w3m b/src/boot-env/preboot/uclib-rootfs/usr/bin/w3m
new file mode 100755
index 00000000..2766a681
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/bin/w3m
Binary files differ
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libcrypto.so b/src/boot-env/preboot/uclib-rootfs/usr/lib/libcrypto.so
new file mode 120000
index 00000000..cda623f3
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libcrypto.so
@@ -0,0 +1 @@
+libcrypto.so.0.9.8 \ No newline at end of file
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libcrypto.so.0.9.8 b/src/boot-env/preboot/uclib-rootfs/usr/lib/libcrypto.so.0.9.8
new file mode 100755
index 00000000..bb1b8163
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libcrypto.so.0.9.8
Binary files differ
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libcurses.so b/src/boot-env/preboot/uclib-rootfs/usr/lib/libcurses.so
new file mode 100755
index 00000000..32ad8efe
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libcurses.so
@@ -0,0 +1,11 @@
+/* GNU ld script
+ Since Gentoo has critical dynamic libraries in /lib, and the static versions
+ in /usr/lib, we need to have a "fake" dynamic lib in /usr/lib, otherwise we
+ run into linking problems. This "fake" dynamic lib is a linker script that
+ redirects the linker to the real lib. And yes, this works in the cross-
+ compiling scenario as the sysroot-ed linker will prepend the real path.
+
+ See bug http://bugs.gentoo.org/4411 for more info.
+ */
+OUTPUT_FORMAT ( elf32-i386 )
+GROUP ( /lib/libcurses.so )
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libform.so b/src/boot-env/preboot/uclib-rootfs/usr/lib/libform.so
new file mode 120000
index 00000000..10e91696
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libform.so
@@ -0,0 +1 @@
+libform.so.5 \ No newline at end of file
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libform.so.5 b/src/boot-env/preboot/uclib-rootfs/usr/lib/libform.so.5
new file mode 120000
index 00000000..4a80f6b6
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libform.so.5
@@ -0,0 +1 @@
+libform.so.5.6 \ No newline at end of file
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libform.so.5.6 b/src/boot-env/preboot/uclib-rootfs/usr/lib/libform.so.5.6
new file mode 100755
index 00000000..888adb22
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libform.so.5.6
Binary files differ
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libmenu.so b/src/boot-env/preboot/uclib-rootfs/usr/lib/libmenu.so
new file mode 120000
index 00000000..b12b5cfb
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libmenu.so
@@ -0,0 +1 @@
+libmenu.so.5 \ No newline at end of file
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libmenu.so.5 b/src/boot-env/preboot/uclib-rootfs/usr/lib/libmenu.so.5
new file mode 120000
index 00000000..869f4a57
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libmenu.so.5
@@ -0,0 +1 @@
+libmenu.so.5.6 \ No newline at end of file
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libmenu.so.5.6 b/src/boot-env/preboot/uclib-rootfs/usr/lib/libmenu.so.5.6
new file mode 100755
index 00000000..fb190a90
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libmenu.so.5.6
Binary files differ
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libncurses.so b/src/boot-env/preboot/uclib-rootfs/usr/lib/libncurses.so
new file mode 100755
index 00000000..e7122a85
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libncurses.so
@@ -0,0 +1,11 @@
+/* GNU ld script
+ Since Gentoo has critical dynamic libraries in /lib, and the static versions
+ in /usr/lib, we need to have a "fake" dynamic lib in /usr/lib, otherwise we
+ run into linking problems. This "fake" dynamic lib is a linker script that
+ redirects the linker to the real lib. And yes, this works in the cross-
+ compiling scenario as the sysroot-ed linker will prepend the real path.
+
+ See bug http://bugs.gentoo.org/4411 for more info.
+ */
+OUTPUT_FORMAT ( elf32-i386 )
+GROUP ( /lib/libncurses.so )
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libpanel.so b/src/boot-env/preboot/uclib-rootfs/usr/lib/libpanel.so
new file mode 120000
index 00000000..b5cd4a70
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libpanel.so
@@ -0,0 +1 @@
+libpanel.so.5 \ No newline at end of file
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libpanel.so.5 b/src/boot-env/preboot/uclib-rootfs/usr/lib/libpanel.so.5
new file mode 120000
index 00000000..ff2e80a5
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libpanel.so.5
@@ -0,0 +1 @@
+libpanel.so.5.6 \ No newline at end of file
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libpanel.so.5.6 b/src/boot-env/preboot/uclib-rootfs/usr/lib/libpanel.so.5.6
new file mode 100755
index 00000000..4acbc076
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libpanel.so.5.6
Binary files differ
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libssl.so b/src/boot-env/preboot/uclib-rootfs/usr/lib/libssl.so
new file mode 120000
index 00000000..7874414f
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libssl.so
@@ -0,0 +1 @@
+libssl.so.0.9.8 \ No newline at end of file
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libssl.so.0.9.8 b/src/boot-env/preboot/uclib-rootfs/usr/lib/libssl.so.0.9.8
new file mode 100755
index 00000000..194078c5
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libssl.so.0.9.8
Binary files differ
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/sbin/kdump b/src/boot-env/preboot/uclib-rootfs/usr/sbin/kdump
new file mode 100755
index 00000000..07226a4b
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/sbin/kdump
Binary files differ
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/sbin/kexec b/src/boot-env/preboot/uclib-rootfs/usr/sbin/kexec
new file mode 100755
index 00000000..cc49c45c
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/sbin/kexec
Binary files differ
diff --git a/src/boot-env/syslinux/LICENSE b/src/boot-env/syslinux/LICENSE
new file mode 100644
index 00000000..7233bc7e
--- /dev/null
+++ b/src/boot-env/syslinux/LICENSE
@@ -0,0 +1,3 @@
+This package is free software distributed under the GPL version 2.
+See http://openslx.org/COPYING. For additional information on the
+SYSLINUX component by H.P. Anwin check http://syslinux.zytor.com!
diff --git a/src/boot-env/syslinux/README.iso b/src/boot-env/syslinux/README.iso
new file mode 100644
index 00000000..f9abdbea
--- /dev/null
+++ b/src/boot-env/syslinux/README.iso
@@ -0,0 +1,6 @@
+You seem to have the OpenSLX network demo CD/DVD still in your optical
+drive! This is not required. You may safely remove the medium just
+after the first kernel/initramfs is loaded ...
+
+If you have any feedback please consult http://openslx.org/feedback
+and send your comments to feedback@openslx.org!
diff --git a/src/boot-env/syslinux/README.pxe b/src/boot-env/syslinux/README.pxe
new file mode 100644
index 00000000..9a14ee52
--- /dev/null
+++ b/src/boot-env/syslinux/README.pxe
@@ -0,0 +1,68 @@
+The PXE stuff uses HPAs syslinux, see http://syslinux.zytor.com!
+
+Example how the PXElinux information is gathered:
+
+############################## PXElinux-menu file ##############################
+##### first static information is written, can't be changed #####
+##### override with include-menu (except DEFAULT vesamenu.c32) #####
+# #
+# DEFAULT vesamenu.c32 #
+# NOESCAPE 0 #
+# PROMPT 0 #
+# #
+##### then theme specific information is written (if theme specified) #####
+##### #####
+# #
+# MENU BACKGROUND openslx.png #
+# MENU WIDTH 78 #
+# . #
+# . #
+# menu color unsel 37;40 #fff0f0f0 #ff8093a1 std #
+# . #
+# . #
+# . #
+# #
+##### now slxsettings configuration is being read #####
+##### #####
+# #
+# TIMEOUT 100 #
+# TOTALTIMEOUT 600 #
+# MENU MASTER PASSWD secret #
+# MENU TITLE Welcome to OpenSLX #
+# #
+##### after this /etc/opt/openslx/boot-env/syslinux/pxemenu-include is #####
+##### included if it is existing, overriding above statements #####
+# #
+# MENU PASSPROMPT Gesicherter Bereich, bitte Passwort eingeben: #
+# MENU AUTOBOOT Auswahl startet in # Sekunden #
+# . #
+# . #
+# . #
+# #
+##### at this point the system labels are being included #####
+##### #####
+# #
+# LABEL openslx-suse-11.0-default::nfs #
+# MENU LABEL ^SUSE 11.0 System / NFS #
+# KERNEL suse-11.0-default/vmlinuz-2.6.25.20-0.1-pae #
+# APPEND quiet vga=791 initrd=suse-11.0-default/initramfs-1 file #
+# IPAPPEND 3 #
+# TEXT HELP #
+# OpenSUSE 11.0 System #
+# ENDTEXT #
+# . #
+# . #
+# . #
+# #
+##### at the end /etc/opt/openslx/boot-env/syslinux/pxemenu-bottom is #####
+##### being incl. if existing #####
+##### please specify only systems and further menus #####
+# #
+# MENU SEPARATOR #
+# LABEL test #
+# MENU LABEL ^Testmenu #
+# MENU PASSWD test #
+# KERNEL pxechain.com #
+# APPEND 192.168.1.1::pxelinux.0 #
+# #
+########################## End of PXElinux-menu file ###########################
diff --git a/src/boot-env/syslinux/extlinux b/src/boot-env/syslinux/extlinux
new file mode 100755
index 00000000..69d8bf56
--- /dev/null
+++ b/src/boot-env/syslinux/extlinux
Binary files differ
diff --git a/src/boot-env/syslinux/initramfs-shutdown b/src/boot-env/syslinux/initramfs-shutdown
new file mode 100644
index 00000000..3e4376bd
--- /dev/null
+++ b/src/boot-env/syslinux/initramfs-shutdown
Binary files differ
diff --git a/src/boot-env/syslinux/isolinux.bin b/src/boot-env/syslinux/isolinux.bin
new file mode 100644
index 00000000..bd778b3b
--- /dev/null
+++ b/src/boot-env/syslinux/isolinux.bin
Binary files differ
diff --git a/src/boot-env/syslinux/kernel-shutdown b/src/boot-env/syslinux/kernel-shutdown
new file mode 100644
index 00000000..ddb180dd
--- /dev/null
+++ b/src/boot-env/syslinux/kernel-shutdown
Binary files differ
diff --git a/src/boot-env/syslinux/mboot.c32 b/src/boot-env/syslinux/mboot.c32
new file mode 100755
index 00000000..929ade6f
--- /dev/null
+++ b/src/boot-env/syslinux/mboot.c32
Binary files differ
diff --git a/src/boot-env/syslinux/mbr.bin b/src/boot-env/syslinux/mbr.bin
new file mode 100644
index 00000000..8592b598
--- /dev/null
+++ b/src/boot-env/syslinux/mbr.bin
Binary files differ
diff --git a/src/boot-env/syslinux/menu.c32 b/src/boot-env/syslinux/menu.c32
new file mode 100755
index 00000000..67f9c29b
--- /dev/null
+++ b/src/boot-env/syslinux/menu.c32
Binary files differ
diff --git a/src/boot-env/syslinux/pxechain.com b/src/boot-env/syslinux/pxechain.com
new file mode 100644
index 00000000..8c4e0c5b
--- /dev/null
+++ b/src/boot-env/syslinux/pxechain.com
Binary files differ
diff --git a/src/boot-env/syslinux/pxelinux.0 b/src/boot-env/syslinux/pxelinux.0
new file mode 100644
index 00000000..0df4fbed
--- /dev/null
+++ b/src/boot-env/syslinux/pxelinux.0
Binary files differ
diff --git a/src/boot-env/syslinux/pxemenu-bottom.example b/src/boot-env/syslinux/pxemenu-bottom.example
new file mode 100644
index 00000000..29ceee3c
--- /dev/null
+++ b/src/boot-env/syslinux/pxemenu-bottom.example
@@ -0,0 +1,39 @@
+# this include file will be loaded at the bottom of the menu after the system
+# labels, please define only further menus and systems
+# for theme configuration use theme.conf in your theme directory
+# general settings can be set via slxsettings
+# please copy to pxemenu-bottom if needed
+
+## example: shutdown label in menu
+#LABEL shutdown
+# MENU LABEL ^Shutdown PC
+# KERNEL kernel-shutdown
+# APPEND initrd=initramfs-shutdown quiet
+
+## help label not selectable
+#LABEL help
+# MENU LABEL Press 'F1' for help
+# MENU DISABLE
+
+## example: add an additional menu on the same tftp server
+#LABEL test
+# MENU LABEL ^Testmeu
+# KERNEL vesamenu.c32
+# APPEND testmenu
+
+## example: add an additional menu on a different tftp server, with passwd
+#LABEL test2
+# MENU LABEL ^Testmeu
+# MENU PASSWD test
+# KERNEL pxechain.com
+# APPEND 192.168.101.102::pxelinux.0
+
+## example blank line / menu separator
+#MENU SEPARATOR
+
+## example localboot with passwd
+#LABEL local
+# MENU LABEL Boot from local ^Harddisk
+# MENU PASSWD local
+# localboot 0
+
diff --git a/src/boot-env/syslinux/pxemenu-include.example b/src/boot-env/syslinux/pxemenu-include.example
new file mode 100644
index 00000000..c09f8e70
--- /dev/null
+++ b/src/boot-env/syslinux/pxemenu-include.example
@@ -0,0 +1,58 @@
+# this include file will be loaded at the end of theme and slxsettings
+# configuration but right before the system labels
+# it will overwrite existing defs
+# for theme configuration use theme.conf in your theme directory
+# general settings can be set via slxsettings
+# please copy to pxemenu-include if needed
+
+## example german help:
+#MENU PASSPROMPT Gesicherter Bereich, bitte Passwort eingeben:
+#MENU AUTOBOOT Auswahl startet in # Sekunden
+
+## example: shutdown on timeout
+#ONTIMEOUT shutdown
+#LABEL shutdown
+# MENU HIDE
+# KERNEL kernel-shutdown
+# APPEND initrd=initramfs-shutdown quiet
+
+## example: shutdown label in menu
+#LABEL shutdown2
+# MENU LABEL ^Shutdown PC
+# KERNEL kernel-shutdown
+# APPEND initrd=initramfs-shutdown quiet
+
+## help/... text on F1 keypress
+#F1 help_01.txt
+## optionally with info
+#LABEL help
+# MENU LABEL Press 'F1' for help
+# MENU DISABLE
+
+## example: add an additional menu on the same tftp server
+#LABEL test
+# MENU LABEL ^Testmeu
+# KERNEL vesamenu.c32
+# APPEND testmenu
+
+## example: add an additional menu on a different tftp server, with passwd
+#LABEL test2
+# MENU LABEL ^Testmeu
+# MENU PASSWD test
+# KERNEL pxechain.com
+# APPEND 192.168.101.102::pxelinux.0
+
+## example non-selectable line
+#LABEL -
+# MENU LABEL ________________________________________________________
+# MENU DISABLE
+
+## example blank line / menu separator
+#MENU SEPARATOR
+
+## example localboot with passwd
+#LABEL local
+# MENU LABEL Boot from local ^Harddisk
+# MENU PASSWD local
+# localboot 0
+
diff --git a/src/boot-env/syslinux/syslinux b/src/boot-env/syslinux/syslinux
new file mode 100755
index 00000000..92b1b907
--- /dev/null
+++ b/src/boot-env/syslinux/syslinux
Binary files differ
diff --git a/src/boot-env/syslinux/themes/openslx/openslx.png b/src/boot-env/syslinux/themes/openslx/openslx.png
new file mode 100644
index 00000000..ccf8cc0a
--- /dev/null
+++ b/src/boot-env/syslinux/themes/openslx/openslx.png
Binary files differ
diff --git a/src/boot-env/syslinux/themes/openslx/theme.conf b/src/boot-env/syslinux/themes/openslx/theme.conf
new file mode 100644
index 00000000..e28562d6
--- /dev/null
+++ b/src/boot-env/syslinux/themes/openslx/theme.conf
@@ -0,0 +1,40 @@
+# openslx theme style definition
+# please define only look of your theme
+# for non-theme definitions use slxsettings
+# or include file in /etc/opt/openslx/boot-env/syslinux/pxemenu-include
+
+MENU BACKGROUND openslx.png
+MENU WIDTH 78
+MENU MARGIN 9
+MENU PASSWORDMARGIN 9
+MENU ROWS 10
+MENU TABMSGROW 16
+MENU CMDLINEROW 16
+MENU ENDROW -1
+MENU PASSWORDROW 16
+MENU TIMEOUTROW 20
+MENU HELPMSGROW 16
+MENU HELPMSGENDROW -1
+MENU HSHIFT 0
+MENU VSHIFT 7
+
+menu color screen 37;40 #80ffffff #00000000 std
+menu color border 37;40 #40000000 #ff8093a1 std
+menu color title 1;37;40 #ffff8b00 #ff8093a1 std
+menu color unsel 37;40 #fff0f0f0 #ff8093a1 std
+menu color hotkey 1;37;40 #ffff8b00 #ff8093a1 std
+menu color sel 7;37;40 #ff1c2a33 #667799bb all
+menu color hotsel 1;7;37;40 #ffff8b00 #667799bb all
+menu color disabled 1;37;40 #ffff8b00 #ff8093a1 std
+menu color scrollbar 37;40 #40000000 #ee000000 std
+menu color tabmsg 37;40 #ffff8b00 #ff8093a1 std
+menu color cmdmark 1;37;40 #ffff8b00 #ff8093a1 std
+menu color cmdline 37;40 #fff0f0f0 #ff8093a1 std
+menu color pwdborder 37;40 #40000000 #ff8093a1 std
+menu color pwdheader 37;40 #ffff8b00 #ff8093a1 std
+menu color pwdentry 37;40 #ffff8b00 #ff8093a1 std
+menu color timeout_msg 37;40 #fff0f0f0 #ff8093a1 std
+menu color timeout 1;37;40 #ffff8b00 #ff8093a1 std
+menu color help 37;40 #ff1c2a33 #00000000 none
+MENU MSGCOLOR #ff1c2a33 #00000000 none
+
diff --git a/src/boot-env/syslinux/themes/openslxpbs/openslx.png b/src/boot-env/syslinux/themes/openslxpbs/openslx.png
new file mode 100644
index 00000000..fefbfdf3
--- /dev/null
+++ b/src/boot-env/syslinux/themes/openslxpbs/openslx.png
Binary files differ
diff --git a/src/boot-env/syslinux/themes/openslxpbs/theme.conf b/src/boot-env/syslinux/themes/openslxpbs/theme.conf
new file mode 100644
index 00000000..e28562d6
--- /dev/null
+++ b/src/boot-env/syslinux/themes/openslxpbs/theme.conf
@@ -0,0 +1,40 @@
+# openslx theme style definition
+# please define only look of your theme
+# for non-theme definitions use slxsettings
+# or include file in /etc/opt/openslx/boot-env/syslinux/pxemenu-include
+
+MENU BACKGROUND openslx.png
+MENU WIDTH 78
+MENU MARGIN 9
+MENU PASSWORDMARGIN 9
+MENU ROWS 10
+MENU TABMSGROW 16
+MENU CMDLINEROW 16
+MENU ENDROW -1
+MENU PASSWORDROW 16
+MENU TIMEOUTROW 20
+MENU HELPMSGROW 16
+MENU HELPMSGENDROW -1
+MENU HSHIFT 0
+MENU VSHIFT 7
+
+menu color screen 37;40 #80ffffff #00000000 std
+menu color border 37;40 #40000000 #ff8093a1 std
+menu color title 1;37;40 #ffff8b00 #ff8093a1 std
+menu color unsel 37;40 #fff0f0f0 #ff8093a1 std
+menu color hotkey 1;37;40 #ffff8b00 #ff8093a1 std
+menu color sel 7;37;40 #ff1c2a33 #667799bb all
+menu color hotsel 1;7;37;40 #ffff8b00 #667799bb all
+menu color disabled 1;37;40 #ffff8b00 #ff8093a1 std
+menu color scrollbar 37;40 #40000000 #ee000000 std
+menu color tabmsg 37;40 #ffff8b00 #ff8093a1 std
+menu color cmdmark 1;37;40 #ffff8b00 #ff8093a1 std
+menu color cmdline 37;40 #fff0f0f0 #ff8093a1 std
+menu color pwdborder 37;40 #40000000 #ff8093a1 std
+menu color pwdheader 37;40 #ffff8b00 #ff8093a1 std
+menu color pwdentry 37;40 #ffff8b00 #ff8093a1 std
+menu color timeout_msg 37;40 #fff0f0f0 #ff8093a1 std
+menu color timeout 1;37;40 #ffff8b00 #ff8093a1 std
+menu color help 37;40 #ff1c2a33 #00000000 none
+MENU MSGCOLOR #ff1c2a33 #00000000 none
+
diff --git a/src/boot-env/syslinux/vesamenu.c32 b/src/boot-env/syslinux/vesamenu.c32
new file mode 100755
index 00000000..804e2fb8
--- /dev/null
+++ b/src/boot-env/syslinux/vesamenu.c32
Binary files differ
diff --git a/src/config-db/OpenSLX/AttributeRoster.pm b/src/config-db/OpenSLX/AttributeRoster.pm
new file mode 100644
index 00000000..88d6295f
--- /dev/null
+++ b/src/config-db/OpenSLX/AttributeRoster.pm
@@ -0,0 +1,537 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# AttributeRoster.pm
+# - provides information about all available attributes
+# -----------------------------------------------------------------------------
+package OpenSLX::AttributeRoster;
+
+use strict;
+use warnings;
+
+use Digest::MD5 qw(md5_hex);
+
+use OpenSLX::Basics;
+use OpenSLX::OSPlugin::Engine;
+use OpenSLX::OSPlugin::Roster;
+use OpenSLX::Utils;
+
+my %AttributeInfo;
+
+#=item C<_init()>
+#
+#Integrates info about all known attributes (from core and from the plugins)
+#into one big hash.
+#Returns info about all attributes.
+#
+#=cut
+#
+sub _init
+{
+ my $class = shift;
+
+ # set core attributes
+ %AttributeInfo = (
+ 'automnt_dir' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ !!!descriptive text missing here!!!
+ End-of-Here
+ content_regex => undef,
+ content_descr => undef,
+ default => '',
+ },
+ 'automnt_src' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ !!!descriptive text missing here!!!
+ End-of-Here
+ content_regex => undef,
+ content_descr => undef,
+ default => '',
+ },
+ 'boot_type' => {
+ applies_to_systems => 0,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Selects the boot technology for this client.
+ Currently the following boot types are supported:
+ pxe (is the default)
+ uses PXE to boot client over LAN
+ preboot
+ generates a set of images (see preboot_media) that can
+ be used to remotely boot the systems referred to by
+ this client
+ pbs
+ preboot server (experimental)
+ End-of-Here
+ content_regex => qr{^(pxe|preboot|pbs)$},
+ content_descr => '"pxe" or "preboot"',
+ default => 'pxe',
+ },
+ 'boot_uri' => {
+ applies_to_systems => 0,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ specifies the wget(able) address of the remote bootloader
+ archive that shall be loaded from the preboot environment
+ End-of-Here
+ content_regex => undef,
+ content_descr => 'an uri supported by wget',
+ default => '',
+ },
+ 'country' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ !!!descriptive text missing here!!!
+ End-of-Here
+ content_regex => undef,
+ content_descr => undef,
+ default => 'de',
+ },
+ 'hidden' => {
+ applies_to_systems => 1,
+ applies_to_clients => 0,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ specifies whether or not this system is offered for booting
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '0: system is bootable - 1: system is hidden',
+ default => '0',
+ },
+ 'kernel_params' => {
+ applies_to_systems => 1,
+ applies_to_clients => 0,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ params to build kernel cmdline for this system
+ End-of-Here
+ content_regex => undef,
+ content_descr => 'kernel cmdline fragment',
+ default => 'quiet',
+ },
+ 'kernel_params_client' => {
+ applies_to_systems => 0,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ client-specific params for kernel cmdline
+ End-of-Here
+ content_regex => undef,
+ content_descr => 'kernel cmdline fragment',
+ default => '',
+ },
+ 'preboot_media' => {
+ applies_to_systems => 0,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ List of preboot media supported by this client.
+ Currently the following preboot media are supported:
+ cd
+ generates a bootable CD-image that can be used to
+ remotely boot the systems referred to by this client
+ End-of-Here
+ content_regex => undef,
+ content_descr => undef,
+ default => '',
+ },
+ 'preboot_server' => {
+ applies_to_systems => 0,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ !!experimental!! specifies location of openslx-preboot-server
+ End-of-Here
+ content_regex => undef,
+ content_descr => undef,
+ default => '',
+ },
+ 'ramfs_fsmods' => {
+ applies_to_systems => 1,
+ applies_to_clients => 0,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ list of filesystem kernel modules to load
+ End-of-Here
+ content_regex => undef,
+ content_descr => undef,
+ default => '',
+ },
+ 'ramfs_miscmods' => {
+ applies_to_systems => 1,
+ applies_to_clients => 0,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ list of miscellaneous kernel modules to load
+ End-of-Here
+ content_regex => undef,
+ content_descr => undef,
+ default => '',
+ },
+ 'ramfs_nicmods' => {
+ applies_to_systems => 1,
+ applies_to_clients => 0,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ list of network card modules to load
+ End-of-Here
+ content_regex => qr{^\s*([-\w]+\s*)*$},
+ content_descr => 'a space-separated list of NIC modules',
+ default => 'forcedeth e1000 e100 tg3 via-rhine r8169 pcnet32',
+ },
+ 'hw_local_disk' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ how to handle local disk deploament - no/slxonly/all
+ End-of-Here
+ content_regex => undef,
+ content_descr => 'how to handle local disk (no/slxonly/all)',
+ default => 'all',
+ },
+ 'scratch' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ !!!descriptive text missing here!!!
+ End-of-Here
+ content_regex => undef,
+ content_descr => undef,
+ default => '',
+ },
+ 'start_atd' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ !!!descriptive text missing here!!!
+ End-of-Here
+ content_regex => undef,
+ content_descr => undef,
+ default => 'no',
+ },
+ 'start_cron' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ !!!descriptive text missing here!!!
+ End-of-Here
+ content_regex => undef,
+ content_descr => undef,
+ default => 'no',
+ },
+ 'start_dreshal' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ !!!descriptive text missing here!!!
+ End-of-Here
+ content_regex => undef,
+ content_descr => undef,
+ default => 'yes',
+ },
+ 'start_ntp' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ !!!descriptive text missing here!!!
+ End-of-Here
+ content_regex => undef,
+ content_descr => undef,
+ default => 'initial',
+ },
+ 'start_nfsv4' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ !!!descriptive text missing here!!!
+ End-of-Here
+ content_regex => undef,
+ content_descr => undef,
+ default => 'no',
+ },
+ 'start_snmp' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ !!!descriptive text missing here!!!
+ End-of-Here
+ content_regex => undef,
+ content_descr => undef,
+ default => 'no',
+ },
+ 'start_sshd' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ !!!descriptive text missing here!!!
+ End-of-Here
+ content_regex => undef,
+ content_descr => undef,
+ default => 'yes',
+ },
+ 'timezone' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ textual timezone (e.g. 'Europe/Berlin')
+ End-of-Here
+ content_regex => undef,
+ content_descr => undef,
+ default => 'Europe/Berlin',
+ },
+ 'unbootable' => {
+ applies_to_systems => 0,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ specifies whether or not this client is allowed to boot
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '0: client can boot - 1: client is blocked',
+ default => '0',
+ },
+ );
+
+ # and add all plugin attributes, too
+ OpenSLX::OSPlugin::Roster->addAllStage3AttributesToHash(\%AttributeInfo);
+
+ return 1;
+}
+
+=item C<getAttrInfo()>
+
+Returns info about all attributes.
+
+=over
+
+=item Return Value
+
+An hash-ref with info about all known attributes.
+
+=back
+
+=cut
+
+sub getAttrInfo
+{
+ my $class = shift;
+ my $params = shift || {};
+
+ $class->_init() if !%AttributeInfo;
+
+ if (defined $params->{name}) {
+ my $attrInfo = $AttributeInfo{$params->{name}};
+ return if !defined $attrInfo;
+ return { $params->{name} => $AttributeInfo{$params->{name}} };
+ }
+ elsif (defined $params->{scope}) {
+ my %MatchingAttributeInfo;
+ my $selectedScope = lc($params->{scope});
+ foreach my $attr (keys %AttributeInfo) {
+ my $attrScope = '';
+ if ($attr =~ m{^(.+?)::}) {
+ $attrScope = lc($1);
+ }
+ if ((!$attrScope && $selectedScope eq 'core')
+ || $attrScope eq $selectedScope) {
+ $MatchingAttributeInfo{$attr} = $AttributeInfo{$attr};
+ }
+ }
+ return \%MatchingAttributeInfo;
+ }
+
+ return \%AttributeInfo;
+}
+
+=item C<getStage3Attrs()>
+
+Returns the stage3 attribute names (which apply to systems or clients).
+
+=over
+
+=item Return Value
+
+An array of attribute names.
+
+=back
+
+=cut
+
+sub getStage3Attrs
+{
+ my $class = shift;
+
+ $class->_init() if !%AttributeInfo;
+
+ return
+ grep {
+ $AttributeInfo{$_}->{applies_to_systems}
+ || $AttributeInfo{$_}->{applies_to_client}
+ }
+ keys %AttributeInfo
+}
+
+=item C<getSystemAttrs()>
+
+Returns the attribute names that apply to systems.
+
+=over
+
+=item Return Value
+
+An array of attribute names.
+
+=back
+
+=cut
+
+sub getSystemAttrs
+{
+ my $class = shift;
+
+ $class->_init() if !%AttributeInfo;
+
+ return
+ grep { $AttributeInfo{$_}->{"applies_to_systems"} }
+ keys %AttributeInfo
+}
+
+=item C<getClientAttrs()>
+
+Returns the attribute names that apply to clients.
+
+=over
+
+=item Return Value
+
+An array of attribute names.
+
+=back
+
+=cut
+
+sub getClientAttrs
+{
+ my $class = shift;
+
+ $class->_init() if !%AttributeInfo;
+
+ return
+ grep { $AttributeInfo{$_}->{"applies_to_clients"} }
+ keys %AttributeInfo
+}
+
+=item C<findProblematicValues()>
+
+Checks if the given stage3 attribute values are allowed (and make sense).
+
+This method returns an array-ref of problems found. If there were no problems,
+this methods returns undef.
+
+=cut
+
+sub findProblematicValues
+{
+ my $class = shift;
+ my $stage3Attrs = shift || {};
+ my $vendorOSName = shift;
+ my $installedPlugins = shift;
+
+ $class->_init() if !%AttributeInfo;
+
+ my @problems;
+
+ my %attrsByPlugin;
+ foreach my $key (sort keys %{$stage3Attrs}) {
+ my $value = $stage3Attrs->{$key};
+ if ($key =~ m{^(.+)::.+?$}) {
+ my $pluginName = $1;
+ if ($installedPlugins
+ && !grep { $_->{plugin_name} eq $pluginName } @$installedPlugins) {
+ # avoid checking attributes of plugins that are not installed
+ next;
+ }
+ $attrsByPlugin{$pluginName} ||= {};
+ $attrsByPlugin{$pluginName}->{$key} = $value;
+ }
+
+ # undefined values are always allowed
+ next if !defined $value;
+
+ # check the value against the regex of the attribute (if any)
+ my $attrInfo = $AttributeInfo{$key};
+ if (!$attrInfo) {
+ push @problems, _tr('attribute "%s" is unknown!', $key);
+ next;
+ }
+ my $regex = $attrInfo->{content_regex};
+ if ($regex && $value !~ $regex) {
+ push @problems, _tr(
+ "the value '%s' for attribute %s is not allowed.\nAllowed values are: %s",
+ $value, $key, $attrInfo->{content_descr}
+ );
+ }
+ }
+
+ # if no vendorOS-name has been provided or there are no plugins installed,
+ # we can't do any further checks
+ if ($vendorOSName && $installedPlugins) {
+ # now give each installed plugin a chance to check it's own attributes
+ # by itself
+ foreach my $pluginInfo (
+ sort { $a->{plugin_name} cmp $b->{plugin_name} } @$installedPlugins
+ ) {
+ my $pluginName = $pluginInfo->{plugin_name};
+ vlog 2, "checking attrs of plugin: $pluginName\n";
+ # create & start OSPlugin-engine for vendor-OS and current plugin
+ my $engine = OpenSLX::OSPlugin::Engine->new;
+ if (!$engine->initialize($pluginName, $vendorOSName)) {
+ warn _tr(
+ 'unable to create engine for plugin "%s"!', $pluginName
+ );
+ next;
+ }
+ $engine->checkStage3AttrValues(
+ $attrsByPlugin{$pluginName}, \@problems
+ );
+ }
+ }
+
+ return if !@problems;
+
+ return \@problems;
+}
+
+=item C<computeMD5HashOverAllAttrs()>
+
+Returns a MD5 hash representing the list of all attributes (including plugins).
+
+=cut
+
+sub computeMD5HashOverAllAttrs
+{
+ my $class = shift;
+
+ $class->_init() if !%AttributeInfo;
+
+ my %attrNames;
+ @attrNames{keys %AttributeInfo} = ();
+
+ my $pluginInfo = OpenSLX::OSPlugin::Roster->getAvailablePlugins();
+ if ($pluginInfo) {
+ foreach my $pluginName (sort keys %$pluginInfo) {
+ my $attrInfo
+ = OpenSLX::OSPlugin::Roster->getPluginAttrInfo($pluginName);
+ @attrNames{keys %$attrInfo} = ();
+ }
+ }
+
+ my $attrNamesAsString = join ',', sort keys %attrNames;
+
+ return md5_hex($attrNamesAsString);
+}
+
+1;
diff --git a/src/config-db/OpenSLX/ConfigDB.pm b/src/config-db/OpenSLX/ConfigDB.pm
new file mode 100644
index 00000000..89011246
--- /dev/null
+++ b/src/config-db/OpenSLX/ConfigDB.pm
@@ -0,0 +1,3190 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+package OpenSLX::ConfigDB;
+
+use strict;
+use warnings;
+
+our (@ISA, @EXPORT_OK, %EXPORT_TAGS, $VERSION);
+$VERSION = 1; # API-version
+
+use Clone qw(clone);
+use File::Basename;
+
+use Exporter;
+@ISA = qw(Exporter);
+
+=pod
+
+=head1 NAME
+
+OpenSLX::ConfigDB - the configuration database API class for OpenSLX
+
+=head1 SYNOPSIS
+
+ use OpenSLX::ConfigDB;
+
+ openslxInit();
+
+ my $openslxDB = OpenSLX::ConfigDB->new();
+ $openslxDB->connect();
+
+ # fetch a client by name:
+ my $defaultClient = $openslxDB->fetchClientByFilter({'name' => '<<<default>>>'})
+
+ # fetch all systems:
+ my @systems = $openslxDB->fetchSystemByFilter();
+
+=head1 DESCRIPTION
+
+This class defines the OpenSLX API to the config database (the data layer to
+the outside world).
+
+The ConfigDB interface contains of five different parts:
+
+=over
+
+=item - L<basic methods> (connection handling)
+
+=item - L<data access methods> (getting data)
+
+=item - L<data manipulation methods> (adding, removing and changing data)
+
+=item - L<data aggregation methods> (getting info about the resulting
+configurations after mixing individual client-, group- and system-
+configurations).
+
+=item - L<suppport functions> (useful helpers)
+
+=back
+
+=head1 Special Concepts
+
+=over
+
+=item C<Filters>
+
+A filter is a hash-ref defining the filter criteria to be applied to a database
+query. Each key of the filter corresponds to a DB column and the (hash-)value
+contains the respective column value.
+
+[At a later stage, this will be improved to support a more structured approach
+to filtering (with boolean operators and hierarchical expressions)].
+
+=back
+
+=cut
+
+my @supportExports = qw(
+ mergeAttributes pushAttributes
+ externalIDForSystem externalIDForClient externalConfigNameForClient
+ generatePlaceholderFor
+);
+
+@EXPORT_OK = (@supportExports);
+%EXPORT_TAGS = ('support' => [@supportExports],);
+
+use OpenSLX::AttributeRoster;
+use OpenSLX::Basics;
+use OpenSLX::DBSchema;
+use OpenSLX::OSPlugin::Roster;
+use OpenSLX::Utils;
+
+=head1 Methods
+
+=head2 Basic Methods
+
+=over
+
+=cut
+
+=item C<new()>
+
+Returns an object representing a database handle to the config database.
+
+=cut
+
+sub new
+{
+ my $class = shift;
+
+ my $self = {
+ 'db-schema' => OpenSLX::DBSchema->new,
+ };
+
+ return bless $self, $class;
+}
+
+=item C<connect()>
+
+Tries to establish a connection to the database specified via the db-...
+settings.
+The global configuration hash C<%openslxConfig> contains further info about the
+requested connection. When implementing this method, you may have to look at
+the following entries in order to find out which database to connect to:
+
+=over
+
+=item C<$openslxConfig{'db-spec'}>
+
+Full specification of database, a special string defining the
+precise database to connect to (this allows connecting to a database
+that requires specifications which aren't cared for by the existing
+C<%config>-entries).
+
+=item C<$openslxConfig{'db-name'}>
+
+The precise name of the database that should be connected (defaults to 'openslx').
+
+=back
+
+=cut
+
+sub connect ## no critic (ProhibitBuiltinHomonyms)
+{
+ my $self = shift;
+ my $dbParams = shift; # hash-ref with any additional info that might be
+ # required by specific metadb-module (not used yet)
+
+ my $dbType = $openslxConfig{'db-type'};
+ # name of underlying database module...
+
+ my $dbModuleName = "OpenSLX/MetaDB/$dbType.pm";
+ my $dbModule = "OpenSLX::MetaDB::$dbType";
+ unless (eval { require $dbModuleName } ) {
+ if ($! == 2) {
+ die _tr(
+ "Unable to load DB-module <%s>\nthat database type is not supported (yet?)\n",
+ $dbModuleName
+ );
+ } else {
+ die _tr("Unable to load DB-module <%s> (%s)\n", $dbModuleName, $@);
+ }
+ }
+ my $metaDB = $dbModule->new();
+ if (!$metaDB->connect($dbParams)) {
+ warn _tr("Unable to connect to DB-module <%s>\n%s", $dbModuleName, $@);
+ warn _tr("These DB-modules seem to work ok:");
+ foreach my $dbMod ('mysql', 'SQLite') {
+ my $fullDbModName = "DBD/$dbMod.pm";
+ if (eval { require $fullDbModName }) {
+ vlog(0, "\t$dbMod\n");
+ }
+ }
+ die _tr(
+ 'Please use slxsettings if you want to switch to another db-type.'
+ );
+ }
+
+ $self->{'db-type'} = $dbType;
+ $self->{'meta-db'} = $metaDB;
+
+ $self->{'db-schema'}->checkAndUpgradeDBSchemaIfNecessary($self)
+ or die _tr('unable to check/update DB schema!');
+
+ # check if any attributes or plugins have been added/removed since
+ # last DB-session and bring the DB up-to-date, if so
+ my $pluginInfoHashVal
+ = OpenSLX::AttributeRoster->computeMD5HashOverAllAttrs();
+ my $pluginInfoHashValInDB = $metaDB->schemaFetchPluginInfoHashVal() || '';
+ vlog(1, "plugin-info-hashes: $pluginInfoHashVal <=> $pluginInfoHashValInDB");
+ if ($pluginInfoHashValInDB ne $pluginInfoHashVal) {
+ $self->cleanupAnyInconsistencies();
+ return if !$metaDB->schemaSetPluginInfoHashVal($pluginInfoHashVal);
+ }
+
+ return 1;
+}
+
+=item C<disconnect()>
+
+Tears down the connection to the database and cleans up.
+
+=cut
+
+sub disconnect
+{
+ my $self = shift;
+
+ $self->{'meta-db'}->disconnect();
+
+ return 1;
+}
+
+=item C<startTransaction()>
+
+Opens a database transaction - most useful if you want to make sure a couple of
+changes apply as a whole or not at all.
+
+=cut
+
+sub startTransaction
+{
+ my $self = shift;
+
+ $self->{'meta-db'}->startTransaction();
+
+ return 1;
+}
+
+=item C<commitTransaction()>
+
+Commits a database transaction - so all changes done inside of this transaction
+will be applied to the database.
+
+=cut
+
+sub commitTransaction
+{
+ my $self = shift;
+
+ $self->{'meta-db'}->commitTransaction();
+
+ return 1;
+}
+
+=item C<rollbackTransaction()>
+
+Revokes a database transaction - so all changes done inside of this transaction
+will be undone.
+
+=cut
+
+sub rollbackTransaction
+{
+ my $self = shift;
+
+ $self->{'meta-db'}->rollbackTransaction();
+
+ return 1;
+}
+
+=item C<cleanupAnyInconsistencies()>
+
+Looks for any inconsistencies (stale references, references to non-existing
+plugins, ...) and removes them from the DB.
+
+=cut
+
+sub cleanupAnyInconsistencies
+{
+ my $self = shift;
+
+ $self->synchronizeAttributesWithDB();
+
+ return if !$self->_removeStaleSystemAttributes();
+ return if !$self->_removeStaleGroupAttributes();
+ return if !$self->_removeStaleClientAttributes();
+ return if !$self->_removeStaleVendorOSAttributes();
+
+ return 1;
+}
+
+=item C<synchronizeAttributesWithDB()>
+
+Makes sure that all known attributes are referenced by the default system
+(and no unknown ones).
+
+Additionally, all systems, groups and clients can be checked and get their
+stale attributes removed, too.
+
+=cut
+
+sub synchronizeAttributesWithDB
+{
+ my $self = shift;
+
+ my $defaultSystem = $self->fetchSystemByID(0);
+ return if !$defaultSystem;
+
+ # fetch all known attributes from attribute roster and merge these
+ # into the existing attributes of the default system and client
+ my $attrInfo = OpenSLX::AttributeRoster->getAttrInfo();
+
+ # add new system attributes to default system
+ my @newSystemAttrs
+ = grep {
+ $attrInfo->{$_}->{applies_to_systems}
+ && !exists $defaultSystem->{attrs}->{$_}
+ } keys %{$attrInfo};
+ foreach my $attr (@newSystemAttrs) {
+ $defaultSystem->{attrs}->{$attr} = $attrInfo->{$attr}->{default};
+ }
+
+ # remove unknown system attributes from default system
+ my @unknownSystemAttrs
+ = grep {
+ !exists $attrInfo->{$_}
+ || !$attrInfo->{$_}->{applies_to_systems}
+ } keys %{$defaultSystem->{attrs}};
+ foreach my $unknownAttr (@unknownSystemAttrs) {
+ delete $defaultSystem->{attrs}->{$unknownAttr};
+ }
+
+ # now write back the updated default system if necessary
+ if (@newSystemAttrs || @unknownSystemAttrs) {
+ return if !$self->changeSystem(0, $defaultSystem);
+ }
+
+ my $defaultClient = $self->fetchClientByID(0);
+ return if !$defaultClient;
+
+ # add new client attributes to default client (deal only with
+ # attributes that are client-only)
+ my @newClientAttrs
+ = grep {
+ $attrInfo->{$_}->{applies_to_clients}
+ && !$attrInfo->{$_}->{applies_to_systems}
+ && !exists $defaultClient->{attrs}->{$_}
+ } keys %{$attrInfo};
+ foreach my $attr (@newClientAttrs) {
+ $defaultClient->{attrs}->{$attr} = $attrInfo->{$attr}->{default};
+ }
+
+ # remove unknown client attributes from default client (deal only with
+ # attributes that are client-only)
+ my @unknownClientAttrs
+ = grep {
+ !exists $attrInfo->{$_}
+ || !$attrInfo->{$_}->{applies_to_clients}
+ || $attrInfo->{$_}->{applies_to_systems}
+ } keys %{$defaultClient->{attrs}};
+ foreach my $unknownAttr (@unknownClientAttrs) {
+ delete $defaultClient->{attrs}->{$unknownAttr};
+ }
+
+ # now write back the updated default client if necessary
+ if (@newClientAttrs || @unknownClientAttrs) {
+ return if !$self->changeClient(0, $defaultClient);
+ }
+
+ return 1;
+}
+
+=item C<_removeStaleSystemAttributes()>
+
+Removes any stale attributes from every system.
+
+=cut
+
+sub _removeStaleSystemAttributes
+{
+ my $self = shift;
+
+ my $attrInfo = OpenSLX::AttributeRoster->getAttrInfo();
+
+ my @systems = $self->fetchSystemByFilter();
+ foreach my $system (@systems) {
+ my @unknownAttrs
+ = grep { !exists $attrInfo->{$_} } keys %{$system->{attrs}};
+ if (@unknownAttrs) {
+ foreach my $unknownAttr (@unknownAttrs) {
+ delete $system->{attrs}->{$unknownAttr};
+ }
+ return if !$self->changeSystem($system->{id}, $system);
+ }
+ }
+
+ return 1;
+}
+
+=item C<_removeStaleGroupAttributes()>
+
+Removes any stale attributes from every group.
+
+=cut
+
+sub _removeStaleGroupAttributes
+{
+ my $self = shift;
+
+ my $attrInfo = OpenSLX::AttributeRoster->getAttrInfo();
+
+ my @groups = $self->fetchGroupByFilter();
+ foreach my $group (@groups) {
+ my @unknownAttrs
+ = grep { !exists $attrInfo->{$_} } keys %{$group->{attrs}};
+ if (@unknownAttrs) {
+ foreach my $unknownAttr (@unknownAttrs) {
+ delete $group->{attrs}->{$unknownAttr};
+ }
+ return if !$self->changeGroup($group->{id}, $group);
+ }
+ }
+
+ return 1;
+}
+
+=item C<_removeStaleClientAttributes()>
+
+Removes any stale attributes from every client.
+
+=cut
+
+sub _removeStaleClientAttributes
+{
+ my $self = shift;
+
+ my $attrInfo = OpenSLX::AttributeRoster->getAttrInfo();
+
+ my @clients = $self->fetchClientByFilter();
+ foreach my $client (@clients) {
+ my @unknownAttrs
+ = grep { !exists $attrInfo->{$_} } keys %{$client->{attrs}};
+ if (@unknownAttrs) {
+ foreach my $unknownAttr (@unknownAttrs) {
+ delete $client->{attrs}->{$unknownAttr};
+ }
+ return if !$self->changeClient($client->{id}, $client);
+ }
+ }
+
+ return 1;
+}
+
+=item C<_removeStaleVendorOSAttributes()>
+
+Removes any stale attributes from every vendor-OS.
+
+=cut
+
+sub _removeStaleVendorOSAttributes
+{
+ my $self = shift;
+
+ my @vendorOSes = $self->fetchVendorOSByFilter();
+ foreach my $vendorOS (@vendorOSes) {
+ my @installedPlugins = $self->fetchInstalledPlugins($vendorOS->{id});
+ foreach my $plugin (@installedPlugins) {
+ my $pluginName = $plugin->{plugin_name};
+ my $attrInfo
+ = OpenSLX::OSPlugin::Roster->getPluginAttrInfo($pluginName);
+ if ($attrInfo) {
+ my @unknownAttrs
+ = grep { !exists $attrInfo->{$_} } keys %{$plugin->{attrs}};
+ if (@unknownAttrs) {
+ foreach my $unknownAttr (@unknownAttrs) {
+ delete $plugin->{attrs}->{$unknownAttr};
+ }
+ return if !$self->addInstalledPlugin(
+ $vendorOS->{id}, $pluginName, $plugin->{attrs}
+ );
+ }
+ }
+ else {
+ $self->removeInstalledPlugin($vendorOS->{id}, $pluginName);
+ }
+ }
+ }
+
+ return 1;
+}
+
+=back
+
+=head2 Data Access Methods
+
+=over
+
+=cut
+
+=item C<getColumnsOfTable($tableName)>
+
+Returns the names of the columns of the given table.
+
+=over
+
+=item Param C<tableName>
+
+The name of the DB-table whose columns you'd like to retrieve.
+
+=item Return Value
+
+An array of column names.
+
+=back
+
+=cut
+
+sub getColumnsOfTable
+{
+ my $self = shift;
+ my $tableName = shift;
+
+ return $self->{'db-schema'}->getColumnsOfTable($tableName);
+}
+
+=item C<fetchVendorOSByFilter([%$filter], [$resultCols])>
+
+Fetches and returns information about all vendor-OSes that match the given
+filter.
+
+=over
+
+=item Param C<filter>
+
+A hash-ref containing the filter criteria that shall be applied - default
+is no filtering. See L</"Filters"> for more info.
+
+=item Param C<resultCols>
+
+A string listing the columns that shall be returned - default is all columns.
+
+=item Return Value
+
+An array of hash-refs containing the resulting data rows.
+
+=back
+
+=cut
+
+sub fetchVendorOSByFilter
+{
+ my $self = shift;
+ my $filter = shift;
+ my $resultCols = shift;
+
+ my @vendorOS
+ = $self->{'meta-db'}->fetchVendorOSByFilter($filter, $resultCols);
+
+ return wantarray() ? @vendorOS : shift @vendorOS;
+}
+
+=item C<fetchVendorOSByID(@$ids, [$resultCols])>
+
+Fetches and returns information the vendor-OSes with the given IDs.
+
+=over
+
+=item Param C<ids>
+
+An array of the vendor-OS-IDs you are interested in.
+
+=item Param C<resultCols>
+
+A string listing the columns that shall be returned - default is all columns.
+
+=item Return Value
+
+An array of hash-refs containing the resulting data rows.
+
+=back
+
+=cut
+
+sub fetchVendorOSByID
+{
+ my $self = shift;
+ my $ids = _aref(shift);
+ my $resultCols = shift;
+
+ my @vendorOS = $self->{'meta-db'}->fetchVendorOSByID($ids, $resultCols);
+
+ return wantarray() ? @vendorOS : shift @vendorOS;
+}
+
+=item C<fetchInstalledPlugins($vendorOSID)>
+
+Returns the names of all plugins that have been installed into the given
+vendor-OS.
+
+=over
+
+=item Param C<vendorOSID>
+
+The id of the vendor-OS whose plugins you are interested in
+
+=item Param C<pluginName> [Optional]
+
+The name of a specific plugin you are interested in
+
+=item Return Value
+
+An array with the plugin names.
+
+=back
+
+=cut
+
+sub fetchInstalledPlugins
+{
+ my $self = shift;
+ my $vendorOSID = shift;
+ my $pluginName = shift;
+
+ $self->{'meta-db'}->fetchInstalledPlugins($vendorOSID, $pluginName);
+}
+
+=item C<fetchExportByFilter([%$filter], [$resultCols])>
+
+Fetches and returns information about all exports that match the given
+filter.
+
+=over
+
+=item Param C<filter>
+
+A hash-ref containing the filter criteria that shall be applied - default
+is no filtering. See L</"Filters"> for more info.
+
+=item Param C<resultCols>
+
+A string listing the columns that shall be returned - default is all columns.
+
+=item Return Value
+
+An array of hash-refs containing the resulting data rows.
+
+=back
+
+=cut
+
+sub fetchExportByFilter
+{
+ my $self = shift;
+ my $filter = shift;
+ my $resultCols = shift;
+
+ my @exports = $self->{'meta-db'}->fetchExportByFilter($filter, $resultCols);
+
+ return wantarray() ? @exports : shift @exports;
+}
+
+=item C<fetchExportByID(@$ids, [$resultCols])>
+
+Fetches and returns information the exports with the given IDs.
+
+=over
+
+=item Param C<ids>
+
+An array of the export-IDs you are interested in.
+
+=item Param C<resultCols>
+
+A string listing the columns that shall be returned - default is all columns.
+
+=item Return Value
+
+An array of hash-refs containing the resulting data rows.
+
+=back
+
+=cut
+
+sub fetchExportByID
+{
+ my $self = shift;
+ my $ids = _aref(shift);
+ my $resultCols = shift;
+
+ my @exports = $self->{'meta-db'}->fetchExportByID($ids, $resultCols);
+
+ return wantarray() ? @exports : shift @exports;
+}
+
+=item C<fetchExportIDsOfVendorOS($id)>
+
+Fetches the IDs of all exports that make use of the vendor-OS with the given ID.
+
+=over
+
+=item Param C<id>
+
+ID of the vendor-OS whose exports shall be returned.
+
+=item Return Value
+
+An array of system-IDs.
+
+=back
+
+=cut
+
+sub fetchExportIDsOfVendorOS
+{
+ my $self = shift;
+ my $vendorOSID = shift;
+
+ return $self->{'meta-db'}->fetchExportIDsOfVendorOS($vendorOSID);
+}
+
+=item C<fetchGlobalInfo($id)>
+
+Fetches the global info element specified by the given ID.
+
+=over
+
+=item Param C<id>
+
+The name of the global info value you are interested in.
+
+=item Return Value
+
+The value of the requested global info.
+
+=back
+
+=cut
+
+sub fetchGlobalInfo
+{
+ my $self = shift;
+ my $id = shift;
+
+ return $self->{'meta-db'}->fetchGlobalInfo($id);
+}
+
+=item C<fetchSystemByFilter([%$filter], [$resultCols])>
+
+Fetches and returns information about all systems that match the given filter.
+
+=over
+
+=item Param C<$filter>
+
+A hash-ref containing the filter criteria that shall be applied - default
+is no filtering. See L</"Filters"> for more info.
+
+=item Param C<$resultCols> [Optional]
+
+A comma-separated list of colunm names that shall be returned. If not defined,
+all available data must be returned.
+
+=item Param C<$attrFilter> [Optional]
+
+A hash-ref containing the filter criteria that shall be applied against
+attributes.
+
+=item Return Value
+
+An array of hash-refs containing the resulting data rows.
+
+=back
+
+=cut
+
+sub fetchSystemByFilter
+{
+ my $self = shift;
+ my $filter = shift;
+ my $resultCols = shift;
+ my $attrFilter = shift;
+
+ my @systems = $self->{'meta-db'}->fetchSystemByFilter(
+ $filter, $resultCols, $attrFilter
+ );
+
+ # unless specific result cols have been given, we mix in the attributes
+ # of each system, too:
+ if (!defined $resultCols) {
+ foreach my $system (@systems) {
+ $system->{attrs}
+ = $self->{'meta-db'}->fetchSystemAttrs($system->{id});
+ }
+ }
+
+ return wantarray() ? @systems : shift @systems;
+}
+
+=item C<fetchSystemByID(@$ids, [$resultCols])>
+
+Fetches and returns information the systems with the given IDs.
+
+=over
+
+=item Param C<ids>
+
+An array of the system-IDs you are interested in.
+
+=item Param C<resultCols>
+
+A string listing the columns that shall be returned - default is all columns.
+
+=item Return Value
+
+An array of hash-refs containing the resulting data rows.
+
+=back
+
+=cut
+
+sub fetchSystemByID
+{
+ my $self = shift;
+ my $ids = _aref(shift);
+ my $resultCols = shift;
+
+ my @systems = $self->{'meta-db'}->fetchSystemByID($ids, $resultCols);
+
+ # unless specific result cols have been given, we mix in the attributes
+ # of each system, too:
+ if (!defined $resultCols) {
+ foreach my $system (@systems) {
+ $system->{attrs}
+ = $self->{'meta-db'}->fetchSystemAttrs($system->{id});
+ }
+ }
+
+ return wantarray() ? @systems : shift @systems;
+}
+
+=item C<fetchSystemIDsOfExport($id)>
+
+Fetches the IDs of all systems that make use of the export with the given ID.
+
+=over
+
+=item Param C<id>
+
+ID of the export whose systems shall be returned.
+
+=item Return Value
+
+An array of system-IDs.
+
+=back
+
+=cut
+
+sub fetchSystemIDsOfExport
+{
+ my $self = shift;
+ my $exportID = shift;
+
+ return $self->{'meta-db'}->fetchSystemIDsOfExport($exportID);
+}
+
+=item C<fetchSystemIDsOfClient($id)>
+
+Fetches the IDs of all systems that are used by the client with the given
+ID.
+
+=over
+
+=item Param C<id>
+
+ID of the client whose systems shall be returned.
+
+=item Return Value
+
+An array of system-IDs.
+
+=back
+
+=cut
+
+sub fetchSystemIDsOfClient
+{
+ my $self = shift;
+ my $clientID = shift;
+
+ return $self->{'meta-db'}->fetchSystemIDsOfClient($clientID);
+}
+
+=item C<fetchSystemIDsOfGroup($id)>
+
+Fetches the IDs of all systems that are part of the group with the given
+ID.
+
+=over
+
+=item Param C<id>
+
+ID of the group whose systems shall be returned.
+
+=item Return Value
+
+An array of system-IDs.
+
+=back
+
+=cut
+
+sub fetchSystemIDsOfGroup
+{
+ my $self = shift;
+ my $groupID = shift;
+
+ return $self->{'meta-db'}->fetchSystemIDsOfGroup($groupID);
+}
+
+=item C<fetchClientByFilter([%$filter], [$resultCols])>
+
+Fetches and returns information about all clients that match the given filter.
+
+=over
+
+=item Param C<$filter>
+
+A hash-ref containing the filter criteria that shall be applied - default
+is no filtering. See L</"Filters"> for more info.
+
+=item Param C<$resultCols> [Optional]
+
+A comma-separated list of colunm names that shall be returned. If not defined,
+all available data must be returned.
+
+=item Return Value
+
+An array of hash-refs containing the resulting data rows.
+
+=back
+
+=cut
+
+sub fetchClientByFilter
+{
+ my $self = shift;
+ my $filter = shift;
+ my $resultCols = shift;
+ my $attrFilter = shift;
+
+ my @clients = $self->{'meta-db'}->fetchClientByFilter(
+ $filter, $resultCols, $attrFilter
+ );
+
+ # unless specific result cols have been given, we mix in the attributes
+ # of each client, too:
+ if (!defined $resultCols) {
+ foreach my $client (@clients) {
+ $client->{attrs}
+ = $self->{'meta-db'}->fetchClientAttrs($client->{id});
+ }
+ }
+
+ return wantarray() ? @clients : shift @clients;
+}
+
+=item C<fetchClientByID(@$ids, [$resultCols])>
+
+Fetches and returns information the clients with the given IDs.
+
+=over
+
+=item Param C<ids>
+
+An array of the client-IDs you are interested in.
+
+=item Param C<resultCols>
+
+A string listing the columns that shall be returned - default is all columns.
+
+=item Return Value
+
+An array of hash-refs containing the resulting data rows.
+
+=back
+
+=cut
+
+sub fetchClientByID
+{
+ my $self = shift;
+ my $ids = _aref(shift);
+ my $resultCols = shift;
+
+ my @clients = $self->{'meta-db'}->fetchClientByID($ids, $resultCols);
+
+ # unless specific result cols have been given, we mix in the attributes
+ # of each client, too:
+ if (!defined $resultCols) {
+ foreach my $client (@clients) {
+ $client->{attrs}
+ = $self->{'meta-db'}->fetchClientAttrs($client->{id});
+ }
+ }
+
+ return wantarray() ? @clients : shift @clients;
+}
+
+=item C<fetchClientIDsOfSystem($id)>
+
+Fetches the IDs of all clients that make use of the system with the given
+ID.
+
+=over
+
+=item Param C<id>
+
+ID of the system whose clients shall be returned.
+
+=item Return Value
+
+An array of client-IDs.
+
+=back
+
+=cut
+
+sub fetchClientIDsOfSystem
+{
+ my $self = shift;
+ my $systemID = shift;
+
+ return $self->{'meta-db'}->fetchClientIDsOfSystem($systemID);
+}
+
+=item C<fetchClientIDsOfGroup($id)>
+
+Fetches the IDs of all clients that are part of the group with the given
+ID.
+
+=over
+
+=item Param C<id>
+
+ID of the group whose clients shall be returned.
+
+=item Return Value
+
+An array of client-IDs.
+
+=back
+
+=cut
+
+sub fetchClientIDsOfGroup
+{
+ my $self = shift;
+ my $groupID = shift;
+
+ return $self->{'meta-db'}->fetchClientIDsOfGroup($groupID);
+}
+
+=item C<fetchGroupByFilter([%$filter], [$resultCols])>
+
+Fetches and returns information about all groups that match the given filter.
+
+=over
+
+=item Param C<$filter>
+
+A hash-ref containing the filter criteria that shall be applied - default
+is no filtering. See L</"Filters"> for more info.
+
+=item Param C<$resultCols> [Optional]
+
+A comma-separated list of colunm names that shall be returned. If not defined,
+all available data must be returned.
+
+=item Return Value
+
+An array of hash-refs containing the resulting data rows.
+
+=back
+
+=cut
+
+sub fetchGroupByFilter
+{
+ my $self = shift;
+ my $filter = shift;
+ my $resultCols = shift;
+ my $attrFilter = shift;
+
+ my @groups = $self->{'meta-db'}->fetchGroupByFilter(
+ $filter, $resultCols, $attrFilter
+ );
+
+ # unless specific result cols have been given, we mix in the attributes
+ # of each group, too:
+ if (!defined $resultCols) {
+ foreach my $group (@groups) {
+ $group->{attrs}
+ = $self->{'meta-db'}->fetchGroupAttrs($group->{id});
+ }
+ }
+
+ return wantarray() ? @groups : shift @groups;
+}
+
+=item C<fetchGroupByID(@$ids, [$resultCols])>
+
+Fetches and returns information the groups with the given IDs.
+
+=over
+
+=item Param C<ids>
+
+An array of the group-IDs you are interested in.
+
+=item Param C<resultCols>
+
+A string listing the columns that shall be returned - default is all columns.
+
+=item Return Value
+
+An array of hash-refs containing the resulting data rows.
+
+=back
+
+=cut
+
+sub fetchGroupByID
+{
+ my $self = shift;
+ my $ids = _aref(shift);
+ my $resultCols = shift;
+
+ my @groups = $self->{'meta-db'}->fetchGroupByID($ids, $resultCols);
+
+ # unless specific result cols have been given, we mix in the attributes
+ # of each group, too:
+ if (!defined $resultCols) {
+ foreach my $group (@groups) {
+ $group->{attrs}
+ = $self->{'meta-db'}->fetchGroupAttrs($group->{id});
+ }
+ }
+
+ return wantarray() ? @groups : shift @groups;
+}
+
+=item C<fetchGroupIDsOfSystem($id)>
+
+Fetches the IDs of all groups that contain the system with the given
+ID.
+
+=over
+
+=item Param C<id>
+
+ID of the system whose groups shall be returned.
+
+=item Return Value
+
+An array of client-IDs.
+
+=back
+
+=cut
+
+sub fetchGroupIDsOfSystem
+{
+ my $self = shift;
+ my $systemID = shift;
+
+ return $self->{'meta-db'}->fetchGroupIDsOfSystem($systemID);
+}
+
+=item C<fetchGroupIDsOfClient($id)>
+
+Fetches the IDs of all groups that contain the client with the given
+ID.
+
+=over
+
+=item Param C<id>
+
+ID of the client whose groups shall be returned.
+
+=item Return Value
+
+An array of client-IDs.
+
+=back
+
+=cut
+
+sub fetchGroupIDsOfClient
+{
+ my $self = shift;
+ my $clientID = shift;
+
+ return $self->{'meta-db'}->fetchGroupIDsOfClient($clientID);
+}
+
+=back
+
+=head2 Data Manipulation Methods
+
+=over
+
+=item C<addVendorOS(@$valRows)>
+
+Adds one or more vendor-OS to the database.
+
+=over
+
+=item Param C<valRows>
+
+An array-ref containing hash-refs with the data of the new vendor-OS(es).
+
+=item Return Value
+
+The IDs of the new vendor-OS(es), C<undef> if the creation failed.
+
+=back
+
+=cut
+
+sub addVendorOS
+{
+ my $self = shift;
+ my $valRows = _aref(shift);
+
+ _checkCols($valRows, 'vendor_os', 'name');
+
+ my @IDs = $self->{'meta-db'}->addVendorOS($valRows);
+ return wantarray() ? @IDs : $IDs[0];
+}
+
+=item C<removeVendorOS(@$vendorOSIDs)>
+
+Removes one or more vendor-OS from the database.
+
+=over
+
+=item Param C<vendorOSIDs>
+
+An array-ref containing the IDs of the vendor-OSes that shall be removed.
+
+=item Return Value
+
+C<1> if the vendorOS(es) could be removed, C<undef> if not.
+
+=back
+
+=cut
+
+sub removeVendorOS
+{
+ my $self = shift;
+ my $vendorOSIDs = _aref(shift);
+
+ # drop all installed plugins before removing the vendor-OS
+ foreach my $vendorOSID (@$vendorOSIDs) {
+ my @installedPlugins
+ = $self->{'meta-db'}->fetchInstalledPlugins($vendorOSID);
+ foreach my $plugin (@installedPlugins) {
+ my $pluginName = $plugin->{plugin_name};
+ $self->{'meta-db'}->removeInstalledPlugin($vendorOSID, $pluginName);
+ }
+ }
+ return $self->{'meta-db'}->removeVendorOS($vendorOSIDs);
+}
+
+=item C<changeVendorOS(@$vendorOSIDs, @$valRows)>
+
+Changes the data of one or more vendor-OS.
+
+=over
+
+=item Param C<vendorOSIDs>
+
+An array-ref containing the IDs of the vendor-OSes that shall be changed.
+
+=item Param C<valRows>
+
+An array-ref containing hash-refs with the new data for the vendor-OS(es).
+
+=item Return Value
+
+C<1> if the vendorOS(es) could be changed, C<undef> if not.
+
+=back
+
+=cut
+
+sub changeVendorOS
+{
+ my $self = shift;
+ my $vendorOSIDs = _aref(shift);
+ my $valRows = _aref(shift);
+
+ return $self->{'meta-db'}->changeVendorOS($vendorOSIDs, $valRows);
+}
+
+=item C<addInstalledPlugin($vendorOSID, $pluginName)>
+
+Adds a freshly installed plugin to a vendor-OS.
+
+=over
+
+=item Param C<vendorOSID>
+
+The id of the vendor-OS the given plugin has been installed into
+
+=item Param C<pluginName>
+
+The name of the plugin that has been installed
+
+=item Return Value
+
+The ID of the new reference entry, C<undef> if the creation failed.
+
+=back
+
+=cut
+
+sub addInstalledPlugin
+{
+ my $self = shift;
+ my $vendorOSID = shift;
+ my $pluginName = shift;
+ my $pluginAttrs = shift || {};
+
+ return $self->{'meta-db'}->addInstalledPlugin(
+ $vendorOSID, $pluginName, $pluginAttrs
+ );
+}
+
+=item C<removeInstalledPlugin($vendorOSID, $pluginName)>
+
+Removes a uninstalled plugin for a vendor-OS.
+
+=over
+
+=item Param C<vendorOSID>
+
+The id of the vendor-OS the given plugin has been uninstalled from
+
+=item Param C<pluginName>
+
+The name of the plugin that has been uninstalled
+
+=item Return Value
+
+1 if it worked, C<undef> if it didn't.
+
+=back
+
+=cut
+
+sub removeInstalledPlugin
+{
+ my $self = shift;
+ my $vendorOSID = shift;
+ my $pluginName = shift;
+
+ return $self->{'meta-db'}->removeInstalledPlugin($vendorOSID, $pluginName);
+}
+
+=item C<addExport(@$valRows)>
+
+Adds one or more export to the database.
+
+=over
+
+=item Param C<valRows>
+
+An array-ref containing hash-refs with the data of the new export(s).
+
+=item Return Value
+
+The IDs of the new export(s), C<undef> if the creation failed.
+
+=back
+
+=cut
+
+sub addExport
+{
+ my $self = shift;
+ my $valRows = _aref(shift);
+
+ _checkCols($valRows, 'export', qw(name vendor_os_id type));
+
+ my @IDs = $self->{'meta-db'}->addExport($valRows);
+ return wantarray() ? @IDs : $IDs[0];
+}
+
+=item C<removeExport(@$exportIDs)>
+
+Removes one or more export from the database.
+
+=over
+
+=item Param C<exportIDs>
+
+An array-ref containing the IDs of the exports that shall be removed.
+
+=item Return Value
+
+C<1> if the export(s) could be removed, C<undef> if not.
+
+=back
+
+=cut
+
+sub removeExport
+{
+ my $self = shift;
+ my $exportIDs = _aref(shift);
+
+ return $self->{'meta-db'}->removeExport($exportIDs);
+}
+
+=item C<changeExport(@$exportIDs, @$valRows)>
+
+Changes the data of one or more export.
+
+=over
+
+=item Param C<vendorOSIDs>
+
+An array-ref containing the IDs of the exports that shall be changed.
+
+=item Param C<valRows>
+
+An array-ref containing hash-refs with the new data for the export(s).
+
+=item Return Value
+
+C<1> if the export(s) could be changed, C<undef> if not.
+
+=back
+
+=cut
+
+sub changeExport
+{
+ my $self = shift;
+ my $exportIDs = _aref(shift);
+ my $valRows = _aref(shift);
+
+ return $self->{'meta-db'}->changeExport($exportIDs, $valRows);
+}
+
+=item C<incrementGlobalCounter($counterName)>
+
+Increments the global counter of the given name and returns the *old* value.
+
+=over
+
+=item Param C<counterName>
+
+The name of the global counter that shall be bumped.
+
+=item Return Value
+
+The value the global counter had before it was incremented.
+
+=back
+
+=cut
+
+sub incrementGlobalCounter
+{
+ my $self = shift;
+ my $counterName = shift;
+
+ $self->startTransaction();
+ my $value = $self->fetchGlobalInfo($counterName);
+ return unless defined $value;
+ my $newValue = $value + 1;
+ $self->changeGlobalInfo($counterName, $newValue);
+ $self->commitTransaction();
+
+ return $value;
+}
+
+=item C<changeGlobalInfo($id, $value)>
+
+Sets the global info element specified by the given ID to the given value.
+
+=over
+
+=item Param C<id>
+
+The ID specifying the global info you'd like to change.
+
+=item Param C<value>
+
+The new value for the global info element.
+
+=item Return Value
+
+The value the global counter had before it was incremented.
+
+=back
+
+=cut
+
+sub changeGlobalInfo
+{
+ my $self = shift;
+ my $id = shift;
+ my $value = shift;
+
+ return if !defined $self->{'meta-db'}->fetchGlobalInfo($id);
+
+ return $self->{'meta-db'}->changeGlobalInfo($id, $value);
+}
+
+=item C<addSystem(@$valRows)>
+
+Adds one or more systems to the database.
+
+=over
+
+=item Param C<valRows>
+
+An array-ref containing hash-refs with the data of the new system(s).
+
+=item Return Value
+
+The IDs of the new system(s), C<undef> if the creation failed.
+
+=back
+
+=cut
+
+sub addSystem
+{
+ my $self = shift;
+ my $inValRows = _aref(shift);
+
+ _checkCols($inValRows, 'system', qw(name export_id));
+
+ my ($valRows, $attrValRows) = _cloneAndUnhingeAttrs($inValRows);
+
+ foreach my $valRow (@$valRows) {
+ if (!$valRow->{kernel}) {
+ $valRow->{kernel} = 'vmlinuz';
+ vlog(
+ 1,
+ _tr(
+ "setting kernel of system '%s' to 'vmlinuz'!",
+ $valRow->{name}
+ )
+ );
+ }
+ if (!$valRow->{label}) {
+ $valRow->{label} = $valRow->{name};
+ }
+ }
+
+ my @IDs = $self->{'meta-db'}->addSystem($valRows, $attrValRows);
+ return wantarray() ? @IDs : $IDs[0];
+}
+
+=item C<removeSystem(@$systemIDs)>
+
+Removes one or more systems from the database.
+
+=over
+
+=item Param C<systemIDs>
+
+An array-ref containing the IDs of the systems that shall be removed.
+
+=item Return Value
+
+C<1> if the system(s) could be removed, C<undef> if not.
+
+=back
+
+=cut
+
+sub removeSystem
+{
+ my $self = shift;
+ my $systemIDs = _aref(shift);
+
+ foreach my $system (@$systemIDs) {
+ $self->setGroupIDsOfSystem($system);
+ $self->setClientIDsOfSystem($system);
+ }
+
+ return $self->{'meta-db'}->removeSystem($systemIDs);
+}
+
+=item C<changeSystem(@$systemIDs, @$valRows)>
+
+Changes the data of one or more systems.
+
+=over
+
+=item Param C<systemIDs>
+
+An array-ref containing the IDs of the systems that shall be changed.
+
+=item Param C<valRows>
+
+An array-ref containing hash-refs with the new data for the system(s).
+
+=item Return Value
+
+C<1> if the system(s) could be changed, C<undef> if not.
+
+=back
+
+=cut
+
+sub changeSystem
+{
+ my $self = shift;
+ my $systemIDs = _aref(shift);
+ my $inValRows = _aref(shift);
+
+ my ($valRows, $attrValRows) = _cloneAndUnhingeAttrs($inValRows);
+
+ return $self->{'meta-db'}->changeSystem($systemIDs, $valRows, $attrValRows);
+}
+
+#=item C<setSystemAttr($systemID, $attrName, $attrValue)>
+#
+#Sets a value for an attribute of the given system. If the system already
+#has a value for this attribute, it will be overwritten.
+#
+#=over
+#
+#=item Param C<systemID>
+#
+#The ID of the system whose attribute shall be changed.
+#
+#=item Param C<attrName>
+#
+#The name of the attribute to change.
+#
+#=item Param C<attrValue>
+#
+#The new value for the attribute.
+#
+#=item Return Value
+#
+#C<1> if the attribute could be set, C<undef> if not.
+#
+#=back
+#
+#=cut
+#
+#sub setSystemAttr
+#{
+# my $self = shift;
+# my $systemID = shift;
+# my $attrName = shift;
+# my $attrValue = shift;
+#
+# return $self->{'meta-db'}->setSystemAttr($systemID, $attrName, $attrValue);
+#}
+
+=item C<setClientIDsOfSystem($systemID, @$clientIDs)>
+
+Specifies all clients that should offer the given system for booting.
+
+=over
+
+=item Param C<systemID>
+
+The ID of the system whose clients you'd like to specify.
+
+=item Param C<clientIDs>
+
+An array-ref containing the IDs of the clients that shall be connected to the
+system.
+
+=item Return Value
+
+C<1> if the system/client references could be set, C<undef> if not.
+
+=back
+
+=cut
+
+sub setClientIDsOfSystem
+{
+ my $self = shift;
+ my $systemID = shift;
+ my $clientIDs = _aref(shift);
+
+ # associating a client to the default system makes no sense
+ return 0 if $systemID == 0;
+
+ my @uniqueClientIDs = _unique(@$clientIDs);
+
+ return $self->{'meta-db'}->setClientIDsOfSystem(
+ $systemID, \@uniqueClientIDs
+ );
+}
+
+=item C<addClientIDsToSystem($systemID, @$clientIDs)>
+
+Add one or more clients to the set that should offer the given system for booting.
+
+=over
+
+=item Param C<systemID>
+
+The ID of the system that you wish to add the clients to.
+
+=item Param C<clientIDs>
+
+An array-ref containing the IDs of the new clients that shall be added to the
+system.
+
+=item Return Value
+
+C<1> if the system/client references could be set, C<undef> if not.
+
+=back
+
+=cut
+
+sub addClientIDsToSystem
+{
+ my $self = shift;
+ my $systemID = shift;
+ my $newClientIDs = _aref(shift);
+
+ my @clientIDs = $self->{'meta-db'}->fetchClientIDsOfSystem($systemID);
+ push @clientIDs, @$newClientIDs;
+
+ return $self->setClientIDsOfSystem($systemID, \@clientIDs);
+}
+
+=item C<removeClientIDsFromSystem($systemID, @$clientIDs)>
+
+Removes the connection between the given clients and the given system.
+
+=over
+
+=item Param C<systemID>
+
+The ID of the system you'd like to remove groups from.
+
+=item Param C<clientIDs>
+
+An array-ref containing the IDs of the clients that shall be removed from the
+system.
+
+=item Return Value
+
+C<1> if the system/client references could be set, C<undef> if not.
+
+=back
+
+=cut
+
+sub removeClientIDsFromSystem
+{
+ my $self = shift;
+ my $systemID = shift;
+ my $removedClientIDs = _aref(shift);
+
+ my %toBeRemoved;
+ @toBeRemoved{@$removedClientIDs} = ();
+ my @clientIDs =
+ grep { !exists $toBeRemoved{$_} }
+ $self->{'meta-db'}->fetchClientIDsOfSystem($systemID);
+
+ return $self->setClientIDsOfSystem($systemID, \@clientIDs);
+}
+
+=item C<setGroupIDsOfSystem($systemID, @$groupIDs)>
+
+Specifies all groups that should offer the given system for booting.
+
+=over
+
+=item Param C<systemID>
+
+The ID of the system whose groups you'd like to specify.
+
+=item Param C<groupIDs>
+
+An array-ref containing the IDs of the groups that shall be connected to the
+system.
+
+=item Return Value
+
+C<1> if the system/group references could be set, C<undef> if not.
+
+=back
+
+=cut
+
+sub setGroupIDsOfSystem
+{
+ my $self = shift;
+ my $systemID = shift;
+ my $groupIDs = _aref(shift);
+
+ # associating a group to the default system makes no sense
+ return 0 if $systemID == 0;
+
+ my @uniqueGroupIDs = _unique(@$groupIDs);
+
+ return $self->{'meta-db'}->setGroupIDsOfSystem($systemID, \@uniqueGroupIDs);
+}
+
+=item C<addGroupIDsToSystem($systemID, @$groupIDs)>
+
+Add one or more groups to the set that should offer the given system for booting.
+
+=over
+
+=item Param C<systemID>
+
+The ID of the system that you wish to add the groups to.
+
+=item Param C<groupIDs>
+
+An array-ref containing the IDs of the new groups that shall be added to the
+system.
+
+=item Return Value
+
+C<1> if the system/group references could be set, C<undef> if not.
+
+=back
+
+=cut
+
+sub addGroupIDsToSystem
+{
+ my $self = shift;
+ my $systemID = shift;
+ my $newGroupIDs = _aref(shift);
+
+ my @groupIDs = $self->{'meta-db'}->fetchGroupIDsOfSystem($systemID);
+ push @groupIDs, @$newGroupIDs;
+
+ return $self->setGroupIDsOfSystem($systemID, \@groupIDs);
+}
+
+=item C<removeGroupIDsFromSystem($systemID, @$groupIDs)>
+
+Removes the connection between the given groups and the given system.
+
+=over
+
+=item Param C<systemID>
+
+The ID of the system you'd like to remove groups from.
+
+=item Param C<groupIDs>
+
+An array-ref containing the IDs of the groups that shall be removed from the
+system.
+
+=item Return Value
+
+C<1> if the system/group references could be set, C<undef> if not.
+
+=back
+
+=cut
+
+sub removeGroupIDsFromSystem
+{
+ my $self = shift;
+ my $systemID = shift;
+ my $toBeRemovedGroupIDs = _aref(shift);
+
+ my %toBeRemoved;
+ @toBeRemoved{@$toBeRemovedGroupIDs} = ();
+ my @groupIDs =
+ grep { !exists $toBeRemoved{$_} }
+ $self->{'meta-db'}->fetchGroupIDsOfSystem($systemID);
+
+ return $self->setGroupIDsOfSystem($systemID, \@groupIDs);
+}
+
+=item C<addClient(@$valRows)>
+
+Adds one or more clients to the database.
+
+=over
+
+=item Param C<valRows>
+
+An array-ref containing hash-refs with the data of the new client(s).
+
+=item Return Value
+
+The IDs of the new client(s), C<undef> if the creation failed.
+
+=back
+
+=cut
+
+sub addClient
+{
+ my $self = shift;
+ my $inValRows = _aref(shift);
+
+ _checkCols($inValRows, 'client', qw(name mac));
+
+ my ($valRows, $attrValRows) = _cloneAndUnhingeAttrs($inValRows);
+
+ my @IDs = $self->{'meta-db'}->addClient($valRows, $attrValRows);
+ return wantarray() ? @IDs : $IDs[0];
+}
+
+=item C<removeClient(@$clientIDs)>
+
+Removes one or more clients from the database.
+
+=over
+
+=item Param C<clientIDs>
+
+An array-ref containing the IDs of the clients that shall be removed.
+
+=item Return Value
+
+C<1> if the client(s) could be removed, C<undef> if not.
+
+=back
+
+=cut
+
+sub removeClient
+{
+ my $self = shift;
+ my $clientIDs = _aref(shift);
+
+ foreach my $client (@$clientIDs) {
+ $self->setGroupIDsOfClient($client);
+ $self->setSystemIDsOfClient($client);
+ }
+
+ return $self->{'meta-db'}->removeClient($clientIDs);
+}
+
+=item C<changeClient(@$clientIDs, @$valRows)>
+
+Changes the data of one or more clients.
+
+=over
+
+=item Param C<clientIDs>
+
+An array-ref containing the IDs of the clients that shall be changed.
+
+=item Param C<valRows>
+
+An array-ref containing hash-refs with the new data for the client(s).
+
+=item Return Value
+
+C<1> if the client(s) could be changed, C<undef> if not.
+
+=back
+
+=cut
+
+sub changeClient
+{
+ my $self = shift;
+ my $clientIDs = _aref(shift);
+ my $inValRows = _aref(shift);
+
+ my ($valRows, $attrValRows) = _cloneAndUnhingeAttrs($inValRows);
+
+ return $self->{'meta-db'}->changeClient($clientIDs, $valRows, $attrValRows);
+}
+
+#=item C<setClientAttr($clientID, $attrName, $attrValue)>
+#
+#Sets a value for an attribute of the given client. If the client already
+#has a value for this attribute, it will be overwritten.
+#
+#=over
+#
+#=item Param C<clientID>
+#
+#The ID of the client whose attribute shall be changed.
+#
+#=item Param C<attrName>
+#
+#The name of the attribute to change.
+#
+#=item Param C<attrValue>
+#
+#The new value for the attribute.
+#
+#=item Return Value
+#
+#C<1> if the attribute could be set, C<undef> if not.
+#
+#=back
+#
+#=cut
+#
+#sub setClientAttr
+#{
+# my $self = shift;
+# my $clientID = shift;
+# my $attrName = shift;
+# my $attrValue = shift;
+#
+# return $self->{'meta-db'}->setClientAttr($clientID, $attrName, $attrValue);
+#}
+
+=item C<setSystemIDsOfClient($clientID, @$systemIDs)>
+
+Specifies all systems that should be offered for booting by the given client.
+
+=over
+
+=item Param C<clientID>
+
+The ID of the client whose systems you'd like to specify.
+
+=item Param C<systemIDs>
+
+An array-ref containing the IDs of the systems that shall be connected to the
+client.
+
+=item Return Value
+
+C<1> if the client/system references could be set, C<undef> if not.
+
+=back
+
+=cut
+
+sub setSystemIDsOfClient
+{
+ my $self = shift;
+ my $clientID = shift;
+ my $systemIDs = _aref(shift);
+
+ # filter out the default system, as no client should be associated to it
+ my @uniqueSystemIDs = grep { $_ > 0; } _unique(@$systemIDs);
+
+ return $self->{'meta-db'}->setSystemIDsOfClient(
+ $clientID, \@uniqueSystemIDs
+ );
+}
+
+=item C<addSystemIDsToClient($clientID, @$systemIDs)>
+
+Adds some systems to the set that should be offered for booting by the given client.
+
+=over
+
+=item Param C<clientID>
+
+The ID of the client to which you'd like to add systems to.
+
+=item Param C<systemIDs>
+
+An array-ref containing the IDs of the new systems that shall be added to the
+client.
+
+=item Return Value
+
+C<1> if the client/system references could be set, C<undef> if not.
+
+=back
+
+=cut
+
+sub addSystemIDsToClient
+{
+ my $self = shift;
+ my $clientID = shift;
+ my $newSystemIDs = _aref(shift);
+
+ my @systemIDs = $self->{'meta-db'}->fetchSystemIDsOfClient($clientID);
+ push @systemIDs, @$newSystemIDs;
+
+ return $self->setSystemIDsOfClient($clientID, \@systemIDs);
+}
+
+=item C<removeSystemIDsFromClient($clientID, @$systemIDs)>
+
+Removes some systems from the set that should be offered for booting by the given client.
+
+=over
+
+=item Param C<clientID>
+
+The ID of the client to which you'd like to remove systems from.
+
+=item Param C<systemIDs>
+
+An array-ref containing the IDs of the systems that shall be removed from the
+client.
+
+=item Return Value
+
+C<1> if the client/system references could be set, C<undef> if not.
+
+=back
+
+=cut
+
+sub removeSystemIDsFromClient
+{
+ my $self = shift;
+ my $clientID = shift;
+ my $removedSystemIDs = _aref(shift);
+
+ my %toBeRemoved;
+ @toBeRemoved{@$removedSystemIDs} = ();
+ my @systemIDs =
+ grep { !exists $toBeRemoved{$_} }
+ $self->{'meta-db'}->fetchSystemIDsOfClient($clientID);
+
+ return $self->setSystemIDsOfClient($clientID, \@systemIDs);
+}
+
+=item C<setGroupIDsOfClient($clientID, @$groupIDs)>
+
+Specifies all groups that the given client shall be part of.
+
+=over
+
+=item Param C<clientID>
+
+The ID of the client whose groups you'd like to specify.
+
+=item Param C<groupIDs>
+
+An array-ref containing the IDs of the groups that the client should be part of.
+
+=item Return Value
+
+C<1> if the client/group references could be set, C<undef> if not.
+
+=back
+
+=cut
+
+sub setGroupIDsOfClient
+{
+ my $self = shift;
+ my $clientID = shift;
+ my $groupIDs = _aref(shift);
+
+ my @uniqueGroupIDs = _unique(@$groupIDs);
+
+ return $self->{'meta-db'}->setGroupIDsOfClient($clientID, \@uniqueGroupIDs);
+}
+
+=item C<addGroupIDsToClient($clientID, @$groupIDs)>
+
+Adds the given client to the given groups.
+
+=over
+
+=item Param C<clientID>
+
+The ID of the client that you'd like to add to the given groups.
+
+=item Param C<groupIDs>
+
+An array-ref containing the IDs of the groups that shall be added to the
+client.
+
+=item Return Value
+
+C<1> if the client/group references could be set, C<undef> if not.
+
+=back
+
+=cut
+
+sub addGroupIDsToClient
+{
+ my $self = shift;
+ my $clientID = shift;
+ my $newGroupIDs = _aref(shift);
+
+ my @groupIDs = $self->{'meta-db'}->fetchGroupIDsOfClient($clientID);
+ push @groupIDs, @$newGroupIDs;
+
+ return $self->setGroupIDsOfClient($clientID, \@groupIDs);
+}
+
+=item C<removeGroupsIDsFromClient($clientID, @$groupIDs)>
+
+Removes the given client from the given groups.
+
+=over
+
+=item Param C<clientID>
+
+The ID of the client that you'd like to remove from the given groups.
+
+=item Param C<groupIDs>
+
+An array-ref containing the IDs of the groups that shall be removed from the
+client.
+
+=item Return Value
+
+C<1> if the client/group references could be set, C<undef> if not.
+
+=back
+
+=cut
+
+sub removeGroupIDsFromClient
+{
+ my $self = shift;
+ my $clientID = shift;
+ my $toBeRemovedGroupIDs = _aref(shift);
+
+ my %toBeRemoved;
+ @toBeRemoved{@$toBeRemovedGroupIDs} = ();
+ my @groupIDs =
+ grep { !exists $toBeRemoved{$_} }
+ $self->{'meta-db'}->fetchGroupIDsOfClient($clientID);
+
+ return $self->setGroupIDsOfClient($clientID, \@groupIDs);
+}
+
+=item C<addGroup(@$valRows)>
+
+Adds one or more groups to the database.
+
+=over
+
+=item Param C<valRows>
+
+An array-ref containing hash-refs with the data of the new group(s).
+
+=item Return Value
+
+The IDs of the new group(s), C<undef> if the creation failed.
+
+=back
+
+=cut
+
+sub addGroup
+{
+ my $self = shift;
+ my $inValRows = _aref(shift);
+
+ _checkCols($inValRows, 'group', qw(name));
+
+ my ($valRows, $attrValRows) = _cloneAndUnhingeAttrs($inValRows);
+
+ foreach my $valRow (@$valRows) {
+ if (!defined $valRow->{priority}) {
+ $valRow->{priority} = '50';
+ }
+ }
+ my @IDs = $self->{'meta-db'}->addGroup($valRows, $attrValRows);
+ return wantarray() ? @IDs : $IDs[0];
+}
+
+=item C<removeGroup(@$groupIDs)>
+
+Removes one or more groups from the database.
+
+=over
+
+=item Param C<groupIDs>
+
+An array-ref containing the IDs of the groups that shall be removed.
+
+=item Return Value
+
+C<1> if the group(s) could be removed, C<undef> if not.
+
+=back
+
+=cut
+
+sub removeGroup
+{
+ my $self = shift;
+ my $groupIDs = _aref(shift);
+
+ foreach my $group (@$groupIDs) {
+ $self->setSystemIDsOfGroup($group, []);
+ $self->setClientIDsOfGroup($group, []);
+ }
+
+ return $self->{'meta-db'}->removeGroup($groupIDs);
+}
+
+#=item C<setGroupAttr($groupID, $attrName, $attrValue)>
+#
+#Sets a value for an attribute of the given group. If the group already
+#has a value for this attribute, it will be overwritten.
+#
+#=over
+#
+#=item Param C<groupID>
+#
+#The ID of the group whose attribute shall be changed.
+#
+#=item Param C<attrName>
+#
+#The name of the attribute to change.
+#
+#=item Param C<attrValue>
+#
+#The new value for the attribute.
+#
+#=item Return Value
+#
+#C<1> if the attribute could be set, C<undef> if not.
+#
+#=back
+#
+#=cut
+#
+#sub setGroupAttr
+#{
+# my $self = shift;
+# my $groupID = shift;
+# my $attrName = shift;
+# my $attrValue = shift;
+#
+# return $self->{'meta-db'}->setGroupAttr($groupID, $attrName, $attrValue);
+#}
+
+=item C<changeGroup(@$groupIDs, @$valRows)>
+
+Changes the data of one or more groups.
+
+=over
+
+=item Param C<groupIDs>
+
+An array-ref containing the IDs of the groups that shall be changed.
+
+=item Param C<valRows>
+
+An array-ref containing hash-refs with the new data for the group(s).
+
+=item Return Value
+
+C<1> if the group(s) could be changed, C<undef> if not.
+
+=back
+
+=cut
+
+sub changeGroup
+{
+ my $self = shift;
+ my $groupIDs = _aref(shift);
+ my $inValRows = _aref(shift);
+
+ my ($valRows, $attrValRows) = _cloneAndUnhingeAttrs($inValRows);
+
+ return $self->{'meta-db'}->changeGroup($groupIDs, $valRows, $attrValRows);
+}
+
+=item C<setClientIDsOfGroup($groupID, @$clientIDs)>
+
+Specifies all clients that should be part of the given group.
+
+=over
+
+=item Param C<groupID>
+
+The ID of the group whose clients you'd like to specify.
+
+=item Param C<clientIDs>
+
+An array-ref containing the IDs of the clients that shall be part of the group.
+
+=item Return Value
+
+C<1> if the group/client references could be set, C<undef> if not.
+
+=back
+
+=cut
+
+sub setClientIDsOfGroup
+{
+ my $self = shift;
+ my $groupID = shift;
+ my $clientIDs = _aref(shift);
+
+ my @uniqueClientIDs = _unique(@$clientIDs);
+
+ return $self->{'meta-db'}->setClientIDsOfGroup($groupID, \@uniqueClientIDs);
+}
+
+=item C<addClientIDsToGroup($groupID, @$clientIDs)>
+
+Add some clients to the given group.
+
+=over
+
+=item Param C<groupID>
+
+The ID of the group to which you'd like to add clients.
+
+=item Param C<clientIDs>
+
+An array-ref containing the IDs of the clients that shall be added.
+
+=item Return Value
+
+C<1> if the group/client references could be set, C<undef> if not.
+
+=back
+
+=cut
+
+sub addClientIDsToGroup
+{
+ my $self = shift;
+ my $groupID = shift;
+ my $newClientIDs = _aref(shift);
+
+ my @clientIDs = $self->{'meta-db'}->fetchClientIDsOfGroup($groupID);
+ push @clientIDs, @$newClientIDs;
+
+ return $self->setClientIDsOfGroup($groupID, \@clientIDs);
+}
+
+=item C<removeClientIDsFromGroup($groupID, @$clientIDs)>
+
+Remove some clients from the given group.
+
+=over
+
+=item Param C<groupID>
+
+The ID of the group from which you'd like to remove clients.
+
+=item Param C<clientIDs>
+
+An array-ref containing the IDs of the clients that shall be removed.
+
+=item Return Value
+
+C<1> if the group/client references could be set, C<undef> if not.
+
+=back
+
+=cut
+
+sub removeClientIDsFromGroup
+{
+ my $self = shift;
+ my $groupID = shift;
+ my $removedClientIDs = _aref(shift);
+
+ my %toBeRemoved;
+ @toBeRemoved{@$removedClientIDs} = ();
+ my @clientIDs =
+ grep { !exists $toBeRemoved{$_} }
+ $self->{'meta-db'}->fetchClientIDsOfGroup($groupID);
+
+ return $self->setClientIDsOfGroup($groupID, \@clientIDs);
+}
+
+=item C<setSystemIDsOfGroup($groupID, @$systemIDs)>
+
+Specifies all systems that should be offered for booting by the given group.
+
+=over
+
+=item Param C<groupID>
+
+The ID of the group whose systems you'd like to specify.
+
+=item Param C<systemIDs>
+
+An array-ref containing the IDs of the systems that shall be connected to the
+group.
+
+=item Return Value
+
+C<1> if the group/system references could be set, C<undef> if not.
+
+=back
+
+=cut
+
+sub setSystemIDsOfGroup
+{
+ my $self = shift;
+ my $groupID = shift;
+ my $systemIDs = _aref(shift);
+
+ # filter out the default system, as no group should be associated to it
+ my @uniqueSystemIDs = grep { $_ > 0; } _unique(@$systemIDs);
+
+ return $self->{'meta-db'}->setSystemIDsOfGroup($groupID, \@uniqueSystemIDs);
+}
+
+=item C<addSystemIDsToGroup($groupID, @$systemIDs)>
+
+Adds some systems to the set that should be offered for booting by the given group.
+
+=over
+
+=item Param C<groupID>
+
+The ID of the group to which you'd like to add systems.
+
+=item Param C<systemIDs>
+
+An array-ref containing the IDs of the systems that shall be added.
+
+=item Return Value
+
+C<1> if the group/system references could be set, C<undef> if not.
+
+=back
+
+=cut
+
+sub addSystemIDsToGroup
+{
+ my $self = shift;
+ my $groupID = shift;
+ my $newSystemIDs = _aref(shift);
+
+ my @systemIDs = $self->{'meta-db'}->fetchSystemIDsOfGroup($groupID);
+ push @systemIDs, @$newSystemIDs;
+
+ return $self->setSystemIDsOfGroup($groupID, \@systemIDs);
+}
+
+=item C<removeSystemIDsFromGroup($groupID, @$systemIDs)>
+
+Removes some systems from the set that should be offered for booting by the given group.
+
+=over
+
+=item Param C<groupID>
+
+The ID of the group from which you'd like to remove systems.
+
+=item Param C<systemIDs>
+
+An array-ref containing the IDs of the systems that shall be removed.
+
+=item Return Value
+
+C<1> if the group/system references could be set, C<undef> if not.
+
+=back
+
+=cut
+
+sub removeSystemIDsFromGroup
+{
+ my $self = shift;
+ my $groupID = shift;
+ my $removedSystemIDs = _aref(shift);
+
+ my %toBeRemoved;
+ @toBeRemoved{@$removedSystemIDs} = ();
+ my @systemIDs =
+ grep { !exists $toBeRemoved{$_} }
+ $self->{'meta-db'}->fetchSystemIDsOfGroup($groupID);
+
+ return $self->setSystemIDsOfGroup($groupID, \@systemIDs);
+}
+
+=item C<emptyDatabase()>
+
+Removes all data from the database - the tables stay, but they will be empty.
+
+=over
+
+=item Return Value
+
+none
+
+=back
+
+=cut
+
+sub emptyDatabase
+{ # clears all user-data from the database
+ my $self = shift;
+
+ my @groupIDs = map { $_->{id} } $self->fetchGroupByFilter();
+ $self->removeGroup(\@groupIDs);
+
+ my @clientIDs = map { $_->{id} }
+ grep { $_->{name} ne '<<<default>>>' } $self->fetchClientByFilter();
+ $self->removeClient(\@clientIDs);
+
+ my @sysIDs = map { $_->{id} }
+ grep { $_->{name} ne '<<<default>>>' } $self->fetchSystemByFilter();
+ $self->removeSystem(\@sysIDs);
+
+ my @exportIDs = map { $_->{id} } $self->fetchExportByFilter();
+ $self->removeExport(\@exportIDs);
+
+ my @vendorOSIDs = map { $_->{id} } $self->fetchVendorOSByFilter();
+ $self->removeVendorOS(\@vendorOSIDs);
+
+ return 1;
+}
+
+=back
+
+=head2 Data Aggregation Methods
+
+=over
+
+=item C<mergeDefaultAttributesIntoSystem($system)>
+
+merges vendor-OS-specific plugin attributes and default system attributes into
+the given system hash, and pushes the default client attributes on top of that.
+
+=over
+
+=item Param C<system>
+
+The system whose attributes shall be merged into (completed).
+
+=item Return Value
+
+none
+
+=back
+
+=cut
+
+sub mergeDefaultAttributesIntoSystem
+{
+ my $self = shift;
+ my $system = shift;
+ my $installedPlugins = shift;
+ my $originInfo = shift;
+
+ # merge any attributes found in the plugins that are installed into
+ # the vendor-OS:
+ if (ref $installedPlugins eq 'ARRAY' && @$installedPlugins) {
+ for my $plugin (@$installedPlugins) {
+ mergeAttributes($system, $plugin, $originInfo, 'vendor-OS');
+ }
+
+ # the above will have merged stage1 attributes, too, so we remove
+ # these from the resulting system (as they do not apply to systems)
+ my @stage3AttrNames = OpenSLX::AttributeRoster->getStage3Attrs();
+ for my $attr (keys %{$system->{attrs}}) {
+ next if grep { $attr eq $_ } @stage3AttrNames;
+ delete $system->{attrs}->{$attr};
+ }
+ }
+
+ # merge yet unset stuff from default system
+ my $defaultSystem = $self->fetchSystemByFilter({name => '<<<default>>>'});
+ mergeAttributes($system, $defaultSystem, $originInfo, 'default-system');
+
+ # finally push the attributes specified for the default client (these
+ # overrule anything else)
+ my $defaultClient = $self->fetchClientByFilter({name => '<<<default>>>'});
+ pushAttributes($system, $defaultClient, $originInfo, 'default-client');
+
+ return 1;
+}
+
+=item C<mergeDefaultAndGroupAttributesIntoClient($client)>
+
+merges default and group configurations into the given client hash.
+
+=over
+
+=item Param C<client>
+
+The client whose attributes shall be merged into (completed).
+
+=item Return Value
+
+none
+
+=back
+
+=cut
+
+sub mergeDefaultAndGroupAttributesIntoClient
+{
+ my $self = shift;
+ my $client = shift;
+ my $originInfo = shift;
+
+ # step over all groups this client belongs to
+ # (ordered by priority from highest to lowest):
+ my @groupIDs = _unique(
+ $self->fetchGroupIDsOfClient(0),
+ $self->fetchGroupIDsOfClient($client->{id})
+ );
+ my @groups
+ = sort { $a->{priority} <=> $b->{priority} }
+ $self->fetchGroupByID(\@groupIDs);
+ foreach my $group (@groups) {
+ # merge configuration from this group into the current client:
+ vlog(
+ 3,
+ _tr('merging from group %d:%s...', $group->{id}, $group->{name})
+ );
+ mergeAttributes($client, $group, $originInfo, "group '$group->{name}'");
+ }
+
+ # merge configuration from default client:
+ vlog(3, _tr('merging from default client...'));
+ my $defaultClient = $self->fetchClientByFilter({name => '<<<default>>>'});
+ mergeAttributes($client, $defaultClient, $originInfo, 'default-client');
+
+ return 1;
+}
+
+=item C<aggregatedSystemIDsOfClient($client)>
+
+Returns an aggregated list of system-IDs that this client should offer for
+booting (as indicated by itself, the default client and the client's groups)
+
+=over
+
+=item Param C<client>
+
+The client whose aggregated systems you're interested in.
+
+=item Return Value
+
+A list of unqiue system-IDs.
+
+=back
+
+=cut
+
+sub aggregatedSystemIDsOfClient
+{
+ my $self = shift;
+ my $client = shift;
+
+ # add all systems directly linked to client:
+ my @systemIDs = $self->fetchSystemIDsOfClient($client->{id});
+
+ # step over all groups this client belongs to:
+ my @groupIDs = $self->fetchGroupIDsOfClient($client->{id});
+ my @groups = $self->fetchGroupByID(\@groupIDs);
+ foreach my $group (@groups) {
+ # add all systems that the client inherits from the current group:
+ push @systemIDs, $self->fetchSystemIDsOfGroup($group->{id});
+ }
+
+ # add all systems inherited from default client
+ my $defaultClient = $self->fetchClientByFilter({name => '<<<default>>>'});
+ push @systemIDs, $self->fetchSystemIDsOfClient($defaultClient->{id});
+
+ return _unique(@systemIDs);
+}
+
+=item C<aggregatedClientIDsOfSystem($system)>
+
+Returns an aggregated list of client-IDs that offer this system for
+booting (as indicated by itself, the default system and the system's groups)
+
+=over
+
+=item Param C<system>
+
+The system whose aggregated clients you're interested in.
+
+=item Return Value
+
+A list of unqiue client-IDs.
+
+=back
+
+=cut
+
+sub aggregatedClientIDsOfSystem
+{
+ my $self = shift;
+ my $system = shift;
+
+ # add all clients directly linked to system:
+ my $defaultClient = $self->fetchClientByFilter({name => '<<<default>>>'});
+ my @clientIDs = $self->fetchClientIDsOfSystem($system->{id});
+
+ if (grep { $_ == $defaultClient->{id}; } @clientIDs) {
+ # add *all* client-IDs if the system is being referenced by
+ # the default client, as that means that all clients should offer
+ # this system for booting:
+ push(
+ @clientIDs,
+ map { $_->{id} } $self->fetchClientByFilter(undef, 'id')
+ );
+ }
+
+ # step over all groups this system belongs to:
+ my @groupIDs = $self->fetchGroupIDsOfSystem($system->{id});
+ my @groups = $self->fetchGroupByID(\@groupIDs);
+ foreach my $group (@groups) {
+ # add all clients that the system inherits from the current group:
+ push @clientIDs, $self->fetchClientIDsOfGroup($group->{id});
+ }
+
+ # add all clients inherited from default system
+ my $defaultSystem = $self->fetchSystemByFilter({name => '<<<default>>>'});
+ push @clientIDs, $self->fetchClientIDsOfSystem($defaultSystem->{id});
+
+ return _unique(@clientIDs);
+}
+
+=item C<aggregatedSystemFileInfoFor($system)>
+
+Returns aggregated information about the kernel and initialramfs
+this system is using.
+
+=over
+
+=item Param C<system>
+
+The system whose aggregated info you're interested in.
+
+=item Return Value
+
+A hash containing detailled info about the vendor-OS and export used by
+this system, as well as the specific kernel-file and export-URI being used.
+
+=back
+
+=cut
+
+sub aggregatedSystemFileInfoFor
+{
+ my $self = shift;
+ my $system = shift;
+
+ my $info = clone($system);
+
+ my $export = $self->fetchExportByID($system->{export_id});
+ if (!defined $export) {
+ die _tr(
+ "DB-problem: system '%s' references export with id=%s, but that doesn't exist!",
+ $system->{name}, $system->{export_id} || ''
+ );
+ }
+ $info->{'export'} = $export;
+
+ my $vendorOS = $self->fetchVendorOSByID($export->{vendor_os_id});
+ if (!defined $vendorOS) {
+ die _tr(
+ "DB-problem: export '%s' references vendor-OS with id=%s, but that doesn't exist!",
+ $export->{name}, $export->{vendor_os_id} || ''
+ );
+ }
+ $info->{'vendor-os'} = $vendorOS;
+
+ my @installedPlugins = $self->fetchInstalledPlugins($vendorOS->{id});
+ $info->{'installed-plugins'} = \@installedPlugins;
+
+ # check if the specified kernel file really exists (follow links while
+ # checking) and if not, find the newest kernel file that is available.
+ my $kernelPath
+ = "$openslxConfig{'private-path'}/stage1/$vendorOS->{name}/boot";
+ my $kernelFile = "$kernelPath/$system->{kernel}";
+ while (-l $kernelFile) {
+ $kernelFile = followLink($kernelFile);
+ }
+ if (!-e $kernelFile) {
+ # pick best kernel file available
+ my $osSetupEngine = instantiateClass("OpenSLX::OSSetup::Engine");
+ $osSetupEngine->initialize($vendorOS->{name}, 'none');
+ $kernelFile = $osSetupEngine->pickKernelFile($kernelPath);
+ warn(
+ _tr(
+ "setting kernel of system '%s' to '%s'!",
+ $info->{name}, basename($kernelFile)
+ )
+ );
+ }
+ $info->{'kernel-file'} = $kernelFile;
+
+ # auto-generate export_uri if none has been given
+ my $exportURI = $export->{'uri'} || '';
+ if ($exportURI !~ m[\w]) {
+ # instantiate OSExport engine and ask it for exportURI
+ my $osExportEngine = instantiateClass("OpenSLX::OSExport::Engine");
+ $osExportEngine->initializeFromExisting($export->{name});
+ $exportURI = $osExportEngine->generateExportURI($export, $vendorOS);
+ }
+ $info->{'export-uri'} = $exportURI;
+
+ return $info;
+}
+
+=back
+
+=head2 Support Functions
+
+=over
+
+=item C<mergeAttributes($target, $source)>
+
+Copies all attributes from source that are unset in target over (source extends target).
+
+=over
+
+=item Param C<target>
+
+The hash to be used as copy target.
+
+=item Param C<source>
+
+The hash to be used as copy source.
+
+=item Return Value
+
+none
+
+=back
+
+=cut
+
+sub mergeAttributes
+{
+ my $target = shift;
+ my $source = shift;
+ my $originInfo = shift;
+ my $origin = shift;
+
+ my $sourceAttrs = $source->{attrs} || {};
+
+ $target->{attrs} ||= {};
+ my $targetAttrs = $target->{attrs};
+
+ foreach my $key (keys %$sourceAttrs) {
+ my $sourceVal = $sourceAttrs->{$key};
+ my $targetVal = $targetAttrs->{$key};
+ if (!defined $targetVal) {
+ vlog(3, _tr(
+ "merging %s (val=%s)", $key,
+ defined $sourceVal ? $sourceVal : ''
+ ));
+ $targetAttrs->{$key} = $sourceVal;
+ if (defined $originInfo) {
+ $originInfo->{$key} = $origin;
+ }
+ }
+ }
+
+ return 1;
+}
+
+=item C<pushAttributes($target, $source)>
+
+Copies all attributes that are set in source into the target (source overrules target).
+
+=over
+
+=item Param C<target>
+
+The hash to be used as copy target.
+
+=item Param C<source>
+
+The hash to be used as copy source.
+
+=item Return Value
+
+none
+
+=back
+
+=cut
+
+sub pushAttributes
+{
+ my $target = shift;
+ my $source = shift;
+ my $originInfo = shift;
+ my $origin = shift;
+
+ my $sourceAttrs = $source->{attrs} || {};
+
+ $target->{attrs} ||= {};
+ my $targetAttrs = $target->{attrs};
+
+ foreach my $key (keys %$sourceAttrs) {
+ my $sourceVal = $sourceAttrs->{$key};
+ if (defined $sourceVal) {
+ vlog(3, _tr("pushing %s (val=%s)", $key, $sourceVal));
+ $targetAttrs->{$key} = $sourceVal;
+ if (defined $originInfo) {
+ $originInfo->{$key} = $origin;
+ }
+ }
+ }
+
+ return 1;
+}
+
+=item C<externalIDForSystem($system)>
+
+Returns the given system's name as an external ID - worked into a
+state that is usable as a filename.
+
+=over
+
+=item Param C<system>
+
+The system you are interested in.
+
+=item Return Value
+
+The external ID (name) of the given system.
+
+=back
+
+=cut
+
+sub externalIDForSystem
+{
+ my $system = shift;
+
+ return "default" if $system->{name} eq '<<<default>>>';
+
+ my $name = $system->{name};
+ $name =~ tr[/][_];
+
+ return $name;
+}
+
+=item C<externalIDForClient($client)>
+
+Returns the given client's MAC as an external ID - worked into a
+state that is usable as a filename.
+
+=over
+
+=item Param C<client>
+
+The client you are interested in.
+
+=item Return Value
+
+The external ID (MAC) of the given client.
+
+=back
+
+=cut
+
+sub externalIDForClient
+{
+ my $client = shift;
+
+ return "default" if $client->{name} eq '<<<default>>>';
+
+ my $mac = lc($client->{mac});
+ # PXE seems to expect MACs being all lowercase
+ $mac =~ tr[:][-];
+
+ return "01-$mac";
+}
+
+=item C<externalConfigNameForClient($client)>
+
+Returns the given client's name as an external ID - worked into a
+state that is usable as a filename.
+
+=over
+
+=item Param C<client>
+
+The client you are interested in.
+
+=item Return Value
+
+The external name of the given client.
+
+=back
+
+=cut
+
+sub externalConfigNameForClient
+{
+ my $client = shift;
+
+ return "default" if $client->{name} eq '<<<default>>>';
+
+ my $name = $client->{name};
+ $name =~ tr[/][_];
+
+ return $name;
+}
+
+=item C<generatePlaceholdersFor($varName)>
+
+Returns the given variable as a placeholder - surrounded by '@@@' markers.
+
+=over
+
+=item Param C<varName>
+
+The variable you are interested in.
+
+=item Return Value
+
+The given variable as a placeholder string.
+
+=back
+
+=cut
+
+sub generatePlaceholderFor
+{
+ my $varName = shift;
+
+ return '@@@' . $varName . '@@@';
+}
+
+################################################################################
+### private stuff
+################################################################################
+sub _aref
+{ # transparently converts the given reference to an array-ref
+ my $ref = shift;
+
+ return [] unless defined $ref;
+ $ref = [$ref] unless ref($ref) eq 'ARRAY';
+
+ return $ref;
+}
+
+sub _unique
+{ # return given array filtered to unique elements
+ my %seenIDs;
+ return grep { !$seenIDs{$_}++; } @_;
+}
+
+sub _checkCols
+{
+ my $valRows = shift;
+ my $table = shift;
+ my @colNames = @_;
+
+ foreach my $valRow (@$valRows) {
+ foreach my $col (@colNames) {
+ die "need to set '$col' for $table!" if !$valRow->{$col};
+ }
+ }
+
+ return 1;
+}
+
+sub _cloneAndUnhingeAttrs
+{
+ my $inValRows = shift;
+
+ # clone data and unhinge attrs
+ my (@valRows, @attrValRows);
+ foreach my $inValRow (@$inValRows) {
+ push @attrValRows, $inValRow->{attrs};
+ my $valRow = clone($inValRow);
+ delete $valRow->{attrs};
+ push @valRows, $valRow;
+ }
+
+ return (\@valRows, \@attrValRows);
+}
+
+1;
diff --git a/src/config-db/OpenSLX/ConfigExport/DHCP/ISC.pm b/src/config-db/OpenSLX/ConfigExport/DHCP/ISC.pm
new file mode 100644
index 00000000..14b427c8
--- /dev/null
+++ b/src/config-db/OpenSLX/ConfigExport/DHCP/ISC.pm
@@ -0,0 +1,45 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# ISC.pm
+# - provides ISC-specific implementation of DHCP export.
+# -----------------------------------------------------------------------------
+package OpenSLX::ConfigExport::DHCP::ISC;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+################################################################################
+### This class provides an ISC specific implementation for DHCP export.
+################################################################################
+use OpenSLX::Basics;
+
+################################################################################
+### implementation
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {};
+ return bless $self, $class;
+}
+
+sub execute
+{
+ my $self = shift;
+ my $clients = shift;
+
+ vlog(1, _tr("writing dhcp-config for %s clients", scalar(@$clients)));
+ foreach my $client (@$clients) {
+print "ISC-DHCP: $client->{name}\n";
+ }
+} \ No newline at end of file
diff --git a/src/config-db/OpenSLX/DBSchema.pm b/src/config-db/OpenSLX/DBSchema.pm
new file mode 100644
index 00000000..d3e7573b
--- /dev/null
+++ b/src/config-db/OpenSLX/DBSchema.pm
@@ -0,0 +1,832 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# DBSchema.pm
+# - provides database schema of the OpenSLX config-db.
+# -----------------------------------------------------------------------------
+package OpenSLX::DBSchema;
+
+use strict;
+use warnings;
+
+use OpenSLX::Basics;
+
+################################################################################
+### DB-schema definition
+### This hash-ref describes the current OpenSLX configuration database
+### schema.
+### Each table is defined by a list of column descriptions (and optionally
+### a list of default values).
+### A column description is simply the name of the column followed by ':'
+### followed by the data type description. The following data types are
+### currently supported:
+### b => boolean (providing the values 1 and 0 only)
+### i => integer (32-bit, signed)
+### s.20 => string, followed by length argument (in this case: 20)
+### pk => primary key (integer)
+### fk => foreign key (integer)
+################################################################################
+
+my $VERSION = 0.36;
+
+my $DbSchema = {
+ 'version' => $VERSION,
+ 'tables' => {
+ 'client' => {
+ # a client is a PC booting via network
+ 'cols' => [
+ 'id:pk', # primary key
+ 'name:s.128', # official name of PC (e.g. as given by sticker
+ # on case)
+ 'mac:s.20', # MAC of NIC used for booting
+ 'comment:s.1024', # internal comment (optional, for admins)
+ ],
+ 'vals' => [
+ { # add default client
+ 'id' => 0,
+ 'name' => '<<<default>>>',
+ 'comment' => 'internal client that holds default values',
+ },
+ ],
+ },
+ 'client_attr' => {
+ # attributes of clients
+ 'cols' => [
+ 'id:pk', # primary key
+ 'client_id:fk', # foreign key to client
+ 'name:s.128', # attribute name
+ 'value:s.255', # attribute value
+ ],
+ },
+ 'client_system_ref' => {
+ # clients referring to the systems they should offer for booting
+ 'cols' => [
+ 'client_id:fk', # foreign key
+ 'system_id:fk', # foreign key
+ ],
+ },
+ 'export' => {
+ # an export describes a vendor-OS "wrapped" in some kind of exporting
+ # format (NFS or NBD-squash). This represents the rootfs that the
+ # clients will see.
+ 'cols' => [
+ 'id:pk', # primary key
+ 'name:s.64', # unique name of export, is automatically
+ # constructed like this:
+ # <vendor-os-name>-<export-type>
+ 'vendor_os_id:fk', # foreign key
+ 'comment:s.1024', # internal comment (optional, for admins)
+ 'type:s.10', # 'nbd', 'nfs', ...
+ 'server_ip:s.16', # IP of exporting server, if empty the
+ # boot server will be used
+ 'port:i', # some export types need to use a specific
+ # port for each incarnation, if that's the
+ # case you can specify it here
+ 'uri:s.255', # path to export (squashfs or NFS-path), if
+ # empty it will be auto-generated by
+ # config-demuxer
+ ],
+ },
+ 'global_info' => {
+ # a home for global counters and other info
+ 'cols' => [
+ 'id:s.32', # key
+ 'value:s.128', # value
+ ],
+ 'vals' => [
+ { # add nbd-server-port
+ 'id' => 'next-nbd-server-port',
+ 'value' => '5000',
+ },
+ ],
+ },
+ 'groups' => {
+ # a group encapsulates a set of clients as one entity, managing
+ # a group-specific attribute set. All the different attribute
+ # sets a client inherits via group membership are folded into
+ # one resulting attribute set with respect to each group's priority.
+ 'cols' => [
+ 'id:pk', # primary key
+ 'name:s.128', # name of group
+ 'priority:i', # priority, used for order in group-list
+ # (from 0-highest to 99-lowest)
+ 'comment:s.1024', # internal comment (optional, for admins)
+ ],
+ },
+ 'group_attr' => {
+ # attributes of groups
+ 'cols' => [
+ 'id:pk', # primary key
+ 'group_id:fk', # foreign key to group
+ 'name:s.128', # attribute name
+ 'value:s.255', # attribute value
+ ],
+ },
+ 'group_client_ref' => {
+ # groups referring to their clients
+ 'cols' => [
+ 'group_id:fk', # foreign key
+ 'client_id:fk', # foreign key
+ ],
+ },
+ 'group_system_ref' => {
+ # groups referring to the systems each of their clients should
+ # offer for booting
+ 'cols' => [
+ 'group_id:fk', # foreign key
+ 'system_id:fk', # foreign key
+ ],
+ },
+ 'installed_plugin' => {
+ # holds the plugins that have been installed into a specific
+ # vendor-OS
+ 'cols' => [
+ 'id:pk', # primary key
+ 'vendor_os_id:fk', # foreign key
+ 'plugin_name:s.64', # name of installed plugin
+ # (e.g. suse-9.3-kde, debian-3.1-ppc,
+ # suse-10.2-cloned-from-kiwi).
+ # This is used as the folder name for the
+ # corresponding stage1, too.
+ ],
+ },
+ 'installed_plugin_attr' => {
+ # (stage1-)attributes of installed plugins
+ 'cols' => [
+ 'id:pk', # primary key
+ 'installed_plugin_id:fk', # foreign key to installed plugin
+ 'name:s.128', # attribute name
+ 'value:s.255', # attribute value
+ ],
+ },
+ 'meta' => {
+ # information about the database as such
+ 'cols' => [
+ 'plugin_info_hash:s.32', # hash-value identifying a specific
+ # set of plugins and their
+ # attributes
+ 'schema_version:s.5', # schema-version currently
+ # implemented by DB
+ ],
+ 'vals' => [
+ {
+ 'plugin_info_hash' => '',
+ 'schema_version' => $VERSION,
+ },
+ ],
+ },
+ 'system' => {
+ # a system describes one bootable instance of an export, it
+ # represents a selectable line in the PXE boot menu of all the
+ # clients associated with this system
+ 'cols' => [
+ 'id:pk', # primary key
+ 'export_id:fk', # foreign key
+ 'name:s.64', # unique name of system, is automatically
+ # constructed like this:
+ # <vendor-os-name>-<export-type>-<kernel>
+ 'label:s.64', # name visible to user (pxe-label)
+ # if empty, this will be autocreated from
+ # the name
+ 'kernel:s.128', # path to kernel file, relative to /boot
+ 'description:s.512', # visible description (for PXE TEXT)
+ 'pxe_prefix_ip:s.16', # ip prefix for PXE Menu entry
+ 'comment:s.1024', # internal comment (optional, for admins)
+ ],
+ 'vals' => [
+ { # add default system
+ 'id' => 0,
+ 'name' => '<<<default>>>',
+ 'comment' => 'internal system that holds default values',
+ },
+ ],
+ },
+ 'system_attr' => {
+ # attributes of systems
+ 'cols' => [
+ 'id:pk', # primary key
+ 'system_id:fk', # foreign key to system
+ 'name:s.128', # attribute name
+ 'value:s.255', # attribute value
+ ],
+ },
+ 'vendor_os' => {
+ # a vendor-OS describes a folder containing an operating system as
+ # provided by the vendor (a.k.a. unchanged and thus updatable)
+ 'cols' => [
+ 'id:pk', # primary key
+ 'name:s.48', # structured name of OS installation
+ # (e.g. suse-9.3-kde, debian-3.1-ppc,
+ # suse-10.2-cloned-from-kiwi).
+ # This is used as the folder name for the
+ # corresponding stage1, too.
+ 'comment:s.1024', # internal comment (optional, for admins)
+ 'clone_source:s.255', # if vendor-OS was cloned, this contains
+ # the rsync-URI pointing to the original
+ ],
+ },
+ },
+};
+
+################################################################################
+###
+### standard methods
+###
+################################################################################
+sub new
+{
+ my $class = shift;
+
+ my $self = {
+ };
+
+ return bless $self, $class;
+}
+
+sub checkAndUpgradeDBSchemaIfNecessary
+{
+ my $self = shift;
+ my $configDB = shift;
+
+ my $metaDB = $configDB->{'meta-db'};
+
+ vlog(2, "trying to determine schema version...");
+ my $currVersion = $metaDB->schemaFetchDBVersion();
+ if (!defined $currVersion) {
+ # that's bad, someone has messed with our DB: there is a
+ # database, but the 'meta'-table is empty.
+ # There might still be data in the other tables, but we have no way to
+ # find out which schema version they're in. So it's safer to give up.
+ croak _tr('Could not determine schema version of database');
+ }
+
+ if ($currVersion == 0) {
+ vlog(1, _tr('Creating DB (schema version: %s)', $DbSchema->{version}));
+ foreach my $tableName (keys %{$DbSchema->{tables}}) {
+ # create table (optionally inserting default values, too)
+ $metaDB->schemaAddTable(
+ $tableName,
+ $DbSchema->{tables}->{$tableName}->{cols},
+ $DbSchema->{tables}->{$tableName}->{vals}
+ );
+ }
+ $metaDB->schemaSetDBVersion($DbSchema->{version});
+ $configDB->cleanupAnyInconsistencies()
+ or die _tr('unable to cleanup DB!');
+ vlog(1, _tr('DB has been created successfully'));
+ } elsif ($currVersion < $DbSchema->{version}) {
+ vlog(
+ 1,
+ _tr(
+ 'Our schema-version is %s, DB is %s, upgrading DB...',
+ $DbSchema->{version}, $currVersion
+ )
+ );
+ $self->_schemaUpgradeDBFrom($metaDB, $currVersion);
+ $configDB->cleanupAnyInconsistencies()
+ or die _tr('unable to cleanup DB!');
+ vlog(1, _tr('upgrade done'));
+ } else {
+ vlog(1, _tr('DB matches current schema version (%s)', $currVersion));
+ }
+
+ return 1;
+}
+
+sub getColumnsOfTable
+{
+ my $self = shift;
+ my $tableName = shift;
+
+ return
+ map { (/^(\w+)\W/) ? $1 : $_; }
+ @{$DbSchema->{tables}->{$tableName}->{cols}};
+}
+
+################################################################################
+###
+### methods for upgrading the DB schema
+###
+################################################################################
+my %DbSchemaHistory;
+
+sub _schemaUpgradeDBFrom
+{
+ my $self = shift;
+ my $metaDB = shift;
+ my $currVersion = shift;
+
+ foreach my $version (sort { $a <=> $b } keys %DbSchemaHistory) {
+ next if $currVersion >= $version;
+
+ vlog(0, "upgrading schema version to $version");
+ if ($DbSchemaHistory{$version}->($metaDB)) {
+ $metaDB->schemaSetDBVersion($version);
+ }
+ }
+
+ return 1;
+}
+
+%DbSchemaHistory = (
+ 0.2 => sub {
+ my $metaDB = shift;
+
+ # move attributes into separate tables ...
+ #
+ # ... system attributes ...
+ $metaDB->schemaAddTable(
+ 'system_attr',
+ [
+ 'id:pk',
+ 'system_id:fk',
+ 'name:s.128',
+ 'value:s.255',
+ ]
+ );
+ foreach my $system ($metaDB->fetchSystemByFilter()) {
+ my %attrs;
+ foreach my $key (keys %$system) {
+ next if substr($key, 0, 5) ne 'attr_';
+ my $attrValue = $system->{$key} || '';
+ next if $system->{id} > 0 && !length($attrValue);
+ my $newAttrName = substr($key, 5);
+ $attrs{$newAttrName} = $attrValue;
+ }
+ $metaDB->setSystemAttrs($system->{id}, \%attrs);
+ }
+ $metaDB->schemaDropColumns(
+ 'system',
+ [
+ 'attr_automnt_dir',
+ 'attr_automnt_src',
+ 'attr_country',
+ 'attr_dm_allow_shutdown',
+ 'attr_hw_graphic',
+ 'attr_hw_local_disk',
+ 'attr_hw_monitor',
+ 'attr_hw_mouse',
+ 'attr_late_dm',
+ 'attr_netbios_workgroup',
+ 'attr_nis_domain',
+ 'attr_nis_servers',
+ 'attr_ramfs_fsmods',
+ 'attr_ramfs_miscmods',
+ 'attr_ramfs_nicmods',
+ 'attr_ramfs_screen',
+ 'attr_sane_scanner',
+ 'attr_scratch',
+ 'attr_slxgrp',
+ 'attr_start_alsasound',
+ 'attr_start_atd',
+ 'attr_start_cron',
+ 'attr_start_dreshal',
+ 'attr_start_ntp',
+ 'attr_start_nfsv4',
+ 'attr_start_printer',
+ 'attr_start_samba',
+ 'attr_start_snmp',
+ 'attr_start_sshd',
+ 'attr_start_syslog',
+ 'attr_start_x',
+ 'attr_start_xdmcp',
+ 'attr_tex_enable',
+ 'attr_timezone',
+ 'attr_tvout',
+ 'attr_vmware',
+ ],
+ [
+ 'id:pk',
+ 'export_id:fk',
+ 'name:s.64',
+ 'label:s.64',
+ 'kernel:s.128',
+ 'kernel_params:s.512',
+ 'hidden:b',
+ 'comment:s.1024',
+ ]
+ );
+ #
+ # ... client attributes ...
+ $metaDB->schemaAddTable(
+ 'client_attr',
+ [
+ 'id:pk',
+ 'client_id:fk',
+ 'name:s.128',
+ 'value:s.255',
+ ]
+ );
+ foreach my $client ($metaDB->fetchClientByFilter()) {
+ my %attrs;
+ foreach my $key (keys %$client) {
+ next if substr($key, 0, 5) ne 'attr_';
+ my $attrValue = $client->{$key} || '';
+ next if !length($attrValue);
+ my $newAttrName = substr($key, 5);
+ $attrs{$newAttrName} = $attrValue;
+ }
+ $metaDB->setClientAttrs($client->{id}, \%attrs);
+ }
+ $metaDB->schemaDropColumns(
+ 'client',
+ [
+ 'attr_automnt_dir',
+ 'attr_automnt_src',
+ 'attr_country',
+ 'attr_dm_allow_shutdown',
+ 'attr_hw_graphic',
+ 'attr_hw_local_disk',
+ 'attr_hw_monitor',
+ 'attr_hw_mouse',
+ 'attr_late_dm',
+ 'attr_netbios_workgroup',
+ 'attr_nis_domain',
+ 'attr_nis_servers',
+ 'attr_sane_scanner',
+ 'attr_scratch',
+ 'attr_slxgrp',
+ 'attr_start_alsasound',
+ 'attr_start_atd',
+ 'attr_start_cron',
+ 'attr_start_dreshal',
+ 'attr_start_ntp',
+ 'attr_start_nfsv4',
+ 'attr_start_printer',
+ 'attr_start_samba',
+ 'attr_start_snmp',
+ 'attr_start_sshd',
+ 'attr_start_syslog',
+ 'attr_start_x',
+ 'attr_start_xdmcp',
+ 'attr_tex_enable',
+ 'attr_timezone',
+ 'attr_tvout',
+ 'attr_vmware',
+ ],
+ [
+ 'id:pk',
+ 'name:s.128',
+ 'mac:s.20',
+ 'boot_type:s.20',
+ 'unbootable:b',
+ 'kernel_params:s.128',
+ 'comment:s.1024',
+ ]
+ );
+ #
+ # ... group attributes ...
+ $metaDB->schemaAddTable(
+ 'group_attr',
+ [
+ 'id:pk',
+ 'group_id:fk',
+ 'name:s.128',
+ 'value:s.255',
+ ]
+ );
+ foreach my $group ($metaDB->fetchGroupByFilter()) {
+ my %attrs;
+ foreach my $key (keys %$group) {
+ next if substr($key, 0, 5) ne 'attr_';
+ my $attrValue = $group->{$key} || '';
+ next if !length($attrValue);
+ my $newAttrName = substr($key, 5);
+ $attrs{$newAttrName} = $attrValue;
+ }
+ $metaDB->setGroupAttrs($group->{id}, \%attrs);
+ }
+ $metaDB->schemaDropColumns(
+ 'groups',
+ [
+ 'attr_automnt_dir',
+ 'attr_automnt_src',
+ 'attr_country',
+ 'attr_dm_allow_shutdown',
+ 'attr_hw_graphic',
+ 'attr_hw_local_disk',
+ 'attr_hw_monitor',
+ 'attr_hw_mouse',
+ 'attr_late_dm',
+ 'attr_netbios_workgroup',
+ 'attr_nis_domain',
+ 'attr_nis_servers',
+ 'attr_sane_scanner',
+ 'attr_scratch',
+ 'attr_slxgrp',
+ 'attr_start_alsasound',
+ 'attr_start_atd',
+ 'attr_start_cron',
+ 'attr_start_dreshal',
+ 'attr_start_ntp',
+ 'attr_start_nfsv4',
+ 'attr_start_printer',
+ 'attr_start_samba',
+ 'attr_start_snmp',
+ 'attr_start_sshd',
+ 'attr_start_syslog',
+ 'attr_start_x',
+ 'attr_start_xdmcp',
+ 'attr_tex_enable',
+ 'attr_timezone',
+ 'attr_tvout',
+ 'attr_vmware',
+ ],
+ [
+ 'id:pk',
+ 'name:s.128',
+ 'priority:i',
+ 'comment:s.1024',
+ ]
+ );
+
+ return 1;
+ },
+ 0.21 => sub {
+ my $metaDB = shift;
+
+ # add new table installed_plugin
+ $metaDB->schemaAddTable(
+ 'installed_plugin',
+ [
+ 'id:pk',
+ 'vendor_os_id:fk',
+ 'plugin_name:s.64',
+ ]
+ );
+
+ return 1;
+ },
+ 0.22 => sub {
+ my $metaDB = shift;
+
+ # dummy schema change, just to trigger the attribute synchronization
+ # into the default system
+
+ return 1;
+ },
+ 0.23 => sub {
+ my $metaDB = shift;
+
+ # add new column system.description
+ $metaDB->schemaAddColumns(
+ 'system',
+ [
+ 'description:s.512',
+ ],
+ undef,
+ [
+ 'id:pk',
+ 'export_id:fk',
+ 'name:s.64',
+ 'label:s.64',
+ 'kernel:s.128',
+ 'kernel_params:s.512',
+ 'hidden:b',
+ 'description:s.512',
+ 'comment:s.1024',
+ ]
+ );
+
+ return 1;
+ },
+ 0.24 => sub {
+ my $metaDB = shift;
+
+ # split theme::name into theme::splash, theme::displaymanager and
+ # theme::desktop
+ foreach my $system ($metaDB->fetchSystemByFilter()) {
+ my $attrs = $system->{attrs} || {};
+ next if !exists $attrs->{'theme::name'};
+ $attrs->{'theme::splash'}
+ = $attrs->{'theme::displaymanager'}
+ = $attrs->{'theme::desktop'}
+ = $attrs->{'theme::name'};
+ delete $attrs->{'theme::name'};
+ $metaDB->setSystemAttrs($system->{id}, $attrs);
+ }
+
+ # force all plugin names to lowercase
+ foreach my $vendorOS ($metaDB->fetchVendorOSByFilter()) {
+ my @installedPlugins
+ = $metaDB->fetchInstalledPlugins($vendorOS->{id});
+ foreach my $plugin (@installedPlugins) {
+ my $pluginName = $plugin->{plugin_name};
+ $metaDB->removeInstalledPlugin($vendorOS->{id}, $pluginName);
+ $metaDB->addInstalledPlugin($vendorOS->{id}, lc($pluginName));
+ }
+ }
+
+ return 1;
+ },
+ 0.25 => sub {
+ my $metaDB = shift;
+
+ # drop attribute ramfs_screen
+ $metaDB->removeAttributeByName('ramfs_screen');
+
+ return 1;
+ },
+ 0.26 => sub {
+ my $metaDB = shift;
+
+ # rename all exports and systems that contain a single colon to
+ # the current naming scheme with a double colon
+ foreach my $system ($metaDB->fetchSystemByFilter()) {
+ if ($system->{name} =~ m{^([^:]+):([^:]+)$}) {
+ if ($system->{label} eq $system->{name}) {
+ $system->{label} = "${1}::${2}";
+ }
+ $system->{name} = "${1}::${2}";
+ $metaDB->changeSystem([ $system->{id} ], [ $system ]);
+ }
+ }
+ foreach my $export ($metaDB->fetchExportByFilter()) {
+ if ($export->{name} =~ m{^([^:]+):([^:]+)$}) {
+ $export->{name} = "${1}::${2}";
+ $metaDB->changeExport([ $export->{id} ], [ $export ]);
+ }
+ }
+
+ return 1;
+ },
+ 0.27 => sub {
+ my $metaDB = shift;
+
+ # add default vendor-OS, which holds info about the plugins that shall
+ # be automatically installed into all vendor-OS that are being created.
+ $metaDB->addVendorOS([{
+ id => '0',
+ name => '<<<default>>>',
+ comment => 'holds default plugins for all vendor-OS',
+ }]);
+
+ return 1;
+ },
+ 0.28 => sub {
+ my $metaDB = shift;
+
+ # correct effects of implementation error last time around that caused
+ # the default vendor-OS to not have any plugins at all - so we add
+ # the default plugins here:
+# OLTA: deactivated for good since this does not work anymore with newer
+# implementations (as addInstalledPlugin requires the table
+# 'installed_plugin_attr', which is going to be created in db-schema
+# version 0.29 (see below)
+# $metaDB->addInstalledPlugin(0, 'theme');
+
+ return 1;
+ },
+ 0.29 => sub {
+ my $metaDB = shift;
+
+ # add new table installed_plugin_attrs
+ $metaDB->schemaAddTable(
+ 'installed_plugin_attr',
+ [
+ 'id:pk',
+ 'installed_plugin_id:fk',
+ 'name:s.128',
+ 'value:s.255',
+ ],
+ );
+
+ return 1;
+ },
+ 0.30 => sub {
+ my $metaDB = shift;
+
+ # dummy schema change, just to trigger the attribute synchronization
+ # into the default system (required since plugins have been added
+ # and removed)
+
+ return 1;
+ },
+ 0.31 => sub {
+ my $metaDB = shift;
+
+ # dummy schema change, just to trigger the attribute synchronization
+ # again, as the respective code has been extended
+
+ return 1;
+ },
+ 0.32 => sub {
+ my $metaDB = shift;
+
+ # dummy schema change, just to trigger the attribute synchronization,
+ # as the 'theme' plugin has been removed
+
+ return 1;
+ },
+ 0.33 => sub {
+ my $metaDB = shift;
+
+ # add new column meta.plugin_info_hash
+ $metaDB->schemaAddColumns(
+ 'meta',
+ [
+ 'plugin_info_hash:s.32',
+ ],
+ undef,
+ [
+ 'plugin_info_hash:s.32',
+ 'schema_version:s.5',
+ ]
+ );
+
+ return 1;
+ },
+ 0.34 => sub {
+ my $metaDB = shift;
+
+ # turn client fields 'boot_type', 'kernel_params' and 'unbootable'
+ # into attributes:
+ foreach my $client ($metaDB->fetchClientByFilter()) {
+ my $attrs = $metaDB->fetchClientAttrs($client->{id});
+ $attrs->{boot_type} = $client->{boot_type} || 'pxe';
+ $attrs->{kernel_params_client} = $client->{kernel_params};
+ $attrs->{unbootable} = $client->{unbootable};
+ $metaDB->setClientAttrs($client->{id}, $attrs);
+ }
+ $metaDB->schemaDropColumns(
+ 'client',
+ [
+ 'boot_type',
+ 'kernel_params',
+ 'unbootable',
+ ],
+ [
+ 'id:pk',
+ 'name:s.128',
+ 'mac:s.20',
+ 'comment:s.1024',
+ ]
+ );
+
+ # turn system fields 'hidden' and 'kernel_params' into attributes:
+ foreach my $system ($metaDB->fetchSystemByFilter()) {
+ my $attrs = $metaDB->fetchSystemAttrs($system->{id});
+ $attrs->{hidden} = $system->{hidden};
+ $attrs->{kernel_params} = $system->{kernel_params};
+ $metaDB->setSystemAttrs($system->{id}, $attrs);
+ }
+ $metaDB->schemaDropColumns(
+ 'system',
+ [
+ 'hidden',
+ 'kernel_params',
+ ],
+ [
+ 'id:pk',
+ 'export_id:fk',
+ 'name:s.64',
+ 'label:s.64',
+ 'kernel:s.128',
+ 'description:s.512',
+ 'comment:s.1024',
+ ]
+ );
+
+ return 1;
+ },
+ 0.35 => sub {
+ my $metaDB = shift;
+
+ # add new column system.pxe_prefix_ip
+ $metaDB->schemaAddColumns(
+ 'system',
+ [
+ 'pxe_prefix_ip:s.16',
+ ],
+ undef
+ );
+
+ return 1;
+ },
+ 0.36 => sub {
+ my $metaDB = shift;
+
+ # value 'preboot-cd' in client-attr 'boot_type' has been changed
+ # to 'preboot', and a separate attribute 'preboot_media' has been
+ # introduced:
+ foreach my $client ($metaDB->fetchClientByFilter()) {
+ my $attrs = $metaDB->fetchClientAttrs($client->{id});
+ if ($attrs->{boot_type} eq 'preboot-cd') {
+ $attrs->{boot_type} = 'preboot';
+ $attrs->{preboot_media} = 'cd';
+ $metaDB->setClientAttrs($client->{id}, $attrs);
+ }
+ }
+
+ return 1;
+ },
+);
+
+1;
diff --git a/src/config-db/OpenSLX/MetaDB/Base.pm b/src/config-db/OpenSLX/MetaDB/Base.pm
new file mode 100644
index 00000000..f1fbd0f5
--- /dev/null
+++ b/src/config-db/OpenSLX/MetaDB/Base.pm
@@ -0,0 +1,1220 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# Base.pm
+# - provides empty base of the OpenSLX MetaDB API.
+# -----------------------------------------------------------------------------
+package OpenSLX::MetaDB::Base;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+use OpenSLX::Basics;
+
+################################################################################
+### basic functions
+################################################################################
+sub new
+{
+ confess "Don't create OpenSLX::MetaDB::Base - objects directly!";
+}
+
+sub connect ## no critic (ProhibitBuiltinHomonyms)
+{
+}
+
+sub disconnect
+{
+}
+
+sub quote
+{
+}
+
+################################################################################
+### data access interface
+################################################################################
+sub fetchVendorOSByFilter
+{
+}
+
+sub fetchVendorOSByID
+{
+}
+
+sub fetchExportByFilter
+{
+}
+
+sub fetchExportByID
+{
+}
+
+sub fetchExportIDsOfVendorOS
+{
+}
+
+sub fetchSystemByFilter
+{
+}
+
+sub fetchSystemByID
+{
+}
+
+sub fetchSystemIDsOfExport
+{
+}
+
+sub fetchSystemIDsOfClient
+{
+}
+
+sub fetchSystemIDsOfGroup
+{
+}
+
+sub fetchClientByFilter
+{
+}
+
+sub fetchClientByID
+{
+}
+
+sub fetchClientIDsOfSystem
+{
+}
+
+sub fetchClientIDsOfGroup
+{
+}
+
+sub fetchGroupByFilter
+{
+}
+
+sub fetchGroupByID
+{
+}
+
+sub fetchGroupIDsOfClient
+{
+}
+
+sub fetchGroupIDsOfSystem
+{
+}
+
+################################################################################
+### data manipulation interface
+################################################################################
+sub generateNextIdForTable
+{ # some DBs (CSV for instance) aren't able to generate any IDs, so we
+ # offer an alternative way (by pre-specifying IDs for INSERTs).
+ # NB: if this method is called without a tablename, it returns:
+ # 1 if this backend requires manual ID generation
+ # 0 if not.
+ return;
+}
+
+sub addVendorOS
+{
+}
+
+sub removeVendorOS
+{
+}
+
+sub changeVendorOS
+{
+}
+
+sub addExport
+{
+}
+
+sub removeExport
+{
+}
+
+sub changeExport
+{
+}
+
+sub addSystem
+{
+}
+
+sub removeSystem
+{
+}
+
+sub changeSystem
+{
+}
+
+sub setClientIDsOfSystem
+{
+}
+
+sub setGroupIDsOfSystem
+{
+}
+
+sub addClient
+{
+}
+
+sub removeClient
+{
+}
+
+sub changeClient
+{
+}
+
+sub setSystemIDsOfClient
+{
+}
+
+sub setGroupIDsOfClient
+{
+}
+
+sub addGroup
+{
+}
+
+sub removeGroup
+{
+}
+
+sub changeGroup
+{
+}
+
+sub setClientIDsOfGroup
+{
+}
+
+sub setSystemIDsOfGroup
+{
+}
+
+################################################################################
+### schema related functions
+################################################################################
+sub schemaFetchDBVersion
+{
+}
+
+sub schemaSetDBVersion
+{
+}
+
+sub schemaCreate
+{
+}
+
+sub schemaUpgradeToCurrent
+{
+}
+
+sub schemaConvertTypeDescrToNative
+{
+}
+
+sub schemaAddTable
+{
+}
+
+sub schemaDropTable
+{
+}
+
+sub schemaRenameTable
+{
+}
+
+sub schemaAddColumns
+{
+}
+
+sub schemaDropColumns
+{
+}
+
+sub schemaChangeColumns
+{
+}
+
+1;
+################################################################################
+
+=pod
+
+=head1 NAME
+
+OpenSLX::MetaDB::Base - the base class for all MetaDB drivers
+
+=head1 SYNOPSIS
+
+ package OpenSLX::MetaDB::coolnewDB;
+
+ use vars qw(@ISA $VERSION);
+ @ISA = ('OpenSLX::MetaDB::Base');
+ $VERSION = 1.01;
+
+ my $superVersion = $OpenSLX::MetaDB::Base::VERSION;
+ if ($superVersion < $VERSION) {
+ croak _tr('Unable to load module <%s> (Version <%s> required)',
+ 'OpenSLX::MetaDB::Base', $VERSION);
+ }
+
+ use coolnewDB;
+
+ sub new
+ {
+ my $class = shift;
+ my $self = {};
+ return bless $self, $class;
+ }
+
+ sub connectConfigDB
+ {
+ my $self = shift;
+
+ my $dbName = $openslxConfig{'db-name'};
+ vlog(1, "trying to connect to coolnewDB-database <$dbName>");
+ $self->{'dbh'} = ... # get connection handle from coolnewDB
+ }
+
+ sub disconnectConfigDB
+ {
+ my $self = shift;
+
+ $self->{'dbh'}->disconnect;
+ }
+
+ # override all methods of OpenSLX::MetaDB::Base in order to implement
+ # a full MetaDB driver
+ ...
+
+I<The synopsis above outlines a class that implements a
+MetaDB driver for the (imaginary) database B<coolnewDB>>
+
+=head1 DESCRIPTION
+
+This class defines the MetaDB interface for the OpenSLX.
+
+Aim of the MetaDB abstraction is to make it possible to use a large set
+of different databases (from CSV-files to a fullblown Oracle-installation)
+transparently.
+
+While OpenSLX::ConfigDB represents the data layer to the outside world, each
+implementation of OpenSLX::MetaDB::Base provides a backend for a specific database.
+
+This way, the different OpenSLX-scripts do not have to burden
+themselves with any DB-specific details, they just request the data they want
+from the ConfigDB-layer and that in turn creates and communicates with the
+appropriate MetaDB driver in order to connect to the database and fetch and/or
+change the data as instructed.
+
+The MetaDB interface contains of four different parts:
+
+=over
+
+=item - L<basic methods> (connection handling and utilities)
+
+=item - L<data access methods> (getting data)
+
+=item - L<data manipulation methods> (adding, removing and changing data)
+
+=item - L<schema related methods> (migrating between different DB-versions)
+
+=back
+
+In order to implement a MetaDB driver for a specific database, you need
+to inherit from B<OpenSLX::MetaDB::Base> and implement the full interface. As this
+is quite some work, it might be wiser to actually inherit your driver from
+B<L<OpenSLX::MetaDB::DBI|OpenSLX::MetaDB::DBI>>, which is a default implementation for SQL databases.
+
+If there is a DBD-driver for the database your new MetaDB driver wants to talk
+to then all you need to do is inherit from B<OpenSLX::MetaDB::DBI> and then
+reimplement L<C<connectConfigDB>> (and maybe some other methods in order to
+improve efficiency).
+
+=head1 Special Concepts
+
+=over
+
+=item C<Filters>
+
+A filter is a hash-ref defining the filter criteria to be applied to a database
+query. Each key of the filter corresponds to a DB column and the (hash-)value
+contains the respective column value.
+
+[At a later stage, this will be improved to support a more structured approach
+to filtering (with boolean operators and hierarchical expressions)].
+
+=back
+
+=head1 Methods
+
+=head2 Basic Methods
+
+The following basic methods need to be implemented in a MetaDB driver:
+
+=over
+
+=item C<connectConfigDB()>
+
+Tries to establish a connection to the DBMS that this MetaDB driver deals with.
+The global configuration hash C<%config> contains further info about the
+requested connection. When implementing this method, you may have to look at
+the following entries in order to find out which database to connect to:
+
+=over
+
+=item C<$config{'db-spec'}>
+
+Full specification of database, a special string defining the
+precise database to connect to (this allows connecting to a database
+that requires specifications which aren't cared for by the existing
+C<%config>-entries).
+
+=item C<$config{'db-name'}>
+
+The precise name of the database that should be connected (defaults to 'openslx').
+
+=back
+
+=item C<disconnectConfigDB()>
+
+Tears down the connection to the DBMS that this MetaDB driver deals with and
+cleans up.
+
+=item C<quote(string)>
+
+Returns the given string quoted such that it can be used in SQL-statements
+(with respect to the corresponding DBMS).
+
+This usually involves putting
+single quotes around the string and escaping any single quote characters
+enclosed in the given string with a backslash.
+
+=back
+
+=head2 Data Access Methods
+
+The following methods need to be implemented in a MetaDB driver in order to
+allow the user to access data:
+
+=over
+
+=item C<fetchVendorOSByFilter([%$filter], [$resultCols])>
+
+Fetches and returns information about all vendor-OSes that match the given
+filter.
+
+=over
+
+=item Param C<filter>
+
+A hash-ref containing the filter criteria that shall be applied - default
+is no filtering. See L</"Filters"> for more info.
+
+=item Param C<resultCols>
+
+A string listing the columns that shall be returned - default is all columns.
+
+=item Return Value
+
+An array of hash-refs containing the resulting data rows.
+
+=back
+
+=item C<fetchVendorOSByID(@$ids, [$resultCols])>
+
+Fetches and returns information the vendor-OSes with the given IDs.
+
+=over
+
+=item Param C<ids>
+
+An array of the vendor-OS-IDs you are interested in.
+
+=item Param C<resultCols>
+
+A string listing the columns that shall be returned - default is all columns.
+
+=item Return Value
+
+An array of hash-refs containing the resulting data rows.
+
+=back
+
+=item C<fetchExportByFilter([%$filter], [$resultCols])>
+
+Fetches and returns information about all exports that match the given
+filter.
+
+=over
+
+=item Param C<filter>
+
+A hash-ref containing the filter criteria that shall be applied - default
+is no filtering. See L</"Filters"> for more info.
+
+=item Param C<resultCols>
+
+A string listing the columns that shall be returned - default is all columns.
+
+=item Return Value
+
+An array of hash-refs containing the resulting data rows.
+
+=back
+
+=item C<fetchExportByID(@$ids, [$resultCols])>
+
+Fetches and returns information the exports with the given IDs.
+
+=over
+
+=item Param C<ids>
+
+An array of the export-IDs you are interested in.
+
+=item Param C<resultCols>
+
+A string listing the columns that shall be returned - default is all columns.
+
+=item Return Value
+
+An array of hash-refs containing the resulting data rows.
+
+=back
+
+=item C<fetchExportIDsOfVendorOS($id)>
+
+Fetches the IDs of all exports that make use of the vendor-OS with the given ID.
+
+=over
+
+=item Param C<id>
+
+ID of the vendor-OS whose exports shall be returned.
+
+=item Return Value
+
+An array of system-IDs.
+
+=back
+
+=item C<fetchSystemByFilter([%$filter], [$resultCols])>
+
+Fetches and returns information about all systems that match the given filter.
+
+=over
+
+=item Param C<$filter>
+
+A hash-ref containing the filter criteria that shall be applied - default
+is no filtering. See L</"Filters"> for more info.
+
+=item Param C<$resultCols> [Optional]
+
+A comma-separated list of colunm names that shall be returned. If not defined,
+all available data must be returned.
+
+=item Return Value
+
+An array of hash-refs containing the resulting data rows.
+
+=back
+
+=item C<fetchSystemByID(@$ids, [$resultCols])>
+
+Fetches and returns information the systems with the given IDs.
+
+=over
+
+=item Param C<ids>
+
+An array of the system-IDs you are interested in.
+
+=item Param C<resultCols>
+
+A string listing the columns that shall be returned - default is all columns.
+
+=item Return Value
+
+An array of hash-refs containing the resulting data rows.
+
+=back
+
+=item C<fetchSystemIDsOfExport($id)>
+
+Fetches the IDs of all systems that make use of the export with the given ID.
+
+=over
+
+=item Param C<id>
+
+ID of the export whose systems shall be returned.
+
+=item Return Value
+
+An array of system-IDs.
+
+=back
+
+=item C<fetchSystemIDsOfClient($id)>
+
+Fetches the IDs of all systems that are used by the client with the given
+ID.
+
+=over
+
+=item Param C<id>
+
+ID of the client whose systems shall be returned.
+
+=item Return Value
+
+An array of system-IDs.
+
+=back
+
+=item C<fetchSystemIDsOfGroup($id)>
+
+Fetches the IDs of all systems that are part of the group with the given
+ID.
+
+=over
+
+=item Param C<id>
+
+ID of the group whose systems shall be returned.
+
+=item Return Value
+
+An array of system-IDs.
+
+=back
+
+=item C<fetchClientByFilter([%$filter], [$resultCols])>
+
+Fetches and returns information about all clients that match the given filter.
+
+=over
+
+=item Param C<$filter>
+
+A hash-ref containing the filter criteria that shall be applied - default
+is no filtering. See L</"Filters"> for more info.
+
+=item Param C<$resultCols> [Optional]
+
+A comma-separated list of colunm names that shall be returned. If not defined,
+all available data must be returned.
+
+=item Return Value
+
+An array of hash-refs containing the resulting data rows.
+
+=back
+
+=item C<fetchClientByID(@$ids, [$resultCols])>
+
+Fetches and returns information the clients with the given IDs.
+
+=over
+
+=item Param C<ids>
+
+An array of the client-IDs you are interested in.
+
+=item Param C<resultCols>
+
+A string listing the columns that shall be returned - default is all columns.
+
+=item Return Value
+
+An array of hash-refs containing the resulting data rows.
+
+=back
+
+=item C<fetchClientIDsOfSystem($id)>
+
+Fetches the IDs of all clients that make use of the system with the given
+ID.
+
+=over
+
+=item Param C<id>
+
+ID of the system whose clients shall be returned.
+
+=item Return Value
+
+An array of client-IDs.
+
+=back
+
+=item C<fetchClientIDsOfGroup($id)>
+
+Fetches the IDs of all clients that are part of the group with the given
+ID.
+
+=over
+
+=item Param C<id>
+
+ID of the group whose clients shall be returned.
+
+=item Return Value
+
+An array of client-IDs.
+
+=back
+
+
+
+=item C<fetchGroupByFilter([%$filter], [$resultCols])>
+
+Fetches and returns information about all groups that match the given filter.
+
+=over
+
+=item Param C<$filter>
+
+A hash-ref containing the filter criteria that shall be applied - default
+is no filtering. See L</"Filters"> for more info.
+
+=item Param C<$resultCols> [Optional]
+
+A comma-separated list of colunm names that shall be returned. If not defined,
+all available data must be returned.
+
+=item Return Value
+
+An array of hash-refs containing the resulting data rows.
+
+=back
+
+
+
+=item C<fetchGroupByID(@$ids, [$resultCols])>
+
+Fetches and returns information the groups with the given IDs.
+
+=over
+
+=item Param C<ids>
+
+An array of the group-IDs you are interested in.
+
+=item Param C<resultCols>
+
+A string listing the columns that shall be returned - default is all columns.
+
+=item Return Value
+
+An array of hash-refs containing the resulting data rows.
+
+=back
+
+
+
+=item C<fetchGroupIDsOfClient($id)>
+
+Fetches the IDs of all groups that contain the client with the given
+ID.
+
+=over
+
+=item Param C<id>
+
+ID of the client whose groups shall be returned.
+
+=item Return Value
+
+An array of client-IDs.
+
+=back
+
+
+
+=item C<fetchGroupIDsOfSystem($id)>
+
+Fetches the IDs of all groups that contain the system with the given
+ID.
+
+=over
+
+=item Param C<id>
+
+ID of the system whose groups shall be returned.
+
+=item Return Value
+
+An array of client-IDs.
+
+=back
+
+
+
+=head2 Data Manipulation Methods
+
+The following methods need to be implemented in a MetaDB driver in order to
+allow the user to access change the underlying:
+
+
+
+=item C<addVendorOS(@$valRows)>
+
+Adds one or more vendor-OS to the database.
+
+=over
+
+=item Param C<valRows>
+
+An array-ref containing hash-refs with the data of the new vendor-OS(es).
+
+=item Return Value
+
+The IDs of the new vendor-OS(es), C<undef> if the creation failed.
+
+=back
+
+
+
+=item C<removeVendorOS(@$vendorOSIDs)>
+
+Removes one or more vendor-OS from the database.
+
+=over
+
+=item Param C<vendorOSIDs>
+
+An array-ref containing the IDs of the vendor-OSes that shall be removed.
+
+=item Return Value
+
+C<1> if the vendorOS(es) could be removed, C<undef> if not.
+
+=back
+
+
+
+=item C<changeVendorOS(@$vendorOSIDs, @$valRows)>
+
+Changes the data of one or more vendor-OS.
+
+=over
+
+=item Param C<vendorOSIDs>
+
+An array-ref containing the IDs of the vendor-OSes that shall be changed.
+
+=item Param C<valRows>
+
+An array-ref containing hash-refs with the new data for the vendor-OS(es).
+
+=item Return Value
+
+C<1> if the vendorOS(es) could be changed, C<undef> if not.
+
+=back
+
+
+
+=item C<addExport(@$valRows)>
+
+Adds one or more export to the database.
+
+=over
+
+=item Param C<valRows>
+
+An array-ref containing hash-refs with the data of the new export(s).
+
+=item Return Value
+
+The IDs of the new export(s), C<undef> if the creation failed.
+
+=back
+
+
+
+=item C<removeExport(@$exportIDs)>
+
+Removes one or more export from the database.
+
+=over
+
+=item Param C<exportIDs>
+
+An array-ref containing the IDs of the exports that shall be removed.
+
+=item Return Value
+
+C<1> if the export(s) could be removed, C<undef> if not.
+
+=back
+
+
+
+=item C<changeExport(@$exportIDs, @$valRows)>
+
+Changes the data of one or more export.
+
+=over
+
+=item Param C<vendorOSIDs>
+
+An array-ref containing the IDs of the exports that shall be changed.
+
+=item Param C<valRows>
+
+An array-ref containing hash-refs with the new data for the export(s).
+
+=item Return Value
+
+C<1> if the export(s) could be changed, C<undef> if not.
+
+=back
+
+
+
+=item C<addSystem(@$valRows)>
+
+Adds one or more systems to the database.
+
+=over
+
+=item Param C<valRows>
+
+An array-ref containing hash-refs with the data of the new system(s).
+
+=item Return Value
+
+The IDs of the new system(s), C<undef> if the creation failed.
+
+=back
+
+
+
+=item C<removeSystem(@$systemIDs)>
+
+Removes one or more systems from the database.
+
+=over
+
+=item Param C<systemIDs>
+
+An array-ref containing the IDs of the systems that shall be removed.
+
+=item Return Value
+
+C<1> if the system(s) could be removed, C<undef> if not.
+
+=back
+
+
+
+=item C<changeSystem(@$systemIDs, @$valRows)>
+
+Changes the data of one or more systems.
+
+=over
+
+=item Param C<systemIDs>
+
+An array-ref containing the IDs of the systems that shall be changed.
+
+=item Param C<valRows>
+
+An array-ref containing hash-refs with the new data for the system(s).
+
+=item Return Value
+
+C<1> if the system(s) could be changed, C<undef> if not.
+
+=back
+
+
+
+=item C<setClientIDsOfSystem($systemID, @$clientIDs)>
+
+Specifies all clients that should offer the given system for booting.
+
+=over
+
+=item Param C<systemID>
+
+The ID of the system whose clients you'd like to specify.
+
+=item Param C<clientIDs>
+
+An array-ref containing the IDs of the clients that shall be connected to the
+system.
+
+=item Return Value
+
+C<1> if the system/client references could be set, C<undef> if not.
+
+=back
+
+
+
+=item C<setGroupIDsOfSystem($systemID, @$groupIDs)>
+
+Specifies all groups that should offer the given system for booting.
+
+=over
+
+=item Param C<systemID>
+
+The ID of the system whose groups you'd like to specify.
+
+=item Param C<clientIDs>
+
+An array-ref containing the IDs of the groups that shall be connected to the
+system.
+
+=item Return Value
+
+C<1> if the system/group references could be set, C<undef> if not.
+
+=back
+
+
+
+=item C<addClient(@$valRows)>
+
+Adds one or more clients to the database.
+
+=over
+
+=item Param C<valRows>
+
+An array-ref containing hash-refs with the data of the new client(s).
+
+=item Return Value
+
+The IDs of the new client(s), C<undef> if the creation failed.
+
+=back
+
+
+
+=item C<removeClient(@$clientIDs)>
+
+Removes one or more clients from the database.
+
+=over
+
+=item Param C<clientIDs>
+
+An array-ref containing the IDs of the clients that shall be removed.
+
+=item Return Value
+
+C<1> if the client(s) could be removed, C<undef> if not.
+
+=back
+
+
+
+=item C<changeClient(@$clientIDs, @$valRows)>
+
+Changes the data of one or more clients.
+
+=over
+
+=item Param C<clientIDs>
+
+An array-ref containing the IDs of the clients that shall be changed.
+
+=item Param C<valRows>
+
+An array-ref containing hash-refs with the new data for the client(s).
+
+=item Return Value
+
+C<1> if the client(s) could be changed, C<undef> if not.
+
+=back
+
+
+
+=item C<setSystemIDsOfClient($clientID, @$clientIDs)>
+
+Specifies all systems that should be offered for booting by the given client.
+
+=over
+
+=item Param C<clientID>
+
+The ID of the client whose systems you'd like to specify.
+
+=item Param C<systemIDs>
+
+An array-ref containing the IDs of the systems that shall be connected to the
+client.
+
+=item Return Value
+
+C<1> if the client/system references could be set, C<undef> if not.
+
+=back
+
+
+
+=item C<setGroupIDsOfClient($clientID, @$groupIDs)>
+
+Specifies all groups that the given client shall be part of.
+
+=over
+
+=item Param C<clientID>
+
+The ID of the client whose groups you'd like to specify.
+
+=item Param C<groupIDs>
+
+An array-ref containing the IDs of the groups that the client should be part of.
+
+=item Return Value
+
+C<1> if the client/group references could be set, C<undef> if not.
+
+=back
+
+
+
+=item C<addGroup(@$valRows)>
+
+Adds one or more groups to the database.
+
+=over
+
+=item Param C<valRows>
+
+An array-ref containing hash-refs with the data of the new group(s).
+
+=item Return Value
+
+The IDs of the new group(s), C<undef> if the creation failed.
+
+=back
+
+
+
+=item C<removeGroup(@$groupIDs)>
+
+Removes one or more groups from the database.
+
+=over
+
+=item Param C<groupIDs>
+
+An array-ref containing the IDs of the groups that shall be removed.
+
+=item Return Value
+
+C<1> if the group(s) could be removed, C<undef> if not.
+
+=back
+
+
+
+=item C<changeGroup(@$groupIDs, @$valRows)>
+
+Changes the data of one or more groups.
+
+=over
+
+=item Param C<groupIDs>
+
+An array-ref containing the IDs of the groups that shall be changed.
+
+=item Param C<valRows>
+
+An array-ref containing hash-refs with the new data for the group(s).
+
+=item Return Value
+
+C<1> if the group(s) could be changed, C<undef> if not.
+
+=back
+
+
+
+=item C<setClientIDsOfGroup($groupID, @$clientIDs)>
+
+Specifies all clients that should be part of the given group.
+
+=over
+
+=item Param C<groupID>
+
+The ID of the group whose clients you'd like to specify.
+
+=item Param C<clientIDs>
+
+An array-ref containing the IDs of the clients that shall be part of the group.
+
+=item Return Value
+
+C<1> if the group/client references could be set, C<undef> if not.
+
+=back
+
+
+
+=item C<setSystemIDsOfGroup($groupID, @$groupIDs)>
+
+Specifies all systems that should be offered for booting by the given group.
+
+=over
+
+=item Param C<groupID>
+
+The ID of the group whose systems you'd like to specify.
+
+=item Param C<systemIDs>
+
+An array-ref containing the IDs of the systems that shall be connected to the
+group.
+
+=item Return Value
+
+C<1> if the group/system references could be set, C<undef> if not.
+
+=back
+
+
+
+
+
+=head2 Schema Related Methods
+
+The following methods need to be implemented in a MetaDB driver in order to
+be able to automatically adjust to new database schema versions (by adding
+and/or removing tables and table-columns).
+
+=cut
diff --git a/src/config-db/OpenSLX/MetaDB/DBI.pm b/src/config-db/OpenSLX/MetaDB/DBI.pm
new file mode 100644
index 00000000..a5a8e68e
--- /dev/null
+++ b/src/config-db/OpenSLX/MetaDB/DBI.pm
@@ -0,0 +1,1540 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# DBI.pm
+# - provides DBI-based implementation of the OpenSLX MetaDB API.
+# -----------------------------------------------------------------------------
+package OpenSLX::MetaDB::DBI;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::MetaDB::Base);
+
+use DBI;
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### basics
+################################################################################
+sub new
+{
+ confess "Don't call OpenSLX::MetaDB::DBI::new directly!";
+}
+
+sub disconnect
+{
+ my $self = shift;
+
+ $self->{'dbh'}->disconnect;
+ $self->{'dbh'} = undef;
+ return;
+}
+
+sub quote
+{ # default implementation quotes any given values through the DBI
+ my $self = shift;
+
+ return $self->{'dbh'}->quote(@_);
+}
+
+sub startTransaction
+{ # default implementation passes on the request to the DBI
+ my $self = shift;
+
+ return $self->{'dbh'}->begin_work();
+}
+
+sub commitTransaction
+{ # default implementation passes on the request to the DBI
+ my $self = shift;
+
+ return $self->{'dbh'}->commit();
+}
+
+sub rollbackTransaction
+{ # default implementation passes on the request to the DBI
+ my $self = shift;
+
+ return $self->{'dbh'}->rollback();
+}
+
+################################################################################
+### data access
+################################################################################
+sub _trim
+{
+ my $s = shift;
+ $s =~ s[^\s*(.*?)\s*$][$1];
+ return $s;
+}
+
+sub _buildFilterClause
+{
+ my $self = shift;
+ my $filter = shift || {};
+ my $filterClause = shift || '';
+
+ my ($connector, $quotedVal);
+ foreach my $col (keys %$filter) {
+ $connector = !length($filterClause) ? 'WHERE' : 'AND';
+ if (defined $filter->{$col}) {
+ $quotedVal = $self->{dbh}->quote($filter->{$col});
+ $filterClause .= unshiftHereDoc(<<" End-of-Here");
+ $connector $col = $quotedVal
+ End-of-Here
+ } else {
+ $filterClause .= unshiftHereDoc(<<" End-of-Here");
+ $connector $col IS NULL
+ End-of-Here
+ }
+ }
+
+ return $filterClause || '';
+}
+
+sub _buildAttrFilterClause
+{
+ my $self = shift;
+ my $attrFilter = shift || {};
+ my $table = shift;
+ my $filterClause = shift || '';
+
+ my %tableMap = (
+ 'client' => 'client',
+ 'group' => 'groups',
+ 'system' => 'system',
+ );
+
+ my ($connector, $quotedName, $quotedValue);
+ foreach my $name (keys %$attrFilter) {
+ $connector = !length($filterClause) ? 'WHERE' : 'AND';
+ $quotedName = $self->{dbh}->quote($name);
+ if (defined $attrFilter->{$name}) {
+ $quotedValue = $self->{dbh}->quote($attrFilter->{$name});
+ $filterClause .= unshiftHereDoc(<<" End-of-Here");
+ $connector EXISTS (
+ SELECT name FROM ${table}_attr
+ WHERE name = $quotedName
+ AND value = $quotedValue
+ AND ${table}_id = $tableMap{$table}.id
+ )
+ End-of-Here
+ } else {
+ $filterClause .= unshiftHereDoc(<<" End-of-Here");
+ $connector NOT EXISTS (
+ SELECT name FROM ${table}_attr
+ WHERE name = $quotedName
+ AND ${table}_id = $tableMap{$table}.id
+ )
+ End-of-Here
+ }
+ }
+
+ return $filterClause;
+}
+
+sub _doSelect
+{
+ my $self = shift;
+ my $sql = shift;
+ my $resultCol = shift;
+
+ my $dbh = $self->{'dbh'};
+
+ vlog(3, _trim($sql));
+ my $sth = $dbh->prepare($sql)
+ or croak _tr(
+ q[Can't prepare SQL-statement <%s> (%s)], $sql, $dbh->errstr
+ );
+ $sth->execute()
+ or croak _tr(
+ q[Can't execute SQL-statement <%s> (%s)], $sql, $dbh->errstr
+ );
+ my @vals;
+ while (my $row = $sth->fetchrow_hashref()) {
+ if (defined $resultCol) {
+ return $row->{$resultCol} unless wantarray();
+ push @vals, $row->{$resultCol};
+ } else {
+ return $row unless wantarray();
+ push @vals, $row;
+ }
+ }
+
+ # return undef if there's no result in scalar context
+ return if !wantarray();
+
+ return @vals;
+}
+
+sub fetchVendorOSByFilter
+{
+ my $self = shift;
+ my $filter = shift;
+ my $resultCols = shift;
+
+ $resultCols = '*' unless (defined $resultCols);
+ my $filterClause = $self->_buildFilterClause($filter);
+ my $sql = "SELECT $resultCols FROM vendor_os $filterClause";
+ return $self->_doSelect($sql);
+}
+
+sub fetchVendorOSByID
+{
+ my $self = shift;
+ my $ids = shift;
+ my $resultCols = shift;
+
+ $resultCols = '*' unless (defined $resultCols);
+ my $idStr = join ',', @$ids;
+ return if !length($idStr);
+ my $sql = "SELECT $resultCols FROM vendor_os WHERE id IN ($idStr)";
+ return $self->_doSelect($sql);
+}
+
+sub fetchInstalledPlugins
+{
+ my $self = shift;
+ my $vendorOSID = shift;
+ my $pluginName = shift;
+ my $fullInfo = shift || 0;
+
+ return if !defined $vendorOSID;
+ my $nameClause
+ = defined $pluginName
+ ? "AND plugin_name = '$pluginName'"
+ : '';
+ my $sql = unshiftHereDoc(<<" End-of-Here");
+ SELECT * FROM installed_plugin
+ WHERE vendor_os_id = '$vendorOSID'
+ $nameClause
+ End-of-Here
+ my @pluginInfos = $self->_doSelect($sql);
+ return if !@pluginInfos;
+
+ @pluginInfos = map {
+ my $pluginInfo = $_;
+ my $sql = unshiftHereDoc(<<" End-of-Here");
+ SELECT * FROM installed_plugin_attr
+ WHERE installed_plugin_id = '$pluginInfo->{id}'
+ End-of-Here
+ my @attrs = $self->_doSelect($sql);
+ $pluginInfo->{attrs} = {
+ map {
+ ( $_->{name}, $fullInfo ? $_ : $_->{value} )
+ } @attrs
+ };
+ $pluginInfo;
+ }
+ @pluginInfos;
+
+ return wantarray() ? @pluginInfos : $pluginInfos[0];
+}
+
+sub fetchExportByFilter
+{
+ my $self = shift;
+ my $filter = shift;
+ my $resultCols = shift;
+
+ $resultCols = '*' unless (defined $resultCols);
+ my $filterClause = $self->_buildFilterClause($filter);
+ my $sql = "SELECT $resultCols FROM export $filterClause";
+ return $self->_doSelect($sql);
+}
+
+sub fetchExportByID
+{
+ my $self = shift;
+ my $ids = shift;
+ my $resultCols = shift;
+
+ $resultCols = '*' unless (defined $resultCols);
+ my $idStr = join ',', @$ids;
+ return if !length($idStr);
+ my $sql = "SELECT $resultCols FROM export WHERE id IN ($idStr)";
+ return $self->_doSelect($sql);
+}
+
+sub fetchExportIDsOfVendorOS
+{
+ my $self = shift;
+ my $vendorOSID = shift;
+
+ my $sql = qq[
+ SELECT id FROM export WHERE vendor_os_id = '$vendorOSID'
+ ];
+ return $self->_doSelect($sql, 'id');
+}
+
+sub fetchGlobalInfo
+{
+ my $self = shift;
+ my $id = shift;
+
+ return if !length($id);
+ my $sql = "SELECT value FROM global_info WHERE id = " . $self->quote($id);
+ return $self->_doSelect($sql, 'value');
+}
+
+sub fetchSystemByFilter
+{
+ my $self = shift;
+ my $filter = shift;
+ my $resultCols = shift;
+ my $attrFilter = shift;
+
+ $resultCols = '*' unless (defined $resultCols);
+ my $filterClause = $self->_buildFilterClause($filter);
+ $filterClause = $self->_buildAttrFilterClause(
+ $attrFilter, 'system', $filterClause
+ );
+ my $sql = unshiftHereDoc(<<" End-of-Here");
+ SELECT $resultCols FROM system
+ $filterClause
+ End-of-Here
+ return $self->_doSelect($sql);
+}
+
+sub fetchSystemByID
+{
+ my $self = shift;
+ my $ids = shift;
+ my $resultCols = shift;
+
+ $resultCols = '*' unless (defined $resultCols);
+ my $idStr = join ',', @$ids;
+ return if !length($idStr);
+ my $sql = "SELECT $resultCols FROM system WHERE id IN ($idStr)";
+ return $self->_doSelect($sql);
+}
+
+sub fetchSystemAttrs
+{
+ my $self = shift;
+ my $systemID = $self->{dbh}->quote(shift);
+
+ my $sql = unshiftHereDoc(<<" End-of-Here");
+ SELECT name, value FROM system_attr
+ WHERE system_id = $systemID
+ End-of-Here
+ my @attrs = $self->_doSelect($sql);
+ my $Result = {};
+ foreach my $attr (@attrs) {
+ $Result->{$attr->{name}} = $attr->{value};
+ }
+ return $Result;
+}
+
+sub fetchSystemIDsOfExport
+{
+ my $self = shift;
+ my $exportID = shift;
+
+ my $sql = qq[
+ SELECT id FROM system WHERE export_id = '$exportID'
+ ];
+ return $self->_doSelect($sql, 'id');
+}
+
+sub fetchSystemIDsOfClient
+{
+ my $self = shift;
+ my $clientID = shift;
+
+ my $sql = qq[
+ SELECT system_id FROM client_system_ref WHERE client_id = '$clientID'
+ ];
+ return $self->_doSelect($sql, 'system_id');
+}
+
+sub fetchSystemIDsOfGroup
+{
+ my $self = shift;
+ my $groupID = shift;
+
+ my $sql = qq[
+ SELECT system_id FROM group_system_ref WHERE group_id = '$groupID'
+ ];
+ return $self->_doSelect($sql, 'system_id');
+}
+
+sub fetchClientByFilter
+{
+ my $self = shift;
+ my $filter = shift;
+ my $resultCols = shift;
+ my $attrFilter = shift;
+
+ $resultCols = '*' unless (defined $resultCols);
+ my $filterClause = $self->_buildFilterClause($filter);
+ $filterClause = $self->_buildAttrFilterClause(
+ $attrFilter, 'client', $filterClause
+ );
+ my $sql = unshiftHereDoc(<<" End-of-Here");
+ SELECT $resultCols FROM client
+ $filterClause
+ End-of-Here
+ return $self->_doSelect($sql);
+}
+
+sub fetchClientByID
+{
+ my $self = shift;
+ my $ids = shift;
+ my $resultCols = shift;
+
+ $resultCols = '*' unless (defined $resultCols);
+ my $idStr = join ',', @$ids;
+ return if !length($idStr);
+ my $sql = "SELECT $resultCols FROM client WHERE id IN ($idStr)";
+ return $self->_doSelect($sql);
+}
+
+sub fetchClientAttrs
+{
+ my $self = shift;
+ my $clientID = $self->{dbh}->quote(shift);
+
+ my $sql = unshiftHereDoc(<<" End-of-Here");
+ SELECT name, value FROM client_attr
+ WHERE client_id = $clientID
+ End-of-Here
+ my @attrs = $self->_doSelect($sql);
+ my $Result = {};
+ foreach my $attr (@attrs) {
+ $Result->{$attr->{name}} = $attr->{value};
+ }
+ return $Result;
+}
+
+sub fetchClientIDsOfSystem
+{
+ my $self = shift;
+ my $systemID = shift;
+
+ my $sql = qq[
+ SELECT client_id FROM client_system_ref WHERE system_id = '$systemID'
+ ];
+ return $self->_doSelect($sql, 'client_id');
+}
+
+sub fetchClientIDsOfGroup
+{
+ my $self = shift;
+ my $groupID = shift;
+
+ my $sql = qq[
+ SELECT client_id FROM group_client_ref WHERE group_id = '$groupID'
+ ];
+ return $self->_doSelect($sql, 'client_id');
+}
+
+sub fetchGroupByFilter
+{
+ my $self = shift;
+ my $filter = shift;
+ my $resultCols = shift;
+ my $attrFilter = shift;
+
+ $resultCols = '*' unless (defined $resultCols);
+ my $filterClause = $self->_buildFilterClause($filter);
+ $filterClause = $self->_buildAttrFilterClause(
+ $attrFilter, 'group', $filterClause
+ );
+ my $sql = unshiftHereDoc(<<" End-of-Here");
+ SELECT $resultCols FROM groups
+ $filterClause
+ End-of-Here
+ return $self->_doSelect($sql);
+}
+
+sub fetchGroupByID
+{
+ my $self = shift;
+ my $ids = shift;
+ my $resultCols = shift;
+
+ $resultCols = '*' unless (defined $resultCols);
+ my $idStr = join ',', @$ids;
+ return if !length($idStr);
+ my $sql = "SELECT $resultCols FROM groups WHERE id IN ($idStr)";
+ return $self->_doSelect($sql);
+}
+
+sub fetchGroupAttrs
+{
+ my $self = shift;
+ my $groupID = $self->{dbh}->quote(shift);
+
+ my $sql = unshiftHereDoc(<<" End-of-Here");
+ SELECT name, value FROM group_attr
+ WHERE group_id = $groupID
+ End-of-Here
+ my @attrs = $self->_doSelect($sql);
+ my $Result = {};
+ foreach my $attr (@attrs) {
+ $Result->{$attr->{name}} = $attr->{value};
+ }
+ return $Result;
+}
+
+sub fetchGroupIDsOfSystem
+{
+ my $self = shift;
+ my $systemID = shift;
+
+ my $sql = qq[
+ SELECT group_id FROM group_system_ref WHERE system_id = '$systemID'
+ ];
+ return $self->_doSelect($sql, 'group_id');
+}
+
+sub fetchGroupIDsOfClient
+{
+ my $self = shift;
+ my $clientID = shift;
+
+ my $sql = qq[
+ SELECT group_id FROM group_client_ref WHERE client_id = '$clientID'
+ ];
+ return $self->_doSelect($sql, 'group_id');
+}
+
+################################################################################
+### data manipulation functions
+################################################################################
+sub _doInsert
+{
+ my $self = shift;
+ my $table = shift;
+ my $valRows = shift;
+ my $ignoreIDs = shift;
+
+ my $dbh = $self->{'dbh'};
+ my $valRow = (@$valRows)[0];
+ return if !defined $valRow || !scalar keys %$valRow;
+
+ if ($table =~ m[_ref$]) {
+ # reference tables do not have IDs:
+ $ignoreIDs = 1;
+ }
+
+ my $needToGenerateIDs = $self->generateNextIdForTable(undef);
+ if (!$ignoreIDs && $needToGenerateIDs) {
+ # DB requires pre-specified IDs, so we add the 'id' column:
+ $valRow->{id} = undef unless exists $valRow->{id};
+ }
+ my @ids;
+ foreach my $valRow (@$valRows) {
+ if (!defined $valRow->{id} && !$ignoreIDs && $needToGenerateIDs) {
+ # let DB-backend pre-specify ID, as current DB can't generate IDs:
+ $valRow->{id} = $self->generateNextIdForTable($table);
+ vlog(3, "generated id for <$table> is <$valRow->{id}>");
+ }
+ my $cols = join ', ', keys %$valRow;
+ my $values = join ', ',
+ map { $self->quote($valRow->{$_}) } keys %$valRow;
+ my $sql = "INSERT INTO $table ( $cols ) VALUES ( $values )";
+ vlog(3, $sql);
+ my $sth = $dbh->prepare($sql)
+ or croak _tr(q[Can't insert into table <%s> (%s)], $table,
+ $dbh->errstr);
+ $sth->execute()
+ or croak _tr(q[Can't insert into table <%s> (%s)], $table,
+ $dbh->errstr);
+ if (!$ignoreIDs) {
+ my $lastID = $dbh->last_insert_id(undef, undef, $table, 'id');
+ if (!defined $valRow->{id}) {
+ # id has not been pre-specified, we need to fetch it from DB:
+ $valRow->{'id'} = $lastID;
+ vlog(3, "DB-generated id for <$table> is <$valRow->{id}>");
+ }
+ elsif ($valRow->{'id'} ne $lastID) {
+ # id has been pre-specified, but DB changed it, so we update
+ # it with the pre-specified value
+ my $sql2 = unshiftHereDoc(<<" End-of-Here");
+ UPDATE $table SET id='$valRow->{'id'}' WHERE id='$lastID'
+ End-of-Here
+ vlog(3, $sql2);
+ $dbh->do($sql2) or croak _tr(
+ q[Can't update table <%s> (%s)], $table, $dbh->errstr
+ );
+ }
+ }
+ push @ids, $valRow->{'id'};
+ }
+ return wantarray() ? @ids : shift @ids;
+}
+
+sub _doDelete
+{
+ my $self = shift;
+ my $table = shift;
+ my $IDs = shift;
+ my $idCol = shift;
+ my $additionalWhereClause = shift;
+
+ my $dbh = $self->{'dbh'};
+
+ $IDs = [undef] unless defined $IDs;
+ $idCol = 'id' unless defined $idCol;
+ foreach my $id (@$IDs) {
+ my $sql = "DELETE FROM $table";
+ if (defined $id) {
+ $sql .= " WHERE $idCol = " . $self->quote($id);
+ if (defined $additionalWhereClause) {
+ $sql .= $additionalWhereClause;
+ }
+ }
+ vlog(3, $sql);
+ my $sth = $dbh->prepare($sql)
+ or croak _tr(q[Can't delete from table <%s> (%s)], $table,
+ $dbh->errstr);
+ $sth->execute()
+ or croak _tr(q[Can't delete from table <%s> (%s)], $table,
+ $dbh->errstr);
+ }
+ return 1;
+}
+
+sub _doUpdate
+{
+ my $self = shift;
+ my $table = shift;
+ my $IDs = shift;
+ my $valRows = shift;
+
+ my $dbh = $self->{'dbh'};
+ my $valRow = (@$valRows)[0];
+ return 1 if !defined $valRow || !scalar keys %$valRow;
+
+ my $idx = 0;
+ foreach my $valRow (@$valRows) {
+ my $id = $IDs->[$idx++];
+ my %valData = %$valRow;
+ # fail if asked to change the column 'id', as that is bogus
+ return if exists $valData{id} && $valData{id} ne $id;
+ # filter column 'id' if present, as we don't want to write it
+ delete $valData{id};
+ my @cols = map { "$_ = " . $self->quote($valRow->{$_}) }
+ grep { $_ ne 'id' }
+ # filter column 'id' if present, as we don't want
+ # to update it!
+ keys %$valRow;
+ next if !@cols;
+ my $cols = join ', ', @cols;
+ my $sql = "UPDATE $table SET $cols";
+ if (defined $id) {
+ $sql .= " WHERE id = " . $self->quote($id);
+ }
+ vlog(3, $sql);
+ my $sth = $dbh->prepare($sql)
+ or croak _tr(q[Can't update table <%s> (%s)], $table, $dbh->errstr);
+ $sth->execute()
+ or croak _tr(q[Can't update table <%s> (%s)], $table, $dbh->errstr);
+ }
+ return 1;
+}
+
+sub _updateRefTable
+{
+ my $self = shift;
+ my $table = shift;
+ my $keyID = shift;
+ my $newValueIDs = shift;
+ my $keyCol = shift;
+ my $valueCol = shift;
+ my $oldValueIDs = shift;
+
+ my %lastValueIDs;
+ @lastValueIDs{@$oldValueIDs} = ();
+
+ foreach my $valueID (@$newValueIDs) {
+ if (!exists $lastValueIDs{$valueID}) {
+ # value-ID is new, create it
+ my $valRow = {
+ $keyCol => $keyID,
+ $valueCol => $valueID,
+ };
+ $self->_doInsert($table, [$valRow]);
+ } else {
+ # value-ID already exists, leave as is, but remove from hash:
+ delete $lastValueIDs{$valueID};
+ }
+ }
+
+ # all the remaining value-IDs need to be removed:
+ if (scalar keys %lastValueIDs) {
+ $self->_doDelete($table, [keys %lastValueIDs],
+ $valueCol, " AND $keyCol='$keyID'");
+ }
+ return 1;
+}
+
+sub _updateOneToManyRefAttr
+{
+ my $self = shift;
+ my $table = shift;
+ my $oneID = shift;
+ my $newManyIDs = shift;
+ my $fkCol = shift;
+ my $oldManyIDs = shift;
+
+ my %lastManyIDs;
+ @lastManyIDs{@$oldManyIDs} = ();
+
+ foreach my $id (@$newManyIDs) {
+ if (!exists $lastManyIDs{$id}) {
+ # ID has changed, update it
+ $self->_doUpdate($table, $id, [{$fkCol => $oneID}]);
+ } else {
+ # ID hasn't changed, leave as is, but remove from hash:
+ delete $lastManyIDs{$id};
+ }
+ }
+
+ # all the remaining many-IDs need to be set to 0:
+ foreach my $id (scalar keys %lastManyIDs) {
+ $self->_doUpdate($table, $id, [{$fkCol => '0'}]);
+ }
+ return 1;
+}
+
+sub addVendorOS
+{
+ my $self = shift;
+ my $valRows = shift;
+
+ return $self->_doInsert('vendor_os', $valRows);
+}
+
+sub removeVendorOS
+{
+ my $self = shift;
+ my $vendorOSIDs = shift;
+
+ return $self->_doDelete('vendor_os', $vendorOSIDs);
+}
+
+sub changeVendorOS
+{
+ my $self = shift;
+ my $vendorOSIDs = shift;
+ my $valRows = shift;
+
+ return $self->_doUpdate('vendor_os', $vendorOSIDs, $valRows);
+}
+
+sub addInstalledPlugin
+{
+ my $self = shift;
+ my $vendorOSID = shift;
+ my $pluginName = shift;
+ my $newAttrs = shift;
+
+ return if !defined $vendorOSID || !$pluginName;
+
+ my $installedPlugin
+ = $self->fetchInstalledPlugins($vendorOSID, $pluginName, 1);
+ if (!$installedPlugin) {
+ return if !$self->_doInsert('installed_plugin', [ {
+ vendor_os_id => $vendorOSID,
+ plugin_name => $pluginName,
+ } ] );
+ $installedPlugin
+ = $self->fetchInstalledPlugins($vendorOSID, $pluginName, 1);
+ }
+ return if !$installedPlugin;
+
+ # determine the required attribute actions ...
+ my $oldAttrs = $installedPlugin->{attrs} || {};
+ my @attrsToBeInserted
+ = grep {
+ exists $newAttrs->{$_} && !exists $oldAttrs->{$_}
+ } keys %$newAttrs;
+ my @attrsToBeDeleted = grep { !exists $newAttrs->{$_} } keys %$oldAttrs;
+ my @attrsToBeUpdated
+ = grep {
+ exists $newAttrs->{$_} && exists $oldAttrs->{$_}
+ && ($oldAttrs->{$_}->{value} || '-') ne ($newAttrs->{$_} || '-')
+ } keys %$newAttrs;
+
+ # ... insert the new ones ...
+ my @attrData
+ = map {
+ {
+ installed_plugin_id => $installedPlugin->{id},
+ name => $_,
+ value => $newAttrs->{$_},
+ }
+ }
+ @attrsToBeInserted;
+ $self->_doInsert('installed_plugin_attr', \@attrData);
+
+ # ... delete the old ones ...
+ my @oldIDs = map { $oldAttrs->{$_}->{id} } @attrsToBeDeleted;
+ $self->_doDelete('installed_plugin_attr', \@oldIDs);
+
+ # ... and update the changed ones ...
+ my @IDs = map { $oldAttrs->{$_}->{id} } @attrsToBeUpdated;
+ @attrData = map { { value => $newAttrs->{$_} } } @attrsToBeUpdated;
+ $self->_doUpdate('installed_plugin_attr', \@IDs, \@attrData);
+
+ return 1;
+}
+
+sub removeInstalledPlugin
+{
+ my $self = shift;
+ my $vendorOSID = shift;
+ my $pluginName = shift;
+
+ return if !defined $vendorOSID || !$pluginName;
+
+ my $plugin = $self->fetchInstalledPlugins($vendorOSID, $pluginName);
+ return if !$plugin;
+ return if !$self->_doDelete(
+ 'installed_plugin_attr', [ $plugin->{id} ], 'installed_plugin_id'
+ );
+ return $self->_doDelete('installed_plugin', [ $plugin->{id} ] );
+}
+
+sub addExport
+{
+ my $self = shift;
+ my $valRows = shift;
+
+ return $self->_doInsert('export', $valRows);
+}
+
+sub removeExport
+{
+ my $self = shift;
+ my $exportIDs = shift;
+
+ return $self->_doDelete('export', $exportIDs);
+}
+
+sub changeExport
+{
+ my $self = shift;
+ my $exportIDs = shift;
+ my $valRows = shift;
+
+ return $self->_doUpdate('export', $exportIDs, $valRows);
+}
+
+sub changeGlobalInfo
+{
+ my $self = shift;
+ my $id = shift;
+ my $value = shift;
+
+ return $self->_doUpdate('global_info', [$id], [{'value' => $value}]);
+}
+
+sub addSystem
+{
+ my $self = shift;
+ my $valRows = shift;
+ my $attrValRows = shift;
+
+ # ... store the systems to get the IDs ...
+ my @systemIDs = $self->_doInsert('system', $valRows);
+
+ # ... finally store the individual attribute sets
+ foreach my $id (@systemIDs) {
+ my $attrs = shift @$attrValRows;
+ next if !defined $attrs;
+ return if !$self->setSystemAttrs($id, $attrs);
+ }
+
+ return @systemIDs;
+}
+
+sub removeSystem
+{
+ my $self = shift;
+ my $systemIDs = shift;
+
+ return $self->_doDelete('system', $systemIDs);
+}
+
+sub changeSystem
+{
+ my $self = shift;
+ my $systemIDs = shift;
+ my $valRows = shift;
+ my $attrValRows = shift;
+
+ # store the attribute hashes individually
+ foreach my $id (@$systemIDs) {
+ my $attrs = shift @$attrValRows;
+ next if !defined $attrs;
+ return if !$self->setSystemAttrs($id, $attrs);
+ }
+
+ # finally update all systems in one go
+ return $self->_doUpdate('system', $systemIDs, $valRows);
+}
+
+sub setSystemAttrs
+{
+ my $self = shift;
+ my $systemID = shift;
+ my $newAttrs = shift;
+
+ # fetch info about existing attrs
+ my $sql = "SELECT * FROM system_attr WHERE system_id = $systemID";
+ my %oldAttrs = map { ($_->{name}, $_) } $self->_doSelect($sql);
+
+ # We write undefined attributes for the default system only, such that
+ # it shows all existing attributes. All other systems never write undefined
+ # attributes (if they have not defined a specific attribute, it is
+ # inherited from "above"). We encapsulate that decision in the following
+ # delegate
+ my $valueIsOK = sub {
+ my $value = shift;
+ return $systemID == 0 || defined $value;
+ };
+
+ # determine the required actions ...
+ my @attrsToBeInserted
+ = grep {
+ $valueIsOK->($newAttrs->{$_}) && !exists $oldAttrs{$_}
+ } keys %$newAttrs;
+ my @attrsToBeDeleted
+ = grep {
+ !exists $newAttrs->{$_} || !$valueIsOK->($newAttrs->{$_})
+ } keys %oldAttrs;
+ my @attrsToBeUpdated
+ = grep {
+ $valueIsOK->($newAttrs->{$_}) && exists $oldAttrs{$_}
+ && ((defined($oldAttrs{$_}->{value}) xor defined($newAttrs->{$_}))
+ || (defined($oldAttrs{$_}->{value}) && defined($newAttrs->{$_})
+ && $oldAttrs{$_}->{value} ne $newAttrs->{$_}))
+ } keys %$newAttrs;
+
+ # ... insert the new ones ...
+ my @attrData
+ = map {
+ {
+ system_id => $systemID,
+ name => $_,
+ value => $newAttrs->{$_},
+ }
+ }
+ @attrsToBeInserted;
+ $self->_doInsert('system_attr', \@attrData);
+
+ # ... delete the old ones ...
+ my @oldIDs = map { $oldAttrs{$_}->{id} } @attrsToBeDeleted;
+ $self->_doDelete('system_attr', \@oldIDs);
+
+ # ... and update the changed ones ...
+ my @IDs = map { $oldAttrs{$_}->{id} } @attrsToBeUpdated;
+ @attrData = map { { value => $newAttrs->{$_} } } @attrsToBeUpdated;
+ $self->_doUpdate('system_attr', \@IDs, \@attrData);
+
+ return 1;
+}
+
+sub setClientIDsOfSystem
+{
+ my $self = shift;
+ my $systemID = shift;
+ my $clientIDs = shift;
+
+ my @currClients = $self->fetchClientIDsOfSystem($systemID);
+ return $self->_updateRefTable(
+ 'client_system_ref', $systemID, $clientIDs, 'system_id', 'client_id',
+ \@currClients
+ );
+}
+
+sub setGroupIDsOfSystem
+{
+ my $self = shift;
+ my $systemID = shift;
+ my $groupIDs = shift;
+
+ my @currGroups = $self->fetchGroupIDsOfSystem($systemID);
+ return $self->_updateRefTable(
+ 'group_system_ref', $systemID, $groupIDs, 'system_id', 'group_id',
+ \@currGroups
+ );
+}
+
+sub addClient
+{
+ my $self = shift;
+ my $valRows = shift;
+ my $attrValRows = shift;
+
+ # ... store the clients to get the IDs ...
+ my @clientIDs = $self->_doInsert('client', $valRows);
+
+ # ... finally store the individual attribute sets
+ foreach my $id (@clientIDs) {
+ my $attrs = shift @$attrValRows;
+ next if !defined $attrs;
+ return if !$self->setClientAttrs($id, $attrs);
+ }
+
+ return @clientIDs;
+}
+
+sub removeAttributeByName
+{
+ my $self = shift;
+ my $attrName = shift;
+
+ return $self->_doDelete('system_attr', [ $attrName ], 'name')
+ && $self->_doDelete('client_attr', [ $attrName ], 'name')
+ && $self->_doDelete('group_attr', [ $attrName ], 'name');
+}
+
+sub removeClient
+{
+ my $self = shift;
+ my $clientIDs = shift;
+
+ return $self->_doDelete('client', $clientIDs);
+}
+
+sub changeClient
+{
+ my $self = shift;
+ my $clientIDs = shift;
+ my $valRows = shift;
+ my $attrValRows = shift;
+
+ # store the attribute hashes individually
+ foreach my $id (@$clientIDs) {
+ my $attrs = shift @$attrValRows;
+ next if !defined $attrs;
+ return if !$self->setClientAttrs($id, $attrs);
+ }
+
+ # finally update all systems in one go
+ return $self->_doUpdate('client', $clientIDs, $valRows);
+}
+
+sub setClientAttrs
+{
+ my $self = shift;
+ my $clientID = shift;
+ my $newAttrs = shift;
+
+ # fetch info about existing attrs
+ my $sql = "SELECT * FROM client_attr WHERE client_id = $clientID";
+ my %oldAttrs = map { ($_->{name}, $_) } $self->_doSelect($sql);
+
+ # determine the required actions ...
+ my @attrsToBeInserted
+ = grep {
+ defined $newAttrs->{$_} && !exists $oldAttrs{$_}
+ } keys %$newAttrs;
+ my @attrsToBeDeleted = grep { !defined $newAttrs->{$_} } keys %oldAttrs;
+ my @attrsToBeUpdated
+ = grep {
+ defined $newAttrs->{$_} && exists $oldAttrs{$_}
+ && ($oldAttrs{$_}->{value} || '') ne ($newAttrs->{$_} || '')
+ } keys %$newAttrs;
+
+ # ... insert the new ones ...
+ my @attrData
+ = map {
+ {
+ client_id => $clientID,
+ name => $_,
+ value => $newAttrs->{$_},
+ }
+ }
+ @attrsToBeInserted;
+ $self->_doInsert('client_attr', \@attrData);
+
+ # ... delete the old ones ...
+ my @oldIDs = map { $oldAttrs{$_}->{id} } @attrsToBeDeleted;
+ $self->_doDelete('client_attr', \@oldIDs);
+
+ # ... and update the changed ones ...
+ my @IDs = map { $oldAttrs{$_}->{id} } @attrsToBeUpdated;
+ @attrData = map { { value => $newAttrs->{$_} } } @attrsToBeUpdated;
+ $self->_doUpdate('client_attr', \@IDs, \@attrData);
+
+ return 1;
+}
+
+sub setSystemIDsOfClient
+{
+ my $self = shift;
+ my $clientID = shift;
+ my $systemIDs = shift;
+
+ my @currSystems = $self->fetchSystemIDsOfClient($clientID);
+ return $self->_updateRefTable(
+ 'client_system_ref', $clientID, $systemIDs, 'client_id', 'system_id',
+ \@currSystems
+ );
+}
+
+sub setGroupIDsOfClient
+{
+ my $self = shift;
+ my $clientID = shift;
+ my $groupIDs = shift;
+
+ my @currGroups = $self->fetchGroupIDsOfClient($clientID);
+ return $self->_updateRefTable(
+ 'group_client_ref', $clientID, $groupIDs, 'client_id', 'group_id',
+ \@currGroups
+ );
+}
+
+sub addGroup
+{
+ my $self = shift;
+ my $valRows = shift;
+ my $attrValRows = shift;
+
+ # ... store the groups to get the IDs ...
+ my @groupIDs = $self->_doInsert('groups', $valRows);
+
+ # ... finally store the individual attribute sets
+ foreach my $id (@groupIDs) {
+ my $attrs = shift @$attrValRows;
+ next if !defined $attrs;
+ return if !$self->setGroupAttrs($id, $attrs);
+ }
+
+ return @groupIDs;
+}
+
+sub removeGroup
+{
+ my $self = shift;
+ my $groupIDs = shift;
+
+ return $self->_doDelete('groups', $groupIDs);
+}
+
+sub changeGroup
+{
+ my $self = shift;
+ my $groupIDs = shift;
+ my $valRows = shift;
+ my $attrValRows = shift;
+
+ # store the attribute hashes individually
+ foreach my $id (@$groupIDs) {
+ my $attrs = shift @$attrValRows;
+ next if !defined $attrs;
+ return if !$self->setGroupAttrs($id, $attrs);
+ }
+
+ # finally update all groups in one go
+ return $self->_doUpdate('groups', $groupIDs, $valRows);
+}
+
+sub setGroupAttrs
+{
+ my $self = shift;
+ my $groupID = shift;
+ my $newAttrs = shift;
+
+ # fetch info about existing attrs
+ my $sql = "SELECT * FROM group_attr WHERE group_id = $groupID";
+ my %oldAttrs = map { ($_->{name}, $_) } $self->_doSelect($sql);
+
+ # determine the required actions ...
+ my @attrsToBeInserted
+ = grep {
+ defined $newAttrs->{$_} && !exists $oldAttrs{$_}
+ } keys %$newAttrs;
+ my @attrsToBeDeleted = grep { !defined $newAttrs->{$_} } keys %oldAttrs;
+ my @attrsToBeUpdated
+ = grep {
+ defined $newAttrs->{$_} && exists $oldAttrs{$_}
+ && ($oldAttrs{$_}->{value} || '') ne ($newAttrs->{$_} || '')
+ } keys %$newAttrs;
+
+ # ... insert the new ones ...
+ my @attrData
+ = map {
+ {
+ group_id => $groupID,
+ name => $_,
+ value => $newAttrs->{$_},
+ }
+ }
+ @attrsToBeInserted;
+ $self->_doInsert('group_attr', \@attrData);
+
+ # ... delete the old ones ...
+ my @oldIDs = map { $oldAttrs{$_}->{id} } @attrsToBeDeleted;
+ $self->_doDelete('group_attr', \@oldIDs);
+
+ # ... and update the changed ones ...
+ my @IDs = map { $oldAttrs{$_}->{id} } @attrsToBeUpdated;
+ @attrData = map { { value => $newAttrs->{$_} } } @attrsToBeUpdated;
+ $self->_doUpdate('group_attr', \@IDs, \@attrData);
+
+ return 1;
+}
+
+sub setClientIDsOfGroup
+{
+ my $self = shift;
+ my $groupID = shift;
+ my $clientIDs = shift;
+
+ my @currClients = $self->fetchClientIDsOfGroup($groupID);
+ return $self->_updateRefTable(
+ 'group_client_ref', $groupID, $clientIDs, 'group_id', 'client_id',
+ \@currClients
+ );
+}
+
+sub setSystemIDsOfGroup
+{
+ my $self = shift;
+ my $groupID = shift;
+ my $systemIDs = shift;
+
+ my @currSystems = $self->fetchSystemIDsOfGroup($groupID);
+ return $self->_updateRefTable(
+ 'group_system_ref', $groupID, $systemIDs, 'group_id', 'system_id',
+ \@currSystems
+ );
+}
+
+################################################################################
+### schema related functions
+################################################################################
+sub _convertColDescrsToDBNativeString
+{
+ my $self = shift;
+ my $colDescrs = shift;
+
+ my $colDescrString = join ', ', map {
+ # convert each column description into database native format
+ # (e.g. convert 'name:s.45' to 'name char(45)'):
+ if (!m[^\s*(\S+?)\s*:\s*(\S+?)\s*$]) {
+ croak _tr('UnknownDbSchemaColumnDescr', $_);
+ }
+ "$1 " . $self->schemaConvertTypeDescrToNative($2);
+ } @$colDescrs;
+ return $colDescrString;
+}
+
+sub _convertColDescrsToColNames
+{
+ my $self = shift;
+ my $colDescrs = shift;
+
+ return map {
+ # convert each column description into database native format
+ # (e.g. convert 'name:s.45' to 'name char(45)'):
+ if (!m[^\s*(\S+?)\s*:.+$]) {
+ croak _tr('UnknownDbSchemaColumnDescr', $_);
+ }
+ $1;
+ } @$colDescrs;
+}
+
+sub _convertColDescrsToColNamesString
+{
+ my $self = shift;
+ my $colDescrs = shift;
+
+ return join ', ', $self->_convertColDescrsToColNames($colDescrs);
+}
+
+sub schemaFetchDBVersion
+{
+ my $self = shift;
+
+ my $dbh = $self->{dbh};
+ local $dbh->{RaiseError} = 1;
+ my $row =
+ eval { $dbh->selectrow_hashref('SELECT schema_version FROM meta'); };
+ return 0 if $@;
+ # no database access possible
+ return unless defined $row;
+ # no entry in meta-table
+ return $row->{schema_version};
+}
+
+sub schemaSetDBVersion
+{
+ my $self = shift;
+ my $dbVersion = shift;
+
+ $self->{dbh}->do("UPDATE meta SET schema_version = '$dbVersion'")
+ or croak _tr('Unable to set DB-schema version to %s!', $dbVersion);
+
+ return 1;
+}
+
+sub schemaFetchPluginInfoHashVal
+{
+ my $self = shift;
+
+ my $row
+ = $self->{dbh}->selectrow_hashref('SELECT plugin_info_hash FROM meta');
+
+ return $row->{plugin_info_hash};
+}
+
+sub schemaSetPluginInfoHashVal
+{
+ my $self = shift;
+ my $pluginInfoHashVal = shift;
+
+ $self->{dbh}->do("UPDATE meta SET plugin_info_hash = '$pluginInfoHashVal'")
+ or croak _tr(
+ 'Unable to set plugin-info-hash-value to %s!', $pluginInfoHashVal
+ );
+
+ return 1;
+}
+
+sub schemaConvertTypeDescrToNative
+{ # a default implementation, many DBs need to override...
+ my $self = shift;
+ my $typeDescr = lc(shift);
+
+ if ($typeDescr eq 'b') {
+ return 'integer';
+ } elsif ($typeDescr eq 'i') {
+ return 'integer';
+ } elsif ($typeDescr eq 'pk') {
+ return 'integer primary key';
+ } elsif ($typeDescr eq 'fk') {
+ return 'integer';
+ } elsif ($typeDescr =~ m[^s\.(\d+)$]i) {
+ return "varchar($1)";
+ } else {
+ croak _tr('UnknownDbSchemaTypeDescr', $typeDescr);
+ }
+}
+
+sub schemaAddTable
+{
+ my $self = shift;
+ my $table = shift;
+ my $colDescrs = shift;
+ my $initialVals = shift;
+ my $isSubCmd = shift;
+
+ my $dbh = $self->{'dbh'};
+ vlog(1, "adding table <$table> to schema...") unless $isSubCmd;
+ my $colDescrString = $self->_convertColDescrsToDBNativeString($colDescrs);
+ my $sql = "CREATE TABLE $table ($colDescrString)";
+ vlog(3, $sql);
+ $dbh->do($sql)
+ or croak _tr(q[Can't create table <%s> (%s)], $table, $dbh->errstr);
+ if (defined $initialVals) {
+ # don't care about IDs if there's no 'id' column in this table
+ my $ignoreIDs = ($colDescrString !~ m[\bid\b]);
+ $self->_doInsert($table, $initialVals, $ignoreIDs);
+ }
+ return;
+}
+
+sub schemaDropTable
+{
+ my $self = shift;
+ my $table = shift;
+ my $isSubCmd = shift;
+
+ my $dbh = $self->{'dbh'};
+ vlog(1, "dropping table <$table> from schema...") unless $isSubCmd;
+ my $sql = "DROP TABLE $table";
+ vlog(3, $sql);
+ $dbh->do($sql)
+ or croak _tr(q[Can't drop table <%s> (%s)], $table, $dbh->errstr);
+ return;
+}
+
+sub schemaRenameTable
+{ # a rather simple-minded implementation that renames a table in several
+ # steps:
+ # - create the new table
+ # - copy the data over from the old one
+ # - drop the old table
+ # This should be overriden for advanced DBs, as these more often than not
+ # implement the 'ALTER TABLE <old> RENAME TO <new>' SQL-command (which
+ # is much more efficient).
+ my $self = shift;
+ my $oldTable = shift;
+ my $newTable = shift;
+ my $colDescrs = shift;
+ my $isSubCmd = shift;
+
+ my $dbh = $self->{'dbh'};
+ vlog(1, "renaming table <$oldTable> to <$newTable>...") unless $isSubCmd;
+ my $colDescrString = $self->_convertColDescrsToDBNativeString($colDescrs);
+ my $sql = "CREATE TABLE $newTable ($colDescrString)";
+ vlog(3, $sql);
+ $dbh->do($sql)
+ or croak _tr(q[Can't create table <%s> (%s)], $oldTable, $dbh->errstr);
+ my $colNamesString = $self->_convertColDescrsToColNamesString($colDescrs);
+ my @dataRows = $self->_doSelect("SELECT $colNamesString FROM $oldTable");
+ $self->_doInsert($newTable, \@dataRows);
+ $sql = "DROP TABLE $oldTable";
+ vlog(3, $sql);
+ $dbh->do($sql)
+ or croak _tr(q[Can't drop table <%s> (%s)], $oldTable, $dbh->errstr);
+ return;
+}
+
+sub schemaAddColumns
+{ # a rather simple-minded implementation that adds columns to a table
+ # in several steps:
+ # - create a temp table with the new layout
+ # - copy the data from the old table into the new one
+ # - drop the old table
+ # - rename the temp table to the original name
+ # This should be overriden for advanced DBs, as these more often than not
+ # implement the 'ALTER TABLE <table> ADD COLUMN <col>' SQL-command (which
+ # is much more efficient).
+ my $self = shift;
+ my $table = shift;
+ my $newColDescrs = shift;
+ my $newColDefaultVals = shift;
+ my $colDescrs = shift;
+ my $isSubCmd = shift;
+
+ my $dbh = $self->{'dbh'};
+ my $tempTable = "${table}_temp";
+ my @newColNames = $self->_convertColDescrsToColNames($newColDescrs);
+ my $newColStr = join ', ', @newColNames;
+ vlog(1, "adding columns <$newColStr> to table <$table>...")
+ unless $isSubCmd;
+ $self->schemaAddTable($tempTable, $colDescrs, undef, 1);
+
+ # copy the data from the old table to the new:
+ my @dataRows = $self->_doSelect("SELECT * FROM $table");
+ $self->_doInsert($tempTable, \@dataRows);
+ # N.B.: for the insert, we rely on the caller having added the new
+ # columns to the end of the table (if that isn't the case, things
+ # break here!)
+
+ if (defined $newColDefaultVals) {
+ # default values have been provided, we apply them now:
+ $self->_doUpdate($tempTable, undef, $newColDefaultVals);
+ }
+
+ $self->schemaDropTable($table, 1);
+ $self->schemaRenameTable($tempTable, $table, $colDescrs, 1);
+ return;
+}
+
+sub schemaDropColumns
+{ # a rather simple-minded implementation that drops columns from a table
+ # in several steps:
+ # - create a temp table with the new layout
+ # - copy the data from the old table into the new one
+ # - drop the old table
+ # - rename the temp table to the original name
+ # This should be overriden for advanced DBs, as these sometimes
+ # implement the 'ALTER TABLE <table> DROP COLUMN <col>' SQL-command (which
+ # is much more efficient).
+ my $self = shift;
+ my $table = shift;
+ my $dropColNames = shift;
+ my $colDescrs = shift;
+ my $isSubCmd = shift;
+
+ my $dbh = $self->{'dbh'};
+ my $tempTable = "${table}_temp";
+ my $dropColStr = join ', ', @$dropColNames;
+ vlog(1, "dropping columns <$dropColStr> from table <$table>...")
+ unless $isSubCmd;
+ $self->schemaAddTable($tempTable, $colDescrs, undef, 1);
+
+ # copy the data from the old table to the new:
+ my $colNamesString = $self->_convertColDescrsToColNamesString($colDescrs);
+ my @dataRows = $self->_doSelect("SELECT $colNamesString FROM $table");
+ $self->_doInsert($tempTable, \@dataRows);
+
+ $self->schemaDropTable($table, 1);
+ $self->schemaRenameTable($tempTable, $table, $colDescrs, 1);
+ return;
+}
+
+sub schemaChangeColumns
+{ # a rather simple-minded implementation that changes columns
+ # in several steps:
+ # - create a temp table with the new layout
+ # - copy the data from the old table into the new one
+ # - drop the old table
+ # - rename the temp table to the original name
+ # This should be overriden for advanced DBs, as these sometimes
+ # implement the 'ALTER TABLE <table> CHANGE COLUMN <col>' SQL-command (which
+ # is much more efficient).
+ my $self = shift;
+ my $table = shift;
+ my $colChanges = shift;
+ my $colDescrs = shift;
+ my $isSubCmd = shift;
+
+ my $dbh = $self->{'dbh'};
+ my $tempTable = "${table}_temp";
+ my $changeColStr = join ', ', keys %$colChanges;
+ vlog(1, "changing columns <$changeColStr> of table <$table>...")
+ unless $isSubCmd;
+ $self->schemaAddTable($tempTable, $colDescrs, undef, 1);
+
+ # copy the data from the old table to the new:
+ my $colNamesString = $self->_convertColDescrsToColNamesString($colDescrs);
+ my @dataRows = $self->_doSelect("SELECT * FROM $table");
+ foreach my $oldCol (keys %$colChanges) {
+ my $newCol =
+ $self->_convertColDescrsToColNamesString([$colChanges->{$oldCol}]);
+ # rename current column in all data-rows:
+ foreach my $row (@dataRows) {
+ $row->{$newCol} = $row->{$oldCol};
+ delete $row->{$oldCol};
+ }
+ }
+ $self->_doInsert($tempTable, \@dataRows);
+
+ $self->schemaDropTable($table, 1);
+ $self->schemaRenameTable($tempTable, $table, $colDescrs, 1);
+ return;
+}
+
+1;
+
+=head1 NAME
+
+DBI.pm - provides DBI-based implementation of the OpenSLX MetaDB API.
+
+=head1 SYNOPSIS
+
+This class is the base for all DBI-related metaDB variants.
+It provides a default implementation for every method, such that
+each DB-specific implementation needs to override only the methods
+that require a different implementation than the one provided here.
+
+=head1 NOTES
+
+In case you ask yourself why none of the SQL-statements in this
+file make use of SQL bind params (?), the answer is that at least
+one DBD-driver didn't like them at all. As the performance gains
+from bound params are not really necessary here, we simply do
+not use them.
+
diff --git a/src/config-db/OpenSLX/MetaDB/SQLite.pm b/src/config-db/OpenSLX/MetaDB/SQLite.pm
new file mode 100644
index 00000000..0846582f
--- /dev/null
+++ b/src/config-db/OpenSLX/MetaDB/SQLite.pm
@@ -0,0 +1,130 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# SQLite.pm
+# - provides SQLite-specific overrides of the OpenSLX MetaDB API.
+# -----------------------------------------------------------------------------
+package OpenSLX::MetaDB::SQLite;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::MetaDB::DBI);
+
+################################################################################
+### This class provides a MetaDB backend for SQLite databases.
+### - by default the db will be created inside a 'openslxdata-sqlite' directory.
+################################################################################
+use DBD::SQLite;
+use OpenSLX::Basics;
+
+################################################################################
+### implementation
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {};
+ return bless $self, $class;
+}
+
+sub databaseExists
+{
+ my $self = shift;
+
+ my $fullDBPath = $self->_getDBPath() . "/$openslxConfig{'db-name'}";
+ return -e $fullDBPath;
+}
+
+sub dropDatabase
+{
+ my $self = shift;
+
+ if ($self->{dbh}) {
+ die "need to disconnect before you can drop the database!";
+ }
+
+ my $fullDBPath = $self->_getDBPath() . "/$openslxConfig{'db-name'}";
+ system("rm -rf $fullDBPath") if -e $fullDBPath;
+}
+
+sub connect ## no critic (ProhibitBuiltinHomonyms)
+{
+ my $self = shift;
+
+ my $dbSpec = $openslxConfig{'db-spec'};
+ if (!defined $dbSpec) {
+ # build $dbSpec from individual parameters:
+ my $dbPath = $self->_getDBPath;
+ system("mkdir -p $dbPath") unless -e $dbPath;
+ $dbSpec = "dbname=$dbPath/$openslxConfig{'db-name'}";
+ }
+ vlog(1, "trying to connect to SQLite-database <$dbSpec>");
+ $self->{'dbh'} = DBI->connect(
+ "dbi:SQLite:$dbSpec", undef, undef,
+ {PrintError => 0, AutoCommit => 1, sqlite_unicode => 1}
+ ) or die _tr("Cannot connect to database <%s> (%s)", $dbSpec, $DBI::errstr);
+ return 1;
+}
+
+sub schemaRenameTable
+{
+ my $self = shift;
+ my $oldTable = shift;
+ my $newTable = shift;
+ my $colDescrs = shift;
+ my $isSubCmd = shift;
+
+ my $dbh = $self->{'dbh'};
+ vlog(1, "renaming table <$oldTable> to <$newTable>...") unless $isSubCmd;
+ my $sql = "ALTER TABLE $oldTable RENAME TO $newTable";
+ vlog(3, $sql);
+ $dbh->do($sql)
+ or croak(_tr(q[Can't rename table <%s> (%s)], $oldTable, $dbh->errstr));
+ return;
+}
+
+sub schemaAddColumns
+{
+ my $self = shift;
+ my $table = shift;
+ my $newColDescrs = shift;
+ my $newColDefaultVals = shift;
+ my $colDescrs = shift;
+ my $isSubCmd = shift;
+
+ my $dbh = $self->{'dbh'};
+ my $newColNames = $self->_convertColDescrsToColNamesString($newColDescrs);
+ vlog(1, "adding columns <$newColNames> to table <$table>")
+ unless $isSubCmd;
+ foreach my $colDescr (@$newColDescrs) {
+ my $colDescrString =
+ $self->_convertColDescrsToDBNativeString([$colDescr]);
+ my $sql = "ALTER TABLE $table ADD COLUMN $colDescrString";
+ vlog(3, $sql);
+ $dbh->do($sql)
+ or croak(_tr(q[Can't add column to table <%s> (%s)], $table,
+ $dbh->errstr));
+ }
+ # if default values have been provided, we apply them now:
+ if (defined $newColDefaultVals) {
+ $self->_doUpdate($table, undef, $newColDefaultVals);
+ }
+ return;
+}
+
+sub _getDBPath
+{
+ my $self = shift;
+
+ return "$openslxConfig{'private-path'}/db/sqlite";
+}
+
+1;
diff --git a/src/config-db/OpenSLX/MetaDB/mysql.pm b/src/config-db/OpenSLX/MetaDB/mysql.pm
new file mode 100644
index 00000000..82487191
--- /dev/null
+++ b/src/config-db/OpenSLX/MetaDB/mysql.pm
@@ -0,0 +1,179 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# mysql.pm
+# - provides mysql-specific overrides of the OpenSLX MetaDB API.
+# -----------------------------------------------------------------------------
+package OpenSLX::MetaDB::mysql;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::MetaDB::DBI);
+
+################################################################################
+### This class provides a MetaDB backend for mysql databases.
+### - by default the db will be created inside a 'openslxdata-mysql' directory.
+################################################################################
+use DBD::mysql;
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### implementation
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {};
+ return bless $self, $class;
+}
+
+sub connect ## no critic (ProhibitBuiltinHomonyms)
+{
+ my $self = shift;
+
+ my $dbSpec = $openslxConfig{'db-spec'};
+ if (!defined $dbSpec) {
+ # build $dbSpec from individual parameters:
+ $dbSpec = "database=$openslxConfig{'db-name'}";
+ }
+ my $dbUser
+ = $openslxConfig{'db-user'}
+ ? $openslxConfig{'db-user'}
+ : (getpwuid($>))[0];
+ my $dbPasswd = $openslxConfig{'db-passwd'};
+ if (!defined $dbPasswd) {
+ $dbPasswd = readPassword("db-password> ");
+ }
+
+ vlog(1, "trying to connect user '$dbUser' to mysql-database '$dbSpec'");
+ $self->{'dbh'} = DBI->connect(
+ "dbi:mysql:$dbSpec", $dbUser, $dbPasswd, {
+ PrintError => 0,
+ mysql_auto_reconnect => 1,
+ }
+ ) or die _tr("Cannot connect to database '%s' (%s)", $dbSpec, $DBI::errstr);
+ return 1;
+}
+
+sub schemaConvertTypeDescrToNative
+{
+ my $self = shift;
+ my $typeDescr = lc(shift);
+
+ if ($typeDescr eq 'b') {
+ return 'integer';
+ } elsif ($typeDescr eq 'i') {
+ return 'integer';
+ } elsif ($typeDescr eq 'pk') {
+ return 'integer AUTO_INCREMENT primary key';
+ } elsif ($typeDescr eq 'fk') {
+ return 'integer';
+ } elsif ($typeDescr =~ m[^s\.(\d+)$]i) {
+ return "varchar($1)";
+ } else {
+ croak _tr('UnknownDbSchemaTypeDescr', $typeDescr);
+ }
+ return;
+}
+
+sub schemaRenameTable
+{
+ my $self = shift;
+ my $oldTable = shift;
+ my $newTable = shift;
+ my $colDescrs = shift;
+ my $isSubCmd = shift;
+
+ my $dbh = $self->{'dbh'};
+ vlog(1, "renaming table <$oldTable> to <$newTable>...") unless $isSubCmd;
+ my $sql = "ALTER TABLE $oldTable RENAME TO $newTable";
+ vlog(3, $sql);
+ $dbh->do($sql)
+ or croak _tr(q[Can't rename table <%s> (%s)], $oldTable, $dbh->errstr);
+ return;
+}
+
+sub schemaAddColumns
+{
+ my $self = shift;
+ my $table = shift;
+ my $newColDescrs = shift;
+ my $newColDefaultVals = shift;
+ my $colDescrs = shift;
+ my $isSubCmd = shift;
+
+ my $dbh = $self->{'dbh'};
+ my $newColNames = $self->_convertColDescrsToColNamesString($newColDescrs);
+ vlog(1, "adding columns <$newColNames> to table <$table>") unless $isSubCmd;
+ my $addClause = join ', ',
+ map { "ADD COLUMN " . $self->_convertColDescrsToDBNativeString([$_]); }
+ @$newColDescrs;
+ my $sql = "ALTER TABLE $table $addClause";
+ vlog(3, $sql);
+ $dbh->do($sql)
+ or croak _tr(q[Can't add columns to table <%s> (%s)], $table,
+ $dbh->errstr);
+ # if default values have been provided, we apply them now:
+ if (defined $newColDefaultVals) {
+ $self->_doUpdate($table, undef, $newColDefaultVals);
+ }
+ return;
+}
+
+sub schemaDropColumns
+{
+ my $self = shift;
+ my $table = shift;
+ my $dropColNames = shift;
+ my $colDescrs = shift;
+ my $isSubCmd = shift;
+
+ my $dbh = $self->{'dbh'};
+ my $dropColStr = join ', ', @$dropColNames;
+ vlog(1,
+ "dropping columns <$dropColStr> from table <$table>...")
+ unless $isSubCmd;
+ my $dropClause = join ', ', map { "DROP COLUMN $_" } @$dropColNames;
+ my $sql = "ALTER TABLE $table $dropClause";
+ vlog(3, $sql);
+ $dbh->do($sql)
+ or croak _tr(q[Can't drop columns from table <%s> (%s)], $table,
+ $dbh->errstr);
+ return;
+}
+
+sub schemaChangeColumns
+{
+ my $self = shift;
+ my $table = shift;
+ my $colChanges = shift;
+ my $colDescrs = shift;
+ my $isSubCmd = shift;
+
+ my $dbh = $self->{'dbh'};
+ my $changeColStr = join ', ', keys %$colChanges;
+ vlog(1, "changing columns <$changeColStr> in table <$table>...")
+ unless $isSubCmd;
+ my $changeClause = join ', ', map {
+ "CHANGE COLUMN $_ "
+ . $self->_convertColDescrsToDBNativeString([$colChanges->{$_}]);
+ }
+ keys %$colChanges;
+ my $sql = "ALTER TABLE $table $changeClause";
+ vlog(3, $sql);
+ $dbh->do($sql)
+ or croak _tr(q[Can't change columns in table <%s> (%s)], $table,
+ $dbh->errstr);
+ return;
+}
+
+1;
diff --git a/src/config-db/slxconfig b/src/config-db/slxconfig
new file mode 100755
index 00000000..d4749f97
--- /dev/null
+++ b/src/config-db/slxconfig
@@ -0,0 +1,1785 @@
+#! /usr/bin/perl
+# -----------------------------------------------------------------------------
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+use strict;
+use warnings;
+
+my $abstract = q[
+slxconfig
+ This script can be used to display or change the OpenSLX configuration
+ database. You can create systems that use a specific vendor-OS
+ and you can create clients for these systems, too.
+];
+
+use Clone qw(clone);
+use Getopt::Long qw(:config pass_through);
+use List::Util qw(max);
+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 lib "$FindBin::RealBin/../config-db";
+
+# development path to config-db
+
+use OpenSLX::AttributeRoster;
+use OpenSLX::Basics;
+use OpenSLX::ConfigDB;
+use OpenSLX::ConfigFolder;
+use OpenSLX::Utils;
+
+my %option;
+
+GetOptions(
+ 'help|?' => \$option{helpReq},
+ 'inherited' => \$option{inherited},
+ 'man' => \$option{manReq},
+ 'verbose' => \$option{verbose},
+ 'version' => \$option{versionReq},
+) or pod2usage(2);
+pod2usage(-msg => $abstract, -verbose => 0, -exitval => 1) if $option{helpReq};
+if ($option{manReq}) {
+ # avoid dubious problem with perldoc in combination with UTF-8 that
+ # leads to strange dashes and single-quotes being used
+ $ENV{LC_ALL} = 'POSIX';
+ pod2usage(-verbose => 2);
+}
+if ($option{versionReq}) {
+ system('slxversion');
+ exit 1;
+}
+
+# if the user requested to see inherited attributes, we activate verbose mode,
+# too, such that we actually show attributes
+if ($option{inherited}) {
+ $option{verbose} = 1;
+}
+
+openslxInit();
+
+my $openslxDB = OpenSLX::ConfigDB->new();
+$openslxDB->connect();
+
+my $action = shift @ARGV || '';
+if ($action =~ m[^add-c]i) {
+ addClientToConfigDB(@ARGV);
+}
+elsif ($action =~ m[^add-g]i) {
+ addGroupToConfigDB(@ARGV);
+}
+elsif ($action =~ m[^add-s]i) {
+ addSystemToConfigDB(@ARGV);
+}
+elsif ($action =~ m[^change-v]i) {
+ changeVendorOSInConfigDB(@ARGV);
+}
+elsif ($action =~ m[^change-e]i) {
+ changeExportInConfigDB(@ARGV);
+}
+elsif ($action =~ m[^change-g]i) {
+ changeGroupInConfigDB(@ARGV);
+}
+elsif ($action =~ m[^change-s]i) {
+ changeSystemInConfigDB(@ARGV);
+}
+elsif ($action =~ m[^change-c]i) {
+ changeClientInConfigDB(@ARGV);
+}
+elsif ($action =~ m[^cleanup-db]i) {
+ cleanupConfigDB(@ARGV);
+}
+elsif ($action =~ m[^list-a]) {
+ listAttributes(@ARGV);
+}
+elsif ($action =~ m[^list-c]) {
+ print _tr("List of clients:\n");
+ listClients(@ARGV);
+}
+elsif ($action =~ m[^list-e]) {
+ print _tr("List of exports:\n");
+ listExports(@ARGV);
+}
+elsif ($action =~ m[^list-g]) {
+ print _tr("List of groups:\n");
+ listGroups(@ARGV);
+}
+elsif ($action =~ m[^list-s]) {
+ print _tr("List of systems:\n");
+ listSystems(@ARGV);
+}
+elsif ($action =~ m[^list-v]) {
+ print _tr("List of vendor-OSes:\n");
+ listVendorOSes(@ARGV);
+}
+elsif ($action =~ m[^search-c]) {
+ print _tr("Matching clients:\n");
+ searchClients(@ARGV);
+}
+elsif ($action =~ m[^search-e]) {
+ print _tr("Matching exports:\n");
+ searchExports(@ARGV);
+}
+elsif ($action =~ m[^search-g]) {
+ print _tr("Matching groups:\n");
+ searchGroups(@ARGV);
+}
+elsif ($action =~ m[^search-s]) {
+ print _tr("Matching systems:\n");
+ searchSystems(@ARGV);
+}
+elsif ($action =~ m[^search-v]) {
+ print _tr("Matching vendor-OSes:\n");
+ searchVendorOSes(@ARGV);
+}
+elsif ($action =~ m[^remove-c]i) {
+ removeClientFromConfigDB(@ARGV);
+}
+elsif ($action =~ m[^remove-g]i) {
+ removeGroupFromConfigDB(@ARGV);
+}
+elsif ($action =~ m[^remove-s]i) {
+ removeSystemFromConfigDB(@ARGV);
+}
+else {
+ vlog(0, _tr(unshiftHereDoc(<<' END-OF-HERE'), $0));
+ You need to specify exactly one of these actions:
+ add-client
+ add-group
+ add-system
+ change-client
+ change-export
+ change-group
+ change-system
+ change-vendor-os
+ cleanup-db
+ list-attributes
+ list-client
+ list-export
+ list-group
+ list-system
+ list-vendor-os
+ remove-client
+ remove-group
+ remove-system
+ search-client
+ search-export
+ search-group
+ search-system
+ search-vendor-os
+ Try '%s --help' for more info.
+ END-OF-HERE
+}
+
+$openslxDB->disconnect();
+
+sub parseKeyValueArgs
+{
+ my $allowedKeys = shift;
+ my $table = shift;
+
+ my %dataHash;
+ while (my $param = shift) {
+ if ($param !~ m[^\s*([\w\-:]+)\s*=(.*)$]) {
+ die _tr(
+ "value specification %s has unknown format, expected <key>=<value>\n",
+ $param
+ );
+ }
+ my $key = lc($1);
+ my $value = $2;
+ if (!grep { $_ eq $key } @$allowedKeys) {
+ die _tr("unknown key '%s' specified for %s\n", $key, $table);
+ }
+
+ # replace escaped newlines and tab chars by the respective real thing
+ $value =~ s{\\n}{\n}gms;
+ $value =~ s{\\t}{\t}gms;
+
+ # accept '-' as placeholder for undefined
+ if ($value eq '-') {
+ $value = undef;
+ }
+
+ $dataHash{$key} = $value;
+ }
+
+ return \%dataHash;
+}
+
+sub parseKeyValueArgsWithAttrs
+{
+ my $allowedKeys = shift;
+ my $allowedAttrKeys = shift;
+ my $table = shift;
+
+ my (%dataHash, %attrHash);
+ while (my $param = shift) {
+ if ($param !~ m[^\s*([\w\-:]+)\s*=(.*)$]) {
+ die _tr(
+ "value specification %s has unknown format, expected <key>=<value>\n",
+ $param
+ );
+ }
+ my $key = lc($1);
+ my $value = $2;
+
+ # replace escaped newlines and tab chars by the respective real thing
+ $value =~ s{\\n}{\n}gms;
+ $value =~ s{\\t}{\t}gms;
+
+ # accept '-' as placeholder for undefined
+ if ($value eq '-') {
+ $value = undef;
+ }
+
+ if (grep { $_ eq $key } @$allowedKeys) {
+ $dataHash{$key} = $value;
+ } elsif (grep { $_ eq $key } @$allowedAttrKeys) {
+ $attrHash{$key} = $value;
+ } else {
+ die _tr("unknown key '%s' specified for %s\n", $key, $table);
+ }
+ }
+
+ if (wantarray) {
+ return (\%dataHash, \%attrHash);
+ }
+ else {
+ if (%attrHash) {
+ $dataHash{attrs} = \%attrHash;
+ }
+ return \%dataHash;
+ }
+}
+
+sub checkGivenStage3Attrs
+{
+ my $stage3Attrs = shift;
+ my $vendorOSID = shift;
+
+ my $attrProblems;
+
+ if ($vendorOSID) {
+ my $vendorOS = $openslxDB->fetchVendorOSByID($vendorOSID);
+ my @installedPlugins = $openslxDB->fetchInstalledPlugins($vendorOSID);
+ $attrProblems = OpenSLX::AttributeRoster->findProblematicValues(
+ $stage3Attrs, $vendorOS->{name}, \@installedPlugins
+ );
+ }
+ else {
+ $attrProblems = OpenSLX::AttributeRoster->findProblematicValues(
+ $stage3Attrs
+ );
+ }
+
+ if ($attrProblems) {
+ my $complaint = join "\n", @$attrProblems;
+ die $complaint;
+ }
+
+ return 1;
+}
+
+sub cleanupConfigDB
+{
+ return $openslxDB->cleanupAnyInconsistencies();
+}
+
+sub mergeNonExistingAttributes
+{
+ my $target = shift;
+ my $source = shift;
+
+ my $sourceAttrs = $source->{attrs} || {};
+
+ $target->{attrs} ||= {};
+ my $targetAttrs = $target->{attrs};
+
+ foreach my $key (keys %$sourceAttrs) {
+ next if exists $targetAttrs->{$key};
+ $targetAttrs->{$key} = $sourceAttrs->{$key};
+ }
+
+ return 1;
+}
+
+sub dumpElements
+{
+ my $objName = shift;
+ my $nameClause = shift || sub { "\t$_->{name}\n" };
+
+ if ($option{verbose}) {
+ my $ind = ' ' x 4;
+ foreach my $elem (@_) {
+ print "$objName '$elem->{name}':\n";
+ my $spcLen = max map { length($_) } keys %$elem;
+ print join(
+ '',
+ map {
+ my $elemVal = defined $elem->{$_} ? $elem->{$_} : '-';
+ if (ref($elemVal) eq 'HASH') {
+ my $spcLen
+ = max(map { length($_) } keys %$elemVal) || 0;
+ my $spc = ' ' x $spcLen;
+ my $subLines = join(
+ "\n",
+ map {
+ my $spc = ' ' x $spcLen;
+ my $val
+ = defined $elemVal->{$_}
+ ? $elemVal->{$_}
+ : '';
+ $val =~ s[\n][\n$ind$spc ]g;
+ "$ind$_" . substr($spc, length($_)) . " = $val";
+ }
+ sort {
+ # drop [] construct (origin) from key for
+ # sorting purposes
+ (my $aa = $a) =~ s{^\s*\[.+\]\s*}{};
+ (my $bb = $b) =~ s{^\s*\[.+\]\s*}{};
+ return $aa cmp $bb;
+ } keys %$elemVal
+ );
+ $subLines ||= "$ind<none>";
+ " $_:\n$subLines\n";
+ } elsif (ref($elemVal) eq 'ARRAY') {
+ my $subLines
+ = join( "\n", map { "$ind$_" } sort @$elemVal);
+ $subLines ||= "$ind<none>";
+ " $_:\n$subLines\n";
+ } else {
+ my $spc = ' ' x $spcLen;
+ $elemVal =~ s[\n][\n$ind$spc ]g;
+ "$ind$_" . substr($spc, length($_)) . " = $elemVal\n";
+ }
+ }
+ sort {
+ my $refCmp = ref($elem->{$a}) cmp ref($elem->{$b});
+ return $refCmp ? $refCmp : $a cmp $b;
+ }
+ grep {
+ $_ ne 'name';
+ }
+ keys %$elem
+ );
+ }
+ }
+ else {
+ print join('', sort map { $nameClause->($_); } @_);
+ }
+
+ return 1;
+}
+
+sub listAttributes
+{
+ my $attrSpec = shift;
+
+ my $listHeader = _tr("List of known attributes:\n");
+ my $attrInfo
+ = OpenSLX::AttributeRoster->getAttrInfo( { scope => $attrSpec } );
+ if ($attrInfo && keys %$attrInfo) {
+ $listHeader
+ = _tr("List of known attributes for scope '%s':\n", $attrSpec);
+ }
+ else {
+ $attrInfo =
+ OpenSLX::AttributeRoster->getAttrInfo( { name => $attrSpec } );
+ $listHeader = _tr("Details for attribute '%s':\n", $attrSpec);
+ $option{verbose} = 1;
+ }
+
+ print $listHeader;
+ dumpElements(
+ 'attribute', undef,
+ map {
+ my $attr = clone($attrInfo->{$_});
+ $attr->{name} = $_;
+ delete $attr->{content_regex}; # no use for display purposes
+ $attr;
+ }
+ sort keys %$attrInfo
+ );
+
+ return 1;
+}
+
+sub listClients
+{
+ my $name = _cleanName(shift);
+
+ my %nameSpec;
+
+ # set verbose mode if any params have been passed in:
+ if (defined $name) {
+ $option{verbose} = 1;
+ $nameSpec{name} = $name;
+ }
+
+ dumpElements(
+ 'client', undef,
+ _expandClients(
+ sort { $a->{name} cmp $b->{name} }
+ $openslxDB->fetchClientByFilter(\%nameSpec)
+ )
+ );
+
+ return 1;
+}
+
+sub listGroups
+{
+ my $name = _cleanName(shift);
+
+ my %nameSpec;
+
+ # set verbose mode if any params have been passed in:
+ if (defined $name) {
+ $option{verbose} = 1;
+ $nameSpec{name} = $name;
+ }
+
+ dumpElements(
+ 'group', undef,
+ _expandGroups(
+ sort { $a->{name} cmp $b->{name} }
+ $openslxDB->fetchGroupByFilter(\%nameSpec)
+ )
+ );
+
+ return 1;
+}
+
+sub listExports
+{
+ my $name = _cleanName(shift);
+
+ my %nameSpec;
+
+ # set verbose mode if any params have been passed in:
+ if (defined $name) {
+ $option{verbose} = 1;
+ $nameSpec{name} = $name;
+ }
+
+ dumpElements(
+ 'export',
+ sub {
+ "\t$_->{name}"
+ . substr(' ' x 30, length($_->{name}))
+ . "($_->{type})\n";
+ },
+ map {
+ my $vendorOS =
+ $openslxDB->fetchVendorOSByID($_->{vendor_os_id}, 'name');
+ if (defined $vendorOS) {
+ $_->{vendor_os_id} .= " ($vendorOS->{name})";
+ }
+ $_;
+ }
+ sort { $a->{name} eq $b->{name} || $a->{type} cmp $b->{type} }
+ $openslxDB->fetchExportByFilter(\%nameSpec)
+ );
+
+ return 1;
+}
+
+sub listSystems
+{
+ my $name = _cleanName(shift);
+
+ my %nameSpec;
+
+ # set verbose mode if any params have been passed in:
+ if (defined $name) {
+ $option{verbose} = 1;
+ $nameSpec{name} = $name;
+ }
+
+ dumpElements(
+ 'system', undef,
+ _expandSystems(
+ sort { $a->{name} cmp $b->{name} }
+ $openslxDB->fetchSystemByFilter(\%nameSpec)
+ )
+ );
+
+ return 1;
+}
+
+sub listVendorOSes
+{
+ my $name = _cleanName(shift);
+
+ my %nameSpec;
+
+ # set verbose mode if any params have been passed in:
+ if (defined $name) {
+ $option{verbose} = 1;
+ $nameSpec{name} = $name;
+ }
+
+ dumpElements('vendor-OS', undef,
+ map {
+ my @plugins = $openslxDB->fetchInstalledPlugins($_->{id});
+ my %attrHash;
+ foreach my $plugin (@plugins) {
+ foreach my $attr (keys %{$plugin->{attrs}}) {
+ $attrHash{$attr} = $plugin->{attrs}->{$attr};
+ }
+ }
+ $_->{ATTRIBUTES} = \%attrHash;
+ $_->{PLUGINS}
+ = @plugins
+ ? join(',', sort map { $_->{plugin_name} } @plugins)
+ : '<none>';
+ $_;
+ }
+ sort { $a->{name} cmp $b->{name} }
+ $openslxDB->fetchVendorOSByFilter(\%nameSpec));
+
+ return 1;
+}
+
+sub searchClients
+{
+ my @clientKeys = $openslxDB->getColumnsOfTable('client');
+ my @clientAttrKeys = OpenSLX::AttributeRoster->getClientAttrs();
+ my ($clientData, $clientAttrs) = parseKeyValueArgsWithAttrs(
+ \@clientKeys, \@clientAttrKeys, 'client', @_
+ );
+
+ # set verbose mode if any params have been passed in:
+ $option{verbose} = 1 if %$clientData;
+
+ dumpElements(
+ 'client', undef,
+ _expandClients(
+ sort { $a->{name} cmp $b->{name} }
+ $openslxDB->fetchClientByFilter($clientData, undef, $clientAttrs)
+ )
+ );
+
+ return 1;
+}
+
+sub searchGroups
+{
+ my @groupKeys = $openslxDB->getColumnsOfTable('groups');
+ my @groupAttrKeys = OpenSLX::AttributeRoster->getClientAttrs();
+ my ($groupData, $groupAttrs) = parseKeyValueArgsWithAttrs(
+ \@groupKeys, \@groupAttrKeys, 'group', @_
+ );
+
+ # set verbose mode if any params have been passed in:
+ $option{verbose} = 1 if %$groupData;
+
+ dumpElements(
+ 'group', undef,
+ _expandGroups(
+ sort { $a->{name} cmp $b->{name} }
+ $openslxDB->fetchGroupByFilter($groupData, undef, $groupAttrs)
+ )
+ );
+
+ return 1;
+}
+
+sub searchExports
+{
+ my @exportKeys = $openslxDB->getColumnsOfTable('export');
+ my $exportData = parseKeyValueArgs(\@exportKeys, 'export', @_);
+
+ # set verbose mode if any params have been passed in:
+ $option{verbose} = 1 if %$exportData;
+
+ dumpElements(
+ 'export',
+ sub {
+ "\t$_->{name}"
+ . substr(' ' x 30, length($_->{name}))
+ . "($_->{type})\n";
+ },
+ map {
+ my $vendorOS =
+ $openslxDB->fetchVendorOSByID($_->{vendor_os_id}, 'name');
+ if (defined $vendorOS) {
+ $_->{vendor_os_id} .= " ($vendorOS->{name})";
+ }
+ $_;
+ }
+ sort { $a->{name} eq $b->{name} || $a->{type} cmp $b->{type} }
+ $openslxDB->fetchExportByFilter($exportData)
+ );
+
+ return 1;
+}
+
+sub searchSystems
+{
+ my @systemKeys = $openslxDB->getColumnsOfTable('system');
+ my @systemAttrKeys = OpenSLX::AttributeRoster->getSystemAttrs();
+ my ($systemData, $systemAttrs) = parseKeyValueArgsWithAttrs(
+ \@systemKeys, \@systemAttrKeys, 'system', @_
+ );
+
+ # set verbose mode if any params have been passed in:
+ $option{verbose} = 1 if %$systemData;
+
+ dumpElements(
+ 'system', undef,
+ _expandSystems(
+ sort { $a->{name} cmp $b->{name} }
+ $openslxDB->fetchSystemByFilter($systemData, undef, $systemAttrs)
+ )
+ );
+
+ return 1;
+}
+
+sub searchVendorOSes
+{
+ my @vendorOSKeys = $openslxDB->getColumnsOfTable('vendor_os');
+ my $vendorOSData = parseKeyValueArgs(\@vendorOSKeys, 'vendor_os', @_);
+
+ # set verbose mode if any params have been passed in:
+ $option{verbose} = 1 if %$vendorOSData;
+
+ dumpElements(
+ 'vendor-OS', undef,
+ map {
+ my @plugins = $openslxDB->fetchInstalledPlugins($_->{id});
+ $_->{plugins}
+ = @plugins
+ ? join(',', sort map { $_->{plugin_name} } @plugins)
+ : '<none>';
+ $_;
+ }
+ sort { $a->{name} cmp $b->{name} }
+ $openslxDB->fetchVendorOSByFilter($vendorOSData)
+ );
+
+ return 1;
+}
+
+sub changeVendorOSInConfigDB
+{
+ my $vendorOSName = _cleanName(shift || '');
+
+ if (!length($vendorOSName)) {
+ die _tr(
+ "you have to specify the name for the vendor-OS you'd like to change!\n"
+ );
+ }
+
+ my @keys = $openslxDB->getColumnsOfTable('vendor_os');
+ my $vendorOSData = parseKeyValueArgs(\@keys, 'vendor_os', @_);
+
+ my $vendorOS = $openslxDB->fetchVendorOSByFilter({'name' => $vendorOSName});
+ if (!defined $vendorOS) {
+ die _tr("the vendor-OS '%s' doesn't exists in the DB, giving up!\n",
+ $vendorOSName);
+ }
+
+ $openslxDB->changeVendorOS($vendorOS->{id}, [$vendorOSData]);
+ vlog(
+ 0, _tr("vendor-OS '%s' has been successfully changed\n", $vendorOSName)
+ );
+
+ listVendorOSes("id=$vendorOS->{id}") if $option{verbose};
+
+ return 1;
+}
+
+sub changeExportInConfigDB
+{
+ my $exportName = _cleanName(shift || '');
+
+ if (!length($exportName)) {
+ die _tr(
+ "you have to specify the name for the export you'd like to change!\n"
+ );
+ }
+
+ my @exportKeys = $openslxDB->getColumnsOfTable('export');
+ my $exportData = parseKeyValueArgs(\@exportKeys, 'export', @_);
+
+ my $export = $openslxDB->fetchExportByFilter({'name' => $exportName});
+ if (!defined $export) {
+ die _tr("the export '%s' doesn't exists in the DB, giving up!\n",
+ $exportName);
+ }
+
+ $openslxDB->changeExport($export->{id}, [$exportData]);
+ vlog(0, _tr("export '%s' has been successfully changed\n", $exportName));
+
+ listExports("id=$export->{id}") if $option{verbose};
+
+ return 1;
+}
+
+sub addClientToConfigDB
+{
+ my $clientName = _cleanName(shift || '');
+
+ if (!length($clientName)) {
+ die _tr("you have to specify the name for the new client\n");
+ }
+
+ my @clientKeys = $openslxDB->getColumnsOfTable('client');
+ push @clientKeys, 'systems';
+ my @clientAttrKeys = OpenSLX::AttributeRoster->getClientAttrs();
+ my $clientData = parseKeyValueArgsWithAttrs(
+ \@clientKeys, \@clientAttrKeys, 'client', @_
+ );
+ $clientData->{name} = $clientName;
+
+ checkGivenStage3Attrs($clientData->{attrs});
+
+ my @systemIDs;
+ if (exists $clientData->{systems}) {
+ @systemIDs = map {
+ my $system = $openslxDB->fetchSystemByFilter({'name' => $_});
+ if (!defined $system) {
+ die _tr("system '%s' doesn't exist!\n", $_);
+ }
+ $system->{id};
+ }
+ split '\s*,\s*', $clientData->{systems};
+ delete $clientData->{systems};
+ }
+
+ if (!$clientData->{mac}) {
+ die _tr("you have to specify the MAC for the new client\n");
+ }
+ if ($clientData->{mac} !~
+ m[^(?:[[:xdigit:]][[:xdigit:]]:){5}?[[:xdigit:]][[:xdigit:]]$])
+ {
+ die _tr(
+ "unknown MAC-format given, expected something like '01:02:03:04:05:06'!\n"
+ );
+ }
+
+ if ($openslxDB->fetchClientByFilter({'name' => $clientName})) {
+ die _tr("the client '%s' already exists in the DB, giving up!\n",
+ $clientName);
+ }
+ if ($openslxDB->fetchClientByFilter({'mac' => $clientData->{mac}})) {
+ die _tr(
+ "a client with the MAC '%s' already exists in the DB, giving up!\n",
+ $clientData->{mac}
+ );
+ }
+ my $clientID = $openslxDB->addClient([$clientData]);
+ vlog(
+ 0,
+ _tr(
+ "client '%s' has been successfully added to DB (ID=%s)\n",
+ $clientName, $clientID
+ )
+ );
+ if (@systemIDs) {
+ $openslxDB->addSystemIDsToClient($clientID, \@systemIDs);
+ }
+ if ($option{verbose}) {
+ listClients("id=$clientID");
+ }
+
+ return 1;
+}
+
+sub addGroupToConfigDB
+{
+ my $groupName = _cleanName(shift || '');
+ if (!length($groupName)) {
+ die _tr("you have to specify the name for the new group\n");
+ }
+
+ my @groupKeys = $openslxDB->getColumnsOfTable('groups');
+ push @groupKeys, 'systems', 'clients';
+ my @groupAttrKeys = OpenSLX::AttributeRoster->getClientAttrs();
+ my $groupData = parseKeyValueArgsWithAttrs(
+ \@groupKeys, \@groupAttrKeys, 'group', @_
+ );
+ $groupData->{name} = $groupName;
+
+ checkGivenStage3Attrs($groupData->{attrs});
+
+ my @systemIDs;
+ if (exists $groupData->{systems}) {
+ @systemIDs = map {
+ my $system = $openslxDB->fetchSystemByFilter({'name' => $_});
+ if (!defined $system) {
+ die _tr("system '%s' doesn't exist!\n", $_);
+ }
+ $system->{id};
+ }
+ split '\s*,\s*', $groupData->{systems};
+ delete $groupData->{systems};
+ }
+ my @clientIDs;
+ if (exists $groupData->{clients}) {
+ @clientIDs = map {
+ my $client = $openslxDB->fetchClientByFilter({'name' => $_});
+ if (!defined $client) {
+ die _tr("client '%s' doesn't exist in DB, giving up!\n", $_);
+ }
+ $client->{id};
+ }
+ split '\s*,\s*', $groupData->{clients};
+ delete $groupData->{clients};
+ }
+
+ if (!defined $groupData->{priority} || !length($groupData->{priority})) {
+ $groupData->{priority} = 50;
+ vlog(0, _tr("priority of new group has been set to default (50)."));
+ }
+
+ if ($openslxDB->fetchGroupByFilter({'name' => $groupName})) {
+ die _tr("the group '%s' already exists in the DB, giving up!\n",
+ $groupName);
+ }
+ my $groupID = $openslxDB->addGroup([$groupData]);
+ vlog(
+ 0,
+ _tr(
+ "group '%s' has been successfully added to DB (ID=%s)\n",
+ $groupName, $groupID
+ )
+ );
+ if (@systemIDs) {
+ $openslxDB->addSystemIDsToGroup($groupID, \@systemIDs);
+ }
+ if (@clientIDs) {
+ $openslxDB->addClientIDsToGroup($groupID, \@clientIDs);
+ }
+ listGroups("id=$groupID") if $option{verbose};
+
+ return 1;
+}
+
+sub addSystemToConfigDB
+{
+ my $systemName = _cleanName(shift || '');
+
+ if (!length($systemName)) {
+ die _tr("you have to specify the name of the new system!\n");
+ }
+
+ my @systemKeys = $openslxDB->getColumnsOfTable('system');
+ push @systemKeys, 'clients', 'export';
+ my @systemAttrKeys = OpenSLX::AttributeRoster->getSystemAttrs();
+ my $systemData = parseKeyValueArgsWithAttrs(
+ \@systemKeys, \@systemAttrKeys, 'system', @_
+ );
+ $systemData->{name} = $systemName;
+ $systemData->{attrs} ||= {};
+
+ my $exportName = $systemData->{export} || '';
+ delete $systemData->{export};
+ if (!length($exportName)) {
+ $exportName = $systemName;
+
+ # try falling back to given system name
+ }
+ my $export = $openslxDB->fetchExportByFilter({'name' => $exportName});
+ if (!defined $export) {
+ die _tr("export '%s' could not be found in DB, giving up!\n",
+ $exportName);
+ }
+ $systemData->{export_id} = $export->{id};
+
+ checkGivenStage3Attrs($systemData->{attrs}, $export->{vendor_os_id});
+
+ my @clientIDs;
+ if (exists $systemData->{clients}) {
+ @clientIDs = map {
+ my $client = $openslxDB->fetchClientByFilter({'name' => $_});
+ if (!defined $client) {
+ die _tr("client '%s' doesn't exist in DB, giving up!\n", $_);
+ }
+ $client->{id};
+ }
+ split '\s*,\s*', $systemData->{clients};
+ delete $systemData->{clients};
+ }
+ else {
+ # no clients given, so we add this system to the default client,
+ # which will make this system bootable by *all* clients (unless
+ # they are configured otherwise).
+ my $defaultClient =
+ $openslxDB->fetchClientByFilter({'name' => '<<<default>>>'});
+ push @clientIDs, $defaultClient->{id};
+ }
+
+ if ($openslxDB->fetchSystemByFilter({'name' => $systemName})) {
+ die _tr("the system '%s' already exists in the DB, giving up!\n",
+ $systemName);
+ }
+
+ my $systemConfigPath =
+ "$openslxConfig{'private-path'}/config/$systemName/default";
+ if (!-e $systemConfigPath) {
+ # create the default (empty) config folders for this system:
+ createConfigFolderForSystem($systemName);
+ }
+
+ my $systemID = $openslxDB->addSystem([$systemData]);
+ vlog(
+ 0,
+ _tr(
+ "system '%s' has been successfully added to DB (ID=%s)\n",
+ $systemName, $systemID
+ )
+ );
+ if (@clientIDs) {
+ $openslxDB->addClientIDsToSystem($systemID, \@clientIDs);
+ }
+ listSystems("id=$systemID") if $option{verbose};
+
+ return 1;
+}
+
+sub changeClientInConfigDB
+{
+ my $clientName = _cleanName(shift || '');
+
+ if (!length($clientName)) {
+ die _tr(
+ "you have to specify the name of the client you'd like to change!\n"
+ );
+ }
+
+ my @clientKeys = $openslxDB->getColumnsOfTable('client');
+ push @clientKeys, 'systems', 'add-systems', 'remove-systems';
+ my @clientAttrKeys = OpenSLX::AttributeRoster->getClientAttrs();
+ my $clientData = parseKeyValueArgsWithAttrs(
+ \@clientKeys, \@clientAttrKeys, 'client', @_
+ );
+
+ my $client = $openslxDB->fetchClientByFilter({'name' => $clientName});
+ if (!defined $client) {
+ die _tr("the client '%s' doesn't exists in the DB, giving up!\n",
+ $clientName);
+ }
+
+ checkGivenStage3Attrs($clientData->{attrs});
+
+ mergeNonExistingAttributes($clientData, $client);
+
+ my @systemIDs;
+ if (exists $clientData->{systems}) {
+ @systemIDs = map {
+ my $system = $openslxDB->fetchSystemByFilter({'name' => $_});
+ if (!defined $system) {
+ die _tr("system '%s' doesn't exist!\n", $_);
+ }
+ $system->{id};
+ }
+ split ",", $clientData->{systems};
+ delete $clientData->{systems};
+ }
+ if (exists $clientData->{'add-systems'}) {
+ @systemIDs = $openslxDB->fetchSystemIDsOfClient($client->{id});
+ push @systemIDs, map {
+ my $system = $openslxDB->fetchSystemByFilter({'name' => $_});
+ if (!defined $system) {
+ die _tr("system '%s' doesn't exist!\n", $_);
+ }
+ $system->{id};
+ }
+ split ",", $clientData->{'add-systems'};
+ delete $clientData->{'add-systems'};
+ }
+ if (exists $clientData->{'remove-systems'}) {
+ @systemIDs = $openslxDB->fetchSystemIDsOfClient($client->{id});
+ foreach my $sysName (split ",", $clientData->{'remove-systems'}) {
+ my $system = $openslxDB->fetchSystemByFilter({'name' => $sysName});
+ if (!defined $system) {
+ die _tr("system '%s' doesn't exist!\n", $sysName);
+ }
+ @systemIDs = grep { $_ != $system->{id} } @systemIDs;
+ }
+ delete $clientData->{'remove-systems'};
+ }
+
+ if ($clientData->{name} && $client->{name} eq '<<<default>>>') {
+ die _tr(
+ "you can't rename the default client - no changes were made!\n");
+ }
+
+ if ( $clientData->{mac}
+ && $clientData->{mac} !~
+ m[^(?:[[:xdigit:]][[:xdigit:]]:){5}?[[:xdigit:]][[:xdigit:]]$])
+ {
+ die _tr(
+ "unknown MAC-format given, expected something like '01:02:03:04:05:06'!\n"
+ );
+ }
+
+ $openslxDB->changeClient($client->{id}, [$clientData]);
+ vlog(0, _tr("client '%s' has been successfully changed\n", $clientName));
+ if (@systemIDs) {
+ $openslxDB->setSystemIDsOfClient($client->{id}, \@systemIDs);
+ }
+ listClients("id=$client->{id}") if $option{verbose};
+
+ return 1;
+}
+
+sub changeGroupInConfigDB
+{
+ my $groupName = _cleanName(shift || '');
+
+ if (!length($groupName)) {
+ die _tr(
+ "you have to specify the name of the group you'd like to change!\n"
+ );
+ }
+
+ my @groupKeys = $openslxDB->getColumnsOfTable('group');
+ push @groupKeys, qw(
+ systems add-systems remove-systems clients add-clients remove-clients
+ );
+ my @groupAttrKeys = OpenSLX::AttributeRoster->getClientAttrs();
+ my $groupData = parseKeyValueArgsWithAttrs(
+ \@groupKeys, \@groupAttrKeys, 'group', @_
+ );
+
+ my $group = $openslxDB->fetchGroupByFilter({'name' => $groupName});
+ if (!defined $group) {
+ die _tr("the group '%s' doesn't exists in the DB, giving up!\n",
+ $groupName);
+ }
+
+ checkGivenStage3Attrs($groupData->{attrs});
+
+ mergeNonExistingAttributes($groupData, $group);
+
+ my (@systemIDs, @clientIDs);
+ if (exists $groupData->{systems}) {
+ @systemIDs = map {
+ my $system = $openslxDB->fetchSystemByFilter({'name' => $_});
+ if (!defined $system) {
+ die _tr("system '%s' doesn't exist!\n", $_);
+ }
+ $system->{id};
+ }
+ split ",", $groupData->{systems};
+ delete $groupData->{systems};
+ }
+ if (exists $groupData->{'add-systems'}) {
+ @systemIDs = $openslxDB->fetchSystemIDsOfGroup($group->{id});
+ push @systemIDs, map {
+ my $system = $openslxDB->fetchSystemByFilter({'name' => $_});
+ if (!defined $system) {
+ die _tr("system '%s' doesn't exist!\n", $_);
+ }
+ $system->{id};
+ }
+ split ",", $groupData->{'add-systems'};
+ delete $groupData->{'add-systems'};
+ }
+ if (exists $groupData->{'remove-systems'}) {
+ @systemIDs = $openslxDB->fetchSystemIDsOfGroup($group->{id});
+ foreach my $sysName (split ',', $groupData->{'remove-systems'}) {
+ my $system = $openslxDB->fetchSystemByFilter({'name' => $sysName});
+ if (!defined $system) {
+ die _tr("system '%s' doesn't exist!\n", $sysName);
+ }
+ @systemIDs = grep { $_ != $system->{id} } @systemIDs;
+ }
+ delete $groupData->{'remove-systems'};
+ }
+ if (exists $groupData->{clients}) {
+ @clientIDs = map {
+ my $client = $openslxDB->fetchClientByFilter({'name' => $_});
+ if (!defined $client) {
+ die _tr("client '%s' doesn't exist in DB, giving up!\n", $_);
+ }
+ $client->{id};
+ }
+ split ",", $groupData->{clients};
+ delete $groupData->{clients};
+ }
+ if (exists $groupData->{'add-clients'}) {
+ @clientIDs = $openslxDB->fetchClientIDsOfGroup($group->{id});
+ push @clientIDs, map {
+ my $client = $openslxDB->fetchClientByFilter({'name' => $_});
+ if (!defined $client) {
+ die _tr("client '%s' doesn't exist!\n", $_);
+ }
+ $client->{id};
+ }
+ split ",", $groupData->{'add-clients'};
+ delete $groupData->{'add-clients'};
+ }
+ if (exists $groupData->{'remove-clients'}) {
+ @clientIDs = $openslxDB->fetchClientIDsOfGroup($group->{id});
+ foreach my $clientName (split ",", $groupData->{'remove-clients'}) {
+ my $client =
+ $openslxDB->fetchClientByFilter({'name' => $clientName});
+ if (!defined $client) {
+ die _tr("client '%s' doesn't exist!\n", $clientName);
+ }
+ @clientIDs = grep { $_ != $client->{id} } @clientIDs;
+ }
+ delete $groupData->{'remove-clients'};
+ }
+
+ if (defined $groupData->{priority} && $groupData->{priority} !~ m{^\d+$}) {
+ die _tr("unknown priority-format given, expected an integer!\n");
+ }
+
+ $openslxDB->changeGroup($group->{id}, [$groupData]);
+ vlog(0, _tr("group '%s' has been successfully changed\n", $groupName));
+ if (@systemIDs) {
+ $openslxDB->setSystemIDsOfGroup($group->{id}, \@systemIDs);
+ }
+ if (@clientIDs) {
+ $openslxDB->setClientIDsOfGroup($group->{id}, \@clientIDs);
+ }
+ listGroups("id=$group->{id}") if $option{verbose};
+
+ return 1;
+}
+
+sub changeSystemInConfigDB
+{
+ my $systemName = _cleanName(shift || '');
+
+ if (!length($systemName)) {
+ die _tr(
+ "you have to specify the name of the system you'd like to change!\n"
+ );
+ }
+
+ my $system = $openslxDB->fetchSystemByFilter({'name' => $systemName});
+ if (!defined $system) {
+ die _tr("the system '%s' doesn't exists in the DB, giving up!\n",
+ $systemName);
+ }
+ my @systemKeys = $openslxDB->getColumnsOfTable('system');
+ push @systemKeys, 'clients', 'add-clients', 'remove-clients';
+ my @systemAttrKeys = OpenSLX::AttributeRoster->getSystemAttrs();
+ my $systemData = parseKeyValueArgsWithAttrs(
+ \@systemKeys, \@systemAttrKeys, 'system', @_
+ );
+
+ my $export = $openslxDB->fetchExportByID($system->{export_id});
+ checkGivenStage3Attrs($systemData->{attrs}, $export->{vendor_os_id});
+
+ mergeNonExistingAttributes($systemData, $system);
+
+ my @clientIDs;
+ if (exists $systemData->{clients}) {
+ @clientIDs = map {
+ my $client = $openslxDB->fetchClientByFilter({'name' => $_});
+ if (!defined $client) {
+ die _tr("client '%s' doesn't exist in DB, giving up!\n", $_);
+ }
+ $client->{id};
+ }
+ split ",", $systemData->{clients};
+ delete $systemData->{clients};
+ }
+ if (exists $systemData->{'add-clients'}) {
+ @clientIDs = $openslxDB->fetchClientIDsOfSystem($system->{id});
+ push @clientIDs, map {
+ my $client = $openslxDB->fetchClientByFilter({'name' => $_});
+ if (!defined $client) {
+ die _tr("client '%s' doesn't exist!\n", $_);
+ }
+ $client->{id};
+ }
+ split ",", $systemData->{'add-clients'};
+ delete $systemData->{'add-clients'};
+ }
+ if (exists $systemData->{'remove-clients'}) {
+ @clientIDs = $openslxDB->fetchClientIDsOfSystem($system->{id});
+ foreach my $clientName (split ",", $systemData->{'remove-clients'}) {
+ my $client =
+ $openslxDB->fetchClientByFilter({'name' => $clientName});
+ if (!defined $client) {
+ die _tr("client '%s' doesn't exist!\n", $clientName);
+ }
+ @clientIDs = grep { $_ != $client->{id} } @clientIDs;
+ }
+ delete $systemData->{'remove-clients'};
+ }
+ if ($systemData->{name} && $system->{name} eq '<<<default>>>') {
+ die _tr(
+ "you can't rename the default system - no changes were made!\n");
+ }
+
+ $openslxDB->changeSystem($system->{id}, $systemData);
+ vlog(0, _tr("system '%s' has been successfully changed\n", $systemName));
+ if (@clientIDs) {
+ $openslxDB->setClientIDsOfSystem($system->{id}, \@clientIDs);
+ }
+ listSystems("id=$system->{id}")if $option{verbose};
+
+ return 1;
+}
+
+sub removeClientFromConfigDB
+{
+ my $clientName = _cleanName(shift || '');
+
+ if (!length($clientName)) {
+ die _tr(
+ "you have to specify the name of the client you'd like to remove!\n"
+ );
+ }
+
+ my $clientData = parseKeyValueArgs(['name'], 'client', @_);
+
+ my $client = $openslxDB->fetchClientByFilter({'name' => $clientName});
+ if (!defined $client) {
+ die _tr("the client '%s' doesn't exists in the DB, giving up!\n",
+ $clientName);
+ }
+ if ($client->{name} eq '<<<default>>>') {
+ die _tr("you can't remove the default client!\n");
+ }
+ $openslxDB->removeClient($client->{id});
+ vlog(0,
+ _tr("client '%s' has been successfully removed from DB\n", $clientName)
+ );
+
+ return 1;
+}
+
+sub removeGroupFromConfigDB
+{
+ my $groupName = _cleanName(shift || '');
+
+ if (!length($groupName)) {
+ die _tr(
+ "you have to specify the name of the group you'd like to remove!\n"
+ );
+ }
+
+ my $groupData = parseKeyValueArgs(['name'], 'group', @_);
+
+ my $group = $openslxDB->fetchGroupByFilter({'name' => $groupName});
+ if (!defined $group) {
+ die _tr("the group '%s' doesn't exists in the DB, giving up!\n",
+ $groupName);
+ }
+ $openslxDB->removeGroup($group->{id});
+ vlog(0,
+ _tr("group '%s' has been successfully removed from DB\n", $groupName)
+ );
+
+ return 1;
+}
+
+sub removeSystemFromConfigDB
+{
+ my $systemName = _cleanName(shift || '');
+
+ if (!length($systemName)) {
+ die _tr(
+ "you have to specify the name of the system you'd like to remove!\n"
+ );
+ }
+
+ my $systemData = parseKeyValueArgs(['name'], 'system', @_);
+
+ my $system = $openslxDB->fetchSystemByFilter({'name' => $systemName});
+ if (!defined $system) {
+ die _tr("the system '%s' doesn't exists in the DB, giving up!\n",
+ $systemName);
+ }
+ if ($system->{name} eq '<<<default>>>') {
+ die _tr("you can't remove the default system!\n");
+ }
+ $openslxDB->removeSystem($system->{id});
+ vlog(0,
+ _tr("system '%s' has been successfully removed from DB\n", $systemName)
+ );
+
+ return 1;
+}
+
+sub _expandClients
+{ # expands info for given clients
+ return
+ map {
+ my @sysIDs = $openslxDB->fetchSystemIDsOfClient($_->{id});
+ $_->{systems}
+ = join "\n",
+ map { $_->{name} }
+ sort { $a->{name} cmp $b->{name} }
+ $openslxDB->fetchSystemByID(\@sysIDs, 'name');
+ if ($option{inherited}) {
+ my $mergedClient = clone($_);
+ my $originInfo = {};
+ $openslxDB->mergeDefaultAndGroupAttributesIntoClient(
+ $mergedClient, $originInfo
+ );
+ my $mergedAttrs = $mergedClient->{attrs} || {};
+ $_->{attrs} = {};
+ foreach my $attr (keys %$mergedAttrs) {
+ my $origin = $originInfo->{$attr};
+ my $enhancedName = $origin ? "[$origin] $attr" : $attr;
+ $_->{attrs}->{$enhancedName} = $mergedAttrs->{$attr};
+ }
+ }
+ # rename attrs to ATTRIBUTES for display
+ $_->{ATTRIBUTES} = $_->{attrs};
+ delete $_->{attrs};
+ $_;
+ }
+ @_;
+}
+
+sub _expandGroups
+{ # expands info for given groups
+ return
+ map {
+ my @systemIDs = $openslxDB->fetchSystemIDsOfGroup($_->{id});
+ $_->{systems}
+ = join "\n", map { $_->{name} }
+ sort { $a->{name} cmp $b->{name} }
+ $openslxDB->fetchSystemByID(\@systemIDs, 'name');
+ my @clientIDs = $openslxDB->fetchClientIDsOfGroup($_->{id});
+ $_->{clients}
+ = join "\n", map { $_->{name} }
+ sort { $a->{name} cmp $b->{name} }
+ $openslxDB->fetchClientByID(\@clientIDs, 'name');
+ # rename attrs to ATTRIBUTES for display
+ $_->{ATTRIBUTES} = $_->{attrs};
+ delete $_->{attrs};
+ $_;
+ }
+ @_;
+}
+
+sub _expandSystems
+{ # expands info for given systems
+ return
+ map {
+ my @clientIDs = $openslxDB->fetchClientIDsOfSystem($_->{id});
+ $_->{clients}
+ = join "\n",
+ map { $_->{name} }
+ sort { $a->{name} cmp $b->{name} }
+ $openslxDB->fetchClientByID(\@clientIDs, 'name');
+ my @activePlugins;
+ my $export = $openslxDB->fetchExportByID($_->{export_id});
+ if (defined $export) {
+ $_->{export_id} = "$export->{id} ($export->{name})";
+
+ # fetch detailed info about active plugins
+ my @installedPlugins = $openslxDB->fetchInstalledPlugins(
+ $export->{vendor_os_id}
+ );
+ my $mergedSystem = clone($_);
+ my $originInfo = {};
+ $openslxDB->mergeDefaultAttributesIntoSystem(
+ $mergedSystem, \@installedPlugins, $originInfo
+ );
+ my $mergedAttrs = $mergedSystem->{attrs} || {};
+ foreach my $plugin (@installedPlugins) {
+ next if !$mergedAttrs->{"$plugin->{plugin_name}::active"};
+ push @activePlugins, $plugin;
+ }
+ if ($option{inherited}) {
+ $_->{attrs} = {};
+ foreach my $attr (keys %$mergedAttrs) {
+ my $origin = $originInfo->{$attr};
+ my $enhancedName = $origin ? "[$origin] $attr" : $attr;
+ $_->{attrs}->{$enhancedName} = $mergedAttrs->{$attr};
+ }
+ }
+ }
+ $_->{PLUGINS} = [ sort map { $_->{plugin_name} } @activePlugins ];
+ # rename attrs to ATTRIBUTES for display
+ $_->{ATTRIBUTES} = $_->{attrs};
+ delete $_->{attrs};
+ $_;
+ }
+ @_;
+}
+
+sub _cleanName
+{ # removes 'name=""' constructs from the name, as it is rather tempting
+ # for the user to type that ... (and we'd like to play along with DWIM)
+ my $name = shift;
+
+ return unless defined $name;
+
+ if ($name =~ m[^name=(.+)$]) {
+ return $1;
+ }
+
+ # for convenience, we alias default to <<<default>>>
+ $name = '<<<default>>>' if $name eq 'default';
+
+ return $name;
+}
+
+=head1 NAME
+
+slxconfig - OpenSLX-script to view & change the configurational database
+
+=head1 SYNOPSIS
+
+slxconfig [options] <action> <key-value-pairs>
+
+=head3 Options
+
+ --help brief help message
+ --inherited show inherited attributes, too
+ --man show full documentation
+ --verbose be more verbose
+ --version show version
+
+=head3 Actions
+
+=over 8
+
+=item B<< add-client <client-name> mac=<MAC> [<key>=<value> ...] >>
+
+adds a new client to the config-DB
+
+=item B<< add-system <system-name> [export=<export-name>] \ >>
+
+=item B<< <key>=<value> ...] >>
+
+adds a new system to the config-DB
+
+=item B<< add-group <group-name> [priority=<Number>] [<key>=<value> ...] >>
+
+adds a new group to the config-DB
+
+=item B<< change-vendor-os <vendor-os-name> [<key>=<value> ...] >>
+
+changes the data of an existing vendor-OS in the config-DB.
+
+=item B<< change-export <export-name> [<key>=<value> ...] >>
+
+changes the data of an existing export in the config-DB
+
+=item B<< change-client <client-name> [<key>=<value> ...] >>
+
+changes the data of an existing client in the config-DB
+
+Note: you can use the special value '-' to unset a key (mostly useful
+for attributes).
+
+=item B<< change-group <group-name> [<key>=<value> ...] >>
+
+changes the data of an existing group in the config-DB
+
+Note: you can use the special value '-' to unset a key (mostly useful
+for attributes).
+
+=item B<< change-system <system-name> [<key>=<value> ...] >>
+
+changes the data of an existing system in the config-DB
+
+Note: you can use the special value '-' to unset a key (mostly useful
+for attributes).
+
+=item B<< cleanup-db >>
+
+utility command that looks for any inconsistencies in the DB (stale references
+and/or references to plugins that do not exists) and removes them.
+
+You should only invoke this if you are a developer and have removed one or
+more plugins from the repository and would like to get rid of the left-overs
+in your local DB.
+
+=item B<< list-attributes [<attr-scope-or-attr-name>] >>
+
+lists all attributes, the ones in the given scope or the one with the given
+name
+
+=item B<< list-client [<client-name>] >>
+
+lists client with given name
+
+=item B<< list-export [<export-name>] >>
+
+lists export with given name
+
+=item B<< list-group [<group-name>] >>
+
+lists group with given name
+
+=item B<< list-system [<system-name>] >>
+
+lists system with given name
+
+=item B<< list-vendor-os [<vendorOS-name>] >>
+
+lists vendor-OS with given name
+
+=item B<< remove-client <client-name> >>
+
+removes a client from the config-DB
+
+=item B<< remove-group <group-name> >>
+
+removes a group from the config-DB
+
+=item B<< remove-system <system-name> >>
+
+removes a system from the config-DB
+
+=item B<< search-client [<key>=<value> ...] >>
+
+shows all clients in config-DB (optionally matching given criteria)
+
+=item B<< search-export [<key>=<value> ...] >>
+
+shows all exports in config-DB (optionally matching given criteria)
+
+=item B<< search-group [<key>=<value> ...] >>
+
+shows all groups in config-DB (optionally matching given criteria)
+
+=item B<< search-system [<key>=<value> ...] >>
+
+shows all systems in config-DB (optionally matching given
+criteria)
+
+=item B<< search-vendor-os [<key>=<value> ...] >>
+
+shows all vendor-OSes in config-DB (optionally matching given criteria)
+
+=back
+
+=head1 DESCRIPTION
+
+B<slxconfig> can be used to view the contents of the configurational database.
+Additionally, you can add systems as well as clients and change their specific
+boot configuration.
+
+=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<< --verbose >>
+
+Prints more information during execution of any action.
+
+=item B<< --version >>
+
+Prints the version and exits.
+
+=back
+
+=head1 EXAMPLES
+
+=head3 Listing existing Clients / Exports / Groups / Systems / Vendor-OSes
+
+=over 8
+
+=item B<< slxconfig list-client >>
+
+=item B<< slxconfig list-export >>
+
+=item B<< slxconfig list-group >>
+
+=item B<< slxconfig list-system >>
+
+=item B<< slxconfig list-vendor-os >>
+
+lists all existing instances of the respective DB-objects
+
+=item B<< slxconfig list-system "<<<default>>>" >>
+
+Lists the details of the default-system.
+
+=item B<< slxconfig --inherited list-system suse-10.2::nfs >>
+
+Lists the details of the 'suse-10.2::nfs'-system with all the attributes
+that it inherits from the default-system or the default-client.
+
+=back
+
+=head3 Listing known attributes
+
+=over 8
+
+=item B<< slxconfig list-attr >>
+
+lists all known attributes (--verbose will give details).
+
+=item B<< slxconfig list-attr <scope> >>
+
+lists all known attributes for the given scope (use 'core' to see only
+non-scoped attributes).
+
+=back
+
+=head3 Adding a new System to an exported Vendor-OS
+
+=over 8
+
+=item B<< slxconfig add-system debian-4.0 >>
+
+adds a new system named 'debian-4.0' to the config-DB that will
+use the export of the same name. No client will be associated
+with this system, yet.
+
+=item B<< slxconfig add-system suse-11.1 export-name=suse-11.1-kde \ >>
+
+=item B<< clients=PC131,PC132,PC133 \ >>
+
+=item B<< label="Linux Desktop" >>
+
+adds a new system name 'suse-11.1' to the config-DB that will
+use the export named 'suse-11.1-kde'. The system will be labeled
+'Linux Desktop' and the clients 'PC131, 'PC132' and 'PC133' are
+associated with this system (so they can boot it).
+
+=back
+
+=head3 Adding a new Client
+
+=over 8
+
+=item B<< slxconfig add-client vmware-1 mac=01:02:03:04:05:06 >>
+
+adds a new client named 'vmware-1', being identified by the MAC
+'01:02:03:04:05:06' to the config-DB. No system will be
+associated with this client, yet (so it can't boot anything).
+
+=item B<< slxconfig add-client vmware-1 mac=01:02:03:04:05:06 \ >>
+
+=item B<< systems=suse-11.1,debian-4.0 \ >>
+
+=item B<< boot_type=pxe >>
+
+adds a new client named 'vmware-1', being identified by the MAC
+'01:02:03:04:05:06' to the config-DB. The systems 'suse-11.1' &
+'Debian-4.0' will be associated with this client (so it will
+offer these systems for booting).
+
+This client will use PXE for booting (which is the default, anyway).
+
+=back
+
+=head3 Changing a System
+
+=over 8
+
+=item B<< slxconfig change-system suse-11.1 boot_type=preboot-cd >>
+
+will change the system named 'suse-11.1' such that it will use a preboot-CD
+environment for booting.
+
+=item B<< slxconfig change-system suse-11.1 add-clients=vmware-1 >>
+
+will associate the client 'vmware-1' with the system named
+'suse-11.1'.
+
+=item B<< slxconfig change-system suse-11.1 remove-clients=vmware-1 >>
+
+will remove the client 'vmware-1' from the system named
+'suse-11.1'.
+
+=back
+
+=head3 Changing a Client
+
+=over 8
+
+=item B<< slxconfig change-client PC131 start_snmp=yes >>
+
+will change the client named 'PC131' such that it will start
+the SNMP daemon on all systems that it boots.
+
+=item B<< slxconfig change-client PC131 add-systems=Debian-4.0 >>
+
+will associate the system 'Debian-4.0' with the client named
+'PC131'.
+
+=item B<< slxconfig change-client PC131 remove-systems=Debian-4.0 >>
+
+will remove the system 'Debian-4.0' from the client named
+'PC131'.
+
+=back
+
+=head3 Removing a Client / Group / System
+
+=over 8
+
+=item B<< slxconfig remove-client <client-name> >>
+
+=item B<< slxconfig remove-group <group-name> >>
+
+=item B<< slxconfig remove-system <system-name> >>
+
+removes the client/group/system with the given name.
+
+=back
+
+=head3 Searching for Clients / Exports / Groups / Systems / Vendor-OSes
+
+=over 8
+
+=item B<< slxconfig search-client mac='01:02:03:04:05:06' >>
+
+displays all clients with the MAC '01:02:03:04:05:06' (should be only one)
+
+=item B<< slxconfig search-export type=nfs >>
+
+displays the exports of type 'nfs'
+
+=item B<< slxconfig list-group priority=50 >>
+
+displays the groups that have the default priority (50)
+
+=back
+
+=head1 SEE ALSO
+
+slxsettings, slxos-setup, slxos-export, slxconfig-demuxer
+
+=head1 GENERAL OPENSLX OPTIONS
+
+Being a part of OpenSLX, this script supports several other options
+which can be used to overrule the OpenSLX settings:
+
+ --db-name=<string> name of database
+ --db-spec=<string> full DBI-specification of database
+ --db-type=<string> type of database to connect to
+ --locale=<string> locale to use for translations
+ --log-level=<int> level of logging verbosity (0-3)
+ --logfile=<string> file to write logging output to
+ --private-path=<string> path to private data
+ --public-path=<string> path to public (client-accesible) data
+ --temp-path=<string> path to temporary data
+
+Please refer to the C<slxsettings>-manpage for a more detailed description
+of these options.
+
+=cut
diff --git a/src/config-db/slxconfig-demuxer b/src/config-db/slxconfig-demuxer
new file mode 100755
index 00000000..b88efeb6
--- /dev/null
+++ b/src/config-db/slxconfig-demuxer
@@ -0,0 +1,918 @@
+#! /usr/bin/perl
+# -----------------------------------------------------------------------------
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# slxconfig-demuxer
+# - OpenSLX configuration demultiplexer
+# -----------------------------------------------------------------------------
+use strict;
+use warnings;
+use Switch;
+
+
+my $abstract = q[
+slxconfig-demuxer
+ This script will read information about all systems, clients and
+ groups from the OpenSLX configuration database, mix & match the individual
+ configurational attributes and then demultiplex the resulting information
+ to a set of configuration files. These files are used by any OpenSLX-client
+ during boot to find out which systems to offer for booting.
+
+ The resulting files will be put into the OpenSLX-tftpboot-path.
+
+ Please use the --man option in order to read the full manual.
+];
+
+use Config::General;
+use Digest::MD5 qw(md5_hex);
+use File::Basename;
+use File::Find;
+use File::Path;
+use List::Util qw(first);
+use Getopt::Long qw(:config pass_through);
+use Pod::Usage;
+
+# add the lib-folder and the folder this script lives in to perl's search
+# path for modules:
+use FindBin;
+use lib "$FindBin::RealBin/../lib";
+use lib "$FindBin::RealBin";
+# development path to config-db stuff
+
+use OpenSLX::Basics;
+use OpenSLX::ConfigDB qw(:support);
+use OpenSLX::ConfigFolder;
+use OpenSLX::OSPlugin::Roster;
+use OpenSLX::Utils;
+
+my (
+ $systemConfCount,
+ # number of system configurations written
+ $systemErrCount,
+ # number of systems that had errors
+ $bootEnvErrCount,
+ # number of boot environments that had errors
+ $clientSystemConfCount,
+ # number of (system-specific) client configurations written
+ $initramfsCount,
+ # number of initramfs that were created
+ @targetSystems,
+ # systems to create initramfs for, defaults to all systems
+ %bootEnvMap,
+ # objects encapsulating the bootloader specific configurations
+ %option,
+ # cmdline option hash
+);
+
+if ($> != 0) {
+ die _tr("Sorry, this script can only be executed by the superuser!\n");
+}
+
+GetOptions(
+ 'dhcp-export-type=s' => \$option{dhcpType},
+ 'dry-run' => \$option{dryRun},
+ 'help|?' => \$option{helpReq},
+ 'man' => \$option{manReq},
+ 'version' => \$option{versionReq},
+ )
+ or pod2usage(2);
+pod2usage(-msg => $abstract, -verbose => 0, -exitval => 1) if $option{helpReq};
+if ($option{manReq}) {
+ # avoid dubious problem with perldoc in combination with UTF-8 that
+ # leads to strange dashes and single-quotes being used
+ $ENV{LC_ALL} = 'POSIX';
+ pod2usage(-verbose => 2);
+}
+if ($option{versionReq}) {
+ slxsystem('slxversion');
+ exit 1;
+}
+
+openslxInit();
+
+my $openslxDB = OpenSLX::ConfigDB->new();
+$openslxDB->connect();
+
+my $clientConfigPath = "$openslxConfig{'private-path'}/config";
+# make sure that the default config folders exist:
+if (createConfigFolderForDefaultSystem()) {
+ # this path should have been generated by earlier stage (slxsettings), so
+ # we indicate that there is some kind of problem:
+ warn _tr(
+ "Completed client-config-folder '%s', since at least some parts of it didn't exist!",
+ $clientConfigPath
+ );
+}
+
+# protect against parallel execution of this script
+my $demuxerLock = grabLock('slxconfig-demuxer');
+
+my $tempPath = "$openslxConfig{'temp-path'}/slxconfig-demuxer";
+if (!$option{dryRun}) {
+ rmtree($tempPath);
+ mkpath($tempPath);
+ if (!-d $tempPath) {
+ die _tr("Unable to create or access temp-path '%s'!", $tempPath);
+ }
+}
+
+my $deleteInFinalize = 0;
+
+my @demuxableSystems
+ = grep { $_->{name} ne '<<<default>>>' } $openslxDB->fetchSystemByFilter();
+if (@ARGV) {
+ # create initramfs only for systems given on cmdline
+ for my $systemName (@ARGV) {
+ if ($systemName eq '<<<default>>>') {
+ warn _tr(
+ 'The default-system can not be demuxed - it will be skipped.'
+ );
+ next;
+ }
+ my $system = first { $_->{name} eq $systemName } @demuxableSystems;
+ if (!$system) {
+ warn _tr(
+ 'The system "%s" is unknown and will be ignored.', $systemName
+ );
+ next;
+ }
+ push @targetSystems, $system;
+ }
+}
+else {
+ # create initramfs for all systems
+ @targetSystems = @demuxableSystems;
+ $deleteInFinalize = 1;
+}
+
+writeConfigurations();
+
+my $wr = $option{dryRun} ? 'would have written' : 'wrote';
+my $errCount = $systemErrCount ? $systemErrCount : 'no';
+my $systemStatusString
+ = $systemErrCount ? "$errCount system(s) had errors" : 'all systems ok';
+$errCount = $bootEnvErrCount ? $bootEnvErrCount : 'no';
+my $bootEnvStatusString
+ = $bootEnvErrCount
+ ? "$errCount boot environment(s) had errors"
+ : 'all boot-environments ok';
+print "\n", unshiftHereDoc(<<"End-of-Here");
+ $wr $systemConfCount system-specific and $clientSystemConfCount client-specific configurations
+ $initramfsCount initramfs were created
+ $systemStatusString
+ $bootEnvStatusString
+End-of-Here
+
+$openslxDB->disconnect();
+
+rmtree([$tempPath]);
+
+# allow all boot-environments to clean up and active the new configuration
+foreach my $bootEnv (values %bootEnvMap) {
+ $bootEnv->finalize($deleteInFinalize);
+}
+
+exit;
+
+################################################################################
+###
+################################################################################
+sub folderContainsFiles
+{
+ my $folder = shift;
+
+ return 0 unless -d $folder;
+
+ my $result = 0;
+ my $wanted = sub {
+ if ($result) {
+ # skip anything else if we have found a file already
+ $File::Find::prune = 1;
+ }
+ $result = 1 if -f;
+ };
+ find({wanted => $wanted, follow_fast => 1}, $folder);
+ vlog(2, "result for folderContainsFiles($folder): $result\n");
+ return $result;
+}
+
+sub digestAttributes
+{ # returns a digest-string for the given attribute hash, in order to
+ # facilitate comparing different attribute hashes.
+ my $object = shift;
+
+ my $attrs = $object->{attrs} || {};
+ my $attrsAsString
+ = join ';',
+ map { "$_=$attrs->{$_}" }
+ sort
+ grep { defined $attrs->{$_} }
+ keys %$attrs;
+
+ vlog(3, "Attribute-string: $attrsAsString");
+ return md5_hex($attrsAsString);
+}
+
+sub writeAttributesToFile
+{
+ my $object = shift;
+ my $fileName = shift;
+
+ return if $option{dryRun};
+
+ my $content = "# attributes set by slxconfig-demuxer:\n";
+ my $attrs = $object->{attrs} || {};
+ # filter out any plugin-specific attributes (we only want to handle
+ # the attributes relevant to the core here)
+ my @attrs = sort grep { index($_, '::') == -1 } keys %$attrs;
+ foreach my $attr (@attrs) {
+ my $attrVal = $attrs->{$attr};
+ next if !defined $attrVal;
+ $content .= qq[$attr="$attrVal"\n];
+ }
+ # Overwrite attribute file even if it exists, to make sure that our users
+ # will never try to fiddle with machine-setup directly in the file-system.
+ # The config-DB is the keeper of that info!
+ spitFile($fileName, $content);
+ if ($openslxConfig{'log-level'} > 2) {
+ vlog(0, "--- START OF $fileName ---");
+ vlog(0, $content);
+ vlog(0, "--- END OF $fileName --- ");
+ }
+ return;
+}
+
+sub writeSlxConfigToFile
+{
+ my $slxConf = shift;
+ my $fileName = shift;
+
+ return if $option{dryRun};
+
+ my $content = '';
+ foreach my $key (sort keys %$slxConf) {
+ $content .= qq[$key="$slxConf->{$key}"\n];
+ }
+ spitFile($fileName, $content);
+ return;
+}
+
+sub copyExternalSystemConfig
+{ # copies local configuration extensions of given system from private
+ # config folder (var/lib/openslx/config/...) into a temporary folder
+ my $systemName = shift;
+ my $targetPath = shift;
+ my $clientName = shift; # optional
+
+ if ($targetPath !~ m[^$tempPath]) {
+ # bail if target-path isn't within temp folder, as we do not dare
+ # executing 'rm -rf' in that case!
+ die _tr("system-error: illegal target-path <%s>!", $targetPath);
+ }
+ return if $option{dryRun};
+
+ slxsystem("rm -rf $targetPath");
+ mkpath $targetPath;
+
+ # first copy default files ...
+ my $defaultConfigPath = "$clientConfigPath/default";
+ vlog(2, "checking $defaultConfigPath for default config...");
+ if (-d $defaultConfigPath) {
+ slxsystem("cp -a $defaultConfigPath/* $targetPath");
+ }
+ # ... now pour system-specific configuration on top (if any) ...
+ my $systemSpecConfigPath = "$clientConfigPath/$systemName/default";
+ vlog(2, "checking $systemSpecConfigPath for system config...");
+ if (folderContainsFiles($systemSpecConfigPath)) {
+ slxsystem("cp -a $systemSpecConfigPath/* $targetPath");
+ }
+ if (defined $clientName) {
+ # ... and finally pour client-specific configuration on top (if any):
+ my $clientSpecConfigPath = "$clientConfigPath/$systemName/$clientName";
+ vlog(2, "checking $clientSpecConfigPath for client config...");
+ if (folderContainsFiles($clientSpecConfigPath)) {
+ slxsystem("cp -a $clientSpecConfigPath/* $targetPath");
+ }
+ }
+ return;
+}
+
+sub createTarOfPath
+{
+ my $buildPath = shift;
+ my $tarName = shift;
+ my $destinationPath = shift;
+
+ my $tarFile = "$destinationPath/$tarName";
+ vlog(1, _tr('creating tar %s', $tarFile));
+ return if $option{dryRun};
+
+ mkpath $destinationPath;
+ my $tarCmd = "cd $buildPath && tar czf $tarFile *";
+ if (slxsystem("$tarCmd") != 0) {
+ die _tr("unable to execute shell-command:\n\t%s \n\t(%s)", $tarCmd, $!);
+ }
+}
+
+sub bootEnvironmentForType
+{
+ my $bootTypeIn = shift || 'pxe';
+
+ my %bootTypeMap = (
+ 'pxe' => 'PXE',
+ 'preboot' => 'Preboot',
+ 'pbs' => 'PBS',
+ );
+ my $bootType = $bootTypeMap{lc($bootTypeIn)}
+ or die _tr(
+ "'%s' is not one of the supported boot-types (pxe,preboot)",
+ $bootTypeIn
+ );
+
+ if (!$bootEnvMap{$bootType}) {
+ my $bootEnv = instantiateClass("OpenSLX::BootEnvironment::$bootType");
+ $bootEnv->initialize( {
+ 'dry-run' => $option{dryRun},
+ } );
+ $bootEnvMap{$bootType} = $bootEnv;
+ }
+
+ return $bootEnvMap{$bootType};
+}
+
+
+
+################################################################################
+###
+################################################################################
+sub writeBootloaderMenus
+{
+ my @infos = @_;
+
+ # iterate over all clients and write a bootloader configuration for each
+ my @clients = $openslxDB->fetchClientByFilter();
+ foreach my $client (@clients) {
+ # fetch all infos relevant to this client (including the bootable
+ # systems)
+ my %systemIDs;
+ @systemIDs{$openslxDB->aggregatedSystemIDsOfClient($client)} = ();
+ my @systemInfos = grep { exists $systemIDs{$_->{id}} } @infos;
+
+ # now write bootloader menu with all bootable systems for this client
+ my $bootEnv = bootEnvironmentForType($client->{attrs}->{boot_type});
+ my $externalID = externalIDForClient($client);
+ my $success = eval {
+ $bootEnv->writeBootloaderMenuFor(
+ $client, $externalID, \@systemInfos
+ );
+ 1;
+ };
+ if (!$success) {
+ print STDERR $@;
+ $bootEnvErrCount++;
+ }
+ }
+ return;
+}
+
+sub writeDhcpConfig
+{
+ vlog(0, _tr("sorry, exporting dhcp data is not implemented yet!"));
+ my $dhcpModule = "OpenSLX::ConfigExport::DHCP::$option{dhcpType}";
+ if (!eval { require $dhcpModule } ) {
+ die _tr("unable to load DHCP-Export backend '%s'! (%s)\n",
+ $dhcpModule, $@);
+ }
+ my $dhcpBackend = $dhcpModule->new();
+ my @clients = $openslxDB->fetchClientByFilter();
+ $dhcpBackend->execute(\@clients);
+ return;
+}
+
+sub writeClientConfigurationsForSystem
+{
+ my $info = shift;
+ my $buildPath = shift;
+ my $attrFile = shift;
+ my $bootType = shift;
+ my $clients = shift || [];
+
+ foreach my $client (@$clients) {
+ next if $client->{name} eq '<<<default>>>';
+ # skip default client, as it doesn't need any config-tgz
+
+ next if ($client->{attrs}->{boot_type} || 'pxe') ne $bootType;
+ # skip clients with non-matching boot type
+
+ my $externalSystemID = $info->{'external-id'};
+ my $externalClientName = externalConfigNameForClient($client);
+ my $clientConfigPath
+ = "$clientConfigPath/$externalSystemID/$externalClientName";
+
+ # merge configurations of groups, default client and system into the
+ # current client (overwriting only values the client does not specify)
+ $openslxDB->mergeDefaultAndGroupAttributesIntoClient($client);
+ mergeAttributes($client, $info);
+
+ # compute a digest value of the merged attributes ...
+ my $clientAttrDigest = digestAttributes($client);
+ vlog(
+ 2,
+ _tr(
+ "attribute-digest for client '%s' is '%s'", $client->{name},
+ $clientAttrDigest
+ )
+ );
+ # ... and export client-specific config only if attributes are different
+ # from system and/or a client-specific config-folder exists:
+ if ($clientAttrDigest ne $info->{'attr-digest'}
+ || -d $clientConfigPath)
+ {
+ vlog(
+ 1,
+ _tr(
+ "creating config-tgz for client %d:%s", $client->{id},
+ $client->{name}
+ )
+ );
+ $clientSystemConfCount++;
+
+ # merge default, system and client configuration folders into
+ # a configuration folder specific to the current client:
+ copyExternalSystemConfig(
+ $externalSystemID, $buildPath, $externalClientName
+ );
+
+ # add plugin configuration and note if the client adds any active
+ # plugin (as opposed to current state)
+ my $activeClientPlugins = writePluginConfigurations(
+ $info, $buildPath, $client->{attrs}
+ );
+ my @additionalActivePlugins = grep {
+ my $activeClientPlugin = $_;
+ ! grep {
+ $activeClientPlugin eq $_
+ } @{$info->{'active-plugins'}};
+ } @$activeClientPlugins;
+ if (@additionalActivePlugins) {
+ push @{$info->{'active-plugins'}}, @additionalActivePlugins;
+ my $additionalActivePluginStr
+ = join ',', @additionalActivePlugins;
+ vlog(0, _tr(
+ "client '%s' activates additional plugins: %s",
+ $client->{name}, $additionalActivePluginStr
+ ));
+ }
+
+ # check attributes against illegal values and write them into
+ # a file if they're ok:
+ my $attrProblems = OpenSLX::AttributeRoster->findProblematicValues(
+ $client->{attrs}, $info->{'vendor-os'}->{name},
+ $info->{'installed-plugins'}
+ );
+ if ($attrProblems) {
+ my $complaint = join "\n", @$attrProblems;
+ $complaint =~ s{^}{client $client->{name}: }gms;
+ warn $complaint;
+ }
+ writeAttributesToFile($client, $attrFile);
+
+ # create a tar containing the external configuration folder
+ # and client attribute file, this time referring to the client
+ # via its external ID (the PXE-style MAC), as the TGZ needs to
+ # be accessed from the client-PC, which doesn't know about the
+ # name it is referred to in the openslx-config-DB:
+ my $externalClientID = externalIDForClient($client);
+ my $bootEnv = bootEnvironmentForType($bootType);
+ switch ($bootType) {
+ case 'pxe' {
+ createTarOfPath(
+ $buildPath, "${externalClientID}.tgz",
+ "$bootEnv->{'target-path'}/client-config/$externalSystemID"
+ );
+ }
+ case 'preboot' {
+ # for preboot types
+ my $cname = $client->{name};
+ createTarOfPath(
+ $buildPath, "${cname}.tgz",
+ "$bootEnv->{'target-path'}/client-config/$externalSystemID"
+ );
+ }
+ case 'pbs' {
+ # for preboot types
+ my $cname = $client->{name};
+ createTarOfPath(
+ $buildPath, "${cname}.tgz",
+ "$bootEnv->{'target-path'}/client-config/$externalSystemID"
+ );
+ }
+ }
+ }
+ }
+ return;
+}
+
+sub writePluginConfigurations
+{
+ my $info = shift || confess 'need to pass in info-hash!';
+ my $buildPath = shift || confess 'need to pass in build-path!';
+ my $attrs = shift || {};
+
+ my $pluginConfPath = "$buildPath/initramfs/plugin-conf";
+
+ my @activePlugins;
+ foreach my $pluginInfo (@{$info->{'installed-plugins'}}) {
+ my $pluginName = $pluginInfo->{plugin_name};
+ vlog(2, _tr("checking configuration of plugin '%s'", $pluginName));
+
+ # skip inactive plugins
+ next unless $attrs->{"${pluginName}::active"};
+ push @activePlugins, $pluginName;
+
+ my $plugin = OpenSLX::OSPlugin::Roster->getPlugin($pluginName);
+ my $requiredPlugins = $plugin->getInfo()->{required} || [];
+ my @missingPlugins
+ = grep {
+ my $required = $_;
+ ! grep {
+ $_->{plugin_name} eq $required
+ } @{$info->{'installed-plugins'}};
+ }
+ @$requiredPlugins;
+ if (@missingPlugins) {
+ die _tr(
+ 'the plugin "%s" requires the following plugins to be installed: "%s"!',
+ $pluginName, join(',', @missingPlugins)
+ );
+ }
+
+ next if $option{dryRun};
+
+ mkpath([ $pluginConfPath ]);
+
+ vlog(2, _tr("writing configuration file for plugin '%s'", $pluginName));
+ # write plugin configuration to a file:
+ my $content;
+ my @pluginAttrs = grep { $_ =~ m{^${pluginName}::} } keys %$attrs;
+ foreach my $attr (sort @pluginAttrs) {
+ my $attrVal = $attrs->{$attr};
+ if (!defined $attrVal) {
+ $attrVal = '';
+ }
+ my $attrName = substr($attr, index($attr, '::')+2);
+ $content .= qq[${pluginName}_$attrName="$attrVal"\n];
+ }
+ my $fileName = "$pluginConfPath/${pluginName}.conf";
+ spitFile($fileName, $content);
+ if ($openslxConfig{'log-level'} > 2) {
+ vlog(0, "--- START OF $fileName ---");
+ vlog(0, $content);
+ vlog(0, "--- END OF $fileName --- ");
+ }
+ }
+ return \@activePlugins;
+}
+
+sub createBootEnvironmentsForSystem
+{
+ my $info = shift;
+ my $buildPath = shift;
+ my $attrFile = shift;
+ my $clients = shift || [];
+
+ my %bootTypes;
+ foreach my $client (@$clients) {
+ my $type = $client->{attrs}->{boot_type} || 'pxe';
+ $bootTypes{$type}++;
+ }
+
+ foreach my $bootType (sort keys %bootTypes) {
+ vlog(0, _tr("creating boot environment (system part) for $bootType"));
+
+ my $bootEnv = bootEnvironmentForType($bootType);
+
+ # only create a default.tgz if required by boot environment
+ if ($bootEnv->requiresDefaultClientConfig()) {
+ writeAttributesToFile($info, $attrFile);
+
+ my $systemPath
+ = "$bootEnv->{'target-path'}/client-config/$info->{'external-id'}";
+ createTarOfPath($buildPath, "default.tgz", $systemPath);
+ }
+ }
+
+ foreach my $bootType (sort keys %bootTypes) {
+ vlog(0, _tr("creating boot environment (client part) for $bootType"));
+
+ my $bootEnv = bootEnvironmentForType($bootType);
+
+ writeClientConfigurationsForSystem(
+ $info, $buildPath, $attrFile, $bootType, $clients
+ );
+
+ # let boot environment copy the kernel and create the initramfs
+ $initramfsCount
+ += $bootEnv->writeFilesRequiredForBooting($info, $buildPath);
+ }
+
+ return;
+}
+
+sub writeSystemConfiguration
+{
+ my $info = shift;
+ my $isTargetSystem = shift;
+
+ $info->{'initramfs-name'} = "initramfs-$info->{id}";
+
+ # if this is not a target system, we shall not write any configurations,
+ # but we simply incorporate inherited attributes
+ if (!$isTargetSystem) {
+ $openslxDB->mergeDefaultAttributesIntoSystem($info);
+ return;
+ }
+
+ # write configuration files for this system
+ my $buildPath = "$tempPath/build";
+ copyExternalSystemConfig(externalIDForSystem($info), $buildPath);
+
+ $openslxDB->mergeDefaultAttributesIntoSystem(
+ $info, $info->{'installed-plugins'}
+ );
+ $info->{'attr-digest'} = digestAttributes($info);
+ vlog(
+ 2,
+ _tr(
+ "attribute-digest for system '%s' is '%s'", $info->{name},
+ $info->{'attr-digest'}
+ )
+ );
+
+ # check if uclibc-rootfs in corresponding vendor-OS matches the current
+ # version and add a warning if it does not:
+ my $uclibcVersionPath
+ = "$openslxConfig{'private-path'}/stage1/$info->{'vendor-os'}->{name}/opt/openslx/uclib-rootfs.version";
+ chomp(my $uclibcVersion
+ = slurpFile($uclibcVersionPath, { failIfMissing => 0 } ));
+ chomp(my $currVersion = qx{slxversion});
+ if ($currVersion !~ m{M$} && $uclibcVersion ne $currVersion) {
+ warn _tr(
+ "uclibc-rootfs for system '%s' may not be up-to-date - consider updating the vendor-OS!",
+ $info->{name}, $uclibcVersion, $currVersion
+ );
+ }
+
+ my $attrProblems = OpenSLX::AttributeRoster->findProblematicValues(
+ $info->{attrs}, $info->{'vendor-os'}->{name},
+ $info->{'installed-plugins'}
+ );
+ if ($attrProblems) {
+ my $complaint = join "\n", @$attrProblems;
+ $complaint =~ s{^}{system $info->{name}: }gms;
+ warn $complaint;
+ }
+
+ my $activePlugins
+ = writePluginConfigurations($info, $buildPath, $info->{attrs});
+ $info->{'active-plugins'} = $activePlugins;
+ my $activePluginStr
+ = @$activePlugins ? join ',', @$activePlugins : '<none>';
+ vlog(0, _tr("active plugins: %s", $activePluginStr));
+
+ # create all required (pre-)boot-environments (PXE, CD, ...)
+ my $attrFile = "$buildPath/initramfs/machine-setup";
+ my @clientIDs = $openslxDB->aggregatedClientIDsOfSystem($info);
+ my @clients = $openslxDB->fetchClientByID(\@clientIDs);
+ createBootEnvironmentsForSystem($info, $buildPath, $attrFile, \@clients);
+
+ slxsystem("rm -rf $buildPath") unless $option{dryRun};
+
+ $systemConfCount++;
+
+ return;
+}
+
+sub writeConfigurations
+{
+ $initramfsCount = $systemConfCount = $systemErrCount
+ = $clientSystemConfCount = 0;
+ my @infos;
+ foreach my $system (@demuxableSystems) {
+ my $isTargetSystem
+ = first { $_->{name} eq $system->{name} } @targetSystems;
+ if ($isTargetSystem) {
+ vlog(
+ 0,
+ _tr("\ndemuxing system %d : %s", $system->{id}, $system->{name})
+ );
+ }
+ else {
+ vlog(
+ 0,
+ _tr(
+ "\nlinking demuxed system %d : %s into bootloader menu",
+ $system->{id}, $system->{name}
+ )
+ );
+ }
+
+ my $success = eval {
+ my $info = $openslxDB->aggregatedSystemFileInfoFor($system);
+ $info->{'external-id'} = externalIDForSystem($system);
+
+ writeSystemConfiguration($info, $isTargetSystem);
+
+ push @infos, $info;
+ 1;
+ };
+ if (!$success) {
+ print STDERR $@;
+ $systemErrCount++;
+ }
+ }
+ my $imageBaseDir = "$openslxConfig{'public-path'}/images";
+ rmtree($imageBaseDir) unless $option{dryRun};
+ writeBootloaderMenus(@infos);
+ if (defined $option{dhcpType}) {
+ writeDhcpConfig();
+ }
+ return;
+}
+
+=head1 NAME
+
+slxconfig-demuxer - OpenSLX configuration demultiplexer
+
+=head1 SYNOPSIS
+
+slxconfig-demuxer [options] [<system-name> ...]
+
+=head3 Script Options
+
+ --dry-run avoids writing anything, for testing
+
+=head3 General Options
+
+ --help brief help message
+ --man full documentation
+ --version show version
+
+=head1 DESCRIPTION
+
+B<slxconfig-demuxer> will read information about all systems, clients and
+groups from the OpenSLX configuration database, mix & match the individual
+configurational attributes and then demultiplex the resulting information
+to a set of configuration files. These files are used by any OpenSLX-client
+during boot to find out which systems to offer for booting.
+
+If you invoke the script with one or more system names, only these systems
+will be demuxed. All other systems (which are expected to have been demuxed
+before) will just be linked into the bootloader menu.
+
+The resulting files will be put into the OpenSLX-tftpboot-path.
+
+=head2 FILE CREATION
+
+The following set of files will be created:
+
+=over 8
+
+=item B<Basic PXE Setup>
+
+The basic PXE files (F<menu.c32>, F<pxelinux.0>) will be copied into
+F<$SLX_PUBLIC_PATH/tftpboot> to make them available to any PXE-client via tftp.
+
+=item B<PXE Client Configurations>
+
+For each client, a PXE configuration file will be generated and written to
+F<$SLX_PUBLIC_PATH/tftpboot/pxelinux.cfg/01-<MAC-of-client>>. This file will
+contain information about the systems this client shall offer for booting.
+For each of these systems, the kernel cmdline options required for that
+particular system setup is specified (via PXE's APPEND option).
+
+Any client that is not known to OpenSLX (so it will not have a specific
+configuration file) will use the configuration from the default client
+(appropriately named 'default').
+
+=item B<System Kernels and Initialram-Filesystems>
+
+For each bootable system, that system's kernel will be copied to
+F<$SLX_PUBLIC_PATH/tftpboot/<vendor-os-name>/kernel and an OpenSLX-specific initramfs
+required for booting that particular system is generated (by means of
+slxmkramfs) and put into F<$SLX_PUBLIC_PATH/tftpboot/<vendor-os-name>/initramfs.
+
+These two files (kernel & initramfs) will be referenced by the PXE client
+configuration of all clients that offer this specific system for booting.
+
+=item B<OpenSLX Client Configurations>
+
+For each system, an OpenSLX configuration archive will be generated and written
+to F<$SLX_PUBLIC_PATH/tftpboot/client-config/<system-name>/default. Furthermore,
+every client of that system whose attributes differ from the system's default
+will get its own configuration archive generated here, too (e.g.
+F<$SLX_PUBLIC_PATH/tftpboot/client-config/<system-name>/01-<MAC-of-client>.tgz>).
+
+Each of these archives will contain the file F<initramfs/machine-setup>,
+specifying all the attributes of that particular system and/or client
+(e.g. whether or not it should start the X-server).
+
+Furthermore, each system-specific archive may contain additional system files
+that are required for that system (e.g. a special PAM-module required for LDAP
+authentication). These files are copied from F<$SLX_PRIVATE_PATH/config/default>
+and F<$SLX_PROVATE_PATH/config/<system-name>>.
+
+On top of that, each client may have its own set of system files, too (e.g.
+some config files required to install a special kind of hardware available only
+on that client). These files are copied from
+F<< $SLX_PROVATE_PATH/config/<system-name>/01-<MAC-of-client> >>.
+
+=back
+
+=head2 MIXING & MATCHING (THE DEMUXER)
+
+In the OpenSLX configuration database, each system, group and client may have
+several configurational attributes set to a specific value that will cause
+a client booting that system to behave in a certain way. The mixing of all
+these different attributes into one set that is relevant for a specific client
+booting one specific system is one important task of the slxconfig-demuxer.
+
+As an example, let's assume one system setup that is configured to boot directly
+into a special application that demands a rather low screen-resolution of
+1024x768 pixels, as otherwise the text would be unreadable due to very small
+fonts being used by that app. In order to achieve this, the administrator can
+set the I<hw_monitor>-attribute of the B<system> to '1024x768'.
+Let's say one of the clients, however, is connected to a very old monitor that
+has problems with this resolution and only supports 800x600 pixels. In that
+case, the administrator can set the I<hw_monitor>-attribute of that B<client> to
+'800x600'. The mixing & matching process would make sure that this specific
+client would run that system with a resolution of 800x600, while all other
+clients would run that system in 1024x768.
+
+So the slxconfig-demuxer demultiplexes the individual configurational attributes
+into a concrete set of configuration settings for specific clients and their
+offered systems, making sure that each client/system combination uses the
+appropriate settings.
+
+=head1 OPTIONS
+
+=head3 Script Options
+
+=over 8
+
+=item B<< --dry-run >>
+
+Runs the script but avoids writing anything. This is useful for testing, as
+you can learn from the logging output what would have been done.
+
+=back
+
+=head3 General 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
+
+=head1 SEE ALSO
+
+slxsettings, slxos-setup, slxos-export, slxconfig
+
+=head1 GENERAL OPENSLX OPTIONS
+
+Being a part of OpenSLX, this script supports several other options
+which can be used to overrule the OpenSLX settings:
+
+ --db-name=<string> name of database
+ --db-spec=<string> full DBI-specification of database
+ --db-type=<string> type of database to connect to
+ --locale=<string> locale to use for translations
+ --log-level=<int> level of logging verbosity (0-3)
+ --logfile=<string> file to write logging output to
+ --private-path=<string> path to private data
+ --public-path=<string> path to public (client-accesible) data
+ --temp-path=<string> path to temporary data
+
+Please refer to the C<slxsettings>-manpage for a more detailed description
+of these options.
+
+=cut
diff --git a/src/config-db/t/01-basics.t b/src/config-db/t/01-basics.t
new file mode 100644
index 00000000..1fb7083b
--- /dev/null
+++ b/src/config-db/t/01-basics.t
@@ -0,0 +1,23 @@
+use Test::More qw(no_plan);
+
+use lib '/opt/openslx/lib';
+
+# basic stuff
+use_ok(OpenSLX::ConfigDB);
+
+use strict;
+use warnings;
+
+# connecting and disconnecting
+ok(my $configDB = OpenSLX::ConfigDB->new, 'can create object');
+isa_ok($configDB, 'OpenSLX::ConfigDB');
+
+{
+ # create a second object - should work and yield different objects
+ ok(my $configDB2 = OpenSLX::ConfigDB->new, 'can create another object');
+ cmp_ok($configDB, 'ne', $configDB2, 'should have two different objects now');
+}
+
+ok($configDB->connect(), 'connecting');
+ok($configDB->disconnect(), 'disconnecting');
+
diff --git a/src/config-db/t/10-vendor-os.t b/src/config-db/t/10-vendor-os.t
new file mode 100644
index 00000000..a71ee4ac
--- /dev/null
+++ b/src/config-db/t/10-vendor-os.t
@@ -0,0 +1,258 @@
+use Test::More qw(no_plan);
+
+use strict;
+use warnings;
+
+use lib '/opt/openslx/lib';
+
+# basic init
+use OpenSLX::ConfigDB;
+
+my $configDB = OpenSLX::ConfigDB->new;
+$configDB->connect();
+
+is(
+ my $vendorOS = $configDB->fetchVendorOSByFilter, undef,
+ 'no vendor-OS yet (scalar context)'
+);
+
+my $wrongVendorOS = {
+ 'comment' => 'test',
+};
+ok(
+ ! eval { my $vendorOSID = $configDB->addVendorOS($wrongVendorOS); },
+ 'trying to insert an unnamed vendor-OS should fail'
+);
+
+is(
+ my @vendorOSes = $configDB->fetchVendorOSByFilter, 0,
+ 'no vendor-OS yet (array context)'
+);
+
+my $inVendorOS1 = {
+ 'name' => 'vos-1',
+ 'comment' => '',
+};
+is(
+ my $vendorOS1ID = $configDB->addVendorOS($inVendorOS1), 1,
+ 'first vendor-OS has ID 1'
+);
+
+my $inVendorOS2 = {
+ 'name' => 'vos-2.0',
+ 'comment' => 'batch 2',
+};
+my $inVendorOS3 = {
+ 'name' => 'vos-3.0',
+ 'comment' => 'batch 2',
+ 'clone_source' => 'kiwi::test-vos',
+};
+ok(
+ my ($vendorOS2ID, $vendorOS3ID) = $configDB->addVendorOS([
+ $inVendorOS2, $inVendorOS3
+ ]),
+ 'add two more vendor-OSes'
+);
+is($vendorOS2ID, 2, 'vendor-OS 2 should have ID=2');
+is($vendorOS3ID, 3, 'vendor-OS 3 should have ID=3');
+
+# fetch vendor-OS 3 by id and check all values
+ok(my $vendorOS3 = $configDB->fetchVendorOSByID(3), 'fetch vendor-OS 3');
+is($vendorOS3->{id}, 3, 'vendor-OS 3 - id');
+is($vendorOS3->{name}, 'vos-3.0', 'vendor-OS 3 - name');
+is($vendorOS3->{comment}, 'batch 2', 'vendor-OS 3 - comment');
+is($vendorOS3->{clone_source}, 'kiwi::test-vos', 'vendor-OS 3 - clone_source');
+
+# fetch vendor-OS 2 by a filter on id and check all values
+ok(
+ my $vendorOS2 = $configDB->fetchVendorOSByFilter({ id => 2 }),
+ 'fetch vendor-OS 2 by filter on id'
+);
+is($vendorOS2->{id}, 2, 'vendor-OS 2 - id');
+is($vendorOS2->{name}, 'vos-2.0', 'vendor-OS 2 - name');
+is($vendorOS2->{comment}, 'batch 2', 'vendor-OS 2 - comment');
+is($vendorOS2->{clone_source}, undef, 'vendor-OS 2 - clone_source');
+
+# fetch vendor-OS 1 by filter on name and check all values
+ok(
+ my $vendorOS1 = $configDB->fetchVendorOSByFilter({ name => 'vos-1' }),
+ 'fetch vendor-OS 1 by filter on name'
+);
+is($vendorOS1->{id}, 1, 'vendor-OS 1 - id');
+is($vendorOS1->{name}, 'vos-1', 'vendor-OS 1 - name');
+is($vendorOS1->{comment}, '', 'vendor-OS 1 - comment');
+is($vendorOS1->{clone_source}, undef, 'vendor-OS 1 - clone_source');
+
+# fetch vendor-OSes 3 & 1 by id
+ok(
+ my @vendorOSes3And1
+ = $configDB->fetchVendorOSByID([3, 1]),
+ 'fetch vendor-OSes 3 & 1 by id'
+);
+is(@vendorOSes3And1, 2, 'should have got 2 vendor-OSes');
+# now sort by ID and check if we have really got 3 and 1
+@vendorOSes3And1 = sort { $a->{id} cmp $b->{id} } @vendorOSes3And1;
+is($vendorOSes3And1[0]->{id}, 1, 'first id should be 1');
+is($vendorOSes3And1[1]->{id}, 3, 'second id should be 3');
+
+# fetching vendor-OSes by id without giving any should yield undef
+is(
+ $configDB->fetchVendorOSByID(), undef,
+ 'fetch vendor-OSes by id without giving any'
+);
+
+# fetching vendor-OSes by filter without giving any should yield all of them
+ok(
+ @vendorOSes = $configDB->fetchVendorOSByFilter(),
+ 'fetch vendor-OSes by filter without giving any'
+);
+is(@vendorOSes, 3, 'should have got all three vendor-OSes');
+
+# fetch vendor-OSes 2 & 3 by filter on comment
+ok(
+ my @vendorOSes2And3
+ = $configDB->fetchVendorOSByFilter({ comment => 'batch 2' }),
+ 'fetch vendor-OSes 2 & 3 by filter on comment'
+);
+is(@vendorOSes2And3, 2, 'should have got 2 vendor-OSes');
+# now sort by ID and check if we have really got 2 and 3
+@vendorOSes2And3 = sort { $a->{id} cmp $b->{id} } @vendorOSes2And3;
+is($vendorOSes2And3[0]->{id}, 2, 'first id should be 2');
+is($vendorOSes2And3[1]->{id}, 3, 'second id should be 3');
+
+# try to fetch with multi-column filter
+ok(
+ ($vendorOS2, $vendorOS3)
+ = $configDB->fetchVendorOSByFilter({ comment => 'batch 2', id => 2 }),
+ 'fetching vendor-OS with comment="batch 2" and id=2 should work'
+);
+is($vendorOS2->{name}, 'vos-2.0', 'should have got vos-2.0');
+is($vendorOS3, undef, 'should not get vos-3.0');
+
+# try to fetch multiple occurrences of the same vendor-OS, combined with
+# some unknown IDs
+ok(
+ my @vendorOSes1And3
+ = $configDB->fetchVendorOSByID([ 1, 21, 4-1, 1, 0, 1, 1 ]),
+ 'fetch a complex set of vendor-OSes by ID'
+);
+is(@vendorOSes1And3, 2, 'should have got 2 vendor-OSes');
+# now sort by ID and check if we have really got 1 and 3
+@vendorOSes1And3 = sort { $a->{id} cmp $b->{id} } @vendorOSes1And3;
+is($vendorOSes1And3[0]->{id}, 1, 'first id should be 1');
+is($vendorOSes1And3[1]->{id}, 3, 'second id should be 3');
+
+# try to fetch a couple of non-existing vendor-OSes by id
+is(
+ $configDB->fetchVendorOSByID(-1), undef,
+ 'vendor-OS with id -1 should not exist'
+);
+is(
+ $configDB->fetchVendorOSByID(0), undef,
+ 'vendor-OS with id 0 should not exist'
+);
+is(
+ $configDB->fetchVendorOSByID(1 << 31 + 1000), undef,
+ 'trying to fetch another unknown vendor-OS'
+);
+
+# try to fetch a couple of non-existing vendor-OSes by filter
+is(
+ $configDB->fetchVendorOSByFilter({ id => 0 }), undef,
+ 'fetching vendor-OS with id=0 by filter should fail'
+);
+is(
+ $configDB->fetchVendorOSByFilter({ name => 'vos-1.x' }), undef,
+ 'fetching vendor-OS with name="vos-1.x" should fail'
+);
+is(
+ $configDB->fetchVendorOSByFilter({ comment => 'batch 2', id => 1 }), undef,
+ 'fetching vendor-OS with comment="batch 2" and id=1 should fail'
+);
+
+# rename vendor-OS 1 and then fetch it by its new name
+ok($configDB->changeVendorOS(1, { name => q{VOS-'1'} }), 'changing vendor-OS 1');
+ok(
+ $vendorOS1 = $configDB->fetchVendorOSByFilter({ name => q{VOS-'1'} }),
+ 'fetching renamed vendor-OS 1'
+);
+is($vendorOS1->{id}, 1, 'really got vendor-OS number 1');
+is($vendorOS1->{name}, q{VOS-'1'}, q{really got vendor-OS named "VOS-'1'"});
+
+# changing nothing at all should succeed
+ok($configDB->changeVendorOS(1), 'changing nothing at all in vendor-OS 1');
+
+# changing a non-existing column should fail
+ok(
+ ! eval { $configDB->changeVendorOS(1, { xname => "xx" }) },
+ 'changing unknown colum should fail'
+);
+
+ok(! $configDB->changeVendorOS(1, { id => 23 }), 'changing id should fail');
+
+# test adding & removing of installed plugins
+is(
+ my @plugins = $configDB->fetchInstalledPlugins(3),
+ 0, 'there should be no installed plugins'
+);
+ok($configDB->addInstalledPlugin(3, 'Example'), 'adding installed plugin');
+is(
+ @plugins = $configDB->fetchInstalledPlugins(3),
+ 1,
+ 'should have 1 installed plugin'
+);
+is(
+ $configDB->addInstalledPlugin(3, 'Example'), 1,
+ 'adding plugin again should work (but do not harm, just update the attrs)'
+);
+is(
+ @plugins = $configDB->fetchInstalledPlugins(3),
+ 1,
+ 'should still have 1 installed plugin'
+);
+is($plugins[0]->{plugin_name}, 'Example', 'should have got plugin "Example"');
+ok($configDB->addInstalledPlugin(3, 'Test'), 'adding a second plugin');
+is(
+ @plugins = $configDB->fetchInstalledPlugins(3),
+ 2,
+ 'should have 2 installed plugin'
+);
+ok(
+ !$configDB->removeInstalledPlugin(3, 'xxx'),
+ 'removing unknown plugin should fail'
+);
+ok(
+ @plugins = $configDB->fetchInstalledPlugins(3, 'Example'),
+ 'fetching specific plugin'
+);
+is($plugins[0]->{plugin_name}, 'Example', 'should have got plugin "Example"');
+ok(
+ @plugins = $configDB->fetchInstalledPlugins(3, 'Test'),
+ 'fetching another specific plugin'
+);
+is($plugins[0]->{plugin_name}, 'Test', 'should have got plugin "Test"');
+is(
+ @plugins = $configDB->fetchInstalledPlugins(3, 'xxx'), 0,
+ 'fetching unknown specific plugin'
+);
+ok($configDB->removeInstalledPlugin(3, 'Example'), 'removing installed plugin');
+is(
+ @plugins = $configDB->fetchInstalledPlugins(3),
+ 1,
+ 'should have 1 installed plugin'
+);
+ok($configDB->removeInstalledPlugin(3, 'Test'), 'removing second plugin');
+is(
+ @plugins = $configDB->fetchInstalledPlugins(3),
+ 0,
+ 'should have no installed plugins'
+);
+
+# now remove a vendor-OS and check if that worked
+ok($configDB->removeVendorOS(3), 'removing vendor-OS 3 should be ok');
+is($configDB->fetchVendorOSByID(3, 'id'), undef, 'vendor-OS 3 should be gone');
+is($configDB->fetchVendorOSByID(1)->{id}, 1, 'vendor-OS 1 should still exist');
+is($configDB->fetchVendorOSByID(2)->{id}, 2, 'vendor-OS 2 should still exist');
+
+$configDB->disconnect();
+
diff --git a/src/config-db/t/11-export.t b/src/config-db/t/11-export.t
new file mode 100644
index 00000000..3dd0ae6c
--- /dev/null
+++ b/src/config-db/t/11-export.t
@@ -0,0 +1,247 @@
+use Test::More qw(no_plan);
+
+use strict;
+use warnings;
+
+use lib '/opt/openslx/lib';
+
+# basic init
+use OpenSLX::ConfigDB;
+
+my $configDB = OpenSLX::ConfigDB->new;
+$configDB->connect();
+
+is(
+ my $export = $configDB->fetchExportByFilter, undef,
+ 'no export yet (scalar context)'
+);
+
+foreach my $requiredCol (qw(name vendor_os_id type)) {
+ my $wrongExport = {
+ 'name' => 'name',
+ 'vendor_os_id' => 1,
+ 'type ' => 'nfs',
+ 'comment' => 'has column missing',
+ };
+ delete $wrongExport->{$requiredCol};
+ ok(
+ ! eval { my $exportID = $configDB->addExport($wrongExport); },
+ "inserting an export without '$requiredCol' column should fail"
+ );
+}
+
+is(
+ my @exports = $configDB->fetchExportByFilter, 0,
+ 'no export yet (array context)'
+);
+
+is(
+ my @exportIDs = $configDB->fetchExportIDsOfVendorOS(1), 0,
+ 'vendor-OS 1 has no export IDs yet'
+);
+
+is(
+ @exportIDs = $configDB->fetchExportIDsOfVendorOS(2), 0,
+ 'vendor-OS 2 has no export IDs yet'
+);
+
+my $inExport1 = {
+ 'name' => 'exp-1',
+ 'type' => 'nfs',
+ 'vendor_os_id' => 1,
+ 'comment' => '',
+};
+is(
+ my $export1ID = $configDB->addExport($inExport1), 1,
+ 'first export has ID 1'
+);
+
+my $inExport2 = {
+ 'name' => 'exp-2.0',
+ 'type' => 'sqfs-nbd',
+ 'vendor_os_id' => 1,
+ 'comment' => undef,
+};
+my $fullExport = {
+ 'name' => 'exp-nr-3',
+ 'type' => 'sqfs-nbd',
+ 'vendor_os_id' => 2,
+ 'comment' => 'nuff said',
+ 'server_ip' => '192.168.212.243',
+ 'port' => '65432',
+ 'uri' => 'sqfs-nbd://somehost/somepath?param=val&yes=1',
+};
+ok(
+ my ($export2ID, $export3ID) = $configDB->addExport([
+ $inExport2, $fullExport
+ ]),
+ 'add two more exports'
+);
+is($export2ID, 2, 'export 2 should have ID=2');
+is($export3ID, 3, 'export 3 should have ID=3');
+
+# fetch export 3 by id and check all values
+ok(my $export3 = $configDB->fetchExportByID(3), 'fetch export 3');
+is($export3->{id}, 3, 'export 3 - id');
+is($export3->{name}, 'exp-nr-3', 'export 3 - name');
+is($export3->{type}, 'sqfs-nbd', 'export 3 - type');
+is($export3->{vendor_os_id}, '2', 'export 3 - vendor_os_id');
+is($export3->{comment}, 'nuff said', 'export 3 - comment');
+is($export3->{server_ip}, '192.168.212.243', 'export 3 - server_ip');
+is($export3->{port}, '65432', 'export 3 - port');
+is(
+ $export3->{uri},
+ 'sqfs-nbd://somehost/somepath?param=val&yes=1',
+ 'export 3 - uri'
+);
+
+# fetch export 2 by a filter on id and check all values
+ok(
+ my $export2 = $configDB->fetchExportByFilter({ id => 2 }),
+ 'fetch export 2 by filter on id'
+);
+is($export2->{id}, 2, 'export 2 - id');
+is($export2->{name}, 'exp-2.0', 'export 2 - name');
+is($export2->{type}, 'sqfs-nbd', 'export 2 - type');
+is($export2->{vendor_os_id}, '1', 'export 2 - vendor_os_id');
+is($export2->{comment}, undef, 'export 2 - comment');
+
+# fetch export 1 by filter on name and check all values
+ok(
+ my $export1 = $configDB->fetchExportByFilter({ name => 'exp-1' }),
+ 'fetch export 1 by filter on name'
+);
+is($export1->{id}, 1, 'export 1 - id');
+is($export1->{name}, 'exp-1', 'export 1 - name');
+is($export1->{vendor_os_id}, '1', 'export 1 - vendor_os_id');
+is($export1->{type}, 'nfs', 'export 1 - type');
+is($export1->{comment}, '', 'export 1 - comment');
+is($export1->{port}, undef, 'export 1 - port');
+is($export1->{server_ip}, undef, 'export 1 - server_ip');
+is($export1->{uri}, undef, 'export 1 - uri');
+
+is(
+ @exportIDs = sort( { $a <=> $b } $configDB->fetchExportIDsOfVendorOS(1)),
+ 2, 'vendor-OS 1 has two export IDs'
+);
+is($exportIDs[0], 1, 'first export ID of vendor-OS 1 (1)');
+is($exportIDs[1], 2, 'second export ID of vendor-OS 1 (2)');
+
+is(
+ @exportIDs = sort( { $a <=> $b } $configDB->fetchExportIDsOfVendorOS(2)),
+ 1, 'vendor-OS 2 has one export IDs'
+);
+is($exportIDs[0], 3, 'first export ID of vendor-OS 2 (3)');
+
+# fetch exports 3 & 1 by id
+ok(
+ my @exports3And1 = $configDB->fetchExportByID([3, 1]),
+ 'fetch exports 3 & 1 by id'
+);
+is(@exports3And1, 2, 'should have got 2 exports');
+# now sort by ID and check if we have really got 3 and 1
+@exports3And1 = sort { $a->{id} cmp $b->{id} } @exports3And1;
+is($exports3And1[0]->{id}, 1, 'first id should be 1');
+is($exports3And1[1]->{id}, 3, 'second id should be 3');
+
+# fetching exports by id without giving any should yield undef
+is(
+ $configDB->fetchExportByID(), undef,
+ 'fetch exports by id without giving any'
+);
+
+# fetching exports by filter without giving any should yield all of them
+ok(
+ @exports = $configDB->fetchExportByFilter(),
+ 'fetch exports by filter without giving any'
+);
+is(@exports, 3, 'should have got all three exports');
+
+# fetch exports 1 & 2 by filter on vendor_os_id
+ok(
+ my @exports1And2 = $configDB->fetchExportByFilter({ vendor_os_id => '1' }),
+ 'fetch exports 1 & 2 by filter on vendor_os_id'
+);
+is(@exports1And2, 2, 'should have got 2 exports');
+# now sort by ID and check if we have really got 1 and 2
+@exports1And2 = sort { $a->{id} cmp $b->{id} } @exports1And2;
+is($exports1And2[0]->{id}, 1, 'first id should be 1');
+is($exports1And2[1]->{id}, 2, 'second id should be 2');
+
+# try to fetch with multi-column filter
+ok(
+ ($export2, $export3)
+ = $configDB->fetchExportByFilter({ vendor_os_id => '1', id => 2 }),
+ 'fetching export with vendor_os_id=1 and id=2 should work'
+);
+is($export2->{name}, 'exp-2.0', 'should have got exp-2.0');
+is($export3, undef, 'should not get exp-nr-3');
+
+# try to fetch multiple occurrences of the same export, combined with
+# some unknown IDs
+ok(
+ my @exports1And3 = $configDB->fetchExportByID([ 1, 21, 4-1, 1, 0, 1, 1 ]),
+ 'fetch a complex set of exports by ID'
+);
+is(@exports1And3, 2, 'should have got 2 exports');
+# now sort by ID and check if we have really got 1 and 3
+@exports1And3 = sort { $a->{id} cmp $b->{id} } @exports1And3;
+is($exports1And3[0]->{id}, 1, 'first id should be 1');
+is($exports1And3[1]->{id}, 3, 'second id should be 3');
+
+# try to fetch a couple of non-existing exports by id
+is(
+ $configDB->fetchExportByID(-1), undef,
+ 'export with id -1 should not exist'
+);
+is(
+ $configDB->fetchExportByID(0), undef,
+ 'export with id 0 should not exist'
+);
+is(
+ $configDB->fetchExportByID(1 << 31 + 1000), undef,
+ 'trying to fetch another unknown export'
+);
+
+# try to fetch a couple of non-existing exports by filter
+is(
+ $configDB->fetchExportByFilter({ id => 0 }), undef,
+ 'fetching export with id=0 by filter should fail'
+);
+is(
+ $configDB->fetchExportByFilter({ name => 'exp-1.x' }), undef,
+ 'fetching export with name="exp-1.x" should fail'
+);
+is(
+ $configDB->fetchExportByFilter({ vendor_os_id => '2', id => 1 }), undef,
+ 'fetching export with vendor_os_id=2 and id=1 should fail'
+);
+
+# rename export 1 and then fetch it by its new name
+ok($configDB->changeExport(1, { name => q{EXP-'1'} }), 'changing export 1');
+ok(
+ $export1 = $configDB->fetchExportByFilter({ name => q{EXP-'1'} }),
+ 'fetching renamed export 1'
+);
+is($export1->{id}, 1, 'really got export number 1');
+is($export1->{name}, q{EXP-'1'}, q{really got export named "EXP-'1'"});
+
+# changing nothing at all should succeed
+ok($configDB->changeExport(1), 'changing nothing at all in export 1');
+
+# changing a non-existing column should fail
+ok(
+ ! eval { $configDB->changeExport(1, { xname => "xx" }) },
+ 'changing unknown colum should fail'
+);
+
+ok(! $configDB->changeExport(1, { id => 23 }), 'changing id should fail');
+
+# now remove an export and check if that worked
+ok($configDB->removeExport(2), 'removing export 2 should be ok');
+is($configDB->fetchExportByID(2, 'id'), undef, 'export 2 should be gone');
+is($configDB->fetchExportByID(1)->{id}, 1, 'export 1 should still exist');
+is($configDB->fetchExportByID(3)->{id}, 3, 'export 3 should still exist');
+
+$configDB->disconnect();
+
diff --git a/src/config-db/t/12-system.t b/src/config-db/t/12-system.t
new file mode 100644
index 00000000..0c3a3042
--- /dev/null
+++ b/src/config-db/t/12-system.t
@@ -0,0 +1,360 @@
+use Test::More qw(no_plan);
+
+use strict;
+use warnings;
+
+use lib '/opt/openslx/lib';
+
+# basic init
+use OpenSLX::ConfigDB;
+
+my $configDB = OpenSLX::ConfigDB->new;
+$configDB->connect();
+
+ok(
+ my $system = $configDB->fetchSystemByFilter,
+ 'one system [default] should exist (scalar context)'
+);
+
+foreach my $requiredCol (qw(name export_id)) {
+ my $wrongSystem = {
+ 'name' => 'name',
+ 'export_id' => 1,
+ 'comment' => 'has column missing',
+ };
+ delete $wrongSystem->{$requiredCol};
+ ok(
+ ! eval { my $systemID = $configDB->addSystem($wrongSystem); },
+ "inserting a system without '$requiredCol' column should fail"
+ );
+}
+
+is(
+ my @systems = $configDB->fetchSystemByFilter, 1,
+ 'still just one system [default] should exist (array context)'
+);
+
+my $inSystem1 = {
+ 'name' => 'sys-1',
+ 'export_id' => 1,
+ 'comment' => '',
+ 'attrs' => {
+ 'ramfs_fsmods' => 'squashfs',
+ 'ramfs_nicmods' => 'e1000 forcedeth r8169',
+ 'start_sshd' => 'yes',
+ },
+};
+is(
+ my $system1ID = $configDB->addSystem($inSystem1), 1,
+ 'first system has ID 1'
+);
+
+my $inSystem2 = {
+ 'name' => 'sys-2.0',
+ 'kernel' => 'vmlinuz',
+ 'export_id' => 1,
+ 'comment' => undef,
+};
+my $fullSystem = {
+ 'name' => 'sys-nr-3',
+ 'kernel' => 'vmlinuz-2.6.22.13-0.3-default',
+ 'export_id' => 3,
+ 'comment' => 'nuff said',
+ 'label' => 'BlingBling System - really kuul!',
+ 'attrs' => {
+ 'automnt_dir' => 'a',
+ 'automnt_src' => 'b',
+ 'country' => 'c',
+ 'hidden' => '1',
+ 'kernel_params' => 'debug=3 console=ttyS1',
+ 'ramfs_fsmods' => 'l',
+ 'ramfs_miscmods' => 'm',
+ 'ramfs_nicmods' => 'n',
+ 'scratch' => 'q',
+ 'start_atd' => 't',
+ 'start_cron' => 'u',
+ 'start_dreshal' => 'v',
+ 'start_ntp' => 'w',
+ 'start_nfsv4' => 'x',
+ 'start_snmp' => 'A',
+ 'start_sshd' => 'B',
+ 'timezone' => 'G',
+ },
+};
+ok(
+ my ($system2ID, $system3ID) = $configDB->addSystem([
+ $inSystem2, $fullSystem
+ ]),
+ 'add two more systems'
+);
+is($system2ID, 2, 'system 2 should have ID=2');
+is($system3ID, 3, 'system 3 should have ID=3');
+
+# fetch system 3 by id and check all values
+ok(my $system3 = $configDB->fetchSystemByID(3), 'fetch system 3');
+is($system3->{id}, '3', 'system 3 - id');
+is($system3->{name}, 'sys-nr-3', 'system 3 - name');
+is($system3->{kernel}, 'vmlinuz-2.6.22.13-0.3-default', 'system 3 - type');
+is($system3->{export_id}, '3', 'system 3 - export_id');
+is($system3->{comment}, 'nuff said', 'system 3 - comment');
+is($system3->{label}, 'BlingBling System - really kuul!', 'system 3 - label');
+is($system3->{attrs}->{automnt_dir}, 'a', 'system 3 - attr automnt_dir');
+is($system3->{attrs}->{automnt_src}, 'b', 'system 3 - attr automnt_src');
+is($system3->{attrs}->{country}, 'c', 'system 3 - attr country');
+is($system3->{attrs}->{hidden}, '1', 'system 3 - attr hidden');
+is($system3->{attrs}->{kernel_params}, 'debug=3 console=ttyS1', 'system 3 - attr kernel_params');
+is($system3->{attrs}->{ramfs_fsmods}, 'l', 'system 3 - attr ramfs_fsmods');
+is($system3->{attrs}->{ramfs_miscmods}, 'm', 'system 3 - attr ramfs_miscmods');
+is($system3->{attrs}->{ramfs_nicmods}, 'n', 'system 3 - attr ramfs_nicmods');
+is($system3->{attrs}->{scratch}, 'q', 'system 3 - attr scratch');
+is($system3->{attrs}->{start_atd}, 't', 'system 3 - attr start_atd');
+is($system3->{attrs}->{start_cron}, 'u', 'system 3 - attr start_cron');
+is($system3->{attrs}->{start_dreshal}, 'v', 'system 3 - attr start_dreshal');
+is($system3->{attrs}->{start_ntp}, 'w', 'system 3 - attr start_ftp');
+is($system3->{attrs}->{start_nfsv4}, 'x', 'system 3 - attr start_nfsv4');
+is($system3->{attrs}->{start_snmp}, 'A', 'system 3 - attr start_snmp');
+is($system3->{attrs}->{start_sshd}, 'B', 'system 3 - attr start_sshd');
+is($system3->{attrs}->{timezone}, 'G', 'system 3 - attr timezone');
+is(keys %{$system3->{attrs}}, 17, 'system 3 - attribute count');
+
+# fetch system 2 by a filter on id and check all values
+ok(
+ my $system2 = $configDB->fetchSystemByFilter({ id => 2 }),
+ 'fetch system 2 by filter on id'
+);
+is($system2->{id}, 2, 'system 2 - id');
+is($system2->{name}, 'sys-2.0', 'system 2 - name');
+is($system2->{kernel}, 'vmlinuz', 'system 2 - kernel');
+is($system2->{export_id}, '1', 'system 2 - export_id');
+is($system2->{comment}, undef, 'system 2 - comment');
+is(keys %{$system2->{attrs}}, 0, 'system 2 - attribute count');
+
+# fetch system 1 by filter on name and check all values
+ok(
+ my $system1 = $configDB->fetchSystemByFilter({ name => 'sys-1' }),
+ 'fetch system 1 by filter on name'
+);
+is($system1->{id}, 1, 'system 1 - id');
+is($system1->{name}, 'sys-1', 'system 1 - name');
+is($system1->{export_id}, '1', 'system 1 - export_id');
+is($system1->{kernel}, 'vmlinuz', 'system 1 - kernel');
+is($system1->{comment}, '', 'system 1 - comment');
+is($system1->{label}, 'sys-1', 'system 1 - label');
+is(keys %{$system1->{attrs}}, 3, 'system 1 - attribute count');
+is($system1->{attrs}->{ramfs_fsmods}, 'squashfs', 'system 1 - attr ramfs_fsmods');
+is($system1->{attrs}->{ramfs_nicmods}, 'e1000 forcedeth r8169', 'system 1 - attr ramfs_nicmods');
+is($system1->{attrs}->{start_sshd}, 'yes', 'system 1 - attr start_sshd');
+
+# fetch systems 3 & 1 by id
+ok(
+ my @systems3And1 = $configDB->fetchSystemByID([3, 1]),
+ 'fetch systems 3 & 1 by id'
+);
+is(@systems3And1, 2, 'should have got 2 systems');
+# now sort by ID and check if we have really got 3 and 1
+@systems3And1 = sort { $a->{id} cmp $b->{id} } @systems3And1;
+is($systems3And1[0]->{id}, 1, 'first id should be 1');
+is($systems3And1[1]->{id}, 3, 'second id should be 3');
+
+# fetching systems by id without giving any should yield undef
+is(
+ $configDB->fetchSystemByID(), undef,
+ 'fetch systems by id without giving any'
+);
+
+# fetching systems by filter without giving any should yield all of them
+ok(
+ @systems = $configDB->fetchSystemByFilter(),
+ 'fetch systems by filter without giving any'
+);
+is(@systems, 4, 'should have got all four systems');
+
+# fetch systems 1 & 2 by filter on export_id
+ok(
+ my @systems1And2 = $configDB->fetchSystemByFilter({ export_id => '1' }),
+ 'fetch systems 1 & 2 by filter on export_id'
+);
+is(@systems1And2, 2, 'should have got 2 systems');
+# now sort by ID and check if we have really got 1 and 2
+@systems1And2 = sort { $a->{id} cmp $b->{id} } @systems1And2;
+is($systems1And2[0]->{id}, 1, 'first id should be 1');
+is($systems1And2[1]->{id}, 2, 'second id should be 2');
+
+# try to fetch with multi-column filter
+ok(
+ ($system2, $system3)
+ = $configDB->fetchSystemByFilter({ export_id => '1', id => 2 }),
+ 'fetching system with export_id=1 and id=2 should work'
+);
+is($system2->{name}, 'sys-2.0', 'should have got sys-2.0');
+is($system3, undef, 'should not get sys-nr-3');
+
+# try to fetch multiple occurrences of the same system, combined with
+# some unknown IDs
+ok(
+ my @systems1And3 = $configDB->fetchSystemByID([ 1, 21, 4-1, 1, 3, 1, 1 ]),
+ 'fetch a complex set of systems by ID'
+);
+is(@systems1And3, 2, 'should have got 2 systems');
+# now sort by ID and check if we have really got 1 and 3
+@systems1And3 = sort { $a->{id} cmp $b->{id} } @systems1And3;
+is($systems1And3[0]->{id}, 1, 'first id should be 1');
+is($systems1And3[1]->{id}, 3, 'second id should be 3');
+
+# filter systems by different attributes & values in combination
+ok(
+ my @system1Only = $configDB->fetchSystemByFilter( {}, undef, {
+ ramfs_nicmods => 'e1000 forcedeth r8169'
+ } ),
+ 'fetch system 1 by filter on attribute ramfs_nicmods'
+);
+
+is(@system1Only, 1, 'should have got 1 system');
+is($system1Only[0]->{id}, 1, 'first id should be 1');
+
+ok(
+ @system1Only = $configDB->fetchSystemByFilter( undef, 'id', {
+ ramfs_nicmods => 'e1000 forcedeth r8169',
+ slxgrp => undef,
+ } ),
+ 'fetch system 1 by filter on attribute ramfs_nicmods'
+);
+is(@system1Only, 1, 'should have got 1 system');
+is($system1Only[0]->{id}, 1, 'first id should be 1');
+
+ok(
+ @system1Only = $configDB->fetchSystemByFilter( {
+ export_id => 1,
+ comment => '',
+ }, 'id', {
+ ramfs_nicmods => 'e1000 forcedeth r8169',
+ slxgrp => undef,
+ } ),
+ 'fetch system 1 by multiple filter on values and attributes'
+);
+is(@system1Only, 1, 'should have got 1 system');
+is($system1Only[0]->{id}, 1, 'first id should be 1');
+
+is(
+ $configDB->fetchSystemByFilter( {
+ export_id => 2,
+ }, 'id', {
+ ramfs_nicmods => 'e1000 forcedeth r8169',
+ slxgrp => undef,
+ } ),
+ undef,
+ 'mismatch system 1 by filter with incorrect value'
+);
+is(
+ $configDB->fetchSystemByFilter( {
+ export_id => 1,
+ }, 'id', {
+ ramfs_nicmods => 'xxxx',
+ slxgrp => undef,
+ } ),
+ undef,
+ 'mismatch system 1 by filter with incorrect attribute value'
+);
+is(
+ $configDB->fetchSystemByFilter( {
+ name => 'sys-1',
+ }, 'id', {
+ start_sshd => undef,
+ } ),
+ undef,
+ 'mismatch system 1 by filter with attribute not being empty'
+);
+
+# fetch systems 1 & 2 by filter on attribute start_samba not existing
+ok(
+ @systems1And2 = $configDB->fetchSystemByFilter( {}, undef, {
+ start_snmp => undef,
+ } ),
+ 'fetch systems 1 & 2 by filter on attribute start_snmp not existing'
+);
+is(@systems1And2, 2, 'should have got 2 systems');
+# now sort by ID and check if we have really got 1 and 2
+@systems1And2 = sort { $a->{id} cmp $b->{id} } @systems1And2;
+is($systems1And2[0]->{id}, 1, 'first id should be 1');
+is($systems1And2[1]->{id}, 2, 'second id should be 2');
+
+# try to fetch a couple of non-existing systems by id
+is(
+ $configDB->fetchSystemByID(-1), undef,
+ 'system with id -1 should not exist'
+);
+ok($configDB->fetchSystemByID(0), 'system with id 0 should exist');
+is(
+ $configDB->fetchSystemByID(1 << 31 + 1000), undef,
+ 'trying to fetch another unknown system'
+);
+
+# try to fetch a couple of non-existing systems by filter
+is(
+ $configDB->fetchSystemByFilter({ id => 4 }), undef,
+ 'fetching system with id=4 by filter should fail'
+);
+is(
+ $configDB->fetchSystemByFilter({ name => 'sys-1.x' }), undef,
+ 'fetching system with name="sys-1.x" should fail'
+);
+is(
+ $configDB->fetchSystemByFilter({ export_id => '2', id => 1 }), undef,
+ 'fetching system with export_id=2 and id=1 should fail'
+);
+
+# rename system 1 and then fetch it by its new name
+ok($configDB->changeSystem(1, { name => q{SYS-'1'} }), 'changing system 1');
+ok(
+ $system1 = $configDB->fetchSystemByFilter({ name => q{SYS-'1'} }),
+ 'fetching renamed system 1'
+);
+is($system1->{id}, 1, 'really got system number 1');
+is($system1->{name}, q{SYS-'1'}, q{really got system named "SYS-'1'"});
+
+# changing nothing at all should succeed
+ok($configDB->changeSystem(1), 'changing nothing at all in system 1');
+
+# adding attributes should work
+$inSystem1->{attrs}->{slxgrp} = 'slxgrp1';
+$inSystem1->{attrs}->{vmware} = 'yes';
+ok($configDB->changeSystem(1, $inSystem1), 'adding attrs to system 1');
+$system1 = $configDB->fetchSystemByID(1);
+is($system1->{attrs}->{slxgrp}, 'slxgrp1', 'attr slxgrp has correct value');
+is($system1->{attrs}->{vmware}, 'yes', 'attr vmware has correct value');
+
+# changing an attribute should work
+$inSystem1->{attrs}->{vmware} = 'no';
+ok($configDB->changeSystem(1, $inSystem1), 'changing vmware in system 1');
+$system1 = $configDB->fetchSystemByID(1);
+is($system1->{attrs}->{slxgrp}, 'slxgrp1', 'attr slxgrp has correct value');
+is($system1->{attrs}->{vmware}, 'no', 'attr vmware has correct value');
+
+# deleting an attribute should remove it
+delete $inSystem1->{attrs}->{slxgrp};
+ok($configDB->changeSystem(1, $inSystem1), 'changing slxgrp in system 1');
+$system1 = $configDB->fetchSystemByID(1);
+ok(!exists $system1->{attrs}->{slxgrp}, 'attr slxgrp should be gone');
+
+# undef'ing an attribute should remove it, too
+$inSystem1->{attrs}->{vmware} = undef;
+ok($configDB->changeSystem(1, $inSystem1), 'undefining vmware in system 1');
+$system1 = $configDB->fetchSystemByID(1);
+ok(!exists $system1->{attrs}->{vmware}, 'attr vmware should be gone');
+
+# changing a non-existing column should fail
+ok(
+ ! eval { $configDB->changeSystem(1, { xname => "xx" }) },
+ 'changing unknown colum should fail'
+);
+
+ok(! $configDB->changeSystem(1, { id => 23 }), 'changing id should fail');
+
+# now remove an system and check if that worked
+ok($configDB->removeSystem(2), 'removing system 2 should be ok');
+is($configDB->fetchSystemByID(2, 'id'), undef, 'system 2 should be gone');
+is($configDB->fetchSystemByID(1)->{id}, 1, 'system 1 should still exist');
+is($configDB->fetchSystemByID(3)->{id}, 3, 'system 3 should still exist');
+
+$configDB->disconnect();
+
diff --git a/src/config-db/t/13-client.t b/src/config-db/t/13-client.t
new file mode 100644
index 00000000..8be71518
--- /dev/null
+++ b/src/config-db/t/13-client.t
@@ -0,0 +1,320 @@
+use Test::More qw(no_plan);
+
+use strict;
+use warnings;
+
+use lib '/opt/openslx/lib';
+
+# basic init
+use OpenSLX::ConfigDB;
+
+my $configDB = OpenSLX::ConfigDB->new;
+$configDB->connect();
+
+ok(
+ my $client = $configDB->fetchClientByFilter,
+ 'one client [default] should exist (scalar context)'
+);
+
+foreach my $requiredCol (qw(name mac)) {
+ my $wrongClient = {
+ 'name' => 'name',
+ 'mac' => '01:02:03:04:05:06',
+ 'comment' => 'has column missing',
+ };
+ delete $wrongClient->{$requiredCol};
+ ok(
+ ! eval { my $clientID = $configDB->addClient($wrongClient); },
+ "inserting a client without '$requiredCol' column should fail"
+ );
+}
+
+is(
+ my @clients = $configDB->fetchClientByFilter, 1,
+ 'still just one client [default] should exist (array context)'
+);
+
+my $inClient1 = {
+ 'name' => 'cli-1',
+ 'mac' => '01:02:03:04:05:01',
+ 'comment' => '',
+ 'attrs' => {
+ 'start_snmp' => 'no',
+ 'start_sshd' => 'yes',
+ },
+};
+is(
+ my $client1ID = $configDB->addClient($inClient1), 1,
+ 'first client has ID 1'
+);
+
+my $inClient2 = {
+ 'name' => 'cli-2.0',
+ 'mac' => '01:02:03:04:05:02',
+ 'comment' => undef,
+ 'attrs' => {
+ 'boot_type' => 'etherboot',
+ 'unbootable' => 1,
+ }
+};
+my $fullClient = {
+ 'name' => 'cli-nr-3',
+ 'mac' => '01:02:03:04:05:03',
+ 'comment' => 'nuff said',
+ 'attrs' => {
+ 'automnt_dir' => 'a',
+ 'automnt_src' => 'b',
+ 'boot_type' => 'pxe',
+ 'country' => 'c',
+ 'kernel_params_client' => 'debug=3 console=ttyS1',
+ 'scratch' => 'q',
+ 'start_atd' => 't',
+ 'start_cron' => 'u',
+ 'start_dreshal' => 'v',
+ 'start_ntp' => 'w',
+ 'start_nfsv4' => 'x',
+ 'start_snmp' => 'A',
+ 'start_sshd' => 'B',
+ 'timezone' => 'G',
+ 'unbootable' => '0',
+ },
+};
+ok(
+ my ($client2ID, $client3ID) = $configDB->addClient([
+ $inClient2, $fullClient
+ ]),
+ 'add two more clients'
+);
+is($client2ID, 2, 'client 2 should have ID=2');
+is($client3ID, 3, 'client 3 should have ID=3');
+
+# fetch client 3 by id and check all values
+ok(my $client3 = $configDB->fetchClientByID(3), 'fetch client 3');
+is($client3->{id}, '3', 'client 3 - id');
+is($client3->{name}, 'cli-nr-3', 'client 3 - name');
+is($client3->{mac}, '01:02:03:04:05:03', 'client 3 - mac');
+is($client3->{comment}, 'nuff said', 'client 3 - comment');
+is($client3->{attrs}->{automnt_dir}, 'a', 'client 3 - attr automnt_dir');
+is($client3->{attrs}->{automnt_src}, 'b', 'client 3 - attr automnt_src');
+is($client3->{attrs}->{boot_type}, 'pxe', 'client 3 - attr boot_type');
+is($client3->{attrs}->{country}, 'c', 'client 3 - attr country');
+is($client3->{attrs}->{kernel_params_client}, 'debug=3 console=ttyS1', 'client 3 - attr kernel_params_client');
+is($client3->{attrs}->{scratch}, 'q', 'client 3 - attr scratch');
+is($client3->{attrs}->{start_atd}, 't', 'client 3 - attr start_atd');
+is($client3->{attrs}->{start_cron}, 'u', 'client 3 - attr start_cron');
+is($client3->{attrs}->{start_dreshal}, 'v', 'client 3 - attr start_dreshal');
+is($client3->{attrs}->{start_ntp}, 'w', 'client 3 - attr start_ftp');
+is($client3->{attrs}->{start_nfsv4}, 'x', 'client 3 - attr start_nfsv4');
+is($client3->{attrs}->{start_snmp}, 'A', 'client 3 - attr start_snmp');
+is($client3->{attrs}->{start_sshd}, 'B', 'client 3 - attr start_sshd');
+is($client3->{attrs}->{timezone}, 'G', 'client 3 - attr timezone');
+is($client3->{attrs}->{unbootable}, '0', 'client 3 - attr unbootable');
+is(keys %{$client3->{attrs}}, 15, 'client 3 - attribute count');
+
+# fetch client 2 by a filter on id and check all values
+ok(
+ my $client2 = $configDB->fetchClientByFilter({ id => 2 }),
+ 'fetch client 2 by filter on id'
+);
+is($client2->{id}, 2, 'client 2 - id');
+is($client2->{name}, 'cli-2.0', 'client 2 - name');
+is($client2->{mac}, '01:02:03:04:05:02', 'client 2 - mac');
+is($client2->{comment}, undef, 'client 2 - comment');
+is(keys %{$client2->{attrs}}, 2, 'client 2 - attribute count');
+is($client2->{attrs}->{boot_type}, 'etherboot', 'client 2 - attr boot_type');
+is($client2->{attrs}->{unbootable}, '1', 'client 2 - attr unbootable');
+
+# fetch client 1 by filter on name and check all values
+ok(
+ my $client1 = $configDB->fetchClientByFilter({ name => 'cli-1' }),
+ 'fetch client 1 by filter on name'
+);
+is($client1->{id}, 1, 'client 1 - id');
+is($client1->{name}, 'cli-1', 'client 1 - name');
+is($client1->{mac}, '01:02:03:04:05:01', 'client 1 - mac');
+is($client1->{comment}, '', 'client 1 - comment');
+is(keys %{$client1->{attrs}}, 2, 'client 1 - attribute count');
+is($client1->{attrs}->{start_snmp}, 'no', 'client 1 - attr start_snmp');
+is($client1->{attrs}->{start_sshd}, 'yes', 'client 1 - attr start_sshd');
+
+# fetch clients 3 & 1 by id
+ok(
+ my @clients3And1 = $configDB->fetchClientByID([3, 1]),
+ 'fetch clients 3 & 1 by id'
+);
+is(@clients3And1, 2, 'should have got 2 clients');
+# now sort by ID and check if we have really got 3 and 1
+@clients3And1 = sort { $a->{id} cmp $b->{id} } @clients3And1;
+is($clients3And1[0]->{id}, 1, 'first id should be 1');
+is($clients3And1[1]->{id}, 3, 'second id should be 3');
+
+# fetching clients by id without giving any should yield undef
+is(
+ $configDB->fetchClientByID(), undef,
+ 'fetch clients by id without giving any'
+);
+
+# fetching clients by filter without giving any should yield all of them
+ok(
+ @clients = $configDB->fetchClientByFilter(),
+ 'fetch clients by filter without giving any'
+);
+is(@clients, 4, 'should have got all four clients');
+
+# try to fetch multiple occurrences of the same client, combined with
+# some unknown IDs
+ok(
+ my @clients1And3 = $configDB->fetchClientByID([ 1, 21, 4-1, 1, 4, 1, 1 ]),
+ 'fetch a complex set of clients by ID'
+);
+is(@clients1And3, 2, 'should have got 2 clients');
+# now sort by ID and check if we have really got 1 and 3
+@clients1And3 = sort { $a->{id} cmp $b->{id} } @clients1And3;
+is($clients1And3[0]->{id}, 1, 'first id should be 1');
+is($clients1And3[1]->{id}, 3, 'second id should be 3');
+
+# filter clients by different attributes & values in combination
+ok(
+ my @client1Only = $configDB->fetchClientByFilter( {}, undef, {
+ start_snmp => 'no',
+ } ),
+ 'fetch client 1 by filter on attribute start_snmp'
+);
+
+is(@client1Only, 1, 'should have got 1 client');
+is($client1Only[0]->{id}, 1, 'first id should be 1');
+
+ok(
+ @client1Only = $configDB->fetchClientByFilter( undef, 'id', {
+ start_snmp => 'no',
+ tex_enable => undef,
+ } ),
+ 'fetch client 1 by filter on attribute start_snmp + non-existing attr'
+);
+is(@client1Only, 1, 'should have got 1 client');
+is($client1Only[0]->{id}, 1, 'first id should be 1');
+
+is(
+ $configDB->fetchClientByFilter( {
+ comment => 'xxx',
+ }, 'id', {
+ start_snmp => 'no',
+ start_dreshal => undef,
+ } ),
+ undef,
+ 'mismatch client 1 by filter with incorrect value'
+);
+is(
+ $configDB->fetchClientByFilter( {
+ name => 'cli-1',
+ }, 'id', {
+ start_snmp => 'yes',
+ start_dreshal => undef,
+ } ),
+ undef,
+ 'mismatch client 1 by filter with incorrect attribute value'
+);
+is(
+ $configDB->fetchClientByFilter( {
+ name => 'cli-1',
+ }, 'id', {
+ start_sshd => undef,
+ } ),
+ undef,
+ 'mismatch client 1 by filter with attribute not being empty'
+);
+
+# fetch clients 0, 1 & 2 by filter on attribute start_dreshal not existing
+ok(
+ my @clients01And2 = $configDB->fetchClientByFilter( {}, undef, {
+ start_dreshal => undef,
+ } ),
+ 'fetch clients 0,1 & 2 by filter on attribute start_dreshal not existing'
+);
+is(@clients01And2, 3, 'should have got 3 clients');
+# now sort by ID and check if we have really got 0, 1 and 2
+@clients01And2 = sort { $a->{id} cmp $b->{id} } @clients01And2;
+is($clients01And2[0]->{id}, 0, 'first id should be 0');
+is($clients01And2[1]->{id}, 1, 'second id should be 1');
+is($clients01And2[2]->{id}, 2, 'third id should be 2');
+
+# try to fetch a couple of non-existing clients by id
+is(
+ $configDB->fetchClientByID(-1), undef,
+ 'client with id -1 should not exist'
+);
+ok($configDB->fetchClientByID(0), 'client with id 0 should exist');
+is(
+ $configDB->fetchClientByID(1 << 31 + 1000), undef,
+ 'trying to fetch another unknown client'
+);
+
+# try to fetch a couple of non-existing clients by filter
+is(
+ $configDB->fetchClientByFilter({ id => 4 }), undef,
+ 'fetching client with id=4 by filter should fail'
+);
+is(
+ $configDB->fetchClientByFilter({ name => 'cli-1.x' }), undef,
+ 'fetching client with name="cli-1.x" should fail'
+);
+is(
+ $configDB->fetchClientByFilter({ mac => '01:01:01:01:01:01', id => 1 }), undef,
+ 'fetching client with mac=01:01:01:01:01:01 and id=1 should fail'
+);
+
+# rename client 1 and then fetch it by its new name
+ok($configDB->changeClient(1, { name => q{CLI-'1'} }), 'changing client 1');
+ok(
+ $client1 = $configDB->fetchClientByFilter({ name => q{CLI-'1'} }),
+ 'fetching renamed client 1'
+);
+is($client1->{id}, 1, 'really got client number 1');
+is($client1->{name}, q{CLI-'1'}, q{really got client named "CLI-'1'"});
+
+# changing nothing at all should succeed
+ok($configDB->changeClient(1), 'changing nothing at all in client 1');
+
+# adding attributes should work
+$inClient1->{attrs}->{slxgrp} = 'slxgrp1';
+$inClient1->{attrs}->{vmware} = 'yes';
+ok($configDB->changeClient(1, $inClient1), 'adding attrs to client 1');
+$client1 = $configDB->fetchClientByID(1);
+is($client1->{attrs}->{slxgrp}, 'slxgrp1', 'attr slxgrp has correct value');
+is($client1->{attrs}->{vmware}, 'yes', 'attr vmware has correct value');
+
+# changing an attribute should work
+$inClient1->{attrs}->{vmware} = 'no';
+ok($configDB->changeClient(1, $inClient1), 'changing vmware in client 1');
+$client1 = $configDB->fetchClientByID(1);
+is($client1->{attrs}->{slxgrp}, 'slxgrp1', 'attr slxgrp has correct value');
+is($client1->{attrs}->{vmware}, 'no', 'attr vmware has correct value');
+
+# deleting an attribute should remove it
+delete $inClient1->{attrs}->{slxgrp};
+ok($configDB->changeClient(1, $inClient1), 'changing slxgrp in client 1');
+$client1 = $configDB->fetchClientByID(1);
+ok(!exists $client1->{attrs}->{slxgrp}, 'attr slxgrp should be gone');
+
+# undef'ing an attribute should remove it, too
+$inClient1->{attrs}->{vmware} = undef;
+ok($configDB->changeClient(1, $inClient1), 'undefining vmware in client 1');
+$client1 = $configDB->fetchClientByID(1);
+ok(!exists $client1->{attrs}->{vmware}, 'attr vmware should be gone');
+
+# changing a non-existing column should fail
+ok(
+ ! eval { $configDB->changeClient(1, { xname => "xx" }) },
+ 'changing unknown colum should fail'
+);
+
+ok(! $configDB->changeClient(1, { id => 23 }), 'changing id should fail');
+
+# now remove an client and check if that worked
+ok($configDB->removeClient(2), 'removing client 2 should be ok');
+is($configDB->fetchClientByID(2, 'id'), undef, 'client 2 should be gone');
+is($configDB->fetchClientByID(1)->{id}, 1, 'client 1 should still exist');
+is($configDB->fetchClientByID(3)->{id}, 3, 'client 3 should still exist');
+
+$configDB->disconnect();
+
diff --git a/src/config-db/t/14-group.t b/src/config-db/t/14-group.t
new file mode 100644
index 00000000..5c5d0f81
--- /dev/null
+++ b/src/config-db/t/14-group.t
@@ -0,0 +1,384 @@
+use Test::More qw(no_plan);
+
+use strict;
+use warnings;
+
+use lib '/opt/openslx/lib';
+
+# basic init
+use OpenSLX::ConfigDB;
+
+my $configDB = OpenSLX::ConfigDB->new;
+$configDB->connect();
+
+is(
+ my $group = $configDB->fetchGroupByFilter, undef,
+ 'no group should exist (scalar context)'
+);
+
+foreach my $requiredCol (qw(name)) {
+ my $wrongGroup = {
+ 'name' => 'name',
+ 'priority' => 41,
+ 'comment' => 'has column missing',
+ };
+ delete $wrongGroup->{$requiredCol};
+ ok(
+ ! eval { my $groupID = $configDB->addGroup($wrongGroup); },
+ "inserting a group without '$requiredCol' column should fail"
+ );
+}
+
+is(
+ my @groups = $configDB->fetchGroupByFilter, 0,
+ 'still no group should exist (array context)'
+);
+
+my $inGroup1 = {
+ 'name' => 'grp-1',
+ 'comment' => '',
+ 'attrs' => {
+ 'slxgrp' => 'slxgrp',
+ 'start_snmp' => 'no',
+ 'start_sshd' => 'yes',
+ },
+};
+is(
+ my $group1ID = $configDB->addGroup($inGroup1), 1,
+ 'first group has ID 1'
+);
+
+my $inGroup2 = {
+ 'name' => 'grp-2.0',
+ 'priority' => 30,
+ 'comment' => undef,
+};
+my $fullGroup = {
+ 'name' => 'grp-nr-3',
+ 'priority' => 50,
+ 'comment' => 'nuff said',
+ 'attrs' => {
+ 'automnt_dir' => 'a',
+ 'automnt_src' => 'b',
+ 'country' => 'c',
+ 'dm_allow_shutdown' => 'd',
+ 'hw_graphic' => 'e',
+ 'hw_monitor' => 'f',
+ 'hw_mouse' => 'g',
+ 'late_dm' => 'h',
+ 'netbios_workgroup' => 'i',
+ 'nis_domain' => 'j',
+ 'nis_servers' => 'k',
+ 'sane_scanner' => 'p',
+ 'scratch' => 'q',
+ 'slxgrp' => 'r',
+ 'start_alsasound' => 's',
+ 'start_atd' => 't',
+ 'start_cron' => 'u',
+ 'start_dreshal' => 'v',
+ 'start_ntp' => 'w',
+ 'start_nfsv4' => 'x',
+ 'start_printer' => 'y',
+ 'start_samba' => 'z',
+ 'start_snmp' => 'A',
+ 'start_sshd' => 'B',
+ 'start_syslog' => 'C',
+ 'start_x' => 'D',
+ 'start_xdmcp' => 'E',
+ 'tex_enable' => 'F',
+ 'timezone' => 'G',
+ 'tvout' => 'H',
+ 'vmware' => 'I',
+ },
+};
+ok(
+ my ($group2ID, $group3ID) = $configDB->addGroup([
+ $inGroup2, $fullGroup
+ ]),
+ 'add two more groups'
+);
+is($group2ID, 2, 'group 2 should have ID=2');
+is($group3ID, 3, 'group 3 should have ID=3');
+
+# fetch group 3 by id and check all values
+ok(my $group3 = $configDB->fetchGroupByID(3), 'fetch group 3');
+is($group3->{id}, '3', 'group 3 - id');
+is($group3->{name}, 'grp-nr-3', 'group 3 - name');
+is($group3->{priority}, 50, 'group 3 - priority');
+is($group3->{comment}, 'nuff said', 'group 3 - comment');
+is($group3->{attrs}->{automnt_dir}, 'a', 'group 3 - attr automnt_dir');
+is($group3->{attrs}->{automnt_src}, 'b', 'group 3 - attr automnt_src');
+is($group3->{attrs}->{country}, 'c', 'group 3 - attr country');
+is($group3->{attrs}->{dm_allow_shutdown}, 'd', 'group 3 - attr dm_allow_shutdown');
+is($group3->{attrs}->{hw_graphic}, 'e', 'group 3 - attr hw_graphic');
+is($group3->{attrs}->{hw_monitor}, 'f', 'group 3 - attr hw_monitor');
+is($group3->{attrs}->{hw_mouse}, 'g', 'group 3 - attr hw_mouse');
+is($group3->{attrs}->{late_dm}, 'h', 'group 3 - attr late_dm');
+is($group3->{attrs}->{netbios_workgroup}, 'i', 'group 3 - attr netbios_workgroup');
+is($group3->{attrs}->{nis_domain}, 'j', 'group 3 - attr nis_domain');
+is($group3->{attrs}->{nis_servers}, 'k', 'group 3 - attr nis_servers');
+is($group3->{attrs}->{sane_scanner}, 'p', 'group 3 - attr sane_scanner');
+is($group3->{attrs}->{scratch}, 'q', 'group 3 - attr scratch');
+is($group3->{attrs}->{slxgrp}, 'r', 'group 3 - attr slxgrp');
+is($group3->{attrs}->{start_alsasound}, 's', 'group 3 - attr start_alsasound');
+is($group3->{attrs}->{start_atd}, 't', 'group 3 - attr start_atd');
+is($group3->{attrs}->{start_cron}, 'u', 'group 3 - attr start_cron');
+is($group3->{attrs}->{start_dreshal}, 'v', 'group 3 - attr start_dreshal');
+is($group3->{attrs}->{start_ntp}, 'w', 'group 3 - attr start_ftp');
+is($group3->{attrs}->{start_nfsv4}, 'x', 'group 3 - attr start_nfsv4');
+is($group3->{attrs}->{start_printer}, 'y', 'group 3 - attr start_printer');
+is($group3->{attrs}->{start_samba}, 'z', 'group 3 - attr start_samba');
+is($group3->{attrs}->{start_snmp}, 'A', 'group 3 - attr start_snmp');
+is($group3->{attrs}->{start_sshd}, 'B', 'group 3 - attr start_sshd');
+is($group3->{attrs}->{start_syslog}, 'C', 'group 3 - attr start_syslog');
+is($group3->{attrs}->{start_x}, 'D', 'group 3 - attr start_x');
+is($group3->{attrs}->{start_xdmcp}, 'E', 'group 3 - attr start_xdmcp');
+is($group3->{attrs}->{tex_enable}, 'F', 'group 3 - attr tex_enable');
+is($group3->{attrs}->{timezone}, 'G', 'group 3 - attr timezone');
+is($group3->{attrs}->{tvout}, 'H', 'group 3 - attr tvout');
+is($group3->{attrs}->{vmware}, 'I', 'group 3 - attr vmware');
+is(keys %{$group3->{attrs}}, 31, 'group 3 - attribute count');
+
+# fetch group 2 by a filter on id and check all values
+ok(
+ my $group2 = $configDB->fetchGroupByFilter({ id => 2 }),
+ 'fetch group 2 by filter on id'
+);
+is($group2->{id}, 2, 'group 2 - id');
+is($group2->{name}, 'grp-2.0', 'group 2 - name');
+is($group2->{priority}, 30, 'group 2 - priority');
+is($group2->{comment}, undef, 'group 2 - comment');
+is(keys %{$group2->{attrs}}, 0, 'group 2 - attribute count');
+
+# fetch group 1 by filter on name and check all values
+ok(
+ my $group1 = $configDB->fetchGroupByFilter({ name => 'grp-1' }),
+ 'fetch group 1 by filter on name'
+);
+is($group1->{id}, 1, 'group 1 - id');
+is($group1->{name}, 'grp-1', 'group 1 - name');
+is($group1->{priority}, 50, 'group 1 - priority');
+is($group1->{comment}, '', 'group 1 - comment');
+is(keys %{$group1->{attrs}}, 3, 'group 1 - attribute count');
+is($group1->{attrs}->{slxgrp}, 'slxgrp', 'group 1 - attr slxgrp');
+is($group1->{attrs}->{start_snmp}, 'no', 'group 1 - attr start_snmp');
+is($group1->{attrs}->{start_sshd}, 'yes', 'group 1 - attr start_sshd');
+
+# fetch groups 3 & 1 by id
+ok(
+ my @groups3And1 = $configDB->fetchGroupByID([3, 1]),
+ 'fetch groups 3 & 1 by id'
+);
+is(@groups3And1, 2, 'should have got 2 groups');
+# now sort by ID and check if we have really got 3 and 1
+@groups3And1 = sort { $a->{id} cmp $b->{id} } @groups3And1;
+is($groups3And1[0]->{id}, 1, 'first id should be 1');
+is($groups3And1[1]->{id}, 3, 'second id should be 3');
+
+# fetching groups by id without giving any should yield undef
+is(
+ $configDB->fetchGroupByID(), undef,
+ 'fetch groups by id without giving any'
+);
+
+# fetching groups by filter without giving any should yield all of them
+ok(
+ @groups = $configDB->fetchGroupByFilter(),
+ 'fetch groups by filter without giving any'
+);
+is(@groups, 3, 'should have got all three groups');
+
+# fetch groups 1 & 2 by filter on priority
+ok(
+ my @groups1And3 = $configDB->fetchGroupByFilter({ priority => 50 }),
+ 'fetch groups 1 & 3 by filter on priority'
+);
+is(@groups1And3, 2, 'should have got 2 groups');
+# now sort by ID and check if we have really got 1 and 3
+@groups1And3 = sort { $a->{id} cmp $b->{id} } @groups1And3;
+is($groups1And3[0]->{id}, 1, 'first id should be 1');
+is($groups1And3[1]->{id}, 3, 'second id should be 3');
+
+# fetch group 2 by filter on comment being undef'd
+ok(
+ my @group2Only = $configDB->fetchGroupByFilter({ comment => undef }),
+ 'fetch group 2 by filter on comment being undefined'
+);
+is(@group2Only, 1, 'should have got 1 group');
+is($group2Only[0]->{id}, 2, 'first id should be 2');
+
+# try to fetch with multi-column filter
+ok(
+ ($group1, $group3)
+ = $configDB->fetchGroupByFilter({ priority => '50', id => 1 }),
+ 'fetching group with priority=50 and id=1 should work'
+);
+is($group1->{name}, 'grp-1', 'should have got grp-1');
+is($group3, undef, 'should not get grp-nr-3');
+
+# try to fetch multiple occurrences of the same group, combined with
+# some unknown IDs
+ok(
+ @groups1And3 = $configDB->fetchGroupByID([ 1, 21, 4-1, 1, 4, 1, 1 ]),
+ 'fetch a complex set of groups by ID'
+);
+is(@groups1And3, 2, 'should have got 2 groups');
+# now sort by ID and check if we have really got 1 and 3
+@groups1And3 = sort { $a->{id} cmp $b->{id} } @groups1And3;
+is($groups1And3[0]->{id}, 1, 'first id should be 1');
+is($groups1And3[1]->{id}, 3, 'second id should be 3');
+
+# filter groups by different attributes & values in combination
+ok(
+ my @group1Only = $configDB->fetchGroupByFilter( {}, undef, {
+ start_snmp => 'no',
+ } ),
+ 'fetch group 1 by filter on attribute start_snmp'
+);
+
+is(@group1Only, 1, 'should have got 1 group');
+is($group1Only[0]->{id}, 1, 'first id should be 1');
+
+ok(
+ @group1Only = $configDB->fetchGroupByFilter( undef, 'id', {
+ start_snmp => 'no',
+ tex_enable => undef,
+ } ),
+ 'fetch group 1 by filter on attribute start_snmp + non-existing attr'
+);
+is(@group1Only, 1, 'should have got 1 group');
+is($group1Only[0]->{id}, 1, 'first id should be 1');
+
+ok(
+ @group1Only = $configDB->fetchGroupByFilter( {
+ name => 'grp-1',
+ priority => 50,
+ }, 'id', {
+ start_snmp => 'no',
+ tex_enable => undef,
+ } ),
+ 'fetch group 1 by multiple filter on values and attributes'
+);
+is(@group1Only, 1, 'should have got 1 group');
+is($group1Only[0]->{id}, 1, 'first id should be 1');
+
+is(
+ $configDB->fetchGroupByFilter( {
+ comment => 'xxx',
+ }, 'id', {
+ start_snmp => 'no',
+ tex_enable => undef,
+ } ),
+ undef,
+ 'mismatch group 1 by filter with incorrect value'
+);
+is(
+ $configDB->fetchGroupByFilter( {
+ name => 'grp-1',
+ }, 'id', {
+ start_snmp => 'yes',
+ tex_enable => undef,
+ } ),
+ undef,
+ 'mismatch group 1 by filter with incorrect attribute value'
+);
+is(
+ $configDB->fetchGroupByFilter( {
+ name => 'grp-1',
+ }, 'id', {
+ start_sshd => undef,
+ } ),
+ undef,
+ 'mismatch group 1 by filter with attribute not being empty'
+);
+
+# fetch groups 1 & 2 by filter on attribute start_samba not existing
+ok(
+ my @groups1And2 = $configDB->fetchGroupByFilter( {}, undef, {
+ start_samba => undef,
+ } ),
+ 'fetch groups 1 & 2 by filter on attribute start_samba not existing'
+);
+is(@groups1And2, 2, 'should have got 2 groups');
+# now sort by ID and check if we have really got 1 and 2
+@groups1And2 = sort { $a->{id} cmp $b->{id} } @groups1And2;
+is($groups1And2[0]->{id}, 1, 'first id should be 1');
+is($groups1And2[1]->{id}, 2, 'second id should be 2');
+
+# try to fetch a couple of non-existing groups by id
+is($configDB->fetchGroupByID(-1), undef, 'group with id -1 should not exist');
+is($configDB->fetchGroupByID(0), undef, 'group with id 0 should not exist');
+is(
+ $configDB->fetchGroupByID(1 << 31 + 1000), undef,
+ 'trying to fetch another unknown group'
+);
+
+# try to fetch a couple of non-existing groups by filter
+is(
+ $configDB->fetchGroupByFilter({ id => 4 }), undef,
+ 'fetching group with id=4 by filter should fail'
+);
+is(
+ $configDB->fetchGroupByFilter({ name => 'grp-1.x' }), undef,
+ 'fetching group with name="grp-1.x" should fail'
+);
+is(
+ $configDB->fetchGroupByFilter({ priority => '22', id => 1 }), undef,
+ 'fetching group with priority=22 and id=1 should fail'
+);
+
+# rename group 1 and then fetch it by its new name
+ok($configDB->changeGroup(1, { name => q{GRP-'1'} }), 'changing group 1');
+ok(
+ $group1 = $configDB->fetchGroupByFilter({ name => q{GRP-'1'} }),
+ 'fetching renamed group 1'
+);
+is($group1->{id}, 1, 'really got group number 1');
+is($group1->{name}, q{GRP-'1'}, q{really got group named "GRP-'1'"});
+
+# changing nothing at all should succeed
+ok($configDB->changeGroup(1), 'changing nothing at all in group 1');
+
+# adding attributes should work
+$inGroup1->{attrs}->{slxgrp} = 'slxgrp1';
+$inGroup1->{attrs}->{vmware} = 'yes';
+ok($configDB->changeGroup(1, $inGroup1), 'adding attrs to group 1');
+$group1 = $configDB->fetchGroupByID(1);
+is($group1->{attrs}->{slxgrp}, 'slxgrp1', 'attr slxgrp has correct value');
+is($group1->{attrs}->{vmware}, 'yes', 'attr vmware has correct value');
+
+# changing an attribute should work
+$inGroup1->{attrs}->{vmware} = 'no';
+ok($configDB->changeGroup(1, $inGroup1), 'changing vmware in group 1');
+$group1 = $configDB->fetchGroupByID(1);
+is($group1->{attrs}->{slxgrp}, 'slxgrp1', 'attr slxgrp has correct value');
+is($group1->{attrs}->{vmware}, 'no', 'attr vmware has correct value');
+
+# deleting an attribute should remove it
+delete $inGroup1->{attrs}->{slxgrp};
+ok($configDB->changeGroup(1, $inGroup1), 'changing slxgrp in group 1');
+$group1 = $configDB->fetchGroupByID(1);
+ok(!exists $group1->{attrs}->{slxgrp}, 'attr slxgrp should be gone');
+
+# undef'ing an attribute should remove it, too
+$inGroup1->{attrs}->{vmware} = undef;
+ok($configDB->changeGroup(1, $inGroup1), 'undefining vmware in group 1');
+$group1 = $configDB->fetchGroupByID(1);
+ok(!exists $group1->{attrs}->{vmware}, 'attr vmware should be gone');
+
+# changing a non-existing column should fail
+ok(
+ ! eval { $configDB->changeGroup(1, { xname => "xx" }) },
+ 'changing unknown colum should fail'
+);
+
+ok(! $configDB->changeGroup(1, { id => 23 }), 'changing id should fail');
+
+# now remove an group and check if that worked
+ok($configDB->removeGroup(2), 'removing group 2 should be ok');
+is($configDB->fetchGroupByID(2, 'id'), undef, 'group 2 should be gone');
+is($configDB->fetchGroupByID(1)->{id}, 1, 'group 1 should still exist');
+is($configDB->fetchGroupByID(3)->{id}, 3, 'group 3 should still exist');
+
+$configDB->disconnect();
+
diff --git a/src/config-db/t/15-global_info.t b/src/config-db/t/15-global_info.t
new file mode 100644
index 00000000..8f2f8cf1
--- /dev/null
+++ b/src/config-db/t/15-global_info.t
@@ -0,0 +1,43 @@
+use Test::More qw(no_plan);
+
+use strict;
+use warnings;
+
+use lib '/opt/openslx/lib';
+
+# basic init
+use OpenSLX::ConfigDB;
+
+my $configDB = OpenSLX::ConfigDB->new;
+$configDB->connect();
+
+# fetch global-info 'next-nbd-server-port'
+ok(
+ my $globalInfo = $configDB->fetchGlobalInfo('next-nbd-server-port'),
+ 'fetch global-info'
+);
+is($globalInfo, '5000', 'global-info - value');
+
+# try to fetch a couple of non-existing global-infos
+is(
+ $configDB->fetchGlobalInfo(-1), undef,
+ 'global-info with id -1 should not exist'
+);
+is($configDB->fetchGlobalInfo('xxx'), undef,
+ 'global-info with id xxx should not exist');
+
+# change value of global-info and then fetch and check the new value
+ok($configDB->changeGlobalInfo('next-nbd-server-port', '5050'), 'changing global-info');
+is(
+ $configDB->fetchGlobalInfo('next-nbd-server-port'), '5050',
+ 'fetching changed global-info'
+);
+
+# changing a non-existing global-info should fail
+ok(
+ ! eval { $configDB->changeGlobalInfo('xxx', 'new-value') },
+ 'changing unknown global-info should fail'
+);
+
+$configDB->disconnect();
+
diff --git a/src/config-db/t/20-client_system_ref.t b/src/config-db/t/20-client_system_ref.t
new file mode 100644
index 00000000..93b86950
--- /dev/null
+++ b/src/config-db/t/20-client_system_ref.t
@@ -0,0 +1,208 @@
+use Test::More qw(no_plan);
+
+use strict;
+use warnings;
+
+use lib '/opt/openslx/lib';
+
+# basic init
+use OpenSLX::ConfigDB;
+
+my $configDB = OpenSLX::ConfigDB->new;
+$configDB->connect();
+
+# fetch clients & systems
+my @clients = sort { $a->{id} <=> $b->{id} } $configDB->fetchClientByFilter();
+is(@clients, 3, 'should have got 3 clients (default, 1 and 3)');
+my $defaultClient = shift @clients;
+my $client1 = shift @clients;
+my $client3 = shift @clients;
+
+my @systems = sort { $a->{id} <=> $b->{id} } $configDB->fetchSystemByFilter();
+is(@systems, 3, 'should have got 3 systems (default, 1 and 3)');
+my $defaultSystem = shift @systems;
+my $system1 = shift @systems;
+my $system3 = shift @systems;
+
+foreach my $client ($defaultClient, $client1, $client3) {
+ is(
+ my @systemIDs = $configDB->fetchSystemIDsOfClient($client->{id}),
+ 0, "client $client->{id} has no system-IDs yet"
+ );
+}
+
+foreach my $system ($defaultSystem, $system1, $system3) {
+ is(
+ my @clientIDs = $configDB->fetchClientIDsOfSystem($system->{id}),
+ 0, "system $system->{id} has no client-IDs yet"
+ );
+}
+
+ok(
+ $configDB->addSystemIDsToClient(1, [3]),
+ 'system-ID 3 has been associated to client 1'
+);
+is(
+ my @systemIDs = sort($configDB->fetchSystemIDsOfClient(0)),
+ 0, "default client should have no system-ID"
+);
+is(
+ @systemIDs = sort($configDB->fetchSystemIDsOfClient(1)),
+ 1, "client 1 should have one system-ID"
+);
+is($systemIDs[0], 3, "first system of client 1 should have ID 3");
+is(
+ @systemIDs = sort($configDB->fetchSystemIDsOfClient(3)),
+ 0, "client 3 should have no system-ID"
+);
+is(
+ my @clientIDs = sort($configDB->fetchClientIDsOfSystem(0)),
+ 0, "default system should have no client-IDs"
+);
+is(
+ @clientIDs = sort($configDB->fetchClientIDsOfSystem(1)),
+ 0, "system 1 should have no client-IDs"
+);
+is(
+ @clientIDs = sort($configDB->fetchClientIDsOfSystem(3)),
+ 1, "system 3 should have one client-ID"
+);
+is($clientIDs[0], 1, "first client of system 3 should have ID 1");
+
+ok(
+ $configDB->addSystemIDsToClient(3, [1,3,3,1,3]),
+ 'system-IDs 1 and 3 have been associated to client 3'
+);
+is(
+ @systemIDs = sort($configDB->fetchSystemIDsOfClient(0)),
+ 0, "default client should have no system-IDs"
+);
+is(
+ @systemIDs = sort($configDB->fetchSystemIDsOfClient(1)),
+ 1, "client 1 should have one system-ID"
+);
+is($systemIDs[0], 3, "first system of client 1 should have ID 3");
+is(
+ @systemIDs = sort($configDB->fetchSystemIDsOfClient(3)),
+ 2, "client 3 should have two system-IDs"
+);
+is($systemIDs[0], 1, "first system of client 3 should have ID 1");
+is($systemIDs[1], 3, "second system of client 3 should have ID 3");
+is(
+ @clientIDs = sort($configDB->fetchClientIDsOfSystem(0)),
+ 0, "default system should have no client-ID"
+);
+is(
+ @clientIDs = sort($configDB->fetchClientIDsOfSystem(1)),
+ 1, "system 1 should have one client-ID"
+);
+is($clientIDs[0], 3, "first client of system 1 should have ID 3");
+is(
+ @clientIDs = sort($configDB->fetchClientIDsOfSystem(3)),
+ 2, "system 3 should have two client-IDs"
+);
+is($clientIDs[0], 1, "first client of system 3 should have ID 1");
+is($clientIDs[1], 3, "second client of system 3 should have ID 3");
+
+ok(
+ $configDB->setClientIDsOfSystem(3, []),
+ 'client-IDs of system 3 have been set to empty array'
+);
+is(
+ @clientIDs = sort($configDB->fetchClientIDsOfSystem(3)),
+ 0, "system 3 should have no client-IDs"
+);
+is(
+ @systemIDs = sort($configDB->fetchSystemIDsOfClient(1)),
+ 0, "client 1 should have no system-IDs"
+);
+is(
+ @systemIDs = sort($configDB->fetchSystemIDsOfClient(3)),
+ 1, "client 3 should have one system-ID"
+);
+is($systemIDs[0], 1, "first system of client 3 should have ID 1");
+
+ok(
+ $configDB->addSystemIDsToClient(1, [0]),
+ 'associating the default system should have no effect'
+);
+is(
+ @systemIDs = sort($configDB->fetchSystemIDsOfClient(1)),
+ 0, "client 1 should still have no system-ID"
+);
+
+ok(
+ $configDB->removeClientIDsFromSystem(1, [1]),
+ 'removing an unassociated client-ID should have no effect'
+);
+is(
+ @clientIDs = sort($configDB->fetchClientIDsOfSystem(1)),
+ 1, "system 1 should have one client-ID"
+);
+ok(
+ $configDB->removeClientIDsFromSystem(1, [3]),
+ 'removing an associated client-ID should work'
+);
+is(
+ @clientIDs = sort($configDB->fetchClientIDsOfSystem(1)),
+ 0, "system 1 should have no more client-ID"
+);
+
+$configDB->addSystem({
+ 'name' => 'sys-4',
+ 'export_id' => 1,
+ 'comment' => 'shortlived',
+});
+ok(
+ $configDB->addClientIDsToSystem(4, [0]),
+ 'default client has been associated to system 4'
+);
+is(
+ @systemIDs = sort($configDB->fetchSystemIDsOfClient(0)),
+ 1, "default client should have one system-ID"
+);
+is($systemIDs[0], 4, "first system of default client should have ID 4");
+is(
+ @systemIDs = sort($configDB->fetchSystemIDsOfClient(1)),
+ 0, "client 1 should have no system-ID"
+);
+is(
+ @systemIDs = sort($configDB->fetchSystemIDsOfClient(3)),
+ 0, "client 3 should have no system-ID"
+);
+is(
+ @clientIDs = sort($configDB->fetchClientIDsOfSystem(0)),
+ 0, "default system should have no client-IDs"
+);
+is(
+ @clientIDs = sort($configDB->fetchClientIDsOfSystem(1)),
+ 0, "system 1 should have no client-ID"
+);
+is(
+ @clientIDs = sort($configDB->fetchClientIDsOfSystem(3)),
+ 0, "system 3 should have no client-IDs"
+);
+is(
+ @clientIDs = sort($configDB->fetchClientIDsOfSystem(4)),
+ 1, "system 4 should have one client-ID"
+);
+is($clientIDs[0], 0, "first client of system 4 should have ID 0");
+
+ok(
+ $configDB->removeSystemIDsFromClient(0, [6]),
+ 'removing an unassociated system-ID should have no effect'
+);
+is(
+ @clientIDs = sort($configDB->fetchSystemIDsOfClient(0)),
+ 1, "default client should have one system-ID"
+);
+ok(
+ $configDB->removeSystem(4),
+ 'removing a system should drop client associations, too'
+);
+is(
+ @clientIDs = sort($configDB->fetchSystemIDsOfClient(0)),
+ 0, "default client should have no more system-ID"
+);
+
+$configDB->disconnect();
diff --git a/src/config-db/t/21-group_system_ref.t b/src/config-db/t/21-group_system_ref.t
new file mode 100644
index 00000000..b643f7e0
--- /dev/null
+++ b/src/config-db/t/21-group_system_ref.t
@@ -0,0 +1,195 @@
+use Test::More qw(no_plan);
+
+use strict;
+use warnings;
+
+use lib '/opt/openslx/lib';
+
+# basic init
+use OpenSLX::ConfigDB;
+
+my $configDB = OpenSLX::ConfigDB->new;
+$configDB->connect();
+
+# fetch groups & systems
+my @groups = sort { $a->{id} <=> $b->{id} } $configDB->fetchGroupByFilter();
+is(@groups, 2, 'should have got 2 groups (1 and 3)');
+my $group1 = shift @groups;
+my $group3 = shift @groups;
+
+my @systems = sort { $a->{id} <=> $b->{id} } $configDB->fetchSystemByFilter();
+is(@systems, 3, 'should have got 3 systems (default, 1 and 3)');
+my $defaultSystem = shift @systems;
+my $system1 = shift @systems;
+my $system3 = shift @systems;
+
+foreach my $group ($group1, $group3) {
+ is(
+ my @systemIDs = $configDB->fetchSystemIDsOfGroup($group->{id}),
+ 0, "group $group->{id} has no system-IDs yet"
+ );
+}
+
+foreach my $system ($defaultSystem, $system1, $system3) {
+ is(
+ my @groupIDs = $configDB->fetchGroupIDsOfSystem($system->{id}),
+ 0, "system $system->{id} has no group-IDs yet"
+ );
+}
+
+ok(
+ $configDB->addSystemIDsToGroup(1, [3]),
+ 'system-ID 3 has been associated to group 1'
+);
+is(
+ my @systemIDs = sort($configDB->fetchSystemIDsOfGroup(1)),
+ 1, "group 1 should have one system-ID"
+);
+is($systemIDs[0], 3, "first system of group 1 should have ID 3");
+is(
+ @systemIDs = sort($configDB->fetchSystemIDsOfGroup(3)),
+ 0, "group 3 should have no system-ID"
+);
+is(
+ my @groupIDs = sort($configDB->fetchGroupIDsOfSystem(0)),
+ 0, "default system should have no group-IDs"
+);
+is(
+ @groupIDs = sort($configDB->fetchGroupIDsOfSystem(1)),
+ 0, "system 1 should have no group-IDs"
+);
+is(
+ @groupIDs = sort($configDB->fetchGroupIDsOfSystem(3)),
+ 1, "system 3 should have one group-ID"
+);
+is($groupIDs[0], 1, "first group of system 3 should have ID 1");
+
+ok(
+ $configDB->addSystemIDsToGroup(3, [1,3,3,1,3]),
+ 'system-IDs 1 and 3 have been associated to group 3'
+);
+is(
+ @systemIDs = sort($configDB->fetchSystemIDsOfGroup(1)),
+ 1, "group 1 should have one system-ID"
+);
+is($systemIDs[0], 3, "first system of group 1 should have ID 3");
+is(
+ @systemIDs = sort($configDB->fetchSystemIDsOfGroup(3)),
+ 2, "group 3 should have two system-IDs"
+);
+is($systemIDs[0], 1, "first system of group 3 should have ID 1");
+is($systemIDs[1], 3, "second system of group 3 should have ID 3");
+is(
+ @groupIDs = sort($configDB->fetchGroupIDsOfSystem(0)),
+ 0, "default system should have no group-ID"
+);
+is(
+ @groupIDs = sort($configDB->fetchGroupIDsOfSystem(1)),
+ 1, "system 1 should have one group-ID"
+);
+is($groupIDs[0], 3, "first group of system 1 should have ID 3");
+is(
+ @groupIDs = sort($configDB->fetchGroupIDsOfSystem(3)),
+ 2, "system 3 should have two group-IDs"
+);
+is($groupIDs[0], 1, "first group of system 3 should have ID 1");
+is($groupIDs[1], 3, "second group of system 3 should have ID 3");
+
+ok(
+ $configDB->setGroupIDsOfSystem(3, []),
+ 'group-IDs of system 3 have been set to empty array'
+);
+is(
+ @groupIDs = sort($configDB->fetchGroupIDsOfSystem(3)),
+ 0, "system 3 should have no group-IDs"
+);
+is(
+ @systemIDs = sort($configDB->fetchSystemIDsOfGroup(1)),
+ 0, "group 1 should have no more system-IDs"
+);
+is(
+ @systemIDs = sort($configDB->fetchSystemIDsOfGroup(3)),
+ 1, "group 3 should have one system-ID"
+);
+is($systemIDs[0], 1, "first system of group 3 should have ID 1");
+
+ok(
+ $configDB->addSystemIDsToGroup(1, [0]),
+ 'associating the default system should have no effect'
+);
+is(
+ @systemIDs = sort($configDB->fetchSystemIDsOfGroup(1)),
+ 0, "group 1 should still have no system-ID"
+);
+
+ok(
+ $configDB->removeGroupIDsFromSystem(1, [1]),
+ 'removing an unassociated group-ID should have no effect'
+);
+is(
+ @groupIDs = sort($configDB->fetchGroupIDsOfSystem(1)),
+ 1, "system 1 should have one group-ID"
+);
+ok(
+ $configDB->removeGroupIDsFromSystem(1, [3]),
+ 'removing an associated group-ID should work'
+);
+is(
+ @groupIDs = sort($configDB->fetchGroupIDsOfSystem(1)),
+ 0, "system 1 should have no more group-ID"
+);
+
+$configDB->addSystem({
+ 'name' => 'sys-5',
+ 'export_id' => 1,
+ 'comment' => 'shortlived',
+});
+ok(
+ $configDB->addGroupIDsToSystem(5, [3]),
+ 'default group has been associated to system 5'
+);
+is(
+ @systemIDs = sort($configDB->fetchSystemIDsOfGroup(1)),
+ 0, "group 1 should have no system-ID"
+);
+is(
+ @systemIDs = sort($configDB->fetchSystemIDsOfGroup(3)),
+ 1, "group 3 should have no system-ID"
+);
+is($systemIDs[0], 5, "first system of group 3 should have ID 5");
+is(
+ @groupIDs = sort($configDB->fetchGroupIDsOfSystem(0)),
+ 0, "default system should have no group-IDs"
+);
+is(
+ @groupIDs = sort($configDB->fetchGroupIDsOfSystem(1)),
+ 0, "system 1 should have no group-ID"
+);
+is(
+ @groupIDs = sort($configDB->fetchGroupIDsOfSystem(3)),
+ 0, "system 3 should have no group-IDs"
+);
+is(
+ @groupIDs = sort($configDB->fetchGroupIDsOfSystem(5)),
+ 1, "system 5 should have one group-ID"
+);
+is($groupIDs[0], 3, "first group of system 5 should have ID 3");
+
+ok(
+ $configDB->removeSystemIDsFromGroup(3, [6]),
+ 'removing an unassociated system-ID should have no effect'
+);
+is(
+ @groupIDs = sort($configDB->fetchSystemIDsOfGroup(3)),
+ 1, "group 3 should have one system-ID"
+);
+ok(
+ $configDB->removeSystem(5),
+ 'removing a system should drop group associations, too'
+);
+is(
+ @groupIDs = sort($configDB->fetchSystemIDsOfGroup(3)),
+ 0, "group 3 should have no more system-ID"
+);
+
+$configDB->disconnect();
diff --git a/src/config-db/t/22-group_client_ref.t b/src/config-db/t/22-group_client_ref.t
new file mode 100644
index 00000000..ff9d6ca7
--- /dev/null
+++ b/src/config-db/t/22-group_client_ref.t
@@ -0,0 +1,186 @@
+use Test::More qw(no_plan);
+
+use strict;
+use warnings;
+
+use lib '/opt/openslx/lib';
+
+# basic init
+use OpenSLX::ConfigDB;
+
+my $configDB = OpenSLX::ConfigDB->new;
+$configDB->connect();
+
+# fetch groups & clients
+my @groups = sort { $a->{id} <=> $b->{id} } $configDB->fetchGroupByFilter();
+is(@groups, 2, 'should have got 2 groups (1 and 3)');
+my $group1 = shift @groups;
+my $group3 = shift @groups;
+
+my @clients = sort { $a->{id} <=> $b->{id} } $configDB->fetchClientByFilter();
+is(@clients, 3, 'should have got 3 clients (default, 1 and 3)');
+my $defaultClient = shift @clients;
+my $client1 = shift @clients;
+my $client3 = shift @clients;
+
+foreach my $group ($group1, $group3) {
+ is(
+ my @clientIDs = $configDB->fetchClientIDsOfGroup($group->{id}),
+ 0, "group $group->{id} has no client-IDs yet"
+ );
+}
+
+foreach my $client ($defaultClient, $client1, $client3) {
+ is(
+ my @groupIDs = $configDB->fetchGroupIDsOfClient($client->{id}),
+ 0, "client $client->{id} has no group-IDs yet"
+ );
+}
+
+ok(
+ $configDB->addClientIDsToGroup(1, [3]),
+ 'client-ID 3 has been associated to group 1'
+);
+is(
+ my @clientIDs = sort($configDB->fetchClientIDsOfGroup(1)),
+ 1, "group 1 should have one client-ID"
+);
+is($clientIDs[0], 3, "first client of group 1 should have ID 3");
+is(
+ @clientIDs = sort($configDB->fetchClientIDsOfGroup(3)),
+ 0, "group 3 should have no client-ID"
+);
+is(
+ my @groupIDs = sort($configDB->fetchGroupIDsOfClient(0)),
+ 0, "default client should have no group-IDs"
+);
+is(
+ @groupIDs = sort($configDB->fetchGroupIDsOfClient(1)),
+ 0, "client 1 should have no group-IDs"
+);
+is(
+ @groupIDs = sort($configDB->fetchGroupIDsOfClient(3)),
+ 1, "client 3 should have one group-ID"
+);
+is($groupIDs[0], 1, "first group of client 3 should have ID 1");
+
+ok(
+ $configDB->addClientIDsToGroup(3, [1,3,3,1,3]),
+ 'client-IDs 1 and 3 have been associated to group 3'
+);
+is(
+ @clientIDs = sort($configDB->fetchClientIDsOfGroup(1)),
+ 1, "group 1 should have one client-ID"
+);
+is($clientIDs[0], 3, "first client of group 1 should have ID 3");
+is(
+ @clientIDs = sort($configDB->fetchClientIDsOfGroup(3)),
+ 2, "group 3 should have two client-IDs"
+);
+is($clientIDs[0], 1, "first client of group 3 should have ID 1");
+is($clientIDs[1], 3, "second client of group 3 should have ID 3");
+is(
+ @groupIDs = sort($configDB->fetchGroupIDsOfClient(0)),
+ 0, "default client should have no group-ID"
+);
+is(
+ @groupIDs = sort($configDB->fetchGroupIDsOfClient(1)),
+ 1, "client 1 should have one group-ID"
+);
+is($groupIDs[0], 3, "first group of client 1 should have ID 3");
+is(
+ @groupIDs = sort($configDB->fetchGroupIDsOfClient(3)),
+ 2, "client 3 should have two group-IDs"
+);
+is($groupIDs[0], 1, "first group of client 3 should have ID 1");
+is($groupIDs[1], 3, "second group of client 3 should have ID 3");
+
+ok(
+ $configDB->setGroupIDsOfClient(3, []),
+ 'group-IDs of client 3 have been set to empty array'
+);
+is(
+ @groupIDs = sort($configDB->fetchGroupIDsOfClient(3)),
+ 0, "client 3 should have no group-IDs"
+);
+is(
+ @clientIDs = sort($configDB->fetchClientIDsOfGroup(1)),
+ 0, "group 1 should have no more client-IDs"
+);
+is(
+ @clientIDs = sort($configDB->fetchClientIDsOfGroup(3)),
+ 1, "group 3 should have one client-ID"
+);
+is($clientIDs[0], 1, "first client of group 3 should have ID 1");
+
+ok(
+ $configDB->removeGroupIDsFromClient(1, [1]),
+ 'removing an unassociated group-ID should have no effect'
+);
+is(
+ @groupIDs = sort($configDB->fetchGroupIDsOfClient(1)),
+ 1, "client 1 should have one group-ID"
+);
+ok(
+ $configDB->removeGroupIDsFromClient(1, [3]),
+ 'removing an associated group-ID should work'
+);
+is(
+ @groupIDs = sort($configDB->fetchGroupIDsOfClient(1)),
+ 0, "client 1 should have no more group-ID"
+);
+
+$configDB->addClient({
+ 'name' => 'cli-4',
+ 'mac' => '01:01:01:02:02:02',
+ 'comment' => 'shortlived',
+});
+ok(
+ $configDB->addGroupIDsToClient(4, [3]),
+ 'default group has been associated to client 4'
+);
+is(
+ @clientIDs = sort($configDB->fetchClientIDsOfGroup(1)),
+ 0, "group 1 should have no client-ID"
+);
+is(
+ @clientIDs = sort($configDB->fetchClientIDsOfGroup(3)),
+ 1, "group 3 should have one client-ID"
+);
+is($clientIDs[0], 4, "first client of group 3 should have ID 1");
+is(
+ @groupIDs = sort($configDB->fetchGroupIDsOfClient(0)),
+ 0, "default client should have no group-IDs"
+);
+is(
+ @groupIDs = sort($configDB->fetchGroupIDsOfClient(1)),
+ 0, "client 1 should have no group-ID"
+);
+is(
+ @groupIDs = sort($configDB->fetchGroupIDsOfClient(3)),
+ 0, "client 3 should have no group-IDs"
+);
+is(
+ @groupIDs = sort($configDB->fetchGroupIDsOfClient(4)),
+ 1, "client 4 should have one group-ID"
+);
+is($groupIDs[0], 3, "first group of client 4 should have ID 3");
+
+ok(
+ $configDB->removeClientIDsFromGroup(3, [6]),
+ 'removing an unassociated client-ID should have no effect'
+);
+is(
+ @groupIDs = sort($configDB->fetchClientIDsOfGroup(3)),
+ 1, "group 3 should have one client-ID"
+);
+ok(
+ $configDB->removeClient(4),
+ 'removing a client should drop group associations, too'
+);
+is(
+ @groupIDs = sort($configDB->fetchClientIDsOfGroup(3)),
+ 0, "group 3 should have no more client-ID"
+);
+
+$configDB->disconnect();
diff --git a/src/config-db/t/25-attributes.t b/src/config-db/t/25-attributes.t
new file mode 100644
index 00000000..9662684c
--- /dev/null
+++ b/src/config-db/t/25-attributes.t
@@ -0,0 +1,677 @@
+use Test::More qw(no_plan);
+
+use strict;
+use warnings;
+
+use lib '/opt/openslx/lib';
+
+use Clone qw(clone);
+
+# basic init
+use OpenSLX::ConfigDB qw(:support);
+
+my $configDB = OpenSLX::ConfigDB->new;
+$configDB->connect();
+
+my $defaultAttrs = { # mostly copied from DBSchema
+ 'ramfs_fsmods' => undef,
+ 'ramfs_miscmods' => undef,
+ 'ramfs_nicmods' => 'forcedeth e1000 e100 tg3 via-rhine r8169 pcnet32',
+
+ 'automnt_dir' => undef,
+ 'automnt_src' => undef,
+ 'country' => 'de',
+ 'dm_allow_shutdown' => 'user',
+ 'hw_graphic' => undef,
+ 'hw_monitor' => undef,
+ 'hw_mouse' => undef,
+ 'late_dm' => 'no',
+ 'netbios_workgroup' => 'slx-network',
+ 'nis_domain' => undef,
+ 'nis_servers' => undef,
+ 'sane_scanner' => undef,
+ 'scratch' => undef,
+ 'slxgrp' => undef,
+ 'start_alsasound' => 'yes',
+ 'start_atd' => 'no',
+ 'start_cron' => 'no',
+ 'start_dreshal' => 'yes',
+ 'start_ntp' => 'initial',
+ 'start_nfsv4' => 'no',
+ 'start_printer' => 'no',
+ 'start_samba' => 'may',
+ 'start_snmp' => 'no',
+ 'start_sshd' => 'yes',
+ 'start_syslog' => 'yes',
+ 'start_x' => 'yes',
+ 'start_xdmcp' => 'kdm',
+ 'tex_enable' => 'no',
+ 'timezone' => 'Europe/Berlin',
+ 'tvout' => 'no',
+ 'vmware' => 'no',
+};
+ok(
+ $configDB->changeSystem(0, { attrs => $defaultAttrs } ),
+ 'attributes of default system have been set'
+);
+my $defaultSystem = $configDB->fetchSystemByID(0);
+
+my $system1 = $configDB->fetchSystemByID(1);
+my $sys1Attrs = {
+ 'ramfs_fsmods' => 'squashfs',
+ 'ramfs_nicmods' => 'forcedeth e1000 r8169',
+ 'start_x' => 'no',
+ 'start_xdmcp' => '',
+};
+ok(
+ $configDB->changeSystem(1, { attrs => $sys1Attrs } ),
+ 'attributes of system 1 have been set'
+);
+
+my $system3 = $configDB->fetchSystemByID(3);
+my $sys3Attrs = {
+ 'ramfs_fsmods' => '-4',
+ 'ramfs_miscmods' => '-3',
+ 'ramfs_nicmods' => '-2',
+
+ 'automnt_dir' => '1',
+ 'automnt_src' => '2',
+ 'country' => '3',
+ 'dm_allow_shutdown' => '4',
+ 'hw_graphic' => '5',
+ 'hw_monitor' => '6',
+ 'hw_mouse' => '7',
+ 'late_dm' => '8',
+ 'netbios_workgroup' => '9',
+ 'nis_domain' => '10',
+ 'nis_servers' => '11',
+ 'sane_scanner' => '12',
+ 'scratch' => '13',
+ 'slxgrp' => '14',
+ 'start_alsasound' => '15',
+ 'start_atd' => '16',
+ 'start_cron' => '17',
+ 'start_dreshal' => '18',
+ 'start_ntp' => '19',
+ 'start_nfsv4' => '20',
+ 'start_printer' => '21',
+ 'start_samba' => '22',
+ 'start_snmp' => '23',
+ 'start_sshd' => '24',
+ 'start_syslog' => '25',
+ 'start_x' => '26',
+ 'start_xdmcp' => '27',
+ 'tex_enable' => '28',
+ 'timezone' => '29',
+ 'tvout' => '30',
+ 'vmware' => '31',
+};
+ok(
+ $configDB->changeSystem(3, { attrs => $sys3Attrs } ),
+ 'attributes of system 3 have been set'
+);
+
+my $defaultClient = $configDB->fetchClientByID(0);
+my $defaultClientAttrs = {
+ # pretend the whole computer centre has been warped to London ;-)
+ 'timezone' => 'Europe/London',
+ # pretend we wanted to activate snmp globally (e.g. for testing)
+ 'start_snmp' => 'yes',
+};
+ok(
+ $configDB->changeClient(0, { attrs => $defaultClientAttrs } ),
+ 'attributes of default client have been set'
+);
+
+# check merging of default attributes, the order should be:
+# default system attributes overruled by system attributes overruled by
+# default client attributes:
+my $shouldBeAttrs1 = {
+ 'ramfs_fsmods' => 'squashfs',
+ 'ramfs_miscmods' => undef,
+ 'ramfs_nicmods' => 'forcedeth e1000 r8169',
+
+ 'automnt_dir' => undef,
+ 'automnt_src' => undef,
+ 'country' => 'de',
+ 'dm_allow_shutdown' => 'user',
+ 'hw_graphic' => undef,
+ 'hw_monitor' => undef,
+ 'hw_mouse' => undef,
+ 'late_dm' => 'no',
+ 'netbios_workgroup' => 'slx-network',
+ 'nis_domain' => undef,
+ 'nis_servers' => undef,
+ 'sane_scanner' => undef,
+ 'scratch' => undef,
+ 'slxgrp' => undef,
+ 'start_alsasound' => 'yes',
+ 'start_atd' => 'no',
+ 'start_cron' => 'no',
+ 'start_dreshal' => 'yes',
+ 'start_ntp' => 'initial',
+ 'start_nfsv4' => 'no',
+ 'start_printer' => 'no',
+ 'start_samba' => 'may',
+ 'start_snmp' => 'yes',
+ 'start_sshd' => 'yes',
+ 'start_syslog' => 'yes',
+ 'start_x' => 'no',
+ 'start_xdmcp' => '',
+ 'tex_enable' => 'no',
+ 'timezone' => 'Europe/London',
+ 'tvout' => 'no',
+ 'vmware' => 'no',
+};
+my $mergedSystem1 = $configDB->fetchSystemByID(1);
+ok(
+ $configDB->mergeDefaultAttributesIntoSystem($mergedSystem1),
+ 'merging default attributes into system 1'
+);
+foreach my $key (sort keys %$shouldBeAttrs1) {
+ is(
+ $mergedSystem1->{attrs}->{$key}, $shouldBeAttrs1->{$key},
+ "checking merged attribute $key for system 1"
+ );
+}
+
+# check merging code for completeness (using all attributes):
+my $shouldBeAttrs3 = {
+ 'ramfs_fsmods' => '-4',
+ 'ramfs_miscmods' => '-3',
+ 'ramfs_nicmods' => '-2',
+
+ 'automnt_dir' => '1',
+ 'automnt_src' => '2',
+ 'country' => '3',
+ 'dm_allow_shutdown' => '4',
+ 'hw_graphic' => '5',
+ 'hw_monitor' => '6',
+ 'hw_mouse' => '7',
+ 'late_dm' => '8',
+ 'netbios_workgroup' => '9',
+ 'nis_domain' => '10',
+ 'nis_servers' => '11',
+ 'sane_scanner' => '12',
+ 'scratch' => '13',
+ 'slxgrp' => '14',
+ 'start_alsasound' => '15',
+ 'start_atd' => '16',
+ 'start_cron' => '17',
+ 'start_dreshal' => '18',
+ 'start_ntp' => '19',
+ 'start_nfsv4' => '20',
+ 'start_printer' => '21',
+ 'start_samba' => '22',
+ 'start_snmp' => 'yes',
+ 'start_sshd' => '24',
+ 'start_syslog' => '25',
+ 'start_x' => '26',
+ 'start_xdmcp' => '27',
+ 'tex_enable' => '28',
+ 'timezone' => 'Europe/London',
+ 'tvout' => '30',
+ 'vmware' => '31',
+};
+my $mergedSystem3 = $configDB->fetchSystemByID(3);
+ok(
+ $configDB->mergeDefaultAttributesIntoSystem($mergedSystem3),
+ 'merging default attributes into system 3'
+);
+foreach my $key (sort keys %$shouldBeAttrs3) {
+ is(
+ $mergedSystem3->{attrs}->{$key}, $shouldBeAttrs3->{$key},
+ "checking merged attribute $key for system 3"
+ );
+}
+
+# setup client / group relations
+my $group1 = $configDB->fetchGroupByID(1);
+my $group1Attrs = {
+ 'priority' => '50',
+ # this group of clients is connected via underwater cable ...
+ 'timezone' => 'America/New_York',
+ # ... and use a local scratch partition
+ 'scratch' => '/dev/sdd1',
+ # the following should be a noop (as that attribute is system-specific)
+# 'ramfs_nicmods' => 'e1000',
+};
+ok(
+ $configDB->changeGroup(1, { attrs => $group1Attrs } ),
+ 'attributes of group 1 have been set'
+);
+my $group3 = $configDB->fetchGroupByID(3);
+my $group3Attrs = {
+ 'priority' => '30',
+ # this specific client group is older and thus has a different scratch
+ 'scratch' => '/dev/hdd1',
+ 'vmware' => 'yes',
+};
+ok(
+ $configDB->changeGroup(3, { attrs => $group3Attrs } ),
+ 'attributes of group 3 have been set'
+);
+my $client1 = $configDB->fetchClientByID(1);
+my $client1Attrs = {
+ # this specific client uses yet another local scratch partition
+ 'scratch' => '/dev/sdx3',
+};
+ok(
+ $configDB->changeClient(1, { attrs => $client1Attrs } ),
+ 'attributes of client 1 have been set'
+);
+ok(
+ $configDB->setGroupIDsOfClient(1, [1]),
+ 'group-IDs of client 1 have been set'
+);
+ok(
+ $configDB->setGroupIDsOfClient(3, []),
+ 'group-IDs of client 3 have been set'
+);
+
+# check merging of attributes into client, the order should be:
+# default client attributes overruled by group attributes (ordered by priority)
+# overruled by specific client attributes:
+$shouldBeAttrs1 = {
+ 'ramfs_fsmods' => undef,
+ 'ramfs_miscmods' => undef,
+ 'ramfs_nicmods' => undef,
+
+ 'automnt_dir' => undef,
+ 'automnt_src' => undef,
+ 'country' => undef,
+ 'dm_allow_shutdown' => undef,
+ 'hw_graphic' => undef,
+ 'hw_monitor' => undef,
+ 'hw_mouse' => undef,
+ 'late_dm' => undef,
+ 'netbios_workgroup' => undef,
+ 'nis_domain' => undef,
+ 'nis_servers' => undef,
+ 'sane_scanner' => undef,
+ 'scratch' => '/dev/sdx3',
+ 'slxgrp' => undef,
+ 'start_alsasound' => undef,
+ 'start_atd' => undef,
+ 'start_cron' => undef,
+ 'start_dreshal' => undef,
+ 'start_ntp' => undef,
+ 'start_nfsv4' => undef,
+ 'start_printer' => undef,
+ 'start_samba' => undef,
+ 'start_snmp' => 'yes',
+ 'start_sshd' => undef,
+ 'start_syslog' => undef,
+ 'start_x' => undef,
+ 'start_xdmcp' => undef,
+ 'tex_enable' => undef,
+ 'timezone' => 'America/New_York',
+ 'tvout' => undef,
+ 'vmware' => undef,
+};
+my $mergedClient1 = $configDB->fetchClientByID(1);
+ok(
+ $configDB->mergeDefaultAndGroupAttributesIntoClient($mergedClient1),
+ 'merging default and group attributes into client 1'
+);
+foreach my $key (sort keys %$shouldBeAttrs1) {
+ is(
+ $mergedClient1->{attrs}->{$key}, $shouldBeAttrs1->{$key},
+ "checking merged attribute $key for client 1"
+ );
+}
+
+$shouldBeAttrs3 = {
+ 'ramfs_fsmods' => undef,
+ 'ramfs_miscmods' => undef,
+ 'ramfs_nicmods' => undef,
+
+ 'automnt_dir' => undef,
+ 'automnt_src' => undef,
+ 'country' => undef,
+ 'dm_allow_shutdown' => undef,
+ 'hw_graphic' => undef,
+ 'hw_monitor' => undef,
+ 'hw_mouse' => undef,
+ 'late_dm' => undef,
+ 'netbios_workgroup' => undef,
+ 'nis_domain' => undef,
+ 'nis_servers' => undef,
+ 'sane_scanner' => undef,
+ 'scratch' => undef,
+ 'slxgrp' => undef,
+ 'start_alsasound' => undef,
+ 'start_atd' => undef,
+ 'start_cron' => undef,
+ 'start_dreshal' => undef,
+ 'start_ntp' => undef,
+ 'start_nfsv4' => undef,
+ 'start_printer' => undef,
+ 'start_samba' => undef,
+ 'start_snmp' => 'yes',
+ 'start_sshd' => undef,
+ 'start_syslog' => undef,
+ 'start_x' => undef,
+ 'start_xdmcp' => undef,
+ 'tex_enable' => undef,
+ 'timezone' => 'Europe/London',
+ 'tvout' => undef,
+ 'vmware' => undef,
+};
+
+# remove all attributes from client 3
+$configDB->changeClient(3, { attrs => {} } );
+
+my $mergedClient3 = $configDB->fetchClientByID(3);
+ok(
+ $configDB->mergeDefaultAndGroupAttributesIntoClient($mergedClient3),
+ 'merging default and group attributes into client 3'
+);
+foreach my $key (sort keys %$shouldBeAttrs1) {
+ is(
+ $mergedClient3->{attrs}->{$key}, $shouldBeAttrs3->{$key},
+ "checking merged attribute $key for client 3"
+ );
+}
+
+# now associate default client with group 3 and try again
+ok(
+ $configDB->setGroupIDsOfClient(0, [3]),
+ 'group-IDs of default client have been set'
+);
+$shouldBeAttrs1 = {
+ 'ramfs_fsmods' => undef,
+ 'ramfs_miscmods' => undef,
+ 'ramfs_nicmods' => undef,
+
+ 'automnt_dir' => undef,
+ 'automnt_src' => undef,
+ 'country' => undef,
+ 'dm_allow_shutdown' => undef,
+ 'hw_graphic' => undef,
+ 'hw_monitor' => undef,
+ 'hw_mouse' => undef,
+ 'late_dm' => undef,
+ 'netbios_workgroup' => undef,
+ 'nis_domain' => undef,
+ 'nis_servers' => undef,
+ 'sane_scanner' => undef,
+ 'scratch' => '/dev/sdx3',
+ 'slxgrp' => undef,
+ 'start_alsasound' => undef,
+ 'start_atd' => undef,
+ 'start_cron' => undef,
+ 'start_dreshal' => undef,
+ 'start_ntp' => undef,
+ 'start_nfsv4' => undef,
+ 'start_printer' => undef,
+ 'start_samba' => undef,
+ 'start_snmp' => 'yes',
+ 'start_sshd' => undef,
+ 'start_syslog' => undef,
+ 'start_x' => undef,
+ 'start_xdmcp' => undef,
+ 'tex_enable' => undef,
+ 'timezone' => 'America/New_York',
+ 'tvout' => undef,
+ 'vmware' => 'yes',
+};
+$mergedClient1 = $configDB->fetchClientByID(1);
+ok(
+ $configDB->mergeDefaultAndGroupAttributesIntoClient($mergedClient1),
+ 'merging default and group attributes into client 1'
+);
+foreach my $key (sort keys %$shouldBeAttrs1) {
+ is(
+ $mergedClient1->{attrs}->{$key}, $shouldBeAttrs1->{$key},
+ "checking merged attribute $key for client 1"
+ );
+}
+
+$shouldBeAttrs3 = {
+ 'ramfs_fsmods' => undef,
+ 'ramfs_miscmods' => undef,
+ 'ramfs_nicmods' => undef,
+
+ 'automnt_dir' => undef,
+ 'automnt_src' => undef,
+ 'country' => undef,
+ 'dm_allow_shutdown' => undef,
+ 'hw_graphic' => undef,
+ 'hw_monitor' => undef,
+ 'hw_mouse' => undef,
+ 'late_dm' => undef,
+ 'netbios_workgroup' => undef,
+ 'nis_domain' => undef,
+ 'nis_servers' => undef,
+ 'sane_scanner' => undef,
+ 'scratch' => '/dev/hdd1',
+ 'slxgrp' => undef,
+ 'start_alsasound' => undef,
+ 'start_atd' => undef,
+ 'start_cron' => undef,
+ 'start_dreshal' => undef,
+ 'start_ntp' => undef,
+ 'start_nfsv4' => undef,
+ 'start_printer' => undef,
+ 'start_samba' => undef,
+ 'start_snmp' => 'yes',
+ 'start_sshd' => undef,
+ 'start_syslog' => undef,
+ 'start_x' => undef,
+ 'start_xdmcp' => undef,
+ 'tex_enable' => undef,
+ 'timezone' => 'Europe/London',
+ 'tvout' => undef,
+ 'vmware' => 'yes',
+};
+$mergedClient3 = $configDB->fetchClientByID(3);
+ok(
+ $configDB->mergeDefaultAndGroupAttributesIntoClient($mergedClient3),
+ 'merging default and group attributes into client 3'
+);
+foreach my $key (sort keys %$shouldBeAttrs1) {
+ is(
+ $mergedClient3->{attrs}->{$key}, $shouldBeAttrs3->{$key},
+ "checking merged attribute $key for client 3"
+ );
+}
+
+# finally we merge systems into clients and check the outcome of that
+my $fullMerge11 = clone($mergedClient1);
+ok(
+ mergeAttributes($fullMerge11, $mergedSystem1),
+ 'merging system 1 into client 1'
+);
+my $shouldBeAttrs11 = {
+ 'ramfs_fsmods' => 'squashfs',
+ 'ramfs_miscmods' => undef,
+ 'ramfs_nicmods' => 'forcedeth e1000 r8169',
+
+ 'automnt_dir' => undef,
+ 'automnt_src' => undef,
+ 'country' => 'de',
+ 'dm_allow_shutdown' => 'user',
+ 'hw_graphic' => undef,
+ 'hw_monitor' => undef,
+ 'hw_mouse' => undef,
+ 'late_dm' => 'no',
+ 'netbios_workgroup' => 'slx-network',
+ 'nis_domain' => undef,
+ 'nis_servers' => undef,
+ 'sane_scanner' => undef,
+ 'scratch' => '/dev/sdx3',
+ 'slxgrp' => undef,
+ 'start_alsasound' => 'yes',
+ 'start_atd' => 'no',
+ 'start_cron' => 'no',
+ 'start_dreshal' => 'yes',
+ 'start_ntp' => 'initial',
+ 'start_nfsv4' => 'no',
+ 'start_printer' => 'no',
+ 'start_samba' => 'may',
+ 'start_snmp' => 'yes',
+ 'start_sshd' => 'yes',
+ 'start_syslog' => 'yes',
+ 'start_x' => 'no',
+ 'start_xdmcp' => '',
+ 'tex_enable' => 'no',
+ 'timezone' => 'America/New_York',
+ 'tvout' => 'no',
+ 'vmware' => 'yes',
+};
+foreach my $key (sort keys %$shouldBeAttrs11) {
+ is(
+ $fullMerge11->{attrs}->{$key}, $shouldBeAttrs11->{$key},
+ "checking merged attribute $key for client 1 / system 1"
+ );
+}
+
+my $fullMerge31 = clone($mergedClient3);
+ok(
+ mergeAttributes($fullMerge31, $mergedSystem1),
+ 'merging system 1 into client 3'
+);
+my $shouldBeAttrs31 = {
+ 'ramfs_fsmods' => 'squashfs',
+ 'ramfs_miscmods' => undef,
+ 'ramfs_nicmods' => 'forcedeth e1000 r8169',
+
+ 'automnt_dir' => undef,
+ 'automnt_src' => undef,
+ 'country' => 'de',
+ 'dm_allow_shutdown' => 'user',
+ 'hw_graphic' => undef,
+ 'hw_monitor' => undef,
+ 'hw_mouse' => undef,
+ 'late_dm' => 'no',
+ 'netbios_workgroup' => 'slx-network',
+ 'nis_domain' => undef,
+ 'nis_servers' => undef,
+ 'sane_scanner' => undef,
+ 'scratch' => '/dev/hdd1',
+ 'slxgrp' => undef,
+ 'start_alsasound' => 'yes',
+ 'start_atd' => 'no',
+ 'start_cron' => 'no',
+ 'start_dreshal' => 'yes',
+ 'start_ntp' => 'initial',
+ 'start_nfsv4' => 'no',
+ 'start_printer' => 'no',
+ 'start_samba' => 'may',
+ 'start_snmp' => 'yes',
+ 'start_sshd' => 'yes',
+ 'start_syslog' => 'yes',
+ 'start_x' => 'no',
+ 'start_xdmcp' => '',
+ 'tex_enable' => 'no',
+ 'timezone' => 'Europe/London',
+ 'tvout' => 'no',
+ 'vmware' => 'yes',
+};
+foreach my $key (sort keys %$shouldBeAttrs31) {
+ is(
+ $fullMerge31->{attrs}->{$key}, $shouldBeAttrs31->{$key},
+ "checking merged attribute $key for client 3 / system 1"
+ );
+}
+
+my $fullMerge13 = clone($mergedClient1);
+ok(
+ mergeAttributes($fullMerge13, $mergedSystem3),
+ 'merging system 3 into client 1'
+);
+my $shouldBeAttrs13 = {
+ 'ramfs_fsmods' => '-4',
+ 'ramfs_miscmods' => '-3',
+ 'ramfs_nicmods' => '-2',
+
+ 'automnt_dir' => '1',
+ 'automnt_src' => '2',
+ 'country' => '3',
+ 'dm_allow_shutdown' => '4',
+ 'hw_graphic' => '5',
+ 'hw_monitor' => '6',
+ 'hw_mouse' => '7',
+ 'late_dm' => '8',
+ 'netbios_workgroup' => '9',
+ 'nis_domain' => '10',
+ 'nis_servers' => '11',
+ 'sane_scanner' => '12',
+ 'scratch' => '/dev/sdx3',
+ 'slxgrp' => '14',
+ 'start_alsasound' => '15',
+ 'start_atd' => '16',
+ 'start_cron' => '17',
+ 'start_dreshal' => '18',
+ 'start_ntp' => '19',
+ 'start_nfsv4' => '20',
+ 'start_printer' => '21',
+ 'start_samba' => '22',
+ 'start_snmp' => 'yes',
+ 'start_sshd' => '24',
+ 'start_syslog' => '25',
+ 'start_x' => '26',
+ 'start_xdmcp' => '27',
+ 'tex_enable' => '28',
+ 'timezone' => 'America/New_York',
+ 'tvout' => '30',
+ 'vmware' => 'yes',
+};
+foreach my $key (sort keys %$shouldBeAttrs13) {
+ is(
+ $fullMerge13->{attrs}->{$key}, $shouldBeAttrs13->{$key},
+ "checking merged attribute $key for client 1 / system 3"
+ );
+}
+
+my $fullMerge33 = clone($mergedClient3);
+ok(
+ mergeAttributes($fullMerge33, $mergedSystem3),
+ 'merging system 3 into client 3'
+);
+my $shouldBeAttrs33 = {
+ 'ramfs_fsmods' => '-4',
+ 'ramfs_miscmods' => '-3',
+ 'ramfs_nicmods' => '-2',
+
+ 'automnt_dir' => '1',
+ 'automnt_src' => '2',
+ 'country' => '3',
+ 'dm_allow_shutdown' => '4',
+ 'hw_graphic' => '5',
+ 'hw_monitor' => '6',
+ 'hw_mouse' => '7',
+ 'late_dm' => '8',
+ 'netbios_workgroup' => '9',
+ 'nis_domain' => '10',
+ 'nis_servers' => '11',
+ 'sane_scanner' => '12',
+ 'scratch' => '/dev/hdd1',
+ 'slxgrp' => '14',
+ 'start_alsasound' => '15',
+ 'start_atd' => '16',
+ 'start_cron' => '17',
+ 'start_dreshal' => '18',
+ 'start_ntp' => '19',
+ 'start_nfsv4' => '20',
+ 'start_printer' => '21',
+ 'start_samba' => '22',
+ 'start_snmp' => 'yes',
+ 'start_sshd' => '24',
+ 'start_syslog' => '25',
+ 'start_x' => '26',
+ 'start_xdmcp' => '27',
+ 'tex_enable' => '28',
+ 'timezone' => 'Europe/London',
+ 'tvout' => '30',
+ 'vmware' => 'yes',
+};
+foreach my $key (sort keys %$shouldBeAttrs33) {
+ is(
+ $fullMerge33->{attrs}->{$key}, $shouldBeAttrs33->{$key},
+ "checking merged attribute $key for client 3 / system 3"
+ );
+}
+
+$configDB->disconnect();
diff --git a/src/config-db/t/29-transaction.t b/src/config-db/t/29-transaction.t
new file mode 100644
index 00000000..1f1566bf
--- /dev/null
+++ b/src/config-db/t/29-transaction.t
@@ -0,0 +1,58 @@
+use Test::More qw(no_plan);
+
+use strict;
+use warnings;
+
+use lib '/opt/openslx/lib';
+
+# basic init
+use OpenSLX::ConfigDB;
+
+my $configDB = OpenSLX::ConfigDB->new;
+$configDB->connect();
+
+my @vendorOSes = $configDB->fetchVendorOSByFilter();
+my @exports = $configDB->fetchExportByFilter();
+my @systems = $configDB->fetchSystemByFilter();
+my @clients = $configDB->fetchClientByFilter();
+my @groups = $configDB->fetchGroupByFilter();
+
+ok($configDB->startTransaction(), 'starting a transaction');
+
+ok($configDB->emptyDatabase(), 'emptying the DB');
+
+ok($configDB->rollbackTransaction(), 'rolling back the transaction');
+
+my @vendorOSes2 = $configDB->fetchVendorOSByFilter();
+my @exports2 = $configDB->fetchExportByFilter();
+my @systems2 = $configDB->fetchSystemByFilter();
+my @clients2 = $configDB->fetchClientByFilter();
+my @groups2 = $configDB->fetchGroupByFilter();
+
+is(
+ scalar @vendorOSes2, scalar @vendorOSes, "should still have all vendor-OSes"
+);
+is(scalar @exports2, scalar @exports, "should still have all exports");
+is(scalar @systems2, scalar @systems, "should still have all systems");
+is(scalar @clients2, scalar @clients, "should still have all clients");
+is(scalar @groups2, scalar @groups, "should still have all groups");
+
+ok($configDB->startTransaction(), 'starting a transaction');
+
+ok($configDB->emptyDatabase(), 'emptying the DB');
+
+ok($configDB->commitTransaction(), 'committing the transaction');
+
+my @vendorOSes3 = $configDB->fetchVendorOSByFilter();
+my @exports3 = $configDB->fetchExportByFilter();
+my @systems3 = $configDB->fetchSystemByFilter();
+my @clients3 = $configDB->fetchClientByFilter();
+my @groups3 = $configDB->fetchGroupByFilter();
+
+is(scalar @vendorOSes3, 0, "should have no vendor-OSes");
+is(scalar @exports3, 0, "should have no exports");
+is(scalar @systems3, 1, "should have one system (default)");
+is(scalar @clients3, 1, "should have one client (default)");
+is(scalar @groups3, 0, "should have no groups");
+
+$configDB->disconnect();
diff --git a/src/config-db/t/run-all-tests.pl b/src/config-db/t/run-all-tests.pl
new file mode 100755
index 00000000..8fb351c7
--- /dev/null
+++ b/src/config-db/t/run-all-tests.pl
@@ -0,0 +1,36 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+
+use Test::Harness;
+
+# add the development paths to perl's search path for modules:
+use FindBin;
+use lib "$FindBin::RealBin/../";
+use lib "$FindBin::RealBin/../../lib";
+
+chdir "$FindBin::RealBin" or die "unable to chdir to $FindBin::RealBin! ($!)\n";
+
+use OpenSLX::Basics;
+
+use OpenSLX::MetaDB::SQLite;
+
+# make sure a specific test-db will be used
+$cmdlineConfig{'private-path'} = $ENV{SLX_PRIVATE_PATH} = '/tmp/slx-db-test';
+$cmdlineConfig{'db-name'} = $ENV{SLX_DB_NAME} = 'slx-test';
+$cmdlineConfig{'db-type'} = $ENV{SLX_DB_TYPE} = 'SQLite';
+
+openslxInit();
+
+$Test::Harness::Verbose = 1 if $openslxConfig{'log-level'};
+
+# remove the test-db if it already exists
+my $metaDB = OpenSLX::MetaDB::SQLite->new();
+if ($metaDB->databaseExists()) {
+ print "removing leftovers of slx-test-db\n";
+ $metaDB->dropDatabase();
+}
+runtests(glob("*.t"));
+
+$metaDB->dropDatabase();
diff --git a/src/initramfs/distro-specs/debian/functions-4.0 b/src/initramfs/distro-specs/debian/functions-4.0
new file mode 100644
index 00000000..97be5342
--- /dev/null
+++ b/src/initramfs/distro-specs/debian/functions-4.0
@@ -0,0 +1,14 @@
+# Copyright (c) 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# Configuration script for Debian Edge (4.1) to setup linux stateless clients
+# (executed within initial ramfs)
+
+# nothing changed yet from default
diff --git a/src/initramfs/distro-specs/debian/functions-default b/src/initramfs/distro-specs/debian/functions-default
new file mode 100644
index 00000000..15639a2d
--- /dev/null
+++ b/src/initramfs/distro-specs/debian/functions-default
@@ -0,0 +1,209 @@
+# Copyright (c) 2003..2006 - RZ Uni Freiburg
+# Copyright (c) 2007..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# Configuration script for general Debian distributions to setup linux
+# stateless clients (included within initial ramfs)
+
+# distro specific configuration variables used in the setup functions
+# (formerly done via config-*, these variables are disputable ...)
+# D_DIRINBINDMNT - lists of directories to be created in bind mounted rw part
+# of the client filesystem
+# D_RODIRSINRW - ReadOnly Directories in RW part of filesystem to save on
+# TempFS usage
+# D_DIRINDXS - directories in client filesystem which should be present anyhow
+D_BINDMPTS="tmp root home"
+D_DIRINBINDMNT="/var/run /var/log /var/tmp /var/lib/gdm /etc/X11"
+D_RODIRSINRW="etc/gconf etc/X11/xkb /var/lib/texmf /var/cache/fontconfig \
+/var/lib/dpkg"
+D_DIRINDXS="/var/X11R6/compose-cache \
+/var/run/sysconfig/tmp /var/adm /var/lib/rpm /var/lib/nobody \
+/var/lib/pam_devperm /var/lib/bluetooth \
+/var/lib/texmf /var/lib/nfs/sm \
+/var/lib/misc /var/lib/acpi /var/spool/cron \
+/var/lock/subsys/sysconfig"
+
+# empty functions are defined at the beginning of /etc/functions
+
+# distro specific stuff to initialize
+preinit () {
+:
+}
+
+# distro specific function called from servconfig script
+config_distro () {
+ # clean the runlevel directories which will be populated by the stage3 setup
+ for dir in rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rcS.d ; do
+ rm -rf /mnt/etc/${dir}/*
+ done
+ # add the halt link to the 0 and 6 runlevel directories
+ ln -sf ../init.d/halt /mnt/etc/rc0.d/S90halt
+ ln -sf ../init.d/reboot /mnt/etc/rc6.d/S90reboot
+
+ # remove annoying udev rule set for changing eth interface
+ # fixme: not that simple, see ticket 187
+ #rm /mnt/etc/udev/rules.d/*persistent-net.rules >/dev/null 2>&1
+
+ # set default runlevel
+ sed -e "s/.*initdefault/id:3:initdefault/" -i /mnt/etc/inittab
+
+ # create needed auxiliary directories in (/mnt)/var,/etc,...
+ testmkd /mnt/var/run/screens root:utmp 0755
+
+ # add the slx specific path (/var/opt/openslx/bin) to the PATH variable
+ echo -e "# stuff generated by $0 (out of InitRamFS written $date)\n\
+export PATH=\"\$PATH:/var/opt/openslx/bin\"" >>/mnt/etc/profile
+
+ # check for inittab file
+ #test -f /mnt/etc/inittab || error "$df_erritab"
+}
+
+# initial (boot time) runlevel scripts
+initial_boot () {
+ local count=10
+ # boot.slx is a special runlevel script generated within initialramfs which
+ # should be executed before the normal runlevel scripts. Proper shutdown is
+ # not needed!?
+ for i in mountkernfs.sh mountvirtfs boot.slx udev procps.sh bootlogd \
+ $D_SPLASHY keymap.sh hwclock.sh sudo dbus-1; do
+ count=$(($count + 1))
+ [ $DEBUGLEVEL -ge 2 ] && echo "boot-runlevelscript $i"
+ ln -sf /etc/init.d/$i /mnt/etc/rcS.d/S${count}$i
+ done
+}
+
+# linking runlevel scripts
+rllinker () {
+ local script="$1"
+ local start="$2"
+ local stop="$3"
+ # empty runlevel links - decision on running certain services is passed via
+ # configuration or enabled through plugins
+ for i in rc2.d/K$stop$script rc3.d/K$stop$script \
+ rc2.d/S$start$script rc3.d/S$start$script ; do
+ if ! [ -f /mnt/etc/init.d/$script ]; then
+ echo "Target `pwd`../$script does not exist. Skipping links"
+ break
+ else
+ ln -sf ../init.d/$script /mnt/etc/$i
+ echo "Linked $script"
+ fi
+ done
+}
+
+# make a runlevel script
+d_mkrlscript () {
+ local switch=$1
+ local name=$2
+ local info=$3
+ case "$1" in
+ init)
+ echo -e "#!/bin/sh\n# skeleton of /etc/init.d/$name created \
+by $0\n# after you applied changes to the creation scripts you have to \
+rerun\n# the mkdxsinitrd script to get them applied\n\
+. /lib/lsb/init-functions\ncase \"\$1\" in\n start)\n\
+\tlog_begin_msg \"${info}\"" >>/mnt/etc/init.d/${name}
+ chmod u+x /mnt/etc/init.d/${name}
+ ;;
+ entry)
+ echo -e "\t${info}" >>/mnt/etc/init.d/${name}
+ ;;
+ close)
+ echo -e "\tlog_end_msg \$?\n\t;;\n stop)\n\tlog_end_msg \$?\n\t;;\
+ \nesac\nexit 0" >>/mnt/etc/init.d/${name}
+ ;;
+ esac
+}
+
+# group of functions for the normal runlevels - first parameter is start
+# second stop
+# function for ntp configuration
+config_ntp () {
+ if [ -f /mnt/etc/init.d/ntp -a "x$start_ntp" != "xno" ] ; then
+ echo -e "ntp:x:74:65534:NTP daemon:/var/lib/ntp:/bin/false" \
+ >>/mnt/etc/passwd
+ testmkd /mnt/var/lib/ntp/var/run/ntp
+ rllinker "ntp" "07" "14"
+ fi
+}
+
+# function for atd
+config_atd () {
+ if [ "x$start_atd" = "xyes" ]; then
+ # fixme!! needed? Fix permissions
+ #testmkd /mnt/var/spool/cron/atjobs daemon:daemon
+ #testmkd /mnt/var/spool/cron/atspool daemon:daemon
+ rllinker "atd" "89" "01"
+fi
+}
+
+# function for configuration of cron services
+config_cron () {
+ if [ "x$start_cron" = "xyes" ] ; then
+ if [ -f /mnt/etc/init.d/cron ] ; then
+ rllinker "cron" "89" "01"
+ testmkd /mnt/var/spool/cron/crontabs root:crontab
+ echo -e "# /etc/crontab - file generated by $0:\n\
+#\t$date\nSHELL=/bin/sh\nPATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin\
+\nMAILTO=\n-*/15 * * * *\troot\ttest -x /usr/lib/cron/run-crons && \
+/usr/lib/cron/run-crons >/dev/null 2>&1\n" >/mnt/etc/crontab
+ else
+ error "$df_errcron" nonfatal
+ fi
+ fi
+}
+
+# syslog service
+config_syslog () {
+ if [ "x$start_syslog" != "xno" ] ; then
+ : # fixme: handled by plugin in the future!
+ fi
+}
+
+# secure shell service
+config_sshd () {
+ if [ "x$start_sshd" = "xyes" ] ; then
+ if [ -f /mnt/etc/init.d/ssh ] ; then
+ rllinker "ssh" "20" "02"
+ fi
+ fi
+}
+
+# snmp agent for remote monitoring
+config_snmp () {
+ if [ "x$start_snmp" = "xyes" ] ; then
+ if [ -f /mnt/etc/init.d/snmpd ] ; then
+ rllinker "snmpd" "30" "03"
+ testmkd /mnt/var/lib/net-snmp >/dev/null 2>&1
+ fi
+ # fixme!!
+ # write service monitor depending on services started
+ fi
+}
+
+# localization like consolefont and language
+dlocale () {
+ # console font setting program not available in Debian 4!?
+ d_mkrlscript entry boot.slx "#setfont ${CONSOLE_FONT} >${LOGFILE} 2>&1"
+ # fixme!! check for proper operation
+ # sed -e "s,LANGUAGE=.*,LANGUAGE=\"${LANG}\" # set within initramfs," \
+ # -e "s,LANG=.*,LANG=\"${LANG}\" # set within initramfs," \
+ # -i /mnt/etc/environment
+ sed -e "s,LANG=.*,LANG=\"${LANG}\," # set within initramfs," \
+ -i /mnt/etc/default/locale
+}
+
+# configure hal, dbus, resmgr and services like that
+config_dreshal () {
+ if [ "x$start_dreshal" = "xyes" ]; then
+ :
+ fi
+}
+
diff --git a/src/initramfs/distro-specs/scilin/functions-4.7 b/src/initramfs/distro-specs/scilin/functions-4.7
new file mode 100644
index 00000000..e3ffe443
--- /dev/null
+++ b/src/initramfs/distro-specs/scilin/functions-4.7
@@ -0,0 +1,15 @@
+# Copyright (c) 2009 - RZ Uni Freiburg
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# Configuration script for Scientific Linux (4.7) to setup linux stateless
+# clients (executed within initial ramfs)
+
+# nothing changed yet from default
+
diff --git a/src/initramfs/distro-specs/scilin/functions-5.3 b/src/initramfs/distro-specs/scilin/functions-5.3
new file mode 100644
index 00000000..1548ab9a
--- /dev/null
+++ b/src/initramfs/distro-specs/scilin/functions-5.3
@@ -0,0 +1,42 @@
+# Copyright (c) 2009 - RZ Uni Freiburg
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# Configuration script for Scientific Linux (5.1) to setup linux stateless
+# clients (executed within initial ramfs)
+
+# initial (boot time) runlevel scripts
+initial_boot () {
+# delete all classical disk base rootfs stuff from rc.sysinit
+sed -e "6i# Script modified by $0 during stage3 bootup." \
+ -e "/relabel_se/,/^}/d" \
+ -e "/# Start up swap/,/# Set up bin/d" \
+ -e "/^remount_needed/,/^fi$/d" -e "/^# Clean out/,/in_sysinit/d" \
+ -e "/# Mount all o/,/# Start the g/d" \
+ -e "/# Boot time/,/# let's/d" -i /mnt/etc/rc.d/rc.sysinit
+# delete all classical disk base rootfs stuff from halt
+sed -e "7i# Modified by $0 during stage3 bootup." \
+ -e "/# Save mixer/,/Saving random/d" -e "/quotaoff/,/^# Now halt/d" \
+ -i /mnt/etc/init.d/halt
+# boot.slx is a special runlevel script generated within initialramfs which
+# should be executed before the normal runlevel scripts.
+echo -e "# Run OpenSLX init runlevel script\n/etc/init.d/boot.slx" \
+ >>/mnt/etc/rc.d/rc.sysinit
+# switch off SElinux enforcing
+sed -e "1i# Configuration modified by $0 during stage3 bootup." \
+ -e "s/SELINUX=.*/SELINUX=permissive/" -i /mnt/etc/selinux/config
+# switch off display manager start via inittab
+sed -e "s/x:5:re.*/# line deleted in stage3, re-enable via desktop plugin/" \
+ -i /mnt/etc/inittab
+# link halt and reboot scripts
+ln -s ../init.d/killall /mnt/etc/rc.d/rc0.d/S00killall
+ln -s ../init.d/halt /mnt/etc/rc.d/rc0.d/S01halt
+ln -s ../init.d/killall /mnt/etc/rc.d/rc6.d/S00killall
+ln -s ../init.d/halt /mnt/etc/rc.d/rc6.d/S01reboot
+}
diff --git a/src/initramfs/distro-specs/scilin/functions-5.4 b/src/initramfs/distro-specs/scilin/functions-5.4
new file mode 100644
index 00000000..1548ab9a
--- /dev/null
+++ b/src/initramfs/distro-specs/scilin/functions-5.4
@@ -0,0 +1,42 @@
+# Copyright (c) 2009 - RZ Uni Freiburg
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# Configuration script for Scientific Linux (5.1) to setup linux stateless
+# clients (executed within initial ramfs)
+
+# initial (boot time) runlevel scripts
+initial_boot () {
+# delete all classical disk base rootfs stuff from rc.sysinit
+sed -e "6i# Script modified by $0 during stage3 bootup." \
+ -e "/relabel_se/,/^}/d" \
+ -e "/# Start up swap/,/# Set up bin/d" \
+ -e "/^remount_needed/,/^fi$/d" -e "/^# Clean out/,/in_sysinit/d" \
+ -e "/# Mount all o/,/# Start the g/d" \
+ -e "/# Boot time/,/# let's/d" -i /mnt/etc/rc.d/rc.sysinit
+# delete all classical disk base rootfs stuff from halt
+sed -e "7i# Modified by $0 during stage3 bootup." \
+ -e "/# Save mixer/,/Saving random/d" -e "/quotaoff/,/^# Now halt/d" \
+ -i /mnt/etc/init.d/halt
+# boot.slx is a special runlevel script generated within initialramfs which
+# should be executed before the normal runlevel scripts.
+echo -e "# Run OpenSLX init runlevel script\n/etc/init.d/boot.slx" \
+ >>/mnt/etc/rc.d/rc.sysinit
+# switch off SElinux enforcing
+sed -e "1i# Configuration modified by $0 during stage3 bootup." \
+ -e "s/SELINUX=.*/SELINUX=permissive/" -i /mnt/etc/selinux/config
+# switch off display manager start via inittab
+sed -e "s/x:5:re.*/# line deleted in stage3, re-enable via desktop plugin/" \
+ -i /mnt/etc/inittab
+# link halt and reboot scripts
+ln -s ../init.d/killall /mnt/etc/rc.d/rc0.d/S00killall
+ln -s ../init.d/halt /mnt/etc/rc.d/rc0.d/S01halt
+ln -s ../init.d/killall /mnt/etc/rc.d/rc6.d/S00killall
+ln -s ../init.d/halt /mnt/etc/rc.d/rc6.d/S01reboot
+}
diff --git a/src/initramfs/distro-specs/scilin/functions-5.5 b/src/initramfs/distro-specs/scilin/functions-5.5
new file mode 100644
index 00000000..1548ab9a
--- /dev/null
+++ b/src/initramfs/distro-specs/scilin/functions-5.5
@@ -0,0 +1,42 @@
+# Copyright (c) 2009 - RZ Uni Freiburg
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# Configuration script for Scientific Linux (5.1) to setup linux stateless
+# clients (executed within initial ramfs)
+
+# initial (boot time) runlevel scripts
+initial_boot () {
+# delete all classical disk base rootfs stuff from rc.sysinit
+sed -e "6i# Script modified by $0 during stage3 bootup." \
+ -e "/relabel_se/,/^}/d" \
+ -e "/# Start up swap/,/# Set up bin/d" \
+ -e "/^remount_needed/,/^fi$/d" -e "/^# Clean out/,/in_sysinit/d" \
+ -e "/# Mount all o/,/# Start the g/d" \
+ -e "/# Boot time/,/# let's/d" -i /mnt/etc/rc.d/rc.sysinit
+# delete all classical disk base rootfs stuff from halt
+sed -e "7i# Modified by $0 during stage3 bootup." \
+ -e "/# Save mixer/,/Saving random/d" -e "/quotaoff/,/^# Now halt/d" \
+ -i /mnt/etc/init.d/halt
+# boot.slx is a special runlevel script generated within initialramfs which
+# should be executed before the normal runlevel scripts.
+echo -e "# Run OpenSLX init runlevel script\n/etc/init.d/boot.slx" \
+ >>/mnt/etc/rc.d/rc.sysinit
+# switch off SElinux enforcing
+sed -e "1i# Configuration modified by $0 during stage3 bootup." \
+ -e "s/SELINUX=.*/SELINUX=permissive/" -i /mnt/etc/selinux/config
+# switch off display manager start via inittab
+sed -e "s/x:5:re.*/# line deleted in stage3, re-enable via desktop plugin/" \
+ -i /mnt/etc/inittab
+# link halt and reboot scripts
+ln -s ../init.d/killall /mnt/etc/rc.d/rc0.d/S00killall
+ln -s ../init.d/halt /mnt/etc/rc.d/rc0.d/S01halt
+ln -s ../init.d/killall /mnt/etc/rc.d/rc6.d/S00killall
+ln -s ../init.d/halt /mnt/etc/rc.d/rc6.d/S01reboot
+}
diff --git a/src/initramfs/distro-specs/scilin/functions-default b/src/initramfs/distro-specs/scilin/functions-default
new file mode 100644
index 00000000..f9bb0f0e
--- /dev/null
+++ b/src/initramfs/distro-specs/scilin/functions-default
@@ -0,0 +1,315 @@
+# Copyright (c) 2003..2006 - RZ Uni Freiburg
+# Copyright (c) 2006..2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found under http://openslx.org
+#
+# configuration script for general Scientific Linux to configure linux
+# stateless clients (included by init, hwautocfg, servconfig within Initial-
+# RamFS after inclusion of the main functions file). This file is the main
+# base for the several RedHat based Scientific Linux versions.
+
+# settings of central variables
+# D_DIRINBINDMNT - lists of directories to be created in bind mounted rw
+# part of the client filesystem
+# D_RODIRSINRW - ReadOnly Directories in RW part of filesystem to save on
+# TempFS usage
+# D_DIRINDXS - directories in client filesystem which should be present
+# anyhow
+D_BINDMPTS="tmp root media home"
+D_DIRINBINDMNT="/var/run /var/log /var/tmp"
+D_RODIRSINRW="/etc/bootsplash /etc/gconf /var/adm /var/lib/texmf /var/lib/rpm \
+/var/cache/fontconfig"
+D_DIRINDXS="/var/lib/rpm /var/lib/nobody /var/lib/alternatives/ /var/db/nscd \
+/var/lib/bluetooth /var/lib/scrollkeeper /var/lib/nfs/sm /var/lib/nfs/sm.bak \
+/var/lib/misc /var/spool/cron"
+
+# empty functions are defined at the beginning of /etc/functions
+
+# distro specific function called from servconfig script
+config_distro () {
+ # clean the runlevel directories which will be populated by the stage3 setup
+ for dir in rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d ; do
+ rm -rf /mnt/etc/${dir}/*
+ done
+ # set some system/environment information
+ echo -e "SLX VERSION = $SLXVERSION\nINITRAMFS GENERATION DATE = $date" \
+ >>/mnt/etc/redhat-release
+ # simple bash configuration for root
+ echo -e "# Generated in OpenSLX stage3\n. /etc/bashrc" >/mnt/root/.profile
+ # enable sysrq
+ sed -e "1i# Configuration modified by $0 during stage3 bootup." \
+ -e "s/kernel.sysrq =.*/kernel.sysrq = 1/" -i /mnt/etc/sysctl.conf
+ # set some networking stuff if needed
+ [ -e /mnt/etc/sysconfig/network ] && \
+ sed -e "s/HOSTNAME=.*/HOSTNAME=$host_name/" \
+ -e "s/GATEWAY=.*/GATEWAY=$gateway/" -i /mnt/etc/sysconfig/network
+ # check for inittab file
+ #test -f /mnt/etc/inittab || error "$df_erritab"
+}
+
+# initial (boot time) runlevel scripts
+initial_boot () {
+# delete all classical disk base rootfs stuff from rc.sysinit
+sed -e "6i# Script modified by $0 during stage3 bootup." \
+ -e "/# Initialize ha/,/success/d" -e "/^ROOTFSTYPE/,/Remounting root/d" \
+ -e "/# Check f/,/Mounting l/d" -e "/^# Configure mach/,/-f \/fastboot/d" \
+ -e "s,/sbin/start_udev$,/etc/init.d/udevd," -i /mnt/etc/rc.d/rc.sysinit
+# write a custom udev script (to be checked!!)
+echo -e "#!/bin/sh\n# Simple udev starter script created as a replacement \
+during OpenSLX stage3\n# bootup." >/mnt/etc/init.d/udevd
+echo -e ". /etc/init.d/functions\nSTRING=\$\"Starting udev: \" \
+\necho -n \"\$STRING \"\n/sbin/udevstart </dev/null >/dev/null 2>&1 \
+\n[ \$? -eq 0 ] && success \$\"\$STRING\" || failure \$\"\$STRING\" \
+\nexit 0" >>/mnt/etc/init.d/udevd
+chmod u+x /mnt/etc/init.d/udevd
+# delete all classical disk base rootfs stuff from halt
+sed -e "7i# Modified by $0 during stage3 bootup." \
+ -e "/# Save mixer/,/Saving random/d" -e "/quotaoff/,/^# Now halt/d" \
+ -i /mnt/etc/init.d/halt
+# boot.slx is a special runlevel script generated within initialramfs which
+# should be executed before the normal runlevel scripts.
+echo -e "# Run OpenSLX init runlevel script\n/etc/init.d/boot.slx" \
+ >>/mnt/etc/rc.d/rc.sysinit
+# switch off SElinux enforcing
+sed -e "1i# Configuration modified by $0 during stage3 bootup." \
+ -e "s/SELINUX=.*/SELINUX=permissive/" -i /mnt/etc/selinux/config
+# link halt and reboot scripts
+ln -s ../init.d/killall /mnt/etc/rc.d/rc0.d/S00killall
+ln -s ../init.d/halt /mnt/etc/rc.d/rc0.d/S01halt
+ln -s ../init.d/killall /mnt/etc/rc.d/rc6.d/S00killall
+ln -s ../init.d/halt /mnt/etc/rc.d/rc6.d/S01reboot
+}
+
+# linking runlevel scripts
+rllinker () {
+local script="$1"
+if [ $2 -lt 10 ] ; then
+ local start="0$2"; else local start="$2"
+fi
+if [ $3 -lt 10 ] ; then
+ local stop="0$3"; else local stop="$3"
+fi
+# empty runlevel links - decision on running certain services is passed via
+# configuration
+for i in rc3.d/K$stop$script rc5.d/K$stop$script \
+ rc3.d/S$start$script rc5.d/S$start$script ; do
+ ln -sf ../init.d/$script /mnt/etc/$i
+done
+}
+
+# group of functions for the normal runlevels - first parameter is start
+# second stop
+# function for ntp configuration
+config_ntp () {
+if [ -e /mnt/etc/init.d/ntpd ] ; then
+ if ! strinfile "ntp:" /mnt/etc/passwd ; then
+ echo -e "ntp:x:38:38:NTP daemon:/var/lib/ntp:/sbin/nologin" \
+ >>/mnt/etc/passwd
+ echo -e "ntp:!:13099:0:99999:7:::" >>/mnt/etc/shadow
+ fi
+ testmkd /mnt/var/lib/ntp ntp:ntp
+ if [ "x$start_ntp" = "xyes" ] ; then
+ rllinker "ntpd" 7 14
+ fi
+fi
+}
+# function for atd
+config_atd () {
+if [ "x$start_atd" = "xyes" ]; then
+ rllinker "atd" 14 4
+fi
+}
+# function for configuration of cron services
+config_cron () {
+if [ "x$start_cron" = "xyes" ] ; then
+ if [ -f /mnt/etc/init.d/cron ] ; then
+ rllinker "cron" 18 2
+ testmkd /mnt/var/spool/anacron
+ echo -e "# /etc/crontab - file generated by $0:\n\
+" >/mnt/etc/crontab
+ else
+ error "$df_errcron" nonfatal
+ fi
+fi
+}
+# name service caching daemon (useful in most cases)
+config_nscd () {
+ if [ -f /mnt/etc/init.d/nscd ] ; then
+ testmkd /mnt/var/db/nscd
+ rllinker "nscd" 20 5
+ fi
+}
+# secure shell service
+config_sshd () {
+if [ "x$start_sshd" = "xyes" ] ; then
+ if [ -f /mnt/etc/init.d/sshd ] ; then
+ testmkd /mnt/var/empty/sshd/dev
+ if ! strinfile "sshd:" /mnt/etc/passwd ; then
+ echo -e "sshd:x:74:74::/var/empty/sshd:/sbin/nologin" \
+ >>/mnt/etc/passwd
+ echo -e "sshd:!:13099:0:99999:7:::" >>/mnt/etc/shadow
+ fi
+ rllinker "sshd" 25 10
+ else
+ error "$df_errsshd" nonfatal
+ fi
+fi
+}
+# snmp agent for remote monitoring
+config_snmp () {
+if [ "x$start_snmp" = "xyes" ] ; then
+ if [ -f /mnt/etc/init.d/snmpd ] ; then
+ rllinker "snmpd" 24 2
+ testmkd /mnt/var/lib/net-snmp
+ fi
+ # fixme!!
+ # write service monitor depending on services started
+ fi
+}
+# configure print server (lpd or cups)
+config_printer () {
+if [ "x${start_printdaemon}" != "x" ] && \
+ [ "x${start_printdaemon}" != "xno" ]; then
+ case ${start_printdaemon} in
+ yes|cups*|CUPS*)
+ rllinker "cups" 25 1
+ testmkd /mnt/var/spool/cups/tmp root:sys
+ ;;
+ lp*|LP*|PLP*)
+ rllinker "lpd" 25 1
+ testmkd /mnt/var/spool/lpd
+ ;;
+ *)
+ #logwrite "Do not know print-server $start_printdaemon; \
+ #specify 'cups' or 'lpd'."
+ ;;
+ esac
+fi
+# configure cups printer client, avoid to overwrite admin provided printer
+# configuration file
+if [ "x$lpr_servers" != "x" ] && [ ! -e /rootfs/etc/cups/client.conf ] ; then
+ echo -e "# /etc/cups/client.conf - file generated by\n#\t$0:\n\
+#\t$date\n#\nServerName\t$lpr_servers" >/mnt/etc/cups/client.conf
+fi
+}
+# configure bluetooth services
+config_bt () {
+if [ -e /mnt/etc/sysconfig/bluetooth ] ; then
+ sed -e "1i# /etc/sysconfig/bluetooth - file modified by $0" \
+ -e "s,HID2HCI_ENABLE.*,HID2HCI_ENABLE=true," \
+ -i /mnt/etc/sysconfig/bluetooth
+else
+ : # no bluetooth components installed
+fi
+}
+# set up localization like keytable and consolefont
+dlocale () {
+echo -e "\t# entries added by $0: $date" >> /mnt/etc/init.d/boot.slx
+sed -e "s,KEYTABLE=.*,KEYTABLE=\"${KEYTABLE}\"," \
+ -i /mnt/etc/sysconfig/keyboard
+#echo -e "\tsetfont ${CONSOLE_FONT} >${LOGFILE} 2>&1\n" \
+# >>/mnt/etc/init.d/boot.slx
+}
+# acpi and powersave daemons, required e.g. to shutdown the machine via
+# power button, no need for early start
+config_acpi () {
+rllinker acpid 01 22
+}
+# configure dbus (inter application communication for kde and gnome), hal
+# (hardware abstraction layer - used e.g. by powersaved) and resmgr
+# (resource manager - the user gets permissions to devices when loggin on)
+# runlevel script for haldaemon is now haldaemon instead of hal
+config_dreshal () {
+local start=4
+local stop=18
+if [ "x$start_dreshal" = "xyes" ]; then
+ testmkd /mnt/var/run/dbus
+ if [ -f /mnt/etc/init.d/messagebus ] ; then
+ testmkd /mnt/var/lib/dbus
+ strinfile "dbus:" /mnt/etc/passwd || \
+ echo "dbus:x:81:81:System Message Bus:/var/run/dbus:/sbin/nologin" \
+ >> /mnt/etc/passwd
+ strinfile "dbus:" /mnt/etc/group || echo "dbus:!:81:" >> /mnt/etc/group
+ rllinker "messagebus" $start $stop
+ fi
+ if [ -f /mnt/etc/init.d/haldaemon ] ; then
+ testmkd /mnt/var/lib/hal
+ strinfile "haldaemon:" /mnt/etc/passwd || \
+ echo "haldaemon:x:68:68:User for haldaemon:/var/run/hal:/sbin/nologin" \
+ >> /mnt/etc/passwd
+ strinfile "haldaemon:" /mnt/etc/group || \
+ echo "haldaemon:!:103:" >> /mnt/etc/group
+ start=$(($start + 1))
+ stop=$(($stop - 1))
+ rllinker "haldaemon" $start $stop
+ fi
+fi
+}
+# configure automounter (fixme: to be moved into plugin)
+config_automount () {
+if [ -e /mnt/etc/sysconfig/autofs ] ; then
+ testmkd /mnt/var/lock/subsys
+ sed -e "1i# /etc/sysconfig/autofs - file modified by\n#\t$0:\n#" \
+ -e "s,DAEMONOPTIONS.*,DAEMONOPTIONS=\"--timeout 3\"," \
+ -i /mnt/etc/sysconfig/autofs
+ rllinker "autofs" 18 4
+else
+ error "$df_erramt" nonfatal
+fi
+}
+# start name service caching daemon
+config_nscd () {
+if [ -e /mnt/etc/init.d/nscd ] ; then
+ testmkd /mnt/var/run/nscd
+ rllinker "nscd" 16 16
+else
+ error "$df_errnsc" nonfatal
+fi
+}
+# start portmapper (needed at least for nfs and nis services)
+config_portmap () {
+ rllinker "portmap" 2 20
+}
+# start NIS (mostly deprecated)
+config_nis () {
+if [ -f /mnt/etc/init.d/ypbind ] ; then
+ rllinker "ypbind" 6 16
+ config_portmap
+ testmkd /mnt/var/yp/nicknames
+else
+ error "$df_erryp" nonfatal
+fi
+}
+# initialize runlevel skript to be executed during system startup
+# (before most of the normal boot init scripts)
+# this script should operate like a normal runlevel script
+d_mkrlscript () {
+local switch="$1"
+local name="$2"
+local info="$3"
+case "$1" in
+ init)
+ echo -e "#!/bin/sh\n# skeleton of /etc/init.d/${name} created \
+by $0\n# after you applied changes to the creation scripts you have to \
+rerun\n# the mkdxsinitrd script to get them applied\n\
+. /etc/rc.d/init.d/functions\n#. /etc/sysconfig/logfile\ncase \
+\"\$1\" in\n start)\n\techo -n \"$info\"" >>/mnt/etc/init.d/${name}
+ chmod u+x /mnt/etc/init.d/${name}
+ ;;
+ entry)
+ echo -e "\t${info}" >>/mnt/etc/init.d/${name}
+ ;;
+ close)
+ echo -e "\t;;\n stop)\n\t;;\nesac" \
+ >>/mnt/etc/init.d/${name}
+ ;;
+esac
+}
+
+
diff --git a/src/initramfs/distro-specs/suse/functions-10.2 b/src/initramfs/distro-specs/suse/functions-10.2
new file mode 100644
index 00000000..39a9d31c
--- /dev/null
+++ b/src/initramfs/distro-specs/suse/functions-10.2
@@ -0,0 +1,82 @@
+# Copyright (c) 2003..2006 - RZ Uni Freiburg
+# Copyright (c) 2006..2008 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found under http://openslx.org
+#
+# configuration script for OpenSuSE 10.2 to configure linux stateless clients
+# (included by init, hwautocfg, servconfig within InitialRamFS after
+# inclusion of the main functions file). This file is the main base for the
+# several SuSE distro versions
+
+# settings of central variables (formerly done via config-*, these variables
+# are disputable ...)
+# D_DIRINBINDMNT - lists of directories to be created in bind mounted rw
+# part of the client filesystem
+# D_RODIRSINRW - ReadOnly Directories in RW part of filesystem to save on
+# TempFS usage
+# D_DIRINDXS - directories in client filesystem which should be present
+# anyhow
+
+D_RODIRSINRW="/etc/opt/gnome/gconf /etc/X11/xkb /var/adm /var/lib/texmf \
+/var/lib/rpm /var/cache/fontconfig"
+
+# configure dbus (inter application communication for kde and gnome), hal
+# (hardware abstraction layer - used e.g. by powersaved) and resmgr
+# (resource manager - the user gets permissions to devices when loggin on)
+# runlevel script for haldaemon is now haldaemon instead of hal
+config_dreshal () {
+local start=5
+local stop=18
+if [ "x$start_dreshal" = "xyes" ]; then
+ for dir in /var/run/dbus /var/run/resmgr/classes /var/run/hal \
+ /var/cache/hald /var/lib/PolicyKit /var/lib/misc ; do
+ testmkd /mnt/$dir
+ done
+ if [ -f /mnt/etc/init.d/dbus ] ; then
+ strinfile "messagebus:" /mnt/etc/passwd || \
+ echo "messagebus:x:100:101:User for D-BUS:/var/run/dbus:/bin/false" \
+ >> /mnt/etc/passwd
+ strinfile "messagebus:" /mnt/etc/group || \
+ echo "messagebus:!:101:" >> /mnt/etc/group
+ # set permissions with userid
+ testmkd /mnt/var/run/dbus messagebus:messagebus
+ rllinker "dbus" $start $stop
+ fi
+ if [ -f /mnt/etc/init.d/resmgr ] ; then
+ start=$(($start + 1))
+ stop=$(($stop - 1))
+ rllinker "resmgr" $start $stop
+ fi
+ if [ -f /mnt/etc/init.d/haldaemon ] ; then
+ strinfile "haldaemon:" /mnt/etc/passwd || \
+ echo "haldaemon:x:105:103:User for haldaemon:/var/run/hal:/bin/false" \
+ >> /mnt/etc/passwd
+ strinfile "haldaemon:" /mnt/etc/group || \
+ echo "haldaemon:!:103:" >> /mnt/etc/group
+ echo -n "" > /mnt/var/lib/PolicyKit/reload
+ # set permissions with userid
+ d_mkrlscript entry boot.slx "chown haldaemon:haldaemon /var/run/hal\
+ /var/cache/hald 2>/dev/null"
+ start=$(($start + 1))
+ stop=$(($stop - 1))
+ rllinker "haldaemon" $start $stop
+ fi
+ if [ -f /mnt/etc/init.d/policykitd ] ; then
+ strinfile "polkituser:" /mnt/etc/passwd || \
+ echo "polkituser:x:104:106:PolicyKit:/var/run/PolicyKit:/bin/false" \
+ >> /mnt/etc/passwd
+ testmkd /mnt/var/run/polkit polkit:polkit
+ start=$(($start + 10))
+ stop=$(($stop - 1))
+ rllinker "policykitd" $start $stop
+ echo -n > /mnt/var/lib/misc/PolicyKit.reload
+ chmod a+x /mnt/var/lib/misc/PolicyKit.reload
+ fi
+fi
+}
diff --git a/src/initramfs/distro-specs/suse/functions-10.3 b/src/initramfs/distro-specs/suse/functions-10.3
new file mode 100644
index 00000000..3f9516c3
--- /dev/null
+++ b/src/initramfs/distro-specs/suse/functions-10.3
@@ -0,0 +1,26 @@
+# Copyright (c) 2003..2006 - RZ Uni Freiburg
+# Copyright (c) 2006..2008 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found under http://openslx.org
+#
+# configuration script for OpenSuSE 10.3 to configure linux stateless clients
+# (included by init, hwautocfg, servconfig within InitialRamFS after
+# inclusion of the main functions file). This file is the main base for the
+# several SuSE distro versions
+
+# settings of central variables (formerly done via config-*, these variables
+# are disputable ...)
+# D_DIRINBINDMNT - lists of directories to be created in bind mounted rw
+# part of the client filesystem
+# D_RODIRSINRW - ReadOnly Directories in RW part of filesystem to save on
+# TempFS usage
+# D_DIRINDXS - directories in client filesystem which should be present
+# anyhow
+
+# no changes from functions-default by now
diff --git a/src/initramfs/distro-specs/suse/functions-11.1 b/src/initramfs/distro-specs/suse/functions-11.1
new file mode 100644
index 00000000..d350fa9c
--- /dev/null
+++ b/src/initramfs/distro-specs/suse/functions-11.1
@@ -0,0 +1,90 @@
+# Copyright (c) 2003..2006 - RZ Uni Freiburg
+# Copyright (c) 2006..2009 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found under http://openslx.org
+#
+# configuration script for OpenSuSE 11.1 to configure linux stateless clients
+# (included by init, hwautocfg, servconfig within InitialRamFS after
+# inclusion of the main functions file). This file is the main base for the
+# several SuSE distro versions
+
+# settings of central variables (formerly done via config-*, these variables
+# are disputable ...)
+# D_DIRINBINDMNT - lists of directories to be created in bind mounted rw
+# part of the client filesystem
+# D_RODIRSINRW - ReadOnly Directories in RW part of filesystem to save on
+# TempFS usage
+# D_DIRINDXS - directories in client filesystem which should be present
+# anyhow
+
+# start portmapper (needed at least for nfs and nis services)
+config_portmap () {
+ # portmap is provided via rpcbind in suse 11.1
+ testmkd /mnt/var/lib/rpcbind
+ rllinker "rpcbind" 4 5
+}
+# acpi and powersave daemons, required e.g. to shutdown the machine via
+# power button, no need for early start
+config_acpi () {
+rllinker acpid 22 12
+# dbus is required to run acpid and powersaved
+start_dreshal="yes"
+}
+# configure dbus (inter application communication for kde and gnome), hal
+# (hardware abstraction layer - used e.g. by powersaved)
+config_dreshal () {
+local start=1
+local stop=10
+if [ "x$start_dreshal" = "xyes" ]; then
+ testmkd /mnt/var/lib/misc
+ testmkd /mnt/var/run/PolicyKit polkituser:polkituser
+ testmkd /mnt/var/lib/PolicyKit polkituser:polkituser
+ testmkd /mnt/var/run/dbus/at_console/pool
+
+ sed -i /mnt/etc/PolicyKit/PolicyKit.conf \
+ -e "s/\(<\/config>\)/ @@new@@\n\1/" \
+ -e "s/@@new@@/<match action=\"@@action@@\">\n@@return@@\n <\/match>/" \
+ -e "s/@@action@@/org.freedesktop.hal.storage.mount-removable/" \
+ -e "s/@@return@@/ <return result=\"yes\"\/>/"
+
+ if [ -f /mnt/etc/init.d/dbus ] ; then
+ strinfile "messagebus:" /mnt/etc/passwd || \
+ echo "messagebus:x:102:103:User for D-BUS:/var/run/dbus:/bin/false" \
+ >> /mnt/etc/passwd
+ strinfile "messagebus:" /mnt/etc/group || \
+ echo "messagebus:!:103:" >> /mnt/etc/group
+ # create directories and set permissions with user and group id
+ testmkd /mnt/var/run/dbus messagebus:messagebus
+ testmkd /mnt/var/lib/dbus
+
+ rm -rf /mnt/etc/dbus-1/system.d/*etwork*anager.conf \
+ /mnt/etc/dbus-1/system.d/nm-* \
+ /mnt/etc/dbus-1/event.d/*NetworkManager*
+
+ rllinker "dbus" $start $stop
+ fi
+ if [ -f /mnt/etc/init.d/haldaemon ] ; then
+ strinfile "haldaemon:" /mnt/etc/passwd || \
+ echo "haldaemon:x:106:107:User for haldaemon:/var/run/hal:/bin/false" \
+ >> /mnt/etc/passwd
+ strinfile "haldaemon:" /mnt/etc/group || \
+ echo "haldaemon:!:107:" >> /mnt/etc/group
+ echo -n "" > /mnt/var/lib/misc/PolicyKit.reload
+ chmod a+x /mnt/var/lib/misc/PolicyKit.reload
+ # create directories and set permissions with user and group id
+ for dir in /var/run/hald /var/run/hald/hald-local \
+ /var/run/hald/hald-runner /var/cache/hald; do
+ testmkd /mnt/${dir} haldaemon:haldaemon
+ done
+ start=$(($start + 1))
+ stop=$(($stop - 1))
+ rllinker "haldaemon" $start $stop
+ fi
+fi
+}
diff --git a/src/initramfs/distro-specs/suse/functions-11.2 b/src/initramfs/distro-specs/suse/functions-11.2
new file mode 100644
index 00000000..ae8008b9
--- /dev/null
+++ b/src/initramfs/distro-specs/suse/functions-11.2
@@ -0,0 +1,95 @@
+# Copyright (c) 2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found under http://openslx.org
+#
+# configuration script for OpenSuSE 11.2 to configure linux stateless clients
+# (included by init, hwautocfg, servconfig within InitialRamFS after
+# inclusion of the main functions file). This file is the main base for the
+# several SuSE distro versions
+
+# settings of central variables (formerly done via config-*, these variables
+# are disputable ...)
+# D_DIRINBINDMNT - lists of directories to be created in bind mounted rw
+# part of the client filesystem
+# D_RODIRSINRW - ReadOnly Directories in RW part of filesystem to save on
+# TempFS usage
+# D_DIRINDXS - directories in client filesystem which should be present
+# anyhow
+
+# start portmapper (needed at least for nfs and nis services)
+config_portmap () {
+# portmap is provided via rpcbind in suse 11.1,2
+testmkd /mnt/var/lib/rpcbind
+rllinker "rpcbind" 4 5
+}
+# acpi and powersave daemons, required e.g. to shutdown the machine via
+# power button, no need for early start
+config_acpi () {
+rllinker acpid 22 12
+# dbus is required to run acpid and powersaved
+start_dreshal="yes"
+}
+# configure dbus (inter application communication for kde and gnome), hal
+# (hardware abstraction layer - used e.g. by powersaved)
+config_dreshal () {
+local start=1
+local stop=10
+if [ "x$start_dreshal" = "xyes" ]; then
+ for dir in /var/lib/misc /var/run/ConsoleKit \
+ "/var/run/PolicyKit polkituser:polkituser" \
+ "/var/lib/PolicyKit polkituser:polkituser" \
+ "/var/run/dbus/at_console/pool"; do
+ testmkd /mnt${dir}
+ done
+ # enable access to removable devices
+ sed -i /mnt/etc/PolicyKit/PolicyKit.conf \
+ -e "s/\(<\/config>\)/ @@new@@\n\1/" \
+ -e "s/@@new@@/<match action=\"@@action@@\">\n@@return@@\n <\/match>/" \
+ -e "s/@@action@@/org.freedesktop.hal.storage.mount-removable/" \
+ -e "s/@@return@@/ <return result=\"yes\"\/>/"
+
+ if [ -f /mnt/etc/init.d/dbus ] ; then
+ strinfile "messagebus:" /mnt/etc/passwd || \
+ echo "messagebus:x:102:103:User for D-BUS:/var/run/dbus:/bin/false" \
+ >> /mnt/etc/passwd
+ strinfile "messagebus:" /mnt/etc/group || \
+ echo "messagebus:!:103:" >> /mnt/etc/group
+ # create directories and set permissions with user and group id
+ testmkd /mnt/var/run/dbus messagebus:messagebus
+ testmkd /mnt/var/lib/dbus
+ # console-kit-daemon is often not started properly (why ever)
+ sed -i /mnt/etc/init.d/dbus \
+ -e '/start_daemon -f $DBUS_D/a\
+\ \ \ \ \ \ \ \ start_daemon -f /usr/sbin/console-kit-daemon'
+
+ rm -rf /mnt/etc/dbus-1/system.d/*etwork*anager.conf \
+ /mnt/etc/dbus-1/system.d/nm-* \
+ /mnt/etc/dbus-1/event.d/*NetworkManager*
+
+ rllinker "dbus" $start $stop
+ fi
+ if [ -f /mnt/etc/init.d/haldaemon ] ; then
+ strinfile "haldaemon:" /mnt/etc/passwd || \
+ echo "haldaemon:x:106:107:User for haldaemon:/var/run/hal:/bin/false" \
+ >> /mnt/etc/passwd
+ strinfile "haldaemon:" /mnt/etc/group || \
+ echo "haldaemon:!:107:" >> /mnt/etc/group
+ echo -n "" >/mnt/var/lib/misc/PolicyKit.reload
+ chmod a+x /mnt/var/lib/misc/PolicyKit.reload
+ # create directories and set permissions with user and group id
+ for dir in /var/run/hald /var/run/hald/hald-local \
+ /var/run/hald/hald-runner /var/cache/hald; do
+ testmkd /mnt/${dir} haldaemon:haldaemon
+ done
+ start=$(($start + 1))
+ stop=$(($stop - 1))
+ rllinker "haldaemon" $start $stop
+ fi
+fi
+}
diff --git a/src/initramfs/distro-specs/suse/functions-11.3 b/src/initramfs/distro-specs/suse/functions-11.3
new file mode 100644
index 00000000..4eac33a0
--- /dev/null
+++ b/src/initramfs/distro-specs/suse/functions-11.3
@@ -0,0 +1,97 @@
+# Copyright (c) 2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found under http://openslx.org
+#
+# configuration script for OpenSuSE 11.2 to configure linux stateless clients
+# (included by init, hwautocfg, servconfig within InitialRamFS after
+# inclusion of the main functions file). This file is the main base for the
+# several SuSE distro versions
+
+# settings of central variables (formerly done via config-*, these variables
+# are disputable ...)
+# D_DIRINBINDMNT - lists of directories to be created in bind mounted rw
+# part of the client filesystem
+# D_RODIRSINRW - ReadOnly Directories in RW part of filesystem to save on
+# TempFS usage
+# D_DIRINDXS - directories in client filesystem which should be present
+# anyhow
+#
+# TODO: id. copy of functions-11.2 to be adapted to 11.3
+
+# start portmapper (needed at least for nfs and nis services)
+config_portmap () {
+# portmap is provided via rpcbind in suse 11.1,2,3
+testmkd /mnt/var/lib/rpcbind
+rllinker "rpcbind" 4 5
+}
+# acpi and powersave daemons, required e.g. to shutdown the machine via
+# power button, no need for early start
+config_acpi () {
+rllinker acpid 22 12
+# dbus is required to run acpid and powersaved
+start_dreshal="yes"
+}
+# configure dbus (inter application communication for kde and gnome), hal
+# (hardware abstraction layer - used e.g. by powersaved)
+config_dreshal () {
+local start=1
+local stop=10
+if [ "x$start_dreshal" = "xyes" ]; then
+ for dir in /var/lib/misc /var/run/ConsoleKit \
+ "/var/run/PolicyKit polkituser:polkituser" \
+ "/var/lib/PolicyKit polkituser:polkituser" \
+ "/var/run/dbus/at_console/pool"; do
+ testmkd /mnt${dir}
+ done
+ # enable access to removable devices
+ sed -i /mnt/etc/PolicyKit/PolicyKit.conf \
+ -e "s/\(<\/config>\)/ @@new@@\n\1/" \
+ -e "s/@@new@@/<match action=\"@@action@@\">\n@@return@@\n <\/match>/" \
+ -e "s/@@action@@/org.freedesktop.hal.storage.mount-removable/" \
+ -e "s/@@return@@/ <return result=\"yes\"\/>/"
+
+ if [ -f /mnt/etc/init.d/dbus ] ; then
+ strinfile "messagebus:" /mnt/etc/passwd || \
+ echo "messagebus:x:102:103:User for D-BUS:/var/run/dbus:/bin/false" \
+ >> /mnt/etc/passwd
+ strinfile "messagebus:" /mnt/etc/group || \
+ echo "messagebus:!:103:" >> /mnt/etc/group
+ # create directories and set permissions with user and group id
+ testmkd /mnt/var/run/dbus messagebus:messagebus
+ testmkd /mnt/var/lib/dbus
+ # console-kit-daemon is often not started properly (why ever)
+ sed -i /mnt/etc/init.d/dbus \
+ -e '/start_daemon -f $DBUS_D/a\
+\ \ \ \ \ \ \ \ start_daemon -f /usr/sbin/console-kit-daemon'
+
+ rm -rf /mnt/etc/dbus-1/system.d/*etwork*anager.conf \
+ /mnt/etc/dbus-1/system.d/nm-* \
+ /mnt/etc/dbus-1/event.d/*NetworkManager*
+
+ rllinker "dbus" $start $stop
+ fi
+ if [ -f /mnt/etc/init.d/haldaemon ] ; then
+ strinfile "haldaemon:" /mnt/etc/passwd || \
+ echo "haldaemon:x:106:107:User for haldaemon:/var/run/hal:/bin/false" \
+ >> /mnt/etc/passwd
+ strinfile "haldaemon:" /mnt/etc/group || \
+ echo "haldaemon:!:107:" >> /mnt/etc/group
+ echo -n "" >/mnt/var/lib/misc/PolicyKit.reload
+ chmod a+x /mnt/var/lib/misc/PolicyKit.reload
+ # create directories and set permissions with user and group id
+ for dir in /var/run/hald /var/run/hald/hald-local \
+ /var/run/hald/hald-runner /var/cache/hald; do
+ testmkd /mnt/${dir} haldaemon:haldaemon
+ done
+ start=$(($start + 1))
+ stop=$(($stop - 1))
+ rllinker "haldaemon" $start $stop
+ fi
+fi
+}
diff --git a/src/initramfs/distro-specs/suse/functions-default b/src/initramfs/distro-specs/suse/functions-default
new file mode 100644
index 00000000..14bb5ff0
--- /dev/null
+++ b/src/initramfs/distro-specs/suse/functions-default
@@ -0,0 +1,608 @@
+# Copyright (c) 2003..2006 - RZ Uni Freiburg
+# Copyright (c) 2006..2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found under http://openslx.org
+#
+# configuration script for general SuSE to configure linux stateless clients
+# (included by init, hwautocfg, servconfig within InitialRamFS after
+# inclusion of the main functions file). This file is the main base for the
+# several SuSE distro versions
+
+# settings of central variables (formerly done via config-*, these variables
+# are disputable ...)
+# D_DIRINBINDMNT - lists of directories to be created in bind mounted rw
+# part of the client filesystem
+# D_RODIRSINRW - ReadOnly Directories in RW part of filesystem to save on
+# TempFS usage
+# D_DIRINDXS - directories in client filesystem which should be present
+# anyhow
+D_BINDMPTS="tmp root media home"
+D_DIRINBINDMNT="/var/run /var/log /var/tmp"
+D_RODIRSINRW="/etc/bootsplash /etc/gconf /etc/X11/xkb /var/adm /var/lib/texmf \
+/var/lib/rpm /var/cache/fontconfig"
+D_DIRINDXS="/var/X11R6/compose-cache /var/run/sysconfig/tmp /var/adm \
+/var/lib/rpm /var/lib/nobody /var/lib/pam_devperm /var/lib/bluetooth \
+/var/lib/texmf /var/lib/nfs/sm /var/lib/nfs/sm.bak /var/lib/misc \
+/var/lib/acpi /var/spool/cron /var/lock/subsys/sysconfig"
+
+# empty functions are defined at the beginning of /etc/functions
+
+# distro specific function called from servconfig script
+config_distro () {
+# clean the runlevel directories which will be populated by the stage3 setup
+for dir in rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d boot.d ; do
+ rm -rf /mnt/etc/init.d/${dir}/*
+done
+
+# link the additional key setup (notbook special keys)
+grep -q -E "otebook" /etc/hwinfo.bios && \
+ [ -e /mnt/etc/init.d/hotkey-setup ] && rllinker "hotkey-setup" 25 25
+# no need to run start scripts in parallel
+# enable magic sysrequest for the clients
+sed -e "1i# /etc/sysconfig/sysctl - modified by $0 version $version" \
+ -e "s,ENABLE_SYSRQ=.*,ENABLE_SYSRQ=\"yes\"," \
+ -i /mnt/etc/sysconfig/sysctl
+# add slx specific path /var/opt/openslx/bin ...
+echo -e "# stuff generated by $0 (out of InitRamFS written $date)\n\
+PATH=\"\$PATH:/var/opt/openslx/bin\"\n\
+test \"\$UID\" -ge 100 && PATH=\"\$PATH:.\"\n\
+QTDIR=/usr/lib/qt3\nexport QTDIR\nno_proxy='localhost'\n\
+export no_proxy" >/mnt/etc/SuSEconfig/profile
+echo -e "SLX VERSION = $SLXVERSION\nINITRAMFS GENERATION DATE = $date" \
+ >>/mnt/etc/SuSE-release
+
+# remove annoying udev rule set for changing eth interface and rtc symlink
+rm /mnt/etc/udev/rules.d/*persistent-net.rules \
+ /mnt/etc/udev/rules.d/*net_persistent_names.rules >/dev/null 2>&1
+sed '/SYMLINK+="rtc"/d' -i \
+ /mnt/etc/udev/rules.d/50-udev-default.rules >/dev/null 2>&1
+
+# create a stateless specific halt script
+echo -e '#!/bin/sh\n# script generated in InitRamFS (SLX stage3)
+. /etc/rc.status\n
+trap "echo" SIGINT SIGSEGV SIGQUIT SIGTERM\nset +e\n\n
+case "$0" in\n\t*halt)
+\t message="The system will be halted immediately."
+\t command="halt -p"\n\t ;;\n\t*reboot)\n
+\t message="Please stand by while rebooting the system..."
+\t command="reboot"\n\t ;;\nesac\n
+rc_reset\ntest -e /etc/init.d/halt.local && {
+\techo Running /etc/init.d/halt.local\n\t/bin/sh /etc/init.d/halt.local
+\trc_status -v1 -r\n}
+echo $message\nexec $command -d -f' >/mnt/etc/init.d/halt
+# add the halt link to the 0 and 6 runlevel directories
+ln -sf ../halt /mnt/etc/init.d/rc0.d/S20halt
+ln -sf ../halt /mnt/etc/init.d/rc6.d/S20reboot
+
+echo "LOGFILE=${LOGFILE}" >/mnt/etc/sysconfig/logfile
+# fixme: rather ugly to write that boot script this way
+echo '
+#!/bin/sh
+# SuSE specific initial boot file modified for the use with OpenSLX clients
+#
+###########################################################################
+
+# Before we do anything else, try at first to activate SELinux support
+test -d /selinux && mount -n -t selinuxfs none /selinux &>/dev/null
+
+# Configuration and coloring of the boot messages
+. /etc/rc.status
+. /etc/sysconfig/boot
+. /etc/sysconfig/logfile
+
+# Avoid be interrupted by child or keyboard
+trap "echo" SIGINT SIGSEGV SIGQUIT
+set +e
+
+# reasonable start values for bootsplash progress
+export progress=0
+export sscripts=45
+export kscripts=45
+
+echo -n "System Boot Control: "
+echo "Running $0"
+
+###########################################################################
+#
+
+# some important (un)mounts
+rc_reset
+echo -n "Mounting /proc, /sys and /dev/pts filesystems"
+# file /etc/fstab in some scenarios not available
+mount -t proc proc /proc &>/dev/null
+rc_status -v -r
+
+echo -n "Mounting /dev/pts"
+mount -t devpts -o mode=0620,gid=5 devpts /dev/pts
+rc_status -v -r
+if [ -d /sys ] ; then
+ while read a b c ; do
+ case "$b" in
+ sysfs)
+ echo -n "Mounting /sys filesystem"
+ echo -e "sysfs\t\t/sys\t\tsysfs\t\trw\t\t 0 0\n" \
+ >>/etc/fstab
+ mount -t sysfs sysfs /sys
+ rc_status -v -r
+ break
+ ;;
+ esac
+ done < /proc/filesystems
+fi
+
+# Start blogd, requires /proc and /dev/pts.
+# Export the real device in variable REDIRECT.
+test -x /sbin/blogd -a -n "$REDIRECT" && /sbin/blogd $REDIRECT
+if test -z "$REDIRECT" ; then
+ if (echo -n > /dev/tty) 2>/dev/null ; then
+ REDIRECT=/dev/tty
+ else
+ REDIRECT=/dev/console
+ fi
+fi
+
+###########################################################################
+#
+# Save old terminal settings and set -nl to avoid staircase
+# effect, do not lock scrolling, and avoid break characters.
+otty=$(stty -g)
+if test "$FLOW_CONTROL" = "yes" ; then
+ stty -nl ixon ignbrk -brkint
+else
+ stty -nl -ixon ignbrk -brkint
+fi
+
+###########################################################################
+#
+# Common used variables
+bootrc=/etc/init.d/boot.d
+rex="[0-9][0-9]"
+failed=""
+skipped=""
+callord=""
+
+#
+# Initialize boosplash progressbar variables
+#
+. /etc/rc.splash B
+splashtrigger "rlchange B"
+
+###########################################################################
+#
+# Do we stop/start script in parallel?
+startpar=$(type -p startpar)
+test "$RUN_PARALLEL" = "yes" || startpar=""
+
+# Start bootup client scripts.
+if test -d ${bootrc}/ ; then
+ for i in ${bootrc}/S*; do
+ test -f $i || continue
+
+ B=${i##*/}
+ script=${B#*S$rex}
+ B=${B%$script}
+
+ rc_splash "$script start"
+
+ if test -z "$startpar" ; then
+ blogger "$script start"
+
+ if test -x "$i" ; then
+ $i start
+ else
+ echo Running $i
+ /bin/sh $i b
+ rc_status -v1 -r
+ fi
+ status=$?
+ echo -en "$rc_reset"
+
+ case $status in
+ [1-4]) failed="${failed:+$failed }$script" ;;
+ [56]) skipped="${skipped:+$skipped }$script" ;;
+ [07]|*) ;;
+ esac
+
+ blogger "$script start exits with status $status"
+ else
+ # Parallel boot only for valid scripts
+ test -x $i || continue
+
+ # Current vector
+ eval cur=\${$B}
+ test -n "$cur" || callord="${callord:+$callord }$B"
+
+ # Remember scripts
+ eval $B="\${cur:+$i }\${cur:-$i}"
+ fi
+ done
+fi
+
+###########################################################################
+#
+# Call the scripts in correct order
+if test -n "$startpar" ; then
+ declare -i s
+ for p in $callord ; do
+ vect=$p
+ eval p=(\${$p})
+
+ blogger "run boot scripts (${p[@]##*S$rex})"
+ if test ${#p[@]} -eq 1 ; then
+ ${p} start
+ status=($?)
+ else
+ status=($($startpar -t 30 -T 3 -a start ${p[@]}))
+ fi
+ echo -en "$rc_reset"
+ blogger "exit status of (${p[@]##*S$rex}) is (${status[@]})"
+
+ s=0
+ for script in ${p[@]##*S$rex} ; do
+ case "${status[$s]}" in
+ [1-4]) failed="${failed:+$failed }$script" ;;
+ [56]) skipped="${skipped:+$skipped }$script" ;;
+ 0|*) ;;
+ esac
+ : $((s++))
+ done
+ done
+fi
+
+###########################################################################
+#
+# Be verbose and print stats
+echo -n "System Boot Control: "
+echo -e "The system has been ${stat}${extd}set up${norm}"
+if test -n "$failed" ; then
+ n=$((${#failed} + 7))
+ echo -n "Failed features: "
+ test $n -lt 47 && echo -en "\033[${COLUMNS}C\033[${n}D"
+ echo -e "${warn}${failed}${norm}"
+fi
+if test -n "$skipped" ; then
+ n=$((${#skipped} + 7))
+ echo -n "Skipped features: "
+ test $n -lt 47 && echo -en "\033[${COLUMNS}C\033[${n}D"
+ echo -e "${attn}${skipped}${norm}"
+fi
+
+###########################################################################
+#
+# Check for boot cycle detection
+test -s /lib/bootcycle/stats && . /lib/bootcycle/stats
+
+# Restore old terminal settings
+stty $otty
+
+###########################################################################
+#
+# Let zic set timezone - if present (from boot.ldconfig).
+if test -n "$TIMEZONE" -a -x /usr/sbin/zic ; then
+ echo -n Setting up timezone data
+ /usr/sbin/zic -l $TIMEZONE
+ rc_status -v -r
+fi
+
+###########################################################################
+#
+# start user defined bootup script.
+if test -f /etc/init.d/boot.local ; then
+ ECHO_RETURN=$rc_done_up
+ echo "Running /etc/init.d/boot.local"
+ /bin/sh /etc/init.d/boot.local || rc_failed
+ rc_status -v1; rc_reset
+ rc_splash "boot.local start"
+fi
+
+rc_reset
+exit 0' >/mnt/etc/init.d/boot
+## end of initial stage4 boot script
+
+# enable execution of all important start scripts
+# running stuff in parallel seems to be rather useless and generates some
+# difficult to solve problems. If you want to try nevertheless enable the
+# following line and disable the latter one (switching off that feature)
+sed -e "s,RUN_PARALLEL=.*,RUN_PARALLEL=\"no\"," \
+ -i /mnt/etc/sysconfig/boot
+# if YaST2 should be runnable (without much effect anyway) on the client
+testmkd /mnt/var/log/YaST2
+# for screen sessions
+testmkd /mnt/var/run/uscreens 4777
+# set special SuSE HOSTNAME file
+echo "$host_name" > /mnt/etc/HOSTNAME
+# produce proper output formatting (of "done", "failed", ...)
+sed -e '/^test $LINES/ {
+i\
+# Script modified here by \$0 during stage3 bootup\
+LINECOL=$(stty size); LINES=${LINECOL% *}; COLUMNS=${LINECOL#* }
+}' -e "/^if test -z \"\$LINES/,/fi$/d" -i /mnt/etc/rc.status
+# check for inittab file
+test -f /mnt/etc/inittab || error "$df_erritab"
+}
+
+# initial (boot time) runlevel scripts
+initial_boot () {
+local scripts=$*
+local count=10
+# boot.slx is a special runlevel script generated within initialramfs which
+# should be executed before the normal runlevel scripts. Proper shutdown is
+# not needed!?
+for i in boot.udev boot.proc boot.klog boot.loadmodules boot.slx boot.clock \
+boot.sysctl boot.ipconfig boot.swap $D_SPLASHY kbd; do
+ count=$(($count + 1))
+ [ $DEBUGLEVEL -ge 2 ] && echo "boot-runlevelscript $i"
+ ln -sf /etc/init.d/$i /mnt/etc/init.d/boot.d/S${count}$i
+done
+}
+
+# linking runlevel scripts
+rllinker () {
+local script="$1"
+if [ $2 -lt 10 ] ; then
+ local start="0$2"; else local start="$2"
+fi
+if [ $3 -lt 10 ] ; then
+ local stop="0$3"; else local stop="$3"
+fi
+# empty runlevel links - decision on running certain services is
+# passed via configuration
+for i in rc3.d/K$stop$script rc5.d/K$stop$script \
+ rc3.d/S$start$script rc5.d/S$start$script ; do
+ ln -sf ../$script /mnt/etc/init.d/$i
+done
+}
+
+# group of functions for the normal runlevels - first parameter is start
+# second stop
+# function for ntp configuration
+config_ntp () {
+if [ -e /mnt/etc/init.d/ntp ] ; then
+ if ! strinfile "ntp:" /mnt/etc/passwd ; then
+ echo -e "ntp:x:74:65534:NTP daemon:/var/lib/ntp:/bin/false" \
+ >>/mnt/etc/passwd
+ echo -e "ntp:!:13099:0:99999:7:::" >>/mnt/etc/shadow
+ fi
+ testmkd /mnt/var/lib/ntp/var/run/ntp
+ if [ "x$start_ntp" = "xyes" ] ; then
+ rllinker "ntp" 7 14
+ fi
+fi
+}
+# function for atd
+config_atd () {
+if [ "x$start_atd" = "xyes" ]; then
+ rllinker "atd" 14 4
+fi
+}
+# function for configuration of cron services
+config_cron () {
+if [ "x$start_cron" = "xyes" ] ; then
+ if [ -f /mnt/etc/init.d/cron ] ; then
+ rllinker "cron" 18 2
+ testmkd /mnt/var/spool/cron/lastrun
+ testmkd /mnt/var/spool/cron/tabs
+ echo -e "# /etc/crontab - file generated by $0:\n\
+#\t$date\nSHELL=/bin/sh\nPATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin\
+\nMAILTO=\n-*/15 * * * *\troot\ttest -x /usr/lib/cron/run-crons && \
+/usr/lib/cron/run-crons >/dev/null 2>&1" >/mnt/etc/crontab
+ else
+ error "$df_errcron" nonfatal
+ fi
+fi
+}
+# name service caching daemon (useful in most cases)
+config_nscd () {
+ if [ -f /mnt/etc/init.d/nscd ] ; then
+ rllinker "nscd" 20 5
+ fi
+}
+# secure shell service
+config_sshd () {
+if [ "x$start_sshd" = "xyes" ] ; then
+ if [ -f /mnt/etc/init.d/sshd ] ; then
+ testmkd /mnt/var/run/sshd
+ testmkd /mnt/var/lib/empty
+ if ! strinfile "sshd:" /mnt/etc/passwd ; then
+ echo -e "sshd:x:117:65534::/var/run/sshd:/usr/sbin/nologin" \
+ >>/mnt/etc/passwd
+ echo -e "sshd:!:13099:0:99999:7:::" >>/mnt/etc/shadow
+ fi
+ # set permissions with userid
+ #d_mkrlscript entry boot.slx "chown sshd:nogroup /var/run/sshd \
+ # /var/lib/empty 2>/dev/null"
+ rllinker "sshd" 25 10
+ else
+ error "$df_errsshd" nonfatal
+ fi
+fi
+}
+# snmp agent for remote monitoring
+config_snmp () {
+if [ "x$start_snmp" = "xyes" ] ; then
+ if [ -f /mnt/etc/init.d/snmpd ] ; then
+ rllinker "snmpd" 24 2
+ testmkd /mnt/var/lib/net-snmp
+ fi
+ # fixme!!
+ # write service monitor depending on services started
+ fi
+}
+# configure print server (lpd or cups)
+config_printer () {
+if [ "x${start_printdaemon}" != "x" ] && \
+ [ "x${start_printdaemon}" != "xno" ]; then
+ case ${start_printdaemon} in
+ yes|cups*|CUPS*)
+ rllinker "cups" 25 1
+ testmkd /mnt/var/spool/cups/tmp
+ #chown -R lp:lp /var/spool/cups
+ ;;
+ lp*|LP*|PLP*)
+ rllinker "lpd" 25 1
+ testmkd /mnt/var/spool/lpd
+ #chown -R lp:lp /var/spool/lpd
+ ;;
+ *)
+ #logwrite "Do not know print-server $start_printdaemon; \
+ #specify 'cups' or 'lpd'."
+ ;;
+ esac
+fi
+# configure cups printer client, avoid to overwrite admin provided printer
+# configuration file
+if [ "x$lpr_servers" != "x" ] && [ ! -e /rootfs/etc/cups/client.conf ] ; then
+ echo -e "# /etc/cups/client.conf - file generated by\n#\t$0:\n\
+#\t$date\n#\nServerName\t$lpr_servers" >/mnt/etc/cups/client.conf
+fi
+}
+# configure bluetooth services
+config_bt () {
+if [ -e /mnt/etc/sysconfig/bluetooth ] ; then
+ sed -e "1i# /etc/sysconfig/bluetooth - file modified by $0" \
+ -e "s,START_SERVICES.*,START_SERVICES=\"yes\"," \
+ -i /mnt/etc/sysconfig/bluetooth
+else
+ : # no bluetooth components installed
+fi
+}
+# set up localization like keytable and consolefont
+dlocale () {
+d_mkrlscript entry boot.slx "# entries added by $0: $date"
+sed -e "s,KEYTABLE=.*,KEYTABLE=\"${KEYTABLE}\"," \
+ -i /mnt/etc/sysconfig/keyboard
+d_mkrlscript entry boot.slx "#loadkeys ${KEYTABLE} >${LOGFILE} 2>&1"
+d_mkrlscript entry boot.slx "#setfont ${CONSOLE_FONT} >${LOGFILE} 2>&1"
+sed -e "s,RC_LANG=.*,RC_LANG=\"${LANG}\" # added in initrd," \
+ -i /mnt/etc/sysconfig/language
+}
+# acpi and powersave daemons, required e.g. to shutdown the machine via
+# power button, no need for early start
+config_acpi () {
+rllinker acpid 22 12
+rllinker powersaved 23 11
+# dbus is required to run acpid and powersaved
+start_dreshal="yes"
+}
+# configure dbus (inter application communication for kde and gnome), hal
+# (hardware abstraction layer - used e.g. by powersaved) and resmgr
+# (resource manager - the user gets permissions to devices when loggin on)
+# runlevel script for haldaemon is now haldaemon instead of hal
+config_dreshal () {
+local start=0
+local stop=18
+if [ "x$start_dreshal" = "xyes" ]; then
+ for dir in /var/run/resmgr/classes /var/lib/PolicyKit; do
+ testmkd /mnt/$dir
+ done
+ if [ -f /mnt/etc/init.d/dbus ] ; then
+ strinfile "messagebus:" /mnt/etc/passwd || \
+ echo "messagebus:x:100:101:User for D-BUS:/var/run/dbus:/bin/false" \
+ >> /mnt/etc/passwd
+ strinfile "messagebus:" /mnt/etc/group || \
+ echo "messagebus:!:101:" >> /mnt/etc/group
+ # create directories and set permissions with user and group id
+ testmkd /mnt/var/run/dbus messagebus:messagebus
+ rllinker "dbus" $start $stop
+ fi
+ if [ -f /mnt/etc/init.d/consolekit ] ; then
+ strinfile "polkituser:" /mnt/etc/passwd || \
+ echo "polkituser:x:104:106:PolicyKit:/var/run/PolicyKit:/bin/false" \
+ >> /mnt/etc/passwd
+ start=$(($start + 1))
+ stop=$(($stop - 1))
+ rllinker "consolekit" $start $stop
+ echo -n > /mnt/var/lib/misc/PolicyKit.reload
+ chmod a+x /mnt/var/lib/misc/PolicyKit.reload
+ fi
+ if [ -f /mnt/etc/init.d/resmgr ] ; then
+ start=$(($start + 1))
+ stop=$(($stop - 1))
+ rllinker "resmgr" $start $stop
+ fi
+ if [ -f /mnt/etc/init.d/haldaemon ] ; then
+ strinfile "haldaemon:" /mnt/etc/passwd || \
+ echo "haldaemon:x:105:103:User for haldaemon:/var/run/hal:/bin/false" \
+ >> /mnt/etc/passwd
+ strinfile "haldaemon:" /mnt/etc/group || \
+ echo "haldaemon:!:103:" >> /mnt/etc/group
+ echo -n "" > /mnt/var/lib/PolicyKit.reload
+ # create directories and set permissions with user and group id
+ testmkd /mnt/var/run/hal haldaemon:haldaemon
+ testmkd /mnt/var/cache/hald haldaemon:haldaemon
+ start=$(($start + 1))
+ stop=$(($stop - 1))
+ rllinker "haldaemon" $start $stop
+ fi
+fi
+}
+# configure automounter (fixme: to be moved into plugin)
+config_automount () {
+if [ -e /mnt/etc/sysconfig/autofs ] ; then
+ testmkd /mnt/var/lock/subsys
+ sed -e "1i# /etc/sysconfig/autofs - file modified by\n#\t$0:\n#" \
+ -e "s,AUTOFS_OPTIONS.*,AUTOFS_OPTIONS=\"--timeout 3\"," \
+ -i /mnt/etc/sysconfig/autofs
+ rllinker "autofs" 18 4
+ # might be needed for autofs via NFS (start specific nfs related services)
+ # echo 'NFS_START_SERVICES="no"' >>/mnt/etc/sysconfig/nfs
+else
+ error "$df_erramt" nonfatal
+fi
+}
+# start name service caching daemon
+config_nscd () {
+if [ -e /mnt/etc/init.d/nscd ] ; then
+ testmkd /mnt/var/run/nscd
+ rllinker "nscd" 16 16
+else
+ error "$df_errnsc" nonfatal
+fi
+}
+# start portmapper (needed at least for nfs and nis services)
+config_portmap () {
+ rllinker "portmap" 2 20
+}
+# start NIS (mostly deprecated)
+config_nis () {
+if [ -f /mnt/etc/init.d/ypbind ] ; then
+ rllinker "ypbind" 6 16
+ config_portmap
+ testmkd /mnt/var/yp/nicknames
+else
+ error "$df_erryp" nonfatal
+fi
+}
+# initialize runlevel skript to be executed during system startup
+# (before most of the normal boot init scripts)
+# this script should operate like a normal runlevel script
+d_mkrlscript () {
+local switch="$1"
+local name="$2"
+local info="$3"
+case "$1" in
+ init)
+ echo -e "#!/bin/sh\n# skeleton of /etc/init.d/${name} created \
+by $0\n# after you applied changes to the creation scripts you have to \
+rerun\n# the mkdxsinitrd script to get them applied\n\
+. /etc/rc.status\n. /etc/sysconfig/logfile\nrc_reset\ncase \
+\"\$1\" in\n start)\n\techo -n \"$info\"" >>/mnt/etc/init.d/${name}
+ chmod u+x /mnt/etc/init.d/${name}
+ ;;
+ entry)
+ echo -e "\t${info}" >>/mnt/etc/init.d/${name}
+ ;;
+ close)
+ echo -e "\trc_status -v\n\t;;\n stop)\n\t;;\nesac\nrc_exit" \
+ >>/mnt/etc/init.d/${name}
+ ;;
+esac
+}
+
+
diff --git a/src/initramfs/distro-specs/ubuntu/functions-10.04 b/src/initramfs/distro-specs/ubuntu/functions-10.04
new file mode 100644
index 00000000..7f73c4ca
--- /dev/null
+++ b/src/initramfs/distro-specs/ubuntu/functions-10.04
@@ -0,0 +1,16 @@
+# Copyright (c) 2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found under http://openslx.org
+#
+# Configuration script for Ubuntu 10.04 configure OpenSLX Linux stateless
+# clients (merged in stage2 with ubuntu/functions-default - and loaded within
+# initial ramfs - stage3) It may overwrite settings from the default config
+# file (/etc/functions)
+
+# no changes from default (as this is default at the moment)
diff --git a/src/initramfs/distro-specs/ubuntu/functions-8.04 b/src/initramfs/distro-specs/ubuntu/functions-8.04
new file mode 100644
index 00000000..3b93e86d
--- /dev/null
+++ b/src/initramfs/distro-specs/ubuntu/functions-8.04
@@ -0,0 +1,296 @@
+# Copyright (c) 2003..2006 - RZ Uni Freiburg
+# Copyright (c) 2006..2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found under http://openslx.org
+#
+# Configuration script for Ubuntu 8.04 configure OpenSLX linux stateless
+# clients (merged in stage2 with ubuntu/functions-default - and loaded within
+# initial ramfs - stage3) It may overwrite settings from the default config
+# file (/etc/functions)
+
+# distro specific configuration variables used in the setup functions
+# (formerly done via config-*, these variables are disputable ...)
+# D_ETCEXCL - list of files, wildcards to be excluded from /etc when using
+# bind mounts
+# D_DIRINBINDMNT - lists of directories to be created in bind mounted rw part
+# of the client filesystem
+# D_RODIRSINRW - ReadOnly Directories in RW part of filesystem to save on
+# TempFS usage
+# D_DIRINDXS - directories in client filesystem which should be present anyhow
+#D_ETCEXCL="etc/gconf/*\n*.old\n*-\netc/autoinstall\nlogrotate*\nbootloader\n\
+#*~\npptp.d\nisdn\nyouservers\nhardware/hwcfg*\n\
+#X11/xdm/pixmaps\ndhclient.script"
+D_BINDMPTS="tmp root home media"
+D_DIRINBINDMNT="/var/run /var/log /var/tmp /var/lib/gdm"
+D_RODIRSINRW="/etc/X11/xkb /var/lib/gconf /var/lib/dpkg /var/lib/aspell \
+/var/lib/pango /var/lib/defoma /var/cache/fontconfig /var/lib/dkms"
+#D_RWDIRSINRO="/var/lib/gdm"
+D_DIRINDXS="/var/X11R6/compose-cache /var/run/sysconfig/tmp /var/adm \
+/var/lib/nobody /var/lib/pam_devperm /var/lib/bluetooth /var/lib/texmf \
+/var/lib/nfs/sm /var/lib/misc /var/lib/acpi /var/spool/cron /var/lib/alsa \
+/var/lock/subsys/sysconfig"
+
+# empty functions are defined at the beginning of /etc/functions
+
+# distro specific stuff to initialize
+preinit () {
+ # load unix module to provide sockets (is compiled into kernel on
+ # the live CDs!?)
+ modprobe ${MODPRV} unix 2>/dev/null || error "$df_errumod" nonfatal
+ modprobe ${MODPRV} vesafb 2>/dev/null || error "$df_errumod" nonfatal
+ modprobe ${MODPRV} fbcon 2>/dev/null || error "$df_errumod" nonfatal
+}
+
+# distro specific function called from servconfig script
+config_distro () {
+ # clean the runlevel directories which will be populated by the stage3 setup
+ for dir in rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rcS.d ; do
+ rm -rf /mnt/etc/${dir}/*
+ done
+ # add the halt link to the 0 and 6 runlevel directories
+ ln -sf ../init.d/halt /mnt/etc/rc0.d/S90halt
+ ln -sf ../init.d/reboot /mnt/etc/rc6.d/S90reboot
+
+ # remove annoying udev rule set for changing eth interface
+ rm /mnt/etc/udev/rules.d/*persistent-net.rules >/dev/null 2>&1
+
+ # inittab is obsolete with the change to upstart in ubuntu 7.10, but to
+ # prevent missunderstandings with the blank inittab created by openslx init
+ # we'll write a comment..
+ echo "# inittab is obsolete with the change to upstart from ubuntu 7.10" \
+ > /mnt/etc/inittab
+
+ # fix getty bug (console login on tty1 is started too early)
+ [ -f /mnt/etc/event.d/tty1 ] && \
+ sed -i "s/start on runlevel 2/start on stopped rc2/" /mnt/etc/event.d/tty1
+
+ # for screen sessions
+ testmkd /mnt/var/run/screen root:utmp 0775
+
+ # no additional /dev/shm mount needed as it is always used
+ sed -e "/Mount a tmpfs on/,/domount tmpfs /d" \
+ -i /mnt/etc/init.d/mountdevsubfs.sh
+
+ # clean up the udev script as much is handled already in stage3
+ sed -e "3i# Script modified during SLX stage3 bootup (config_distro)" \
+ -e "/# This next bit can/a\ /sbin/udevadm trigger" \
+ -e "/# We need the uevent/,/# It's all over/d" \
+ -e "/# Log things that/,/kill \$UDEV/d" -i /mnt/etc/init.d/udev
+
+ # clean the mountall.sh script as only swap activation needed
+ sed -e "3i# Script modified during SLX stage3 bootup (config_distro)" \
+ -e "/pre_mountall/,/post_mountall/d" \
+ -i /mnt/etc/init.d/mountall.sh
+
+ # add the slx specific path (/var/opt/openslx/bin) to the PATH variable
+ echo -e "# stuff generated by $0 (out of InitRamFS written $date)\n\
+export PATH=\"\$PATH:/var/opt/openslx/bin\"" >>/mnt/etc/profile
+
+ # check for inittab file (might fail for new style init -> upstart)
+ #test -f /mnt/etc/inittab || test -d /mnt/etc/event.d || \
+ # error "$df_erritab"
+}
+
+# initial (boot time) runlevel scripts
+initial_boot () {
+local count=10
+# boot.slx is a special runlevel script generated within initialramfs which
+# should be executed before the normal runlevel scripts. Proper shutdown is
+# not needed!?
+for i in mountkernfs.sh mountall.sh mountdevsubfs.sh keyboard-setup procps \
+bootlogd hwclock.sh sudo console-setup udev boot.slx $D_SPLASHY; do
+ count=$(($count + 1))
+ [ $DEBUGLEVEL -ge 2 ] && echo "boot-runlevelscript $i"
+ ln -sf /etc/init.d/$i /mnt/etc/rcS.d/S${count}$i
+done
+}
+
+# linking runlevel scripts
+rllinker () {
+local script="$1"
+if [ $2 -lt 10 ] ; then
+ local start="0$2"; else local start="$2"
+fi
+if [ $3 -lt 10 ] ; then
+ local stop="0$3"; else local stop="$3"
+fi
+# empty runlevel links - decision on running certain services is
+# passed via configuration
+for i in rc2.d/K$stop$script rc3.d/K$stop$script \
+ rc2.d/S$start$script rc3.d/S$start$script ; do
+ if ! [ -f /mnt/etc/init.d/$script ]; then
+ echo "Target `pwd`../$script does not exist. Skipping links"
+ break
+ else
+ ln -sf ../init.d/$script /mnt/etc/$i
+ [ "$DEBUGLEVEL" == 5 ] && echo "Linked $script"
+ fi
+done
+}
+
+# group of functions for the normal runlevels - first parameter is start
+# second stop
+
+# configure udev
+config_udev () {
+ [ -c /dev/pktcdvd ] && { rm -rf /dev/pktcdvd; mkdir /dev/pktcdvd; }
+ if [ -f /mnt/etc/init.d/udev-finish ] ; then
+ rllinker "udev-finish" 24 2
+ fi
+}
+
+# function for ntp configuration
+config_ntp () {
+if [ -f /mnt/etc/init.d/ntp -a "x$start_ntp" != "xno" ] ; then
+ echo -e "ntp:x:74:65534:NTP daemon:/var/lib/ntp:/bin/false" \
+ >>/mnt/etc/passwd
+ testmkd /mnt/var/lib/ntp/var/run/ntp
+ rllinker "ntp" 7 14
+fi
+}
+# function for atd
+config_atd () {
+if [ "x$start_atd" = "xyes" ]; then
+ # testmkd /mnt/var/spool/atjobs
+ # testmkd /mnt/var/spool/atspool
+ # chown 1:1 /mnt/var/spool/atjobs /mnt/var/spool/atspool
+ rllinker "atd" 14 4
+fi
+}
+# function for configuration of cron services (fixme: to be moved to a plugin?)
+config_cron () {
+if [ "x$start_cron" = "xyes" ] ; then
+ if [ -f /mnt/etc/init.d/cron ] ; then
+ rllinker "cron" 18 2
+ # fixme! check for proper permissions!
+ testmkd /mnt/var/spool/crontabs
+ echo -e "# /etc/crontab - file generated by $0:\n\
+#\t$date\nSHELL=/bin/sh\nPATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin\
+\nMAILTO=\n-*/15 * * * *\troot\ttest -x /usr/lib/cron/run-crons && \
+/usr/lib/cron/run-crons >/dev/null 2>&1\n" >/mnt/etc/crontab
+ else
+ error "$df_errcron" nonfatal
+ fi
+fi
+}
+# secure shell service
+config_sshd () {
+if [ "x$start_sshd" = "xyes" ] ; then
+ if [ -f /mnt/etc/init.d/ssh ] ; then
+ #testmkd /mnt/var/run/sshd
+ rllinker "ssh" 12 10
+ else
+ error "$df_errsshd" nonfatal
+ fi
+fi
+}
+# snmp agent for remote monitoring
+config_snmp () {
+if [ "x$start_snmp" = "xyes" ] ; then
+ if [ -f /mnt/etc/init.d/snmpd ] ; then
+ rllinker "snmpd" 24 2
+ testmkd /mnt/var/lib/net-snmp
+ fi
+ # fixme!!
+ # write service monitor depending on services started
+ fi
+}
+# acpi and powersave
+config_acpi () {
+ rllinker "acpid" 8 16
+ #Commented out since battery checking is only useful for Notebooks
+ #rllinker "acpi-support" 99 2
+}
+# configure hal, dbus, policykitd and services like that
+config_dreshal () {
+if [ "x$start_dreshal" = "xyes" ]; then
+ testmkd /mnt/var/lib/dbus
+ testmkd /mnt/var/lib/misc
+ testmkd /mnt/var/cache/hald
+ touch /mnt/var/lib/misc/PolicyKit.reload
+ chown root:polkituser /mnt/var/lib/misc/PolicyKit.reload
+ rm -rf /mnt/etc/dbus-1/system.d/*etwork*anager.conf \
+ /mnt/etc/dbus-1/system.d/nm-* \
+ /mnt/etc/dbus-1/event.d/*NetworkManager*
+ sed -i /mnt/etc/PolicyKit/PolicyKit.conf \
+ -e "s/\(<\/config>\)/ @@new@@\n\1/" \
+ -e "s/@@new@@/<match action=\"@@action@@\">\n@@return@@\n <\/match>/" \
+ -e "s/@@action@@/org.freedesktop.hal.storage.mount-removable/" \
+ -e "s/@@return@@/ <return result=\"yes\"\/>/"
+ sed -i /mnt/etc/dbus-1/system.d/hal.conf \
+ -e "s/^\([^d]*\)deny\(.*Volume.*\)/\1allow\2/"
+ rllinker "dbus" 2 20
+ rllinker "hal" 3 18
+ if [ ! -e /mnt/etc/init.d/policykit ] ; then
+ testmkd /mnt/var/lib/PolicyKit root:polkituser 1770
+ testmkd /mnt/var/lib/PolicyKit-public root:polkituser
+ else
+ rllinker "policykit" 18 10
+ fi
+fi
+}
+
+# initialize boot.slx - skript to be executed during early system startup
+# (before most of the normal boot init scripts)
+# this script should operate like a normal runlevel script (fixme!!)
+d_mkrlscript () {
+local switch="$1"
+local name="$2"
+local info="$3"
+case "$switch" in
+ init)
+ echo -e "#!/bin/sh\n# skeleton of /etc/init.d/$name written \
+from $0\n# after you applied changes to the creation scripts you have to \
+rerun\n# the mkdxsinitrd script to get them applied\n\n\
+. /lib/lsb/init-functions\n" >/mnt/etc/init.d/$name
+ echo -e "\n\ncase \"\$1\" in\n start)\n\tlog_begin_msg \"$info\"" \
+ >>/mnt/etc/init.d/$name
+ chmod u+x /mnt/etc/init.d/$name
+ ;;
+ entry)
+ echo -e "\t${info}" >>/mnt/etc/init.d/${name}
+ ;;
+ close)
+ echo -e "\tlog_end_msg 0\n\t;;\n stop)\n\t;;\nesac\nexit 0" \
+ >>/mnt/etc/init.d/$name
+ ;;
+esac
+}
+# configure automounter
+config_automount () {
+if [ -f /mnt/etc/init.d/autofs ] ; then
+ testmkd /mnt/var/lock/subsys
+ sed -e "1i# /etc/default/autofs - file modified by\n#\t$0:\n#" \
+ -e "s,TIMEOUT.*,TIMEOUT=60," -i /mnt/etc/default/autofs
+ config_portmap
+ rllinker "autofs" 12 4
+ rllinker "nfs-common" 11 5
+fi
+}
+# start portmapper (needed at least for nfsN and nis services)
+config_portmap () {
+ rllinker "portmap" 2 20
+}
+# start NIS (fixme - does the service is really named ypbind??)
+config_nis () {
+ if [ -f /mnt/etc/init.d/ypbind ] ; then
+ rllinker "ypbind" 6 16
+ config_portmap
+ testmkd /mnt/var/yp/nicknames
+ else
+ error "$df_erryp" nonfatal
+ fi
+}
+# name service caching daemon (useful in most cases)
+config_nscd () {
+ if [ -f /mnt/etc/init.d/nscd ] ; then
+ testmkd /mnt/var/cache/nscd
+ rllinker "nscd" 20 5
+ fi
+}
diff --git a/src/initramfs/distro-specs/ubuntu/functions-8.10 b/src/initramfs/distro-specs/ubuntu/functions-8.10
new file mode 100644
index 00000000..8a3469e7
--- /dev/null
+++ b/src/initramfs/distro-specs/ubuntu/functions-8.10
@@ -0,0 +1,296 @@
+# Copyright (c) 2003..2006 - RZ Uni Freiburg
+# Copyright (c) 2006..2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found under http://openslx.org
+#
+# Configuration script for Ubuntu 8.10 configure OpenSLX Linux stateless
+# clients (merged in stage2 with ubuntu/functions-default - and loaded within
+# initial ramfs - stage3) It may overwrite settings from the default config
+# file (/etc/functions)
+
+# distro specific configuration variables used in the setup functions
+# (formerly done via config-*, these variables are disputable ...)
+# D_ETCEXCL - list of files, wildcards to be excluded from /etc when using
+# bind mounts
+# D_DIRINBINDMNT - lists of directories to be created in bind mounted rw part
+# of the client filesystem
+# D_RODIRSINRW - ReadOnly Directories in RW part of filesystem to save on
+# TempFS usage
+# D_DIRINDXS - directories in client filesystem which should be present anyhow
+#D_ETCEXCL="etc/gconf/*\n*.old\n*-\netc/autoinstall\nlogrotate*\nbootloader\n\
+#*~\npptp.d\nisdn\nyouservers\nhardware/hwcfg*\n\
+#X11/xdm/pixmaps\ndhclient.script"
+D_BINDMPTS="tmp root home media"
+D_DIRINBINDMNT="/var/run /var/log /var/tmp /var/lib/gdm"
+D_RODIRSINRW="/etc/X11/xkb /var/lib/gconf /var/lib/dpkg /var/lib/aspell \
+/var/lib/pango /var/lib/defoma /var/cache/fontconfig /var/lib/dkms"
+#D_RWDIRSINRO="/var/lib/gdm"
+D_DIRINDXS="/var/X11R6/compose-cache /var/run/sysconfig/tmp /var/adm \
+/var/lib/nobody /var/lib/pam_devperm /var/lib/bluetooth /var/lib/texmf \
+/var/lib/nfs/sm /var/lib/misc /var/lib/acpi /var/spool/cron /var/lib/alsa \
+/var/lock/subsys/sysconfig"
+
+# empty functions are defined at the beginning of /etc/functions
+
+# distro specific stuff to initialize
+preinit () {
+ # load unix module to provide sockets (is compiled into kernel on
+ # the live CDs!?)
+ modprobe ${MODPRV} unix 2>/dev/null || error "$df_errumod" nonfatal
+ modprobe ${MODPRV} vesafb 2>/dev/null || error "$df_errumod" nonfatal
+ modprobe ${MODPRV} fbcon 2>/dev/null || error "$df_errumod" nonfatal
+}
+
+# distro specific function called from servconfig script
+config_distro () {
+ # clean the runlevel directories which will be populated by the stage3 setup
+ for dir in rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rcS.d ; do
+ rm -rf /mnt/etc/${dir}/*
+ done
+ # add the halt link to the 0 and 6 runlevel directories
+ ln -sf ../init.d/halt /mnt/etc/rc0.d/S90halt
+ ln -sf ../init.d/reboot /mnt/etc/rc6.d/S90reboot
+
+ # remove annoying udev rule set for changing eth interface
+ rm /mnt/etc/udev/rules.d/*persistent-net.rules >/dev/null 2>&1
+
+ # inittab is obsolete with the change to upstart in ubuntu 7.10, but to
+ # prevent missunderstandings with the blank inittab created by openslx init
+ # we'll write a comment..
+ echo "# inittab is obsolete with the change to upstart from ubuntu 7.10" \
+ > /mnt/etc/inittab
+
+ # fix getty bug (console login on tty1 is started too early)
+ [ -f /mnt/etc/event.d/tty1 ] && \
+ sed -i "s/start on runlevel 2/start on stopped rc2/" /mnt/etc/event.d/tty1
+
+ # for screen sessions
+ testmkd /mnt/var/run/screen root:utmp 0775
+
+ # no additional /dev/shm mount needed as it is always used
+ sed -e "/Mount a tmpfs on/,/domount tmpfs /d" \
+ -i /mnt/etc/init.d/mountdevsubfs.sh
+
+ # clean up the udev script as much is handled already in stage3
+ sed -e "3i# Script modified during SLX stage3 bootup (config_distro)" \
+ -e "/# This next bit can/a\ /sbin/udevadm trigger" \
+ -e "/# We need the uevent/,/# It's all over/d" \
+ -e "/# Log things that/,/kill \$UDEV/d" -i /mnt/etc/init.d/udev
+
+ # clean the mountall.sh script as only swap activation needed
+ sed -e "3i# Script modified during SLX stage3 bootup (config_distro)" \
+ -e "/pre_mountall/,/post_mountall/d" \
+ -i /mnt/etc/init.d/mountall.sh
+
+ # add the slx specific path (/var/opt/openslx/bin) to the PATH variable
+ echo -e "# stuff generated by $0 (out of InitRamFS written $date)\n\
+export PATH=\"\$PATH:/var/opt/openslx/bin\"" >>/mnt/etc/profile
+
+ # check for inittab file (might fail for new style init -> upstart)
+ #test -f /mnt/etc/inittab || test -d /mnt/etc/event.d || \
+ # error "$df_erritab"
+}
+
+# initial (boot time) runlevel scripts
+initial_boot () {
+local count=10
+# boot.slx is a special runlevel script generated within initialramfs which
+# should be executed before the normal runlevel scripts. Proper shutdown is
+# not needed!?
+for i in mountkernfs.sh mountall.sh mountdevsubfs.sh keyboard-setup procps \
+bootlogd hwclock.sh sudo console-setup udev boot.slx $D_SPLASHY; do
+ count=$(($count + 1))
+ [ $DEBUGLEVEL -ge 2 ] && echo "boot-runlevelscript $i"
+ ln -sf /etc/init.d/$i /mnt/etc/rcS.d/S${count}$i
+done
+}
+
+# linking runlevel scripts
+rllinker () {
+local script="$1"
+if [ $2 -lt 10 ] ; then
+ local start="0$2"; else local start="$2"
+fi
+if [ $3 -lt 10 ] ; then
+ local stop="0$3"; else local stop="$3"
+fi
+# empty runlevel links - decision on running certain services is
+# passed via configuration
+for i in rc2.d/K$stop$script rc3.d/K$stop$script \
+ rc2.d/S$start$script rc3.d/S$start$script ; do
+ if ! [ -f /mnt/etc/init.d/$script ]; then
+ echo "Target `pwd`../$script does not exist. Skipping links"
+ break
+ else
+ ln -sf ../init.d/$script /mnt/etc/$i
+ [ "$DEBUGLEVEL" == 5 ] && echo "Linked $script"
+ fi
+done
+}
+
+# group of functions for the normal runlevels - first parameter is start
+# second stop
+
+# configure udev
+config_udev () {
+ [ -c /dev/pktcdvd ] && { rm -rf /dev/pktcdvd; mkdir /dev/pktcdvd; }
+ if [ -f /mnt/etc/init.d/udev-finish ] ; then
+ rllinker "udev-finish" 24 2
+ fi
+}
+
+# function for ntp configuration
+config_ntp () {
+if [ -f /mnt/etc/init.d/ntp -a "x$start_ntp" != "xno" ] ; then
+ echo -e "ntp:x:74:65534:NTP daemon:/var/lib/ntp:/bin/false" \
+ >>/mnt/etc/passwd
+ testmkd /mnt/var/lib/ntp/var/run/ntp
+ rllinker "ntp" 7 14
+fi
+}
+# function for atd
+config_atd () {
+if [ "x$start_atd" = "xyes" ]; then
+ # testmkd /mnt/var/spool/atjobs
+ # testmkd /mnt/var/spool/atspool
+ # chown 1:1 /mnt/var/spool/atjobs /mnt/var/spool/atspool
+ rllinker "atd" 14 4
+fi
+}
+# function for configuration of cron services (fixme: to be moved to a plugin?)
+config_cron () {
+if [ "x$start_cron" = "xyes" ] ; then
+ if [ -f /mnt/etc/init.d/cron ] ; then
+ rllinker "cron" 18 2
+ # fixme! check for proper permissions!
+ testmkd /mnt/var/spool/crontabs
+ echo -e "# /etc/crontab - file generated by $0:\n\
+#\t$date\nSHELL=/bin/sh\nPATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin\
+\nMAILTO=\n-*/15 * * * *\troot\ttest -x /usr/lib/cron/run-crons && \
+/usr/lib/cron/run-crons >/dev/null 2>&1\n" >/mnt/etc/crontab
+ else
+ error "$df_errcron" nonfatal
+ fi
+fi
+}
+# secure shell service
+config_sshd () {
+if [ "x$start_sshd" = "xyes" ] ; then
+ if [ -f /mnt/etc/init.d/ssh ] ; then
+ #testmkd /mnt/var/run/sshd
+ rllinker "ssh" 12 10
+ else
+ error "$df_errsshd" nonfatal
+ fi
+fi
+}
+# snmp agent for remote monitoring
+config_snmp () {
+if [ "x$start_snmp" = "xyes" ] ; then
+ if [ -f /mnt/etc/init.d/snmpd ] ; then
+ rllinker "snmpd" 24 2
+ testmkd /mnt/var/lib/net-snmp
+ fi
+ # fixme!!
+ # write service monitor depending on services started
+ fi
+}
+# acpi and powersave
+config_acpi () {
+ rllinker "acpid" 8 16
+ #Commented out since battery checking is only useful for Notebooks
+ #rllinker "acpi-support" 99 2
+}
+# configure hal, dbus, policykitd and services like that
+config_dreshal () {
+if [ "x$start_dreshal" = "xyes" ]; then
+ testmkd /mnt/var/lib/dbus
+ testmkd /mnt/var/lib/misc
+ testmkd /mnt/var/cache/hald
+ touch /mnt/var/lib/misc/PolicyKit.reload
+ chown root:polkituser /mnt/var/lib/misc/PolicyKit.reload
+ rm -rf /mnt/etc/dbus-1/system.d/*etwork*anager.conf \
+ /mnt/etc/dbus-1/system.d/nm-* \
+ /mnt/etc/dbus-1/event.d/*NetworkManager*
+ sed -i /mnt/etc/PolicyKit/PolicyKit.conf \
+ -e "s/\(<\/config>\)/ @@new@@\n\1/" \
+ -e "s/@@new@@/<match action=\"@@action@@\">\n@@return@@\n <\/match>/" \
+ -e "s/@@action@@/org.freedesktop.hal.storage.mount-removable/" \
+ -e "s/@@return@@/ <return result=\"yes\"\/>/"
+ sed -i /mnt/etc/dbus-1/system.d/hal.conf \
+ -e "s/^\([^d]*\)deny\(.*Volume.*\)/\1allow\2/"
+ rllinker "dbus" 2 20
+ rllinker "hal" 3 18
+ if [ ! -e /mnt/etc/init.d/policykit ] ; then
+ testmkd /mnt/var/lib/PolicyKit root:polkituser 1770
+ testmkd /mnt/var/lib/PolicyKit-public root:polkituser
+ else
+ rllinker "policykit" 18 10
+ fi
+fi
+}
+
+# initialize boot.slx - skript to be executed during early system startup
+# (before most of the normal boot init scripts)
+# this script should operate like a normal runlevel script (fixme!!)
+d_mkrlscript () {
+local switch="$1"
+local name="$2"
+local info="$3"
+case "$switch" in
+ init)
+ echo -e "#!/bin/sh\n# skeleton of /etc/init.d/$name written \
+from $0\n# after you applied changes to the creation scripts you have to \
+rerun\n# the mkdxsinitrd script to get them applied\n\n\
+. /lib/lsb/init-functions\n" >/mnt/etc/init.d/$name
+ echo -e "\n\ncase \"\$1\" in\n start)\n\tlog_begin_msg \"$info\"" \
+ >>/mnt/etc/init.d/$name
+ chmod u+x /mnt/etc/init.d/$name
+ ;;
+ entry)
+ echo -e "\t${info}" >>/mnt/etc/init.d/${name}
+ ;;
+ close)
+ echo -e "\tlog_end_msg 0\n\t;;\n stop)\n\t;;\nesac\nexit 0" \
+ >>/mnt/etc/init.d/$name
+ ;;
+esac
+}
+# configure automounter
+config_automount () {
+if [ -f /mnt/etc/init.d/autofs ] ; then
+ testmkd /mnt/var/lock/subsys
+ sed -e "1i# /etc/default/autofs - file modified by\n#\t$0:\n#" \
+ -e "s,TIMEOUT.*,TIMEOUT=60," -i /mnt/etc/default/autofs
+ config_portmap
+ rllinker "autofs" 12 4
+ rllinker "nfs-common" 11 5
+fi
+}
+# start portmapper (needed at least for nfsN and nis services)
+config_portmap () {
+ rllinker "portmap" 2 20
+}
+# start NIS (fixme - does the service is really named ypbind??)
+config_nis () {
+ if [ -f /mnt/etc/init.d/ypbind ] ; then
+ rllinker "ypbind" 6 16
+ config_portmap
+ testmkd /mnt/var/yp/nicknames
+ else
+ error "$df_erryp" nonfatal
+ fi
+}
+# name service caching daemon (useful in most cases)
+config_nscd () {
+ if [ -f /mnt/etc/init.d/nscd ] ; then
+ testmkd /mnt/var/cache/nscd
+ rllinker "nscd" 20 5
+ fi
+}
diff --git a/src/initramfs/distro-specs/ubuntu/functions-9.04 b/src/initramfs/distro-specs/ubuntu/functions-9.04
new file mode 100644
index 00000000..09567aa5
--- /dev/null
+++ b/src/initramfs/distro-specs/ubuntu/functions-9.04
@@ -0,0 +1,293 @@
+# Copyright (c) 2003..2006 - RZ Uni Freiburg
+# Copyright (c) 2006..2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found under http://openslx.org
+#
+# Configuration script for Ubuntu 9.04 configure OpenSLX linux stateless
+# clients (merged in stage2 with ubuntu/functions-default - and loaded within
+# initial ramfs - stage3) It may overwrite settings from the default config
+# file (/etc/functions)
+
+# distro specific configuration variables used in the setup functions
+# (formerly done via config-*, these variables are disputable ...)
+# D_ETCEXCL - list of files, wildcards to be excluded from /etc when using
+# bind mounts
+# D_DIRINBINDMNT - lists of directories to be created in bind mounted rw part
+# of the client filesystem
+# D_RODIRSINRW - ReadOnly Directories in RW part of filesystem to save on
+# TempFS usage
+# D_DIRINDXS - directories in client filesystem which should be present anyhow
+#D_ETCEXCL="etc/gconf/*\n*.old\n*-\netc/autoinstall\nlogrotate*\nbootloader\n\
+#*~\npptp.d\nisdn\nyouservers\nhardware/hwcfg*\n\
+#X11/xdm/pixmaps\ndhclient.script"
+D_BINDMPTS="tmp root home media"
+D_DIRINBINDMNT="/var/run /var/log /var/tmp /var/lib/gdm"
+RODIRSINRW="/var/lib/gconf /var/lib/dpkg /var/lib/aspell /var/lib/mlocate \
+/var/lib/pango /var/lib/defoma /var/cache/fontconfig /var/lib/dkms"
+#D_RWDIRSINRO="/var/lib/gdm"
+D_DIRINDXS="/var/run/sysconfig/tmp /var/adm /var/lib/nobody /var/lib/pam \
+/var/lib/bluetooth /var/lib/texmf /var/lib/nfs/sm /var/lib/misc \
+/var/lib/acpi-support /var/spool/cron /var/lib/alsa /var/lock/subsys"
+
+# empty functions are defined at the beginning of /etc/functions
+
+# distro specific stuff to initialize
+preinit () {
+ # load unix module to provide sockets (is compiled into kernel on
+ # the live CDs!?)
+ modprobe ${MODPRV} fbcon 2>/dev/null || error "$df_errumod" nonfatal
+}
+
+# distro specific function called from servconfig script
+config_distro () {
+ # clean the runlevel directories which will be populated by the stage3 setup
+ for dir in rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rcS.d ; do
+ rm -rf /mnt/etc/${dir}/*
+ done
+ # add the halt link to the 0 and 6 runlevel directories
+ ln -sf ../init.d/halt /mnt/etc/rc0.d/S90halt
+ ln -sf ../init.d/reboot /mnt/etc/rc6.d/S90reboot
+
+ # remove annoying udev rule set for changing eth interface
+ rm /mnt/etc/udev/rules.d/*persistent-net.rules >/dev/null 2>&1
+
+ # inittab is obsolete with the change to upstart in ubuntu 7.10, but to
+ # prevent missunderstandings with the blank inittab created by openslx init
+ # we'll write a comment..
+ echo "# inittab is obsolete with the change to upstart from ubuntu 7.10" \
+ > /mnt/etc/inittab
+
+ # fix getty bug (console login on tty1 is started too early)
+ [ -f /mnt/etc/event.d/tty1 ] && \
+ sed -i "s/start on runlevel 2/start on stopped rc2/" /mnt/etc/event.d/tty1
+
+ # for screen sessions
+ testmkd /mnt/var/run/screen root:utmp 0775
+
+ # no additional /dev/shm mount needed as it is always used
+ sed -e "/Mount a tmpfs on/,/domount tmpfs /d" \
+ -i /mnt/etc/init.d/mountdevsubfs.sh
+
+ # clean up the udev script as much is handled already in stage3
+ sed -e "3i# Script modified during SLX stage3 bootup (config_distro)" \
+ -e "/# This next bit can/a\ /sbin/udevadm trigger" \
+ -e "/# We need the uevent/,/# It's all over/d" \
+ -e "/# Log things that/,/kill \$UDEV/d" -i /mnt/etc/init.d/udev
+
+ # clean the mountall.sh script as only swap activation needed
+ sed -e "3i# Script modified during SLX stage3 bootup (config_distro)" \
+ -e "/pre_mountall/,/post_mountall/d" \
+ -i /mnt/etc/init.d/mountall.sh
+
+ # add the slx specific path (/var/opt/openslx/bin) to the PATH variable
+ echo -e "# stuff generated by $0 (out of InitRamFS written $date)\n\
+export PATH=\"\$PATH:/var/opt/openslx/bin\"" >>/mnt/etc/profile
+
+ # check for inittab file (might fail for new style init -> upstart)
+ #test -f /mnt/etc/inittab || test -d /mnt/etc/event.d || \
+ # error "$df_erritab"
+}
+
+# initial (boot time) runlevel scripts
+initial_boot () {
+local count=10
+# boot.slx is a special runlevel script generated within initialramfs which
+# should be executed before the normal runlevel scripts. Proper shutdown is
+# not needed!?
+for i in mountkernfs.sh mountall.sh mountdevsubfs.sh keyboard-setup procps \
+bootlogd hwclock.sh sudo console-setup udev boot.slx $D_SPLASHY; do
+ count=$(($count + 1))
+ [ $DEBUGLEVEL -ge 2 ] && echo "boot-runlevelscript $i"
+ ln -sf /etc/init.d/$i /mnt/etc/rcS.d/S${count}$i
+done
+}
+
+# linking runlevel scripts
+rllinker () {
+local script="$1"
+if [ $2 -lt 10 ] ; then
+ local start="0$2"; else local start="$2"
+fi
+if [ $3 -lt 10 ] ; then
+ local stop="0$3"; else local stop="$3"
+fi
+# empty runlevel links - decision on running certain services is
+# passed via configuration
+for i in rc2.d/K$stop$script rc3.d/K$stop$script \
+ rc2.d/S$start$script rc3.d/S$start$script ; do
+ if ! [ -f /mnt/etc/init.d/$script ]; then
+ echo "Target `pwd`../$script does not exist. Skipping links"
+ break
+ else
+ ln -sf ../init.d/$script /mnt/etc/$i
+ [ "$DEBUGLEVEL" == 5 ] && echo "Linked $script"
+ fi
+done
+}
+
+# group of functions for the normal runlevels - first parameter is start
+# second stop
+
+# configure udev
+config_udev () {
+ [ -c /dev/pktcdvd ] && { rm -rf /dev/pktcdvd; mkdir /dev/pktcdvd; }
+ if [ -f /mnt/etc/init.d/udev-finish ] ; then
+ rllinker "udev-finish" 24 2
+ fi
+}
+
+# function for ntp configuration
+config_ntp () {
+if [ -f /mnt/etc/init.d/ntp -a "x$start_ntp" != "xno" ] ; then
+ echo -e "ntp:x:74:65534:NTP daemon:/var/lib/ntp:/bin/false" \
+ >>/mnt/etc/passwd
+ testmkd /mnt/var/lib/ntp/var/run/ntp
+ rllinker "ntp" 7 14
+fi
+}
+# function for atd
+config_atd () {
+if [ "x$start_atd" = "xyes" ]; then
+ # testmkd /mnt/var/spool/atjobs
+ # testmkd /mnt/var/spool/atspool
+ # chown 1:1 /mnt/var/spool/atjobs /mnt/var/spool/atspool
+ rllinker "atd" 14 4
+fi
+}
+# function for configuration of cron services (fixme: to be moved to a plugin?)
+config_cron () {
+if [ "x$start_cron" = "xyes" ] ; then
+ if [ -f /mnt/etc/init.d/cron ] ; then
+ rllinker "cron" 18 2
+ # fixme! check for proper permissions!
+ testmkd /mnt/var/spool/crontabs
+ echo -e "# /etc/crontab - file generated by $0:\n\
+#\t$date\nSHELL=/bin/sh\nPATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin\
+\nMAILTO=\n-*/15 * * * *\troot\ttest -x /usr/lib/cron/run-crons && \
+/usr/lib/cron/run-crons >/dev/null 2>&1\n" >/mnt/etc/crontab
+ else
+ error "$df_errcron" nonfatal
+ fi
+fi
+}
+# secure shell service
+config_sshd () {
+if [ "x$start_sshd" = "xyes" ] ; then
+ if [ -f /mnt/etc/init.d/ssh ] ; then
+ #testmkd /mnt/var/run/sshd
+ rllinker "ssh" 12 10
+ else
+ error "$df_errsshd" nonfatal
+ fi
+fi
+}
+# snmp agent for remote monitoring
+config_snmp () {
+if [ "x$start_snmp" = "xyes" ] ; then
+ if [ -f /mnt/etc/init.d/snmpd ] ; then
+ rllinker "snmpd" 24 2
+ testmkd /mnt/var/lib/net-snmp
+ fi
+ # fixme!!
+ # write service monitor depending on services started
+ fi
+}
+# acpi and powersave
+config_acpi () {
+ rllinker "acpid" 8 16
+ #Commented out since battery checking is only useful for Notebooks
+ #rllinker "acpi-support" 99 2
+}
+# configure hal, dbus, policykitd and services like that
+config_dreshal () {
+if [ "x$start_dreshal" = "xyes" ]; then
+ testmkd /mnt/var/lib/dbus
+ testmkd /mnt/var/lib/misc
+ testmkd /mnt/var/cache/hald
+ touch /mnt/var/lib/misc/PolicyKit.reload
+ chown root:polkituser /mnt/var/lib/misc/PolicyKit.reload
+ rm -rf /mnt/etc/dbus-1/system.d/*etwork*anager.conf \
+ /mnt/etc/dbus-1/system.d/nm-* \
+ /mnt/etc/dbus-1/event.d/*NetworkManager*
+ sed -i /mnt/etc/PolicyKit/PolicyKit.conf \
+ -e "s/\(<\/config>\)/ @@new@@\n\1/" \
+ -e "s/@@new@@/<match action=\"@@action@@\">\n@@return@@\n <\/match>/" \
+ -e "s/@@action@@/org.freedesktop.hal.storage.mount-removable/" \
+ -e "s/@@return@@/ <return result=\"yes\"\/>/"
+ sed -i /mnt/etc/dbus-1/system.d/hal.conf \
+ -e "s/^\([^d]*\)deny\(.*Volume.*\)/\1allow\2/"
+ rllinker "dbus" 2 20
+ rllinker "hal" 3 18
+ if [ ! -e /mnt/etc/init.d/policykit ] ; then
+ testmkd /mnt/var/lib/PolicyKit root:polkituser 1770
+ testmkd /mnt/var/lib/PolicyKit-public root:polkituser
+ else
+ rllinker "policykit" 18 10
+ fi
+fi
+}
+
+# initialize boot.slx - skript to be executed during early system startup
+# (before most of the normal boot init scripts)
+# this script should operate like a normal runlevel script (fixme!!)
+d_mkrlscript () {
+local switch="$1"
+local name="$2"
+local info="$3"
+case "$switch" in
+ init)
+ echo -e "#!/bin/sh\n# skeleton of /etc/init.d/$name written \
+from $0\n# after you applied changes to the creation scripts you have to \
+rerun\n# the mkdxsinitrd script to get them applied\n\n\
+. /lib/lsb/init-functions\n" >/mnt/etc/init.d/$name
+ echo -e "\n\ncase \"\$1\" in\n start)\n\tlog_begin_msg \"$info\"" \
+ >>/mnt/etc/init.d/$name
+ chmod u+x /mnt/etc/init.d/$name
+ ;;
+ entry)
+ echo -e "\t${info}" >>/mnt/etc/init.d/${name}
+ ;;
+ close)
+ echo -e "\tlog_end_msg 0\n\t;;\n stop)\n\t;;\nesac\nexit 0" \
+ >>/mnt/etc/init.d/$name
+ ;;
+esac
+}
+# configure automounter
+config_automount () {
+if [ -f /mnt/etc/init.d/autofs ] ; then
+ testmkd /mnt/var/lock/subsys
+ sed -e "1i# /etc/default/autofs - file modified by\n#\t$0:\n#" \
+ -e "s,TIMEOUT.*,TIMEOUT=60," -i /mnt/etc/default/autofs
+ config_portmap
+ rllinker "autofs" 12 4
+ rllinker "nfs-common" 11 5
+fi
+}
+# start portmapper (needed at least for nfsN and nis services)
+config_portmap () {
+ rllinker "portmap" 2 20
+}
+# start NIS (fixme - does the service is really named ypbind??)
+config_nis () {
+ if [ -f /mnt/etc/init.d/ypbind ] ; then
+ rllinker "ypbind" 6 16
+ config_portmap
+ testmkd /mnt/var/yp/nicknames
+ else
+ error "$df_erryp" nonfatal
+ fi
+}
+# name service caching daemon (useful in most cases)
+config_nscd () {
+ if [ -f /mnt/etc/init.d/nscd ] ; then
+ testmkd /mnt/var/cache/nscd
+ rllinker "nscd" 20 5
+ fi
+}
diff --git a/src/initramfs/distro-specs/ubuntu/functions-9.10 b/src/initramfs/distro-specs/ubuntu/functions-9.10
new file mode 100644
index 00000000..28d1dba3
--- /dev/null
+++ b/src/initramfs/distro-specs/ubuntu/functions-9.10
@@ -0,0 +1,16 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found under http://openslx.org
+#
+# Configuration script for Ubuntu 9.10 configure OpenSLX Linux stateless
+# clients (merged in stage2 with ubuntu/functions-default - and loaded within
+# initial ramfs - stage3) It may overwrite settings from the default config
+# file (/etc/functions)
+
+# no changes from default
diff --git a/src/initramfs/distro-specs/ubuntu/functions-default b/src/initramfs/distro-specs/ubuntu/functions-default
new file mode 100644
index 00000000..1fdbf6bb
--- /dev/null
+++ b/src/initramfs/distro-specs/ubuntu/functions-default
@@ -0,0 +1,286 @@
+# Copyright (c) 2003..2006 - RZ Uni Freiburg
+# Copyright (c) 2006..2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found under http://openslx.org
+#
+# Configuration script for general Ubuntu to configure OpenSLX Linux
+# stateless clients (executed within initial ramdisk after genconfig)
+
+# distro specific configuration variables used in the setup functions
+# (formerly done via config-*, these variables are disputable ...)
+# D_ETCEXCL - list of files, wildcards to be excluded from /etc when using
+# bind mounts
+# D_DIRINBINDMNT - lists of directories to be created in bind mounted rw part
+# of the client filesystem
+# D_RODIRSINRW - ReadOnly Directories in RW part of filesystem to save on
+# TempFS usage
+# D_DIRINDXS - directories in client filesystem which should be present anyhow
+D_BINDMPTS="tmp root home media"
+D_DIRINBINDMNT="/var/run /var/log /var/tmp /var/lib/gdm"
+D_RODIRSINRW="/etc/X11/xkb /var/lib/gconf /var/lib/dpkg /var/lib/aspell \
+/var/lib/pango /var/lib/defoma /var/cache/fontconfig /var/lib/dkms"
+D_DIRINDXS="/var/run/sysconfig/tmp /var/lib/nobody /var/lib/misc /var/lib/pam \
+/var/lib/bluetooth /var/lib/texmf /var/lib/nfs/sm /var/lib/acpi_support \
+/var/spool/cron /var/lib/alsa"
+
+# distro specific stuff to initialize
+postinit () {
+ if [ $DEBUGLEVEL -gt 3 ]; then
+ export DEBUG_UPSTART=" -v --debug"
+ fi
+}
+
+# distro specific function called from servconfig script
+config_distro () {
+ # runlevel system changed significantly compared to pre 9.10 sys-v-init
+ # clean up nevertheless
+ for dir in rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rcS.d ; do
+ rm -rf /mnt/etc/${dir}/*
+ done
+ # remove unneeded init scripts (stuff handled in stage3 which would
+ # interface with already existing setup)
+ # copy all event scripts to a special directory
+ testmkd /mnt/etc/init.inactive
+ echo -e "# This directory was created in OpenSLX stage3 and contains all \
+disabled\n# upstart scripts. They are moved by servconfig to init if this is \
+required." >/mnt/etc/init.inactive/README
+ mv /mnt/etc/init/* /mnt/etc/init.inactive
+ # remove plymouth component from *dm.conf (not needed with splashy)
+ sed "/# Check kernel c/,/done/d" -i /mnt/etc/init.inactive/*dm.conf
+ # copy initial upstart scripts back
+ for file in alsa-mixer-save control-alt-delete console-setup dbus \
+ dmesg hwclock hwclock-save irqbalance module-init-tools \
+ mountall mounted* networking procps rc* tty* udev* \
+ upstart-udev-bridge ; do
+ mv /mnt/etc/init.inactive/${file}.conf /mnt/etc/init >/dev/null 2>&1
+ done
+
+ # remove annoying udev rule set for changing eth interface and cd/dvds
+ rm /mnt/etc/udev/rules.d/*persistent*.rules >/dev/null 2>&1
+
+ # for screen sessions
+ testmkd /mnt/var/run/screen root:utmp 0777
+
+ # apt stuff
+ testmkd /mnt/var/cache/apt/archives/partial
+
+ # add the slx specific path (/var/opt/openslx/bin) to the PATH variable
+ echo -e "# stuff generated by $0 (out of InitRamFS written $date)\n\
+export PATH=\"\$PATH:/var/opt/openslx/bin\"" >>/mnt/etc/profile
+}
+
+# initial boot looks different since ubuntu upstart
+initial_boot () {
+ :
+}
+
+# runlevel linker - mostly deprecated in the old form because of new upstart
+# mechanism (with backward compatibility)
+rllinker () {
+local script="$1"
+# activating the new way, check if a appropriate script is available, else
+# try the traditional approach
+
+if [ -e /mnt/etc/init.inactive/${script}.conf -o -e /mnt/etc/init/${script}.conf ]; then
+ # we have upstart scripts
+ if [ -e /mnt/etc/init.inactive/${script}.conf ] ; then
+ mv /mnt/etc/init.inactive/${script}.conf /mnt/etc/init
+ fi
+elif [ -e /mnt/etc/init.d/${script} ]; then
+ # we old rc scripts
+ if [ -e /mnt/etc/init.d/${script} -a -n "$1" -a -n "$2" ] ; then
+ if [ $2 -lt 10 ] ; then
+ local start="0$2"; else local start="$2"
+ fi
+ if [ $3 -lt 10 ] ; then
+ local stop="0$3"; else local stop="$3"
+ fi
+ for i in rc2.d/K$stop$script rc3.d/K$stop$script \
+ rc2.d/S$start$script rc3.d/S$start$script ; do
+ ln -sf ../init.d/$script /mnt/etc/$i
+ [ "$DEBUGLEVEL" == 5 ] && echo "Linked $script"
+ done
+ fi
+else
+ error "Script: ${script} does not exist. Skipping setup of startscipts/events.." nonfatal
+fi
+
+}
+
+# set up localization like keytable, console
+dlocale () {
+# fixme -- use keytable setup script here
+# echo -e "\t# entries added by $0: $date" >> /mnt/etc/init.d/boot.slx
+sed -e "1i# File modified during SLX stage3 bootup (config_distro)" \
+ -e "s/LANG.*/LANG=\"${LANG}\"/" -i /mnt/etc/default/locale
+}
+
+# function for ntp configuration
+config_ntp () {
+if [ -f /mnt/etc/init.d/ntp -a "x$start_ntp" != "xno" ] ; then
+ echo -e "ntp:x:74:65534:NTP daemon:/var/lib/ntp:/bin/false" \
+ >>/mnt/etc/passwd
+ testmkd /mnt/var/lib/ntp/var/run/ntp
+
+fi
+}
+# function for atd
+config_atd () {
+if [ "x$start_atd" = "xyes" ]; then
+ # testmkd /mnt/var/spool/atjobs
+ # testmkd /mnt/var/spool/atspool
+ # chown 1:1 /mnt/var/spool/atjobs /mnt/var/spool/atspool
+ if [ -f /mnt/etc/init.inactive/atd ] ; then
+ mv /mnt/etc/init.inactive/atd /mnt/etc/init
+ else
+ error "$df_erratd" nonfatal
+ fi
+fi
+}
+# function for configuration of cron services (fixme: to be moved to a plugin?)
+config_cron () {
+if [ "x$start_cron" = "xyes" ] ; then
+ if [ -f /mnt/etc/init.inactive/anacron ] ; then
+ mv /mnt/etc/init.inactive/anacron /mnt/etc/init
+ # fixme! check for proper permissions!
+ testmkd /mnt/var/spool/crontabs
+ echo -e "# /etc/crontab - file generated by $0:\n\
+#\t$date\nSHELL=/bin/sh\nPATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin\
+\nMAILTO=\n-*/15 * * * *\troot\ttest -x /usr/lib/cron/run-crons && \
+/usr/lib/cron/run-crons >/dev/null 2>&1\n" >/mnt/etc/crontab
+ else
+ error "$df_errcron" nonfatal
+ fi
+fi
+}
+# secure shell service
+config_sshd () {
+if [ "x$start_sshd" = "xyes" ] ; then
+ if [ -f /mnt/etc/init.inactive/ssh.conf ] ; then
+ testmkd /mnt/var/run/sshd
+ mv /mnt/etc/init.inactive/ssh.conf /mnt/etc/init
+ else
+ error "$df_errsshd" nonfatal
+ fi
+fi
+}
+# snmp agent for remote monitoring (upstart functionality unchecked)
+config_snmp () {
+if [ "x$start_snmp" = "xyes" ] ; then
+ if [ -f /mnt/etc/init.inactive/snmpd.conf ] ; then
+ testmkd /mnt/var/lib/net-snmp
+ mv /mnt/etc/init.inactive/snmpd.conf /mnt/etc/init
+ else
+ # fixme!!
+ # write service monitor depending on services started
+ :
+ fi
+fi
+}
+# acpi and powersave
+config_acpi () {
+ if [ -f /mnt/etc/init.inactive/acpid.conf ] ; then
+ mv /mnt/etc/init.inactive/acpid.conf /mnt/etc/init
+ else
+ # fixme!!
+ # write service monitor depending on services started
+ :
+ fi
+}
+# configure hal, dbus, policykitd and services like that
+config_dreshal () {
+if [ "x$start_dreshal" = "xyes" ]; then
+ testmkd /mnt/var/lib/dbus
+ testmkd /mnt/var/lib/misc
+ testmkd /mnt/var/cache/hald
+ rm -rf /mnt/etc/dbus-1/system.d/*etwork*anager.conf \
+ /mnt/etc/dbus-1/system.d/nm-* \
+ /mnt/etc/dbus-1/event.d/*NetworkManager*
+ sed -i /mnt/etc/dbus-1/system.d/hal.conf \
+ -e "s/^\([^d]*\)deny\(.*Volume.*\)/\1allow\2/"
+ for dir in 10-vendor.d 20-org.d 30-site.d 50-local.d 90-mandatory.d ; do
+ testmkd /mnt/var/lib/polkit-1/localauthority/${dir}
+ done
+fi
+}
+
+# initialize boot.slx - skript to be executed during early system startup
+# (before most of the normal boot init scripts)
+# this script should operate like a normal runlevel script (fixme!!)
+d_mkrlscript () {
+local switch="$1"
+local name="$2"
+local info="$3"
+# ToDo: needs to be adapted to upstart mechanism
+case "$switch" in
+ init)
+ echo -e "#!/bin/sh\n# skeleton of /etc/init.d/$name written \
+from $0\n# after you applied changes to the creation scripts you have to \
+rerun\n# the mkdxsinitrd script to get them applied\n\n\
+. /lib/lsb/init-functions\n" >/mnt/etc/init.d/$name
+ echo -e "\n\ncase \"\$1\" in\n start)\n\tlog_begin_msg \"$info\"" \
+ >>/mnt/etc/init.d/$name
+ chmod u+x /mnt/etc/init.d/$name
+ ;;
+ entry)
+ echo -e "\t${info}" >>/mnt/etc/init.d/${name}
+ ;;
+ close)
+ echo -e "\tlog_end_msg 0\n\t;;\n stop)\n\t;;\nesac\nexit 0" \
+ >>/mnt/etc/init.d/$name
+ ;;
+esac
+}
+# configure automounter (unchecked)
+config_automount () {
+if [ -f /mnt/etc/init.inactive/autofs.conf ] ; then
+ mv /mnt/etc/init.inactive/autofs.conf /mnt/etc/init
+ testmkd /mnt/var/lock/subsys
+ sed -e "1i# /etc/default/autofs - file modified by\n#\t$0:\n#" \
+ -e "s,TIMEOUT.*,TIMEOUT=60," -i /mnt/etc/default/autofs
+ config_portmap
+ config_nfs
+fi
+}
+# start portmapper (needed at least for nfsN and nis services)
+config_portmap () {
+if [ -f /mnt/etc/init.inactive/portmap.conf ]; then
+ mv /mnt/etc/init.inactive/portmap.conf /mnt/etc/init
+ mv /mnt/etc/init.inactive/statd.conf /mnt/etc/init
+else
+ error "$df_errpmap" nonfatal
+fi
+}
+# mostly unused yet (needs to be properly integrated)
+config_nfs () {
+ [ -e /mnt/etc/init.inactive/gssd.conf ] && \
+ mv /mnt/etc/init.inactive/gssd.conf /mnt/etc/init
+ [ -e /mnt/etc/init.inactive/rpc_pipefs.conf ] && \
+ mv /mnt/etc/init.inactive/rpc_pipefs.conf /mnt/etc/init
+ [ -e /mnt/etc/init.inactive/idmapd.conf ] && \
+ mv /mnt/etc/init.inactive/idmapd.conf /mnt/etc/init
+}
+
+# start NIS (unchecked!! fixme - does the service is really named ypbind??)
+config_nis () {
+ if [ -f /mnt/etc/init.inactive/ypbind.conf ] ; then
+ mv /mnt/etc/init.inactive/ypbind.conf /mnt/etc/init
+ config_portmap
+ testmkd /mnt/var/yp/nicknames
+ else
+ error "$df_erryp" nonfatal
+ fi
+}
+# name service caching daemon (really existing!?)
+config_nscd () {
+ #if [ -f /mnt/etc/init.inactive/nscd.conf ] ; then
+ # testmkd /mnt/var/cache/nscd
+ #fi
+ :
+}
diff --git a/src/initramfs/eglibc-packages/compcache/usr/bin/rzscontrol b/src/initramfs/eglibc-packages/compcache/usr/bin/rzscontrol
new file mode 100755
index 00000000..0d7f2702
--- /dev/null
+++ b/src/initramfs/eglibc-packages/compcache/usr/bin/rzscontrol
Binary files differ
diff --git a/src/initramfs/eglibc-packages/hwinfo/lib/libdbus-1.so.3 b/src/initramfs/eglibc-packages/hwinfo/lib/libdbus-1.so.3
new file mode 100644
index 00000000..526f06dc
--- /dev/null
+++ b/src/initramfs/eglibc-packages/hwinfo/lib/libdbus-1.so.3
Binary files differ
diff --git a/src/initramfs/eglibc-packages/hwinfo/lib/librt.so.1 b/src/initramfs/eglibc-packages/hwinfo/lib/librt.so.1
new file mode 100644
index 00000000..fbea0db1
--- /dev/null
+++ b/src/initramfs/eglibc-packages/hwinfo/lib/librt.so.1
Binary files differ
diff --git a/src/initramfs/eglibc-packages/hwinfo/usr/lib/libhal.so.1 b/src/initramfs/eglibc-packages/hwinfo/usr/lib/libhal.so.1
new file mode 100644
index 00000000..8db463f0
--- /dev/null
+++ b/src/initramfs/eglibc-packages/hwinfo/usr/lib/libhal.so.1
Binary files differ
diff --git a/src/initramfs/eglibc-packages/hwinfo/usr/lib/libhd.so.16 b/src/initramfs/eglibc-packages/hwinfo/usr/lib/libhd.so.16
new file mode 100644
index 00000000..3fd68f29
--- /dev/null
+++ b/src/initramfs/eglibc-packages/hwinfo/usr/lib/libhd.so.16
Binary files differ
diff --git a/src/initramfs/eglibc-packages/hwinfo/usr/sbin/hwinfo b/src/initramfs/eglibc-packages/hwinfo/usr/sbin/hwinfo
new file mode 100755
index 00000000..5dbe48a4
--- /dev/null
+++ b/src/initramfs/eglibc-packages/hwinfo/usr/sbin/hwinfo
Binary files differ
diff --git a/src/initramfs/eglibc-packages/mksquashfs/lib/libm.so.6 b/src/initramfs/eglibc-packages/mksquashfs/lib/libm.so.6
new file mode 100644
index 00000000..0e557bfe
--- /dev/null
+++ b/src/initramfs/eglibc-packages/mksquashfs/lib/libm.so.6
Binary files differ
diff --git a/src/initramfs/eglibc-packages/mksquashfs/lib/libpthread.so.0 b/src/initramfs/eglibc-packages/mksquashfs/lib/libpthread.so.0
new file mode 100755
index 00000000..55de7d33
--- /dev/null
+++ b/src/initramfs/eglibc-packages/mksquashfs/lib/libpthread.so.0
Binary files differ
diff --git a/src/initramfs/eglibc-packages/mksquashfs/usr/bin/mksquashfs_3_3 b/src/initramfs/eglibc-packages/mksquashfs/usr/bin/mksquashfs_3_3
new file mode 100755
index 00000000..0f4efdc8
--- /dev/null
+++ b/src/initramfs/eglibc-packages/mksquashfs/usr/bin/mksquashfs_3_3
Binary files differ
diff --git a/src/initramfs/eglibc-packages/mksquashfs/usr/bin/mksquashfs_4 b/src/initramfs/eglibc-packages/mksquashfs/usr/bin/mksquashfs_4
new file mode 100755
index 00000000..b40e6e42
--- /dev/null
+++ b/src/initramfs/eglibc-packages/mksquashfs/usr/bin/mksquashfs_4
Binary files differ
diff --git a/src/initramfs/eglibc-packages/nbd-client/sbin/nbd-client b/src/initramfs/eglibc-packages/nbd-client/sbin/nbd-client
new file mode 100755
index 00000000..634e6ff3
--- /dev/null
+++ b/src/initramfs/eglibc-packages/nbd-client/sbin/nbd-client
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/bin/plymouth b/src/initramfs/eglibc-packages/plymouth/bin/plymouth
new file mode 100755
index 00000000..a8a5a638
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/bin/plymouth
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/lib/libply-splash-core.so.2 b/src/initramfs/eglibc-packages/plymouth/lib/libply-splash-core.so.2
new file mode 100644
index 00000000..875479cb
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/lib/libply-splash-core.so.2
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/lib/libply.so.2 b/src/initramfs/eglibc-packages/plymouth/lib/libply.so.2
new file mode 100644
index 00000000..14532e2b
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/lib/libply.so.2
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/lib/librt.so.1 b/src/initramfs/eglibc-packages/plymouth/lib/librt.so.1
new file mode 100644
index 00000000..fbea0db1
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/lib/librt.so.1
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/sbin/plymouthd b/src/initramfs/eglibc-packages/plymouth/sbin/plymouthd
new file mode 100755
index 00000000..c1876a3e
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/sbin/plymouthd
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/details/details.plymouth b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/details/details.plymouth
new file mode 100644
index 00000000..bd849642
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/details/details.plymouth
@@ -0,0 +1,4 @@
+[Plymouth Theme]
+Name=Details
+Description=Verbose fallback theme
+ModuleName=details
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/fade-in/bullet.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/fade-in/bullet.png
new file mode 100644
index 00000000..dd527369
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/fade-in/bullet.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/fade-in/entry.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/fade-in/entry.png
new file mode 100644
index 00000000..a9f4157b
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/fade-in/entry.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/fade-in/fade-in.plymouth b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/fade-in/fade-in.plymouth
new file mode 100644
index 00000000..e90b94e9
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/fade-in/fade-in.plymouth
@@ -0,0 +1,7 @@
+[Plymouth Theme]
+Name=Fade In
+Description=Simple theme that fades in and out with shimmering stars
+ModuleName=fade-throbber
+
+[fade-throbber]
+ImageDir=/usr/share/plymouth/themes/fade-in
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/fade-in/lock.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/fade-in/lock.png
new file mode 100644
index 00000000..7ddd3751
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/fade-in/lock.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/fade-in/star.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/fade-in/star.png
new file mode 100644
index 00000000..8d175cac
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/fade-in/star.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/box.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/box.png
new file mode 100644
index 00000000..54876e68
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/box.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/bullet.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/bullet.png
new file mode 100644
index 00000000..87ddfe81
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/bullet.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/entry.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/entry.png
new file mode 100644
index 00000000..37217b63
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/entry.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/glow.plymouth b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/glow.plymouth
new file mode 100644
index 00000000..38cbafba
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/glow.plymouth
@@ -0,0 +1,11 @@
+[Plymouth Theme]
+Name=Bizcom Glow
+Description=Corporate theme with pie chart boot progress followed by a glowing emerging logo
+ModuleName=two-step
+
+[two-step]
+ImageDir=/usr/share/plymouth/themes/glow
+HorizontalAlignment=.25
+VerticalAlignment=.5
+Transition=merge-fade
+TransitionDuration=.5
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/lock.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/lock.png
new file mode 100644
index 00000000..a0f8c12f
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/lock.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-00.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-00.png
new file mode 100644
index 00000000..9f94fc01
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-00.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-01.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-01.png
new file mode 100644
index 00000000..b00035d5
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-01.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-02.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-02.png
new file mode 100644
index 00000000..872da19d
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-02.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-03.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-03.png
new file mode 100644
index 00000000..24f32ff5
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-03.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-04.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-04.png
new file mode 100644
index 00000000..da1ecbd4
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-04.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-05.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-05.png
new file mode 100644
index 00000000..38721afe
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-05.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-06.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-06.png
new file mode 100644
index 00000000..3efdca73
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-06.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-07.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-07.png
new file mode 100644
index 00000000..53277ed0
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-07.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-08.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-08.png
new file mode 100644
index 00000000..db0b570a
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-08.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-09.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-09.png
new file mode 100644
index 00000000..14c20559
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-09.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-10.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-10.png
new file mode 100644
index 00000000..c522bc5c
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-10.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-11.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-11.png
new file mode 100644
index 00000000..30171ec2
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-11.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-12.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-12.png
new file mode 100644
index 00000000..b920cb17
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-12.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-13.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-13.png
new file mode 100644
index 00000000..c697003c
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-13.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-14.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-14.png
new file mode 100644
index 00000000..02b7d07d
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-14.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-15.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-15.png
new file mode 100644
index 00000000..533ceb0d
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-15.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-16.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-16.png
new file mode 100644
index 00000000..7039f4fd
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-16.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-17.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-17.png
new file mode 100644
index 00000000..210c9173
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-17.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-18.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-18.png
new file mode 100644
index 00000000..f36be2c8
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-18.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-19.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-19.png
new file mode 100644
index 00000000..b44475b8
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-19.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-20.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-20.png
new file mode 100644
index 00000000..45d275b7
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-20.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-21.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-21.png
new file mode 100644
index 00000000..641ba2f9
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-21.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-22.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-22.png
new file mode 100644
index 00000000..9805103b
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-22.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-23.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-23.png
new file mode 100644
index 00000000..d8a41a54
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-23.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-24.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-24.png
new file mode 100644
index 00000000..ac25bdcf
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-24.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-25.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-25.png
new file mode 100644
index 00000000..66cd03d9
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-25.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-26.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-26.png
new file mode 100644
index 00000000..e19fb685
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-26.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-27.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-27.png
new file mode 100644
index 00000000..d875c3a5
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-27.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-28.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-28.png
new file mode 100644
index 00000000..dd2a1a3c
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-28.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-29.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-29.png
new file mode 100644
index 00000000..4d8b3494
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-29.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-30.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-30.png
new file mode 100644
index 00000000..7ea1544c
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-30.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-31.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-31.png
new file mode 100644
index 00000000..73e85d26
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-31.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-32.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-32.png
new file mode 100644
index 00000000..914bc6dc
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/progress-32.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-00.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-00.png
new file mode 100644
index 00000000..6eed4b4f
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-00.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-01.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-01.png
new file mode 100644
index 00000000..3bc8747b
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-01.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-02.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-02.png
new file mode 100644
index 00000000..d14f24cf
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-02.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-03.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-03.png
new file mode 100644
index 00000000..aa5554c1
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-03.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-04.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-04.png
new file mode 100644
index 00000000..02a42c23
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-04.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-05.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-05.png
new file mode 100644
index 00000000..08d30cff
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-05.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-06.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-06.png
new file mode 100644
index 00000000..1b3c0b93
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-06.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-07.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-07.png
new file mode 100644
index 00000000..cf6b61dc
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-07.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-08.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-08.png
new file mode 100644
index 00000000..fa62c8c2
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-08.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-09.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-09.png
new file mode 100644
index 00000000..70094674
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-09.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-10.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-10.png
new file mode 100644
index 00000000..f145d643
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-10.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-11.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-11.png
new file mode 100644
index 00000000..d7d0c433
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-11.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-12.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-12.png
new file mode 100644
index 00000000..f161c67c
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-12.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-13.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-13.png
new file mode 100644
index 00000000..334f78d7
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-13.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-14.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-14.png
new file mode 100644
index 00000000..535f7ea7
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-14.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-15.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-15.png
new file mode 100644
index 00000000..3291f07c
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-15.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-16.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-16.png
new file mode 100644
index 00000000..b8557916
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-16.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-17.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-17.png
new file mode 100644
index 00000000..e9148416
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-17.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-18.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-18.png
new file mode 100644
index 00000000..3ae351a0
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-18.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-19.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-19.png
new file mode 100644
index 00000000..2a27b62d
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/glow/throbber-19.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/box.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/box.png
new file mode 100644
index 00000000..54876e68
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/box.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/bullet.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/bullet.png
new file mode 100644
index 00000000..dd527369
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/bullet.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/entry.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/entry.png
new file mode 100644
index 00000000..a9f4157b
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/entry.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/lock.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/lock.png
new file mode 100644
index 00000000..a0f8c12f
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/lock.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/progress_bar.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/progress_bar.png
new file mode 100644
index 00000000..dd1e747a
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/progress_bar.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/progress_box.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/progress_box.png
new file mode 100644
index 00000000..c485cfbc
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/progress_box.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/script.plymouth b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/script.plymouth
new file mode 100644
index 00000000..1ee47bda
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/script.plymouth
@@ -0,0 +1,11 @@
+[Plymouth Theme]
+Name=Script
+Description=Script example plugin.
+ModuleName=script
+
+[script]
+ImageDir=/usr/share/plymouth/themes/script
+ScriptFile=/usr/share/plymouth/themes/script/script.script
+
+[script-env-vars]
+example_env_var=example env var value
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/script.script b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/script.script
new file mode 100644
index 00000000..ed54a010
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/script/script.script
@@ -0,0 +1,164 @@
+# This is an example plymouth plugin script
+
+Window.SetBackgroundTopColor(0.234, 0.43, 0.705);
+Window.SetBackgroundBottomColor(0.16, 0.25, 0.44);
+
+logo.image = Image("special://logo");
+logo.sprite = Sprite(logo.image);
+logo.opacity_angle = 0;
+
+fun refresh_callback ()
+ {
+ if (status == "normal")
+ {
+ logo.opacity_angle += ((2 * 3.14) / 50) * 0.5; # 0.5 HZ
+ min_opacity = 0.3;
+ opacity = (Math.Cos(logo.opacity_angle) + 1) / 2;
+ opacity *= 1 - min_opacity;
+ opacity += min_opacity;
+ logo.sprite.SetX (Window.GetX() + Window.GetWidth() / 2 - logo.image.GetWidth() / 2);
+ logo.sprite.SetY (Window.GetY() + Window.GetHeight() / 2 - logo.image.GetHeight() / 2);
+ logo.sprite.SetOpacity (opacity);
+ }
+ else
+ {
+ logo.sprite.SetX (0);
+ logo.sprite.SetY (0);
+ logo.sprite.SetOpacity (1);
+ }
+ }
+
+Plymouth.SetRefreshFunction (refresh_callback);
+
+#----------------------------------------- Dialogue --------------------------------
+
+status = "normal";
+
+fun dialog_setup()
+ {
+ local.box;
+ local.lock;
+ local.entry;
+
+ box.image = Image("box.png");
+ lock.image = Image("lock.png");
+ entry.image = Image("entry.png");
+
+ box.sprite = Sprite(box.image);
+ box.x = Window.GetX() + Window.GetWidth() / 2 - box.image.GetWidth ()/2;
+ box.y = Window.GetY() + Window.GetHeight() / 2 - box.image.GetHeight()/2;
+ box.z = 10000;
+ box.sprite.SetPosition(box.x, box.y, box.z);
+
+ lock.sprite = Sprite(lock.image);
+ lock.x = box.x + box.image.GetWidth()/2 - (lock.image.GetWidth() + entry.image.GetWidth()) / 2;
+ lock.y = box.y + box.image.GetHeight()/2 - lock.image.GetHeight()/2;
+ lock.z = box.z + 1;
+ lock.sprite.SetPosition(lock.x, lock.y, lock.z);
+
+ entry.sprite = Sprite(entry.image);
+ entry.x = lock.x + lock.image.GetWidth();
+ entry.y = box.y + box.image.GetHeight()/2 - entry.image.GetHeight()/2;
+ entry.z = box.z + 1;
+ entry.sprite.SetPosition(entry.x, entry.y, entry.z);
+
+ global.dialog.box = box;
+ global.dialog.lock = lock;
+ global.dialog.entry = entry;
+ global.dialog.bullet_image = Image("bullet.png");
+ dialog_opacity (1);
+ }
+
+fun dialog_opacity(opacity)
+ {
+ dialog.box.sprite.SetOpacity (opacity);
+ dialog.lock.sprite.SetOpacity (opacity);
+ dialog.entry.sprite.SetOpacity (opacity);
+ for (index = 0; dialog.bullet[index]; index++)
+ {
+ dialog.bullet[index].sprite.SetOpacity(opacity);
+ }
+ }
+
+fun display_normal_callback ()
+ {
+ global.status = "normal";
+ if (global.dialog)
+ dialog_opacity (0);
+ }
+
+fun display_password_callback (prompt, bullets)
+ {
+ global.status = "password";
+ if (!global.dialog)
+ dialog_setup();
+ else
+ dialog_opacity(1);
+ for (index = 0; dialog.bullet[index] || index < bullets; index++)
+ {
+ if (!dialog.bullet[index])
+ {
+ dialog.bullet[index].sprite = Sprite(dialog.bullet_image);
+ dialog.bullet[index].x = dialog.entry.x + index * dialog.bullet_image.GetWidth();
+ dialog.bullet[index].y = dialog.entry.y + dialog.entry.image.GetHeight() / 2 - dialog.bullet_image.GetHeight() / 2;
+ dialog.bullet[index].z = dialog.entry.z + 1;
+ dialog.bullet[index].sprite.SetPosition(dialog.bullet[index].x, dialog.bullet[index].y, dialog.bullet[index].z);
+ }
+ if (index < bullets)
+ dialog.bullet[index].sprite.SetOpacity(1);
+ else
+ dialog.bullet[index].sprite.SetOpacity(0);
+ }
+ }
+
+Plymouth.SetDisplayNormalFunction(display_normal_callback);
+Plymouth.SetDisplayPasswordFunction(display_password_callback);
+
+#----------------------------------------- Progress Bar --------------------------------
+
+progress_box.image = Image("progress_box.png");
+progress_box.sprite = Sprite(progress_box.image);
+
+progress_box.x = Window.GetX() + Window.GetWidth() / 2 - progress_box.image.GetWidth() / 2;
+progress_box.y = Window.GetY() + Window.GetHeight() * 0.75 - progress_box.image.GetHeight() / 2;
+progress_box.sprite.SetPosition(progress_box.x, progress_box.y, 0);
+
+progress_bar.original_image = Image("progress_bar.png");
+progress_bar.sprite = Sprite();
+
+progress_bar.x = Window.GetX() + Window.GetWidth() / 2 - progress_bar.original_image.GetWidth() / 2;
+progress_bar.y = Window.GetY() + Window.GetHeight() / 2 * 1.5 - progress_box.image.GetHeight() / 2 + (progress_box.image.GetHeight() - progress_bar.original_image.GetHeight()) / 2;
+progress_bar.sprite.SetPosition(progress_bar.x, progress_bar.y, 1);
+
+fun progress_callback (duration, progress)
+ {
+ if (progress_bar.image.GetWidth () != Math.Int (progress_bar.original_image.GetWidth () * progress))
+ {
+ progress_bar.image = progress_bar.original_image.Scale(progress_bar.original_image.GetWidth(progress_bar.original_image) * progress, progress_bar.original_image.GetHeight());
+ progress_bar.sprite.SetImage (progress_bar.image);
+ }
+ }
+
+Plymouth.SetBootProgressFunction(progress_callback);
+
+#----------------------------------------- Quit --------------------------------
+
+fun quit_callback ()
+{
+ logo.sprite.SetOpacity (1);
+}
+
+Plymouth.SetQuitFunction(quit_callback);
+
+#----------------------------------------- Message --------------------------------
+
+message_sprite = Sprite();
+message_sprite.SetPosition(10, 10, 10000);
+
+fun message_callback (text)
+{
+ my_image = Image.Text(text, 1, 1, 1);
+ message_sprite.SetImage(my_image);
+}
+
+Plymouth.SetMessageFunction(message_callback);
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/box.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/box.png
new file mode 100644
index 00000000..54876e68
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/box.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/bullet.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/bullet.png
new file mode 100644
index 00000000..dd527369
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/bullet.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/entry.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/entry.png
new file mode 100644
index 00000000..a9f4157b
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/entry.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/lock.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/lock.png
new file mode 100644
index 00000000..a0f8c12f
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/lock.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/progress_bar.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/progress_bar.png
new file mode 100644
index 00000000..b520bc3a
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/progress_bar.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/solar.plymouth b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/solar.plymouth
new file mode 100644
index 00000000..13d25f8d
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/solar.plymouth
@@ -0,0 +1,7 @@
+[Plymouth Theme]
+Name=Solar
+Description=Space theme with violent flaring blue star
+ModuleName=space-flares
+
+[space-flares]
+ImageDir=/usr/share/plymouth/themes/solar
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/star.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/star.png
new file mode 100644
index 00000000..f4467ed5
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/solar/star.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/box.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/box.png
new file mode 100644
index 00000000..54876e68
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/box.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/bullet.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/bullet.png
new file mode 100644
index 00000000..dd527369
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/bullet.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/entry.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/entry.png
new file mode 100644
index 00000000..a9f4157b
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/entry.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/lock.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/lock.png
new file mode 100644
index 00000000..a0f8c12f
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/lock.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/spinfinity.plymouth b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/spinfinity.plymouth
new file mode 100644
index 00000000..f2baf3f8
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/spinfinity.plymouth
@@ -0,0 +1,7 @@
+[Plymouth Theme]
+Name=Spinfinity
+Description=Simple theme that shows a rotating infinity sign in the center of the screen
+ModuleName=throbgress
+
+[throbgress]
+ImageDir=/usr/share/plymouth/themes/spinfinity
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-00.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-00.png
new file mode 100644
index 00000000..5ca64413
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-00.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-01.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-01.png
new file mode 100644
index 00000000..dac708be
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-01.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-02.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-02.png
new file mode 100644
index 00000000..68aa2d21
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-02.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-03.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-03.png
new file mode 100644
index 00000000..ec63a382
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-03.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-04.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-04.png
new file mode 100644
index 00000000..876bf373
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-04.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-05.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-05.png
new file mode 100644
index 00000000..fa909b97
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-05.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-06.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-06.png
new file mode 100644
index 00000000..3d446354
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-06.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-07.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-07.png
new file mode 100644
index 00000000..b932c68b
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-07.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-08.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-08.png
new file mode 100644
index 00000000..920c8dbd
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-08.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-09.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-09.png
new file mode 100644
index 00000000..b4526956
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-09.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-10.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-10.png
new file mode 100644
index 00000000..99377a90
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-10.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-11.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-11.png
new file mode 100644
index 00000000..3bd36a9e
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-11.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-12.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-12.png
new file mode 100644
index 00000000..da6ce584
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-12.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-13.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-13.png
new file mode 100644
index 00000000..58cd02f9
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-13.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-14.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-14.png
new file mode 100644
index 00000000..b43aef1a
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-14.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-15.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-15.png
new file mode 100644
index 00000000..8eb06d8f
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-15.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-16.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-16.png
new file mode 100644
index 00000000..0689f510
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-16.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-17.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-17.png
new file mode 100644
index 00000000..db78d6b6
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-17.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-18.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-18.png
new file mode 100644
index 00000000..29967543
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-18.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-19.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-19.png
new file mode 100644
index 00000000..66b17fe0
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-19.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-20.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-20.png
new file mode 100644
index 00000000..1af7efcf
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-20.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-21.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-21.png
new file mode 100644
index 00000000..661c0a32
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-21.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-22.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-22.png
new file mode 100644
index 00000000..fbd0379e
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-22.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-23.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-23.png
new file mode 100644
index 00000000..4fda936d
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-23.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-24.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-24.png
new file mode 100644
index 00000000..8be2bc0a
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-24.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-25.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-25.png
new file mode 100644
index 00000000..2009b4bd
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-25.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-26.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-26.png
new file mode 100644
index 00000000..531a39d0
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-26.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-27.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-27.png
new file mode 100644
index 00000000..51a9b688
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-27.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-28.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-28.png
new file mode 100644
index 00000000..1f598586
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-28.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-29.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-29.png
new file mode 100644
index 00000000..10143567
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-29.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-30.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-30.png
new file mode 100644
index 00000000..652bdef4
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-30.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-31.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-31.png
new file mode 100644
index 00000000..6792bc8f
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-31.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-32.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-32.png
new file mode 100644
index 00000000..232c05bf
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-32.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-33.png b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-33.png
new file mode 100644
index 00000000..b9836fef
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/spinfinity/throbber-33.png
Binary files differ
diff --git a/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/text/text.plymouth b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/text/text.plymouth
new file mode 100644
index 00000000..a2db9e68
--- /dev/null
+++ b/src/initramfs/eglibc-packages/plymouth/usr/share/plymouth/themes/text/text.plymouth
@@ -0,0 +1,4 @@
+[Plymouth Theme]
+Name=Text
+Description=Text mode theme with tricolor progress bar
+ModuleName=text
diff --git a/src/initramfs/eglibc-packages/strace/usr/bin/strace b/src/initramfs/eglibc-packages/strace/usr/bin/strace
new file mode 100755
index 00000000..efe78e71
--- /dev/null
+++ b/src/initramfs/eglibc-packages/strace/usr/bin/strace
Binary files differ
diff --git a/src/initramfs/eglibc-rootfs/bin/ash b/src/initramfs/eglibc-rootfs/bin/ash
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/ash
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/bash b/src/initramfs/eglibc-rootfs/bin/bash
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/bash
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/busybox b/src/initramfs/eglibc-rootfs/bin/busybox
new file mode 100755
index 00000000..fa652e7b
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/busybox
Binary files differ
diff --git a/src/initramfs/eglibc-rootfs/bin/cat b/src/initramfs/eglibc-rootfs/bin/cat
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/cat
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/chgrp b/src/initramfs/eglibc-rootfs/bin/chgrp
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/chgrp
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/chmod b/src/initramfs/eglibc-rootfs/bin/chmod
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/chmod
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/chown b/src/initramfs/eglibc-rootfs/bin/chown
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/chown
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/cp b/src/initramfs/eglibc-rootfs/bin/cp
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/cp
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/cpio b/src/initramfs/eglibc-rootfs/bin/cpio
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/cpio
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/cttyhack b/src/initramfs/eglibc-rootfs/bin/cttyhack
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/cttyhack
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/date b/src/initramfs/eglibc-rootfs/bin/date
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/date
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/dd b/src/initramfs/eglibc-rootfs/bin/dd
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/dd
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/df b/src/initramfs/eglibc-rootfs/bin/df
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/df
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/dmesg b/src/initramfs/eglibc-rootfs/bin/dmesg
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/dmesg
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/echo b/src/initramfs/eglibc-rootfs/bin/echo
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/echo
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/egrep b/src/initramfs/eglibc-rootfs/bin/egrep
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/egrep
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/false b/src/initramfs/eglibc-rootfs/bin/false
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/false
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/grep b/src/initramfs/eglibc-rootfs/bin/grep
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/grep
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/gunzip b/src/initramfs/eglibc-rootfs/bin/gunzip
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/gunzip
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/gzip b/src/initramfs/eglibc-rootfs/bin/gzip
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/gzip
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/ip b/src/initramfs/eglibc-rootfs/bin/ip
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/ip
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/ipcalc b/src/initramfs/eglibc-rootfs/bin/ipcalc
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/ipcalc
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/kill b/src/initramfs/eglibc-rootfs/bin/kill
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/kill
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/ln b/src/initramfs/eglibc-rootfs/bin/ln
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/ln
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/ls b/src/initramfs/eglibc-rootfs/bin/ls
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/ls
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/mkdir b/src/initramfs/eglibc-rootfs/bin/mkdir
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/mkdir
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/mknod b/src/initramfs/eglibc-rootfs/bin/mknod
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/mknod
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/mount b/src/initramfs/eglibc-rootfs/bin/mount
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/mount
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/mv b/src/initramfs/eglibc-rootfs/bin/mv
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/mv
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/nice b/src/initramfs/eglibc-rootfs/bin/nice
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/nice
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/pidof b/src/initramfs/eglibc-rootfs/bin/pidof
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/pidof
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/ping b/src/initramfs/eglibc-rootfs/bin/ping
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/ping
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/ps b/src/initramfs/eglibc-rootfs/bin/ps
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/ps
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/pwd b/src/initramfs/eglibc-rootfs/bin/pwd
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/pwd
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/rev b/src/initramfs/eglibc-rootfs/bin/rev
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/rev
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/rm b/src/initramfs/eglibc-rootfs/bin/rm
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/rm
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/sed b/src/initramfs/eglibc-rootfs/bin/sed
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/sed
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/sh b/src/initramfs/eglibc-rootfs/bin/sh
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/sh
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/sleep b/src/initramfs/eglibc-rootfs/bin/sleep
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/sleep
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/sync b/src/initramfs/eglibc-rootfs/bin/sync
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/sync
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/tar b/src/initramfs/eglibc-rootfs/bin/tar
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/tar
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/touch b/src/initramfs/eglibc-rootfs/bin/touch
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/touch
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/true b/src/initramfs/eglibc-rootfs/bin/true
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/true
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/umount b/src/initramfs/eglibc-rootfs/bin/umount
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/umount
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/uname b/src/initramfs/eglibc-rootfs/bin/uname
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/uname
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/usleep b/src/initramfs/eglibc-rootfs/bin/usleep
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/usleep
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/vi b/src/initramfs/eglibc-rootfs/bin/vi
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/vi
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/bin/zcat b/src/initramfs/eglibc-rootfs/bin/zcat
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/bin/zcat
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/lib/ld-2.11.2.so b/src/initramfs/eglibc-rootfs/lib/ld-2.11.2.so
new file mode 100755
index 00000000..fecb3a46
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/lib/ld-2.11.2.so
Binary files differ
diff --git a/src/initramfs/eglibc-rootfs/lib/ld-linux.so.2 b/src/initramfs/eglibc-rootfs/lib/ld-linux.so.2
new file mode 120000
index 00000000..e1654955
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/lib/ld-linux.so.2
@@ -0,0 +1 @@
+ld-2.11.2.so \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/lib/libc.so.6 b/src/initramfs/eglibc-rootfs/lib/libc.so.6
new file mode 100755
index 00000000..bfd7ef5d
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/lib/libc.so.6
Binary files differ
diff --git a/src/initramfs/eglibc-rootfs/lib/libdbus-1.so.3 b/src/initramfs/eglibc-rootfs/lib/libdbus-1.so.3
new file mode 100644
index 00000000..526f06dc
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/lib/libdbus-1.so.3
Binary files differ
diff --git a/src/initramfs/eglibc-rootfs/lib/libdl.so.2 b/src/initramfs/eglibc-rootfs/lib/libdl.so.2
new file mode 100644
index 00000000..b7d6dacc
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/lib/libdl.so.2
Binary files differ
diff --git a/src/initramfs/eglibc-rootfs/lib/libm.so.6 b/src/initramfs/eglibc-rootfs/lib/libm.so.6
new file mode 100644
index 00000000..0e557bfe
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/lib/libm.so.6
Binary files differ
diff --git a/src/initramfs/eglibc-rootfs/lib/librt.so.1 b/src/initramfs/eglibc-rootfs/lib/librt.so.1
new file mode 100644
index 00000000..fbea0db1
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/lib/librt.so.1
Binary files differ
diff --git a/src/initramfs/eglibc-rootfs/sbin/bootchartd b/src/initramfs/eglibc-rootfs/sbin/bootchartd
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/bootchartd
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/fbsplash b/src/initramfs/eglibc-rootfs/sbin/fbsplash
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/fbsplash
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/fdisk b/src/initramfs/eglibc-rootfs/sbin/fdisk
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/fdisk
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/getty b/src/initramfs/eglibc-rootfs/sbin/getty
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/getty
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/halt b/src/initramfs/eglibc-rootfs/sbin/halt
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/halt
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/hdparm b/src/initramfs/eglibc-rootfs/sbin/hdparm
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/hdparm
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/hwclock b/src/initramfs/eglibc-rootfs/sbin/hwclock
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/hwclock
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/inotifyd b/src/initramfs/eglibc-rootfs/sbin/inotifyd
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/inotifyd
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/insmod b/src/initramfs/eglibc-rootfs/sbin/insmod
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/insmod
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/klogd b/src/initramfs/eglibc-rootfs/sbin/klogd
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/klogd
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/ldconfig b/src/initramfs/eglibc-rootfs/sbin/ldconfig
new file mode 100755
index 00000000..74da4189
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/ldconfig
Binary files differ
diff --git a/src/initramfs/eglibc-rootfs/sbin/loadkmap b/src/initramfs/eglibc-rootfs/sbin/loadkmap
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/loadkmap
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/logread b/src/initramfs/eglibc-rootfs/sbin/logread
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/logread
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/lsmod b/src/initramfs/eglibc-rootfs/sbin/lsmod
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/lsmod
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/lspci b/src/initramfs/eglibc-rootfs/sbin/lspci
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/lspci
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/lsusb b/src/initramfs/eglibc-rootfs/sbin/lsusb
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/lsusb
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/mdev b/src/initramfs/eglibc-rootfs/sbin/mdev
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/mdev
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/mkdosfs b/src/initramfs/eglibc-rootfs/sbin/mkdosfs
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/mkdosfs
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/mkfs.vfat b/src/initramfs/eglibc-rootfs/sbin/mkfs.vfat
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/mkfs.vfat
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/mkswap b/src/initramfs/eglibc-rootfs/sbin/mkswap
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/mkswap
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/modinfo b/src/initramfs/eglibc-rootfs/sbin/modinfo
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/modinfo
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/modprobe b/src/initramfs/eglibc-rootfs/sbin/modprobe
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/modprobe
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/poweroff b/src/initramfs/eglibc-rootfs/sbin/poweroff
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/poweroff
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/reboot b/src/initramfs/eglibc-rootfs/sbin/reboot
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/reboot
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/rmmod b/src/initramfs/eglibc-rootfs/sbin/rmmod
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/rmmod
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/route b/src/initramfs/eglibc-rootfs/sbin/route
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/route
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/start-stop-daemon b/src/initramfs/eglibc-rootfs/sbin/start-stop-daemon
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/start-stop-daemon
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/swapoff b/src/initramfs/eglibc-rootfs/sbin/swapoff
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/swapoff
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/swapon b/src/initramfs/eglibc-rootfs/sbin/swapon
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/swapon
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/switch_root b/src/initramfs/eglibc-rootfs/sbin/switch_root
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/switch_root
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/sysctl b/src/initramfs/eglibc-rootfs/sbin/sysctl
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/sysctl
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/syslogd b/src/initramfs/eglibc-rootfs/sbin/syslogd
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/syslogd
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/tunctl b/src/initramfs/eglibc-rootfs/sbin/tunctl
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/tunctl
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/udhcpc b/src/initramfs/eglibc-rootfs/sbin/udhcpc
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/udhcpc
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/vconfig b/src/initramfs/eglibc-rootfs/sbin/vconfig
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/vconfig
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/watchdog b/src/initramfs/eglibc-rootfs/sbin/watchdog
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/watchdog
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/sbin/zcip b/src/initramfs/eglibc-rootfs/sbin/zcip
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/sbin/zcip
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/[ b/src/initramfs/eglibc-rootfs/usr/bin/[
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/[
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/[[ b/src/initramfs/eglibc-rootfs/usr/bin/[[
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/[[
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/ar b/src/initramfs/eglibc-rootfs/usr/bin/ar
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/ar
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/arping b/src/initramfs/eglibc-rootfs/usr/bin/arping
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/arping
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/awk b/src/initramfs/eglibc-rootfs/usr/bin/awk
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/awk
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/basename b/src/initramfs/eglibc-rootfs/usr/bin/basename
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/basename
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/bunzip2 b/src/initramfs/eglibc-rootfs/usr/bin/bunzip2
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/bunzip2
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/bzcat b/src/initramfs/eglibc-rootfs/usr/bin/bzcat
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/bzcat
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/bzip2 b/src/initramfs/eglibc-rootfs/usr/bin/bzip2
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/bzip2
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/chvt b/src/initramfs/eglibc-rootfs/usr/bin/chvt
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/chvt
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/cut b/src/initramfs/eglibc-rootfs/usr/bin/cut
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/cut
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/deallocvt b/src/initramfs/eglibc-rootfs/usr/bin/deallocvt
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/deallocvt
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/du b/src/initramfs/eglibc-rootfs/usr/bin/du
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/du
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/dumpleases b/src/initramfs/eglibc-rootfs/usr/bin/dumpleases
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/dumpleases
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/eject b/src/initramfs/eglibc-rootfs/usr/bin/eject
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/eject
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/env b/src/initramfs/eglibc-rootfs/usr/bin/env
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/env
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/expr b/src/initramfs/eglibc-rootfs/usr/bin/expr
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/expr
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/fgconsole b/src/initramfs/eglibc-rootfs/usr/bin/fgconsole
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/fgconsole
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/find b/src/initramfs/eglibc-rootfs/usr/bin/find
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/find
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/flock b/src/initramfs/eglibc-rootfs/usr/bin/flock
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/flock
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/free b/src/initramfs/eglibc-rootfs/usr/bin/free
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/free
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/ftpget b/src/initramfs/eglibc-rootfs/usr/bin/ftpget
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/ftpget
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/ftpput b/src/initramfs/eglibc-rootfs/usr/bin/ftpput
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/ftpput
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/head b/src/initramfs/eglibc-rootfs/usr/bin/head
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/head
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/id b/src/initramfs/eglibc-rootfs/usr/bin/id
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/id
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/killall b/src/initramfs/eglibc-rootfs/usr/bin/killall
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/killall
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/ld b/src/initramfs/eglibc-rootfs/usr/bin/ld
new file mode 100755
index 00000000..f169e2ec
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/ld
Binary files differ
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/ldd b/src/initramfs/eglibc-rootfs/usr/bin/ldd
new file mode 100755
index 00000000..4dba3cfb
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/ldd
@@ -0,0 +1,193 @@
+#! /bin/bash
+# Copyright (C) 1996-2008, 2009 Free Software Foundation, Inc.
+# This file is part of the GNU C Library.
+
+# The GNU C Library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+
+# The GNU C Library 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
+# Lesser General Public License for more details.
+
+# You should have received a copy of the GNU Lesser General Public
+# License along with the GNU C Library; if not, write to the Free
+# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+# 02111-1307 USA.
+
+
+# This is the `ldd' command, which lists what shared libraries are
+# used by given dynamically-linked executables. It works by invoking the
+# run-time dynamic linker as a command and setting the environment
+# variable LD_TRACE_LOADED_OBJECTS to a non-empty value.
+
+# We should be able to find the translation right at the beginning.
+TEXTDOMAIN=libc
+TEXTDOMAINDIR=/usr/share/locale
+
+RTLDLIST="/lib/ld-linux.so.2 /lib64/ld-linux-x86-64.so.2"
+warn=
+bind_now=
+verbose=
+
+while test $# -gt 0; do
+ case "$1" in
+ --vers | --versi | --versio | --version)
+ echo 'ldd (Debian EGLIBC 2.11.2-2) 2.11.2'
+ printf $"Copyright (C) %s Free Software Foundation, Inc.
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+" "2009"
+ printf $"Written by %s and %s.
+" "Roland McGrath" "Ulrich Drepper"
+ exit 0
+ ;;
+ --h | --he | --hel | --help)
+ printf $"Usage: ldd [OPTION]... FILE...
+ --help print this help and exit
+ --version print version information and exit
+ -d, --data-relocs process data relocations
+ -r, --function-relocs process data and function relocations
+ -u, --unused print unused direct dependencies
+ -v, --verbose print all information
+"
+ printf $"For bug reporting instructions, please see:
+%s.
+" "<http://www.debian.org/Bugs/>"
+ exit 0
+ ;;
+ -d | --d | --da | --dat | --data | --data- | --data-r | --data-re | \
+ --data-rel | --data-relo | --data-reloc | --data-relocs)
+ warn=yes
+ shift
+ ;;
+ -r | --f | --fu | --fun | --func | --funct | --functi | --functio | \
+ --function | --function- | --function-r | --function-re | --function-rel | \
+ --function-relo | --function-reloc | --function-relocs)
+ warn=yes
+ bind_now=yes
+ shift
+ ;;
+ -v | --verb | --verbo | --verbos | --verbose)
+ verbose=yes
+ shift
+ ;;
+ -u | --u | --un | --unu | --unus | --unuse | --unused)
+ unused=yes
+ shift
+ ;;
+ --v | --ve | --ver)
+ echo >&2 $"ldd: option \`$1' is ambiguous"
+ exit 1
+ ;;
+ --) # Stop option processing.
+ shift; break
+ ;;
+ -*)
+ echo >&2 'ldd:' $"unrecognized option" "\`$1'"
+ echo >&2 $"Try \`ldd --help' for more information."
+ exit 1
+ ;;
+ *)
+ break
+ ;;
+ esac
+done
+
+nonelf ()
+{
+ # Maybe extra code for non-ELF binaries.
+ return 1;
+}
+
+add_env="LD_TRACE_LOADED_OBJECTS=1 LD_WARN=$warn LD_BIND_NOW=$bind_now"
+add_env="$add_env LD_LIBRARY_VERSION=\$verify_out"
+add_env="$add_env LD_VERBOSE=$verbose"
+if test "$unused" = yes; then
+ add_env="$add_env LD_DEBUG=\"$LD_DEBUG${LD_DEBUG:+,}unused\""
+fi
+
+# The following use of cat is needed to make ldd work in SELinux
+# environments where the executed program might not have permissions
+# to write to the console/tty. But only bash 3.x supports the pipefail
+# option, and we don't bother to handle the case for older bash versions.
+if x=`set -o` && test "$x" != "${x#*pipefail}" && set -o pipefail ; then
+ try_trace() {
+ eval $add_env '"$@"' | cat
+ }
+else
+ try_trace() {
+ eval $add_env '"$@"'
+ }
+fi
+
+case $# in
+0)
+ echo >&2 'ldd:' $"missing file arguments"
+ echo >&2 $"Try \`ldd --help' for more information."
+ exit 1
+ ;;
+1)
+ single_file=t
+ ;;
+*)
+ single_file=f
+ ;;
+esac
+
+result=0
+for file do
+ # We don't list the file name when there is only one.
+ test $single_file = t || echo "${file}:"
+ case $file in
+ */*) :
+ ;;
+ *) file=./$file
+ ;;
+ esac
+ if test ! -e "$file"; then
+ echo "ldd: ${file}:" $"No such file or directory" >&2
+ result=1
+ elif test ! -f "$file"; then
+ echo "ldd: ${file}:" $"not regular file" >&2
+ result=1
+ elif test -r "$file"; then
+ RTLD=
+ ret=1
+ for rtld in ${RTLDLIST}; do
+ if test -x $rtld; then
+ verify_out=`${rtld} --verify "$file"`
+ ret=$?
+ case $ret in
+ [02]) RTLD=${rtld}; break;;
+ esac
+ fi
+ done
+ case $ret in
+ 0|2)
+ try_trace "$RTLD" "$file" || result=1
+ ;;
+ 1|126)
+ # This can be a non-ELF binary or no binary at all.
+ nonelf "$file" || {
+ echo $" not a dynamic executable"
+ result=1
+ }
+ ;;
+ *)
+ echo 'ldd:' ${RTLD} $"exited with unknown exit code" "($ret)" >&2
+ exit 1
+ ;;
+ esac
+ else
+ echo 'ldd:' $"error: you do not have read permission for" "\`$file'" >&2
+ result=1
+ fi
+done
+
+exit $result
+# Local Variables:
+# mode:ksh
+# End:
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/less b/src/initramfs/eglibc-rootfs/usr/bin/less
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/less
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/logger b/src/initramfs/eglibc-rootfs/usr/bin/logger
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/logger
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/lspci b/src/initramfs/eglibc-rootfs/usr/bin/lspci
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/lspci
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/lsusb b/src/initramfs/eglibc-rootfs/usr/bin/lsusb
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/lsusb
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/lzcat b/src/initramfs/eglibc-rootfs/usr/bin/lzcat
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/lzcat
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/lzma b/src/initramfs/eglibc-rootfs/usr/bin/lzma
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/lzma
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/lzmacat b/src/initramfs/eglibc-rootfs/usr/bin/lzmacat
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/lzmacat
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/md5sum b/src/initramfs/eglibc-rootfs/usr/bin/md5sum
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/md5sum
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/nc b/src/initramfs/eglibc-rootfs/usr/bin/nc
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/nc
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/nmeter b/src/initramfs/eglibc-rootfs/usr/bin/nmeter
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/nmeter
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/openvt b/src/initramfs/eglibc-rootfs/usr/bin/openvt
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/openvt
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/printf b/src/initramfs/eglibc-rootfs/usr/bin/printf
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/printf
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/readahead b/src/initramfs/eglibc-rootfs/usr/bin/readahead
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/readahead
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/readlink b/src/initramfs/eglibc-rootfs/usr/bin/readlink
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/readlink
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/realpath b/src/initramfs/eglibc-rootfs/usr/bin/realpath
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/realpath
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/rpm2cpio b/src/initramfs/eglibc-rootfs/usr/bin/rpm2cpio
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/rpm2cpio
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/smemcap b/src/initramfs/eglibc-rootfs/usr/bin/smemcap
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/smemcap
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/sort b/src/initramfs/eglibc-rootfs/usr/bin/sort
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/sort
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/strings b/src/initramfs/eglibc-rootfs/usr/bin/strings
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/strings
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/tail b/src/initramfs/eglibc-rootfs/usr/bin/tail
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/tail
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/test b/src/initramfs/eglibc-rootfs/usr/bin/test
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/test
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/tftp b/src/initramfs/eglibc-rootfs/usr/bin/tftp
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/tftp
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/time b/src/initramfs/eglibc-rootfs/usr/bin/time
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/time
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/timeout b/src/initramfs/eglibc-rootfs/usr/bin/timeout
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/timeout
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/tr b/src/initramfs/eglibc-rootfs/usr/bin/tr
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/tr
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/uniq b/src/initramfs/eglibc-rootfs/usr/bin/uniq
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/uniq
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/unlzma b/src/initramfs/eglibc-rootfs/usr/bin/unlzma
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/unlzma
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/unxz b/src/initramfs/eglibc-rootfs/usr/bin/unxz
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/unxz
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/uptime b/src/initramfs/eglibc-rootfs/usr/bin/uptime
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/uptime
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/wc b/src/initramfs/eglibc-rootfs/usr/bin/wc
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/wc
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/wget b/src/initramfs/eglibc-rootfs/usr/bin/wget
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/wget
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/which b/src/initramfs/eglibc-rootfs/usr/bin/which
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/which
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/whoami b/src/initramfs/eglibc-rootfs/usr/bin/whoami
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/whoami
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/xargs b/src/initramfs/eglibc-rootfs/usr/bin/xargs
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/xargs
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/xz b/src/initramfs/eglibc-rootfs/usr/bin/xz
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/xz
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/bin/xzcat b/src/initramfs/eglibc-rootfs/usr/bin/xzcat
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/bin/xzcat
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/lib/libbfd-2.20.1-system.20100303.so b/src/initramfs/eglibc-rootfs/usr/lib/libbfd-2.20.1-system.20100303.so
new file mode 100644
index 00000000..ae24957b
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/lib/libbfd-2.20.1-system.20100303.so
Binary files differ
diff --git a/src/initramfs/eglibc-rootfs/usr/lib/libfusion-1.2.so.9 b/src/initramfs/eglibc-rootfs/usr/lib/libfusion-1.2.so.9
new file mode 100644
index 00000000..1b8d84ea
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/lib/libfusion-1.2.so.9
Binary files differ
diff --git a/src/initramfs/eglibc-rootfs/usr/lib/libgcc_s.so.1 b/src/initramfs/eglibc-rootfs/usr/lib/libgcc_s.so.1
new file mode 100644
index 00000000..f893c04d
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/lib/libgcc_s.so.1
Binary files differ
diff --git a/src/initramfs/eglibc-rootfs/usr/lib/libhal.so.1 b/src/initramfs/eglibc-rootfs/usr/lib/libhal.so.1
new file mode 100644
index 00000000..8db463f0
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/lib/libhal.so.1
Binary files differ
diff --git a/src/initramfs/eglibc-rootfs/usr/lib/libhd.so.16 b/src/initramfs/eglibc-rootfs/usr/lib/libhd.so.16
new file mode 100644
index 00000000..3fd68f29
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/lib/libhd.so.16
Binary files differ
diff --git a/src/initramfs/eglibc-rootfs/usr/lib/libm.so b/src/initramfs/eglibc-rootfs/usr/lib/libm.so
new file mode 120000
index 00000000..6c7b429c
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/lib/libm.so
@@ -0,0 +1 @@
+/lib/libm.so.6 \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/lib/libpcre.so.3 b/src/initramfs/eglibc-rootfs/usr/lib/libpcre.so.3
new file mode 100644
index 00000000..d11113bb
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/lib/libpcre.so.3
Binary files differ
diff --git a/src/initramfs/eglibc-rootfs/usr/lib/libz.so.1 b/src/initramfs/eglibc-rootfs/usr/lib/libz.so.1
new file mode 100644
index 00000000..c1b51178
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/lib/libz.so.1
Binary files differ
diff --git a/src/initramfs/eglibc-rootfs/usr/sbin/brctl b/src/initramfs/eglibc-rootfs/usr/sbin/brctl
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/sbin/brctl
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/sbin/chroot b/src/initramfs/eglibc-rootfs/usr/sbin/chroot
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/sbin/chroot
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/sbin/dhcprelay b/src/initramfs/eglibc-rootfs/usr/sbin/dhcprelay
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/sbin/dhcprelay
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/sbin/fbset b/src/initramfs/eglibc-rootfs/usr/sbin/fbset
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/sbin/fbset
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/sbin/httpd b/src/initramfs/eglibc-rootfs/usr/sbin/httpd
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/sbin/httpd
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/sbin/hwinfo b/src/initramfs/eglibc-rootfs/usr/sbin/hwinfo
new file mode 100755
index 00000000..5dbe48a4
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/sbin/hwinfo
Binary files differ
diff --git a/src/initramfs/eglibc-rootfs/usr/sbin/loadfont b/src/initramfs/eglibc-rootfs/usr/sbin/loadfont
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/sbin/loadfont
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/sbin/rdate b/src/initramfs/eglibc-rootfs/usr/sbin/rdate
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/sbin/rdate
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/sbin/setlogcons b/src/initramfs/eglibc-rootfs/usr/sbin/setlogcons
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/sbin/setlogcons
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/eglibc-rootfs/usr/sbin/udhcpd b/src/initramfs/eglibc-rootfs/usr/sbin/udhcpd
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/eglibc-rootfs/usr/sbin/udhcpd
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/stage3-stuff/bin/dhcpmkconfig b/src/initramfs/stage3-stuff/bin/dhcpmkconfig
new file mode 100755
index 00000000..fa01db75
--- /dev/null
+++ b/src/initramfs/stage3-stuff/bin/dhcpmkconfig
@@ -0,0 +1,47 @@
+#!/bin/sh
+# Copyright (c) 2003..2006 - RZ Uni Freiburg
+# Copyright (c) 2006..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found under http://openslx.org
+#
+# Universal (distro independent) IP configuration writer for busybox udhcpc
+# applet used within OpenSLX initramfs. The result is written to the
+# /etc/initramfs-setup file
+
+# script started twice by udhcpc, quit fast if no ip configuration present
+[ -z "$ip" ] && exit 0
+
+# heavy debugging output in level 3 and above ... and on 13
+#FIXME: DEBUGLEVEL is not propagated to this file (at least for Ubuntu)
+[ -z "$DEBUGLEVEL" ] && DEBUGLEVEL=0
+[ $DEBUGLEVEL -gt 3 -a $DEBUGLEVEL -lt 8 -o $DEBUGLEVEL -eq 13 ] && \
+ set -x
+
+echo -e "# network configuration written by $0:" >/tmp/confviadhcp
+unset HOME IFS KCMDLINE DEBUGLEVEL MODPRV TERM BOOTIF BOOT_IMAGE \
+ infomsg mask lease interface cfgmsg cfgfile boot_file no_bootsplash
+# set the broadcast address if not delivered by dhcp
+[ -z "$broadcast" ] && \
+ broadcast=$(ipcalc -b $ip/$subnet|sed s/.*=//)
+set | sed \
+ -e "s,^P.*,,;s,ntpsrv,ntp_servers,;s,ip,clientip," \
+ -e "s,serverid,serverip,;s,subnet,subnet_mask," \
+ -e "s,router,gateway,;s,hostname,host_name," \
+ -e "s,domain,domain_name,;s,dns,domain_name_servers," \
+ -e "s,broadcast,broadcast_address,;s,dhc.*,,;/^$/d" \
+ -e "s,nissrv,nis_servers,;s,nisdomain_name,nis_domain," \
+ -e "s,wins,netbios_name_servers,;/OPTIND.*/d" >>/tmp/confviadhcp
+
+# generate a local /etc/resolv.conf (might overwrite the version from preboot)
+[ -n "$domain" ] && echo -e "search $domain\n" >/etc/resolv.conf
+test -n "$dns" && {
+ for name in $dns; do
+ echo nameserver $name >>/etc/resolv.conf;
+ done; }
+
diff --git a/src/initramfs/stage3-stuff/bin/hwautocfg b/src/initramfs/stage3-stuff/bin/hwautocfg
new file mode 100755
index 00000000..1f02892e
--- /dev/null
+++ b/src/initramfs/stage3-stuff/bin/hwautocfg
@@ -0,0 +1,299 @@
+#!/bin/sh
+# Copyright (c) 2003..2006 - RZ Uni Freiburg
+# Copyright (c) 2006..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found under http://openslx.org
+#
+# Universal (distro independent) hardware autoconfiguration script for
+# OpenSLX linux stateless clients, using SuSE hwinfo for configuration
+
+#############################################################################
+# pre part, load USB modules and start hardware detection pci
+base () {
+# avoid annoying error messages because of missing scripts
+for tool in /usr/sbin/acpidump \
+ /usr/bin/udevinfo \
+ /sbin/dmraid ; do
+ testmkd ${tool%/*}
+ echo -e "#!/bin/sh" >${tool}
+ chmod u+x ${tool}
+done
+# no kernel messages, switch on hotplug via /sbin/mdev
+echo "0 0 0 0" >/proc/sys/kernel/printk
+echo "/sbin/mdev" >/proc/sys/kernel/hotplug
+modprobe -a ${MODPRV} usbhid hid-bright 2>/dev/null &
+# check from vga= that the traditional framebuffer is needed e.g. for splashy
+# get information on the graphics adaptor if bootsplash or xserver plugins are
+# present and the new drm/kms infrastructure is present
+if strinfile "vga=" /proc/cmdline; then
+ ( modprobe -a vesafb fbcon 2>/dev/null
+ hwinfo --gfxcard >/etc/hwinfo.gfxcard ) &
+elif [ -e /etc/init-hooks/00-started/xserver.sh -o \
+ -e /etc/init-hooks/05--have-kernelvars/bootsplash.sh ] && \
+ [ -e /lib/modules/${KERNEL}/kernel/drivers/gpu ]; then
+ # check for the standard modules (single gpu, multiple connector only)
+ ( hwinfo --gfxcard >/etc/hwinfo.gfxcard
+ case $(cat /etc/hwinfo.gfxcard) in
+ *i915*)
+ modprobe -a ${MODPRV} i915 2>/dev/null
+ ;;
+ *intel*|*Intel*)
+ modprobe -a ${MODPRV} i810 i830 i915 2>/dev/null
+ ;;
+ *nvidia*|*NVidia*|*nouveau*)
+ modprobe ${MODPRV} nouveau 2>/dev/null
+ ;;
+ *radeon*|*Radeon*)
+ modprobe ${MODPRV} radeon 2>/dev/null
+ ;;
+ *mga*|*matrox*|*Matrox*)
+ modprobe ${MODPRV} mga 2>/dev/null
+ ;;
+ *)
+ modprobe -a ${MODPRV} r128 savage sis tdfx ttm via
+ ;;
+ esac
+ modprobe -a drm fbcon; mdev -s ) &
+fi
+
+# check and then load appropriate network card modules
+nwcardlist=$(echo ${slxconf_listnwmod}|sed "s/\ /|/g")
+# save results for later info and for Xen plugin when starting Xen VM
+hwinfo --netcard --usb-ctrl >/etc/hwinfo.netcard-usbctrl
+grep modprobe /etc/hwinfo.netcard-usbctrl | grep -E "$nwcardlist|hcd" | \
+ grep -v ehci | sed 's/.* Cmd: "//;s/"//' | sort -u >/etc/modprobe.base
+# virtio hack
+if [ $(grep -ic "virtio_pci" /etc/modprobe.base) -ge 1 ]; then
+ echo "modprobe virtio_net" >>/etc/modprobe.base
+fi
+sh /etc/modprobe.base; mdev -s
+
+# optimization possible: exclude network and usb base drivers from the
+# following list (bios detection for non-hwautocfg component)
+( hwinfo --pci >/etc/hwinfo.data; echo "read pci device list at $(sysup)" \
+ >/tmp/hwdataready ) &
+( usleep 100000 ; hwinfo --bios >/etc/hwinfo.bios ) &
+# for mounting partitions/devices with the "auto" option
+echo -e "ext3\next2\nreiserfs\nxfs\njfs\next4\nvfat" >/etc/filesystems
+# request a local block device for config and root filesystem (lbd://)
+if grep -iq '"lbd://' /proc/cmdline /etc/initramfs-setup; then
+ modprobe -a ${MODPRV} ehci_hcd usb-storage sd_mod
+ mdev -s
+fi
+return 0
+}
+
+#############################################################################
+# main part
+hwmain () {
+# activate the previously detected devices
+[ $DEBUGLEVEL -ge 2 ] || modloadbg=" >/dev/null 2>\&1"
+# check for rtc if not compiled directly into the kernel
+( [ -e /proc/driver/rtc ] || modprobe ${MODPRV} rtc-cmos ) &
+waitfor /tmp/hwdataready 10000
+sed '/Driver Info #1/,/Config Status:/d' \
+ /etc/hwinfo.data | grep modprobe | sed "s|.* Cmd: \"||;s|\"|$modloadbg|" \
+ | sort -u >/etc/modprobe.pci
+sh /etc/modprobe.pci
+mdev -s
+
+# bluetooth setup (start it later if present, depends on firmware availa-
+# bility, interpreted by servconfig)
+#( hwinfo --bluetooth >/etc/hwinfo.bt ) &
+
+# load harddisk driver and check for harddisk
+( grep -q -E "SCSI|SATA" /etc/hwinfo.data && modprobe ${MODPRV} sd_mod
+ grep -q -E "IDE" /etc/hwinfo.data && modprobe ${MODPRV} ide-disk
+ hwinfo --disk | sed -n "/Device File: /p" | \
+ sed -e "s|.*Device File: /dev/||;s| .*||" >/etc/hwinfo.disk
+ echo "disk detection finished at $(sysup)" >/tmp/diskready; ) &
+[ $DEBUGLEVEL -eq 21 ] && echo "** finished 2nd hwdetection at $(sysup)"
+
+# load disk/optical high level drivers
+modprobe ${MODPRV} ide-cd 2>/dev/null
+modprobe ${MODPRV} sr_mod 2>/dev/null
+modprobe ${MODPRV} ide-floppy 2>/dev/null
+mdev -s
+
+# load kernel module for ps2 mice and map the mousehandler to /dev/input/mice
+( [ -f /lib/modules/${KERNEL}/kernel/drivers/input/mouse/psmouse.ko ] && \
+ modprobe ${MODPRV} psmouse
+ [ -f /lib/modules/${KERNEL}/kernel/drivers/input/mousedev.ko ] && \
+ modprobe ${MODPRV} mousedev
+ testmkd /dev/input
+ mknod /dev/input/mice c 13 63 2>/dev/null
+ hwinfo --mouse >/etc/hwinfo.mouse ) &
+
+# complete the audio configuration and load the dummy module if no audio
+# hardware is present in the machine
+grep -q -E "Audio|sound" /etc/hwinfo.data || modprobe snd-dummy
+modprobe ${MODPRV} snd-pcm-oss
+modprobe ${MODPRV} snd-mixer-oss
+#ln -s /proc/sound/oss/sndstat /dev/sndstat
+
+[ $DEBUGLEVEL -eq 21 ] && echo "** finished most of module loading at $(sysup)"
+
+# scanner setup (fixme: to be checked)
+hwinfo --scanner >/etc/hwinfo.scanner
+[ -f /tmp/scanner-udev ] && cat /tmp/scanner-udev \
+ >>/mnt/etc/udev/rules.d/04-scanner.rules
+
+# parallel port setup
+modprobe ${MODPRV} parport_pc && modprobe ${MODPRV} ppdev
+
+# if any new device appeared up to now
+mdev -s
+return 0
+}
+#############################################################################
+# harddisk partition setup part
+disk () {
+# get idea of availabe harddisk partitions, put swap partitions into
+# (/mnt)/etc/fstab and format and mount partitions of type 44 (unknown)
+[ $DEBUGLEVEL -eq 21 ] && echo "** starting hdd stuff at $(sysup)"
+waitfor /tmp/diskready 20000
+if [ -s /etc/hwinfo.disk ] ; then
+ for hd in $(cat /etc/hwinfo.disk) ; do
+ fdisk -l /dev/$hd|sed -n "/^\/dev\//p" >/etc/disk.partition
+ for hdpartnr in $(cat /etc/disk.partition | \
+ sed -n -e "/ 82 /p"|sed -e "s/[[:space:]].*//") ; do
+ echo -e "$hdpartnr\tswap\t\tswap\t\tdefaults\t 0 0" >>/tmp/fstab
+ done
+ # we use special non assigned partition type (id44) for harddisk scratch
+ # space, thus no normal filesystem will be incidentally deleted or
+ # corrupted
+ for hdpartnr in $(cat /etc/disk.partition | \
+ sed -n -e "/ 44 /p"|sed -e "s/[[:space:]].*//") ; do
+ # check for supported filesystem and formatter
+ ( if diskfm $hdpartnr ; then
+ echo "$hdpartnr is mounted to /mnt/tmp at $(sysup)" >/tmp/tmpready
+ echo -e "$hdpartnr\t/tmp\t\tauto\t\tdefaults\t 0 0" >>/tmp/fstab
+ else
+ echo "formatting failed for some reason ($(sysup))" >/tmp/tmpready
+ fi ) &
+ part44=yes
+ break
+ done
+ # put detected linux partitions (83) into /etc/fstab with "noauto",
+ # special partition 45 (persistent scratch) to /var/scratch and 46
+ # to /var/openslx
+ for partid in 83 45 46 ; do
+ for hdpartnr in $(cat /etc/disk.partition | \
+ sed -n -e "/ ${partid} /p"|sed -e "s/[[:space:]].*//") ; do
+ mkdir -p /mnt/media/${hdpartnr#/dev/*} 2>/dev/null
+ if [ ${partid} -eq 83 ] ; then
+ echo -e "$hdpartnr\t/media/${hdpartnr#/dev/*}\tauto\t\tnoauto,\
+noexec\t 0 0" >>/tmp/fstab
+ elif [ ${partid} -eq 45 ] ; then
+ # if more than one id45 present, the latter ones are simply mounted
+ # over the previous (the mounts are postponed a bit via do_mnt to
+ # have the filesystem completely prepared)
+ echo -e "waitfor ${hdpartnr} 4000\n\
+ mount -t auto ${hdpartnr} /mnt/media/${hdpartnr#/dev/*}\n\
+ ln -sf /media/${hdpartnr#/dev/*} /mnt/var/scratch" >>/etc/do_mnt
+ echo -e "${hdpartnr}\t/media/${hdpartnr#/dev/*}\tauto\t\tnoauto\
+\t\t 0 0" >>/tmp/fstab
+ elif [ ${partid} -eq 46 ] ; then
+ # mount a home directory to (/mnt)/var/home
+ echo -e "waitfor ${hdpartnr} 4000\n\
+ mount -t auto ${hdpartnr} /mnt/media/${hdpartnr#/dev/*} \n\
+ test -d /mnt/media/${hdpartnr#/dev/*}/home && \
+ ln -sf /media/${hdpartnr#/dev/*} /mnt/var/home" >>/etc/do_mnt
+ echo -e "${hdpartnr}\t/media/${hdpartnr#/dev/*}\tauto\t\tnoauto\
+\t\t 0 0" >>/tmp/fstab
+ fi
+ done
+ done
+ # add
+ [ -f /etc/do_mnt ] && sed -e "1i. /etc/functions" -i /etc/do_mnt
+ done
+ # determine if tmp preparation should wait for format/mount or not
+ [ -z "$part44" ] && echo "finished at $(sysup)" >/tmp/tmpready
+else
+ echo "no harddisk found ( $(sysup) )" >/tmp/tmpready
+fi
+[ $DEBUGLEVEL -eq 21 ] && echo "** finished hdd stuff at $(sysup)"
+}
+
+#############################################################################
+# cleanup/finishing part
+finish () {
+mdev -s
+# mount filesystem parts (if any) requested in disk setup
+[ -f /etc/do_mnt ] && sh /etc/do_mnt &
+# remove unneeded disk and mouse drivers
+[ ! -s /etc/hwinfo.disk ] && rmmod sd_mod 2>/dev/null
+#grep -q " PS/2 " /etc/hwinfo.mouse || \
+# { rmmod psmouse 2>/dev/null; rm /dev/psaux 2>/dev/null; }
+# more sophistication possible :)
+# remove /sbin/mdev as not available in stage4
+echo >/proc/sys/kernel/hotplug
+return 0
+}
+
+#############################################################################
+# main script starts here
+
+# functions common for all distros
+. /etc/functions
+# functions common for all distros, messages contains all error and
+# info output
+. /etc/messages
+# load distro specific configuration variables and functions. distro
+# specific functions may overwrite functions defined in /etc/functions
+. /etc/distro-functions
+# source general slx and initramfs-setup settings
+. /etc/slxsystem.conf
+. /etc/initramfs-setup
+
+# script run timer
+[ $DEBUGLEVEL -eq 8 -o $DEBUGLEVEL -eq 21 ] && \
+ echo "** HW $1 setup started at $(sysup)"
+
+# heavy debugging output in level 3 and above and specific for 11
+[ $DEBUGLEVEL -gt 3 -a $DEBUGLEVEL -lt 8 -o $DEBUGLEVEL -eq 11 ] && \
+ set -x
+
+case $1 in
+ # pre initialization: loading USB base and network adaptor modules,
+ # detection of other pci bus modules
+ base)
+ base
+ ;;
+ # main part of hardware setup of pci stuff
+ main)
+ hwmain
+ # main script run timer or debug information
+ [ $DEBUGLEVEL -eq 8 -o $DEBUGLEVEL -eq 21 ] && \
+ echo "** HW main setup finished at $(sysup)"
+ echo "hwsetup main part finished at $(sysup)" >/tmp/hwcfg
+ ;;
+ # disk setup part (detecting general id82,83 and slx id44,45,46, formatting
+ # if required and mounting)
+ disk)
+ # try to enable compressed RAM SWAP
+ if modprobe ${MODPRV} ramzswap && [ -f /usr/bin/rzscontrol ] ; then
+ mdev -s
+ rzscontrol /dev/ramzswap0 --init
+ swapon /dev/ramzswap0
+ #hdswap="# disk swap disabled because of enabled compressed ramswap"
+ fi
+ # if disk action is not disabled
+ if [ "x${hw_local_disk}" != "xno" ] ; then
+ disk
+ else
+ echo "using harddisk switched off by hw_local_disk set to 'no' ( $(sysup) )" \
+ >/tmp/tmpready
+ fi
+ ;;
+ # remove unneeded kernel modules
+ finish)
+ finish
+ ;;
+esac
diff --git a/src/initramfs/stage3-stuff/bin/init-wrapper b/src/initramfs/stage3-stuff/bin/init-wrapper
new file mode 100755
index 00000000..57fcb8a0
--- /dev/null
+++ b/src/initramfs/stage3-stuff/bin/init-wrapper
@@ -0,0 +1,60 @@
+#!/bin/sh
+# Copyright (c) 2006..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# wrapperscript for plugin init files
+#############################################################################
+
+# Get parameters
+init_file="$1"
+DEBUGLEVEL="$2"
+
+[ -z $DEBUGLEVEL ] && DEBUGLEVEL=0
+
+# How do the localization here? There is not yet a country-Variable
+. /etc/messages
+. /etc/functions
+. /etc/distro-functions
+
+# Configuration settings for this slx system's environment
+. /etc/slxsystem.conf 2>/dev/null
+
+# initramfs-setup configuration (common initial settings for all clients using
+# a certain InitRamFS generated by slxconfig-demuxer)
+[ -f /etc/initramfs-setup ] && . /etc/initramfs-setup 2>/dev/null
+
+# Initial
+testmkd /tmp/env
+
+if [ ! -f /tmp/env/base.sed ]; then
+ # Get environment and prepare as sed command
+ pre_env_base=$(env | sed -e 's/^\([^=]*\).*/\1/' | tr '\n' ';')
+ pre_env_base=$(echo $pre_env_base| sed -e 's/;/\.\*\/\/;s\/\^/g')
+ pre_env_base="s/^$pre_env_base//;"
+ $(echo $pre_env_base > /tmp/env/base.sed)
+else
+ pre_env_base=$(cat /tmp/env/base.sed)
+fi
+
+# Load temporary environments
+[ -f /tmp/env/wrapper.env ] && . /tmp/env/wrapper.env
+
+[ "${DEBUGLEVEL}" -eq 15 ] && set -x
+[ -f $init_file ] && . $init_file
+[ "${DEBUGLEVEL}" -eq 15 ] && set +x
+
+# Remove already known environment variables from postenv
+#env |sed -e $pre_env_base | sort -u | \
+# Store the environment for re-initialization in runinithook function
+env | grep -v -E "debug|DEBUGLEVEL" | sort -u | \
+ sed "1s|.*|# generated by init-wrapper; last changed by $init_file|" | \
+ sed -e 's/^\([^=]*\)=\(.*\)/export \1="\2"/' \
+ > /tmp/env/wrapper.env
+
diff --git a/src/initramfs/stage3-stuff/bin/servconfig b/src/initramfs/stage3-stuff/bin/servconfig
new file mode 100755
index 00000000..1248918e
--- /dev/null
+++ b/src/initramfs/stage3-stuff/bin/servconfig
@@ -0,0 +1,308 @@
+#!/bin/sh
+# Copyright (c) 2003..2006 - RZ Uni Freiburg
+# Copyright (c) 2006..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found under http://openslx.org
+#
+# universal (distro independent) configuration script for OpenSLX linux
+# diskless clients (executed in stage3 within initial ramfs). The file-
+# system setup is completed when servconfig starts
+
+#############################################################################
+# check for configuration files to source
+
+# functions common for all distros, messages contains all error and
+# info output
+. /etc/messages
+. /etc/functions
+# load distro specific configuration functions. Distro specific functions may
+# overwrite functions defined in /etc/functions
+. /etc/distro-functions
+. /etc/slxsystem.conf
+
+# load variables defined by plugins
+[ -f /tmp/env/wrapper.env ] && . /tmp/env/wrapper.env
+
+# script run timer
+[ $DEBUGLEVEL -eq 8 ] && echo "** SW setup started at $(sysup)"
+
+# heavy debugging output in level 3 and below 8 ...
+[ $DEBUGLEVEL -gt 3 -a $DEBUGLEVEL -lt 8 -o $DEBUGLEVEL -eq 12 ] && \
+ set -x
+
+#############################################################################
+# read and unify configuration options - default configuration file, from
+# dhcp, ldap ...
+# wait for the appearance of configuration from several sources
+cfgcomplete
+. /etc/initramfs-setup
+[ $DEBUGLEVEL -eq 8 ] && echo "** Config info is complete at $(sysup)"
+
+# copy additional configuration and var files and directories
+# admins can place there files in /var/lib/openslx/config/...
+# to be packed during stage2 into (/srv/dxs)/tftpboot/client-config...)
+cp -a /rootfs/* /mnt 2>/dev/null
+
+# copy passwd, group files for temporarily (within stage3 configuration) used
+# by chown
+cp /mnt/etc/passwd /etc
+cp /mnt/etc/group /etc
+
+# set greeting and add information on booted system
+len=$(expr length ${SLXVERSION}${SYSTEM_NAME})
+if [ $len -le 28 ] ; then
+ vdstr="Stateless Workstation (V${SLXVERSION}/${SYSTEM_NAME})"
+ smax=28
+else
+ vdstr="V${SLXVERSION}/${SYSTEM_NAME}"
+ smax=52
+fi
+while [ $len -le $smax ] ; do
+ vdstr="$vdstr "
+ len=$(($len + 1))
+done
+len=$(expr length ${host_name})
+while [ $len -le 30 ] ; do
+ space="$space "
+ len=$(($len + 1))
+done
+echo "
+ WELCOME TO $space \n (\l)
+ _____ ______ ______ __ __ _______ __ __ __
+ / _ | _ | ___| | | | | ____| | | | | |
+ | | | | |_| | |_ | | | | |___ | | / /
+ | | | | ___/| _| | | ____ | | | |
+ | |_| | | | |___| | | | ____| | |___ / /
+ _____/|__| |______|__| |__| |_______|______|__| |__|
+
+ $vdstr (c) <OpenSLX.ORG>
+" >/mnt/etc/issue
+
+#############################################################################
+# set localization and add entries to initialize keytable and consolefont to
+# boot.slx
+if [ -z "${country}" ] ; then
+ error "$scfg_country" nonfatal
+ country="us"
+fi
+# do localization (this functions simply sets a list of variables)
+localization "${country}"
+# start distrospecific localization
+dlocale
+
+#############################################################################
+# setup passwd and shadow for local system users like root, bin, daemon and
+# nobody if no user/admin provided passwd exists ... fixme: see #206
+[ ! -e /rootfs/etc/shadow ] && \
+ basepasswd $(sed "/+::0/d;s/root://;s/:.*//" /rootfs/etc/shadow 2>/dev/null)
+
+#############################################################################
+# dns and ip configuration
+# hostname of the machine
+echo "$host_name" >/proc/sys/kernel/hostname
+echo -e "# /etc/hosts - file generated by $0 during OpenSLX stage3\
+\n#\n# IP-Address Full-Qualified-Hostname Short-Hostname\n#\n\
+127.0.0.1\tlocalhost\n::1\t\tlocalhost ipv6-localhost ipv6-loopback\n\
+fe00::0\t\tipv6-localnet\nff00::0\t\tipv6-mcastprefix\nff02::1\
+\t\tipv6-allnodes\nff02::2\t\tipv6-allrouters\nff02::3\t\t\
+ipv6-allhosts\n" >/mnt/etc/hosts
+if [ -n "${domain_name}" ]; then
+ echo -en "${clientip}\t" >>/mnt/etc/hosts
+ for name in ${domain_name}; do
+ echo -en "${host_name}.${name} " >>/mnt/etc/hosts
+ done
+ echo -e "${host_name}" >>/mnt/etc/hosts
+else
+ echo -e "${clientip}\t${host_name}" >>/mnt/etc/hosts
+fi
+# set up domainname and resolving
+rm -rf /mnt/etc/resolv.conf
+test -n "${domain_name}" && \
+ echo -e "# /etc/resolv.conf - file generated by\n#\t$0:\n\
+#\t${date}\n#options timeout:1 attempts:1 rotate\n\
+search "${domain_name} >/mnt/etc/resolv.conf
+test -n "${domain_name_servers}" && {
+ for name in ${domain_name_servers}; do
+ echo nameserver ${name} >>/mnt/etc/resolv.conf;
+ done; }
+
+#############################################################################
+# run distro specific configuration function
+config_distro
+
+#############################################################################
+# basic (non network) services
+
+# at daemon - calling distro specific function config_atd
+config_atd
+
+# configuration of cron services - calling distro specific function
+# config_cron (runlevel links, directories, ...)
+config_cron
+
+# setup system log services - distro dependent function config_syslog
+config_syslog
+
+# acpi and powersave - distro dependent function config_acpi, these daemons
+# might require dbus
+config_acpi
+
+# configure udev
+config_udev
+
+# configure dbus - distro dependent function config_dreshal - handle
+# all stuff regarding dependent services like dbus, resmgr, hal ...
+# (check for runlevel scripts, passwd entries, directories ...)
+config_dreshal
+
+# configure automounter (should be moved to plugin)
+if [ "x$automnt" != "xno" ] ; then
+ # check if there is some user provided configuration (only auto.master is
+ # important) and skip automatic setup
+ if [ ! -f /rootfs/etc/auto.master ] ; then
+ if [ -d /mnt/misc ] ; then
+ echo -e "# /etc/auto.master - file generated by $0:\n\
+/misc\t/etc/auto.misc" >/mnt/etc/auto.master
+ echo -e "# /etc/auto.misc - file generated by $0:" >/mnt/etc/auto.misc
+ else
+ echo -e "# /etc/auto.master - file generated by $0:\n\
+/misc\t#/etc/auto.misc" >/mnt/etc/auto.master
+ echo -e "# /etc/auto.misc - file generated by $0:\nautomount for \
+removable devices is mostly deprecated, so /misc is not\nactivated in \
+auto.master." >/mnt/etc/auto.misc
+ fi
+ if [ -n "${automnt_src}" ] ; then
+ # local directory and home directory server from initialramfs-setup
+ [ -z "${automnt_dir}" ] && automnt_dir="/home"
+ # remove leading and trailing slash
+ automnt_dir=${automnt_dir#/}
+ automnt_dir=${automnt_dir%/}
+ test -d /${automnt_dir} || error "$scfg_erradir" nonfatal
+ amserv=$(uri_token $automnt_src server)
+ ampath=$(uri_token $automnt_src path)
+ amdirn=$(echo ${automnt_dir}|sed "s,/,_,g")
+ echo -e "/${automnt_dir}\t/etc/auto.${amdirn}\n" \
+ >> /mnt/etc/auto.master
+ echo -e "# /etc/auto.${amdirn} created by $0:\n" \
+ > /mnt/etc/auto.${amdirn}
+ # add '/' to path because uri_token removes any leading '/' (s. function)
+ echo -e "*\t-rsize=32768,wsize=32768,rw\t${amserv}:/${ampath}/&" \
+ >> /mnt/etc/auto.${amdirn}
+ # no tempfs needed if automounter operates on /home
+ [ "${automnt_dir}" = "home" ] && umount -t tmpfs /mnt/home 2>/dev/null
+ # portmapper is needed for remote NFS sources and local nfs directories
+ testmkd /mnt/var/lib/nfs/state
+ config_portmap
+ fi
+ fi
+ config_automount
+fi
+
+# configure print services / start requested printer daemon
+config_printer
+
+# configure bluetooth services
+#[ -s /etc/hwinfo.bt ] if existance of bt devices should play any role
+config_bt
+
+#############################################################################
+# network(ed) services
+
+if [ -n "$ntp_servers" ]; then
+ # rdate uses the time protocol (port 37 which is not the ntp standard port)
+ # thus not every standard ntp-server might offer this service)
+ ( rdate -s "$ntp_servers" 2>/dev/null || error "$scfg_rdate" nonfatal
+ hwclock -w ) &
+fi
+
+# network time service (ntp) configuration file
+if [ -n "$ntp_servers" -a ! -f /rootfs/etc/ntp.conf ]; then
+ echo -e "# /etc/ntp.conf - file generated by $0: \
+$date\n" >/mnt/etc/ntp.conf
+ for name in $ntp_servers; do
+ echo server $name >>/mnt/etc/ntp.conf
+ done
+fi
+# copy timezone file defined with language settings
+[ -z "$TZ" ] && TZ="$timezone"
+ln -snf /usr/share/zoneinfo/${TZ} /mnt/etc/localtime || \
+ error "$scfg_ntptz" nonfatal
+config_ntp
+
+# secure shell server - at the moment all clients share one "secret"
+# key or the key has to be regenerated on every bootup or fetched on
+# every bootup from somewhere
+config_sshd
+
+# simple network management protocol agent
+config_snmp
+
+# configure samba service
+config_samba
+
+#############################################################################
+# NIS (variable typically fetched via dhcp)
+# setup nis configuration if needed
+if [ "x$nis_domain" != "x" -a "x$nis_servers" != "x" ] ; then
+ echo $nis_domain >/mnt/etc/defaultdomain
+ echo -e "# /etc/yp.conf - file generated by $0:\n#\t\
+$date\n\nypserver "$nis_servers >/mnt/etc/yp.conf
+ config_nis
+fi
+
+#############################################################################
+# name service caching daemon if networked user database
+config_nscd
+
+#############################################################################
+# preparation of /tmp directory (partition 44, nfs scratch, ramdisk). there
+# might be the chance that we have a disk partition available, so wait for
+# completion of detection, setup process
+[ $DEBUGLEVEL -eq 8 ] && echo "** Waiting for /tmp completion at $(sysup)"
+waitfor /tmp/tmpready 40000
+[ $DEBUGLEVEL -eq 8 ] && echo "** Setup of /tmp completed at $(sysup)"
+# create some directories and correct permissions
+tmpisdisk=$(sed -n '/\/tmp/p' /tmp/fstab 2>/dev/null)
+# if there is no local disk partition for /tmp then try to mount a rw
+# scratch space (if defined in $scratch) and prepared on server
+if [ -n "$scratch" -a -z "$tmpisdisk" ] ; then
+ scrproto=$(uri_token $FILESRC prot)
+ scrpath=$(uri_token $FILESRC path)
+ testmkd /tmp/scratch
+ # exports have to be per client!!
+ case "$scrproto" in
+ nbd)
+ :
+ ;;
+ *)
+ tmpserv=$(uri_token $scratch server)
+ tmppath=$(uri_token $scratch path)
+ # hanging mount processes might stop further setup - timeout
+ # should be configured ...
+ # fsmount proto server path target options
+ fsmount nfs ${tmpserv} ${tmppath} /tmp/scratch \
+ "rw,intr,soft,timeo=2,nosuid" && {
+ if [ -d /tmp/scratch/${clientip} ] ; then
+ mv /tmp/scratch/${clientip} /tmp/scratch/${clientip}.totrash
+ rm -rf /tmp/scratch/${clientip}.totrash 2>/dev/null &
+ fi
+ testmkd /tmp/scratch/${clientip}
+ # no need for tempfs there ...
+ umount /mnt/tmp >/dev/null 2>&1
+ fsmount nfs ${tmpserv} ${tmppath} /mnt/tmp \
+ "rw,intr,soft,timeo=2,nosuid"; }
+ ;;
+ esac
+fi
+
+# script run timer
+[ $DEBUGLEVEL -eq 8 ] && echo "** SW setup finished at $(sysup)"
+
+# servconfig finished successfully
+echo "servconfig finished at $(sysup)" > /tmp/svcfg
diff --git a/src/initramfs/stage3-stuff/etc/functions b/src/initramfs/stage3-stuff/etc/functions
new file mode 100644
index 00000000..3985bd57
--- /dev/null
+++ b/src/initramfs/stage3-stuff/etc/functions
@@ -0,0 +1,1029 @@
+# Copyright (c) 2003..2006 - RZ Uni Freiburg
+# Copyright (c) 2006..2009 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# Common functions file for the configuration of linux diskless clients
+# (included by init, hwautocfg, servconfig, ... within OpenSLX initialramfs)
+
+#############################################################################
+# set of empty dummy functions (loaded before real functions in the
+# distro specific files - to have no undeclared function in init, serv-
+# config, hwautocfg, ...)
+
+# distro specific funtion called at the beginning of init script
+preinit () {
+:
+}
+# distro specific funtion called at the end of init script
+postinit () {
+:
+}
+# distro specific general function called from servconfig script
+config_distro () {
+:
+}
+
+#############################################################################
+# produce error message and if $2 is empty run (debug) shell
+error () {
+local e_msg="$1"
+# set LOGFILE if not defined
+[ -z "${LOGFILE}" ] && LOGFILE="/dev/null"
+# if nonfatal error else fatal error message and shell
+if [ -n "$2" ] ; then
+ [ "$DEBUGLEVEL" -ge 1 -a "$DEBUGLEVEL" != 8 ] && \
+ echo -e "${error_msg}${e_msg}${error_nfe}" >> ${LOGFILE}
+ [ "$DEBUGLEVEL" -gt 1 -a "$DEBUGLEVEL" != 8 ] && \
+ echo -e "${error_msg}${e_msg}${error_nfe}"
+ [ "$DEBUGLEVEL" -gt 2 -a "$DEBUGLEVEL" != 8 ] && usleep 10
+else
+ echo -e "${error_msg}${e_msg}${error_shell}"
+ /bin/sh
+ echo -n "Reboot now? [y] (nothing happens here at the moment)"
+ exec < /dev/console > /dev/console
+ #input="y"
+ #read input
+ #[ -z "$input" -o "$input" = "y" -o "$input" = "Y" ] && {
+ # sleep 4
+ # [ -f /proc/sysrq-trigger ] || mount -t proc none /proc
+ # echo "b" > /proc/sysrq-trigger
+ #}
+fi
+}
+#############################################################################
+# system uptime for performance analysis
+sysup () {
+uptime=$(sed -e "s, .*,," /proc/uptime)
+echo "${uptime} s."
+# if start times are kept, a summary of runtimes would be possible too
+}
+#############################################################################
+# (re)generate dynamic linked libraries cache from /etc/ld.so.conf
+ldcfg () {
+[ -n "${ldsc}" ] && echo -e "$init_ldcfg" && ldconfig /tmp/ld.so.cache &
+}
+#############################################################################
+# URI interpreter $1 variable to interprete, $2 type of token to return
+# prot: tftp, http, nbd, ... server: IP or FQDN
+uri_token () {
+local var=$1
+local prot
+local rest
+local server
+local path
+local port
+local tmpval
+local query=""
+# first check if URI starts with prot:// - URI scheme
+if strinstr "://" "$1" ; then
+ prot=${var%://*}
+ rest=${var#*://}
+else
+ rest="$var"
+ prot=""
+fi
+# remove temporary '::' from path, since it conflicts with port specification
+# ticket #232
+if strinstr "::" "$rest" ; then
+ rest=$(echo $rest | sed -e 's,::,§§§§§,g')
+elif strinstr "\:\:" "$rest" ; then
+ rest=$(echo $rest | sed -e 's,\:\:,§§§§§,g')
+fi
+# get the server IP or name and port - URI authority
+# you get the path or other token without leading "/" - add it later if
+# needed (fixme: port might be broken)
+if strinstr ":" "$rest" ; then
+ server="${rest%:*}"
+ rest="${rest#*:}"
+ path="${rest#*/}"
+ port="${rest%/$path}"
+else
+ tmpval=$rest
+ rest="${rest#*/}"
+ server="$(echo $tmpval|sed 's,/.*,,')"
+ path="${tmpval#${server}}"
+ port=""
+fi
+# get path and query components - URI path, query
+if strinstr "\?" "$rest" ; then
+ path="${path%\?*}"
+ query="${rest#*\?}"
+fi
+# return the requested token
+case "$2" in
+ prot) echo "$prot" ;;
+ server) echo "$server" ;;
+ # add '::' again to path, remove duplicate "//"
+ path) echo "$path" | sed -e 's,§§§§§,\:\:,g;s,//,/,' ;;
+ port) echo "$port" ;;
+ query) echo "$query" ;;
+esac
+}
+#############################################################################
+# mounter for different file sources
+fsmount () {
+local proto=$1
+local server=$2
+local srcpath=$3
+local target=$4
+local mntopt=$5
+local transport
+testmkd ${target}
+case "${proto}" in
+ *nbd)
+ # TODO: to be filled in ...
+ ;;
+ lbdev)
+ # we expect the stuff on toplevel directory, filesystem type should be
+ # autodetected here ... (vmimgserv is blockdev here)
+ vmbdev=/dev/${server}
+ waitfor ${vmbdev} 20000
+ mount -o ro ${vmbdev} ${target} || error "$scfg_evmlm" nonfatal
+ ;;
+ nfs)
+ # we expect nfs mounts here ... check that nfs module is loaded before
+ cat /proc/filesystems | grep -q -E "[[:space:]]nfs" || \
+ { modprobe ${MODPRV} nfs 2>/dev/null || error "$error_nfsmod" nonfatal; }
+ for transport in tcp udp fail; do
+ [ $transport = "fail" ] && { error "$init_nfs" nonfatal;
+ noimg=yes; break;}
+ mount -n -t nfs -o ${mntopt},nolock,${transport} \
+ ${server}:${srcpath} ${target} && break
+ done
+ ;;
+ smb|cifs)
+ # cifs mounts might be problematic if accessed with superuser id
+ mount -n -o ${mntopt},user=guest,guest,file_mode=0755,dir_mode=0755 \
+ -t ${proto} //${server}${srcpath} ${target}
+ #d_mkrlscript entry boot.slx "/opt/openslx/uclib-rootfs/bin/mount -n \
+ #-o ${mntopt},guest,user=guest,file_mode=0755,dir_mode=0755 -t ${proto} \
+ #//${server}${srcpath} ${target#/mnt}"
+ ;;
+esac
+}
+#############################################################################
+# replace @@@serverip@@@ with real serverip. Allows the usage of a variable
+# for the server ip address (e.g. in machine-setup or kernel commandline)
+checkip ()
+{
+if [ "@@@serverip@@@" = "$1" -a -n "$serverip" ] ; then
+ echo $serverip
+else
+ echo $1
+fi
+}
+#############################################################################
+# replacement for which command to find executables inside stage4 rootfs
+binfinder()
+{
+local program="$1"
+local s4path
+local notfound=1
+for s4path in bin sbin usr/bin usr/sbin usr/local/bin \
+ usr/local/sbin usr/bin/X11; do
+ if [ -f "/mnt/$s4path/$program" ] && \
+ [ -x "/mnt/$s4path/$program" ]; then
+ printf '%s\n' "/$s4path/$program"
+ notfound=0
+ break
+ fi
+done
+return $notfound
+}
+#############################################################################
+# disk formatter and mounter. some proper error message output should be
+# added. It uses programs invoked from stage 4 root filesystem. First
+# argument is blockdev or file to be formatted, second mountpoint if not
+# /mnt/tmp (default)
+diskfm () {
+local target=$1
+local mntpnt=$2
+local fs
+local path
+[ -f /lib/ld-linux.so.2 ] || ln -s /mnt/lib/ld-linux.so.2 /lib/ld-linux.so.2
+for fs in xfs reiserfs ext2 ; do
+ if strinfile "$fs" /proc/filesystems || modprobe ${MODPRV} $fs ; then
+ unset $found
+ for path in /sbin /bin /usr/sbin /usr/bin ; do
+ if test -x /mnt/$path/mkfs.$fs ; then
+ found=yes
+ case mkfs.$fs in
+ mkfs.xfs)
+ fopt="-f"
+ mopt="-o noexec"
+ ;;
+ mkfs.ext2)
+ fopt="-Fq"
+ mopt="-o nocheck,noexec"
+ ;;
+ mkfs.reiserfs)
+ fopt="-f"
+ mopt="-o noexec"
+ ;;
+ esac
+ LD_LIBRARY_PATH=/mnt/lib /mnt/$path/mkfs.$fs $fopt $target \
+ >/dev/null 2>&1 #|| error
+ if [ -z $mntpnt ] ; then
+ umount /mnt/tmp 2>/dev/null
+ if mount -t $fs -n $mopt $target /mnt/tmp 2>/dev/null; then
+ return 0
+ else
+ mount -n -t tmpfs none /mnt/tmp
+ fi
+ else
+ testmkd $mntpnt
+ mount -t $fs -n -o loop $target $mntpnt 2>/dev/null
+ return 0
+ fi
+ fi
+ done
+ [ -z $found ] && continue
+ else break
+ fi
+done
+}
+
+#############################################################################
+# dhcp client function
+rundhcp ()
+{
+local vci="$1"
+# ensure the interface is up - might produce conflicts - nbd could fail!!
+# fixme: really needed?
+# [ -n "$noipyet" ] && ip link set dev $nwif up
+[ -f /lib/modules/${KERNEL}/kernel/net/packet/af_packet.ko ] && \
+ modprobe ${MODPRV} af_packet
+echo "Starting udhcpc for IP configuration"
+mkdir /var/lib/dhcp >/dev/null 2>&1
+[ -n $vci ] && vci="-V $vci"
+testmkd /usr/share/udhcpc
+ln -sf /bin/dhcpmkconfig /usr/share/udhcpc/default.script
+# see for options.c file in udhcp subdir of busybox for accepted "-O option"
+udhcpc -O nissrv -O nisdomain -t 8 -q $vci \
+ -s /usr/share/udhcpc/default.script -i $nwif 2>/dev/null
+}
+
+#############################################################################
+# function for retrieving configuration file (machine-setup) via tftp from a
+# predefined server or given source (file=tftp-server:/path via kernel
+# command line)
+unpack () {
+# $1 is config file name to get, $2 IP of server to get file from
+local dst=$1
+if [ -s $dst ] ; then
+ # fixme: handle different types of packaging (gzip/bzip2)??
+ if ! tar -xpzf $dst 2> /tmp/ConfTGZ-tar-error ; then
+ cat /tmp/ConfTGZ-tar-error
+ error "$unpack_ConfTGZ" nonfatal
+ rm /tmp/ConfTGZ-tar-error
+ fi
+ [ "$DEBUGLEVEL" -le 2 -o "$DEBUGLEVEL" -eq 8 ] && rm $dst
+ return 0
+else
+ return 1
+fi
+}
+
+# tftp wrapper
+# usage tftp_get <path> <tftpdserver> [count]
+# count is optional - default is 3 - use -1 for indefinit
+tftp_get () {
+ local file="$1"
+ local file_server="$2"
+ local download_successful=0
+ local countdown="$3"
+
+ if [ -z "$1" -o -z "$2" ]; then
+ [ $DEBUGLEVEL -ge 1 ] && \
+ echo "[tftp_get] Usage: tftp_get <path> <server> [count]"
+ return 1;
+ fi
+
+ [ "$countdown" = "" ] && countdown=3
+
+ until [ $download_successful -eq 1 ]
+ do
+ if [ "$countdown" = "0" ]; then
+ [ $DEBUGLEVEL -ge 1 ] && \
+ echo "[tftp_get] download of \"$file\" from \"$file_server\" ... failed"
+ return 0;
+ fi
+ tftp -g -r $file -l /tmp/$(basename $file) $file_server
+ [ -s /tmp/$(basename $file) ] && download_successful=1
+ countdown=$(expr $countdown - 1)
+ usleep 200000
+ done
+ [ $DEBUGLEVEL -ge 1 ] && \
+ echo "[tftp_get] download of \"$file\" from \"$file_server\" ... successful"
+ return 0;
+}
+
+
+# wget wrapper
+# usage wget_get <path> <ftp/httpserver> [count]
+# count is optional - default is 3 - use -1 for indefinit
+wget_get () {
+ local file="$1"
+ local file_server="$2"
+ local download_successful=0
+ local countdown="$3"
+
+ if [ -z "$1" -o -z "$2" ]; then
+ [ $DEBUGLEVEL -ge 1 ] && \
+ echo "[wget_get] Usage: wget_get <path> <server> [count]"
+ return 1;
+ fi
+
+ [ "$countdown" = "" ] && countdown=3
+
+ until [ $download_successful -eq 1 ]
+ do
+ if [ "$countdown" = "0" ]; then
+ [ $DEBUGLEVEL -ge 1 ] && \
+ echo "[wget_get] download of \"$file\" from \"$file_server\" ... failed"
+ return 0;
+ fi
+ wget -q $file_server$file -O /tmp/$(basename $file)
+ [ -s /tmp/$(basename $file) ] && download_successful=1
+ countdown=$(expr $countdown - 1)
+ usleep 200000
+ done
+ [ $DEBUGLEVEL -ge 1 ] && \
+ echo "[wget_get] download of \"$file\" from \"$file_server\" ... successful"
+ return 0;
+}
+
+
+fileget () {
+# normally tftp would be used, alternatively use wget for ftp or http
+# if local device file is specified - mount and unmount after copying
+local cfgfile
+[ "x$fileprot" = "x" ] && fileprot=tftp
+if [ "x$filepath" != "x" ] ; then
+ cfgfile=${filepath}
+ [ "x$fileserv" = "x" ] && fileserv=$(checkip ${serverip})
+ # wait for dns if "fileserv" is a name and not lbd device
+ [ "$fileprot" != "lbd" ] && \
+ echo ${fileserv} | grep -qi [a-z] && waitfor /tmp/dhcp-done 10000
+ [ $DEBUGLEVEL -ge 1 ] && echo "fileget - fileprot:$fileprot, filepath:\
+$filepath, fileserv:$fileserv" >>$LOGFILE
+ case "$fileprot" in
+ ftp|http)
+ wget_get $cfgfile $fileprot://$fileserv \
+ && { unpack /tmp/$(basename $cfgfile) && break; } 2>>$LOGFILE
+ ;;
+ lbd)
+ local ldev=$fileserv
+ echo "Waiting for configuration file ${cfgfile} ...."
+ [ $DEBUGLEVEL -ge 1 ] && echo "fileget - fileprot:$fileprot, filepath:\
+$filepath, fileserv:$fileserv" >>$LOGFILE
+ waitfor /mnt/${cfgfile} 10000
+ if [ -f /mnt/${cfgfile} ]; then
+ unpack /mnt/$cfgfile
+ else
+ error "$init_errlfg"
+ fi
+ ;;
+ *)
+ tftp_get $cfgfile $fileserv \
+ && unpack /tmp/$(basename $cfgfile) 2>>$LOGFILE
+ ;;
+ esac
+else
+ # predefined value for OpenSLX environment; it is expected that this
+ # directory is just below the tftpboot (path to which the daemon is
+ # restricted to)
+ filepath="client-config"
+ [ "x$fileserv" = "x" ] && fileserv=$(checkip ${serverip})
+ [ $DEBUGLEVEL -ge 1 ] && echo "fileget - fileprot:$fileprot, filepath:\
+$filepath, fileserv:$fileserv" >>$LOGFILE
+ # try to get configuration files successively; start with distro client
+ # and try last distro default ...
+ mac=$(echo $macaddr|sed "s/:/-/g")
+ for cfgfile in ${filepath}/${SYSTEM_NAME}/01-$mac.tgz \
+ ${filepath}/${SYSTEM_NAME}/default.tgz ; do
+ case "$fileprot" in
+ ftp|http)
+ wget $fileprot://$fileserv/$cfgfile -O /tmp/$(basename $cfgfile) \
+ 2>>$LOGFILE && { unpack /tmp/$(basename $cfgfile) && break; }
+ ;;
+ tftp)
+ tftp_get $cfgfile $fileserv \
+ 2>>$LOGFILE && { unpack /tmp/$(basename $cfgfile) && break; }
+ ;;
+ esac
+ done
+ echo -e "\n## Configuration via fileget from ${fileprot}://${fileserv}/\
+${cfgfile}\n# Hierarchy is distro client and as last distro/default" \
+ >>/tmp/confviafile
+fi
+cat /initramfs/machine-setup >>/tmp/confviafile 2>/dev/null || \
+ error "$nomachsetup"
+echo "fileget via $fileprot from $fileserv/$cfgfile finished" >/tmp/file-done
+[ $DEBUGLEVEL -ge 1 ] && echo "fileget from $cfgfile finished" >>$LOGFILE
+}
+
+#############################################################################
+# function for creating directories after testing of their existance avoids
+# to recreate directories in union mounts. If second and/or third parameters
+# are given check for permission patterns
+testmkd () {
+ test -d $1 || mkdir -p $1 >/dev/null 2>&1
+ [ $# -ge 2 ] && for i in "$2" "$3" ; do
+ echo "$i" | grep -q -E "^[0-9]{3,4}$" && chmod "$i" $1 >/dev/null 2>&1
+ echo "$i" | grep -q -E ":." && chown "$i" $1 >/dev/null 2>&1
+ done
+}
+
+#############################################################################
+# function for writing a syslog-ng.conf file. First parameter is absolute
+# destination (incl. /mnt prefix)
+# sysngwriter $dest $start_syslog
+sysngwriter () {
+local mysyslogngcfg=$1
+# logging servers might be specified in $log_servers (from e.g. dhcp)
+# fixme!? only first logserver from dhcp variable is used
+[ -n "$log_servers" ] && start_syslog="syslog://${log_servers% *}:514/udp"
+echo -e "# File written by $0 within InitRamFS\n\
+source src {\n\tfile(\"/proc/kmsg\");\n\
+\tunix-dgram(\"/dev/log\");\n\tinternal();\n};\ndestination console_all {\
+\n\tfile(\"/dev/tty10\");\n};" >$mysyslogngcfg
+case "$start_syslog" in
+ yes|Yes|YES)
+ echo -e "\nlog {\n\tsource(src);\n\tdestination(console_all);\n};" \
+ >>$mysyslogngcfg
+ ;;
+ file)
+ echo -e "destination allmessages {\n\tfile(\"/var/log/allmessages\");\n};\
+\nlog {\n\tsource(src); destination(allmessages);\n};" >>$mysyslogngcfg
+ ;;
+ *)
+ syslogsrv=$(uri_token $start_syslog server)
+ syslogport=$(uri_token $start_syslog port)
+ syslogprot=$(uri_token $start_syslog path)
+ [ -z ${syslogport} ] && syslogport=514
+ [ -z ${syslogprot} ] && syslogprot=udp
+ echo -e "destination loghost {\n\t${syslogprot}(\"${syslogsrv}\" \
+port(${syslogport}));\n};\nlog {\n\tsource(src);\n\tdestination(loghost);\n};"\
+ >>$mysyslogngcfg
+ ;;
+esac
+}
+
+#############################################################################
+# simple string in string search
+strinstr () {
+ case "$2" in *$1*) return 0;; esac
+ return 1
+}
+
+#############################################################################
+# simple string in file search, for the future grep should be used instead
+strinfile () {
+ case "$(cat $2)" in *$1*) return 0;; esac
+ return 1
+}
+
+#############################################################################
+# wait for a file to appear and stop after maxwait counts
+waitfor () {
+local file=$1
+local maxwait=$2
+local count=0
+[ -z $file ] && return 0
+[ -z $maxwait ] && maxwait=5000
+while [ ! -e $file ] ; do
+ usleep 1000
+ count=$(($count + 1))
+ [ $count -gt $maxwait ] && return 1
+done
+return 0
+}
+
+#############################################################################
+# ldconfig is needed if rootfilesystem is composed of several parts. Search
+# for ldconfig and execute it (we expect ldconfig not to be a dynamically
+# linked tool)
+# check that /mnt/etc/ld.so.conf is never lost
+ldconfig () {
+local cachefile="$1"
+for ldcfg in /mnt/sbin/ldconfig \
+ /mnt/bin/ldconfig \
+ /mnt/usr/sbin/ldconfig; do
+ test -x $ldcfg && {
+ $ldcfg -r /mnt -C $cachefile; break; }
+done
+echo "finished at $(sysup)" >/tmp/ldcfg
+}
+
+#############################################################################
+# base passwd/shadow, the standard user present in every system. All other
+# system users should be generated within the service function
+basepasswd () {
+# hack (see Ticket #206)
+root_pw="$1"
+# strip every line with userid between 500 and 99999 from the passwd
+# file
+sed '/^[a-zA-Z0-9]*:[a-zA-Z0-9]*:[1-9][0-9]\{3,4\}:/d;/^+:*/d;/^+$/d;
+ /^[a-zA-Z0-9]*:[a-zA-Z0-9]*:[5-9][0-9]\{2\}:/d' /mnt/etc/passwd \
+ >/tmp/newpasswd
+# and add user nobody again (is there a more elegant way?)
+sed -n -e '/nobody/p' /mnt/etc/passwd >>/tmp/newpasswd
+# create the shadow from passwd file
+echo -e "root:"${root_pw}":12958:0:10000::::" >/mnt/etc/shadow
+sed 's/:.*/:!:13078:0:99999:7:::/;/^root.*/d' /tmp/newpasswd \
+ >>/mnt/etc/shadow
+mv /tmp/newpasswd /mnt/etc/passwd
+chmod 0640 /mnt/etc/shadow
+}
+
+#############################################################################
+# wait for the completion of configuration file (machine-setup). It is
+# composed from different sources
+cfgcomplete () {
+waitfor /tmp/dhcp-done 10000 || error "$error_errdcfg" nonfatal
+waitfor /tmp/file-done 10000 || error "$error_errfcfg" nonfatal
+waitfor /tmp/ldap-done 10000 || error "$error_errlcfg" nonfatal
+# concatenate the different files now into the central config file, order
+# matters - ldap (not implemented yet) data has highest priority
+if ! test -f /tmp/cfgcomplete ; then
+ echo "## Stage3 configuration via initial/early /etc/initramfs-setup" \
+ >/etc/ext-initramfs-setup
+ for config in /etc/initramfs-setup /tmp/confviadhcp /tmp/confviafile \
+ /tmp/confvialdap
+ do test -f $config && cat $config >>/etc/ext-initramfs-setup
+ done
+# check again and replace @@@serverip@@@ and produce a final version for
+# stage4 (no much use, just debugging)
+sed "s,@@@serverip@@@,$serverip," -i /etc/ext-initramfs-setup
+. /etc/ext-initramfs-setup
+cp /etc/ext-initramfs-setup /mnt/etc/machine-setup
+mv /etc/ext-initramfs-setup /etc/initramfs-setup
+echo "config completed" >/tmp/cfgcomplete
+fi
+}
+
+#############################################################################
+# execute all shell scripts in the given init-hook folder
+runinithook () {
+local hook=$1
+if [ -d /etc/init-hooks/$hook ]; then
+ for hook_script in /etc/init-hooks/$hook/*.sh; do
+ if [ -e $hook_script ]; then
+ /bin/init-wrapper $hook_script $DEBUGLEVEL
+ . /tmp/env/wrapper.env
+ fi
+ done
+fi
+}
+
+#############################################################################
+# localization simply derived from $language variable set in machine-setup or
+# other sources - mostly taken from knoppix
+localization () {
+country="$1"
+CONSOLE_FONT="lat9w-16.psfu"
+case "$country" in
+ # German version
+ de*)
+ COUNTRY="de"
+ LANG="de_DE.UTF-8"
+ KEYTABLE="de-latin1-nodeadkeys"
+ XKEYBOARD="de"
+ KDEKEYBOARD="de"
+ CHARSET="utf8"
+ KDEKEYBOARDS="us,fr"
+ TZ="Europe/Berlin"
+ ;;
+ # Belgian version
+ be*)
+ COUNTRY="be"
+ LANG="C"
+ KEYTABLE="be2-latin1"
+ XKEYBOARD="be"
+ KDEKEYBOARD="be"
+ CHARSET="iso8859-15"
+ KDEKEYBOARDS="us,de,fr"
+ TZ="Europe/Brussels"
+ ;;
+ # Bulgarian version
+ bg*)
+ COUNTRY="bg"
+ LANG="bg_BG"
+ KEYTABLE="bg"
+ XKEYBOARD="bg"
+ KDEKEYBOARD="bg"
+ CHARSET="microsoft-cp1251"
+ KDEKEYBOARDS="us,de,fr"
+ TZ="Europe/Sofia"
+ ;;
+ # Switzerland (basically de with some modifications)
+ ch)
+ LANGUAGE="de"
+ COUNTRY="ch"
+ LANG="de_CH"
+ KEYTABLE="sg-latin1"
+ XKEYBOARD="de_CH"
+ KDEKEYBOARD="de_CH"
+ CHARSET="iso8859-15"
+ KDEKEYBOARDS="de,us,fr"
+ TZ="Europe/Zurich"
+ ;;
+ # Simplified Chinese
+ cn)
+ COUNTRY="cn"
+ LANG="zh_CN.GB2312"
+ KEYTABLE="us"
+ XKEYBOARD="us"
+ KDEKEYBOARD="us"
+ CHARSET="gb2312.1980-0"
+ KDEKEYBOARDS="us,de,fr"
+ XMODIFIERS="@im=Chinput"
+ TZ="Asia/Shanghai"
+ ;;
+ # Czechoslovakia
+ cs|cz)
+ LANGUAGE="cs"
+ COUNTRY="cs"
+ LANG="cs_CZ.UTF-8"
+ KEYTABLE="cz-lat2"
+ XKEYBOARD="cs"
+ KDEKEYBOARD="cz"
+ CHARSET="iso8859-2"
+ KDEKEYBOARDS="us,de,fr"
+ TZ="Europe/Prague"
+ CONSOLE_FONT="iso02g"
+ ;;
+ # Denmark
+ dk|da)
+ COUNTRY="dk"
+ LANG="da_DK.UTF-8"
+ # Workaround: "dk" broken in gettext, use da:da_DK
+ LANGUAGE="da:da_DK"
+ KEYTABLE="dk"
+ XKEYBOARD="dk"
+ KDEKEYBOARD="dk"
+ CHARSET="iso8859-15"
+ KDEKEYBOARDS="dk,de,us,fr"
+ TZ="Europe/Copenhagen"
+ ;;
+ es)
+ # Spain
+ COUNTRY="es.UTF-8"
+ LANG="es_ES"
+ KEYTABLE="es"
+ XKEYBOARD="es"
+ KDEKEYBOARD="es"
+ CHARSET="iso8859-15"
+ KDEKEYBOARDS="de,us,fr"
+ TZ="Europe/Madrid"
+ ;;
+ # Finland
+ fi)
+ COUNTRY="fi"
+ LANG="fi_FI.UTF-8"
+ KEYTABLE="fi"
+ XKEYBOARD="fi"
+ KDEKEYBOARD="fi"
+ CHARSET="iso8859-15"
+ KDEKEYBOARDS="us"
+ TZ="Europe/Helsinki"
+ ;;
+ # France
+ fr*)
+ COUNTRY="fr"
+ LANG="fr_FR.UTF-8"
+ KEYTABLE="fr"
+ XKEYBOARD="fr"
+ KDEKEYBOARD="fr"
+ CHARSET="iso8859-15"
+ KDEKEYBOARDS="de,us"
+ TZ="Europe/Paris"
+ ;;
+ he|il)
+ # Hebrew version
+ LANGUAGE="he"
+ COUNTRY="il"
+ LANG="he_IL.UTF-8"
+ KEYTABLE="us"
+ XKEYBOARD="us"
+ KDEKEYBOARD="il"
+ CHARSET="iso8859-8"
+ KDEKEYBOARDS="us,fr,de"
+ TZ="Asia/Jerusalem"
+ ;;
+ # Ireland
+ ie)
+ COUNTRY="ie"
+ LANG="en_IE.UTF-8"
+ KEYTABLE="uk"
+ XKEYBOARD="uk"
+ KDEKEYBOARD="gb"
+ CHARSET="iso8859-15"
+ KDEKEYBOARDS="us,de,es,fr,it"
+ TZ="Europe/Dublin"
+ ;;
+ # Italy
+ it)
+ COUNTRY="it"
+ LANG="it_IT.UTF-8"
+ KEYTABLE="it"
+ XKEYBOARD="it"
+ KDEKEYBOARD="it"
+ CHARSET="iso8859-15"
+ KDEKEYBOARDS="fr,us,de"
+ TZ="Europe/Rome"
+ ;;
+ # Japan
+ ja)
+ COUNTRY="jp"
+ LANG="ja_JP.UTF-8"
+ LANGUAGE="ja"
+ KEYTABLE="us"
+ XKEYBOARD="us"
+ KDEKEYBOARD="us"
+ CHARSET="iso8859-15"
+ KDEKEYBOARDS="fr,us,de"
+ TZ="Asia/Tokyo"
+ ;;
+ # The Netherlands
+ nl)
+ COUNTRY="nl"
+ LANG="nl_NL.UTF-8"
+ KEYTABLE="us"
+ XKEYBOARD="us"
+ KDEKEYBOARD="en_US"
+ CHARSET="iso8859-15"
+ KDEKEYBOARDS="nl,de,fr"
+ TZ="Europe/Amsterdam"
+ ;;
+ # Poland
+ pl)
+ COUNTRY="pl"
+ LANG="pl_PL.UTF-8"
+ KEYTABLE="pl"
+ XKEYBOARD="pl"
+ KDEKEYBOARD="pl"
+ CHARSET="iso8859-2"
+ KDEKEYBOARDS="de,us,fr"
+ TZ="Europe/Warsaw"
+ CONSOLE_FONT="iso02g"
+ ;;
+ # Russia
+ ru)
+ COUNTRY="ru"
+ LANG="ru_RU.UTF-8"
+ KEYTABLE="ru"
+ XKEYBOARD="ru"
+ KDEKEYBOARD="ru"
+ CHARSET="koi8-r"
+ CONSOLE_FONT="Cyr_a8x16"
+ KDEKEYBOARDS="de,us,fr"
+ TZ="Europe/Moscow"
+ ;;
+ # Slovakia
+ sk)
+ COUNTRY="sk"
+ LANG="sk_SK.UTF-8"
+ KEYTABLE="sk-qwerty"
+ XKEYBOARD="sk"
+ KDEKEYBOARD="sk"
+ CHARSET="iso8859-2"
+ KDEKEYBOARDS="us,de"
+ TZ="Europe/Bratislava"
+ CONSOLE_FONT="iso02g"
+ ;;
+ # Slovenia
+ sl)
+ LANGUAGE="sl"
+ COUNTRY="si"
+ LANG="sl_SI.UTF-8"
+ KEYTABLE="slovene"
+ XKEYBOARD="sl"
+ KDEKEYBOARD="si"
+ CHARSET="iso8859-2"
+ KDEKEYBOARDS="us,de"
+ TZ="Europe/Ljubljana"
+ CONSOLE_FONT="iso02g"
+ ;;
+ tr)
+# Turkish version (guessed)
+ COUNTRY="tr"
+ LANG="tr_TR.UTF-8"
+ KEYTABLE="tr_q-latin5"
+ XKEYBOARD="tr"
+ KDEKEYBOARD="tr"
+ CHARSET="iso8859-9"
+ KDEKEYBOARDS="us,de,fr"
+ TZ="Europe/Istanbul"
+ ;;
+ # Taiwan - Traditional Chinese version
+ tw)
+ COUNTRY="tw"
+ LANG="zh_TW.UTF-8"
+ LANGUAGE="zh_TW.Big5"
+ KEYTABLE="us"
+ XKEYBOARD="us"
+ KDEKEYBOARD="us"
+ CHARSET="iso8859-1"
+ KDEKEYBOARDS="us"
+ XMODIFIERS="@im=xcin"
+ TZ="Asia/Taipei"
+ ;;
+ # Great Britian
+ uk)
+ COUNTRY="uk"
+ LANG="en_GB.UTF-8"
+ LANGUAGE="en"
+ KEYTABLE="uk"
+ XKEYBOARD="uk"
+ KDEKEYBOARD="gb"
+ CHARSET="iso8859-1"
+ KDEKEYBOARDS="us"
+ TZ="Europe/London"
+ ;;
+ # US and default configuration
+ *)
+ LANGUAGE="us"
+ COUNTRY="us"
+ LANG="C"
+ KEYTABLE="us"
+ XKEYBOARD="us"
+ KDEKEYBOARD="us"
+ CHARSET="iso8859-1"
+ KDEKEYBOARDS="de,fr"
+ TZ="America/New_York"
+ ;;
+esac
+}
+
+#############################################################################
+# This function gets an uri or a comma separated list of uris as parameter.
+# It will then try to mount these uris and add them to the union at /
+include_in_fsroot_union () {
+ union_id=0 # used to have guarantee differing names for the unions mount point
+ union_type=$1
+ for ROOTFS in $(echo $2 |sed 's/,/ /g'); do
+ union_id=$(($union_id + 1))
+ srvproto=$(uri_token $ROOTFS prot)
+ case $srvproto in
+ nfs)
+ # activate kernel nfs if not present, nfsroot consists now of two
+ # different parts
+ root_path=$(uri_token $ROOTFS path)
+ nfsserver=$(uri_token $ROOTFS server)
+ mkdir -p /mnt/tmp/${root_path}_${union_id}
+ for proto in tcp udp fail; do
+ [ $proto = "fail" ] && { error "$scfg_nfs"; break; }
+ mount -n -t nfs -o ro,nolock,$proto $nfsserver:$root_path \
+ /mnt/tmp/${root_path}_${union_id} && break
+ done
+ ;;
+ *nbd)
+ echo "Not working yet"
+ nbdmod=$srvproto
+ # get settings for nbd-client, filesystem equals to path in URI
+ # notation
+ nbdhost=$(uri_token $ROOTFS server)
+ nbdport=$(uri_token $ROOTFS port)
+ nbdrfst=$(uri_token $ROOTFS path)
+ echo -e "(D)NBD $ROOTFS parsed to $srvproto - $nbdhost - \
+ $nbdport - $nbdrfst" >> /tmp/testlog
+ #FIXME: do mount
+ ;;
+ aoe)
+ echo "Not implemented yet"
+ ;;
+ iscsi)
+ echo "Not implemented yet"
+ #iscsiserver=$(uri_token $ROOTFS server)
+ #iscsiport=$(uri_token $ROOTFS port)
+ #iscsitarget=$(uri_token $ROOTFS path)
+ ;;
+ esac
+ if [ "X$union_type" == "XUnionFS" ]; then
+ [ "$DEBUGLEVEL" -gt 2 -a "$DEBUGLEVEL" != 8 ] && \
+ echo "Using unionctl to mount ${root_path}_${union_id} (type: \
+ $union_type)"
+ unionctl /mnt/ --add --after 1 --mode ro /mnt/tmp/${root_path}_${union_id}
+ elif [ "X$union_type" == "XAUFS" ]; then
+ # unionctl for aufs is a sh script needing tools not included in our
+ # initramfs
+ [ "$DEBUGLEVEL" -gt 2 -a "$DEBUGLEVEL" != 8 ] && \
+ echo "Using aufs-mount to mount ${root_path}_${union_id} (type: $union_type)"
+ mount -n -o remount,add:1:/mnt/tmp/${root_path}_${union_id}=ro none /mnt
+ else
+ error ${init_loadunions} nonfatal
+ fi
+ done
+}
+
+#############################################################################
+# dummy functions - avoid undefined functions in servconfig (functions are
+# normally overwritten by settings within distro-functions) - a file
+# generated by mkdxsinitrd from <distro>/functions-default & ~-version
+
+# setup initial boot scripts (for most standard distributions, gentoo is to
+# be handled differently)
+initial_boot () {
+:
+}
+# function for udev configuration
+config_udev () {
+:
+}
+# function for ntp configuration
+config_ntp () {
+:
+}
+# function for afs
+config_afs () {
+:
+}
+# function for atd
+config_atd () {
+:
+}
+# function for configuration of cron services
+config_cron () {
+:
+}
+# syslog service
+config_syslog () {
+:
+}
+# secure shell service
+config_sshd () {
+:
+}
+# snmp agent for remote monitoring
+config_snmp () {
+:
+}
+# consolefont
+consolefont () {
+:
+}
+# acpi and powersave
+config_acpi () {
+:
+}
+# configure hal, dbus, resmgr and services like that
+config_dreshal () {
+:
+}
+# configure automounter, simple NFSv3 imports only
+config_automount () {
+:
+}
+# configure print services / start requested printer daemon
+config_printer () {
+:
+}
+# configure bluetooth services
+config_bt () {
+:
+}
+# create a compliant runlevel script, needed for boot.slx
+d_mkrlscript () {
+:
+}
+# start name service caching daemon
+config_nscd () {
+:
+}
+# configure automounter
+config_automount () {
+:
+}
+# configure samba service (not winbind, but nmbd, smbd)
+config_samba () {
+:
+}
+# start portmapper (needed at least for nfs and nis services)
+config_portmap () {
+:
+}
+# start nis/ypbind
+config_nis () {
+:
+}
+# configure nfsv4 stuff
+config_nfsv4 () {
+:
+}
+# configure keyboard layout
+keytable () {
+:
+}
+# set up localization like keytable, console
+dlocale () {
+:
+}
diff --git a/src/initramfs/stage3-stuff/etc/ldap-functions b/src/initramfs/stage3-stuff/etc/ldap-functions
new file mode 100644
index 00000000..d2b6753e
--- /dev/null
+++ b/src/initramfs/stage3-stuff/etc/ldap-functions
@@ -0,0 +1,75 @@
+#######################################################################
+# configuration via ldap
+# get_timeranges: helper function for ldapconf, retrieving timeranges
+# of machineconfig-objects under search base $1 (Host,Group,Default)
+get_timeranges(){
+trquery=`ldapsearch -x -H ldap://$ldapserver -b $1 -D $user -w $pwd -LLL \
+"(objectclass=machineconfig)" Timerange|sed -n '/Tim*/p'|sed 's/TimeRange: /#/'`
+}
+# matching_timerange: helper function for ldapconf to get "most
+# specific timerange" matching actual time
+matching_timerange(){
+match=0
+lines=$[`echo $trquery | sed 's/#/\n#/g'|wc -l` -1]
+for ((i=0;i<$lines;i++)) ; do
+ timerange[$i]=`echo $trquery | cut -d "#" -f $[$i+2] | sed 's/ //g'`
+done
+while true ; do
+ for ((i=0;i<$lines;i++)) ; do
+ trday=`echo ${timerange[i]} | cut -d "_" -f 1`
+ trbegin=`echo ${timerange[i]} | cut -d "_" -f 2`
+ trend=`echo ${timerange[i]} | cut -d "_" -f 3`
+ if [ $trday == $wday ] && [ $trday != "X" ] && [ $trbegin != "X" ] && \
+ [ $trbegin -le $time ] && [ $time -le $trend ]; then
+ echo $wday $time "[D H H]match ->" ${timerange[i]}
+ tr=${timerange[i]}
+ match=1 && break
+ fi
+ done
+ if [ $match == 1 ] ; then break ; fi
+ for ((i=0;i<$lines;i++)) ; do
+ trday=`echo ${timerange[i]} | cut -d "_" -f 1`
+ trbegin=`echo ${timerange[i]} | cut -d "_" -f 2`
+ trend=`echo ${timerange[i]} | cut -d "_" -f 3`
+ if [ $trday == $wday ] && [ $trbegin == "X" ] && [ $trend == "X" ]; then
+ echo $wday $time "[D _ _]match ->" ${timerange[i]}
+ tr=${timerange[i]}
+ match=1 && break
+ fi
+ done
+ if [ $match == 1 ] ; then break ; fi
+ for ((i=0;i<$lines;i++)) ; do
+ trday=`echo ${timerange[i]} | cut -d "_" -f 1`
+ trbegin=`echo ${timerange[i]} | cut -d "_" -f 2`
+ trend=`echo ${timerange[i]} | cut -d "_" -f 3`
+ if [ $trday == "X" ] && [ $trbegin != "X" ] && [ $trbegin -le $time ] && \
+ [ $time -le $trend ]; then
+ echo $wday $time "[_ H H]match ->" ${timerange[i]}
+ tr=${timerange[i]}
+ match=1 && break
+ else
+ if [ ${timerange[$i]} == "X_X_X" ]; then
+ echo $wday $time "[_ _ _]match ->" ${timerange[i]}
+ tr="X_X_X" && match=1
+ else
+ match=0
+ fi
+ fi
+ done
+ if [ $match == 1 ] || [ $match == 0 ] ; then break ; fi
+done
+}
+# get_machineconfig: helper function for ldapconf, writing machine
+# config data of one timerange $tr into file "tmp/confvialdap/$tr"
+get_machineconfig(){
+ldapsearch -x -H ldap://$ldapserver -b $1 -D $user -w $pwd -LLL \
+"(&(objectclass=machineconfig)(timerange=$tr))"|sed '/dn:/d'|sed '/ou=/d'|\
+sed '/dc=/d'|sed '/objectC*/d'|sed '/Tim*/d'|sed '/cn:/d'|sed '/desc*/d'|sed \
+'s/: /=/g'|sed 's/-/_/g' > tmp/confvialdap/$tr
+}
+
+ldapconf () {
+local ldapserver=$1
+error "$error_ldapcfg"
+echo "not implemented" > /tmp/ldap-done
+}
diff --git a/src/initramfs/stage3-stuff/etc/messages b/src/initramfs/stage3-stuff/etc/messages
new file mode 100644
index 00000000..ca66245d
--- /dev/null
+++ b/src/initramfs/stage3-stuff/etc/messages
@@ -0,0 +1,204 @@
+# Copyright (c) 2003 - 2006 - RZ Uni Freiburg
+# Copyright (c) 2006 - 2009 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# Messages file for all error and info messages generated during client
+# bootup (within initialramfs) for OpenSLX linux diskless clients version 5.
+# Fhis file contains the standard set of error messages.
+
+# messages from (slx) init
+init_errmsg="The functions file contains a lot of slx scripts \
+functionality. Without this\ninit script will not run."
+init_mff="The main $init_errmsg"
+init_dff="The distro $init_errmsg"
+init_sscf="The slx configuration variables could not be found. Please
+provide the slxconfig file."
+init_noeth=" Unable to configure the ethernet device (eth0). Please check \
+for an\n appropriate kernel module."
+init_errip=" Unable to setup at \
+least basic functionality, because no IP configuration\n available. You \
+might pass that information via kernel command line\n through setting of \
+'ipappend 1' in pxelinux.cfg/* or just enable dhcp\n or ldap. They are \
+enabled via tokens ('ldap' or 'dhcp') in kernel\n command line."
+init_errldap=" Unable to setup at \
+least basic functionality, because no IP configuration\n available. Please \
+beware - ldap works only in combination of either\n ipappend or similar or \
+with dhcp!"
+init_errnwad=" Failed to load the network adaptor modules added via \
+slxconfig-demuxer\n run. Please reconfigure the module list and add the \
+appropriate modules\n without *.ko suffix."
+init_bootmac=" If you have more than one ethernet adaptor present in your \
+machine or using\n a NVidia chipset then it would be advisable to switch on \
+passing of the\n boot MAC address via kernel commandline (IPAPPEND=3) in \
+your PXElinux\n configuration."
+init_nveth=" Your system uses a NVidia ethernet chip which might to fail to \
+get the\n original MAC address assigned. Use IPAPPEND=3 in your PXElinux \
+configuration\n to get the boot MAC address passed on."
+init_errdhcp=" Did not get complete IP \
+configuration via DHCP. You may want to add\n a vendor code identifier \
+via kernel commandline (vci=VCI)."
+init_erripcfg=" Up to now no IP configuration is available. If there is any \
+local file config\n the system may work locally."
+init_errbld=" Failed to load \
+module ${NBD}.ko. It is needed if you intend to use\n network block \
+device (D)NBD for the client as root filesystem."
+init_nbdcl=" Failed to start the network block device client. Unable to \
+mount root\n filesystem."
+init_nbddev=" For some reason the network block device /dev/${NBD}0 never \
+appeared.\n You might want to check udev or your list of static device \
+files."
+init_dnbd2s=" After 100 retries, it was not possible to start the dnbd2 \
+service. Please\n check that at least one server is available. You might \
+use the\n /sys/block/vnbd0 interface for this."
+init_moddir=" The requested modules or firmware directory does not exist. \
+That could mean:\n\
+ * The kernel was updated but the demuxer was not run afterwards.\n\
+ * The mounted filesystem does not contain the modules directory at all.\n\
+ You might want to check the list of mounted filesystems and if /mnt is\n\
+ not empty run 'ls /mnt/lib/modules; ls /mnt/lib/firmware' to check."
+init_loadaufs=" Loading of AUFS and/or UnionFS failed - Either the module(s) \
+are not\n present or do not match the running kernel. If you do not want to \
+see\n this message add the token(s) 'noaufs'/'nounionfs' to your kernel \
+command\n line or remove the modules from your kernel module directory."
+init_loadunions=" Stacking of directories failed, because UnionFS/AUFS is not \
+loaded."
+init_deselau=" You switched off AUFS and UnionFS via kernel commandline, thus \
+no module\n was loaded, using traditional bind mounts."
+init_loadcow=" Loading of Copy On Write (COW - special block device) module \
+failed -\n Either module is not present or module does not match the \
+running\n kernel. If you do not want to see this message remove the token \
+'cowloop' from kernel command line."
+init_cownobld=" Loading of cow module is of no sense if no network/other block \
+device is used or\n UnionFS/AUFS was specified as read write layer too. Remove \
+UnionFS/AUFS token from\n kernel commandline if cowloop should be used instead."
+init_nfs=" Mount of root filesystem via NFS was requested via kernel command \
+line\n but failed. There might be the following reasons for that:\n \
+* No nfs.ko module could be loaded and no NFS support was present in the\n \
+running kernel - see error messages above\n \
+* You tried to mount from wrong server or path ($nfsroot)\n \
+* No NFS server is running or you do not have permissions"
+init_ldcfg=" Starting ldconfig - normally switched off. Enable it via kernel \
+cmdline option\n 'noldsc'. You might have/want to add additional library \
+pathes to the\n ld.so.conf file."
+init_errlog=" Unable to create the logfile configuration in \
+/etc/${D_SYSCONFDIR}. That\n might indicate some severe error."
+init_fstab=" Failed to create /etc/fstab in the clients root filesystem. The\n\
+ noexistence of the file might produce some unexpected behaviour of\n\
+ mount commands."
+init_errldcfg=" For some reason the generation of ld.so.cache did not \
+finish in time."
+init_infldcfg=" You decided not to recreate \
+/etc/ld.so.cache file. That might cause errors\n if libraries are installed \
+after this file was created on server."
+init_errlfg=" The ConfTGZ filesource was some local device which was not \
+mounted successfully.\n Either the wrong device was given or the filesystem \
+is not known to the kernel."
+init_errloop=" The loopback mounting of the rootfs container failed. Either \
+the file is\n not available, unreadable or problems with the filesystem \
+modules."
+init_errcfg="of this client did not finish in\n time. You might check the \
+process list and list the modules loaded until\n now."
+init_errhw=" For some reason the hardware autoconfig $init_errcfg"
+init_errxorg=" For some reason no xorg.conf appeared, check xconfig!"
+init_errsw=" For some reason the software configuration $init_errcfg"
+init_wait=" Waited $ticks ticks to unmount kernel module or firmware \
+directory ..."
+init_errumnt=" Unmount of the kernel modules directory \
+failed for some reason. Some\n modprobe process still active!?"
+init_errsys=" Unmount of the kernel sys directory \
+failed for some\nreason. You will get some error messages that some files \
+could not be\n removed."
+init_runinit=" Could not execute run-init due to missing command or wrong\n \
+parameters given."
+init_picfg=" The plugin configuration directory is missing. This could be due \
+to failed\n config get process at the beginning of stage3 setup. Either \
+requested\n configuration file is missing in ~/client-config/<system> or a \
+general\n transmission error."
+
+# messages from functions
+error_msg="An error occured during execution of $0 script:\n\n"
+error_nfe="\n -> This error is not fatal - continuing ...\n"
+error_shell="\n -> Running shell for debugging purposes now ...\n"
+error_modload="Failed to load module "
+error_modnfs="needed for mounting rootfs"
+error_nodhcp=" You tried to configure system via dhcp, but no usable dhcp\n\
+ client could be found. Please check that you have some client from\n\
+ the following list installed: dhclient dhcpcd pump ipconfig."
+error_dhcp=" The following problems could produce that error:\n\
+ * The af_packet.ko module is either not loaded nor present in kernel.\n\
+ * No network device is present - either no module matching the hardware\n\
+ was loaded nor present in kernel.\n You might want to run 'lsmod'."
+error_dhclient=" Fatal error occured while trying to run dhclient.\n\
+$error_dhcp"
+error_ldapcfg=" The configuration via ldap is not implemented yet."
+error_errdcfg=" Did not get any configuration data via dhcp until now ..."
+error_errfcfg=" Did not get any configuration data via tftp until now ..."
+error_errlcfg=" Did not get any configuration data via ldap until now ..."
+unpack_ConfTGZ=" Error during unpacking of the ConfTGZ archive.\nAre you sure \
+it is in proper format?"
+nomachsetup=" No machine-setup file found. You might not have gotten any \
+configuration\n from your server. You could find that out by checking if \
+/initramfs and\n /rootfs are present!"
+
+# messages from distro functions
+df_erritab=" The file /etc/inittab does not exist or is no regular one. It \
+is needed\n for the bootup procedure to follow. If upstart is used instead no \
+inittab\n is needed any more, but a proper configured events.d."
+df_errumod=" Failed to load the \"unix\" module. Problems with Hardware \
+detection\nwill probably arise."
+df_errserv="seems not to be installed or start script is\n not available\
+so requesting the start of service make no sense. Please\n disable service\
+or install the files/packages needed."
+df_errcron=" The cron start script $df_errserv"
+df_errsysl=" The syslog start script $df_errserv"
+df_errsshd=" The sshd start script $df_errserv"
+df_erryp=" The NIS client $df_errserv"
+df_errpmap=" The portmapper $df_errserv"
+df_erramnt=" Automounter $df_errserv"
+df_errnsc=" Name Service caching deamon $df_errserv\n This service might \
+be useful to take load from a ldap user directory."
+df_errafsd=" No afs directory present."
+df_errafsn=" AFS client service is not available."
+df_errkbd=" No non-english keyboard and console settings are installed. \
+Please add\n them to your stage1 to have them enabled."
+
+# messages from servconfig
+scfg_nfs=" Mount of some NFS source failed ..."
+scfg_rdate=" Your configured ntpserver does not offer time configuration \
+on port 37."
+scfg_ntptz=" No such timezone data file (needed for ntp time service \
+configuration)."
+scfg_evmlm=" Mounting of local device source for vmware directory failed \
+for some reason."
+scfg_vmdir=" For some reason the runvmware script is not available for \
+copying. That\n could be the result of failed mount or simply missing \
+file on\n server."
+scfg_vmchs=" The virtual machines lister/chooser is not available from \
+~/templates\n directory. Thus no default k/gdm menu entry is created."
+scfg_erradir=" Only one directory level is allowed to hook up automounter \
+to and the\n directory should exist (on the servers export) or should be \
+creatable\n (e.g. because of UnionFS writeable root directory)."
+scfg_country=" No configuration for localization found in config file. \
+Using default\n country setting '${D_DEFAULTCOUNTRY}' defined in $0."
+
+# messages from hwautocfg
+hcfg_hwsetup=" The X server configuration file generated by hwautocfg could \
+not\n be found."
+gfx_msg="Please check your graphic adaptor settings ($hw_graphic)."
+hw_msg=" Please check your predefined monitor settings ($hw_monitor): \
+Automatic\n configuration of display"
+hcfg_res=" $hwmsg resolution was attempted but not established. Using \
+default resolutions (defined in xconfig)"
+hcfg_hwsetup=" Expected information from hwsetup to appear in \
+/tmp/hwsetup.info.\n Unable to configure parts of the systems hardware. \
+Please check that\n hwsetup is properly installed and executable."
+hcfg_keyb=" No settings found for keyboard, using default of '${XKEYBOARD}' \
+defined\n in $0."
+
diff --git a/src/initramfs/stage3-stuff/etc/messages.de b/src/initramfs/stage3-stuff/etc/messages.de
new file mode 100644
index 00000000..487332d7
--- /dev/null
+++ b/src/initramfs/stage3-stuff/etc/messages.de
@@ -0,0 +1,215 @@
+# Copyright (c) 2003 - 2006 - RZ Uni Freiburg
+# Copyright (c) 2006 - 2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# Messages file for all error and info messages generated during client
+# bootup (within initialramfs) for OpenSLX linux diskless clients version 5
+# this file could be used for localization of error messages.
+
+# messages from (slx) init / Fehlermeldungen des SLX init
+init_errmsg=" ,,functions''-Datei beinhaltet viele Funktionen \
+der SLX Skripte. Ohne diese\n wird das Init-Skript nicht funktionieren."
+init_mff=" Die Haupt $init_errmsg"
+init_dff=" Die Distro $init_errmsg"
+init_sscf=" Die SLX Konfigurations-Variablen wurden nicht gefunden.
+Bitte stellen Sie die\n SLX Konfigurations-Datei zur Verfuegung."
+init_noeth=" Konnte die Netzwerk-Schnittstelle nicht konfigurieren (eth0).\
+ Bitte pruefen,\n ob das geeignete kernel-Modul vorhanden ist."
+init_errip=" Konnte die Grund-Funktionalitaet nicht einrichten, \
+da keine IP-Konfigurationen\n vorhanden sind. Sie koennten diese \
+Informationen ueber die Kernel-Command-Line\n durch die Einstellung \
+'ipappend 1' in pxelinux.cfg/* oder ldap\n aktivieren. Sie werden durch \
+Token ('ldap') in den Kernel Start Optionen\n eingeschaltet."
+init_errldap=" Konnte nicht wenigstens die Grund-Funktionalitaet einrichten, \
+da keine IP-Konfigurationen\n vorhanden sind. Achtung - ldap arbeitet nur in \
+Kombination mit IPAPPEND (PXE)\n o.ae. oder DHCP!"
+init_errnwad=" Konnte die Netzwerk-Adapter, die durch den slx/mkramfs bzw. \
+mkdxsinitrd-Aufruf definiert\n wurden, nicht laden. Bitte erneut aufrufen \
+und die passenden Module auflisten\n (ohne Endung .ko)."
+init_bootmac=" Es scheint mehr als eine Ethernet-Karte installiert und die \
+passenden\n Kernel-Module geladen zu sein. Das kann fuer Probleme sorgen, da \
+evtl.\n die nicht verbundene Netzwerkkarte als das erste Interface konfiguriert\
+ \n wurde. Durch die Uebergabe der MAC Adresse des Bootdevices (IPAPPEND=3 in
+der PXElinux-Konfiguration) laesst sich dieses vermeiden."
+init_nveth=" Ihr System benutzt anscheinend eine NVidia-Netzwerkkarte. Hier \
+kann es\n vorkommen, dass die MAC-Adresse nicht korrekt eingestellt wird. \
+Dieses laesst\n sich durch die Uebergabe der MAC Adresse des Bootdevices \
+(IPAPPEND=3 in der PXElinux-Konfiguration) vermeiden."
+init_errdhcp=" Keine komplette IP-Konfiguration ueber DHCP bekommen. \
+Eventuell sollten Sie\n ueber die Kernel Start Optionen eine Hersteller Code \
+ID (vendor code identifier)\n (VCI=vci) hinzufuegen."
+init_erripcfg=" Bis zu diesem Zeitpunkt konnte keine (gueltige) IP.\
+Konfiguration beschafft\n werden. Die Maschine kann funktionieren, wenn \
+lokale Konfiguration per\n Datei moeglich ist."
+init_errbld=" Konnte nicht das Modul ${NBD}.ko laden. Es wird gebraucht, \
+wenn Sie vorhaben, das\n Netzwerk Block Geraet (network block device) (D)NBD \
+fuer den Klienten als Wurzel-Dateisystem zu verwenden."
+init_nbdcl=" Konnte den Network Block Geraete-Dienst nicht starten und damit \
+das Wurzel-Dateisystem\n nicht einhaengen."
+init_nbddev=" Aus irgendeinem Grund ist /dev/${NBD}0 nie erschienen. Sie \
+sollten ihr udev-System\n nach Listen von statischen Geraeten untersuchen."
+init_dnbd2s=" Nach 100 Versuchen konnte das dnbd2 Blockdevice keinen laufenden \
+Server finden.\n Bitte ueberpruefen Sie die Erreichbarkeit."
+init_moddir=" Das angeforderte Modul- bzw. Firmware-Verzeichnis existiert \
+nicht. Das\n koennte bedeuten:\n\
+ * Der Kernel wurde ausgetauscht/erneuert ohne einen neuen Aufruf \
+von slxmkramfs oder\n mkdxsinitrd.\n * Das eingehaengte Dateisystem \
+beinhaltet das Modul-Verzeichnis ueberhaupt nicht.\n Sie sollten die Liste \
+der eingehaengten Dateisysteme pruefen und wenn /mnt\n nicht leer ist, \
+'ls /mnt/lib/modules' ausfuehren."
+init_loadunions=" Stapeln mehrerer Verzeichnisse nicht moeglich, da kein \
+UnionFS/AUFS\n Modul geladen ist."
+init_loadaufs=" Laden von AUFS/UnionFS schlug fehl - entweder das Modul ist \
+nicht vorhanden, oder\n es passt nicht zum laufenden Kernel. Wenn Sie diese \
+Meldung nicht sehen\n wollen, fügen Sie das Token 'noaufs'/'nounionfs' den \
+Kernel Start\n Optionen hinzu oder loeschen Sie die Module."
+init_deselau=" Sie haben AUFS und UnionFS mittels Kernel-Commandline \
+ausgeschaltet, deshalb\n wurde kein entsprechendes Kernel-Modul geladen."
+init_loadcow=" Laden von Copy On Write (COW - Spezielles Block Geraet) Modul \
+schlug fehl -\n entweder das Modul nicht praesent oder es passt nicht zum \
+laufenden\n Kernel. Wenn Sie diese Meldung nicht sehen wollen, entfernen sie \
+das Token 'cowloop' aus den Kernel Start Optionen."
+init_loadufs=" Laden von UnionFS schlug fehl - entweder das Modul ist \
+nicht vorhanden, oder\n es passt nicht zum laufenden Kernel. Wenn Sie diese \
+Meldung nicht mehr sehen\n wollen, entfernen Sie das Token 'unionfs' von den \
+Kernel Start Optionen."
+init_cownonbd=" Laden des COW-Moduls ist sinnlos, wenn kein Netzwerk Block \
+Geraet benutzt wird oder\n UnionFS als Lese- Schreib-Schicht spezifiziert \
+wurde. Entfernen Sie das UnionFS Token aus\n den Kernel-Start-Optionen wenn \
+'cowloop' stattdessen verwendet werden soll."
+init_nfs=" Einhaengen des Wurzel Dateisystems ueber NFS wurde angefordert \
+durch die Kernel Start Optionen,\n aber schlug fehl. Die folgenden Gruende \
+koennten verantwortlich sein:\n\
+ * Kein nfs.ko (und weitere dafuer benoetigte) Modul konnte geladen werden und \
+keine NFS Unterstuetzung war im\n laufenden Kernel vorhanden - siehe \
+Fehlermeldungen darueber.\n\
+ * Sie versuchten, einen falschen Pfad einzuhaengen ($nfsroot).\n\
+ * Kein NFS-Server laeuft oder Sie haben nicht die Zugriffsberechtigungen auf \
+diesen."
+init_ldcfg=" Starte ldconfig - normalerweise ausgeschaltet. Wird mit der Kernel \
+Start Option\n 'noldsc' aktiviert. Eventuell sollten Sie zusaetzliche \
+Bibliothekspfade\n zur ld.so.conf hinzufuegen."
+init_errlog=" Konnte die Log-Datei Konfiguration nicht anlegen in \
+/etc/${D_SYSCONFDIR}. Das\n koennte auf schwerwiegende Fehler hindeuten."
+init_fstab="Das Erzeugen von /etc/fstab im Wurzel-Dateisystem des Clients \
+schlug fehl.\n Die Abwesenheit dieser Datei koennte unvorhergesehenes Verhalten \
+der mount-Befehle\n verursachen."
+init_errldcfg=" Aus irgendeinem Grund konnte die Erstellung von ld.so.cache \
+nicht rechtzeitig fertiggestellt\n werden."
+init_infldcfg=" Sie entschieden sich, die Datei /etc/ld.so.cache nicht neu \
+zu erstellen. Das koennte Fehler verursachen\n wenn Bibliotheken installiert \
+werden nachdem diese Datei auf dem Server erstellt wurde."
+init_errlfg=" Die ConfTGZ Quelle war ein lokales Device, welches nicht korrekt \
+eingebunden werden\n konnte. Entweder wurde das falsche Device/Partition \
+angegeben oder das\n Dateisystem ist dem Kernel nicht bekannt."
+init_errloop=" Der Loopback-Mounting des Rootfilesystem-Containers schlug \
+fehl. Entweder\n die Datei existiert nicht, ist unlesbar oder es gibt \
+Probleme mit\n den Filesystem-Modulen."
+init_errcfg="des Clients nicht rechtzeitig beendet\n Sie sollten die Prozess \
+Liste pruefen und die Module, die bis zum jetzigen Zeitpunkt geladen wurden."
+init_errhw=" Aus irgendeinem Grund wurde die Hardware Auto-Konfiguration \
+$init_errcfg"
+init_errsw=" Aus irgendeinem Grund wurde die Software Konfiguration $init_errcfg"
+init_wait=" Wartete $i Zeiteinheiten das Kernel-Modul- bzw. Firmware-Verzeichnis \
+auszuhaengen ..."
+init_errumnt=" Das Kernel Modul Verzeichnis auszuhaengen \
+scheiterte aus irgendeinem Grund. Sind einige\n ,,modprobe'' noch aktiv!?"
+init_errsys=" Aushaengen des Kernel /sys Verzeichnisses schlug aus irgendeinem \
+Grund\n fehl. Sie werden einige Fehlermeldungen bekommen,\
+\ndass einige Dateien nicht entfernt werden konnten."
+init_runinit=" Konnte switch_root/run-init nicht ausfuehren, wegen fehlender \
+Befehle\n oder falsch angegebenen Parametern."
+init_picfg=" Das Plugin-Konfigurationsverzeichnis fehlt. Dieses könnte an einem \
+fehlgeschlagenen\n holen der Client-Konfiguration liegen, weil entweder die \
+Datei nicht auf\n dem Server verfuegbar ist oder der Transport nicht klappte."
+
+# messages from functions
+error_msg="Ein Fehler trat auf waehrend der Ausfuehrung des $0 Skripts:\n\n"
+error_nfe="\n -> Dieser Fehler ist nicht schwerwiegend - setze fort ...\n"
+error_shell="\n -> Fuehre Shell aus zum Debuggen ...\n"
+error_modload="Es schlug fehl, folgendes Modul zu laden:"
+error_modnfs="gebraucht zum einhaengen des Wurzel Dateisystems"
+error_nodhcp=" Sie versuchten ihr System mittels DHCP einzurichten, es wurde \
+aber kein brauchbarer DHCP\n Client gefunden. Bitte pruefen Sie, ob sie einen \
+der folgenden Clients\n installiert haben: dhclient dhcpcd pump udhcpc."
+error_dhcp=" Die folgenden Probleme koennten den Fehler verursachen:\n\
+ * Das af_packet.ko Modul ist weder geladen noch praesent im Kernel.\n\
+ * Kein Netzwerk Geraet ist praesent - weder ein passendes Modul\n\
+ wurde geladen noch ist praesent im laufenden Kernel.\n Sie sollten \
+'lsmod' ausfuehren."
+error_dhclient=" Schwerer Fehler aufgetreten beim Aufrufen von dhclient.\n\
+$error_dhcp"
+error_ldapcfg=" Die Konfiguration via ldap ist noch nicht implementiert."
+error_errdcfg=" Bis jetzt noch keine Konfigurationsdaten bekommen via dhcp .."
+error_errfcfg=" Bis jetzt noch keine Konfigurationsdaten bekommen via tftp ..."
+error_errlcfg=" Bis jetzt noch keine Konfigurationsdaten bekommen via ldap ..."
+unpack_ConfTGZ=" Fehler beim entpacken des ConfTGZ.\nSind Sie sicher, dass es im \
+richtigen Format ist?"
+nomachsetup=" Die Datei machine-setup nicht gefunden. Es koennte sein, dass das \
+Konfigurations-\n paket nicht erfolgreich vom Server beschafft wurde. Das \
+erkennen Sie daran,\n dass die Verzeichnisse /initramfs, /rootfs angelegt \
+wurden. Ihr\n OpenSLX Client wird deshalb nicht wie erwartet funktionieren."
+
+# messages from distro functions
+df_erritab=" Die Datei /etc/inittab existiert nicht oder ist keine regulaere. \
+\n Sie wird fuer den Boot-Process benoetigt."
+df_errumod=" Das Laden des \"unix\" Moduls schlug fehl. \nWahrscheinlich \
+werden Probleme bei der Hardware-Erkennung auftreten."
+df_errserv="ist entweder nicht installiert oder das Start-Skript ist nicht \
+verfuegbar.\n Deswegen macht der Start des Dienstes keinen Sinn. Bitte \
+deaktivieren Sie den Start\n oder installieren Sie die benoetigten Dateien."
+df_errcron=" Das cron Start-Skript $df_errserv"
+df_errsysl=" Das syslog Start-Skript $df_errserv"
+df_errsshd=" Das sshd Start-Skript $df_errserv"
+df_erryp=" Der NIS-Klient $df_errserv"
+df_errpmap=" Der Portmapper $df_errserv"
+df_erramnt=" Der Automounter $df_errserv"
+df_errnsc=" Der Name Service Zwischenspeicherungs Daemon $df_errserv\n \
+Dieser Dienst koennte nuetzlich sein, um Daten von einem ldap Benutzer-\
+Verzeichnis zu bekommen."
+df_errafsd=" Kein AFS Verzeichnis erreichbar"
+df_errafsn=" Der AFS-Client Dienst ist nicht verfuegbar"
+df_errkbd=" Keine nicht-englische Tastatur und/oder Konsolenunterstuetzung \
+installiert.\n Falls gewuenscht/benoetigt diese im Stage1 nachinstallieren!"
+
+# messages from servconfig
+scfg_nfs=" Das Einhaengen einer NFS Quelle schlug fehl..."
+scfg_ntptz=" Die Zeitzonen-Datei wurde nicht gefunden (gebraucht fuer die \
+NTP-Zeit Dienst Konfiguration)."
+scfg_evmlm=" Das Einbinden der lokalen Festplatte(npartition) des VMware-\
+Image-Verzeichnisses\n schlug fehl."
+scfg_vmdir=" Aus irgendeinem Grund kann das runvmware Skript nicht \
+verfuegbar zu kopieren.\n Das koennte das Ergebnis eines fehlgeschlagenen \
+Mount-Versuchs sein\n oder die Datei fehlt auf dem Server."
+scfg_vmchs=" Das Auswahltool/menu fuer Virtuelle Machinen ist nicht im \
+~/templates\n Verzeichnis vorhanden. Deshalb wurde kein Default KDM Menu \
+Eintrag erzeugt."
+scfg_erradir=" Es wird nur eine Verzeichnis-Ebene erlaubt, den Automounter \
+zu installieren und das\n Verzeichnis sollte existieren (auf dem \
+Server-Export) oder sollte anlegbar sein\n (z.B. durch UnionFS beschreibbares \
+Wurzel-Verzeichnis)."
+scfg_country=" Keine Konfiguration fuer die Lokalisierung gefunden in der \
+Konfigurations-Datei. Benutzer\n Standard Laender-Einstellung \
+'${D_DEFAULTCOUNTRY}' definiert in $0."
+
+# messages from hwautocfg
+hcfg_hwsetup=" Die xserver-Konfigurations-Datei, erstellt von hwsetup, konnte \
+nicht\n gefunden werden."
+gfx_msg="Bitte pruefen Sie ihre Grafik-Adapter-Einstellungen ($hw_graphic)."
+hw_msg=" Bitte pruefen Sie ihre vordefinierten Monitor-Einstellungen ($hw_monitor): \
+Automatische\n Konfiguration des Bildschirms."
+hcfg_res=" $hwmsg Aufloesung wurde versucht aber nicht eingerichtet. Benutze \
+Standard-Aufloesungen (defined in xconfig)"
+hcfg_hwsetup=" Erwartete Informationen von hwsetup in \
+/tmp/hwsetup.info.\n Teile des Systems koennen nicht eingerichtet werden. \
+Bitte pruefen, dass\n hwsetup richtig installiert und ausfuehrbar ist."
+hcfg_keyb=" Keine Einstellungen fuer ihre Tastatur gefunden, verwende den \
+Standard-Wert '${XKEYBOARD}' definiert\n in $0."
+
diff --git a/src/initramfs/stage3-stuff/init b/src/initramfs/stage3-stuff/init
new file mode 100755
index 00000000..3f97dba0
--- /dev/null
+++ b/src/initramfs/stage3-stuff/init
@@ -0,0 +1,1030 @@
+#!/bin/sh
+# Copyright (c) 2003..2006 - RZ Uni Freiburg
+# Copyright (c) 2006..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# Main script for initial ramfs for OpenSLX linux stateless clients
+#############################################################################
+
+# fixme: the primary init script should never fail, so move all critical code
+# into sub script calls (see ticket 259)
+
+export PATH=/bin:/sbin:/usr/bin/:/usr/sbin
+
+# device files get their own filesystem (to be move mounted later)
+devdir="/dev"
+mount -n -t tmpfs -o 'size=25%,mode=0755' initramfsdevs ${devdir}
+
+# mount the important standard directories
+[ ! -f /proc/cpuinfo ] && mount -n -t proc proc /proc
+[ ! -d /sys/class ] && mount -n -t sysfs sysfs /sys
+
+# create basic device files an directories (in dev - for most hardware related
+# devices mdev should handle that)
+for i in "/dev/mem c 1 1" "/dev/null c 1 3" "/dev/zero c 1 5" \
+ "/dev/urandom c 1 9" "/dev/kmsg c 1 11" "/dev/tty0 c 4 0" \
+ "/dev/tty1 c 4 1" "/dev/tty2 c 4 2" "/dev/tty3 c 4 3" \
+ "/dev/tty4 c 4 4" "/dev/tty5 c 4 5" "/dev/tty6 c 4 6" \
+ "/dev/tty7 c 4 7" "/dev/tty8 c 4 8" "/dev/tty9 c 4 9" \
+ "/dev/tty10 c 4 10" "/dev/tty c 5 0" "/dev/console c 5 1" \
+ "/dev/ptmx c 5 2" "/dev/psaux c 10 1" "/dev/agpgart c 10 175" \
+ "/dev/fb0 c 29 0" "/dev/xconsole p"; do
+ mknod $i
+done
+mkdir -p ${devdir}/pts ${devdir}/shm ${devdir}/.udevdb ${devdir}/.udev \
+ ${devdir}/.initramfs /var/log
+# create some standard links (expected?) in /dev
+ln -s /proc/kcore /dev/core
+ln -s /proc/self/fd /dev/fd
+ln -s /proc/self/fd/0 /dev/stdin
+ln -s /proc/self/fd/1 /dev/stdout
+ln -s /proc/self/fd/2 /dev/stderr
+
+# redirect kernel messages to tty10 instead of the standard console
+getty -i -n -l /bin/cat 38400 tty10 &
+setlogcons 10
+
+# start device auto discovery/setup service of busybox
+echo >/etc/mdev.conf
+mdev -s
+
+# source functions file common for all distros, messages contains all error
+# and info output (for some reason the error output is not produced properly
+# - crash)
+
+# how do the localization here? There is not yet a country-Variable
+. /etc/messages
+. /etc/functions || ( echo -e $init_mff && sleep 100 )
+. /etc/distro-functions || ( echo -e $init_dff && sleep 100 )
+
+# configuration settings for this slx system's environment
+. /etc/slxsystem.conf 2>/dev/null || ( echo -e ${init_sscf} && \
+ sleep 100 )
+# initramfs-setup configuration (common initial settings for all clients using
+# a certain InitRamFS generated by slxconfig-demuxer)
+[ -f /etc/initramfs-setup ] && . /etc/initramfs-setup 2>/dev/null
+
+export date="${slxconf_date}"
+
+export DEBUGLEVEL=0
+export KERNEL="${slxconf_kernver}"
+export NWMODULES="${slxconf_listnwmod}"
+export DISTRO_NAME="${slxconf_distro_name}"
+export DISTRO_VER="${slxconf_distro_ver}"
+export SYSTEM_NAME="${slxconf_system_name}"
+export SLXVERSION="${slxconf_slxver}"
+
+# do not use dnbd cache file
+nodnbdcache="yes"
+
+# set a default LAN interface, might be modified for WLAN, bridge setups or
+# on machines with more than one ethernet card built in
+export nwif="eth0"
+
+# load usb modules for keyboard (reenable usb keyboards, otherwise the
+# admin has to wait until second run of hwsetup late in stage3) and the
+# network adaptor modules, search for pci modules to load later on
+hwautocfg base
+
+# if no kernel version is set, try to get it directly from /proc
+if [ -z $KERNEL ] ; then
+ KERNEL=$(cat /proc/version)
+ KERNEL=${KERNEL#*version }
+ KERNEL=${KERNEL% (*) (*}
+fi
+
+# set defaults for some important variables, might be overwritten via
+# kernel commandline
+tmpfssize="$(expr $(grep -i "memtotal" /proc/meminfo | awk '{print $2}') \
+ / 100 \* 75 - 128000)k" # in kbyte
+cowsize="50%"
+rwdir=/dev/shm
+nfsro="nfs"
+aufs=1
+unionfs=1
+
+runinithook '00-started'
+
+# run pre init script and user defined preinit.local, copied by mkdxsinitrd
+# from /var/lib/openslx/config/... in stage2
+preinit
+[ -x /bin/preinit.local ] && /bin/preinit.local
+
+
+# switch off the several configuration methods, will be switched on
+# according to kernel commandline settings
+echo "noldap" > /tmp/ldap-done
+
+# external configuration file retrieval (per tftp) must be done, as otherwise
+# we will never get the initramfs-setup file. By default, we try a predefined
+# standard path (.../tftpboot/client-config/ ...)
+file="yes"
+
+# read kernel commandline
+read KCMDLINE < /proc/cmdline
+export KCMDLINE
+# read the system wide initramfs-setup and then the kernel commandline
+for opts in $(sed "s/#.*//" /etc/initramfs-setup) ${KCMDLINE} ; do
+ case ${opts} in
+ # shut down pc
+ shutdown)
+ cat <<EOL
+
+ SHUTTING DOWN PC!
+
+EOL
+ echo "o" >/proc/sysrq-trigger
+ ;;
+ # from IPAPPEND
+ BOOTIF=*)
+ bootmac=$(echo ${opts} | sed "s/.*=01-//;s/-/:/g")
+ ;;
+ # localization
+ country=*)
+ COUNTRY=${opts#country=}
+ grep -q -E "country=" /etc/initramfs-setup &&
+ echo -e "\n# localization information gotten via kernel command line \
+in $0\ncountry=\"${COUNTRY}\"" >>/etc/initramfs-setup
+ ;;
+ # single token for debugging ...
+ debug)
+ DEBUGLEVEL=1
+ ;;
+ # ... or a specified debug level
+ debug=*)
+ DEBUGLEVEL=${opts#debug=}
+ if [ $DEBUGLEVEL -eq 8 -o $DEBUGLEVEL -eq 20 ] ; then
+ echo "** SLX init started near $(sysup)"
+ elif [ $DEBUGLEVEL -ge 3 -a $DEBUGLEVEL -le 20 ] ; then
+ # create, start a debug shell process
+ echo "Debug shell started on second console (tty2)"
+ echo -e "#!/bin/sh\nsh" >/bin/debugshell
+ chmod u+x /bin/debugshell
+ getty -i -n -l /bin/debugshell 38400 tty2 &
+ # start logging (debuglevel >=3)
+ # fixme: SuSE hangs in Creating /var/log/boot.msg if activated
+ echo "Syslogd started on third console (tty3)"
+ # just to have some name in syslog
+ echo "(slx init)" >/proc/sys/kernel/hostname
+ syslogd -C2048
+ klogd
+ logread -f > /dev/tty3 2>/dev/null &
+ logread -f >> /var/log/messages 2>/dev/null &
+ fi
+ ;;
+ # if configuration should not be gathered by dhcp client
+ nodhcp)
+ nodhcp="yes"
+ echo "nodhcp" >/tmp/dhcp-done
+ ;;
+ nofile)
+ unset file
+ echo "nofile" >/tmp/file-done
+ ;;
+ # if ldap configuration should be triggered
+ ldap)
+ ldap="yes"
+ rm /tmp/ldap-done
+ ;;
+ # ldap configuration with host and port to contact (base)
+ ldap=*)
+ ldap="yes"
+ rm /tmp/ldap-done
+ ;;
+ # file source with tftp server and file location on the server
+ file=*|file)
+ if [ "${opts}" != "file" ] ; then
+ fileprot=$(uri_token ${opts#file=} prot)
+ fileserv=$(uri_token ${opts#file=} server)
+ filepath=$(uri_token ${opts#file=} path)
+ fi
+ ;;
+ # if ld.so.cache should be generated; should be switched on when composing
+ # rootfs from more than one source
+ ldsc)
+ ldsc="yes";;
+ # simple union of base ro rootdir with tempfs on top
+ nounionfs)
+ unionfs=0;;
+ # additional source to unify root filesystem with; the top layer will be
+ # the tempfs
+ unionfs=*)
+ unionfs=1
+ uniondirs=${opts#unionfs=}
+ # most probably it is a good idea to run ldconfig, so enable it
+ ldsc="yes"
+ ;;
+ # same for AUFS; alternative to unionfs
+ noaufs)
+ aufs=0;;
+ aufs=*)
+ aufs=1
+ uniondirs=${opts#aufs=}
+ # most probably it is a good idea to run ldconfig, so enable it
+ ldsc="yes"
+ ;;
+ # if cowloop should be used, only ontop of network block device and in
+ # combination with classical fs, like ext2 useful
+ cowloop=*)
+ cowloop=1
+ #cowsize=${opts#cowloop=}
+ ;;
+ # rootfs will void the variables (d)nbdroot, nfsroot ...
+ # fixme: allow multiple rootfs sources to be unioned!?
+ # if strinstr " " "$rootfs" ...
+ rootfs=*)
+ rootfs=${opts#rootfs=}
+ rootfs=${rootfs#\"}
+ rootfs=${rootfs%%\"}
+ srvproto=$(uri_token $rootfs prot)
+ case $srvproto in
+ nfs)
+ # nfsroot consists of two components
+ nfspath=$(uri_token $rootfs path)
+ nfsserver=$(uri_token $rootfs server)
+ grep -q -E "nfsserver" /etc/initramfs-setup || \
+ echo -e "# nfs root information gotten via kernel command \
+line in $0\nnfsserver=\"${nfsserver}\"\nnfspath=\"${nfspath}\"" \
+ >>/etc/initramfs-setup
+ ;;
+ *nbd*)
+ bldmod=$srvproto
+ # get settings for nbd-client, filesystem equals to path in URI
+ # notation (remove leading slash from filesystem at the end)
+ bldhost=$(uri_token $rootfs server)
+ bldport=$(uri_token $rootfs port)
+ bldrfst=$(uri_token $rootfs path)
+ bldrfst=${bldrfst#/*}
+ ;;
+ aoe)
+ echo "Not implemented yet"
+ bldmod=
+ ;;
+ iscsi)
+ echo "Not implemented yet"
+ bldmod=
+ #iscsiserver=$(uri_token $rootfs server)
+ #iscsiport=$(uri_token $rootfs port)
+ #iscsitarget=$(uri_token $rootfs path)
+ ;;
+ lbd)
+ # use a local device for mounting root block device with given
+ # filesystem directly or a root filesystem container from another
+ # filesystem, e.g. rootfs=lbd://sda1/squashfs (bldmod cannot be
+ # empty, use loop or the real device stuff)
+ bldmod=loop
+ blddev=$(uri_token $rootfs server)
+ bldfst=$(uri_token $rootfs path)
+ bldfst=${bldfst#/*}
+ ;;
+ esac
+ ;;
+ # size of cache dnbd should use within ram
+ dcsize=*)
+ dnbdcachesize=${opts#dcsize=};;
+ # ip configuration client-ip:server-ip:gateway:netmask
+ ip=*)
+ ipinfo=${opts#ip=};;
+ # deprecated: nfs server and path (rewritten to standard style)
+ nfsroot=*)
+ srvproto=nfs
+ nfsroot=${opts#nfsroot=}
+ nfspath=${nfsroot#*:}
+ nfsserver=${nfsroot%:/*}
+ grep -q -E "nfsserver" /etc/initramfs-setup || \
+ echo -e "\n# nfs root information gotten via kernel command line \n\
+in $0\n# deprecated: please use rootfs=nfs://...\nnfsserver=\"${nfsserver}\"\
+\nnfspath=\"${nfspath}\"">> /etc/initramfs-setup
+ ;;
+ # size of tempfs if not max. 50% of RAM should be used
+ tmpfssize=*)
+ tmpfssize=${opts#tmpfssize=};;
+ # vendor code identifier for dhcp requests, that way OpenSLX clients could
+ # be distinguished from other (dhcp) clients
+ vci=*)
+ vci=${opts#vci=};;
+ # option for ddcinfo
+ ddcinfo=*)
+ ddcinfo=${opts#ddcinfo=};;
+ esac
+done
+
+runinithook '05-have-kernelvars'
+
+# at this point a timer should be started to ensure an automated reboot
+# or halt of the machine if SLX init does not succeed (e.g. missing kernel
+# module for the network adaptor)
+if [ ${DEBUGLEVEL} -lt 3 -o ${DEBUGLEVEL} = 8 ] ; then
+ cat<<EOF > /bin/watchdog
+#!/bin/sh
+echo \$$ > /tmp/watchdogpid
+[ ! -f /proc/version ] && mount -n -t proc proc /proc
+sleep 120 2> /dev/null
+echo "o" > /proc/sysrq-trigger
+EOF
+ chmod u+x /bin/watchdog
+ watchdog &
+fi
+
+# check if at least one type of IP configuration is availabe
+if [ -n "$nodhcp" -a -z "$ldap" -a -z "$ipinfo" -a $srvproto != "lbd" ]
+ then echo -e "# You did not specify any advanced configuration mode for \
+your clients. You\n# might want to add the token 'dhcp' for DHCP config, \
+'file(=source)'\n# for config file get via TFTP or 'ldap(=source)' for LDAP \
+configuration to\n# your kernel command line." >> /etc/initramfs-setup
+ if strinfile "clientip" /etc/initramfs-setup ; then
+ # IP configuration seems to be present in initramfs-setup file
+ # TODO: FIX this, as it will clobber all kernel-cmdline values!
+ . /etc/initramfs-setup
+ ipinfo="ip=$clientip:$serverip:$gateway:$subnet_mask"
+ else
+ error "$init_errip"
+ fi
+fi
+
+# for ldap configuration at least basic IP setup is needed to contact the
+# server
+[ -n "$nodhcp" -a -n "$ldap" -a -z "$ipinfo" ] && error "$init_errldap"
+# set debug level and logfile
+if [ $DEBUGLEVEL -eq 20 ] ; then
+ echo "** Setting debuglevel to ${DEBUGLEVEL} at $(sysup)"
+elif [ $DEBUGLEVEL -ne 0 ] ; then
+ echo "Setting debuglevel to ${DEBUGLEVEL}"
+fi
+export MODPRV=" "
+export LOGFILE
+if [ "${DEBUGLEVEL}" -gt 0 -a "${DEBUGLEVEL}" != 8 ] ; then
+ # set LOGFILE and move it later on into stage4
+ LOGFILE="/var/log/slx-boot.log"
+ echo "Starting OpenSLX client boot logging at $(date)" >$LOGFILE
+ echo "1 4 1 7" >/proc/sys/kernel/printk
+ [ "${DEBUGLEVEL}" -ge 2 ] && MODPRV="-v"
+ [ "${DEBUGLEVEL}" -gt 3 -a "${DEBUGLEVEL}" -le 10 ] && {
+ set -x
+ # and the kernel too
+ echo "7 7 7 7" >/proc/sys/kernel/printk; }
+ [ "${DEBUGLEVEL}" -gt 10 -a "${DEBUGLEVEL}" -le 20 ] && set +x
+else
+ # switch off most of kernel debug output
+ echo "0 0 0 0" >/proc/sys/kernel/printk
+ # modprobe should stay quiet
+ MODPRV="-q"
+ LOGFILE="/dev/null"
+fi
+
+runinithook '10-nw-if-config'
+
+# check for multiple ethernet interfaces (we have at least the mac of PXE boot
+# device in $bootmac)
+# check here for the active ethernet link (skip non-ethN interfaces)
+if strinstr "eth" "$nwif" ; then
+ for ethif in eth0 eth1 eth2 eth3 ; do
+ export macaddr=$(ip link show dev $ethif 2>/dev/null | \
+ grep -i link.ether | awk '{print $2}')
+ # if there is no bootmac present in kernel commandline any checks are
+ # useless
+ if [ -z "$bootmac" ] ; then
+ bootmac="$macaddr"
+ [ "$ethif" != "eth0" ] && error "$init_bootmac" nonfatal
+ fi
+ if [ "$macaddr" = "$bootmac" ] ; then
+ nwif=$ethif
+ break
+ elif [ "x$macaddr" = "x" ] ; then
+ # if the macaddr is empty on the first interface tried, there is no
+ # network adaptor visible (missing kernel module)
+ if [ "$ethif" = "eth0" ] ; then
+ error "$init_errnwad"
+ else
+ # assume a forcedeth problem here (nonmatching MACs)
+ macaddr=${bootmac}
+ fi
+ break
+ fi
+ done
+fi
+# quickfix for proper nwif passing ... (to be fixed in a more general way)
+sed "s/nwif=.*/nwif=\"${nwif}\"/" -i /tmp/env/wrapper.env
+# hook to setup bridging (several virtualization tools ...
+runinithook '20-nw-bridge-config'
+
+# set up loopback networking
+[ $DEBUGLEVEL -eq 20 ] && echo "** starting ip config at $(sysup)"
+ip link set dev lo up 2>/dev/null
+ip addr add 127.0.0.1/8 dev lo 2>/dev/null
+ip link set dev $nwif up 2>/dev/null || error "$init_noeth"
+
+# analyze ip information from the kernel command line and put parts
+# of it into several variables
+if [ -n "$ipinfo" ] ; then
+ getip () {
+ local val="$ipinfo:"; i=$(($1 - 1));
+ while [ $i -gt 0 ] ; do
+ val=${val#*:} ; i=$(($i - 1));
+ done;
+ echo $val|sed "s/:.*//"; }
+ clientip=$(getip 1)
+ serverip=$(getip 2)
+ gateway=$(getip 3)
+ subnet_mask=$(getip 4)
+ broadcast_address=$(ipcalc -s -b $clientip $subnet_mask|sed s/.*=//)
+ [ -z "$broadcast_address" ] && broadcast_address=255.255.255.255
+ # we might have an idea of the dns server via preboot
+ dns_srv=$(getip 5)
+ [ -n "$dns_srv" ] && echo nameserver $dns_srv >/etc/resolv.conf;
+ echo -e "# ip configuration written by $0 script:\nclientip=$clientip\n\
+subnet_mask=$subnet_mask\ngateway=$gateway\nserverip=$serverip\n\
+broadcast_address=$broadcast_address" >>/etc/initramfs-setup
+ # set static ip address
+ ip addr add $clientip/$(ipcalc -s -p $clientip $subnet_mask|sed s/.*=//) \
+ broadcast $broadcast_address dev $nwif 2>/dev/null
+ ip route add default via $gateway 2>/dev/null
+else
+ noipyet="yes"
+fi
+# get configuration data via dhcp (with vendor code identifier if present
+# in ${vci} from kernel command line or initramfs-setup) ...
+if [ -z "$nodhcp" ] ; then
+ ( rundhcp ${vci}; echo "dhcp finished at $(sysup)" >/tmp/dhcp-done ) &
+ if [ -n "$noipyet" ] ; then
+ waitfor /tmp/dhcp-done 20000
+ . /tmp/confviadhcp
+ # by now there should be a proper ip configuration present
+ if [ -z "$clientip" -o -z "$subnet_mask" -o -z "$broadcast_address" ]
+ then error "$init_errdhcp"
+ else
+ { ip addr add \
+ $clientip/$(ipcalc -s -p $clientip $subnet_mask|sed s/.*=//) \
+ broadcast $broadcast_address dev $nwif 2>/dev/null || \
+ error "$init_erripcfg"; }
+ # if gateway is available set it
+ [ -n $gateway ] && ip route add default via $gateway 2>/dev/null
+ fi
+ # fixme: to be checked!!
+ # else
+ # if [ -n "$file" -a "$srvproto" = "lbd" ] ; then
+ # error "$init_erripcfg" nonfatal
+ # else
+ # error "$init_erripcfg"
+ # fi
+ # fi
+ fi
+fi
+# check if serverip is set as variable @@@serverip@@@
+sed "s,@@@serverip@@@,$serverip," -i /etc/initramfs-setup
+[ $DEBUGLEVEL -eq 20 ] && echo "** finished ip config at $(sysup)"
+
+# on some network adaptors we need to wait for the link to come up
+dmesg | grep -q "link down" && for i in 1 1 1 1 ; do
+ dmesg | grep -q "link up" && break
+ [ $DEBUGLEVEL -ge 1 ] && echo "network: waited half a second for the \
+link to come up" >>$LOGFILE
+ sleep $i
+done
+# ... or ldap if available (in background)
+[ -n "$ldap" ] && ldapconf &
+# ... or via (t)ftp/http file get (in background)
+[ -n "$file" ] && fileget &
+
+runinithook '25-have-ip-config'
+
+# if root filesystem should be imported via local or a network block device
+if [ -n "${bldmod}" ] ; then
+ # load block device driver(s) if needed
+ for module in ${bldmod} ; do
+ modprobe ${MODPRV} ${module} || error "$init_errbld"
+ done
+ mdev -s
+ [ -z "$bldrfst" ] && bldrfst=squashfs
+ bldhost=$(checkip $bldhost)
+ if [ $DEBUGLEVEL -eq 20 ] ; then
+ echo "** starting setup of ${bldmod} at $(sysup)"
+ else
+ echo "Stateless client using ${bldmod} on $bldhost:$bldport with $bldrfst"
+ fi
+ # fixme: check for fs in /proc/filesystems before trying to load the module
+ modprobe ${MODPRV} ${bldrfst} || error "$init_errbld" nonfatal
+
+ # for debugging: interface might not be properly up - check reachability
+ [ $DEBUGLEVEL -ge 1 ] && ping -c 1 -w 15 ${bldhost} >/dev/null 2>&1
+
+ case "${srvproto}" in
+ # network block device present in standard kernel
+ nbd)
+ RDEV=/dev/nbd0
+ waitfor "${RDEV}" 20000 || error "$init_nbddev"
+ i=0
+ while ! nbd-client $bldhost $bldport ${RDEV} -persist ; do
+ usleep 100000
+ i=$(($i + 1))
+ if [ $i -ge 1000 ] ; then
+ error "$init_nbds"; break
+ fi
+ done
+ usleep 100
+ echo deadline > /sys/block/nbd0/queue/scheduler
+ # echo "32" > /sys/block/nbd0/queue/read_ahead_kb
+ ;;
+ # dnbd2 by Vito Di Leo
+ dnbd2)
+ RDEV=/dev/vnbd0
+ waitfor "${RDEV}" 20000 || error "$init_nbddev"
+ # quickhack, should be read in from URI
+ echo 1 > /sys/block/vnbd0/config/vid
+ echo 1 > /sys/block/vnbd0/config/rid
+ # check for others in initramfs-setup and then kernel cmdline
+ rootfs="$(sed -n "/rootfs=/p" /etc/initramfs-setup| \
+ sed "s,rootfs=,,;s,\",,g") "
+ [ "$rootfs" = " " ] && \
+ rootfs="$(cat /proc/cmdline|sed "s,.*rootfs=\",,;s,\".*,,") "
+ i=0
+ # assume no more than 16 different dnbd2 servers (default 4)
+ while [ "x$bldhost" != "x" -a $i -lt 16 ]; do
+ #echo "I: $i R: $rootfs P:$bldport H:$bldhost"
+ echo $bldhost $bldport > /sys/block/vnbd0/server${i}/sock
+ i=$(($i + 1))
+ rootfs=${rootfs#* }
+ bldsp=$(echo ${rootfs}|sed "s, .*,,")
+ bldhost=$(uri_token $bldsp server)
+ bldport=$(uri_token $bldsp port)
+ done
+ # the cfq scheduler seem not a good idea here
+ echo deadline > /sys/block/vnbd0/queue/scheduler
+ # needed for some reason to settle initialization
+ sleep 1
+ i=0
+ while [ $(cat /sys/block/vnbd0/config/running) != 1 ] ; do
+ usleep 100000
+ echo 1 > /sys/block/vnbd0/config/running
+ i=$(($i + 1))
+ if [ $i -ge 50 ] ; then
+ error "$init_dnbd2s"; break
+ fi
+ done
+ echo "64" > /sys/block/vnbd0/queue/read_ahead_kb
+ ;;
+ # dnbd by Thorsten Zitterell
+ dnbd)
+ # quickhack
+ RDEV=/dev/dnbd0
+ if [ -z $nodnbdcache ] ; then # variable not really used yet
+ mkdir /dnbd
+ mount -n -o 'size=20%' -t tmpfs tmpfs /dnbd
+ ( cat /dev/zero > /dnbd/cache 2>/dev/null || echo "ok" >/tmp/cache ) &
+ clientopt="-c /dnbd/cache"
+ waitfor /tmp/cache 10000
+ fi
+ [ $(echo $bldhost|sed "s,\..*,,") -ge 224 ] && \
+ ip route add 224.0.0.0/4 dev $nwif
+ waitfor /dev/dnbd0 10000 || error "$init_nbddev"
+ echo "dnbd-client -b $bldhost -d $RDEV $clientopt"
+ while ! dnbd-client -b $bldhost -d $RDEV $clientopt ; do
+ usleep 10000
+ done
+ # problem with squashfs and cfq scheduler
+ echo noop > /sys/block/dnbd0/queue/scheduler
+ echo 0 > /sys/block/dnbd0/queue/read_ahead_kb
+ ;;
+ lbd)
+ # using clients local block device (disk partition is to be specified
+ RDEV=/dev/$blddev
+ echo "$bldrfst" >>/etc/filesystems
+ realbldrfst=$bldrfst
+ # we might need to mount the base layer filesystem first before accessing
+ # e.g. a squashfs container file on it
+ bldrfst=auto
+ ;;
+ esac
+ RWRO="ro"
+ if [ -n "${cowloop}" -a -x /bin/cowdev ] ; then
+ modprobe ${MODPRV} cowloop || {
+ error "$init_loadcow" nonfatal
+ unset cowloop; }
+ [ -x /bin/mdev ] && mdev -s
+ fi
+ if [ -n "${cowloop}" ] ; then
+ if [ -n "${unionfs}" -o -n "${aufs}" ] ; then
+ error "$init_cownobld"
+ unset unionfs aufs
+ fi
+ echo "Using Copy-on-Write block device for rw access"
+ mount -n -t tmpfs -o size=${cowsize} ramfs ${rwdir}
+ mkdir /dev/cow && mknod /dev/cow/ctl b 241 255
+ usleep 200
+ ln -s /dev/cowloop0 /dev/cow/0
+ # fixme - cowdev depending on blockdev choosen above ...
+ cowdev -a /dev/nbd0 ${rwdir}/nbd.cow
+ usleep 200
+ RWRO="rw"
+ RDEV=/dev/cow/0
+ # run ldconfig if not switched off via kernel command line
+ ldcfg
+ else
+ # use normal UnionFS behaviour because rootfs is not NFS
+ unset nfsro
+ fi
+ # finally mount the configured network/local block device
+ for i in 0 5000 20000 100000 500000 1000000 ; do
+ usleep $i
+ mount -n -t $bldrfst -o $RWRO $RDEV /mnt 2>/dev/null && break
+ done
+ # check if we got the rootfilesystem directly or need to mount a container
+ # file from the mounted block device
+ if [ "${srvproto}" = "lbd" -a -f /mnt/boot/${slxconf_system_name} ]; then
+ mkdir /dev/bootdisk
+ mount --move /mnt /dev/bootdisk
+ mount -t ${realbldrfst} -o loop \
+ /dev/bootdisk/boot/${slxconf_system_name} /mnt || error "$init_errloop"
+ fi
+ [ $DEBUGLEVEL -eq 20 ] && echo "** finished blockdev setup stuff at $(sysup)"
+elif [ -n ${iscsiserver} ] ; then
+ [ $DEBUGLEVEL -eq 20 ] && echo "** started setting up iSCSI initiator at \
+$(sysup)"
+ #if [ -n ${iscsitarget} ] ; then
+ # echo "InitiatorName=${iscsitarget}"|sed "s,@@@serverip@@@,$serverip," \
+ # >/etc/initiatorname.iscsi
+ #else
+ # discovery
+ #fi
+ #echo -e "node.startup = automatic">/etc/iscsid.conf
+ #iscsid -c /etc/iscsid.conf
+ # the cowloop part has to be moved (option for iscsi devices too)
+ # and should be generalized for nbd, dnbd, iscsi
+fi
+
+# if no type of root filesystem is passed via kernel command line try
+# information gathered from dhcp process (only valid for nfs)
+if [ -z "${bldmod}" -a -z "${bldhost}" -a -z "${nfsserver}" ] ; then
+ # information has to be read from dhcp and ldap configuration
+ # cfgcomplete merges all configuration files
+ cfgcomplete
+fi
+
+# mount nfs rootfs
+if [ -z "${bldmod}" -a -z "${bldserver}" ] ; then
+ [ $DEBUGLEVEL -eq 20 ] && echo "** started nfs mount"
+ # read in extended initramfs-setup
+ . /etc/initramfs-setup
+ # prefer nfsserver and nfspath from kernel commandline over the information
+ # gotten from dhcp server
+ if [ -n "${nfsserver}" -a -n "${nfspath}" ] ; then
+ # check if nfsserver is set as variable @@@serverip@@@
+ nfsserver=$(checkip $nfsserver)
+ else
+ # we got a problem here
+ error "$init_nfssp" fatal
+ fi
+ # interface might not be properly up - check reachability
+ ping -c 1 -w 15 ${nfsserver} >/dev/null 2>&1
+ # mount the rootfs via nfs readonly (ro)
+ fsmount nfs ${nfsserver} ${nfspath} /mnt ro
+ #for transport in tcp udp fail; do
+ # [ $proto = "fail" ] && { error "$init_nfs"; break; }
+ # mount -n -t nfs -o ro,nolock,${transport} ${nfsroot} /mnt && break
+ #done
+ [ $DEBUGLEVEL -eq 20 ] && echo "** finished nfs mount at $(sysup)"
+fi
+
+runinithook '35-have-network-root'
+
+# get the complete collection of kernel modules and firmwares available
+testmkd /lib/firmware
+mount -n --bind /mnt/lib/modules /lib/modules && \
+mount -n --bind /mnt/lib/firmware /lib/firmware || error "$init_moddir"
+# start hardware configuration as background process if not a special
+# debuglevel (21) is used for the option of manual hwautocfg start
+if [ ${DEBUGLEVEL} = 21 ] ; then
+ echo "You can run 'hwautocfg main &' manually now ..."
+ /bin/sh
+else
+ [ $DEBUGLEVEL -eq 20 ] && echo "** started hwautocfg in background at \
+$(sysup)"
+ hwautocfg main &
+fi
+
+runinithook '40-started-hw-config'
+
+# unionfs/aufs modules visible by now if installed, try to use aufs for rw
+# access if available
+union_type=""
+if [ ${aufs} -eq 1 ] && \
+ modprobe ${MODPRV} aufs 2>/dev/null && \
+ lsmod | grep -qe "^aufs" ; then union_type="AUFS"
+elif [ ${unionfs} -eq 1 ] && \
+ modprobe ${MODPRV} unionfs 2>/dev/null && \
+ lsmod | grep -qe "^unionfs" ; then union_type="UnionFS"
+elif [ ${aufs} -eq 0 -a ${unionfs} -eq 0 -a -z "${cowloop}" ] ; then
+ error "$init_deselau" nonfatal
+ unset aufs unionfs
+else
+ error "$init_loadaufs" nonfatal
+ unset aufs unionfs
+fi
+
+# runtimer
+[ $DEBUGLEVEL -eq 8 -o $DEBUGLEVEL -eq 20 ] && \
+ echo "** Filesystem setup started at $(sysup)"
+# setup of client root filesystem dependent on the availability of UnionFS
+if [ "x${union_type}" != "x" ] ; then
+ echo "Using ${union_type} for rw access"
+ mkdir -p ${rwdir}/union ${rwdir}/uniontmp /rorootfs
+ # adapting tempfs size of the device directory (takes /tmp in stage4)
+ mount -o remount,size=${tmpfssize} ${devdir}
+ mount -n -t tmpfs -o size=${tmpfssize} none ${rwdir}/uniontmp
+ # hack for handling unionfs with patched run-init
+ mount -n --move /mnt /rorootfs
+ if [ "$union_type" == "UnionFS" ]; then
+ mount -n -t unionfs -o dirs=${rwdir}/uniontmp:/rorootfs=${nfsro}ro \
+ none /mnt
+ elif [ "$union_type" == "AUFS" ]; then
+ mount -n -t aufs -o br:/${rwdir}/uniontmp:/rorootfs=ro none /mnt
+ fi
+ mkdir -p /mnt/uniontmp
+ mount -n --move ${rwdir}/uniontmp /mnt/uniontmp
+ chmod 0755 /mnt/uniontmp /mnt
+ # running hardware disk/tmp setup now
+ hwautocfg disk &
+ # run ldconfig if switched on via kernel command line (token ldsc) or
+ # triggered by unionized root filesystem
+ ldcfg
+elif [ -z "${cowloop}" ] ; then
+ # fire up hardware disk/tmp setup first
+ hwautocfg disk &
+ echo "Using bind mounts to ramdisk for rw access"
+ mount -n -t tmpfs -o size=75% ramfs ${rwdir}
+ for path in ${D_BINDMPTS} ; do
+ mkdir -p ${rwdir}/${path} >/dev/null 2>&1
+ mount -n --bind ${rwdir}/${path} /mnt/${path}
+ [ ${DEBUGLEVEL} -gt 1 -a ${DEBUGLEVEL} != 8 ] && \
+ echo "Created ${rwdir}/${path} and mounted it to /mnt/$path"
+ done
+ # see above ...
+ ldcfg
+ # save the RO directories mentioned in the distro-specific
+ # config to a temporary directory. They will later on be restored
+ for path in ${D_RODIRSINRW}; do
+ if [ -d /mnt/${path} ] ; then
+ list="${path} ${list}"
+ # exclude them from etc copy process too
+ echo "${path}/*"|sed -e "s,/root/,,;s,^/,," >>/tmp/etc.exclude
+ mkdir -p /root/${path} >/dev/null 2>&1
+ mount -n --bind /mnt/${path} /root/${path} >/dev/null 2>&1
+ fi
+ done
+ for path in /etc/${D_SYSCONFDIR} ${D_DIRINBINDMNT} ${list}; do
+ mkdir -p ${rwdir}/${path}
+ done
+ testmkd ${rwdir}/var/tmp 1777
+ # exclude all sysv runlevel link stuff
+ for i in ${D_RCDIRS} ${D_INITBOOTD} ; do
+ echo "*$i/*" >>/tmp/etc.exclude
+ done
+ # add list of files to be excluded and common excludes to the filter list
+ echo -e "-\ndhcp*\n*~\n*.old\n*-\nxorg.conf*" >>/tmp/etc.exclude
+ # if ld.so.cache is to be generated then do not copy the file
+ [ -n "${ldsc}" ] && echo -e "ld.so.cache*" >>/tmp/etc.exclude
+ # for tar exclude lists might be used, more difficult for cp
+ cd /mnt
+ tar -X /tmp/etc.exclude -cp etc/*|tar -xp -C ${rwdir} 2>/dev/null
+ cd /
+ mount -n --bind ${rwdir}/etc /mnt/etc
+ mount -n --bind ${rwdir}/var /mnt/var
+ # get the "covered" mounts back into filesystem structure
+ for path in ${list}; do
+ mount -n --move /root/$path /mnt/$path #>>$LOGFILE 2>&1
+ done
+ #rm -rf /root/* >/dev/null 2>&1
+ # run some specific stuff !?
+fi
+
+runinithook '50-have-layered-fs'
+
+# generate a set of default directories
+. /etc/openslx.conf
+for dir in $OPENSLX_DEFAULT_LOGDIR $OPENSLX_DEFAULT_BINDIR \
+ $OPENSLX_DEFAULT_LIBDIR $OPENSLX_DEFAULT_VIRTDIR; do
+ testmkd /mnt/$dir
+done
+chmod -R 1777 /mnt/${OPENSLX_DEFAULT_LOGDIR}
+
+# script for stuff to execute during early bootup
+d_mkrlscript init boot.slx "Running configuration postponed from InitRamFS"
+echo "fs complete at $(sysup)" >/tmp/fscmpl
+# runtimer
+[ $DEBUGLEVEL -eq 8 -o $DEBUGLEVEL -eq 20 ] && \
+ echo "** Filesystem setup completed at $(sysup)"
+
+# write debug file information after filesystem setup completed
+echo -e "# /etc${D_SYSCONFDIR}/logfile - file created by $0 (initramfs \
+from $date)\n#\n# logfile \
+for linux diskless client specific debugging output\nLOGFILE=\"$LOGFILE\"\n#\
+\n# debug level\nDEBUGLEVEL=\"$DEBUGLEVEL\"" \
+ > /mnt/etc/${D_SYSCONFDIR}/logfile || error "$init_errlog"
+
+# run distribution independent and dependent configuration of files and
+# services (offer debug shell in runlevel 22)
+if [ ${DEBUGLEVEL} = 22 ] ; then
+ /bin/sh
+else
+ servconfig &
+fi
+
+for path in @@@COMDIRINDXS@@@ ${D_DIRINDXS} ${D_DIRINBINDMNT} ; do
+ testmkd /mnt/${path}
+done
+# Needed writable subdirs nested in readonly subdirs of writable one
+for path in ${D_RWDIRSINRO}; do
+ mount -n -t tmpfs none /mnt/${path}
+done
+for i in /var/run/utmp /var/log/wtmp /var/log/lastlog /etc/mtab ; do
+ echo -n > /mnt/$i
+done
+chown 65534:0 /mnt/var/lib/nobody
+# /proc/bus/usb might be deprecated in newer kernels ...
+echo -e "# /etc/fstab - file generated by $0 (initramfs from $date)\n#\
+\tOpenSLX Project, info@openslx.com\n\nrootfs\t\t/\t\trootfs\t\tro\t\t 0 0\n\
+proc\t\t/proc\t\tproc\t\tdefaults\t 0 0\ninitramdevs\t/dev\t\ttmpfs\
+\t\trw\t\t 0 0\ndevpts\t\t/dev/pts\tdevpts\t\tmode=0620,gid=5\t 0 0" \
+ >/mnt/etc/fstab || error "$init_fstab"
+echo -e "rootfs / rootfs rw 0 0\ninitramdevs /dev tmpfs rw\
+ 0 0" > /mnt/etc/mtab
+
+# copy library cache if generated
+if [ -n "${ldsc}" ] ; then
+ # creating library cache takes a while ...
+ if waitfor /tmp/ldcfg 50000 ; then
+ test -s /mnt/tmp/ld.so.cache && \
+ mv /mnt/tmp/ld.so.cache /mnt/etc/ld.so.cache
+ else
+ error "$init_errldcfg"
+ fi
+else
+ [ $DEBUGLEVEL -gt 2 ] && error "$init_infldcfg" nonfatal
+fi
+
+runinithook '60-have-servconfig'
+
+# wait a while for hardware setup to complete and start cleanup procedure
+[ $DEBUGLEVEL -gt 1 ] && echo "Waiting for hwautocfg to finish ..."
+waitfor /tmp/hwcfg 20000 || error "$init_errhw"
+hwautocfg finish &
+
+# wait a while for services setup to complete
+[ $DEBUGLEVEL -gt 1 ] && echo "Waiting for servconfig to finish ..."
+waitfor /tmp/svcfg 10000 || error "$init_errsw"
+# IP configuration is complete and should not be updated automatically
+killall -9 udhcpc 2>/dev/null
+
+# if uniondirs is not set yet, maybe the unions were given via initramfs-setup
+if [ -z "$uniondirs" ]; then
+ if [ "$union_type" == "AUFS" ]; then
+ # does it contain "://"?
+ if [ "$aufs" != "${aufs#*://}" ]; then
+ uniondirs="$aufs"
+ fi
+ elif [ "$union_type" == "UnionFS" ]; then
+ # does it contain "://"?
+ if [ "$unionfs" != "${unionfs#*://}" ]; then
+ uniondirs="$unionfs"
+ fi
+ fi
+fi
+# if locations are given that should be unioned with the fs root, do it
+if [ -n "$uniondirs" ]; then
+ include_in_fsroot_union "$union_type" "$uniondirs"
+fi
+
+runinithook '70-before-plugins'
+
+# ddcinfo temporary overwrite (with kernel cmdline ddcinfo=1)
+if [ "${ddcinfo}" = "1" -a -f /initramfs/plugin-conf/xserver.conf ]; then
+ echo 'xserver_ddcinfo="1"' >> /initramfs/plugin-conf/xserver.conf
+fi
+
+# runtimer
+[ $DEBUGLEVEL -eq 8 -o $DEBUGLEVEL -eq 20 ] && \
+ echo "** Plugin configuration started at $(sysup)"
+
+# check for any plugin-specific runlevel scripts and run them, if found:
+if [ ${DEBUGLEVEL} = 25 ] ; then
+ /bin/sh
+else
+ if [ -d /etc/plugin-init.d ]; then
+ for plugin_starter in /etc/plugin-init.d/*.sh; do
+ if [ -e $plugin_starter ]; then
+ [ $DEBUGLEVEL -gt 0 ] \
+ && echo -n "Running plugin starter $plugin_starter ..."
+ [ $DEBUGLEVEL -eq 15 ] \
+ && sed '/^#!/ a\\set -x' -i $plugin_starter
+ init-wrapper $plugin_starter >>/tmp/plugin_starter 2>&1
+ if [ $? -eq 0 ]; then
+ [ $DEBUGLEVEL -gt 0 ] \
+ && echo " ok"
+ else
+ [ $DEBUGLEVEL -gt 0 ] \
+ && echo " failed"
+ fi
+ fi
+ done
+ # load variables defined by plugins to current environment
+ [ -f /tmp/env/wrapper.env ] && . /tmp/env/wrapper.env
+ fi
+fi
+
+runinithook '80-after-plugins'
+
+# runtimer
+[ $DEBUGLEVEL -eq 8 -o $DEBUGLEVEL -eq 20 ] && \
+ echo "** Plugin configuration finished at $(sysup)"
+
+# create links for initial stage4 boot scripts
+initial_boot
+
+runinithook '85-have-initial-boot'
+
+# post init for some distro specific stuff to run
+postinit
+# general postinit.local configurable by the admin via openslx/config/<system>
+[ -f /initramfs/postinit.local ] && {
+ [ $DEBUGLEVEL -gt 0 ] && \
+ echo -n "Running script /bin/postinit.local ... "
+ chmod u+x /initramfs/postinit.local
+ /initramfs/postinit.local
+ [ $DEBUGLEVEL -gt 0 ] && echo "ok"; }
+
+# start a debug shell in higher debug levels
+[ $DEBUGLEVEL -gt 2 -a $DEBUGLEVEL != 8 ] \
+ && echo "DEBUGLEVEL>2: starting debug-shell, exit with CTRL+D" && /bin/sh
+
+runinithook '90-postinit-done'
+
+# unmount the bind mounted modules, firmware directories and nfs /tmp/scratch
+# (if present)
+export ticks
+for ticks in 0 1 2 5 10 20 30; do
+ sleep $ticks && umount -n /lib/modules 2>/dev/null && break
+ error "$init_wait" nonfatal
+done
+for ticks in 0 1 2 5 10 20 30; do
+ sleep $ticks && umount -n /lib/firmware 2>/dev/null && break
+ error "$init_wait" nonfatal
+done
+mount 2>/dev/null | grep -q "/tmp/scratch type nfs" && \
+ for ticks in 0 1 2 5 10 20 30; do
+ sleep $ticks && umount -n /tmp/scratch 2>/dev/null && break
+ done
+
+mount 2>/dev/null | grep -q /lib/modules && error "$init_errumnt"
+# close runlevel script for stuff to execute during early bootup
+d_mkrlscript close boot.slx ""
+# put /tmp into stage4 mtab and add stuff to stage4 fstab
+sed -n "s,/mnt,,;/\/tmp /p" /proc/mounts >> /mnt/etc/mtab
+[ -f /tmp/fstab ] && cat /tmp/fstab >> /mnt/etc/fstab
+# preparations to leave initramfs - umounting ...
+umount -n /sys || error "$init_errsys" nonfatal
+umount -n /proc/bus/usb >/dev/null 2>&1
+chmod 1777 /dev/shm /mnt/tmp 2>/dev/null
+
+runinithook '95-cleanup'
+
+# kill hwautocfg, servconfig, hwinfo, syslogd, etc.
+killall -9 hwautocfg servconfig debugshell hwinfo syslogd logread 2>/dev/null
+
+# runtimer
+[ $DEBUGLEVEL -eq 8 -o $DEBUGLEVEL -eq 20 ] && \
+ echo "** SLX init ended near $(sysup)"
+# kill the watchdog (autopoweroff, if stage3 init never finishes)
+[ -f /tmp/watchdogpid ] && kill $(cat /tmp/watchdogpid) 2>/dev/null
+# stop logging services if required and move logfile into stage4 filesystem
+# (if exists)
+killall klogd 2>/dev/null
+[ -f /var/log/slx-boot.log ] && mv /var/log/slx-boot.log \
+ /mnt/var/log/slx-s3boot.log
+[ -f /var/log/messages ] && cp /var/log/messages \
+ /mnt/var/log/slx_messages 2>/dev/null
+# if no syslog plugin was configured, start the daemon again writing to no
+# logfile directly (useless fake test as placeholder)
+# THIS IS NOT WORKING SOMEHOW!!
+#[ ! -d /mnt/opt/openslx/plugin-repo/syslog/ ] && syslogd -O /mnt/var/log/testfile
+
+# move /dev and unmount /proc and unset all old, unneeded environment
+# variables
+mount -n --move /dev /mnt/dev
+umount -n /proc
+unset client debug date initrd ip bldroot macaddr nwif nfsroot rootfs ticks \
+ vci vga
+unset BOOT_IMAGE KCMDLINE KERNEL MODPRV NWMODULES OLDPWD UDEVD_EVENT_TIMEOUT \
+ SLXVERSION UDEVD_EXPECTED_SEQNUM PATH
+
+runinithook '99-handing-over'
+
+# new style of pivoting (switch_root or run-init)
+exec /sbin/switch_root -c dev/console /mnt /sbin/init $DEBUG_UPSTART || \
+ error "$init_runinit"
diff --git a/src/initramfs/tools/hwinfo/bin/hwinfo-13.11 b/src/initramfs/tools/hwinfo/bin/hwinfo-13.11
new file mode 100755
index 00000000..f2ae313c
--- /dev/null
+++ b/src/initramfs/tools/hwinfo/bin/hwinfo-13.11
Binary files differ
diff --git a/src/initramfs/tools/hwinfo/bin/hwinfo-14.19 b/src/initramfs/tools/hwinfo/bin/hwinfo-14.19
new file mode 100755
index 00000000..af71e25c
--- /dev/null
+++ b/src/initramfs/tools/hwinfo/bin/hwinfo-14.19
Binary files differ
diff --git a/src/initramfs/tools/hwinfo/bin/hwinfo-15.21 b/src/initramfs/tools/hwinfo/bin/hwinfo-15.21
new file mode 100755
index 00000000..87629a5c
--- /dev/null
+++ b/src/initramfs/tools/hwinfo/bin/hwinfo-15.21
Binary files differ
diff --git a/src/initramfs/tools/hwinfo/bin/hwinfo-15.3 b/src/initramfs/tools/hwinfo/bin/hwinfo-15.3
new file mode 100755
index 00000000..4f806b6e
--- /dev/null
+++ b/src/initramfs/tools/hwinfo/bin/hwinfo-15.3
Binary files differ
diff --git a/src/initramfs/tools/hwinfo/bin/hwinfo-16.0 b/src/initramfs/tools/hwinfo/bin/hwinfo-16.0
new file mode 100755
index 00000000..5dbe48a4
--- /dev/null
+++ b/src/initramfs/tools/hwinfo/bin/hwinfo-16.0
Binary files differ
diff --git a/src/initramfs/tools/hwinfo/db/hwinfo.db.tgz b/src/initramfs/tools/hwinfo/db/hwinfo.db.tgz
new file mode 100644
index 00000000..524ee1de
--- /dev/null
+++ b/src/initramfs/tools/hwinfo/db/hwinfo.db.tgz
Binary files differ
diff --git a/src/initramfs/tools/hwinfo/lib/libhd.so.13.11 b/src/initramfs/tools/hwinfo/lib/libhd.so.13.11
new file mode 100755
index 00000000..f6fa83a6
--- /dev/null
+++ b/src/initramfs/tools/hwinfo/lib/libhd.so.13.11
Binary files differ
diff --git a/src/initramfs/tools/hwinfo/lib/libhd.so.14.19 b/src/initramfs/tools/hwinfo/lib/libhd.so.14.19
new file mode 100755
index 00000000..087e7c1e
--- /dev/null
+++ b/src/initramfs/tools/hwinfo/lib/libhd.so.14.19
Binary files differ
diff --git a/src/initramfs/tools/hwinfo/lib/libhd.so.15.21 b/src/initramfs/tools/hwinfo/lib/libhd.so.15.21
new file mode 100755
index 00000000..fe066957
--- /dev/null
+++ b/src/initramfs/tools/hwinfo/lib/libhd.so.15.21
Binary files differ
diff --git a/src/initramfs/tools/hwinfo/lib/libhd.so.15.3 b/src/initramfs/tools/hwinfo/lib/libhd.so.15.3
new file mode 100755
index 00000000..6ab25238
--- /dev/null
+++ b/src/initramfs/tools/hwinfo/lib/libhd.so.15.3
Binary files differ
diff --git a/src/initramfs/tools/hwinfo/lib/libhd.so.16.0 b/src/initramfs/tools/hwinfo/lib/libhd.so.16.0
new file mode 100644
index 00000000..3fd68f29
--- /dev/null
+++ b/src/initramfs/tools/hwinfo/lib/libhd.so.16.0
Binary files differ
diff --git a/src/initramfs/tools/mksquashfs/3.3/mksquashfs b/src/initramfs/tools/mksquashfs/3.3/mksquashfs
new file mode 100755
index 00000000..c43d8106
--- /dev/null
+++ b/src/initramfs/tools/mksquashfs/3.3/mksquashfs
Binary files differ
diff --git a/src/initramfs/tools/mksquashfs/3.3/unsquashfs b/src/initramfs/tools/mksquashfs/3.3/unsquashfs
new file mode 100755
index 00000000..4a73d690
--- /dev/null
+++ b/src/initramfs/tools/mksquashfs/3.3/unsquashfs
Binary files differ
diff --git a/src/initramfs/tpm/bin/detect-tpm.sh b/src/initramfs/tpm/bin/detect-tpm.sh
new file mode 100755
index 00000000..48bc92f7
--- /dev/null
+++ b/src/initramfs/tpm/bin/detect-tpm.sh
@@ -0,0 +1,60 @@
+#!/bin/sh
+#
+
+SYS_PATH="/sys/class/misc/tpm0/device/"
+MODULES="atmel tis nsc infineon"
+MODULES_FORCE="tis"
+FLAGS=""
+FLAGS_FORCE="force=1"
+
+test_tpm() {
+ if [ ! -d "$SYS_PATH" ] ; then
+ return 1
+ fi
+
+# tpm_tis creates "active" and "enabled" files
+# _atmel and _nsc only create the "caps"
+ ACTIVE="$(cat $SYS_PATH/active 2>/dev/null)"
+ ENABLED="$(cat $SYS_PATH/enabled 2>/dev/null)"
+ CAPS="$(cat $SYS_PATH/caps 2>/dev/null)"
+ if [ -n "$ACTIVE" -o -n "$ENABLED" -o -n "$CAPS" ] ; then
+ echo
+ echo "successfully detected TPM chip!"
+ echo
+ echo "$CAPS"
+ echo
+ else
+ return 2
+ fi
+}
+
+try_modules() {
+ if [ "$1" == "force" ] ; then
+ MODULES=$MODULES_FORCE
+ FLAGS=$FLAGS_FORCE
+ echo "using flags '$FLAGS'"
+ fi
+ echo -n "trying modules:"
+ for module in $MODULES ; do
+ echo -n " $module"
+ modprobe tpm_${module} $FLAGS 2>/dev/null
+ if test_tpm ; then
+ return 0
+ fi
+ # clean up since e.g. infineon always loads w/o error...
+ modprobe -r tpm_${module} 2>/dev/null
+ done
+ echo
+ return 1
+}
+
+# create device-node
+test -c /dev/tpm0 || mknod /dev/tpm0 c 10 224
+
+if try_modules ; then
+ exit 0 # success
+fi
+if ! try_modules force ; then
+ echo "Warning: no TPM chip found!"
+ exit 1
+fi
diff --git a/src/initramfs/tpm/bin/fetch-sshkeys.sh b/src/initramfs/tpm/bin/fetch-sshkeys.sh
new file mode 100755
index 00000000..c385fd47
--- /dev/null
+++ b/src/initramfs/tpm/bin/fetch-sshkeys.sh
@@ -0,0 +1,28 @@
+#!/bin/sh
+#
+
+SHOWMAC="/bin/showmac.sh"
+KEYTRG="/root/.ssh"
+
+# FIXME: remote-host could be determined from kernel-cmdline, should we?
+RHOST="132.230.4.180"
+
+if [ ! -x "$SHOWMAC" ] ; then
+ echo "Can't find $SHOWMAC, exiting."
+ exit 1
+fi
+MAC_ETH0="$($SHOWMAC eth0)"
+
+mkdir -p "$KEYTRG"
+
+PRIVKEY="id_rsa.tpm-${MAC_ETH0}.sealed"
+
+echo -n "trying to fetch private key (via tftp):"
+tftp -r client-config/tpm/$PRIVKEY -l $KEYTRG/id_rsa -g $RHOST
+if [ "$?" -gt 0 ] ; then
+ echo " FAILED!"
+ echo "ERROR: can't find private key for this MAC-address: $MAC_ETH0."
+ exit 2
+fi
+echo " $PRIVKEY"
+chmod 600 $KEYTRG/id_rsa
diff --git a/src/initramfs/tpm/bin/mygetty.sh b/src/initramfs/tpm/bin/mygetty.sh
new file mode 100755
index 00000000..db344d21
--- /dev/null
+++ b/src/initramfs/tpm/bin/mygetty.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+#
+
+if [ -f "/mnt/sbin/agetty" ] ; then
+ /mnt/sbin/agetty -n -l /bin/bash 9600 /dev/tty1
+else
+ echo "agetty-binary not found!"
+fi
+
+# /bin/bash
diff --git a/src/initramfs/tpm/bin/showmac.sh b/src/initramfs/tpm/bin/showmac.sh
new file mode 100755
index 00000000..ef2aaf21
--- /dev/null
+++ b/src/initramfs/tpm/bin/showmac.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+#
+
+DEV="$1"
+[ -z "$DEV" ] && DEV="eth0"
+
+ip link show $DEV | \
+ sed -n 's,.*\(..:..:..:..:..:..\) br.*,\1,p' | \
+ sed 's,:,-,g'
diff --git a/src/initramfs/tpm/etc/bash.bashrc b/src/initramfs/tpm/etc/bash.bashrc
new file mode 100644
index 00000000..0c0dc200
--- /dev/null
+++ b/src/initramfs/tpm/etc/bash.bashrc
@@ -0,0 +1,3 @@
+[ -z "$PS1" ] && return
+
+PS1="(\h):\w# "
diff --git a/src/initramfs/tpm/etc/hosts b/src/initramfs/tpm/etc/hosts
new file mode 100644
index 00000000..35337c24
--- /dev/null
+++ b/src/initramfs/tpm/etc/hosts
@@ -0,0 +1,3 @@
+# needed for tpm stuff ...
+127.0.0.1 localhost
+::1 localhost ipv6-localhost ipv6-loopback
diff --git a/src/initramfs/tpm/etc/inputrc b/src/initramfs/tpm/etc/inputrc
new file mode 100644
index 00000000..ac81a394
--- /dev/null
+++ b/src/initramfs/tpm/etc/inputrc
@@ -0,0 +1 @@
+set bell-style none
diff --git a/src/initramfs/tpm/etc/ld.so.preload b/src/initramfs/tpm/etc/ld.so.preload
new file mode 100644
index 00000000..a59b3240
--- /dev/null
+++ b/src/initramfs/tpm/etc/ld.so.preload
@@ -0,0 +1 @@
+/usr/local/share/tpm/lib/libcrypto.so.0.9.8
diff --git a/src/initramfs/tpm/etc/libdeps b/src/initramfs/tpm/etc/libdeps
new file mode 100644
index 00000000..9dae75e3
--- /dev/null
+++ b/src/initramfs/tpm/etc/libdeps
@@ -0,0 +1,34 @@
+# whitespace-separated list containing libraries
+# that are required for some binaries to work...
+
+# tcsd requires libgcc_s, otherwise it exits after the
+# first connection socket is closed
+lib/libgcc_s.so.1
+
+# nss is required to connect to local and remote services:
+lib/libnss_compat.so.2
+lib/libnss_files.so.2
+
+################ deprecated ################
+# slxldd resolves the dependencies below...
+### lib/libpthread.so.0
+
+# tcsd:
+### lib/libdl.so.2
+### lib/libz.so.1
+
+# ssh/scp:
+### lib/libresolv.so.2
+### lib/libutil.so.1
+### lib/libnsl.so.1
+### lib/libcrypt.so.1
+### usr/lib/libopensc.so.2
+### usr/lib/libgssapi_krb5.so.2
+### usr/lib/libkrb5.so.3
+### usr/lib/libk5crypto.so.3
+### usr/lib/libscconf.so.2
+### usr/lib/libssl.so.0.9.8
+### usr/lib/libopenct.so.1
+### usr/lib/libpcsclite.so.1
+### usr/lib/libltdl.so.3
+### usr/lib/libkrb5support.so.0
diff --git a/src/initramfs/tpm/etc/passwd b/src/initramfs/tpm/etc/passwd
new file mode 100644
index 00000000..644c98f1
--- /dev/null
+++ b/src/initramfs/tpm/etc/passwd
@@ -0,0 +1,5 @@
+root:x:0:0:root:/root:/bin/bash
+bin:x:1:1:bin:/bin:/bin/bash
+daemon:x:2:2:Daemon:/sbin:/bin/bash
+tss:x:111:112:Trusted Software Stack:/var/lib/tpm/:/bin/false
+nobody:x:65534:65533:nobody:/var/lib/nobody:/bin/bash
diff --git a/src/initramfs/tpm/var/lib/tpm/system.data b/src/initramfs/tpm/var/lib/tpm/system.data
new file mode 100644
index 00000000..ad10a1cd
--- /dev/null
+++ b/src/initramfs/tpm/var/lib/tpm/system.data
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/bin/ash b/src/initramfs/uclib-rootfs.old/bin/ash
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/ash
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/busybox b/src/initramfs/uclib-rootfs.old/bin/busybox
new file mode 100755
index 00000000..8a9e390b
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/busybox
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/bin/cat b/src/initramfs/uclib-rootfs.old/bin/cat
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/cat
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/chgrp b/src/initramfs/uclib-rootfs.old/bin/chgrp
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/chgrp
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/chmod b/src/initramfs/uclib-rootfs.old/bin/chmod
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/chmod
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/chown b/src/initramfs/uclib-rootfs.old/bin/chown
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/chown
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/cp b/src/initramfs/uclib-rootfs.old/bin/cp
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/cp
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/cpio b/src/initramfs/uclib-rootfs.old/bin/cpio
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/cpio
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/cttyhack b/src/initramfs/uclib-rootfs.old/bin/cttyhack
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/cttyhack
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/date b/src/initramfs/uclib-rootfs.old/bin/date
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/date
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/dd b/src/initramfs/uclib-rootfs.old/bin/dd
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/dd
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/df b/src/initramfs/uclib-rootfs.old/bin/df
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/df
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/dmesg b/src/initramfs/uclib-rootfs.old/bin/dmesg
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/dmesg
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/echo b/src/initramfs/uclib-rootfs.old/bin/echo
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/echo
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/egrep b/src/initramfs/uclib-rootfs.old/bin/egrep
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/egrep
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/false b/src/initramfs/uclib-rootfs.old/bin/false
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/false
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/grep b/src/initramfs/uclib-rootfs.old/bin/grep
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/grep
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/gunzip b/src/initramfs/uclib-rootfs.old/bin/gunzip
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/gunzip
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/gzip b/src/initramfs/uclib-rootfs.old/bin/gzip
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/gzip
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/ip b/src/initramfs/uclib-rootfs.old/bin/ip
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/ip
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/ipcalc b/src/initramfs/uclib-rootfs.old/bin/ipcalc
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/ipcalc
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/kill b/src/initramfs/uclib-rootfs.old/bin/kill
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/kill
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/ldconfig b/src/initramfs/uclib-rootfs.old/bin/ldconfig
new file mode 100755
index 00000000..71ea4b7c
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/ldconfig
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/bin/ln b/src/initramfs/uclib-rootfs.old/bin/ln
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/ln
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/ls b/src/initramfs/uclib-rootfs.old/bin/ls
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/ls
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/mkdir b/src/initramfs/uclib-rootfs.old/bin/mkdir
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/mkdir
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/mknod b/src/initramfs/uclib-rootfs.old/bin/mknod
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/mknod
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/mount b/src/initramfs/uclib-rootfs.old/bin/mount
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/mount
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/mv b/src/initramfs/uclib-rootfs.old/bin/mv
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/mv
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/nice b/src/initramfs/uclib-rootfs.old/bin/nice
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/nice
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/pidof b/src/initramfs/uclib-rootfs.old/bin/pidof
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/pidof
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/ping b/src/initramfs/uclib-rootfs.old/bin/ping
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/ping
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/ps b/src/initramfs/uclib-rootfs.old/bin/ps
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/ps
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/pwd b/src/initramfs/uclib-rootfs.old/bin/pwd
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/pwd
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/rm b/src/initramfs/uclib-rootfs.old/bin/rm
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/rm
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/sed b/src/initramfs/uclib-rootfs.old/bin/sed
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/sed
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/sh b/src/initramfs/uclib-rootfs.old/bin/sh
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/sh
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/sleep b/src/initramfs/uclib-rootfs.old/bin/sleep
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/sleep
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/sync b/src/initramfs/uclib-rootfs.old/bin/sync
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/sync
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/tar b/src/initramfs/uclib-rootfs.old/bin/tar
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/tar
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/touch b/src/initramfs/uclib-rootfs.old/bin/touch
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/touch
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/true b/src/initramfs/uclib-rootfs.old/bin/true
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/true
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/umount b/src/initramfs/uclib-rootfs.old/bin/umount
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/umount
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/uname b/src/initramfs/uclib-rootfs.old/bin/uname
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/uname
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/usleep b/src/initramfs/uclib-rootfs.old/bin/usleep
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/usleep
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/vi b/src/initramfs/uclib-rootfs.old/bin/vi
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/vi
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/bin/zcat b/src/initramfs/uclib-rootfs.old/bin/zcat
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/bin/zcat
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/etc/ld.so.cache b/src/initramfs/uclib-rootfs.old/etc/ld.so.cache
new file mode 100644
index 00000000..eb53c2b9
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/etc/ld.so.cache
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/etc/terminfo/a/ansi b/src/initramfs/uclib-rootfs.old/etc/terminfo/a/ansi
new file mode 100644
index 00000000..52e58b23
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/etc/terminfo/a/ansi
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/etc/terminfo/d/dumb b/src/initramfs/uclib-rootfs.old/etc/terminfo/d/dumb
new file mode 100644
index 00000000..fd4091a9
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/etc/terminfo/d/dumb
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/etc/terminfo/l/linux b/src/initramfs/uclib-rootfs.old/etc/terminfo/l/linux
new file mode 100644
index 00000000..2c3ceb70
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/etc/terminfo/l/linux
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/etc/terminfo/r/rxvt b/src/initramfs/uclib-rootfs.old/etc/terminfo/r/rxvt
new file mode 100644
index 00000000..1e81ea1f
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/etc/terminfo/r/rxvt
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/etc/terminfo/s/screen b/src/initramfs/uclib-rootfs.old/etc/terminfo/s/screen
new file mode 100644
index 00000000..142b54a6
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/etc/terminfo/s/screen
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/etc/terminfo/s/sun b/src/initramfs/uclib-rootfs.old/etc/terminfo/s/sun
new file mode 100644
index 00000000..1976f973
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/etc/terminfo/s/sun
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/etc/terminfo/v/vt100 b/src/initramfs/uclib-rootfs.old/etc/terminfo/v/vt100
new file mode 100644
index 00000000..1a7176dd
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/etc/terminfo/v/vt100
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/etc/terminfo/v/vt102 b/src/initramfs/uclib-rootfs.old/etc/terminfo/v/vt102
new file mode 100644
index 00000000..b9a393c5
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/etc/terminfo/v/vt102
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/etc/terminfo/v/vt200 b/src/initramfs/uclib-rootfs.old/etc/terminfo/v/vt200
new file mode 120000
index 00000000..5f37425d
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/etc/terminfo/v/vt200
@@ -0,0 +1 @@
+../v/vt220 \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/etc/terminfo/v/vt220 b/src/initramfs/uclib-rootfs.old/etc/terminfo/v/vt220
new file mode 100644
index 00000000..b3d4d9fb
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/etc/terminfo/v/vt220
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/etc/terminfo/v/vt52 b/src/initramfs/uclib-rootfs.old/etc/terminfo/v/vt52
new file mode 100644
index 00000000..b3f466f2
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/etc/terminfo/v/vt52
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/etc/terminfo/x/xterm b/src/initramfs/uclib-rootfs.old/etc/terminfo/x/xterm
new file mode 100644
index 00000000..a626ac94
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/etc/terminfo/x/xterm
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/etc/terminfo/x/xterm-color b/src/initramfs/uclib-rootfs.old/etc/terminfo/x/xterm-color
new file mode 100644
index 00000000..10bf2e1a
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/etc/terminfo/x/xterm-color
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/etc/terminfo/x/xterm-xfree86 b/src/initramfs/uclib-rootfs.old/etc/terminfo/x/xterm-xfree86
new file mode 100644
index 00000000..f5f9c2d3
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/etc/terminfo/x/xterm-xfree86
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/lib/ld-uClibc-0.9.30.1.so b/src/initramfs/uclib-rootfs.old/lib/ld-uClibc-0.9.30.1.so
new file mode 100755
index 00000000..51a8fc4b
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/lib/ld-uClibc-0.9.30.1.so
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/lib/ld-uClibc.so.0 b/src/initramfs/uclib-rootfs.old/lib/ld-uClibc.so.0
new file mode 120000
index 00000000..3dc0074e
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/lib/ld-uClibc.so.0
@@ -0,0 +1 @@
+ld-uClibc-0.9.30.1.so \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/lib/libc.so.0 b/src/initramfs/uclib-rootfs.old/lib/libc.so.0
new file mode 120000
index 00000000..7ea3dfa2
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/lib/libc.so.0
@@ -0,0 +1 @@
+libuClibc-0.9.30.1.so \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/lib/libcrypt-0.9.30.1.so b/src/initramfs/uclib-rootfs.old/lib/libcrypt-0.9.30.1.so
new file mode 100755
index 00000000..e5c3d405
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/lib/libcrypt-0.9.30.1.so
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/lib/libcrypt.so.0 b/src/initramfs/uclib-rootfs.old/lib/libcrypt.so.0
new file mode 120000
index 00000000..efbe4755
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/lib/libcrypt.so.0
@@ -0,0 +1 @@
+libcrypt-0.9.30.1.so \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/lib/libdl-0.9.30.1.so b/src/initramfs/uclib-rootfs.old/lib/libdl-0.9.30.1.so
new file mode 100755
index 00000000..3a4c5784
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/lib/libdl-0.9.30.1.so
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/lib/libdl.so.0 b/src/initramfs/uclib-rootfs.old/lib/libdl.so.0
new file mode 120000
index 00000000..94f8b370
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/lib/libdl.so.0
@@ -0,0 +1 @@
+libdl-0.9.30.1.so \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/lib/libm-0.9.30.1.so b/src/initramfs/uclib-rootfs.old/lib/libm-0.9.30.1.so
new file mode 100755
index 00000000..18b0eaf4
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/lib/libm-0.9.30.1.so
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/lib/libm.so.0 b/src/initramfs/uclib-rootfs.old/lib/libm.so.0
new file mode 120000
index 00000000..7c83f175
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/lib/libm.so.0
@@ -0,0 +1 @@
+libm-0.9.30.1.so \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/lib/libnsl-0.9.30.1.so b/src/initramfs/uclib-rootfs.old/lib/libnsl-0.9.30.1.so
new file mode 100755
index 00000000..d10310dd
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/lib/libnsl-0.9.30.1.so
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/lib/libnsl.so.0 b/src/initramfs/uclib-rootfs.old/lib/libnsl.so.0
new file mode 120000
index 00000000..06a67360
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/lib/libnsl.so.0
@@ -0,0 +1 @@
+libnsl-0.9.30.1.so \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/lib/libpthread-0.9.30.1.so b/src/initramfs/uclib-rootfs.old/lib/libpthread-0.9.30.1.so
new file mode 100755
index 00000000..34953439
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/lib/libpthread-0.9.30.1.so
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/lib/libpthread.so.0 b/src/initramfs/uclib-rootfs.old/lib/libpthread.so.0
new file mode 120000
index 00000000..6e3f5a3d
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/lib/libpthread.so.0
@@ -0,0 +1 @@
+libpthread-0.9.30.1.so \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/lib/libresolv-0.9.30.1.so b/src/initramfs/uclib-rootfs.old/lib/libresolv-0.9.30.1.so
new file mode 100755
index 00000000..42f2dda0
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/lib/libresolv-0.9.30.1.so
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/lib/libresolv.so.0 b/src/initramfs/uclib-rootfs.old/lib/libresolv.so.0
new file mode 120000
index 00000000..5fbd926b
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/lib/libresolv.so.0
@@ -0,0 +1 @@
+libresolv-0.9.30.1.so \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/lib/librt-0.9.30.1.so b/src/initramfs/uclib-rootfs.old/lib/librt-0.9.30.1.so
new file mode 100755
index 00000000..6595380e
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/lib/librt-0.9.30.1.so
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/lib/librt.so.0 b/src/initramfs/uclib-rootfs.old/lib/librt.so.0
new file mode 120000
index 00000000..f61c6e12
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/lib/librt.so.0
@@ -0,0 +1 @@
+librt-0.9.30.1.so \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/lib/libthread_db-0.9.30.1.so b/src/initramfs/uclib-rootfs.old/lib/libthread_db-0.9.30.1.so
new file mode 100755
index 00000000..2946dac7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/lib/libthread_db-0.9.30.1.so
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/lib/libthread_db.so.1 b/src/initramfs/uclib-rootfs.old/lib/libthread_db.so.1
new file mode 120000
index 00000000..30ee3cef
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/lib/libthread_db.so.1
@@ -0,0 +1 @@
+libthread_db-0.9.30.1.so \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/lib/libuClibc-0.9.30.1.so b/src/initramfs/uclib-rootfs.old/lib/libuClibc-0.9.30.1.so
new file mode 100755
index 00000000..0300bb7c
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/lib/libuClibc-0.9.30.1.so
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/lib/libutil-0.9.30.1.so b/src/initramfs/uclib-rootfs.old/lib/libutil-0.9.30.1.so
new file mode 100755
index 00000000..b1c68245
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/lib/libutil-0.9.30.1.so
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/lib/libutil.so.0 b/src/initramfs/uclib-rootfs.old/lib/libutil.so.0
new file mode 120000
index 00000000..c7d6d48b
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/lib/libutil.so.0
@@ -0,0 +1 @@
+libutil-0.9.30.1.so \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/lib/libz.so b/src/initramfs/uclib-rootfs.old/lib/libz.so
new file mode 120000
index 00000000..c52c0288
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/lib/libz.so
@@ -0,0 +1 @@
+libz.so.1.2.3 \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/lib/libz.so.1 b/src/initramfs/uclib-rootfs.old/lib/libz.so.1
new file mode 120000
index 00000000..c52c0288
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/lib/libz.so.1
@@ -0,0 +1 @@
+libz.so.1.2.3 \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/lib/libz.so.1.2.3 b/src/initramfs/uclib-rootfs.old/lib/libz.so.1.2.3
new file mode 100755
index 00000000..1b2329fb
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/lib/libz.so.1.2.3
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/sbin/dnbd-client b/src/initramfs/uclib-rootfs.old/sbin/dnbd-client
new file mode 100755
index 00000000..4d1f4b2c
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/dnbd-client
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/sbin/fbsplash b/src/initramfs/uclib-rootfs.old/sbin/fbsplash
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/fbsplash
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/fdisk b/src/initramfs/uclib-rootfs.old/sbin/fdisk
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/fdisk
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/getty b/src/initramfs/uclib-rootfs.old/sbin/getty
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/getty
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/halt b/src/initramfs/uclib-rootfs.old/sbin/halt
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/halt
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/hdparm b/src/initramfs/uclib-rootfs.old/sbin/hdparm
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/hdparm
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/hwclock b/src/initramfs/uclib-rootfs.old/sbin/hwclock
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/hwclock
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/ifrename b/src/initramfs/uclib-rootfs.old/sbin/ifrename
new file mode 100755
index 00000000..015f7a4c
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/ifrename
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/sbin/inotifyd b/src/initramfs/uclib-rootfs.old/sbin/inotifyd
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/inotifyd
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/insmod b/src/initramfs/uclib-rootfs.old/sbin/insmod
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/insmod
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/klogd b/src/initramfs/uclib-rootfs.old/sbin/klogd
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/klogd
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/loadkmap b/src/initramfs/uclib-rootfs.old/sbin/loadkmap
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/loadkmap
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/logread b/src/initramfs/uclib-rootfs.old/sbin/logread
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/logread
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/lsmod b/src/initramfs/uclib-rootfs.old/sbin/lsmod
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/lsmod
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/mdev b/src/initramfs/uclib-rootfs.old/sbin/mdev
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/mdev
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/mkdosfs b/src/initramfs/uclib-rootfs.old/sbin/mkdosfs
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/mkdosfs
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/mkfs.vfat b/src/initramfs/uclib-rootfs.old/sbin/mkfs.vfat
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/mkfs.vfat
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/mkswap b/src/initramfs/uclib-rootfs.old/sbin/mkswap
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/mkswap
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/modprobe b/src/initramfs/uclib-rootfs.old/sbin/modprobe
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/modprobe
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/nbd-client b/src/initramfs/uclib-rootfs.old/sbin/nbd-client
new file mode 100755
index 00000000..c22cb4b7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/nbd-client
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/sbin/poweroff b/src/initramfs/uclib-rootfs.old/sbin/poweroff
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/poweroff
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/reboot b/src/initramfs/uclib-rootfs.old/sbin/reboot
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/reboot
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/rmmod b/src/initramfs/uclib-rootfs.old/sbin/rmmod
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/rmmod
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/route b/src/initramfs/uclib-rootfs.old/sbin/route
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/route
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/start-stop-daemon b/src/initramfs/uclib-rootfs.old/sbin/start-stop-daemon
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/start-stop-daemon
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/swapoff b/src/initramfs/uclib-rootfs.old/sbin/swapoff
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/swapoff
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/swapon b/src/initramfs/uclib-rootfs.old/sbin/swapon
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/swapon
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/switch_root b/src/initramfs/uclib-rootfs.old/sbin/switch_root
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/switch_root
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/sysctl b/src/initramfs/uclib-rootfs.old/sbin/sysctl
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/sysctl
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/syslogd b/src/initramfs/uclib-rootfs.old/sbin/syslogd
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/syslogd
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/tunctl b/src/initramfs/uclib-rootfs.old/sbin/tunctl
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/tunctl
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/udhcpc b/src/initramfs/uclib-rootfs.old/sbin/udhcpc
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/udhcpc
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/vconfig b/src/initramfs/uclib-rootfs.old/sbin/vconfig
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/vconfig
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/watchdog b/src/initramfs/uclib-rootfs.old/sbin/watchdog
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/watchdog
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/sbin/zcip b/src/initramfs/uclib-rootfs.old/sbin/zcip
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/sbin/zcip
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/[ b/src/initramfs/uclib-rootfs.old/usr/bin/[
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/[
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/[[ b/src/initramfs/uclib-rootfs.old/usr/bin/[[
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/[[
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/ar b/src/initramfs/uclib-rootfs.old/usr/bin/ar
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/ar
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/arping b/src/initramfs/uclib-rootfs.old/usr/bin/arping
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/arping
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/awk b/src/initramfs/uclib-rootfs.old/usr/bin/awk
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/awk
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/basename b/src/initramfs/uclib-rootfs.old/usr/bin/basename
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/basename
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/bunzip2 b/src/initramfs/uclib-rootfs.old/usr/bin/bunzip2
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/bunzip2
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/bzcat b/src/initramfs/uclib-rootfs.old/usr/bin/bzcat
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/bzcat
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/bzip2 b/src/initramfs/uclib-rootfs.old/usr/bin/bzip2
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/bzip2
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/chvt b/src/initramfs/uclib-rootfs.old/usr/bin/chvt
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/chvt
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/cut b/src/initramfs/uclib-rootfs.old/usr/bin/cut
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/cut
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/deallocvt b/src/initramfs/uclib-rootfs.old/usr/bin/deallocvt
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/deallocvt
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/du b/src/initramfs/uclib-rootfs.old/usr/bin/du
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/du
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/eject b/src/initramfs/uclib-rootfs.old/usr/bin/eject
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/eject
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/env b/src/initramfs/uclib-rootfs.old/usr/bin/env
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/env
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/expr b/src/initramfs/uclib-rootfs.old/usr/bin/expr
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/expr
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/find b/src/initramfs/uclib-rootfs.old/usr/bin/find
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/find
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/free b/src/initramfs/uclib-rootfs.old/usr/bin/free
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/free
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/ftpget b/src/initramfs/uclib-rootfs.old/usr/bin/ftpget
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/ftpget
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/ftpput b/src/initramfs/uclib-rootfs.old/usr/bin/ftpput
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/ftpput
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/getent b/src/initramfs/uclib-rootfs.old/usr/bin/getent
new file mode 100755
index 00000000..30d515b7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/getent
@@ -0,0 +1,43 @@
+#!/bin/sh
+# $Header: /var/cvs/uClibc/extra/scripts/getent,v 1.2 2005/02/02 14:18:01 solar Exp $
+#
+# Closely (not perfectly) emulate the behavior of glibc's getent utility
+#
+#passwd|shadow|group|aliases|hosts|networks|ethers|netgroup|protocols|services|rpc
+# only returns the first match (by design)
+# dns based search is not supported (hosts,networks)
+# case-insensitive matches not supported (ethers; others?)
+# may return false-positives (hosts,protocols,rpc,services,ethers)
+
+export PATH="${PATH}:/bin:/usr/bin"
+
+file="/etc/$1"
+case $1 in
+ passwd|group)
+ match="^$2:\|^[^:]*:[^:]*:$2:" ;;
+ shadow)
+ match="^$2:" ;;
+ networks|netgroup)
+ match="^[[:space:]]*$2\>" ;;
+ hosts|protocols|rpc|services|ethers)
+ match="\<$2\>" ;;
+ aliases)
+ match="^[[:space:]]*$2[[:space:]]*:" ;;
+ ""|-h|--help)
+ echo "USAGE: $0 database [key]"
+ exit 0 ;;
+ *)
+ echo "$0: Unknown database: $1" 1>&2
+ exit 1 ;;
+esac
+
+if [ ! -f "$file" ] ; then
+ echo "$0: Could not find database file for $1" 1>&2
+ exit 1
+fi
+
+if [ $# -eq 1 ] ; then
+ exec cat "$file"
+else
+ sed "s/#.*//; /$match/q; d" "$file" | grep . || exit 2
+fi
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/head b/src/initramfs/uclib-rootfs.old/usr/bin/head
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/head
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/id b/src/initramfs/uclib-rootfs.old/usr/bin/id
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/id
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/killall b/src/initramfs/uclib-rootfs.old/usr/bin/killall
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/killall
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/ldd b/src/initramfs/uclib-rootfs.old/usr/bin/ldd
new file mode 100755
index 00000000..f018ad28
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/ldd
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/less b/src/initramfs/uclib-rootfs.old/usr/bin/less
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/less
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/logger b/src/initramfs/uclib-rootfs.old/usr/bin/logger
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/logger
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/lzmacat b/src/initramfs/uclib-rootfs.old/usr/bin/lzmacat
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/lzmacat
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/md5sum b/src/initramfs/uclib-rootfs.old/usr/bin/md5sum
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/md5sum
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/nc b/src/initramfs/uclib-rootfs.old/usr/bin/nc
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/nc
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/ncurses5-config b/src/initramfs/uclib-rootfs.old/usr/bin/ncurses5-config
new file mode 100755
index 00000000..bef48cd7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/ncurses5-config
@@ -0,0 +1,156 @@
+#!/bin/sh
+# $Id: ncurses-config.in,v 1.11 2006/10/28 20:22:52 tom Exp $
+##############################################################################
+# Copyright (c) 2006 Free Software Foundation, Inc. #
+# #
+# Permission is hereby granted, free of charge, to any person obtaining a #
+# copy of this software and associated documentation files (the "Software"), #
+# to deal in the Software without restriction, including without limitation #
+# the rights to use, copy, modify, merge, publish, distribute, distribute #
+# with modifications, sublicense, and/or sell copies of the Software, and to #
+# permit persons to whom the Software is furnished to do so, subject to the #
+# following conditions: #
+# #
+# The above copyright notice and this permission notice shall be included in #
+# all copies or substantial portions of the Software. #
+# #
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, #
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL #
+# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER #
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING #
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER #
+# DEALINGS IN THE SOFTWARE. #
+# #
+# Except as contained in this notice, the name(s) of the above copyright #
+# holders shall not be used in advertising or otherwise to promote the sale, #
+# use or other dealings in this Software without prior written #
+# authorization. #
+##############################################################################
+#
+# Author: Thomas E. Dickey, 2006
+
+prefix="/usr"
+exec_prefix="${prefix}"
+
+bindir="${exec_prefix}/bin"
+libdir="/lib"
+datadir="/usr/share"
+mandir="/usr/share/man"
+
+THIS="ncurses"
+
+test $# = 0 && exec /bin/sh $0 --error
+
+while test $# -gt 0; do
+ case "$1" in
+ -*=*)
+ ARG=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'`
+ ;;
+ *)
+ ARG=
+ ;;
+ esac
+
+ case "$1" in
+ # basic configuration
+ --prefix=*)
+ prefix="$ARG"
+ test -z "$exec_prefix" && exec_prefix="$ARG"
+ ;;
+ --prefix)
+ echo "$prefix"
+ ;;
+ --exec-prefix=*)
+ exec_prefix="$ARG"
+ ;;
+ --exec-prefix)
+ echo "$exec_prefix"
+ ;;
+ # compile/link
+ --cflags)
+ INCS=
+ if test "${prefix}/include" != /usr/include ; then
+ INCS="-I${prefix}/include"
+ fi
+ if test "" != no ; then
+ INCS="$INCS -I${prefix}/include/${THIS}"
+ fi
+ sed -e 's,^[ ]*,,' -e 's, [ ]*, ,g' -e 's,[ ]*$,,' <<-ENDECHO
+ $INCS
+ENDECHO
+ ;;
+ --libs)
+ sed -e 's,^[ ]*,,' -e 's, [ ]*, ,g' -e 's,[ ]*$,,' <<-ENDECHO
+ -L${exec_prefix}/lib -l${THIS}
+ENDECHO
+ ;;
+ # identification
+ --version)
+ echo "5.6.20061217"
+ ;;
+ --abi-version)
+ echo "5"
+ ;;
+ --mouse-version)
+ echo "1"
+ ;;
+ # locations
+ --bindir)
+ echo "${bindir}"
+ ;;
+ --datadir)
+ echo "${datadir}"
+ ;;
+ --libdir)
+ echo "${libdir}"
+ ;;
+ --mandir)
+ echo "${mandir}"
+ ;;
+ --terminfo)
+ echo "/usr/share/terminfo"
+ ;;
+ --terminfo-dirs)
+ echo "/etc/terminfo:/usr/share/terminfo"
+ ;;
+ --termpath)
+ echo ""
+ ;;
+ # general info
+ --help)
+ cat <<ENDHELP
+Usage: ${THIS}-config [options]
+
+Options:
+ --prefix echos the package-prefix of ${THIS}
+ --prefix=ARG sets the package-prefix of ${THIS}
+ --exec-prefix echos the executable-prefix of ${THIS}
+ --exec-prefix=ARG sets the executable-prefix of ${THIS}
+
+ --cflags echos the C compiler flags needed to compile with ${THIS}
+ --libs echos the libraries needed to link with ${THIS}
+
+ --version echos the release+patchdate version of ${THIS}
+ --abi-version echos the ABI version of ${THIS}
+ --mouse-version echos the mouse-interface version of ${THIS}
+
+ --bindir echos the directory containing ${THIS} programs
+ --datadir echos the directory containing ${THIS} data
+ --libdir echos the directory containing ${THIS} libraries
+ --mandir echos the directory containing ${THIS} manpages
+ --terminfo echos the \$TERMINFO terminfo database path
+ --terminfo-dirs echos the \$TERMINFO_DIRS directory list
+ --termpath echos the \$TERMPATH termcap list
+
+ --help prints this message
+ENDHELP
+ ;;
+ --error|*)
+ /bin/sh $0 --help 1>&2
+ exit 1
+ ;;
+ esac
+ shift
+done
+# vile:shmode
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/nmeter b/src/initramfs/uclib-rootfs.old/usr/bin/nmeter
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/nmeter
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/openvt b/src/initramfs/uclib-rootfs.old/usr/bin/openvt
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/openvt
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/printf b/src/initramfs/uclib-rootfs.old/usr/bin/printf
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/printf
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/readahead b/src/initramfs/uclib-rootfs.old/usr/bin/readahead
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/readahead
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/readlink b/src/initramfs/uclib-rootfs.old/usr/bin/readlink
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/readlink
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/realpath b/src/initramfs/uclib-rootfs.old/usr/bin/realpath
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/realpath
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/rpm2cpio b/src/initramfs/uclib-rootfs.old/usr/bin/rpm2cpio
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/rpm2cpio
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/sort b/src/initramfs/uclib-rootfs.old/usr/bin/sort
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/sort
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/strace b/src/initramfs/uclib-rootfs.old/usr/bin/strace
new file mode 100755
index 00000000..3aec0598
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/strace
Binary files differ
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/strings b/src/initramfs/uclib-rootfs.old/usr/bin/strings
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/strings
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/tail b/src/initramfs/uclib-rootfs.old/usr/bin/tail
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/tail
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/test b/src/initramfs/uclib-rootfs.old/usr/bin/test
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/test
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/tftp b/src/initramfs/uclib-rootfs.old/usr/bin/tftp
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/tftp
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/time b/src/initramfs/uclib-rootfs.old/usr/bin/time
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/time
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/timeout b/src/initramfs/uclib-rootfs.old/usr/bin/timeout
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/timeout
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/tr b/src/initramfs/uclib-rootfs.old/usr/bin/tr
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/tr
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/uniq b/src/initramfs/uclib-rootfs.old/usr/bin/uniq
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/uniq
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/unlzma b/src/initramfs/uclib-rootfs.old/usr/bin/unlzma
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/unlzma
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/uptime b/src/initramfs/uclib-rootfs.old/usr/bin/uptime
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/uptime
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/wc b/src/initramfs/uclib-rootfs.old/usr/bin/wc
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/wc
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/wget b/src/initramfs/uclib-rootfs.old/usr/bin/wget
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/wget
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/which b/src/initramfs/uclib-rootfs.old/usr/bin/which
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/which
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/whoami b/src/initramfs/uclib-rootfs.old/usr/bin/whoami
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/whoami
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/bin/xargs b/src/initramfs/uclib-rootfs.old/usr/bin/xargs
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/bin/xargs
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/lib/libc.so b/src/initramfs/uclib-rootfs.old/usr/lib/libc.so
new file mode 100755
index 00000000..32a2e3d9
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/lib/libc.so
@@ -0,0 +1,5 @@
+/* GNU ld script
+ * Use the shared library, but some functions are only in
+ * the static library, so try that secondarily. */
+OUTPUT_FORMAT ( elf32-i386 )
+GROUP ( /usr/lib/uclibc_nonshared.a /lib/libc.so.0 AS_NEEDED ( /lib/ld-uClibc.so.0 ) )
diff --git a/src/initramfs/uclib-rootfs.old/usr/lib/libcrypt.so b/src/initramfs/uclib-rootfs.old/usr/lib/libcrypt.so
new file mode 120000
index 00000000..42735716
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/lib/libcrypt.so
@@ -0,0 +1 @@
+../../lib/libcrypt.so.0 \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/lib/libdl.so b/src/initramfs/uclib-rootfs.old/usr/lib/libdl.so
new file mode 120000
index 00000000..f648150a
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/lib/libdl.so
@@ -0,0 +1 @@
+../../lib/libdl.so.0 \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/lib/libm.so b/src/initramfs/uclib-rootfs.old/usr/lib/libm.so
new file mode 120000
index 00000000..8d5c614e
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/lib/libm.so
@@ -0,0 +1 @@
+../../lib/libm.so.0 \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/lib/libnsl.so b/src/initramfs/uclib-rootfs.old/usr/lib/libnsl.so
new file mode 120000
index 00000000..b4a08661
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/lib/libnsl.so
@@ -0,0 +1 @@
+../../lib/libnsl.so.0 \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/lib/libpthread.so b/src/initramfs/uclib-rootfs.old/usr/lib/libpthread.so
new file mode 120000
index 00000000..57f4003c
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/lib/libpthread.so
@@ -0,0 +1 @@
+../../lib/libpthread.so.0 \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/lib/libresolv.so b/src/initramfs/uclib-rootfs.old/usr/lib/libresolv.so
new file mode 120000
index 00000000..f5b11fcd
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/lib/libresolv.so
@@ -0,0 +1 @@
+../../lib/libresolv.so.0 \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/lib/librt.so b/src/initramfs/uclib-rootfs.old/usr/lib/librt.so
new file mode 120000
index 00000000..b7dd09d3
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/lib/librt.so
@@ -0,0 +1 @@
+../../lib/librt.so.0 \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/lib/libthread_db.so b/src/initramfs/uclib-rootfs.old/usr/lib/libthread_db.so
new file mode 120000
index 00000000..e05f68f2
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/lib/libthread_db.so
@@ -0,0 +1 @@
+../../lib/libthread_db.so.1 \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/lib/libutil.so b/src/initramfs/uclib-rootfs.old/usr/lib/libutil.so
new file mode 120000
index 00000000..5b103561
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/lib/libutil.so
@@ -0,0 +1 @@
+../../lib/libutil.so.0 \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/lib/libz.so b/src/initramfs/uclib-rootfs.old/usr/lib/libz.so
new file mode 100755
index 00000000..97779630
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/lib/libz.so
@@ -0,0 +1,11 @@
+/* GNU ld script
+ Since Gentoo has critical dynamic libraries in /lib, and the static versions
+ in /usr/lib, we need to have a "fake" dynamic lib in /usr/lib, otherwise we
+ run into linking problems. This "fake" dynamic lib is a linker script that
+ redirects the linker to the real lib. And yes, this works in the cross-
+ compiling scenario as the sysroot-ed linker will prepend the real path.
+
+ See bug http://bugs.gentoo.org/4411 for more info.
+ */
+OUTPUT_FORMAT ( elf32-i386 )
+GROUP ( /lib/libz.so )
diff --git a/src/initramfs/uclib-rootfs.old/usr/sbin/brctl b/src/initramfs/uclib-rootfs.old/usr/sbin/brctl
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/sbin/brctl
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/sbin/chroot b/src/initramfs/uclib-rootfs.old/usr/sbin/chroot
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/sbin/chroot
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/sbin/fbset b/src/initramfs/uclib-rootfs.old/usr/sbin/fbset
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/sbin/fbset
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/sbin/httpd b/src/initramfs/uclib-rootfs.old/usr/sbin/httpd
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/sbin/httpd
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/sbin/loadfont b/src/initramfs/uclib-rootfs.old/usr/sbin/loadfont
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/sbin/loadfont
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/sbin/rdate b/src/initramfs/uclib-rootfs.old/usr/sbin/rdate
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/sbin/rdate
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/sbin/setlogcons b/src/initramfs/uclib-rootfs.old/usr/sbin/setlogcons
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/sbin/setlogcons
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs.old/usr/sbin/udhcpd b/src/initramfs/uclib-rootfs.old/usr/sbin/udhcpd
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs.old/usr/sbin/udhcpd
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/ash b/src/initramfs/uclib-rootfs/bin/ash
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/ash
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/bash b/src/initramfs/uclib-rootfs/bin/bash
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/bash
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/busybox b/src/initramfs/uclib-rootfs/bin/busybox
new file mode 100755
index 00000000..fa652e7b
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/busybox
Binary files differ
diff --git a/src/initramfs/uclib-rootfs/bin/cat b/src/initramfs/uclib-rootfs/bin/cat
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/cat
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/chgrp b/src/initramfs/uclib-rootfs/bin/chgrp
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/chgrp
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/chmod b/src/initramfs/uclib-rootfs/bin/chmod
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/chmod
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/chown b/src/initramfs/uclib-rootfs/bin/chown
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/chown
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/cp b/src/initramfs/uclib-rootfs/bin/cp
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/cp
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/cpio b/src/initramfs/uclib-rootfs/bin/cpio
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/cpio
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/cttyhack b/src/initramfs/uclib-rootfs/bin/cttyhack
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/cttyhack
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/date b/src/initramfs/uclib-rootfs/bin/date
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/date
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/dd b/src/initramfs/uclib-rootfs/bin/dd
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/dd
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/df b/src/initramfs/uclib-rootfs/bin/df
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/df
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/dmesg b/src/initramfs/uclib-rootfs/bin/dmesg
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/dmesg
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/echo b/src/initramfs/uclib-rootfs/bin/echo
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/echo
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/egrep b/src/initramfs/uclib-rootfs/bin/egrep
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/egrep
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/false b/src/initramfs/uclib-rootfs/bin/false
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/false
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/grep b/src/initramfs/uclib-rootfs/bin/grep
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/grep
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/gunzip b/src/initramfs/uclib-rootfs/bin/gunzip
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/gunzip
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/gzip b/src/initramfs/uclib-rootfs/bin/gzip
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/gzip
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/ip b/src/initramfs/uclib-rootfs/bin/ip
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/ip
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/ipcalc b/src/initramfs/uclib-rootfs/bin/ipcalc
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/ipcalc
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/kill b/src/initramfs/uclib-rootfs/bin/kill
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/kill
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/ln b/src/initramfs/uclib-rootfs/bin/ln
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/ln
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/ls b/src/initramfs/uclib-rootfs/bin/ls
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/ls
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/mkdir b/src/initramfs/uclib-rootfs/bin/mkdir
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/mkdir
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/mknod b/src/initramfs/uclib-rootfs/bin/mknod
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/mknod
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/mount b/src/initramfs/uclib-rootfs/bin/mount
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/mount
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/mv b/src/initramfs/uclib-rootfs/bin/mv
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/mv
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/nice b/src/initramfs/uclib-rootfs/bin/nice
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/nice
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/pidof b/src/initramfs/uclib-rootfs/bin/pidof
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/pidof
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/ping b/src/initramfs/uclib-rootfs/bin/ping
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/ping
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/ps b/src/initramfs/uclib-rootfs/bin/ps
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/ps
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/pwd b/src/initramfs/uclib-rootfs/bin/pwd
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/pwd
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/rev b/src/initramfs/uclib-rootfs/bin/rev
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/rev
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/rm b/src/initramfs/uclib-rootfs/bin/rm
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/rm
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/sed b/src/initramfs/uclib-rootfs/bin/sed
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/sed
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/sh b/src/initramfs/uclib-rootfs/bin/sh
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/sh
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/sleep b/src/initramfs/uclib-rootfs/bin/sleep
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/sleep
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/sync b/src/initramfs/uclib-rootfs/bin/sync
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/sync
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/tar b/src/initramfs/uclib-rootfs/bin/tar
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/tar
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/touch b/src/initramfs/uclib-rootfs/bin/touch
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/touch
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/true b/src/initramfs/uclib-rootfs/bin/true
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/true
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/umount b/src/initramfs/uclib-rootfs/bin/umount
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/umount
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/uname b/src/initramfs/uclib-rootfs/bin/uname
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/uname
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/usleep b/src/initramfs/uclib-rootfs/bin/usleep
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/usleep
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/vi b/src/initramfs/uclib-rootfs/bin/vi
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/vi
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/bin/zcat b/src/initramfs/uclib-rootfs/bin/zcat
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/bin/zcat
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/lib/ld-2.11.2.so b/src/initramfs/uclib-rootfs/lib/ld-2.11.2.so
new file mode 100755
index 00000000..fecb3a46
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/lib/ld-2.11.2.so
Binary files differ
diff --git a/src/initramfs/uclib-rootfs/lib/ld-linux.so.2 b/src/initramfs/uclib-rootfs/lib/ld-linux.so.2
new file mode 120000
index 00000000..e1654955
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/lib/ld-linux.so.2
@@ -0,0 +1 @@
+ld-2.11.2.so \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/lib/libc.so.6 b/src/initramfs/uclib-rootfs/lib/libc.so.6
new file mode 100644
index 00000000..bfd7ef5d
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/lib/libc.so.6
Binary files differ
diff --git a/src/initramfs/uclib-rootfs/lib/libdbus-1.so.3 b/src/initramfs/uclib-rootfs/lib/libdbus-1.so.3
new file mode 100644
index 00000000..526f06dc
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/lib/libdbus-1.so.3
Binary files differ
diff --git a/src/initramfs/uclib-rootfs/lib/libdl.so.2 b/src/initramfs/uclib-rootfs/lib/libdl.so.2
new file mode 100644
index 00000000..b7d6dacc
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/lib/libdl.so.2
Binary files differ
diff --git a/src/initramfs/uclib-rootfs/lib/libhal.so.1 b/src/initramfs/uclib-rootfs/lib/libhal.so.1
new file mode 100644
index 00000000..8db463f0
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/lib/libhal.so.1
Binary files differ
diff --git a/src/initramfs/uclib-rootfs/lib/libm.so.6 b/src/initramfs/uclib-rootfs/lib/libm.so.6
new file mode 100644
index 00000000..0e557bfe
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/lib/libm.so.6
Binary files differ
diff --git a/src/initramfs/uclib-rootfs/lib/libpthread.so.0 b/src/initramfs/uclib-rootfs/lib/libpthread.so.0
new file mode 100755
index 00000000..55de7d33
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/lib/libpthread.so.0
Binary files differ
diff --git a/src/initramfs/uclib-rootfs/lib/librt.so.1 b/src/initramfs/uclib-rootfs/lib/librt.so.1
new file mode 100644
index 00000000..fbea0db1
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/lib/librt.so.1
Binary files differ
diff --git a/src/initramfs/uclib-rootfs/sbin/bootchartd b/src/initramfs/uclib-rootfs/sbin/bootchartd
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/bootchartd
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/fbsplash b/src/initramfs/uclib-rootfs/sbin/fbsplash
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/fbsplash
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/fdisk b/src/initramfs/uclib-rootfs/sbin/fdisk
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/fdisk
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/getty b/src/initramfs/uclib-rootfs/sbin/getty
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/getty
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/halt b/src/initramfs/uclib-rootfs/sbin/halt
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/halt
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/hdparm b/src/initramfs/uclib-rootfs/sbin/hdparm
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/hdparm
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/hwclock b/src/initramfs/uclib-rootfs/sbin/hwclock
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/hwclock
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/inotifyd b/src/initramfs/uclib-rootfs/sbin/inotifyd
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/inotifyd
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/insmod b/src/initramfs/uclib-rootfs/sbin/insmod
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/insmod
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/klogd b/src/initramfs/uclib-rootfs/sbin/klogd
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/klogd
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/ldconfig b/src/initramfs/uclib-rootfs/sbin/ldconfig
new file mode 100755
index 00000000..74da4189
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/ldconfig
Binary files differ
diff --git a/src/initramfs/uclib-rootfs/sbin/loadkmap b/src/initramfs/uclib-rootfs/sbin/loadkmap
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/loadkmap
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/logread b/src/initramfs/uclib-rootfs/sbin/logread
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/logread
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/lsmod b/src/initramfs/uclib-rootfs/sbin/lsmod
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/lsmod
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/lspci b/src/initramfs/uclib-rootfs/sbin/lspci
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/lspci
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/lsusb b/src/initramfs/uclib-rootfs/sbin/lsusb
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/lsusb
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/mdev b/src/initramfs/uclib-rootfs/sbin/mdev
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/mdev
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/mkdosfs b/src/initramfs/uclib-rootfs/sbin/mkdosfs
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/mkdosfs
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/mkfs.vfat b/src/initramfs/uclib-rootfs/sbin/mkfs.vfat
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/mkfs.vfat
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/mkswap b/src/initramfs/uclib-rootfs/sbin/mkswap
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/mkswap
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/modinfo b/src/initramfs/uclib-rootfs/sbin/modinfo
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/modinfo
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/modprobe b/src/initramfs/uclib-rootfs/sbin/modprobe
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/modprobe
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/poweroff b/src/initramfs/uclib-rootfs/sbin/poweroff
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/poweroff
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/reboot b/src/initramfs/uclib-rootfs/sbin/reboot
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/reboot
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/rmmod b/src/initramfs/uclib-rootfs/sbin/rmmod
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/rmmod
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/route b/src/initramfs/uclib-rootfs/sbin/route
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/route
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/start-stop-daemon b/src/initramfs/uclib-rootfs/sbin/start-stop-daemon
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/start-stop-daemon
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/swapoff b/src/initramfs/uclib-rootfs/sbin/swapoff
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/swapoff
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/swapon b/src/initramfs/uclib-rootfs/sbin/swapon
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/swapon
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/switch_root b/src/initramfs/uclib-rootfs/sbin/switch_root
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/switch_root
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/sysctl b/src/initramfs/uclib-rootfs/sbin/sysctl
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/sysctl
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/syslogd b/src/initramfs/uclib-rootfs/sbin/syslogd
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/syslogd
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/tunctl b/src/initramfs/uclib-rootfs/sbin/tunctl
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/tunctl
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/udhcpc b/src/initramfs/uclib-rootfs/sbin/udhcpc
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/udhcpc
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/vconfig b/src/initramfs/uclib-rootfs/sbin/vconfig
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/vconfig
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/watchdog b/src/initramfs/uclib-rootfs/sbin/watchdog
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/watchdog
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/sbin/zcip b/src/initramfs/uclib-rootfs/sbin/zcip
new file mode 120000
index 00000000..71259713
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/sbin/zcip
@@ -0,0 +1 @@
+../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/[ b/src/initramfs/uclib-rootfs/usr/bin/[
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/[
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/[[ b/src/initramfs/uclib-rootfs/usr/bin/[[
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/[[
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/ar b/src/initramfs/uclib-rootfs/usr/bin/ar
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/ar
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/arping b/src/initramfs/uclib-rootfs/usr/bin/arping
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/arping
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/awk b/src/initramfs/uclib-rootfs/usr/bin/awk
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/awk
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/basename b/src/initramfs/uclib-rootfs/usr/bin/basename
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/basename
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/bunzip2 b/src/initramfs/uclib-rootfs/usr/bin/bunzip2
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/bunzip2
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/bzcat b/src/initramfs/uclib-rootfs/usr/bin/bzcat
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/bzcat
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/bzip2 b/src/initramfs/uclib-rootfs/usr/bin/bzip2
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/bzip2
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/chvt b/src/initramfs/uclib-rootfs/usr/bin/chvt
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/chvt
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/cut b/src/initramfs/uclib-rootfs/usr/bin/cut
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/cut
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/deallocvt b/src/initramfs/uclib-rootfs/usr/bin/deallocvt
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/deallocvt
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/du b/src/initramfs/uclib-rootfs/usr/bin/du
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/du
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/dumpleases b/src/initramfs/uclib-rootfs/usr/bin/dumpleases
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/dumpleases
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/eject b/src/initramfs/uclib-rootfs/usr/bin/eject
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/eject
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/env b/src/initramfs/uclib-rootfs/usr/bin/env
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/env
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/expr b/src/initramfs/uclib-rootfs/usr/bin/expr
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/expr
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/fgconsole b/src/initramfs/uclib-rootfs/usr/bin/fgconsole
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/fgconsole
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/find b/src/initramfs/uclib-rootfs/usr/bin/find
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/find
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/flock b/src/initramfs/uclib-rootfs/usr/bin/flock
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/flock
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/free b/src/initramfs/uclib-rootfs/usr/bin/free
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/free
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/ftpget b/src/initramfs/uclib-rootfs/usr/bin/ftpget
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/ftpget
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/ftpput b/src/initramfs/uclib-rootfs/usr/bin/ftpput
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/ftpput
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/head b/src/initramfs/uclib-rootfs/usr/bin/head
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/head
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/id b/src/initramfs/uclib-rootfs/usr/bin/id
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/id
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/killall b/src/initramfs/uclib-rootfs/usr/bin/killall
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/killall
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/ld b/src/initramfs/uclib-rootfs/usr/bin/ld
new file mode 100755
index 00000000..f169e2ec
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/ld
Binary files differ
diff --git a/src/initramfs/uclib-rootfs/usr/bin/ldd b/src/initramfs/uclib-rootfs/usr/bin/ldd
new file mode 100755
index 00000000..4dba3cfb
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/ldd
@@ -0,0 +1,193 @@
+#! /bin/bash
+# Copyright (C) 1996-2008, 2009 Free Software Foundation, Inc.
+# This file is part of the GNU C Library.
+
+# The GNU C Library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+
+# The GNU C Library 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
+# Lesser General Public License for more details.
+
+# You should have received a copy of the GNU Lesser General Public
+# License along with the GNU C Library; if not, write to the Free
+# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+# 02111-1307 USA.
+
+
+# This is the `ldd' command, which lists what shared libraries are
+# used by given dynamically-linked executables. It works by invoking the
+# run-time dynamic linker as a command and setting the environment
+# variable LD_TRACE_LOADED_OBJECTS to a non-empty value.
+
+# We should be able to find the translation right at the beginning.
+TEXTDOMAIN=libc
+TEXTDOMAINDIR=/usr/share/locale
+
+RTLDLIST="/lib/ld-linux.so.2 /lib64/ld-linux-x86-64.so.2"
+warn=
+bind_now=
+verbose=
+
+while test $# -gt 0; do
+ case "$1" in
+ --vers | --versi | --versio | --version)
+ echo 'ldd (Debian EGLIBC 2.11.2-2) 2.11.2'
+ printf $"Copyright (C) %s Free Software Foundation, Inc.
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+" "2009"
+ printf $"Written by %s and %s.
+" "Roland McGrath" "Ulrich Drepper"
+ exit 0
+ ;;
+ --h | --he | --hel | --help)
+ printf $"Usage: ldd [OPTION]... FILE...
+ --help print this help and exit
+ --version print version information and exit
+ -d, --data-relocs process data relocations
+ -r, --function-relocs process data and function relocations
+ -u, --unused print unused direct dependencies
+ -v, --verbose print all information
+"
+ printf $"For bug reporting instructions, please see:
+%s.
+" "<http://www.debian.org/Bugs/>"
+ exit 0
+ ;;
+ -d | --d | --da | --dat | --data | --data- | --data-r | --data-re | \
+ --data-rel | --data-relo | --data-reloc | --data-relocs)
+ warn=yes
+ shift
+ ;;
+ -r | --f | --fu | --fun | --func | --funct | --functi | --functio | \
+ --function | --function- | --function-r | --function-re | --function-rel | \
+ --function-relo | --function-reloc | --function-relocs)
+ warn=yes
+ bind_now=yes
+ shift
+ ;;
+ -v | --verb | --verbo | --verbos | --verbose)
+ verbose=yes
+ shift
+ ;;
+ -u | --u | --un | --unu | --unus | --unuse | --unused)
+ unused=yes
+ shift
+ ;;
+ --v | --ve | --ver)
+ echo >&2 $"ldd: option \`$1' is ambiguous"
+ exit 1
+ ;;
+ --) # Stop option processing.
+ shift; break
+ ;;
+ -*)
+ echo >&2 'ldd:' $"unrecognized option" "\`$1'"
+ echo >&2 $"Try \`ldd --help' for more information."
+ exit 1
+ ;;
+ *)
+ break
+ ;;
+ esac
+done
+
+nonelf ()
+{
+ # Maybe extra code for non-ELF binaries.
+ return 1;
+}
+
+add_env="LD_TRACE_LOADED_OBJECTS=1 LD_WARN=$warn LD_BIND_NOW=$bind_now"
+add_env="$add_env LD_LIBRARY_VERSION=\$verify_out"
+add_env="$add_env LD_VERBOSE=$verbose"
+if test "$unused" = yes; then
+ add_env="$add_env LD_DEBUG=\"$LD_DEBUG${LD_DEBUG:+,}unused\""
+fi
+
+# The following use of cat is needed to make ldd work in SELinux
+# environments where the executed program might not have permissions
+# to write to the console/tty. But only bash 3.x supports the pipefail
+# option, and we don't bother to handle the case for older bash versions.
+if x=`set -o` && test "$x" != "${x#*pipefail}" && set -o pipefail ; then
+ try_trace() {
+ eval $add_env '"$@"' | cat
+ }
+else
+ try_trace() {
+ eval $add_env '"$@"'
+ }
+fi
+
+case $# in
+0)
+ echo >&2 'ldd:' $"missing file arguments"
+ echo >&2 $"Try \`ldd --help' for more information."
+ exit 1
+ ;;
+1)
+ single_file=t
+ ;;
+*)
+ single_file=f
+ ;;
+esac
+
+result=0
+for file do
+ # We don't list the file name when there is only one.
+ test $single_file = t || echo "${file}:"
+ case $file in
+ */*) :
+ ;;
+ *) file=./$file
+ ;;
+ esac
+ if test ! -e "$file"; then
+ echo "ldd: ${file}:" $"No such file or directory" >&2
+ result=1
+ elif test ! -f "$file"; then
+ echo "ldd: ${file}:" $"not regular file" >&2
+ result=1
+ elif test -r "$file"; then
+ RTLD=
+ ret=1
+ for rtld in ${RTLDLIST}; do
+ if test -x $rtld; then
+ verify_out=`${rtld} --verify "$file"`
+ ret=$?
+ case $ret in
+ [02]) RTLD=${rtld}; break;;
+ esac
+ fi
+ done
+ case $ret in
+ 0|2)
+ try_trace "$RTLD" "$file" || result=1
+ ;;
+ 1|126)
+ # This can be a non-ELF binary or no binary at all.
+ nonelf "$file" || {
+ echo $" not a dynamic executable"
+ result=1
+ }
+ ;;
+ *)
+ echo 'ldd:' ${RTLD} $"exited with unknown exit code" "($ret)" >&2
+ exit 1
+ ;;
+ esac
+ else
+ echo 'ldd:' $"error: you do not have read permission for" "\`$file'" >&2
+ result=1
+ fi
+done
+
+exit $result
+# Local Variables:
+# mode:ksh
+# End:
diff --git a/src/initramfs/uclib-rootfs/usr/bin/less b/src/initramfs/uclib-rootfs/usr/bin/less
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/less
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/logger b/src/initramfs/uclib-rootfs/usr/bin/logger
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/logger
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/lspci b/src/initramfs/uclib-rootfs/usr/bin/lspci
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/lspci
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/lsusb b/src/initramfs/uclib-rootfs/usr/bin/lsusb
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/lsusb
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/lzcat b/src/initramfs/uclib-rootfs/usr/bin/lzcat
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/lzcat
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/lzma b/src/initramfs/uclib-rootfs/usr/bin/lzma
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/lzma
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/lzmacat b/src/initramfs/uclib-rootfs/usr/bin/lzmacat
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/lzmacat
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/md5sum b/src/initramfs/uclib-rootfs/usr/bin/md5sum
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/md5sum
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/nc b/src/initramfs/uclib-rootfs/usr/bin/nc
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/nc
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/nmeter b/src/initramfs/uclib-rootfs/usr/bin/nmeter
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/nmeter
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/openvt b/src/initramfs/uclib-rootfs/usr/bin/openvt
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/openvt
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/printf b/src/initramfs/uclib-rootfs/usr/bin/printf
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/printf
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/readahead b/src/initramfs/uclib-rootfs/usr/bin/readahead
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/readahead
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/readlink b/src/initramfs/uclib-rootfs/usr/bin/readlink
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/readlink
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/realpath b/src/initramfs/uclib-rootfs/usr/bin/realpath
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/realpath
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/rpm2cpio b/src/initramfs/uclib-rootfs/usr/bin/rpm2cpio
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/rpm2cpio
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/rzscontrol b/src/initramfs/uclib-rootfs/usr/bin/rzscontrol
new file mode 100755
index 00000000..0d7f2702
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/rzscontrol
Binary files differ
diff --git a/src/initramfs/uclib-rootfs/usr/bin/smemcap b/src/initramfs/uclib-rootfs/usr/bin/smemcap
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/smemcap
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/sort b/src/initramfs/uclib-rootfs/usr/bin/sort
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/sort
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/strace b/src/initramfs/uclib-rootfs/usr/bin/strace
new file mode 100755
index 00000000..efe78e71
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/strace
Binary files differ
diff --git a/src/initramfs/uclib-rootfs/usr/bin/strings b/src/initramfs/uclib-rootfs/usr/bin/strings
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/strings
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/tail b/src/initramfs/uclib-rootfs/usr/bin/tail
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/tail
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/test b/src/initramfs/uclib-rootfs/usr/bin/test
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/test
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/tftp b/src/initramfs/uclib-rootfs/usr/bin/tftp
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/tftp
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/time b/src/initramfs/uclib-rootfs/usr/bin/time
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/time
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/timeout b/src/initramfs/uclib-rootfs/usr/bin/timeout
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/timeout
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/tr b/src/initramfs/uclib-rootfs/usr/bin/tr
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/tr
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/uniq b/src/initramfs/uclib-rootfs/usr/bin/uniq
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/uniq
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/unlzma b/src/initramfs/uclib-rootfs/usr/bin/unlzma
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/unlzma
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/unxz b/src/initramfs/uclib-rootfs/usr/bin/unxz
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/unxz
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/uptime b/src/initramfs/uclib-rootfs/usr/bin/uptime
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/uptime
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/wc b/src/initramfs/uclib-rootfs/usr/bin/wc
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/wc
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/wget b/src/initramfs/uclib-rootfs/usr/bin/wget
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/wget
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/which b/src/initramfs/uclib-rootfs/usr/bin/which
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/which
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/whoami b/src/initramfs/uclib-rootfs/usr/bin/whoami
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/whoami
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/xargs b/src/initramfs/uclib-rootfs/usr/bin/xargs
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/xargs
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/xz b/src/initramfs/uclib-rootfs/usr/bin/xz
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/xz
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/bin/xzcat b/src/initramfs/uclib-rootfs/usr/bin/xzcat
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/bin/xzcat
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/lib/libbfd-2.20.1-system.20100303.so b/src/initramfs/uclib-rootfs/usr/lib/libbfd-2.20.1-system.20100303.so
new file mode 100644
index 00000000..ae24957b
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/lib/libbfd-2.20.1-system.20100303.so
Binary files differ
diff --git a/src/initramfs/uclib-rootfs/usr/lib/libfusion-1.2.so.9 b/src/initramfs/uclib-rootfs/usr/lib/libfusion-1.2.so.9
new file mode 100644
index 00000000..1b8d84ea
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/lib/libfusion-1.2.so.9
Binary files differ
diff --git a/src/initramfs/uclib-rootfs/usr/lib/libgcc_s.so.1 b/src/initramfs/uclib-rootfs/usr/lib/libgcc_s.so.1
new file mode 100644
index 00000000..f893c04d
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/lib/libgcc_s.so.1
Binary files differ
diff --git a/src/initramfs/uclib-rootfs/usr/lib/libhal.so.1 b/src/initramfs/uclib-rootfs/usr/lib/libhal.so.1
new file mode 100644
index 00000000..8db463f0
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/lib/libhal.so.1
Binary files differ
diff --git a/src/initramfs/uclib-rootfs/usr/lib/libhd.so.16 b/src/initramfs/uclib-rootfs/usr/lib/libhd.so.16
new file mode 100644
index 00000000..3fd68f29
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/lib/libhd.so.16
Binary files differ
diff --git a/src/initramfs/uclib-rootfs/usr/lib/libm.so b/src/initramfs/uclib-rootfs/usr/lib/libm.so
new file mode 120000
index 00000000..6c7b429c
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/lib/libm.so
@@ -0,0 +1 @@
+/lib/libm.so.6 \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/lib/libpcre.so.3 b/src/initramfs/uclib-rootfs/usr/lib/libpcre.so.3
new file mode 100644
index 00000000..d11113bb
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/lib/libpcre.so.3
Binary files differ
diff --git a/src/initramfs/uclib-rootfs/usr/lib/libz.so.1 b/src/initramfs/uclib-rootfs/usr/lib/libz.so.1
new file mode 100644
index 00000000..c1b51178
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/lib/libz.so.1
Binary files differ
diff --git a/src/initramfs/uclib-rootfs/usr/sbin/brctl b/src/initramfs/uclib-rootfs/usr/sbin/brctl
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/sbin/brctl
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/sbin/chroot b/src/initramfs/uclib-rootfs/usr/sbin/chroot
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/sbin/chroot
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/sbin/dhcprelay b/src/initramfs/uclib-rootfs/usr/sbin/dhcprelay
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/sbin/dhcprelay
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/sbin/fbset b/src/initramfs/uclib-rootfs/usr/sbin/fbset
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/sbin/fbset
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/sbin/httpd b/src/initramfs/uclib-rootfs/usr/sbin/httpd
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/sbin/httpd
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/sbin/hwinfo b/src/initramfs/uclib-rootfs/usr/sbin/hwinfo
new file mode 100755
index 00000000..5dbe48a4
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/sbin/hwinfo
Binary files differ
diff --git a/src/initramfs/uclib-rootfs/usr/sbin/loadfont b/src/initramfs/uclib-rootfs/usr/sbin/loadfont
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/sbin/loadfont
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/sbin/rdate b/src/initramfs/uclib-rootfs/usr/sbin/rdate
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/sbin/rdate
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/sbin/setlogcons b/src/initramfs/uclib-rootfs/usr/sbin/setlogcons
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/sbin/setlogcons
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/initramfs/uclib-rootfs/usr/sbin/udhcpd b/src/initramfs/uclib-rootfs/usr/sbin/udhcpd
new file mode 120000
index 00000000..f948f1a7
--- /dev/null
+++ b/src/initramfs/uclib-rootfs/usr/sbin/udhcpd
@@ -0,0 +1 @@
+../../bin/busybox \ No newline at end of file
diff --git a/src/installer/OpenSLX/OSExport/BlockDevice/AoE.pm b/src/installer/OpenSLX/OSExport/BlockDevice/AoE.pm
new file mode 100644
index 00000000..cc7866b5
--- /dev/null
+++ b/src/installer/OpenSLX/OSExport/BlockDevice/AoE.pm
@@ -0,0 +1,95 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# AoE.pm
+# - provides ATA-over-Ethernet specific overrides of the
+# OpenSLX::OSExport::BlockDevice API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSExport::BlockDevice::AoE;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSExport::BlockDevice::Base);
+
+use File::Basename;
+use OpenSLX::Basics;
+use OpenSLX::ConfigDB qw(:support);
+use OpenSLX::OSExport::BlockDevice::Base 1;
+use OpenSLX::Utils;
+
+#
+#
+# N.B.: currently this is just a stub
+#
+#
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {'name' => 'aoe',};
+ return bless $self, $class;
+}
+
+sub getExportPort
+{
+ my $self = shift;
+ my $openslxDB = shift;
+
+ return $openslxDB->incrementGlobalCounter('next-nbd-server-port');
+}
+
+sub generateExportURI
+{
+ my $self = shift;
+ my $export = shift;
+
+ my $serverIP = $export->{server_ip} || '';
+ my $server
+ = length($serverIP) ? $serverIP : generatePlaceholderFor('serverip');
+ $server .= ":$export->{port}" if length($export->{port});
+
+ return "aoe://$server";
+}
+
+sub requiredBlockDeviceModules
+{
+ my $self = shift;
+
+ return qw( aoe );
+}
+
+sub requiredBlockDeviceTools
+{
+ my $self = shift;
+
+ # TODO: is there any such tool?
+
+ return;
+}
+
+sub showExportConfigInfo
+{
+ my $self = shift;
+ my $export = shift;
+
+ print(('#' x 80) . "\n");
+ print _tr(
+ "Please make sure you start a corresponding aoe-server:\n\t%s\n",
+ "... (don't know how this is done yet)"
+ );
+ print(('#' x 80) . "\n");
+ return;
+}
+
+1;
diff --git a/src/installer/OpenSLX/OSExport/BlockDevice/Base.pm b/src/installer/OpenSLX/OSExport/BlockDevice/Base.pm
new file mode 100644
index 00000000..6469c2f4
--- /dev/null
+++ b/src/installer/OpenSLX/OSExport/BlockDevice/Base.pm
@@ -0,0 +1,77 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# Base.pm
+# - provides empty base of the OpenSLX OSExport::BlockDevice API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSExport::BlockDevice::Base;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+use Scalar::Util qw( weaken );
+
+use OpenSLX::Basics;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ confess "Creating OpenSLX::OSExport::BlockDevice::Base-objects directly makes no sense!";
+}
+
+sub initialize
+{
+ my $self = shift;
+ my $engine = shift;
+ my $fs = shift;
+
+ $self->{'engine'} = $engine;
+ weaken($self->{'engine'});
+ # avoid circular reference between block-device and its engine
+
+ $self->{'fs'} = $fs;
+ weaken($self->{'fs'});
+ # avoid circular reference between block-device and its file-system
+}
+
+sub getExportPort
+{
+}
+
+sub generateExportURI
+{
+}
+
+sub requiredBlockDeviceModules
+{
+}
+
+sub requiredBlockDeviceTools
+{
+}
+
+sub showExportConfigInfo
+{
+}
+
+1;
+################################################################################
+
+=pod
+
+=head1 NAME
+
+OpenSLX::OSExport::BlockDevice::Base - the base class for all OSExport::BlockDevices
+
+=cut
diff --git a/src/installer/OpenSLX/OSExport/BlockDevice/DNBD2.pm b/src/installer/OpenSLX/OSExport/BlockDevice/DNBD2.pm
new file mode 100644
index 00000000..25e112ee
--- /dev/null
+++ b/src/installer/OpenSLX/OSExport/BlockDevice/DNBD2.pm
@@ -0,0 +1,91 @@
+# Copyright (c) 2006, 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# DNBD2.pm
+# - provides DNBD2+Squashfs-specific overrides of the
+# OpenSLX::OSExport::BlockDevice API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSExport::BlockDevice::DNBD2;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSExport::BlockDevice::Base);
+
+use File::Basename;
+use OpenSLX::Basics;
+use OpenSLX::ConfigDB qw(:support);
+use OpenSLX::OSExport::BlockDevice::Base 1;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {'name' => 'dnbd2',};
+ return bless $self, $class;
+}
+
+sub getExportPort
+{
+ my $self = shift;
+ my $openslxDB = shift;
+
+ return $openslxDB->incrementGlobalCounter('next-nbd-server-port');
+}
+
+sub generateExportURI
+{
+ my $self = shift;
+ my $export = shift;
+
+ my $serverIP = $export->{server_ip} || '';
+ my $server
+ = length($serverIP) ? $serverIP : generatePlaceholderFor('serverip');
+ $server .= ":$export->{port}" if length($export->{port});
+
+ return "dnbd2://$server";
+}
+
+sub requiredBlockDeviceModules
+{
+ my $self = shift;
+
+ return qw( dnbd2 );
+}
+
+sub requiredBlockDeviceTools
+{
+ my $self = shift;
+
+ return qw( );
+}
+
+sub showExportConfigInfo
+{
+ my $self = shift;
+ my $export = shift;
+
+ print '#' x 80 , "\n",
+ _tr(
+ "Please make sure you start a corresponding dnbd2-server:\n\t%s\n",
+ "dnbd2-server /etc/dnbd2/server.conf\n"
+ ),
+ "Create or modify a config file like /etc/dnbd2/server.conf, looking like:",
+ "\n# dnbd2 server configuration\n<server>\n",
+ "$export->{port}\n",
+ "$self->{fs}->{'export-path'}\n\n",
+ '#' x 80, "\n";
+ return;
+}
+
+1;
diff --git a/src/installer/OpenSLX/OSExport/BlockDevice/LBD.pm b/src/installer/OpenSLX/OSExport/BlockDevice/LBD.pm
new file mode 100644
index 00000000..e8df1b04
--- /dev/null
+++ b/src/installer/OpenSLX/OSExport/BlockDevice/LBD.pm
@@ -0,0 +1,76 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# LBD.pm
+# - provides the local block devices with Squashfs container specific
+# overrides of the OpenSLX::OSExport::BlockDevice API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSExport::BlockDevice::LBD;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSExport::BlockDevice::Base);
+
+use File::Basename;
+use OpenSLX::Basics;
+use OpenSLX::ConfigDB qw(:support);
+use OpenSLX::OSExport::BlockDevice::Base 1;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {'name' => 'LBD',};
+ return bless $self, $class;
+}
+
+sub generateExportURI
+{
+ my $self = shift;
+
+ return "lbd://sda1/squashfs";
+}
+
+sub requiredBlockDeviceModules
+{
+ my $self = shift;
+
+ return qw( ehci_hcd usb_storage scsi_mod sd_mod loop ext3 );
+}
+
+sub requiredBlockDeviceTools
+{
+ my $self = shift;
+
+ return qw( );
+}
+
+sub showExportConfigInfo
+{
+ my $self = shift;
+ my $export = shift;
+
+ print '#' x 80 , "\n",
+ _tr(
+ "Please make sure you copy all corresponding files to your boot\n",
+ "device you wish to deploy (e.g. bootable USB stick)\n"
+ ),
+ "Make your device bootable using syslinux for (v)fat or extlinux for\n",
+ "ext2/3 partitions. Cat HPA syslinux' mbr to the device very beginning\n",
+ "and set the boot flag to the partion you made bootable\n\n",
+ '#' x 80, "\n";
+ return;
+}
+
+1;
diff --git a/src/installer/OpenSLX/OSExport/BlockDevice/NBD.pm b/src/installer/OpenSLX/OSExport/BlockDevice/NBD.pm
new file mode 100644
index 00000000..58378751
--- /dev/null
+++ b/src/installer/OpenSLX/OSExport/BlockDevice/NBD.pm
@@ -0,0 +1,87 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# NBD.pm
+# - provides NBD+Squashfs-specific overrides of the
+# OpenSLX::OSExport::BlockDevice API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSExport::BlockDevice::NBD;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSExport::BlockDevice::Base);
+
+use File::Basename;
+use OpenSLX::Basics;
+use OpenSLX::ConfigDB qw(:support);
+use OpenSLX::OSExport::BlockDevice::Base 1;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {'name' => 'nbd',};
+ return bless $self, $class;
+}
+
+sub getExportPort
+{
+ my $self = shift;
+ my $openslxDB = shift;
+
+ return $openslxDB->incrementGlobalCounter('next-nbd-server-port');
+}
+
+sub generateExportURI
+{
+ my $self = shift;
+ my $export = shift;
+
+ my $serverIP = $export->{server_ip} || '';
+ my $server
+ = length($serverIP) ? $serverIP : generatePlaceholderFor('serverip');
+ $server .= ":$export->{port}" if length($export->{port});
+
+ return "nbd://$server";
+}
+
+sub requiredBlockDeviceModules
+{
+ my $self = shift;
+
+ return qw( nbd );
+}
+
+sub requiredBlockDeviceTools
+{
+ my $self = shift;
+
+ return qw( nbd-client );
+}
+
+sub showExportConfigInfo
+{
+ my $self = shift;
+ my $export = shift;
+
+ print(('#' x 80) . "\n");
+ print _tr(
+ "Please make sure you start a corresponding nbd-server:\n\t%s\n",
+ "nbd-server $export->{port} $self->{fs}->{'export-path'} -r"
+ );
+ print(('#' x 80) . "\n");
+ return;
+}
+
+1;
diff --git a/src/installer/OpenSLX/OSExport/Distro/Any.pm b/src/installer/OpenSLX/OSExport/Distro/Any.pm
new file mode 100644
index 00000000..dc3c7c8b
--- /dev/null
+++ b/src/installer/OpenSLX/OSExport/Distro/Any.pm
@@ -0,0 +1,66 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# OSExport/Distro/Any.pm
+# - provides generic overrides of the OSExport Distro API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSExport::Distro::Any;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSExport::Distro::Base);
+
+use OpenSLX::Basics;
+
+################################################################################
+### implementation
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {
+ 'base-name' => 'any',
+ };
+ return bless $self, $class;
+}
+
+sub initDistroInfo
+{
+ my $self = shift;
+
+ $self->{'export-filter'} = "
+ + /var
+ - /var/tmp/*
+ - /var/spool/*
+ - /var/run/*
+ - /var/lock/*
+ - /var/log/*
+ - /var/lib/xdm
+ - /var/lib/smart
+ - /var/cache/yum
+ - /var/cache/man/*
+ - /usr/share/vmware/*
+ - /tmp/*
+ - /sys/*
+ - /proc/*
+ - /mnt/*
+ - /media/*
+ + /lib/modules/*/misc/vmblock.o
+ + /lib/modules/*/misc/vmnet.o
+ + /lib/modules/*/misc/vmmon.o
+ - /lib/klibc/events/*
+ - /boot/initrd*
+ - /boot/grub
+ ";
+ return;
+}
+
+1; \ No newline at end of file
diff --git a/src/installer/OpenSLX/OSExport/Distro/Base.pm b/src/installer/OpenSLX/OSExport/Distro/Base.pm
new file mode 100644
index 00000000..5223ce95
--- /dev/null
+++ b/src/installer/OpenSLX/OSExport/Distro/Base.pm
@@ -0,0 +1,71 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# OSExport/Distro/Base.pm
+# - provides base implementation of the OSExport Distro API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSExport::Distro::Base;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+use Scalar::Util qw( weaken );
+
+use OpenSLX::Basics;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ confess "Creating OpenSLX::OSExport::Distro::Base-objects directly makes no sense!";
+}
+
+sub initialize
+{
+ my $self = shift;
+ my $engine = shift;
+
+ $self->{'engine'} = $engine;
+ weaken($self->{'engine'});
+ # avoid circular reference between distro and its engine
+
+ $self->initDistroInfo();
+ return;
+}
+
+sub initDistroInfo
+{
+}
+
+sub getSquashfsVersion
+{
+ my $self = shift;
+ my $distroVersion = shift;
+
+ return "4.0";
+}
+
+1;
+################################################################################
+
+=pod
+
+=head1 NAME
+
+OpenSLX::OSExport::Distro::Base
+
+=head1 SYNOPSIS
+
+...
+
+=cut
diff --git a/src/installer/OpenSLX/OSExport/Distro/Debian.pm b/src/installer/OpenSLX/OSExport/Distro/Debian.pm
new file mode 100644
index 00000000..98e9b42f
--- /dev/null
+++ b/src/installer/OpenSLX/OSExport/Distro/Debian.pm
@@ -0,0 +1,60 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# OSExport/Distro/Debian.pm
+# - provides Debian-specific overrides of the OSExport Distro API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSExport::Distro::Debian;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSExport::Distro::Base);
+
+use OpenSLX::Basics;
+
+################################################################################
+### implementation
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {
+ 'base-name' => 'debian',
+ };
+ return bless $self, $class;
+}
+
+sub initDistroInfo
+{
+ my $self = shift;
+
+ $self->{'export-filter'} = "
+ - /var/tmp/*
+ - /var/spool/*
+ - /var/run/*
+ - /var/log/*
+ - /var/lib/xdm
+ - /var/cache/man/*
+ - /var/cache/apt/archives/*
+ - /usr/share/vmware/*
+ - /tmp/*
+ - /sys/*
+ - /proc/*
+ - /mnt/*
+ - /media/*
+ - /lib/klibc/events/*
+ - /boot/initrd*
+ - /boot/grub
+ ";
+ return;
+}
+
+1;
diff --git a/src/installer/OpenSLX/OSExport/Distro/Fedora.pm b/src/installer/OpenSLX/OSExport/Distro/Fedora.pm
new file mode 100644
index 00000000..4c196bd1
--- /dev/null
+++ b/src/installer/OpenSLX/OSExport/Distro/Fedora.pm
@@ -0,0 +1,65 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# OSExport/Distro/Fedora.pm
+# - provides Fedora-specific overrides of the OSExport Distro API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSExport::Distro::Fedora;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSExport::Distro::Base);
+
+use OpenSLX::Basics;
+
+################################################################################
+### implementation
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {
+ 'base-name' => 'fedora',
+ };
+ return bless $self, $class;
+}
+
+sub initDistroInfo
+{
+ my $self = shift;
+
+ # TODO: check and refine this!
+ $self->{'export-filter'} = "
+ - /var/tmp/*
+ - /var/spool/*
+ - /var/run/*
+ - /var/lock/*
+ - /var/log/*
+ - /var/lib/xdm
+ - /var/lib/smart
+ - /var/cache/yum
+ - /var/cache/man/*
+ - /usr/share/vmware/*
+ - /tmp/*
+ - /sys/*
+ - /proc/*
+ - /mnt/*
+ - /media/*
+ - /lib/klibc/events/*
+ - /boot/initrd*
+ - /boot/grub
+ - *.rpmsave
+ - *.rpmnew
+ ";
+ return;
+}
+
+1; \ No newline at end of file
diff --git a/src/installer/OpenSLX/OSExport/Distro/Gentoo.pm b/src/installer/OpenSLX/OSExport/Distro/Gentoo.pm
new file mode 100644
index 00000000..79fa2210
--- /dev/null
+++ b/src/installer/OpenSLX/OSExport/Distro/Gentoo.pm
@@ -0,0 +1,59 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# OSExport/Distro/Gentoo.pm
+# - provides Gentoo-specific overrides of the OSExport Distro API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSExport::Distro::Gentoo;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSExport::Distro::Base);
+
+use OpenSLX::Basics;
+
+################################################################################
+### implementation
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {
+ 'base-name' => 'gentoo',
+ };
+ return bless $self, $class;
+}
+
+sub initDistroInfo
+{
+ my $self = shift;
+
+ $self->{'export-filter'} = "
+ - /var/tmp/*
+ - /var/spool/*
+ - /var/run/*
+ - /var/log/*
+ - /var/lib/xdm
+ - /var/lib/init.d/*
+ - /var/cache/man/*
+ - /usr/share/vmware/*
+ - /tmp/*
+ - /sys/*
+ - /proc/*
+ - /mnt/*
+ - /media/*
+ - /boot/initrd*
+ - /boot/grub
+ ";
+ return;
+}
+
+1; \ No newline at end of file
diff --git a/src/installer/OpenSLX/OSExport/Distro/SciLin.pm b/src/installer/OpenSLX/OSExport/Distro/SciLin.pm
new file mode 100644
index 00000000..272b5cef
--- /dev/null
+++ b/src/installer/OpenSLX/OSExport/Distro/SciLin.pm
@@ -0,0 +1,94 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# OSExport/Distro/SciLin.pm
+# - provides SciLin-specific overrides of the OSExport Distro API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSExport::Distro::SciLin;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSExport::Distro::Base);
+
+use OpenSLX::Basics;
+
+################################################################################
+### implementation
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {
+ 'base-name' => 'scilin',
+ };
+ return bless $self, $class;
+}
+
+sub initDistroInfo
+{
+ my $self = shift;
+
+ $self->{'export-filter'} = "
+ - /var/tmp/*
+ - /var/spool/*
+ - /var/run/*
+ - /var/mail
+ - /var/log/*
+ - /var/lock/*
+ - /var/lib/xdm
+ - /var/lib/vm*
+ - /var/lib/suspend*
+ - /var/lib/smart
+ - /var/lib/gdm/*
+ - /var/lib/dhcp*
+ - /var/lib/bluetooth/
+ - /var/cache/yum
+ - /var/cache/man/*
+ - /var/cache/zypp/*
+ + /usr/lib/python*/*/*.o
+ + /usr/lib/perl5/*/*/*/*.o
+ + /usr/lib/gcc/*/*/*.o
+ + /usr/lib/*.o
+ + /usr/X11R6/lib/modules/drivers/*.o
+ + /usr/X11R6/lib/modules/drivers/linux/*.o
+ - /usr/bin/BackGround
+ - /tmp/*
+ - /sys/*
+ - /proc/*
+ - /opt/kde3/share/apps/kdm/read_sysconfig.sh
+ - /opt/kde3/share/autostart/runupdater.desktop
+ - /opt/kde3/share/autostart/profile_chooser-autostart.desktop
+ - /opt/kde3/share/autostart/kinternet.desktop
+ - /usr/share/gnome/autostart/gpk-update-icon*.desktop
+ - /mnt/*
+ - /media/*
+ + /media
+ + /lib/modules/*/misc/vmblock.o
+ + /lib/modules/*/misc/vmnet.o
+ + /lib/modules/*/misc/vmmon.o
+ - /etc/*rpmnew
+ - /etc/*rpmorig
+ - /etc/*pptp*
+ - /etc/*ppp*
+ - /etc/dhcp*
+ - /etc/cron.*/*
+ - /etc/netplug*
+ - /etc/sysconfig/network*
+ - /etc/X11/xkb
+ - /boot/initrd*
+ - /boot/grub
+ - *.rpmsave
+ - *.rpmnew
+ ";
+ return;
+}
+
+1;
diff --git a/src/installer/OpenSLX/OSExport/Distro/Suse.pm b/src/installer/OpenSLX/OSExport/Distro/Suse.pm
new file mode 100644
index 00000000..9e62e6e5
--- /dev/null
+++ b/src/installer/OpenSLX/OSExport/Distro/Suse.pm
@@ -0,0 +1,145 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# OSExport/Distro/Suse.pm
+# - provides SUSE-specific overrides of the OSExport Distro API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSExport::Distro::Suse;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSExport::Distro::Base);
+
+use OpenSLX::Basics;
+
+################################################################################
+### implementation
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {
+ 'base-name' => 'suse',
+ };
+ return bless $self, $class;
+}
+
+sub initDistroInfo
+{
+ my $self = shift;
+
+ $self->{'export-filter'} = "
+ - /var/tmp/*
+ - /var/spool/*
+ - /var/run/*
+ + /var/run/screen
+ - /var/mail
+ - /var/log/*
+ - /var/lock/*
+ - /var/lib/zypp/*
+ - /var/lib/zmd
+ - /var/lib/xdm
+ - /var/lib/vm*
+ - /var/lib/suspend*
+ - /var/lib/smart
+ - /var/lib/sax
+ - /var/lib/hardware/*
+ - /var/lib/gdm/*
+ - /var/lib/dhcp*
+ - /var/lib/bluetooth/
+ - /var/lib/YaST2/you/mnt/*
+ - /var/lib/YaST2/backup_boot_sectors
+ - /var/cache/sax
+ - /var/cache/libx11/compose/*
+ - /var/cache/beagle
+ - /var/cache/yum
+ - /var/cache/man/*
+ - /var/cache/zypp/*
+ - /var/adm/backup/rpmdb/*
+ - /var/adm/mount/AP*
+ - /var/adm/SuSEconfig
+ - /usr/share/vmware/*
+ - /usr/lib/zen-updater
+ + /usr/lib/python*/*/*.o
+ + /usr/lib/perl5/*/*/*/*.o
+ + /usr/lib/gcc/*/*/*.o
+ + /usr/lib/*.o
+ + /usr/X11R6/lib/modules/drivers/*.o
+ + /usr/X11R6/lib/modules/drivers/linux/*.o
+ - /usr/bin/zen-*
+ - /usr/bin/nw-manager
+ - /usr/X11R6/bin/BackGround
+ - /usr/bin/BackGround
+ - /usr/share/autostart/SUSEgreeter.desktop
+ - /tmp/*
+ - /sys/*
+ - /proc/*
+ - /opt/kde3/share/apps/kdm/read_sysconfig.sh
+ - */autostart/suseplugger.desktop
+ - */autostart/susewatcher.desktop
+ - */autostart/runupdater.desktop
+ - */autostart/profile_chooser-autostart.desktop
+ - */autostart/opensuseupdater.desktop
+ - */autostart/knetworkmanager-autostart.desktop
+ - */autostart/kerry.autostart.desktop
+ - */autostart/kinternet.desktop
+ - */autostart/SUSEgreeter.desktop
+ - */autostart/zen-updater-auto.desktop
+ - */autostart/beagle*.desktop
+ - */autostart/gpk-update-icon*.desktop
+ - */autostart/kupdateapplet.desktop
+ - */config/SuSE/default/kupdateapplet.*
+ - */config/SuSE/default/*.live
+ - */config/SuSE/default/*beagle*
+ - /mnt/*
+ - /media/*
+ + /media
+ + /lib/modules/*/misc/vmblock.o
+ + /lib/modules/*/misc/vmnet.o
+ + /lib/modules/*/misc/vmmon.o
+ - /etc/*rpmnew
+ - /etc/*rpmorig
+ - /etc/*YaST2save
+ - /etc/*pptp*
+ - /etc/*ppp*
+ - /etc/dhcp*
+ - /etc/cron.*/*
+ - /etc/sysconfig/network/ifcfg-*
+ - /etc/X11/xdm/SuSEconfig.xdm
+ - /boot/initrd*
+ - /boot/grub
+ - *.rpmsave
+ - *.rpmnew
+ - *.YaST2save
+ ";
+ return;
+}
+
+
+sub getSquashfsVersion
+{
+ my $self = shift;
+ my $distroVersion = shift;
+
+ my %versionMap = (
+ '11.0' => '3.2',
+ '11.1' => '3.2',
+ '11.2' => '3.3',
+ '11.3' => '4.0'
+ );
+
+ my $distroDefault = '4.0';
+
+ return $versionMap{$distroVersion} || $distroDefault;
+}
+
+
+1;
diff --git a/src/installer/OpenSLX/OSExport/Distro/Ubuntu.pm b/src/installer/OpenSLX/OSExport/Distro/Ubuntu.pm
new file mode 100644
index 00000000..3826f019
--- /dev/null
+++ b/src/installer/OpenSLX/OSExport/Distro/Ubuntu.pm
@@ -0,0 +1,108 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# OSExport/Distro/Ubuntu.pm
+# - provides Ubuntu-specific overrides of the OSExport Distro API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSExport::Distro::Ubuntu;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSExport::Distro::Base);
+
+use OpenSLX::Basics;
+
+################################################################################
+### implementation
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {
+ 'base-name' => 'ubuntu',
+ };
+ return bless $self, $class;
+}
+
+sub initDistroInfo
+{
+ my $self = shift;
+
+ $self->{'export-filter'} = "
+ - /var/tmp/*
+ - /var/spool/*
+ - /var/run/*
+ + /var/run/screen
+ - /var/log/*
+ - /var/log/apt/*
+ + /var/log/apt
+ - /var/lib/*dm/*
+ - /var/lib/libnss-ldap/*
+ - /var/cache/apt/archives/*
+ + /var/cache/apt/archives/partial
+ - /var/cache/man/*
+ - /var/cache/nscd/*
+ - /usr/share/vmware/*
+ - /usr/share/autostart/trackerd.desktop
+ - /usr/share/autostart/knetworkmanager.desktop
+ - /etc/update-motd.d/90*
+ - /etc/update-motd.d/91*
+ - /etc/update-motd.d/98*
+ - /tmp/*
+ - /sys/*
+ - /proc/*
+ - /mnt/*
+ - /media/*
+ - /lib/udev/devices
+ - /initrd*
+ - /etc/cron.*/*
+ - /boot/initrd*
+ - /boot/grub
+ - /etc/xdg/compiz
+ - /etc/xdg/autostart/adept_notifier_auto.desktop
+ - /etc/xdg/autostart/evolution*alarm*notify*
+ - /etc/xdg/autostart/knetworkmanager*
+ - /etc/xdg/autostart/nm-applet.desktop
+ - /etc/xdg/autostart/system-config-printer-applet-kde.desktop
+ - /etc/xdg/autostart/tracker*
+ - /etc/xdg/autostart/jockey-*
+ - /etc/xdg/autostart/ica*
+ - /etc/xdg/autostart/hplip*
+ - /etc/xdg/autostart/redhat*
+ - /etc/xdg/autostart/gnome-power-manager*
+ - /etc/xdg/autostart/update*
+ - /etc/xdg/update-notifier.desktop
+ - /etc/xdg/user-dirs-update-gtk.desktop
+ ";
+ return;
+}
+
+
+sub getSquashfsVersion
+{
+ my $self = shift;
+ my $distroVersion = shift;
+
+ my %versionMap = (
+ '8.04' => '3.3',
+ '8.10' => '3.3',
+ '9.04' => '3.3',
+ '9.10' => '4.0',
+ '10.04' => '4.0'
+ );
+
+ my $distroDefault = '4.0';
+
+ return $versionMap{$distroVersion} || $distroDefault;
+}
+
+
+1;
diff --git a/src/installer/OpenSLX/OSExport/Engine.pm b/src/installer/OpenSLX/OSExport/Engine.pm
new file mode 100644
index 00000000..251869e0
--- /dev/null
+++ b/src/installer/OpenSLX/OSExport/Engine.pm
@@ -0,0 +1,364 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# Engine.pm
+# - provides driver engine for the OSExport API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSExport::Engine;
+
+use strict;
+use warnings;
+
+our (@ISA, @EXPORT, $VERSION);
+$VERSION = 1.01; # API-version . implementation-version
+
+use Exporter;
+@ISA = qw(Exporter);
+
+@EXPORT = qw(
+ %supportedExportFileSystems %supportedExportBlockDevices
+ @supportedExportTypes
+);
+
+use File::Basename;
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+our (
+ %supportedExportFileSystems, %supportedExportBlockDevices,
+ @supportedExportTypes,
+);
+
+%supportedExportFileSystems = (
+ 'nfs' => 'NFS',
+ 'sqfs' => 'SquashFS',
+);
+
+%supportedExportBlockDevices = (
+ 'dnbd2' => 'DNBD2',
+ 'nbd' => 'NBD',
+ 'aoe' => 'AoE',
+);
+
+@supportedExportTypes = (
+ 'nfs',
+ 'sqfs-aoe',
+ 'sqfs-dnbd2',
+ 'sqfs-nbd',
+);
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+
+ my $self = {};
+
+ return bless $self, $class;
+}
+
+sub initializeFromExisting
+{
+ my $self = shift;
+ my $exportName = shift;
+
+ my $openslxDB = instantiateClass("OpenSLX::ConfigDB");
+ $openslxDB->connect();
+
+ my $export = $openslxDB->fetchExportByFilter({'name' => $exportName});
+ if (!defined $export) {
+ die _tr("Export '%s' not found in DB, giving up!", $exportName);
+ }
+ my $vendorOS =
+ $openslxDB->fetchVendorOSByFilter({'id' => $export->{vendor_os_id}});
+
+ $openslxDB->disconnect();
+
+ $self->_initialize($vendorOS->{name}, $vendorOS->{id}, $export->{name},
+ $export->{type});
+ return;
+}
+
+sub initializeForNew
+{
+ my $self = shift;
+ my $vendorOSName = shift;
+ my $exportType = lc(shift);
+
+ my $openslxDB = instantiateClass("OpenSLX::ConfigDB");
+ $openslxDB->connect();
+
+ my $vendorOS = $openslxDB->fetchVendorOSByFilter({'name' => $vendorOSName});
+ if (!defined $vendorOS) {
+ die _tr("vendor-OS '%s' not found in DB, giving up!", $vendorOSName);
+ }
+
+ my $exportName = "${vendorOSName}::${exportType}";
+
+ $openslxDB->disconnect();
+
+ $self->_initialize($vendorOS->{name}, $vendorOS->{id}, $exportName,
+ $exportType);
+ return;
+}
+
+sub exportVendorOS
+{
+ my $self = shift;
+
+ vlog(
+ 1,
+ _tr(
+ "vendor-OS from '%s' will be exported to '%s'",
+ $self->{'vendor-os-path'},
+ $self->{'exporter'}->{'export-path'}
+ )
+ );
+ if (!$self->{'exporter'}->checkRequirements($self->{'vendor-os-path'})) {
+ die _tr(
+ "clients wouldn't be able to access the exported root-fs!\nplease "
+ . "install the missing module(s) or use another export-type.");
+ }
+
+ $self->{'exporter'}->exportVendorOS($self->{'vendor-os-path'},);
+ vlog(
+ 0,
+ _tr(
+ "vendor-OS '%s' successfully exported to '%s'!",
+ $self->{'vendor-os-path'},
+ $self->{exporter}->{'export-path'}
+ )
+ );
+ $self->_addExportToConfigDB();
+ return;
+}
+
+sub purgeExport
+{
+ my $self = shift;
+
+ if ($self->{'exporter'}->purgeExport()) {
+ vlog(
+ 0,
+ _tr(
+ "export '%s' successfully removed!",
+ $self->{exporter}->{'export-path'}
+ )
+ );
+ }
+ $self->_removeExportFromConfigDB();
+ return;
+}
+
+sub generateExportURI
+{
+ my $self = shift;
+
+ return $self->{exporter}->generateExportURI(@_);
+}
+
+sub requiredFSMods
+{
+ my $self = shift;
+
+ return $self->{exporter}->requiredFSMods();
+}
+
+sub requiredFSTools
+{
+ my $self = shift;
+
+ return $self->{exporter}->requiredFSTools();
+}
+
+################################################################################
+### implementation methods
+################################################################################
+sub _initialize
+{
+ my $self = shift;
+ my $vendorOSName = shift;
+ my $vendorOSId = shift;
+ my $exportName = shift;
+ my $exportType = lc(shift);
+
+ if ($vendorOSName eq '<<<default>>>') {
+ die _tr("you can't do that with the default vendor-OS!\n");
+ }
+ if (!grep { $_ eq $exportType } @supportedExportTypes) {
+ vlog(0,
+ _tr("Sorry, export type '%s' is unsupported.\n", $exportType)
+ . _tr("List of supported export types:\n\t")
+ . join("\n\t", sort @supportedExportTypes));
+ exit 1;
+ }
+ $exportType =~ m[^(\w+)(?:-(\w+))?$];
+ my $exportFS = lc($1);
+ my $exportBD = lc($2);
+ vlog(2, "export-filesys='$exportFS' export-blockdev='$exportBD'");
+
+ $self->{'vendor-os-name'} = $vendorOSName;
+ $self->{'vendor-os-id'} = $vendorOSId;
+ $self->{'export-name'} = $exportName;
+ $self->{'export-type'} = $exportType;
+ $vendorOSName =~ m[^(.+?\-[^-]+)];
+ $self->{'distro-name'} = lc($1);
+ my $distroName = ucfirst(lc($1));
+
+ # load module for the requested distro:
+ my $distro = loadDistroModule({
+ distroName => $distroName,
+ distroScope => 'OpenSLX::OSExport::Distro',
+ fallbackName => 'Any',
+ });
+ if (!$distro) {
+ die _tr(
+ 'unable to load any OSExport::Distro module for vendor-OS %s!',
+ $vendorOSName
+ );
+ }
+ $distro->initialize($self);
+ $self->{distro} = $distro;
+
+ # load module for the requested export type:
+ my $fsModuleName = $supportedExportFileSystems{$exportFS};
+ my $exporter =
+ instantiateClass("OpenSLX::OSExport::FileSystem::$fsModuleName");
+ if (length($exportBD)) {
+ my $blockModuleName = $supportedExportBlockDevices{$exportBD};
+ my $blockDevice =
+ instantiateClass("OpenSLX::OSExport::BlockDevice::$blockModuleName");
+ $blockDevice->initialize($self, $exporter);
+ $exporter->initialize($self, $blockDevice);
+ } else {
+ $exporter->initialize($self);
+ }
+ $self->{'exporter'} = $exporter;
+
+ $self->{'vendor-os-path'} =
+ "$openslxConfig{'private-path'}/stage1/$vendorOSName";
+
+ return;
+}
+
+sub _addExportToConfigDB
+{
+ my $self = shift;
+
+ my $openslxDB = instantiateClass("OpenSLX::ConfigDB");
+ $openslxDB->connect();
+
+ my $export = $openslxDB->fetchExportByFilter(
+ {
+ 'name' => $self->{'export-name'},
+ 'vendor_os_id' => $self->{'vendor-os-id'},
+ }
+ );
+ if (defined $export) {
+ vlog(
+ 0,
+ _tr(
+ "No need to change export '%s' in OpenSLX-database.\n",
+ $self->{'export-name'}
+ )
+ );
+ $self->{exporter}->showExportConfigInfo($export);
+ } else {
+ $export = {
+ 'vendor_os_id' => $self->{'vendor-os-id'},
+ 'name' => $self->{'export-name'},
+ 'type' => $self->{'export-type'},
+ };
+
+ my $id = $self->{exporter}->addExportToConfigDB($export, $openslxDB);
+ vlog(
+ 0,
+ _tr(
+ "Export '%s' has been added to DB (ID=%s)...\n",
+ $self->{'export-name'}, $id
+ )
+ );
+
+ $self->{exporter}->showExportConfigInfo($export) if $id;
+ }
+
+ my $system = $openslxDB->fetchSystemByFilter({
+ 'name' => $self->{'export-name'},
+ });
+ if (!defined $system) {
+ # now create a default system for that export, using the standard kernel:
+ system("slxconfig add-system $self->{'export-name'}");
+ }
+
+ $openslxDB->disconnect();
+ return;
+}
+
+sub _removeExportFromConfigDB
+{
+ my $self = shift;
+
+ my $openslxDB = instantiateClass("OpenSLX::ConfigDB");
+ $openslxDB->connect();
+
+ # remove export from DB:
+ my $exportName = $self->{'export-name'};
+ my $export = $openslxDB->fetchExportByFilter({'name' => $exportName,});
+ if (!defined $export) {
+ vlog(
+ 0,
+ _tr(
+ "Export '%s' doesn't exist in OpenSLX-database.\n", $exportName
+ )
+ );
+ } else {
+ # remove all systems using this export and then remove the
+ # export itself:
+ my @systemIDs =
+ map { $_->{id} }
+ $openslxDB->fetchSystemByFilter({'export_id' => $export->{id}}, 'id');
+ vlog(
+ 1,
+ _tr(
+ "removing systems '%s' from DB, since they belong to the export"
+ . " being deleted.\n",
+ join ',',
+ @systemIDs
+ )
+ );
+ $openslxDB->removeSystem(\@systemIDs);
+ $openslxDB->removeExport($export->{id});
+ vlog(0, _tr("Export '%s' has been removed from DB.\n", $exportName));
+ }
+
+ $openslxDB->disconnect();
+ return;
+}
+
+1;
+################################################################################
+
+=pod
+
+=head1 NAME
+
+OpenSLX::OSExport::Engine -
+
+=head1 SYNOPSIS
+
+=head1 DESCRIPTION
+
+...
+
+=cut
+
diff --git a/src/installer/OpenSLX/OSExport/FileSystem/Base.pm b/src/installer/OpenSLX/OSExport/FileSystem/Base.pm
new file mode 100644
index 00000000..05f3c6a0
--- /dev/null
+++ b/src/installer/OpenSLX/OSExport/FileSystem/Base.pm
@@ -0,0 +1,148 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# Base.pm
+# - provides empty base of the OpenSLX OSExport::FileSystem API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSExport::FileSystem::Base;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+use File::Basename;
+use Scalar::Util qw( weaken );
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ confess "Creating OpenSLX::OSExport::FileSystem::Base-objects directly makes no sense!";
+}
+
+sub initialize
+{
+ my $self = shift;
+ my $engine = shift;
+
+ $self->{'engine'} = $engine;
+ weaken($self->{'engine'});
+ # avoid circular reference between file-system and its engine
+}
+
+sub exportVendorOS
+{
+}
+
+sub purgeExport
+{
+}
+
+sub checkRequirements
+{
+ return 1;
+}
+
+sub addExportToConfigDB
+{
+ my $self = shift;
+ my $export = shift;
+ my $openslxDB = shift;
+
+ return $openslxDB->addExport($export);
+}
+
+sub generateExportURI
+{
+}
+
+sub requiredFSMods
+{
+}
+
+sub requiredFSTools
+{
+}
+
+sub showExportConfigInfo
+{
+}
+
+################################################################################
+### implementation methods
+################################################################################
+sub _pickKernelVersion
+{
+ my $self = shift;
+ my $vendorOSPath = shift;
+
+ my $kernel = followLink("$vendorOSPath/boot/vmlinuz");
+ if (!-e $kernel) {
+ # 'vmlinuz'-link doesn't exist, so we have to pick the kernel manually
+ my $osSetupEngine = instantiateClass("OpenSLX::OSSetup::Engine");
+ $osSetupEngine->initialize($self->{engine}->{'vendor-os-name'}, 'none');
+ $kernel = $osSetupEngine->pickKernelFile("$vendorOSPath/boot");
+ }
+ my $kernelName = basename($kernel);
+ if ($kernelName !~ m[-(.+)$]) {
+ die _tr("unable to determine version of kernel '%s'!", $kernelName);
+ }
+ return $1;
+}
+
+sub _locateKernelModule
+{
+ my $self = shift;
+ my $vendorOSPath = shift;
+ my $moduleName = shift;
+ my $defaultPaths = shift;
+
+ vlog(1, _tr("locating kernel-module '%s'", $moduleName));
+ # check default paths first:
+ foreach my $defPath (@$defaultPaths) {
+ vlog(2, "trying $defPath/$moduleName");
+ my $target = followLink("$defPath/$moduleName", $vendorOSPath);
+ return $target unless !-e $target;
+ }
+ # use brute force to search for the newest incarnation of the module:
+ use File::Find;
+ my $location;
+ my $locationAge = 9999999;
+ vlog(2, "searching in $vendorOSPath/lib/modules");
+ find sub {
+ return unless $_ eq $moduleName;
+ if (-M _ < $locationAge) {
+ $locationAge = -M _;
+ $location = $File::Find::name;
+ vlog(2, "located at $location (age=$locationAge days)");
+ }
+ }, "$vendorOSPath/lib/modules";
+ if (defined $location) {
+ return followLink($location, $vendorOSPath);
+ }
+ return;
+}
+
+1;
+
+################################################################################
+
+=pod
+
+=head1 NAME
+
+OpenSLX::OSExport::FileSystem::Base - the base class for all OSExport::FileSystems
+
+=cut
diff --git a/src/installer/OpenSLX/OSExport/FileSystem/NFS.pm b/src/installer/OpenSLX/OSExport/FileSystem/NFS.pm
new file mode 100644
index 00000000..9bd2ca87
--- /dev/null
+++ b/src/installer/OpenSLX/OSExport/FileSystem/NFS.pm
@@ -0,0 +1,238 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# NFS.pm
+# - provides NFS-specific overrides of the OpenSLX::OSExport::FileSystem API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSExport::FileSystem::NFS;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSExport::FileSystem::Base);
+
+use File::Basename;
+use OpenSLX::Basics;
+use OpenSLX::ConfigDB qw(:support);
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {
+ 'name' => 'nfs',
+ };
+ return bless $self, $class;
+}
+
+sub initialize
+{
+ my $self = shift;
+ my $engine = shift;
+
+ $self->SUPER::initialize($engine);
+
+ my $exportBasePath = "$openslxConfig{'public-path'}/export";
+ $self->{'export-path'} = "$exportBasePath/nfs/$engine->{'vendor-os-name'}";
+ return;
+}
+
+sub exportVendorOS
+{
+ my $self = shift;
+ my $source = shift;
+
+ my $target = $self->{'export-path'};
+ if ($self->_isTargetBindMounted($source, $target)) {
+ warn _tr(
+ "%s is a bind-mount to vendor-OS root - rsync step is skipped!",
+ $target
+ );
+ return;
+ }
+
+ $self->_copyViaRsync($source, $target);
+
+ return;
+}
+
+sub purgeExport
+{
+ my $self = shift;
+
+ my $source = $self->{'engine'}->{'vendor-os-path'};
+ my $target = $self->{'export-path'};
+ if ($self->_isTargetBindMounted($source, $target)) {
+ warn _tr(
+ "%s is a bind-mount to vendor-OS root - removal step is skipped!",
+ $target
+ );
+ return;
+ }
+
+ if (system("rm -r $target")) {
+ vlog(0, _tr("unable to remove export '%s'!", $target));
+ return 0;
+ }
+ return 1;
+}
+
+sub checkRequirements
+{
+ my $self = shift;
+ my $vendorOSPath = shift;
+
+ # determine most appropriate kernel version ...
+ my $kernelVer = $self->_pickKernelVersion($vendorOSPath);
+
+ # ... and check if that kernel-version provides all the required modules
+ my $nfsMod = $self->_locateKernelModule(
+ $vendorOSPath,
+ 'nfs.ko',
+ [
+ "$vendorOSPath/lib/modules/$kernelVer/kernel/fs/nfs",
+ "$vendorOSPath/lib/modules/$kernelVer/kernel/fs"
+ ]
+ );
+ if (!defined $nfsMod) {
+ warn _tr("unable to find nfs-module for kernel version '%s'.",
+ $kernelVer);
+ return;
+ }
+ return 1;
+}
+
+sub generateExportURI
+{
+ my $self = shift;
+ my $export = shift;
+ my $vendorOS = shift;
+
+ my $serverIP = $export->{server_ip} || '';
+ my $server
+ = length($serverIP) ? $serverIP : generatePlaceholderFor('serverip');
+ my $port = $export->{port} || '';
+ $server .= ":$port" if length($port);
+
+ my $exportPath = "$openslxConfig{'public-path'}/export";
+ return "nfs://$server$exportPath/nfs/$vendorOS->{name}";
+}
+
+sub requiredFSMods
+{
+ my $self = shift;
+
+ return qw( nfs );
+}
+
+sub showExportConfigInfo
+{
+ my $self = shift;
+ my $export = shift;
+
+ print (('#' x 80)."\n");
+ print _tr("Please make sure the following line is contained in /etc/exports\nin order to activate the NFS-export of this vendor-OS:\n\t%s\n",
+ "$self->{'export-path'}\t*(ro,no_root_squash,async,no_subtree_check)");
+ print (('#' x 80)."\n");
+
+# TODO : add something a bit more clever here...
+# my $exports = slurpFile("/etc/exports");
+ return;
+}
+
+################################################################################
+### implementation methods
+################################################################################
+sub _copyViaRsync
+{
+ my $self = shift;
+ my $source = shift;
+ my $target = shift;
+
+ if (system("mkdir -p $target")) {
+ die _tr("unable to create directory '%s', giving up! (%s)\n",
+ $target, $!);
+ }
+ my $includeExcludeList = $self->_determineIncludeExcludeList();
+ vlog(1, _tr("using include-exclude-filter:\n%s\n", $includeExcludeList));
+ my $rsyncFH;
+ my $additionalRsyncOptions = $ENV{SLX_RSYNC_OPTIONS} || '';
+ my $rsyncCmd
+ = "rsync -av --delete-excluded --exclude-from=- $additionalRsyncOptions"
+ . " $source/ $target";
+ vlog(2, "executing: $rsyncCmd\n");
+ open($rsyncFH, '|-', $rsyncCmd)
+ or die _tr("unable to start rsync for source '%s', giving up! (%s)",
+ $source, $!);
+ print $rsyncFH $includeExcludeList;
+ close($rsyncFH)
+ or die _tr("unable to export to target '%s', giving up! (%s)",
+ $target, $!);
+ return;
+}
+
+sub _determineIncludeExcludeList
+{
+ my $self = shift;
+
+ # Rsync uses a first match strategy, so we mix the local specifications
+ # in front of the filterset given by the package (as the local filters
+ # should always overrule the vendor filters):
+ my $distroName = $self->{engine}->{'distro-name'};
+ my $localFilterFile
+ = "$openslxConfig{'config-path'}/distro-info/$distroName/export-filter";
+ my $includeExcludeList
+ = slurpFile($localFilterFile, { failIfMissing => 0 });
+ $includeExcludeList .= $self->{engine}->{distro}->{'export-filter'};
+ $includeExcludeList =~ s[^\s+][]igms;
+ # remove any leading whitespace, as rsync doesn't like it
+ return $includeExcludeList;
+}
+
+sub _isTargetBindMounted
+{
+ my $self = shift;
+ my $source = shift;
+ my $target = shift;
+
+ # For development purposes, it is very desirable to be able to take a
+ # shortcut that avoids doing the actual copying of the folders (as that
+ # takes a considerable amount of time).
+ # In order to support this, we explicitly check if the OpenSLX NFS export
+ # root folder (/srv/openslx/export/nfs) is a bind-mount of the OpenSLX
+ # stage1 folder (/var/opt/openslx/stage1).
+ # If that is the case, we print a notice and skip the rsync step (which
+ # wouldn't work anyway, as source and target folder are the same).
+ my $stage1Root = dirname($source);
+ my $nfsRoot = dirname($target);
+ chomp(my $canonicalStage1Root = qx{readlink -f $stage1Root} || $stage1Root);
+ chomp(my $canonicalNFSRoot = qx{readlink -f $nfsRoot} || $nfsRoot);
+ my @mounts = slurpFile('/etc/mtab');
+ for my $mount (@mounts) {
+ if ($mount =~ m{
+ ^
+ $canonicalStage1Root # mount source
+ \s+
+ $canonicalNFSRoot # mount target
+ \s+
+ none # filesystem for bind mounts is 'none'
+ \s+
+ \S*\bbind\b\S* # look for bind mounts only
+ }gmsx) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+1;
diff --git a/src/installer/OpenSLX/OSExport/FileSystem/SquashFS.pm b/src/installer/OpenSLX/OSExport/FileSystem/SquashFS.pm
new file mode 100644
index 00000000..77034c9c
--- /dev/null
+++ b/src/installer/OpenSLX/OSExport/FileSystem/SquashFS.pm
@@ -0,0 +1,410 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# SquashFS.pm
+# - provides SquashFS-specific overrides of the OpenSLX::OSExport::ExportType
+# API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSExport::FileSystem::SquashFS;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSExport::FileSystem::Base);
+
+use File::Basename;
+use OpenSLX::Basics;
+use OpenSLX::ConfigDB qw(:support);
+use OpenSLX::OSExport::FileSystem::Base 1;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {'name' => 'sqfs',};
+ return bless $self, $class;
+}
+
+sub initialize
+{
+ my $self = shift;
+ my $engine = shift;
+ my $blockDevice = shift || confess('need to pass in block-device!');
+
+ $self->SUPER::initialize($engine);
+
+ $self->{'block-device'} = $blockDevice;
+ my $exportBasePath = "$openslxConfig{'public-path'}/export";
+ $self->{'export-path'} = "$exportBasePath/sqfs/$engine->{'vendor-os-name'}";
+ return;
+}
+
+sub exportVendorOS
+{
+ my $self = shift;
+ my $source = shift;
+
+ my $includeExcludeList = $self->_determineIncludeExcludeList();
+ # in order to do the filtering as part of mksquashfs, we need to map
+ # our internal (rsync-)filter format to regexes:
+ $includeExcludeList =
+ $self->_mapRsyncFilter2Regex($source, $includeExcludeList);
+ vlog(1, _tr("using include-exclude-filter:\n%s\n", $includeExcludeList));
+ my $target = $self->{'export-path'};
+
+ my $sourceTime = (stat($source))[9] || 0;
+ my $targetTime = (stat($target))[9] || 0;
+ vlog(2, "source-time=$sourceTime target-time=$targetTime");
+
+ if ($targetTime && $sourceTime < $targetTime) {
+ vlog(
+ 0,
+ "!!! creation of squashfs skipped, as vendor-OS hasn't changed since last export!\n"
+ . "!!! Use 'touch $source' to force an export."
+ );
+ } else {
+ $self->_createSquashFS($source, $target, $includeExcludeList);
+ }
+ $self->_addBlockDeviceTagToExport($target);
+ return;
+}
+
+sub purgeExport
+{
+ my $self = shift;
+
+ my $target = $self->{'export-path'};
+ if ($self->_removeBlockDeviceTagFromExport($target)) {
+ # no more tags, we can remove the image:
+ if (slxsystem("rm $target")) {
+ vlog(0, _tr("unable to remove export '%s'!", $target));
+ return 0;
+ }
+ }
+ return 1;
+}
+
+sub checkRequirements
+{
+ my $self = shift;
+ my $vendorOSPath = shift;
+
+ # determine most appropriate kernel version ...
+ my $kernelVer = $self->_pickKernelVersion($vendorOSPath);
+
+ # ... and check if that kernel-version provides all the required modules
+ my @blockModNames = $self->{'block-device'}->requiredBlockDeviceModules();
+ foreach my $blockModName (@blockModNames) {
+ my $blockMod =
+ $self->_locateKernelModule($vendorOSPath, "$blockModName.ko",
+ ["$vendorOSPath/lib/modules/$kernelVer/kernel/drivers/block"]);
+ if (!defined $blockMod) {
+ warn _tr(
+ "unable to find blockdevice-module '%s' for kernel version '%s'.",
+ $blockModName, $kernelVer
+ );
+ return;
+ }
+ }
+ my $squashfsMod = $self->_locateKernelModule(
+ $vendorOSPath,
+ 'squashfs.ko',
+ [
+ "$vendorOSPath/lib/modules/$kernelVer/kernel/fs/squashfs",
+ "$vendorOSPath/lib/modules/$kernelVer/kernel/fs"
+ ]
+ );
+ if (!defined $squashfsMod) {
+ warn _tr("unable to find squashfs-module for kernel version '%s'.",
+ $kernelVer);
+ return;
+ }
+ return 1;
+}
+
+sub addExportToConfigDB
+{
+ my $self = shift;
+ my $export = shift;
+ my $openslxDB = shift;
+
+ $export->{port} = $self->{'block-device'}->getExportPort($openslxDB);
+
+ my $res = $openslxDB->addExport($export);
+ return $res;
+}
+
+sub generateExportURI
+{
+ my $self = shift;
+ my $export = shift;
+ my $vendorOS = shift;
+
+ my $URI = $self->{'block-device'}->generateExportURI($export);
+ $URI .= '/squashfs';
+ return $URI;
+}
+
+sub requiredFSMods
+{
+ my $self = shift;
+
+ my @mods = $self->{'block-device'}->requiredBlockDeviceModules();
+ push @mods, 'squashfs ';
+ return @mods;
+}
+
+sub requiredFSTools
+{
+ my $self = shift;
+
+ return $self->{'block-device'}->requiredBlockDeviceTools();
+}
+
+sub showExportConfigInfo
+{
+ my $self = shift;
+ my $export = shift;
+
+ $self->{'block-device'}->showExportConfigInfo($export);
+ return;
+}
+
+################################################################################
+### implementation methods
+################################################################################
+
+#################################################################################
+# Branch to choose the appropriate squashfs version according to target system #
+################################################################################
+
+sub _createSquashFS
+{
+ my $self = shift;
+ my $source = shift;
+ my $target = shift;
+ my $includeExcludeList = shift;
+
+
+ my @versionString = split(/-/, $self->{engine}->{'vendor-os-name'});
+ my $mksquashfsVersion = $self->{engine}->{distro}->getSquashfsVersion($versionString[1]);
+
+ vlog(0, "found version string $versionString[1] out of $self->{engine}->{'vendor-os-name'}");
+ vlog(0, "use squashfs version: $mksquashfsVersion");
+
+ $self->_createSquashFS_prepare($target);
+
+ my $mksquashfsParams;
+
+ $mksquashfsVersion == '3.2' && do
+ {$mksquashfsParams = $self->_createSquashFS_setup_3_2($includeExcludeList)};
+ $mksquashfsVersion == '3.3' && do
+ {$mksquashfsParams = $self->_createSquashFS_setup_3_3($includeExcludeList)};
+ $mksquashfsVersion == '4.0' && do
+ {$mksquashfsParams = $self->_createSquashFS_setup_4($includeExcludeList)};
+
+ $self->_createSquashFS_run($source, $target, $mksquashfsParams);
+
+ return;
+}
+
+sub _createSquashFS_prepare
+{
+ my $self = shift;
+ my $target = shift;
+
+ system("rm -f $target");
+ # mksquasfs isn't significantly faster if fs already exists, but it
+ # causes the filesystem to grow somewhat, so we remove it in order to
+ # get the smallest FS-file possible.
+
+ my $baseDir = dirname($target);
+ if (!-e $baseDir) {
+ if (system("mkdir -p $baseDir")) {
+ die _tr("unable to create directory '%s', giving up! (%s)\n",
+ $baseDir, $!);
+ }
+ }
+ return;
+}
+
+
+sub _createSquashFS_run {
+ my $self = shift;
+ my $source = shift;
+ my $target = shift;
+ my $params = shift;
+
+ # ... invoke mksquashfs ...
+ vlog(0, _tr("invoking mksquashfs..."));
+ my $mksquashfsBinary =
+ "$openslxConfig{'base-path'}/share/squashfs/$params->{binary}";
+ my $res =
+ system("$mksquashfsBinary $source $target $params->{cmdlineOptions}");
+ unlink($params->{tmpfile});
+ # ... remove filter file if done
+ if ($res) {
+ die _tr(
+ "unable to create squashfs for source '%s' as target '%s', giving up! (%s)",
+ $source, $target, $!);
+ }
+ return;
+}
+
+sub _createSquashFS_setup_4
+{
+ my $self = shift;
+ my $includeExcludeList = shift;
+
+ # dump filter to a file ...
+ my $filterFile = "/tmp/slx-nbdsquash-filter-$$";
+ my $includeFile = "/tmp/slx-nbdsquash-includes-$$";
+ spitFile($filterFile, $includeExcludeList);
+
+ slxsystem("sed $filterFile -e '/^-/d' -e 's/^+[ \t]*//' > $includeFile");
+ slxsystem("sed -i $filterFile -e '/^+/d' -e 's/^-[ \t]*//'");
+
+ my $result = {
+ binary => "mksquashfs_4",
+ cmdlineOptions => "-wildcards -ef $filterFile",
+ tmpfile => "$filterFile"
+ };
+
+ return $result;
+}
+
+
+sub _createSquashFS_setup_3_3
+{
+ my $self = shift;
+ my $includeExcludeList = shift;
+
+ # dump filter to a file ...
+ my $filterFile = "/tmp/slx-nbdsquash-filter-$$";
+ my $includeFile = "/tmp/slx-nbdsquash-includes-$$";
+ spitFile($filterFile, $includeExcludeList);
+
+ slxsystem("sed $filterFile -e '/^-/d' -e 's/^+[ \t]*//' > $includeFile");
+ slxsystem("sed -i $filterFile -e '/^+/d' -e 's/^-[ \t]*//'");
+
+ my $result = {
+ binary => "mksquashfs_3_3",
+ cmdlineOptions => "-wildcards -ef $filterFile",
+ tmpfile => "$filterFile"
+ };
+
+ return $result;
+}
+
+
+sub _createSquashFS_setup_3_2
+{
+ my $self = shift;
+ my $includeExcludeList = shift;
+
+ # dump filter to a file ...
+ my $filterFile = "/tmp/slx-nbdsquash-filter-$$";
+ spitFile($filterFile, $includeExcludeList);
+
+ my $result = {
+ binary => "mksquashfs_3_2",
+ cmdlineOptions => "-ff $filterFile",
+ tmpfile => "$filterFile"
+ };
+
+ return $result;
+}
+
+sub _determineIncludeExcludeList
+{
+ my $self = shift;
+
+ # Rsync uses a first match strategy, so we mix the local specifications
+ # in front of the filterset given by the package (as the local filters
+ # should always overrule the vendor filters):
+ my $distroName = $self->{engine}->{'distro-name'};
+ my $localFilterFile =
+ "$openslxConfig{'config-path'}/distro-info/$distroName/export-filter";
+ my $includeExcludeList
+ = slurpFile($localFilterFile, { failIfMissing => 0 });
+ $includeExcludeList .= $self->{engine}->{distro}->{'export-filter'};
+ $includeExcludeList =~ s[^\s+][]igms;
+ # remove any leading whitespace, as rsync doesn't like it
+ return $includeExcludeList;
+}
+
+sub _mapRsyncFilter2Regex
+{
+ my $self = shift;
+ my $sourcePath = shift;
+ my $rsyncFilter = shift;
+
+ return join(
+ "\n",
+ map {
+ if ($_ =~ m[^([-+]\s*)(.+?)\s*$])
+ {
+ my $action = $1;
+ my $regex = $2;
+ $regex =~ s[\*\*][.+]g;
+ # '**' matches everything
+ $regex =~ s[\*][[^/]+]g;
+ # '*' matches anything except slashes
+ $regex =~ s[\?][[^/]?]g;
+ # '*' matches any single char except slash
+ $regex =~ s[\?][[^/]?]g;
+ # '*' matches any single char except slash
+ $regex =~ s[\.][\\.]g;
+ # escape any dots
+ if (substr($regex, 0, 1) eq '/') {
+ # absolute path given, need to extend by source-path:
+ "$action^$sourcePath$regex\$";
+ } else {
+ # filename pattern given, need to anchor to the end only:
+ "$action$regex\$";
+ }
+ } else {
+ $_;
+ }
+ }
+ split "\n",
+ $rsyncFilter
+ );
+}
+
+sub _addBlockDeviceTagToExport
+{
+ my $self = shift;
+ my $target = shift;
+
+ my $tagName = "$target" . '@' . lc($self->{'block-device'}->{name});
+ linkFile(basename($target), $tagName);
+ return;
+}
+
+sub _removeBlockDeviceTagFromExport
+{
+ my $self = shift;
+ my $target = shift;
+
+ my $tagName = "$target" . '@' . lc($self->{'block-device'}->{name});
+ slxsystem("rm $tagName");
+ # now find out whether or not there are any other tags left:
+ my $vendorOSName = basename($target);
+ opendir(DIR, dirname($target));
+ my @tags = grep { /^$vendorOSName\@/ } readdir(DIR);
+ return @tags ? 0 : 1;
+ # return 1 if no more tags (i.e. it is safe to remove the image)
+}
+
+1;
diff --git a/src/installer/OpenSLX/OSSetup/Distro/Any_Clone.pm b/src/installer/OpenSLX/OSSetup/Distro/Any_Clone.pm
new file mode 100644
index 00000000..43385a29
--- /dev/null
+++ b/src/installer/OpenSLX/OSSetup/Distro/Any_Clone.pm
@@ -0,0 +1,31 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# OSSetup/Distro/Any_Clone.pm
+# - provides generic clone-only overrides of the OSSetup Distro API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSSetup::Distro::Any_Clone;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSSetup::Distro::Base);
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {};
+ return bless $self, $class;
+}
+
+1; \ No newline at end of file
diff --git a/src/installer/OpenSLX/OSSetup/Distro/Base.pm b/src/installer/OpenSLX/OSSetup/Distro/Base.pm
new file mode 100644
index 00000000..c356e6d9
--- /dev/null
+++ b/src/installer/OpenSLX/OSSetup/Distro/Base.pm
@@ -0,0 +1,371 @@
+# Copyright (c) 2006..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# OSSetup/Distro/Base.pm
+# - provides base implementation of the OSSetup Distro API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSSetup::Distro::Base;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+use Fcntl qw(:DEFAULT :flock);
+use File::Basename;
+use File::Path;
+use Scalar::Util qw( weaken );
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### 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;
+ weaken($self->{'engine'});
+ # avoid circular reference between distro and its engine
+
+ if ($engine->{'distro-name'} =~ m[x86_64]) {
+ # be careful to only try installing 64-bit systems if actually
+ # running on a 64-bit host, as otherwise we are going to fail later,
+ # anyway:
+ my $arch = `uname -m`;
+ if ($?) {
+ die _tr("unable to determine architecture of host system (%s)\n", $!);
+ }
+ if ($arch !~ m[x86_64]) {
+ die _tr("you can't install a 64-bit system on a 32-bit host, sorry!\n");
+ }
+ }
+
+ $self->{'stage1a-binaries'} = {
+ "$openslxConfig{'base-path'}/share/busybox/busybox" => 'bin',
+ };
+
+ $self->{'stage1b-faked-files'} = [
+ '/etc/mtab',
+ ];
+
+ $self->{'stage1c-faked-files'} = [
+ ];
+
+ $self->{'clone-filter'} = "
+ + /var
+ - /var/tmp/*
+ - /var/spool/*
+ - /var/cache/apt/archives/*.deb
+ - /var/cache/apt/archives/lock
+ - /var/cache/apt/archives/partial/*
+ + /var/cache/apt/archives/partial
+ - /var/tmp/*
+ + /var/tmp/apt
+ - /var/opt/openslx
+ - /var/lib/vmware
+ - /var/lib/ntp/*
+ - /var/run/*
+ + /var/run/screen
+ - /var/log/*
+ + /var/log/apt
+ - /usr/lib/vmware/modules/*
+ + /usr
+ - /tmp/*
+ + /tmp
+ - /sys/*
+ + /sys
+ + /sbin
+ - /root/*
+ + /root
+ - /proc/*
+ + /proc
+ - /opt/openslx
+ + /opt
+ - /media/*
+ + /media
+ - /mnt/*
+ + /mnt
+ + /lib64
+ - /lib/ld-uClibc*
+ + /lib
+ - /home/*
+ + /home
+ - /etc/vmware/*
+ + /etc/vmware
+ - /etc/vmware-installer
+ - /etc/grub*
+ - /etc/shadow*
+ - /etc/samba/secrets.tdb
+ - /etc/resolv.conf.*
+ - /etc/opt/openslx
+ + /etc/opt/openslx
+ - /etc/exports*
+ - /etc/X11/xorg.*
+ - /etc/X11/XF86*
+ + /etc
+ - /dev/*
+ + /dev
+ + /boot
+ + /bin
+ - /*
+ - .svn
+ - .git
+ - .*.cmd
+ - *~
+ - *lost+found*
+ - *.old
+ - *.bak
+ ";
+
+ return;
+}
+
+sub fixPrerequiredFiles
+{
+}
+
+sub startSession
+{
+ my $self = shift;
+ my $osDir = shift;
+
+ # setup a fixed locale environment to avoid warnings about unset locales
+ # (like for instance shown by apt-get)
+ $ENV{LC_ALL} = 'POSIX';
+
+ # ensure that a couple of important devices exist
+ my %devInfo = (
+ mem => { type => 'c', major => '1', minor => '1' },
+ null => { type => 'c', major => '1', minor => '3' },
+ zero => { type => 'c', major => '1', minor => '5' },
+ random => { type => 'c', major => '1', minor => '8' },
+ urandom => { type => 'c', major => '1', minor => '9' },
+ kmsg => { type => 'c', major => '1', minor => '11' },
+ tty => { type => 'c', major => '5', minor => '0' },
+ console => { type => 'c', major => '5', minor => '1' },
+ ptmx => { type => 'c', major => '5', minor => '2' },
+ );
+ if (!-e "$osDir/dev" && !mkpath("$osDir/dev")) {
+ die _tr("unable to create folder '%s' (%s)\n", "$osDir/dev", $!);
+ }
+ foreach my $dev (keys %devInfo) {
+ my $info = $devInfo{$dev};
+ if (!-e "$osDir//dev/$dev") {
+ if (slxsystem(
+ "mknod $osDir//dev/$dev $info->{type} $info->{major} $info->{minor}"
+ )) {
+ croak(_tr("unable to create dev-node '%s'! (%s)", $dev, $!));
+ }
+ }
+ }
+
+ # enter chroot jail
+ chrootInto($osDir);
+ $ENV{PATH} = join(':', @{$self->getDefaultPathList()});
+
+ # mount /proc (if we have 'mount' available)
+ if (qx{which mount 2>/dev/null}) {
+ if (!-e '/proc' && !mkpath('/proc')) {
+ die _tr("unable to create folder '%s' (%s)\n", "$osDir/proc", $!);
+ }
+ if (slxsystem("mount -t proc proc '/proc'")) {
+ warn _tr("unable to mount '%s' (%s)\n", "$osDir/proc", $!);
+ }
+ if (!-e '/dev/pts' && !mkpath('/dev/pts')) {
+ die _tr("unable to create folder '%s' (%s)\n", "$osDir/dev/pts", $!);
+ }
+ if (slxsystem("mount -t devpts devpts '/dev/pts'")) {
+ warn _tr("unable to mount '%s' (%s)\n", "$osDir/dev/pts", $!);
+ }
+ }
+
+ return 1;
+}
+
+sub finishSession
+{
+ my $self = shift;
+
+ # umount /proc, /dev/pts (if we have 'umount' available)
+ if (qx{which umount 2>/dev/null}) {
+ if (slxsystem("umount /proc")) {
+ warn _tr("unable to umount '%s' (%s)\n", "/proc", $!);
+ }
+ if (slxsystem("umount /dev/pts")) {
+ warn _tr("unable to umount '%s' (%s)\n", "/dev/pts", $!);
+ }
+ }
+
+ return 1;
+}
+
+sub getDefaultPathList
+{
+ my $self = shift;
+
+ return [ qw(
+ /sbin
+ /usr/sbin
+ /usr/local/sbin
+ /usr/local/bin
+ /usr/bin
+ /bin
+ /usr/bin/X11
+ /usr/X11R6/bin
+ /opt/kde3/bin
+ /opt/gnome/bin
+ ) ];
+}
+
+sub updateDistroConfig
+{
+ if (slxsystem("ldconfig")) {
+ die _tr("unable to run ldconfig (%s)", $!);
+ }
+}
+
+sub pickKernelFile
+{
+ my $self = shift;
+ my $kernelPath = shift;
+
+ my $newestKernelFile;
+ my $newestKernelFileSortKey = '';
+ my $kernelPattern = '{vmlinuz,kernel-genkernel-x86}-*';
+ foreach my $kernelFile (glob("$kernelPath/$kernelPattern")) {
+ next unless $kernelFile =~ m{
+ (?:vmlinuz|x86)-(\d+)\.(\d+)\.(\d+)(?:\.(\d+))?-(\d+(?:\.\d+)?)
+ }x;
+ my $sortKey
+ = sprintf("%02d.%02d.%02d.%02d-%2.1f", $1, $2, $3, $4||0, $5);
+ if ($newestKernelFileSortKey lt $sortKey) {
+ $newestKernelFile = $kernelFile;
+ $newestKernelFileSortKey = $sortKey;
+ }
+ }
+
+ if (!defined $newestKernelFile) {
+ die _tr("unable to pick a kernel-file from path '%s'!", $kernelPath);
+ }
+ return $newestKernelFile;
+}
+
+sub preSystemInstallationHook
+{
+}
+
+sub postSystemInstallationHook
+{
+}
+
+sub setPasswordForUser
+{
+ my $self = shift;
+ my $username = shift;
+ my $password = shift;
+
+ my $hashedPassword = $self->hashPassword($password);
+
+ my $writePasswordFunction = sub {
+ # now read, change and write shadow-file in atomic manner:
+ my $shadowFile = '/etc/shadow';
+ if (!-e $shadowFile) {
+ spitFile( $shadowFile, '');
+ }
+ slxsystem("cp -r $shadowFile $shadowFile~");
+ my $shadowFH;
+ open($shadowFH, '+<', $shadowFile)
+ or croak _tr("could not open file '%s'! (%s)", $shadowFile, $!);
+ flock($shadowFH, LOCK_EX)
+ or croak _tr("could not lock file '%s'! (%s)", $shadowFile, $!);
+ my $lastChanged = int(time()/24/60/60);
+ my $newEntry
+ = "$username:$hashedPassword:$lastChanged:0:99999:7:::";
+ my $content = do { local $/; <$shadowFH> };
+ if ($content =~ m{^$username:}ims) {
+ $content =~ s{^$username:.+?$}{$newEntry}ms;
+ } else {
+ $content .= "$newEntry\n";
+ }
+ seek($shadowFH, 0, 0)
+ or croak _tr("could not seek file '%s'! (%s)", $shadowFile, $!);
+ print $shadowFH $content
+ or croak _tr("could not write to file '%s'! (%s)", $shadowFile, $!);
+ close($shadowFH)
+ or croak _tr("could not close file '%s'! (%s)", $shadowFile, $!);
+ unlink "$shadowFile~";
+ };
+ $self->{engine}->callChrootedFunctionForVendorOS($writePasswordFunction);
+}
+
+sub hashPassword
+{
+ my $self = shift;
+ my $password = shift;
+
+ my $busyboxBin = $self->{engine}->busyboxBinary();
+ my $hashedPassword = qx{$busyboxBin cryptpw -a md5 $password};
+ chomp $hashedPassword;
+
+ return $hashedPassword;
+}
+
+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/src/installer/OpenSLX/OSSetup/Distro/Debian.pm b/src/installer/OpenSLX/OSSetup/Distro/Debian.pm
new file mode 100644
index 00000000..bdb9dcc1
--- /dev/null
+++ b/src/installer/OpenSLX/OSSetup/Distro/Debian.pm
@@ -0,0 +1,135 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# OSSetup/Distro/Debian.pm
+# - provides Debian-specific overrides of the OSSetup Distro API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSSetup::Distro::Debian;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSSetup::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {};
+ return bless $self, $class;
+}
+
+sub initialize
+{
+ my $self = shift;
+ my $engine = shift;
+
+ $self->SUPER::initialize($engine);
+ $self->{'packager-type'} = 'dpkg';
+ $self->{'meta-packager-type'} = $ENV{SLX_META_PACKAGER} || 'apt';
+ $self->{'stage1c-faked-files'} = [];
+ return;
+}
+
+sub preSystemInstallationHook
+{
+ my $self = shift;
+
+ $self->SUPER::preSystemInstallationHook();
+
+ # create required /dev-entries
+ my %devInfo = (
+ mem => { type => 'c', major => '1', minor => '1' },
+ null => { type => 'c', major => '1', minor => '3' },
+ zero => { type => 'c', major => '1', minor => '5' },
+ random => { type => 'c', major => '1', minor => '8' },
+ urandom => { type => 'c', major => '1', minor => '9' },
+ kmsg => { type => 'c', major => '1', minor => '11' },
+ console => { type => 'c', major => '5', minor => '1' },
+ ptmx => { type => 'c', major => '5', minor => '2' },
+ );
+ foreach my $dev (keys %devInfo) {
+ my $info = $devInfo{$dev};
+ if (!-e "/dev/$dev") {
+ if (slxsystem(
+ "mknod /dev/$dev $info->{type} $info->{major} $info->{minor}"
+ )) {
+ croak(_tr("unable to create dev-node '%s'! (%s)", $dev, $!));
+ }
+ }
+ }
+ foreach my $devDir ('pts', 'shm', '.udevdb', '.udev') {
+ if (!-e "/dev/$devDir") {
+ if (slxsystem("mkdir -p /dev/$devDir")) {
+ croak(_tr("unable to create dev-dir '%s'! (%s)", $devDir, $!));
+ }
+ }
+ }
+
+ # replace /usr/sbin/invoke-rc.d by a dummy, in order to avoid a whole lot
+ # of initscripts being started. Wishful thinking: there should be another
+ # way to stop Debian from doing this, as this is not really very supportive
+ # of folder-based installations (then again: I may simply be too stupid
+ # to find out how it is supposed to work ...)
+ rename('/usr/sbin/invoke-rc.d', '/usr/sbin/_invoke-rc.d');
+ spitFile('/usr/sbin/invoke-rc.d', "#! /bin/sh\nexit 0\n");
+ chmod 0755, '/usr/sbin/invoke-rc.d';
+}
+
+sub startSession
+{
+ my $self = shift;
+ my $osDir = shift;
+
+ $self->SUPER::startSession($osDir);
+
+ # As in preSystemInstallationHook, we replace /usr/sbin/invoke-rc.d by a
+ # dummy.
+ #
+ # During installation, this might not exist yet, so we better check
+ if (-e '/usr/sbin/invoke-rc.d') {
+ rename('/usr/sbin/invoke-rc.d', '/usr/sbin/_invoke-rc.d');
+ spitFile('/usr/sbin/invoke-rc.d', "#! /bin/sh\nexit 0\n");
+ chmod 0755, '/usr/sbin/invoke-rc.d';
+ }
+}
+
+sub finishSession
+{
+ my $self = shift;
+
+ # restore /usr/sbin/invoke-rc.d
+ rename('/usr/sbin/_invoke-rc.d', '/usr/sbin/invoke-rc.d');
+
+ $self->SUPER::finishSession();
+}
+
+sub setPasswordForUser
+{
+ my $self = shift;
+ my $username = shift;
+ my $password = shift;
+
+ # activate shadow passwords
+ my $activateShadowFunction = sub {
+ slxsystem('/sbin/shadowconfig', 'on');
+ };
+ $self->{engine}->callChrootedFunctionForVendorOS($activateShadowFunction);
+
+ # invoke default behaviour
+ $self->SUPER::setPasswordForUser($username, $password);
+}
+
+1; \ No newline at end of file
diff --git a/src/installer/OpenSLX/OSSetup/Distro/Debian_3_1.pm b/src/installer/OpenSLX/OSSetup/Distro/Debian_3_1.pm
new file mode 100644
index 00000000..03c6fdf9
--- /dev/null
+++ b/src/installer/OpenSLX/OSSetup/Distro/Debian_3_1.pm
@@ -0,0 +1,74 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# OSSetup/Distro/Debian_3_1.pm
+# - provides Debian-3.1-specific overrides of the OSSetup Distro API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSSetup::Distro::Debian_3_1;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSSetup::Distro::Debian);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### implementation
+################################################################################
+sub preSystemInstallationHook
+{
+ my $self = shift;
+
+ $self->SUPER::preSystemInstallationHook();
+
+ # when the kernel package is being configured, it insists on trying to
+ # create an initrd, which neither works nor makes sense in our environment.
+ #
+ # in order to circumvent this problem, we manually install initrd-tools
+ # (which contains mkinitrd) ...
+ $self->{engine}->{'meta-packager'}->installPackages('initrd-tools');
+ # ... and replace /usr/sbin/mkinitrd with a dummy, in order to skip the
+ # initrd-creation.
+ rename('/usr/sbin/mkinitrd', '/usr/sbin/_mkinitrd');
+ spitFile('/usr/sbin/mkinitrd', "#! /bin/sh\ntouch \$2\n");
+ chmod 0755, '/usr/sbin/mkinitrd';
+}
+
+sub startSession
+{
+ my $self = shift;
+ my $osDir = shift;
+
+ $self->SUPER::startSession($osDir);
+
+ # As in preSystemInstallationHook, we replace /usr/sbin/mkinitrd with a
+ # dummy, in order to skip the initrd-creation.
+ #
+ # During installation, this might not exist yet, so we better check
+ if (-e '/usr/sbin/mkinitrd') {
+ rename('/usr/sbin/mkinitrd', '/usr/sbin/_mkinitrd');
+ spitFile('/usr/sbin/mkinitrd', "#! /bin/sh\ntouch \$2\n");
+ chmod 0755, '/usr/sbin/mkinitrd';
+ }
+}
+
+sub finishSession
+{
+ my $self = shift;
+
+ # restore /usr/sbin/mkinitrd
+ rename('/usr/sbin/_mkinitrd', '/usr/sbin/mkinitrd');
+
+ $self->SUPER::finishSession();
+}
+
+1; \ No newline at end of file
diff --git a/src/installer/OpenSLX/OSSetup/Distro/Fedora.pm b/src/installer/OpenSLX/OSSetup/Distro/Fedora.pm
new file mode 100644
index 00000000..80480340
--- /dev/null
+++ b/src/installer/OpenSLX/OSSetup/Distro/Fedora.pm
@@ -0,0 +1,48 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# OSSetup/Distro/Fedora.pm
+# - provides Fedora-specific overrides of the OSSetup Distro API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSSetup::Distro::Fedora;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSSetup::Distro::Base);
+
+use OpenSLX::Basics;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {};
+ 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';
+ $self->{'stage1c-faked-files'} = [
+ '/etc/fstab',
+ '/etc/mtab',
+ ];
+ return;
+}
+
+1; \ No newline at end of file
diff --git a/src/installer/OpenSLX/OSSetup/Distro/Gentoo.pm b/src/installer/OpenSLX/OSSetup/Distro/Gentoo.pm
new file mode 100644
index 00000000..79fd0e29
--- /dev/null
+++ b/src/installer/OpenSLX/OSSetup/Distro/Gentoo.pm
@@ -0,0 +1,33 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# OSSetup/Distro/Gentoo.pm
+# - provides Gentoo-specific overrides of the OSSetup Distro API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSSetup::Distro::Gentoo;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSSetup::Distro::Base);
+
+use OpenSLX::Basics;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {};
+ return bless $self, $class;
+}
+
+1;
diff --git a/src/installer/OpenSLX/OSSetup/Distro/Scilin.pm b/src/installer/OpenSLX/OSSetup/Distro/Scilin.pm
new file mode 100644
index 00000000..e1ce5fc3
--- /dev/null
+++ b/src/installer/OpenSLX/OSSetup/Distro/Scilin.pm
@@ -0,0 +1,48 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# OSSetup/Distro/Scilin.pm
+# - provides Scientific Linux specific overrides of the OSSetup Distro API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSSetup::Distro::Scilin;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSSetup::Distro::Base);
+
+use OpenSLX::Basics;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {};
+ 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';
+ $self->{'stage1c-faked-files'} = [
+ '/etc/fstab',
+ '/etc/mtab',
+ ];
+ return;
+}
+
+1;
diff --git a/src/installer/OpenSLX/OSSetup/Distro/Suse.pm b/src/installer/OpenSLX/OSSetup/Distro/Suse.pm
new file mode 100644
index 00000000..8e85e46a
--- /dev/null
+++ b/src/installer/OpenSLX/OSSetup/Distro/Suse.pm
@@ -0,0 +1,98 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# OSSetup/Distro/Suse.pm
+# - provides SUSE-specific overrides of the OSSetup Distro API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSSetup::Distro::Suse;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSSetup::Distro::Base);
+
+use OpenSLX::Basics;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {};
+ return bless $self, $class;
+}
+
+sub initialize
+{
+ my $self = shift;
+ my $engine = shift;
+
+ $self->SUPER::initialize($engine);
+ $self->{'packager-type'} = 'rpm';
+
+ # use 'zypper' as meta-packager from 10.2 onwards and use 'smart' for
+ # older releases
+ my $defaultMetaPackager = 'zypper';
+ if ($self->{'engine'}->{'distro-name'} =~ m{-([^-]+)$}) {
+ my $distroVersion = 0.0 + $1;
+ if ($distroVersion <= 10.2) {
+ $defaultMetaPackager = 'smart';
+ }
+ }
+ $self->{'meta-packager-type'}
+ = $ENV{SLX_META_PACKAGER} || $defaultMetaPackager;
+
+ if ($engine->{'action-type'} eq 'install') {
+ # Inform SUSE RPMs that we're performing an installation - this is
+ # only important for installations taking place in stage 1c:
+ $ENV{YAST_IS_RUNNING} = "instsys";
+ }
+
+ return;
+}
+
+sub fixPrerequiredFiles
+{
+ my $self = shift;
+ my $stage1cDir = shift;
+
+ chown(
+ 0, 0, "$stage1cDir/etc/group", "$stage1cDir/etc/passwd",
+ "$stage1cDir/etc/shadow"
+ );
+ return;
+}
+
+sub updateDistroConfig
+{
+ my $self = shift;
+
+ # invoke SuSEconfig in order to allow it to update the configuration:
+ if (slxsystem('SuSEconfig')) {
+ die _tr("unable to run SuSEconfig (%s)", $!);
+ }
+ $self->SUPER::updateDistroConfig();
+ return;
+}
+
+sub hashPassword
+{
+ my $self = shift;
+ my $password = shift;
+
+ my $busyboxBin = $self->{engine}->busyboxBinary();
+ my $hashedPassword = qx{$busyboxBin cryptpw -a blowfish '$password'};
+ chomp $hashedPassword;
+
+ return $hashedPassword;
+}
+
+1;
diff --git a/src/installer/OpenSLX/OSSetup/Distro/Ubuntu.pm b/src/installer/OpenSLX/OSSetup/Distro/Ubuntu.pm
new file mode 100644
index 00000000..f0f42487
--- /dev/null
+++ b/src/installer/OpenSLX/OSSetup/Distro/Ubuntu.pm
@@ -0,0 +1,119 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# OSSetup/Distro/Ubuntu.pm
+# - provides Ubuntu-specific overrides of the OSSetup Distro API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSSetup::Distro::Ubuntu;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSSetup::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {};
+ return bless $self, $class;
+}
+
+sub initialize
+{
+ my $self = shift;
+ my $engine = shift;
+
+ $self->SUPER::initialize($engine);
+ $self->{'packager-type'} = 'dpkg';
+ $self->{'meta-packager-type'} = $ENV{SLX_META_PACKAGER} || 'apt';
+ $self->{'stage1c-faked-files'} = [];
+ return;
+}
+
+sub preSystemInstallationHook
+{
+ my $self = shift;
+
+ $self->SUPER::preSystemInstallationHook();
+
+ # fake required /dev-entries
+ my %devInfo = (
+ mem => { type => 'c', major => '1', minor => '1' },
+ null => { type => 'c', major => '1', minor => '3' },
+ zero => { type => 'c', major => '1', minor => '5' },
+ random => { type => 'c', major => '1', minor => '8' },
+ urandom => { type => 'c', major => '1', minor => '9' },
+ kmsg => { type => 'c', major => '1', minor => '11' },
+ console => { type => 'c', major => '5', minor => '1' },
+ ptmx => { type => 'c', major => '5', minor => '2' },
+ );
+ foreach my $dev (keys %devInfo) {
+ my $info = $devInfo{$dev};
+ if (!-e "/dev/$dev") {
+ if (slxsystem(
+ "mknod /dev/$dev $info->{type} $info->{major} $info->{minor}"
+ )) {
+ croak(_tr("unable to create dev-node '%s'! (%s)", $dev, $!));
+ }
+ }
+ }
+ foreach my $devDir ('pts', 'shm', '.udevdb', '.udev') {
+ if (!-e "/dev/$devDir") {
+ if (slxsystem("mkdir -p /dev/$devDir")) {
+ croak(_tr("unable to create dev-dir '%s'! (%s)", $devDir, $!));
+ }
+ }
+ }
+
+ # replace /usr/sbin/invoke-rc.d by a dummy, in order to avoid a whole lot
+ # of initscripts being started. Wishful thinking: there should be another
+ # way to stop Ubuntu from doing this, as this is not really very supportive
+ # of folder-based installations (then again: I may simply be too stupid
+ # to find out how it is supposed to work ...)
+ rename('/usr/sbin/invoke-rc.d', '/usr/sbin/_invoke-rc.d');
+ spitFile('/usr/sbin/invoke-rc.d', "#! /bin/sh\nexit 0\n");
+ chmod 0755, '/usr/sbin/invoke-rc.d';
+}
+
+sub startSession
+{
+ my $self = shift;
+ my $osDir = shift;
+
+ $self->SUPER::startSession($osDir);
+
+ # As in preSystemInstallationHook, we replace /usr/sbin/invoke-rc.d by a
+ # dummy.
+ #
+ # During installation, this might not exist yet, so we better check
+ if (-e '/usr/sbin/invoke-rc.d') {
+ rename('/usr/sbin/invoke-rc.d', '/usr/sbin/_invoke-rc.d');
+ spitFile('/usr/sbin/invoke-rc.d', "#! /bin/sh\nexit 0\n");
+ chmod 0755, '/usr/sbin/invoke-rc.d';
+ }
+}
+
+sub finishSession
+{
+ my $self = shift;
+
+ # restore /usr/sbin/invoke-rc.d
+ rename('/usr/sbin/_invoke-rc.d', '/usr/sbin/invoke-rc.d');
+
+ $self->SUPER::finishSession();
+}
+
+1;
diff --git a/src/installer/OpenSLX/OSSetup/Engine.pm b/src/installer/OpenSLX/OSSetup/Engine.pm
new file mode 100644
index 00000000..642a058b
--- /dev/null
+++ b/src/installer/OpenSLX/OSSetup/Engine.pm
@@ -0,0 +1,1929 @@
+# Copyright (c) 2006..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# Engine.pm
+# - provides driver engine for the OSSetup API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSSetup::Engine;
+
+use strict;
+use warnings;
+
+our (@ISA, @EXPORT, $VERSION);
+$VERSION = 1.01; # API-version . implementation-version
+
+use Exporter;
+@ISA = qw(Exporter);
+
+@EXPORT = qw(
+ %supportedDistros
+);
+
+use Config::General;
+use File::Basename;
+use File::Path;
+use URI;
+
+use OpenSLX::Basics;
+use OpenSLX::ScopedResource;
+use OpenSLX::Syscall;
+use OpenSLX::Utils;
+
+use vars qw(%supportedDistros);
+
+%supportedDistros = (
+ 'debian-3.1' => 'clone,install,update,shell',
+ 'debian-4.0' => 'clone,install,update,shell',
+ 'debian-4.0_amd64' => 'clone,install,update,shell',
+ 'debian-5.0' => 'clone,update,shell',
+ 'fedora-6' => 'clone,install,update,shell',
+ 'fedora-6_x86_64' => 'clone,install,update,shell',
+ 'gentoo-2007.X' => 'clone',
+ 'suse-10.1' => 'clone,install,update,shell',
+ 'suse-10.1_x86_64' => 'clone,install,update,shell',
+ 'suse-10.2' => 'clone,install,update,shell',
+ 'suse-10.2_x86_64' => 'clone,install,update,shell',
+ 'suse-10.3' => 'clone,install,update,shell',
+ 'suse-10.3_x86_64' => 'clone,update,shell',
+ 'suse-11.0' => 'clone,install,update,shell',
+ 'suse-11.0_x86_64' => 'clone,update,shell',
+ 'suse-11.1' => 'clone,install,update,shell',
+ 'suse-11.1_x86_64' => 'clone,update,shell',
+ 'suse-11.2' => 'clone,install,update,shell',
+ 'suse-11.2_x86_64' => 'clone,update,shell',
+ 'suse-11.3' => 'clone,update,shell',
+ 'suse-11.3_x86_64' => 'clone,update,shell',
+ 'scilin-4.7' => 'clone,update,shell',
+ 'scilin-5.3' => 'clone,update,shell',
+ 'scilin-5.4_x86_64' => 'clone,update,shell',
+ 'scilin-5.5_x86_64' => 'clone,update,shell',
+ 'ubuntu-8.04' => 'clone,install,update,shell',
+ 'ubuntu-8.04_amd64' => 'clone,update,shell',
+ 'ubuntu-8.10' => 'clone,install,update,shell',
+ 'ubuntu-8.10_amd64' => 'clone,update,shell',
+ 'ubuntu-9.04' => 'clone,install,update,shell',
+ 'ubuntu-9.04_amd64' => 'clone,update,shell',
+ 'ubuntu-9.10' => 'clone,install,update,shell',
+ 'ubuntu-9.10_amd64' => 'clone,update,shell',
+ 'ubuntu-10.04' => 'clone,install,update,shell',
+ 'ubuntu-10.04_amd64'=> 'clone,update,shell',
+);
+
+my %localHttpServers;
+my $filelisting;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+
+ my $self = {};
+
+ return bless $self, $class;
+}
+
+sub initialize
+{
+ my $self = shift;
+ my $vendorOSName = shift;
+ my $actionType = shift;
+
+ if ($vendorOSName eq '<<<default>>>') {
+ die _tr("you can't do that with the default vendor-OS!\n");
+ }
+ if ($vendorOSName !~ m[^([^\-]+\-[^\-]+)(?:\-(.+))?]) {
+ die _tr(
+ "Given vendor-OS has unknown format, " .
+ "expected '<name>-<release>[-<selection>]'\n"
+ );
+ }
+ my $distroName = lc($1);
+ my $selectionName = $2 || 'default';
+ $self->{'vendor-os-name'} = $vendorOSName;
+ $self->{'action-type'} = $actionType;
+ $self->{'distro-name'} = $distroName;
+ $self->{'selection-name'} = $selectionName;
+ $self->{'clone-source'} = '';
+ if (!exists $supportedDistros{$distroName}) {
+ print _tr("Sorry, distro '%s' is unsupported.\n", $distroName);
+ print _tr("List of supported distros:\n\t");
+ print join("\n\t", sort keys %supportedDistros) . "\n";
+ exit 1;
+ }
+ my $support = $supportedDistros{$distroName};
+ if ($actionType eq 'install' && $support !~ m[install]i) {
+ print _tr(
+ "Sorry, distro '%s' can not be installed, only cloned!\n",
+ $distroName
+ );
+ exit 1;
+ }
+ elsif ($actionType eq 'update' && $support !~ m[(update)]i) {
+ print _tr(
+ "Sorry, update support for vendor-OS '%s' has not been " .
+ "implemented!\n",
+ $distroName
+ );
+ exit 1;
+ }
+ elsif ($actionType eq 'shell' && $support !~ m[(shell)]i) {
+ print _tr(
+ "Sorry, vendor-OS '%s' has no support for chrooted shells " .
+ "available!\n",
+ $distroName
+ );
+ exit 1;
+ }
+
+ # load module for the requested distro:
+ my $distro = loadDistroModule({
+ distroName => $distroName,
+ distroScope => 'OpenSLX::OSSetup::Distro',
+ fallbackName => 'Any_Clone',
+ });
+ if (!$distro) {
+ die _tr(
+ 'unable to load any OSSetup::Distro module for vendor-OS %s!',
+ $vendorOSName
+ );
+ }
+
+ $distro->initialize($self);
+ $self->{distro} = $distro;
+
+ # protect against parallel executions of writing OpenSLX scripts
+ $self->{'vendor-os-lock'} = grabLock($vendorOSName);
+
+ if ($actionType =~ m{^(install|update|shell|plugin)}) {
+ # setup path to distribution-specific info:
+ my $sharedDistroInfoDir
+ = "$openslxConfig{'base-path'}/share/distro-info/" .
+ "$self->{'distro-name'}";
+ if (!-d $sharedDistroInfoDir) {
+ die _tr(
+ "unable to find shared distro-info in '%s'\n",
+ $sharedDistroInfoDir
+ );
+ }
+ $self->{'shared-distro-info-dir'} = $sharedDistroInfoDir;
+ my $configDistroInfoDir =
+ "$openslxConfig{'config-path'}/distro-info/$self->{'distro-name'}";
+ if (!-d $configDistroInfoDir) {
+ die _tr(
+ "unable to find configurable distro-info in '%s'\n",
+ $configDistroInfoDir
+ );
+ }
+ $self->{'config-distro-info-dir'} = $configDistroInfoDir;
+
+ my $setupMirrorsIfNecessary = $actionType eq 'install';
+ $self->_readDistroInfo($setupMirrorsIfNecessary);
+ }
+
+ if ($self->{'action-type'} eq 'install'
+ && !exists $self->{'distro-info'}->{'selection'}->{$selectionName})
+ {
+ die(
+ _tr(
+ "selection '%s' is unknown to distro '%s'\n",
+ $selectionName, $self->{'distro-name'}
+ )
+ . _tr("These selections are available:\n\t")
+ . join("\n\t", sort keys %{$self->{'distro-info'}->{'selection'}})
+ . "\n"
+ );
+ }
+
+ $self->{'vendor-os-path'}
+ = "$openslxConfig{'private-path'}/stage1/$self->{'vendor-os-name'}";
+ vlog(1, "vendor-OS path is '$self->{'vendor-os-path'}'");
+
+ if ($actionType =~ m{^(install|update|shell|plugin)}) {
+ $self->_createPackager();
+ $self->_createMetaPackager();
+ }
+
+ return;
+}
+
+sub installVendorOS
+{
+ my $self = shift;
+ my $vendorOSSettings = shift;
+
+ my $installInfoFile = "$self->{'vendor-os-path'}/.openslx-install-info";
+ if (-e $installInfoFile) {
+ die _tr("vendor-OS '%s' already exists, giving up!\n",
+ $self->{'vendor-os-path'});
+ }
+ $self->_createVendorOSPath();
+
+ my $httpServers = OpenSLX::ScopedResource->new({
+ name => 'local-http-servers',
+ acquire => sub { $self->_startLocalURLServersAsNeeded(); 1 },
+ release => sub { $self->_stopLocalURLServers(); 1 },
+ });
+
+ my $baseSystemFile = "$self->{'vendor-os-path'}/.openslx-base-system";
+ if (-e $baseSystemFile) {
+ vlog(0, _tr("found existing base system, continuing...\n"));
+ }
+ else {
+ # basic setup, stage1a-c:
+ $self->_setupStage1A();
+ callInSubprocess(
+ sub {
+ # some tasks that involve a chrooted environment:
+ $self->_changePersonalityIfNeeded();
+ $self->_setupStage1B();
+ $self->_setupStage1C();
+ }
+ );
+ $self->_stage1C_cleanupBasicVendorOS();
+ # just touch the file, in order to indicate a basic system:
+ slxsystem("touch $baseSystemFile");
+ }
+ callInSubprocess(
+ sub {
+ # another task that involves a chrooted environment:
+ $self->_changePersonalityIfNeeded();
+ $self->_setupStage1D();
+ }
+ );
+
+ # create the install-info file, in order to indicate a proper installation:
+ spitFile(
+ $installInfoFile,
+ "SLX_META_PACKAGER=$self->{distro}->{'meta-packager-type'}\n"
+ );
+
+ # base system info file is no longer needed, we have a full system now
+ slxsystem("rm $baseSystemFile");
+
+ $self->_applyVendorOSSettings($vendorOSSettings) unless !$vendorOSSettings;
+
+ vlog(
+ 0,
+ _tr(
+ "Vendor-OS '%s' installed succesfully.\n",
+ $self->{'vendor-os-name'}
+ )
+ );
+
+ # generate default openslx directories for the client
+ $self->_generateDefaultDirs();
+
+ # add the uclibs and tools to the stage1
+ $self->_copyUclibcRootfs();
+ #callInSubprocess(
+ # sub {
+ # $self->_callChrootedFunction({
+ # chrootDir => $self->{'vendor-os-path'},
+ # function => sub {
+ # $self->{'distro'}->addUclibLdconfig();
+ # },
+ # updateConfig => 1,
+ # });
+ #});
+ $self->_touchVendorOS();
+ $self->addInstalledVendorOSToConfigDB();
+ return;
+}
+
+sub cloneVendorOS
+{
+ my $self = shift;
+ my $source = shift;
+
+ if (substr($source, -1, 1) ne '/') {
+ # make sure source path ends with a slash, as otherwise, the
+ # last folder would be copied (but we only want its contents).
+ $source .= '/';
+ }
+
+ $self->{'clone-source'} = $source;
+ my $lastCloneSource = '';
+ my $cloneInfoFile = "$self->{'vendor-os-path'}/.openslx-clone-info";
+ my $isReClone;
+ if (-e $self->{'vendor-os-path'}) {
+ my $installInfoFile = "$self->{'vendor-os-path'}/.openslx-install-info";
+ if (-e $installInfoFile) {
+ # oops, given vendor-os has been installed, not cloned, we complain:
+ croak(
+ _tr(
+ "The vendor-OS '%s' exists but it is no clone, refusing " .
+ "to clobber!\nPlease delete the folder manually, if " .
+ "that's really what you want...\n",
+ $self->{'vendor-os-path'}
+ )
+ );
+ }
+ elsif (-e $cloneInfoFile) {
+ # check if last and current source match:
+ my $cloneInfo = slurpFile($cloneInfoFile);
+ if ($cloneInfo =~ m[^source\s*=\s*(.+?)\s*$]ims) {
+ $lastCloneSource = $1;
+ }
+ if ($source ne $lastCloneSource) {
+ # protect user from confusing sources (still allowed, though):
+ my $yes = _tr('yes');
+ my $no = _tr('no');
+ print _tr(
+ "Last time this vendor-OS was cloned, it has been cloned " .
+ "from '%s', now you specified a different source: '%s'\n" .
+ "Would you still like to proceed (%s/%s)?",
+ $lastCloneSource, $source, $yes, $no
+ );
+ my $answer = <STDIN>;
+ exit 5 unless $answer =~ m[^\s*$yes]i;
+ }
+ $isReClone = 1;
+ }
+ else {
+ # Neither the install-info nor the clone-info file exists. This
+ # probably means that the folder has been created by an older
+ # version of the tools. There's not much we can do, we simply
+ # trust our user and assume that he knows what he's doing.
+ }
+ }
+
+ $self->_createVendorOSPath();
+
+ $self->_clone_fetchSource($source);
+ if ($source ne $lastCloneSource) {
+ spitFile($cloneInfoFile, "source=$source\n");
+ }
+ if ($isReClone) {
+ vlog(
+ 0,
+ _tr(
+ "Vendor-OS '%s' has been re-cloned succesfully.\n",
+ $self->{'vendor-os-name'}
+ )
+ );
+ }
+ else {
+ vlog(
+ 0,
+ _tr(
+ "Vendor-OS '%s' has been cloned succesfully.\n",
+ $self->{'vendor-os-name'}
+ )
+ );
+ }
+
+ # generate default openslx directories for the client
+ $self->_generateDefaultDirs();
+
+ # add the uclibs and tools to the stage1
+ $self->_copyUclibcRootfs();
+ $self->_touchVendorOS();
+ $self->addInstalledVendorOSToConfigDB();
+ return;
+}
+
+sub updateVendorOS
+{
+ my $self = shift;
+
+ if (!-e $self->{'vendor-os-path'}) {
+ die _tr("can't update vendor-OS '%s', since it doesn't exist!\n",
+ $self->{'vendor-os-path'});
+ }
+
+ my $httpServers = OpenSLX::ScopedResource->new({
+ name => 'local-http-servers',
+ acquire => sub { $self->_startLocalURLServersAsNeeded(); 1 },
+ release => sub { $self->_stopLocalURLServers(); 1 },
+ });
+
+ callInSubprocess(
+ sub {
+ $self->_changePersonalityIfNeeded();
+ $self->_updateStage1D();
+ }
+ );
+
+ $self->_generateDefaultDirs();
+ $self->_copyUclibcRootfs();
+ $self->_touchVendorOS();
+ vlog(
+ 0,
+ _tr("Vendor-OS '%s' updated succesfully.\n", $self->{'vendor-os-name'})
+ );
+
+ $self->_installPlugins();
+
+ return;
+}
+
+sub startChrootedShellForVendorOS
+{
+ my $self = shift;
+
+ if (!-e $self->{'vendor-os-path'}) {
+ die _tr(
+ "can't start chrooted shell for vendor-OS '%s', since it doesn't " .
+ "exist!\n",
+ $self->{'vendor-os-path'}
+ );
+ }
+
+ my $httpServers = OpenSLX::ScopedResource->new({
+ name => 'local-http-servers',
+ acquire => sub { $self->_startLocalURLServersAsNeeded(); 1 },
+ release => sub { $self->_stopLocalURLServers(); 1 },
+ });
+
+ callInSubprocess(
+ sub {
+ $self->_changePersonalityIfNeeded();
+ $self->_startChrootedShellInStage1D();
+ }
+ );
+
+ vlog(
+ 0,
+ _tr(
+ "Chrooted shell for vendor-OS '%s' has been closed.\n",
+ $self->{'vendor-os-name'}
+ )
+ );
+ $self->_touchVendorOS();
+
+ return;
+}
+
+sub callChrootedFunctionForVendorOS
+{
+ my $self = shift;
+ my $function = shift;
+ my $updateConfig = shift || 0;
+
+ if (!-e $self->{'vendor-os-path'}) {
+ die _tr(
+ "can't call chrooted function for vendor-OS '%s', since it " .
+ "doesn't exist!\n",
+ $self->{'vendor-os-path'}
+ );
+ }
+
+ # avoid trying to chroot into a 64-bit vendor-OS if the host is only 32-bit:
+ if (!$self->_hostIs64Bit() && -e "$self->{'vendor-os-path'}/lib64") {
+ die _tr("you can't use a 64-bit vendor-OS on a 32-bit host, sorry!\n");
+ }
+
+ my $httpServers = OpenSLX::ScopedResource->new({
+ name => 'local-http-servers',
+ acquire => sub { $self->_startLocalURLServersAsNeeded(); 1 },
+ release => sub { $self->_stopLocalURLServers(); 1 },
+ });
+
+ callInSubprocess(
+ sub {
+ $self->_changePersonalityIfNeeded();
+ $self->_callChrootedFunction({
+ chrootDir => $self->{'vendor-os-path'},
+ function => $function,
+ updateConfig => $updateConfig,
+ });
+ }
+ );
+
+ vlog(
+ 1,
+ _tr(
+ "Chrooted function for vendor-OS '%s' has finished.\n",
+ $self->{'vendor-os-name'}
+ )
+ );
+ $self->_touchVendorOS();
+
+ return 1;
+}
+
+sub removeVendorOS
+{
+ my $self = shift;
+
+ vlog(
+ 0,
+ _tr("removing vendor-OS folder '%s'...", $self->{'vendor-os-path'})
+ );
+ if (system(
+ "find $self->{'vendor-os-path'} -xdev -depth -print0 | xargs -0 rm -r"
+ )) {
+ vlog(
+ 0,
+ _tr("* unable to remove vendor-OS '%s'!", $self->{'vendor-os-path'})
+ );
+ }
+ else {
+ vlog(
+ 0,
+ _tr(
+ "Vendor-OS '%s' removed succesfully.\n",
+ $self->{'vendor-os-name'}
+ )
+ );
+ }
+ $self->removeVendorOSFromConfigDB();
+ return;
+}
+
+sub addInstalledVendorOSToConfigDB
+{
+ my $self = shift;
+
+ if (!-e $self->{'vendor-os-path'}) {
+ die _tr(
+ "can't import vendor-OS '%s', since it doesn't exist!\n",
+ $self->{'vendor-os-path'}
+ );
+ }
+ my $openslxDB = instantiateClass("OpenSLX::ConfigDB");
+ $openslxDB->connect();
+
+ my @plugins;
+
+ # insert new vendor-os if it doesn't already exist in DB:
+ my $vendorOSName = $self->{'vendor-os-name'};
+ my $vendorOS = $openslxDB->fetchVendorOSByFilter({'name' => $vendorOSName});
+ if (defined $vendorOS) {
+ if ($vendorOS->{'clone_source'}
+ && $self->{'clone-source'} ne $vendorOS->{'clone_source'}) {
+ $openslxDB->changeVendorOS(
+ $vendorOS->{id},
+ { 'clone_source' => $self->{'clone-source'} }
+ );
+ vlog(
+ 0,
+ _tr(
+ "Vendor-OS '%s' has been updated in OpenSLX-database.\n",
+ $vendorOSName
+ )
+ );
+ }
+ else {
+ vlog(
+ 0,
+ _tr(
+ "No need to change vendor-OS '%s' in OpenSLX-database.\n",
+ $vendorOSName
+ )
+ );
+ }
+ # fetch installed plugins of this vendor-OS in order to reinstall them
+ @plugins = $openslxDB->fetchInstalledPlugins($vendorOS->{id});
+ }
+ else {
+ my $data = { 'name' => $vendorOSName };
+ if (length($self->{'clone-source'})) {
+ $data->{'clone_source'} = $self->{'clone-source'};
+ }
+ my $id = $openslxDB->addVendorOS($data);
+
+ vlog(
+ 0,
+ _tr(
+ "Vendor-OS '%s' has been added to DB (ID=%s).\n",
+ $vendorOSName, $id
+ )
+ );
+ # fetch plugins from default vendor-OS in order to install those into
+ # this new one
+ @plugins = $openslxDB->fetchInstalledPlugins(0);
+ }
+
+ $openslxDB->disconnect();
+
+ # now that we have the list of plugins, we (re-)install all of them:
+ $self->_installPlugins(\@plugins, defined $vendorOS);
+
+ return;
+}
+
+sub removeVendorOSFromConfigDB
+{
+ my $self = shift;
+
+ my $openslxDB = instantiateClass("OpenSLX::ConfigDB");
+ $openslxDB->connect();
+
+ my $vendorOSName = $self->{'vendor-os-name'};
+ my $vendorOS = $openslxDB->fetchVendorOSByFilter({'name' => $vendorOSName});
+ if (!defined $vendorOS) {
+ vlog(
+ 0,
+ _tr(
+ "Vendor-OS '%s' didn't exist in OpenSLX-database.\n",
+ $vendorOSName
+ )
+ );
+ }
+ else {
+ # remove all exports (and systems) using this vendor-OS and then
+ # remove the vendor-OS itself:
+ my @exports = $openslxDB->fetchExportByFilter(
+ {'vendor_os_id' => $vendorOS->{id}});
+ foreach my $export (@exports) {
+ my $osExportEngine = instantiateClass("OpenSLX::OSExport::Engine");
+ $osExportEngine->initializeFromExisting($export->{name});
+ vlog(
+ 0,
+ _tr(
+ "purging export '%s', since it belongs to the vendor-OS " .
+ "being deleted...",
+ $export->{name}
+ )
+ );
+ $osExportEngine->purgeExport();
+ }
+
+ $openslxDB->removeVendorOS($vendorOS->{id});
+ vlog(
+ 0,
+ _tr("Vendor-OS '%s' has been removed from DB!\n", $vendorOSName)
+ );
+ }
+
+ $openslxDB->disconnect();
+ return;
+}
+
+sub pickKernelFile
+{
+ my $self = shift;
+
+ return $self->{distro}->pickKernelFile(@_);
+}
+
+sub distroName
+{
+ my $self = shift;
+
+ return $self->{'distro-name'};
+}
+
+sub metaPackager
+{
+ my $self = shift;
+
+ return $self->{'meta-packager'};
+}
+
+sub packager
+{
+ my $self = shift;
+
+ return $self->{'packager'};
+}
+
+sub getInstallablePackagesForSelection
+{
+ my $self = shift;
+ my $selKey = shift;
+
+ return if !$selKey;
+
+ my $selection = $self->{'distro-info'}->{selection}->{$selKey};
+ return if !$selection;
+
+ my @pkgs = split m{\s+}, $selection->{packages};
+ my %installedPkgs;
+ @installedPkgs{ $self->{'packager'}->getInstalledPackages() } = ();
+ @pkgs = grep { !exists $installedPkgs{$_} } @pkgs;
+
+ return join ' ', @pkgs;
+}
+
+sub busyboxBinary
+{
+ my $self = shift;
+
+ my $uclibdir = "$openslxConfig{'base-path'}/share/uclib-rootfs";
+
+ return sprintf(
+ "LD_LIBRARY_PATH=%s/lib %s/bin/busybox",
+ $uclibdir,
+ $uclibdir
+ );
+}
+
+################################################################################
+### implementation methods
+################################################################################
+sub _readDistroInfo
+{
+ my $self = shift;
+ my $setupMirrorsIfNecessary = shift || 0;
+
+ vlog(1, "reading configuration info for $self->{'vendor-os-name'}...");
+
+ $self->{'distro-info'} = {
+ 'package-subdir' => '',
+ 'prereq-packages' => '',
+ 'bootstrap-packages' => '',
+ 'metapackager' => {},
+ 'repository' => {},
+ 'selection' => {},
+ 'excludes' => {},
+ };
+
+ # merge user-provided configuration with distro defaults
+ foreach my $file (
+ "$self->{'shared-distro-info-dir'}/settings.default",
+ "$self->{'config-distro-info-dir'}/settings"
+ ) {
+ if (-e $file) {
+ vlog(2, "reading configuration file $file...");
+ my $configObject = Config::General->new(
+ -AllowMultiOptions => 0,
+ -AutoTrue => 1,
+ -ConfigFile => $file,
+ -LowerCaseNames => 1,
+ -SplitPolicy => 'equalsign',
+ );
+ my %config = $configObject->getall();
+ mergeHash($self->{'distro-info'}, \%config);
+ }
+ }
+
+ # fetch mirrors for all repositories (if requested):
+ foreach my $repoKey (keys %{$self->{'distro-info'}->{repository}}) {
+ my $repo = $self->{'distro-info'}->{repository}->{$repoKey};
+ $repo->{key} = $repoKey;
+ # if there is local URL, only that is used, otherwise we fetch the
+ # configured mirrors:
+ if (!$repo->{'local-url'}) {
+ $repo->{urls} = $self->_fetchConfiguredMirrorsForRepository(
+ $repo, $setupMirrorsIfNecessary
+ );
+ }
+ }
+
+ # expand all selections:
+ my $seen = {};
+ foreach my $selKey (keys %{$self->{'distro-info'}->{selection}}) {
+ $self->_expandSelection($selKey, $seen);
+ }
+
+ # dump distro-info, if asked for:
+ if ($openslxConfig{'log-level'} >= 2) {
+ my $repository = $self->{'distro-info'}->{repository};
+ foreach my $r (sort keys %$repository) {
+ vlog(2, "repository '$r':");
+ foreach my $k (sort keys %{$repository->{$r}}) {
+ vlog(3, "\t$k = '$repository->{$r}->{$k}'");
+ }
+ }
+ my $selection = $self->{'distro-info'}->{selection};
+ foreach my $s (sort keys %$selection) {
+ vlog(2, "selection '$s':");
+ foreach my $k (sort keys %{$selection->{$s}}) {
+ vlog(3, "\t$k = '$selection->{$s}->{$k}'");
+ }
+ }
+ my $excludes = $self->{'distro-info'}->{excludes};
+ foreach my $e (sort keys %$excludes) {
+ vlog(2, "excludes for '$e':");
+ foreach my $k (sort keys %{$excludes->{$e}}) {
+ vlog(3, "\t$k = '$excludes->{$e}->{$k}'");
+ }
+ }
+ }
+ return;
+}
+
+sub _fetchConfiguredMirrorsForRepository
+{
+ my $self = shift;
+ my $repoInfo = shift;
+ my $setupMirrorsIfNecessary = shift;
+
+ my $configuredMirrorsFile
+ = "$self->{'config-distro-info-dir'}/mirrors/$repoInfo->{key}";
+ if (!-e $configuredMirrorsFile) {
+ return '' if !$setupMirrorsIfNecessary;
+ vlog(0,
+ _tr(
+ "repo '%s' has no configured mirrors, let's pick some ...",
+ $repoInfo->{name}
+ )
+ );
+ $self->_configureBestMirrorsForRepository($repoInfo);
+ }
+ vlog(2, "reading configured mirrors file '$configuredMirrorsFile'.");
+ my $configObject = Config::General->new(
+ -AllowMultiOptions => 0,
+ -AutoTrue => 1,
+ -ConfigFile => $configuredMirrorsFile,
+ -LowerCaseNames => 1,
+ -SplitPolicy => 'equalsign',
+ );
+ my %config = $configObject->getall();
+
+ return $config{urls};
+}
+
+sub _configureBestMirrorsForRepository
+{
+ my $self = shift;
+ my $repoInfo = shift;
+
+ my $configuredMirrorsFile
+ = "$self->{'config-distro-info-dir'}/mirrors/$repoInfo->{key}";
+
+ if (!-e "$self->{'config-distro-info-dir'}/mirrors") {
+ mkdir "$self->{'config-distro-info-dir'}/mirrors";
+ }
+
+ my $allMirrorsFile
+ = "$self->{'shared-distro-info-dir'}/mirrors/$repoInfo->{key}";
+ my @allMirrors = string2Array(scalar slurpFile($allMirrorsFile));
+
+ my $mirrorsToTryCount = $openslxConfig{'mirrors-to-try-count'} || 20;
+ my $mirrorsToUseCount = $openslxConfig{'mirrors-to-use-count'} || 5;
+ vlog(1,
+ _tr(
+ "selecting the '%s' best mirrors (from a set of '%s') for repo " .
+ "'%s' ...",
+ $mirrorsToUseCount, $mirrorsToTryCount, $repoInfo->{key}
+ )
+ );
+
+ # determine own top-level domain:
+ my $topLevelDomain;
+ if (defined $openslxConfig{'mirrors-preferred-top-level-domain'}) {
+ $topLevelDomain
+ = lc($openslxConfig{'mirrors-preferred-top-level-domain'});
+ }
+ else {
+ my $FQDN = getFQDN();
+ $FQDN =~ m{\.(\w+)$};
+ $topLevelDomain = lc($1);
+ }
+
+ # select up to $mirrorsToTryCount "close" mirrors from the array ...
+ my @tryMirrors
+ = grep {
+ my $uri = URI->new($_);
+ my $host = $uri->host();
+ $host =~ m{\.(\w+)$} && lc($1) eq $topLevelDomain;
+ }
+ @allMirrors;
+
+ my $tryList = join("\n\t", @tryMirrors);
+ vlog(1,
+ _tr(
+ "mirrors matching the preferred top level domain ('%s'):\n\t%s\n",
+ $topLevelDomain, $tryList
+ )
+ );
+
+ if (@tryMirrors > $mirrorsToTryCount) {
+ # shrink array to $mirrorsToTryCount elements
+ vlog(1, _tr("shrinking list to %s mirrors\n", $mirrorsToTryCount));
+ $#tryMirrors = $mirrorsToTryCount;
+ }
+ elsif (@tryMirrors < $mirrorsToTryCount) {
+ # we need more mirrors, try adding some others randomly:
+ vlog(1,
+ _tr(
+ "filling list with %s more random mirrors:\n",
+ $mirrorsToTryCount - @tryMirrors
+ )
+ );
+
+ # fill @untriedMirrors with the mirrors not already contained
+ # in @tryMirrors ...
+ my @untriedMirrors
+ = grep {
+ my $mirror = $_;
+ !grep { $mirror eq $_ } @tryMirrors;
+ } @allMirrors;
+
+ # ... and pick randomly until we have reached the limit or there are
+ # no more unused mirrors left
+ foreach my $count (@tryMirrors..$mirrorsToTryCount-1) {
+ last if !@untriedMirrors;
+ my $index = int(rand(scalar @untriedMirrors));
+ my $randomMirror = splice(@untriedMirrors, $index, 1);
+ push @tryMirrors, $randomMirror;
+ vlog(1, "\t$randomMirror\n");
+ }
+ }
+
+ # just make sure we are not going to try/use more mirros than we have
+ # available
+ if ($mirrorsToTryCount > @tryMirrors) {
+ $mirrorsToTryCount = @tryMirrors;
+ }
+ if ($mirrorsToUseCount > $mirrorsToTryCount) {
+ $mirrorsToUseCount = $mirrorsToTryCount;
+ }
+
+ # ... fetch a file from all of these mirrors and measure the time taken ...
+ vlog(0,
+ _tr(
+ "testing %s mirrors to determine the fastest %s ...\n",
+ $mirrorsToTryCount, $mirrorsToUseCount
+ )
+ );
+ my %mirrorSpeed;
+ my $veryGoodSpeedCount = 0;
+ foreach my $mirror (@tryMirrors) {
+ if ($veryGoodSpeedCount >= $mirrorsToUseCount) {
+ # we already have enough mirrors with very good speed,
+ # it makes no sense to test any others. We simply set the
+ # time of the remaining mirrors to some large value, so they
+ # won't get picked:
+ $mirrorSpeed{$mirror} = 10000;
+ next;
+ }
+
+ # test the current mirror and record the result
+ my $time = $self->_speedTestMirror(
+ $mirror, $repoInfo->{'file-for-speedtest'}
+ );
+ $mirrorSpeed{$mirror} = $time;
+ if ($time <= 1) {
+ $veryGoodSpeedCount++;
+ }
+ }
+
+ # ... now select the best (fastest) $mirrorsToUseCount mirrors ...
+ my @bestMirrors
+ = (
+ sort {
+ $mirrorSpeed{$a} <=> $mirrorSpeed{$b};
+ }
+ @tryMirrors
+ )[0..$mirrorsToUseCount-1];
+
+ vlog(0,
+ _tr(
+ "picked these '%s' mirrors for repo '%s':\n\t%s\n",
+ $mirrorsToUseCount, $repoInfo->{name}, join("\n\t", @bestMirrors)
+ )
+ );
+
+ # ... and write them into the configuration file:
+ my $configObject = Config::General->new(
+ -AllowMultiOptions => 0,
+ -AutoTrue => 1,
+ -LowerCaseNames => 1,
+ -SplitPolicy => 'equalsign',
+ );
+ $configObject->save_file($configuredMirrorsFile, {
+ 'urls' => join("\n", @bestMirrors),
+ });
+ return;
+}
+
+sub _speedTestMirror
+{
+ my $self = shift;
+ my $mirror = shift;
+ my $file = shift;
+
+ vlog(0, _tr("\ttesting mirror '%s' ...\n", $mirror));
+
+ # do an explicit DNS-lookup as we do not want to include the time that takes
+ # in the speedtest
+ my $uri = URI->new($mirror);
+ my $hostName = $uri->host();
+ if (!gethostbyname($hostName)) {
+ # unable to resolve host, we pretend it took really long
+ return 10000;
+ }
+
+ # now measure the time it takes to download the file
+ my $wgetCmd = $self->busyboxBinary();
+ $wgetCmd .= " wget -q -O - $mirror/$file >/dev/null";
+ my $start = time();
+ if (slxsystem($wgetCmd)) {
+ # just return any large number that is unlikely to be selected
+ return 10000;
+ }
+ my $time = time() - $start;
+ vlog(0, "\tfetched '$file' in $time seconds\n");
+ return $time;
+}
+
+sub _expandSelection
+{
+ my $self = shift;
+ my $selKey = shift;
+ my $seen = shift;
+
+ return if $seen->{$selKey};
+ $seen->{$selKey} = 1;
+
+ return if !exists $self->{'distro-info'}->{selection}->{$selKey};
+ my $selection = $self->{'distro-info'}->{selection}->{$selKey};
+
+ if ($selection->{base}) {
+ # add all packages from base selection(s) to the current one:
+ my $basePackages = '';
+ for my $base (split ',', $selection->{base}) {
+ my $baseSelection = $self->{'distro-info'}->{selection}->{$base}
+ or die _tr(
+ 'base-selection "%s" is unknown (referenced in "%s")!',
+ $base, $selKey
+ );
+ $self->_expandSelection($base, $seen);
+ $basePackages .= $baseSelection->{packages} || '';
+ }
+ my $packages = $selection->{packages} || '';
+ $selection->{packages} = $basePackages . "\n" . $packages;
+ }
+ return;
+}
+
+sub _applyVendorOSSettings
+{
+ my $self = shift;
+ my $vendorOSSettings = shift;
+
+ if (exists $vendorOSSettings->{'root-password'}) {
+ # hashes password according to requirements of current distro and
+ # writes it to /etc/shadow
+ $self->{distro}->setPasswordForUser(
+ 'root', $vendorOSSettings->{'root-password'}
+ );
+ }
+
+ return;
+}
+
+sub _createVendorOSPath
+{
+ my $self = shift;
+
+ if (slxsystem("mkdir -p $self->{'vendor-os-path'}")) {
+ die _tr("unable to create directory '%s', giving up! (%s)\n",
+ $self->{'vendor-os-path'}, $!);
+ }
+ return;
+}
+
+sub _touchVendorOS
+{
+ my $self = shift;
+
+ # touch root folder, as we are using this folder to determine the
+ # 'age' of the vendor-OS when trying to determine whether or not we
+ # need to re-export this vendor-OS:
+ slxsystem("touch $self->{'vendor-os-path'}");
+ return;
+}
+
+sub _generateDefaultDirs
+{
+ my $self = shift;
+ my $targetRoot = shift || $self->{'vendor-os-path'};
+
+ vlog(0, _tr("Creating default directories ...\n"));
+
+ my $OPENSLX_DEFAULT_DIR = "/opt/openslx";
+ my $OPENSLX_DEFAULT_CONFDIR = "/etc/opt/openslx";
+ my $OPENSLX_DEFAULT_LOGDIR = "/var/log/openslx";
+ my $OPENSLX_DEFAULT_VARDIR = "/var/opt/openslx";
+ my $OPENSLX_DEFAULT_BINDIR = "$OPENSLX_DEFAULT_VARDIR/bin";
+ my $OPENSLX_DEFAULT_LIBDIR = "$OPENSLX_DEFAULT_VARDIR/lib";
+ my $OPENSLX_DEFAULT_VIRTDIR = "/var/lib/virt";
+ mkpath("$targetRoot/$OPENSLX_DEFAULT_DIR", 0, 0755);
+ mkpath("$targetRoot/$OPENSLX_DEFAULT_CONFDIR", 0, 0755);
+ mkpath("$targetRoot/$OPENSLX_DEFAULT_LOGDIR", 0, 0755);
+ mkpath("$targetRoot/$OPENSLX_DEFAULT_BINDIR", 0, 0755);
+ mkpath("$targetRoot/$OPENSLX_DEFAULT_LIBDIR", 0, 0755);
+ mkpath("$targetRoot/$OPENSLX_DEFAULT_VIRTDIR", 0, 0755);
+ #system("chmod 0755 $targetRoot/$OPENSLX_DEFAULT_DIR");
+
+ my $openslxConfig = "# Default OpenSLX directories defined by satge 1\n";
+ $openslxConfig .= "# Version 0.2\n\n";
+ $openslxConfig .= "OPENSLX_DEFAULT_DIR=$OPENSLX_DEFAULT_DIR\n";
+ $openslxConfig .= "OPENSLX_DEFAULT_CONFDIR=$OPENSLX_DEFAULT_CONFDIR\n";
+ $openslxConfig .= "OPENSLX_DEFAULT_LOGDIR=$OPENSLX_DEFAULT_LOGDIR\n";
+ $openslxConfig .= "OPENSLX_DEFAULT_VARDIR=$OPENSLX_DEFAULT_VARDIR\n";
+ $openslxConfig .= "OPENSLX_DEFAULT_BINDIR=$OPENSLX_DEFAULT_BINDIR\n";
+ $openslxConfig .= "OPENSLX_DEFAULT_LIBDIR=$OPENSLX_DEFAULT_LIBDIR\n";
+ $openslxConfig .= "OPENSLX_DEFAULT_VIRTDIR=$OPENSLX_DEFAULT_VIRTDIR\n";
+
+ spitFile("$targetRoot/$OPENSLX_DEFAULT_CONFDIR/openslx.conf",
+ "$openslxConfig");
+
+ # add BINDIR to PATH
+ my $openslxDefaultPath = "PATH=$OPENSLX_DEFAULT_BINDIR:\$PATH\n";
+ $openslxDefaultPath .= "export PATH\n";
+ spitFile("$targetRoot/etc/profile.d/openslx-binpath.sh",
+ "$openslxDefaultPath");
+}
+
+sub _copyUclibcRootfs
+{
+ my $self = shift;
+ my $targetRoot = shift || $self->{'vendor-os-path'};
+ my $distro = $self->{distro};
+
+ vlog(0, _tr("copying uclibc-rootfs into vendor-OS ...\n"));
+
+ my $target = "$targetRoot/opt/openslx/uclib-rootfs";
+
+ if (system("mkdir -p $target")) {
+ die _tr("unable to create directory '%s', giving up! (%s)\n",
+ $target, $!);
+ }
+
+ my $uclibcRootfs = "$openslxConfig{'base-path'}/share/uclib-rootfs";
+ my @excludes = qw(
+ dialog
+ kexec
+ libcurses.so*
+ libncurses.so*
+ );
+ my $exclOpts = join ' ', map { "--exclude $_" } @excludes;
+ vlog(3, _tr("using exclude-filter:\n%s\n", $exclOpts));
+ my $rsyncFH;
+ my $rsyncCmd
+ = "rsync -aq --delete-excluded --exclude-from=- $uclibcRootfs/ $target";
+ vlog(2, "executing: $rsyncCmd\n");
+ # if we're doing a fresh install we need to create /lib, /bin first
+ mkdir "$targetRoot/lib";
+ mkdir "$targetRoot/bin";
+
+ open($rsyncFH, '|-', $rsyncCmd)
+ or die _tr("unable to start rsync for source '%s', giving up! (%s)",
+ $uclibcRootfs, $!);
+ print $rsyncFH $exclOpts;
+ close($rsyncFH)
+ or die _tr("unable to copy to target '%s', giving up! (%s)",
+ $target, $!);
+
+ # write version of uclibc-rootfs original into a file in order to be
+ # able to check the up-to-date state later (in the config-demuxer)
+ slxsystem("slxversion >${target}.version");
+
+ return;
+}
+
+sub _createPackager
+{
+ my $self = shift;
+
+ my $packagerClass
+ = "OpenSLX::OSSetup::Packager::$self->{distro}->{'packager-type'}";
+ my $packager = instantiateClass($packagerClass);
+ $packager->initialize($self);
+ $self->{'packager'} = $packager;
+ return;
+}
+
+sub _createMetaPackager
+{
+ my $self = shift;
+
+ my $metaPackagerType = $self->{distro}->{'meta-packager-type'};
+
+ my $installInfoFile = "$self->{'vendor-os-path'}/.openslx-install-info";
+ if (-e $installInfoFile) {
+ # activate the meta-packager that was used when installing the os:
+ my $installInfo = slurpFile($installInfoFile);
+ if ($installInfo =~ m[SLX_META_PACKAGER=(\w+)]) {
+ $metaPackagerType = $1;
+ }
+ }
+
+ my $metaPackagerClass = "OpenSLX::OSSetup::MetaPackager::$metaPackagerType";
+ my $metaPackager = instantiateClass($metaPackagerClass);
+ $metaPackager->initialize($self);
+ $self->{'meta-packager'} = $metaPackager;
+ return;
+}
+
+sub _sortRepositoryURLs
+{
+ my $self = shift;
+ my $repoInfo = shift;
+
+ my @URLs
+ = defined $repoInfo->{'local-url'}
+ ? $repoInfo->{'local-url'}
+ : string2Array($repoInfo->{urls});
+ if (!@URLs) {
+ die(
+ _tr(
+ "repository '%s' has no URLs defined, " .
+ "unable to fetch anything!",
+ $repoInfo->{name},
+ )
+ );
+ }
+
+ return \@URLs;
+}
+
+sub _downloadBaseFiles
+{
+ my $self = shift;
+ my $files = shift;
+ use vars qw(@filelisting);
+
+ my $pkgSubdir = $self->{'distro-info'}->{'package-subdir'};
+ my @URLs = @{$self->{'baseURLs'}};
+ my $maxTryCount = $openslxConfig{'ossetup-max-try-count'};
+ my @possiblefiles;
+
+ my @foundFiles;
+ foreach my $fileVariantStr (@$files) {
+ my $tryCount = 0;
+ next unless $fileVariantStr =~ m[\S];
+ my $foundFile;
+try_next_url:
+ my $url = $URLs[$self->{'baseURL-index'}];
+ $url .= "/$pkgSubdir" if length($pkgSubdir);
+
+ foreach my $file (split '\s+', $fileVariantStr) {
+ #substitute given name with real filename including version number
+ my $basefile = basename($file);
+ my $basedir = dirname($file)."/";
+ @possiblefiles = grep(/^$basefile/,@filelisting);
+ #selecting always the first occurence
+ if ($possiblefiles[0]) {
+ $basefile = $possiblefiles[0];
+ } elsif ($basefile =~ /.*\.rpm/) {
+ vlog(5,"Trying suggested name because of .rpm-ending.");
+ } else {
+ die _tr("file <$basefile> not found in list received from" .
+ "mirror");
+ }
+ vlog(2, "fetching <$basefile>...");
+ if (slxsystem("wget", "-c", "-O", "$basefile",
+ "$url/$basedir$basefile") == 0) {
+ $foundFile = $basefile;
+ last;
+ }
+ elsif (-e $basefile) {
+ vlog(0, "removing left-over '$basefile' and trying again...");
+ unlink $basefile;
+ redo;
+ }
+ }
+ if (!defined $foundFile) {
+ if ($tryCount < $maxTryCount) {
+ $tryCount++;
+ $self->{'baseURL-index'}
+ = ($self->{'baseURL-index'} + 1) % scalar(@URLs);
+ vlog(
+ 0,
+ _tr(
+ "switching to mirror '%s'.",
+ $URLs[$self->{'baseURL-index'}]
+ )
+ );
+ goto try_next_url;
+ }
+ die _tr("unable to fetch '%s' from any source!\n", $fileVariantStr);
+ }
+ push @foundFiles, $foundFile;
+ }
+ return @foundFiles;
+}
+
+sub _startLocalURLServersAsNeeded
+{
+ my $self = shift;
+
+ my $port = 5080;
+ my %portForURL;
+ foreach my $repoInfo (values %{$self->{'distro-info'}->{repository}}) {
+ my $localURL = $repoInfo->{'local-url'} || '';
+ next if !$localURL;
+ next if $localURL =~ m[^\w+:]; # anything /w a protcol-spec is non-local
+ if (!exists $localHttpServers{$localURL}) {
+ my $pid
+ = executeInSubprocess(
+ $self->busyboxBinary(), "httpd", '-p', $port, '-h', '/',
+ '-f'
+ );
+ vlog(1,
+ _tr(
+ "started local HTTP-server for URL '%s' on port '%s'.",
+ $localURL, $port
+ )
+ );
+ $repoInfo->{'local-url'} = "http://localhost:$port$localURL";
+ $localHttpServers{$localURL}->{pid} = $pid;
+ $localHttpServers{$localURL}->{url} = $repoInfo->{'local-url'};
+ $port++;
+ }
+ else {
+ $repoInfo->{'local-url'} = $localHttpServers{$localURL}->{url};
+ }
+ }
+ return;
+}
+
+sub _stopLocalURLServers
+{
+ my $self = shift;
+
+ while (my ($localURL, $serverInfo) = each %localHttpServers) {
+ vlog(1, _tr("stopping local HTTP-server for URL '%s'.", $localURL));
+ kill TERM => $serverInfo->{pid};
+ }
+}
+
+sub _setupStage1A
+{
+ my $self = shift;
+
+ vlog(1, "setting up stage1a for $self->{'vendor-os-name'}...");
+
+ # specify individual paths for the respective substages:
+ $self->{stage1aDir} = "$self->{'vendor-os-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 (slxsystem("mkdir -p $stage1cDir")) {
+ die _tr("unable to create directory '%s', giving up! (%s)\n",
+ $stage1cDir, $!);
+ }
+
+ $self->_stage1A_setupUclibcEnvironment();
+ $self->_stage1A_copyPrerequiredFiles();
+ $self->_stage1A_copyTrustedPackageKeys();
+ $self->_stage1A_createRequiredFiles();
+ return;
+}
+
+sub _stage1A_setupUclibcEnvironment
+{
+ my $self = shift;
+ $self->_copyUclibcRootfs("$self->{stage1aDir}/$self->{stage1bSubdir}");
+ my $source = "$self->{stage1bSubdir}/opt/openslx/uclib-rootfs";
+ my $target = "$self->{stage1aDir}";
+ slxsystem("ln -sf $source/bin $target/bin");
+ slxsystem("ln -sf $source/lib $target/lib");
+ slxsystem("ln -sf $source/usr $target/usr");
+ $self->_stage1A_setupResolver();
+
+ return;
+}
+
+
+sub _stage1A_setupResolver
+{
+ my $self = shift;
+ my $libcFolder = shift;
+
+ #if (!defined $libcFolder) {
+ # warn _tr("unable to determine libc-target-folder, will use /lib!");
+ # $libcFolder = '/lib';
+ #}
+
+ copyFile('/etc/resolv.conf', "$self->{stage1aDir}/etc");
+ copyFile('/etc/nsswitch.conf', "$self->{stage1aDir}/etc");
+ spitFile("$self->{stage1aDir}/etc/hosts", "127.0.0.1 localhost\n");
+ #copyFile("$libcFolder/libresolv*", "$self->{stage1aDir}$libcFolder");
+ #copyFile("$libcFolder/libnss_dns*", "$self->{stage1aDir}$libcFolder");
+ #copyFile("$libcFolder/libnss_files*", "$self->{stage1aDir}$libcFolder");
+
+ my $stage1cDir
+ = "$self->{'stage1aDir'}/$self->{'stage1bSubdir'}/" .
+ "$self->{'stage1cSubdir'}";
+ copyFile('/etc/resolv.conf', "$stage1cDir/etc");
+ return;
+}
+
+sub _stage1A_copyPrerequiredFiles
+{
+ my $self = shift;
+
+ return unless -d "$self->{'shared-distro-info-dir'}/prereqfiles";
+
+ vlog(2, "copying folder with pre-required files...");
+ my $stage1cDir
+ = "$self->{'stage1aDir'}/$self->{'stage1bSubdir'}/" .
+ "$self->{'stage1cSubdir'}";
+ my $cmd = qq[
+ tar -cp -C $self->{'shared-distro-info-dir'}/prereqfiles . \\
+ | tar -xp -C $stage1cDir
+ ];
+ if (slxsystem($cmd)) {
+ die _tr(
+ "unable to copy folder with pre-required files to folder '%s'" .
+ "(%s)\n",
+ $stage1cDir, $!
+ );
+ }
+ vlog(2, "fix pre-required files...");
+ $self->{distro}->fixPrerequiredFiles($stage1cDir);
+ return;
+}
+
+sub _stage1A_copyTrustedPackageKeys
+{
+ my $self = shift;
+
+ vlog(2, "copying folder with trusted package keys...");
+ my $stage1bDir = "$self->{'stage1aDir'}/$self->{'stage1bSubdir'}";
+ foreach my $folder (
+ $self->{'shared-distro-info-dir'}, $self->{'config-distro-info-dir'}
+ ) {
+ next unless -d "$folder/trusted-package-keys";
+ my $cmd = qq[
+ tar -cp -C $folder trusted-package-keys \\
+ | tar -xp -C $stage1bDir
+ ];
+ if (slxsystem($cmd)) {
+ die _tr(
+ "unable to copy folder with trusted package keys to folder " .
+ "'%s' (%s)\n",
+ "$stage1bDir/trusted-package-keys", $!
+ );
+ }
+ slxsystem("chmod 444 $stage1bDir/trusted-package-keys/*");
+
+ # install ultimately trusted keys (from distributor):
+ my $stage1cDir = "$stage1bDir/$self->{'stage1cSubdir'}";
+ my $keyDir = "$self->{'shared-distro-info-dir'}/trusted-package-keys";
+ if (-e "$keyDir/pubring.gpg") {
+ copyFile("$keyDir/pubring.gpg", "$stage1cDir/usr/lib/rpm/gnupg");
+ }
+ }
+ return;
+}
+
+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 (!-e "$stage1cDir/dev/null"
+ && slxsystem("mknod $stage1cDir/dev/null c 1 3"))
+ {
+ die _tr(
+ "unable to create node '%s' (%s)\n", "$stage1cDir/dev/null", $!
+ );
+ }
+ return;
+}
+
+sub _setupStage1B
+{
+ my $self = shift;
+
+ vlog(1, "setting up stage1b for $self->{'vendor-os-name'}...");
+ $self->_stage1B_chrootAndBootstrap();
+ return;
+}
+
+sub _stage1B_chrootAndBootstrap
+{
+ my $self = shift;
+
+ # give packager a chance to copy required files into stage1a-folder:
+ $self->{packager}->prepareBootstrap($self->{stage1aDir});
+
+ $self->_callChrootedFunction({
+ chrootDir => $self->{stage1aDir},
+ function => sub {
+ # chdir into slxbootstrap, as we want to drop packages into there:
+ chdir "/$self->{stage1bSubdir}"
+ or die _tr(
+ "unable to chdir into '%s' (%s)\n",
+ "/$self->{stage1bSubdir}", $!
+ );
+
+ # fetch prerequired packages and use them to bootstrap the packager:
+ $self->{'baseURLs'} = $self->_sortRepositoryURLs(
+ $self->{'distro-info'}->{repository}->{base}
+ );
+ $self->{'baseURL-index'} = 0;
+ my @pkgs =
+ string2Array($self->{'distro-info'}->{'prereq-packages'});
+ vlog(
+ 2,
+ "downloading these prereq packages:\n\t" . join("\n\t", @pkgs)
+ );
+ my @prereqPkgs = $self->_downloadBaseFiles(\@pkgs);
+ $self->{'prereq-packages'} = \@prereqPkgs;
+ $self->{packager}->bootstrap(\@prereqPkgs);
+
+ @pkgs =
+ string2Array($self->{'distro-info'}->{'bootstrap-packages'});
+ push(
+ @pkgs,
+ string2Array(
+ $self->{'distro-info'}->{'metapackager'}
+ ->{$self->{distro}->{'meta-packager-type'}}->{packages}
+ )
+ );
+ vlog(
+ 2,
+ "downloading bootstrap packages:\n\t" . join("\n\t", @pkgs)
+ );
+ my @bootstrapPkgs = $self->_downloadBaseFiles(\@pkgs);
+ $self->{'bootstrap-packages'} = \@bootstrapPkgs;
+ },
+ });
+ return;
+}
+
+sub _setupStage1C
+{
+ my $self = shift;
+
+ vlog(1, "setting up stage1c for $self->{'vendor-os-name'}...");
+ $self->_stage1C_chrootAndInstallBasicVendorOS();
+ return;
+}
+
+sub _stage1C_chrootAndInstallBasicVendorOS
+{
+ my $self = shift;
+
+ my $stage1bDir = "/$self->{stage1bSubdir}";
+ chrootInto($stage1bDir);
+
+ my $stage1cDir = "/$self->{stage1cSubdir}";
+
+ # import any additional trusted package keys to rpm-DB:
+ my $keyDir = "/trusted-package-keys";
+ my $keyDirDH;
+ if (opendir($keyDirDH, $keyDir)) {
+ my @keyFiles
+ = map { "$keyDir/$_" }
+ grep { $_ !~ m[^(\.\.?|pubring.gpg)$] }
+ readdir($keyDirDH);
+ closedir($keyDirDH);
+ $self->{packager}->importTrustedPackageKeys(\@keyFiles, $stage1cDir);
+ }
+
+ # install bootstrap packages
+ $self->{packager}->installPackages(
+ $self->{'bootstrap-packages'}, $stage1cDir
+ );
+ return;
+}
+
+sub _stage1C_cleanupBasicVendorOS
+{
+ my $self = shift;
+
+ my $stage1cDir
+ = "$self->{'stage1aDir'}/$self->{'stage1bSubdir'}/" .
+ "$self->{'stage1cSubdir'}";
+ if (slxsystem("mv $stage1cDir/* $self->{'vendor-os-path'}/")) {
+ die _tr(
+ "unable to move final setup to '%s' (%s)\n",
+ $self->{'vendor-os-path'}, $!
+ );
+ }
+ if (slxsystem("rm -rf $self->{stage1aDir}")) {
+ die _tr(
+ "unable to remove temporary folder '%s' (%s)\n",
+ $self->{stage1aDir}, $!
+ );
+ }
+ return;
+}
+
+sub _setupStage1D
+{
+ my $self = shift;
+
+ vlog(1, "setting up stage1d for $self->{'vendor-os-name'}...");
+
+ $self->_callChrootedFunction({
+ chrootDir => $self->{'vendor-os-path'},
+ function => sub {
+ $self->_stage1D_setupPackageSources();
+ $self->_stage1D_updateBasicVendorOS();
+ $self->{distro}->preSystemInstallationHook();
+ my $ok = eval {
+ $self->_stage1D_installPackageSelection();
+ 1;
+ };
+ my $err = $ok ? undef : $@;
+ $self->{distro}->postSystemInstallationHook();
+ die $err if defined $err;
+ },
+ updateConfig => 1,
+ });
+ return;
+}
+
+sub _updateStage1D
+{
+ my $self = shift;
+
+ vlog(1, "updating $self->{'vendor-os-name'}...");
+
+ $self->_callChrootedFunction({
+ chrootDir => $self->{'vendor-os-path'},
+ function => sub {
+ $self->_stage1D_updateBasicVendorOS();
+ },
+ updateConfig => 1,
+ });
+ return;
+}
+
+sub _startChrootedShellInStage1D
+{
+ my $self = shift;
+
+ vlog(0, "starting chrooted shell for $self->{'vendor-os-name'}");
+ vlog(0, "---------------------------------------");
+ vlog(0, "- please type 'exit' if you are done! -");
+ vlog(0, "---------------------------------------");
+
+ $self->_callChrootedFunction({
+ chrootDir => $self->{'vendor-os-path'},
+ function => sub {
+ # will hang until user exits manually:
+ slxsystem($openslxConfig{'default-shell'});
+ },
+ updateConfig => 1,
+ });
+ return;
+}
+
+sub _callChrootedFunction
+{
+ my $self = shift;
+ my $params = shift;
+
+ checkParams($params, {
+ 'chrootDir' => '!',
+ 'function' => '!',
+ 'updateConfig' => '?',
+ });
+
+ my $distro = $self->{distro};
+ my $distroSession = OpenSLX::ScopedResource->new({
+ name => 'ossetup::distro::session',
+ acquire => sub { $distro->startSession($params->{chrootDir}); 1 },
+ release => sub { $distro->finishSession(); 1 },
+ });
+
+ die $@ if ! eval {
+ # invoke given function:
+ $params->{function}->();
+ $distro->updateDistroConfig() if $params->{updateConfig};
+ 1;
+ };
+
+ return;
+}
+
+sub _stage1D_setupPackageSources
+{
+ my $self = shift;
+
+ vlog(1, "setting up package sources for meta packager...");
+ my $selectionName = $self->{'selection-name'};
+ my $pkgExcludes
+ = $self->{'distro-info'}->{excludes}->{$selectionName}->{packages};
+ my $excludeList = join ' ', string2Array($pkgExcludes);
+ $self->{'meta-packager'}->initPackageSources();
+ my ($rk, $repo);
+ while (($rk, $repo) = each %{$self->{'distro-info'}->{repository}}) {
+ vlog(2, "setting up package source $rk...");
+ $self->{'meta-packager'}->setupPackageSource(
+ $rk, $repo, $excludeList, $self->_sortRepositoryURLs($repo)
+ );
+ }
+ return;
+}
+
+sub _stage1D_updateBasicVendorOS
+{
+ my $self = shift;
+
+ vlog(1, "updating basic vendor-os...");
+ $self->{'meta-packager'}->updateBasicVendorOS();
+ return;
+}
+
+sub _stage1D_installPackageSelection
+{
+ my $self = shift;
+
+ my $selectionName = $self->{'selection-name'};
+
+ vlog(1, "installing package selection <$selectionName>...");
+ my $selection = $self->{'distro-info'}->{selection}->{$selectionName};
+ my @pkgs = string2Array($selection->{packages});
+ my @installedPkgs = $self->{'packager'}->getInstalledPackages();
+ @pkgs = grep {
+ my $pkg = $_;
+ if (grep { $_ eq $pkg; } @installedPkgs) {
+ vlog(1, "package '$pkg' filtered, it is already installed.");
+ 0;
+ }
+ else {
+ 1;
+ }
+ } @pkgs;
+ if (!@pkgs) {
+ vlog(
+ 0,
+ _tr(
+ "No packages listed for selection '%s', nothing to do.",
+ $selectionName
+ )
+ );
+ }
+ else {
+ vlog(1, "installing these packages:\n" . join("\n\t", @pkgs));
+ $self->{'meta-packager'}->installPackages(join(' ', @pkgs), 1);
+ }
+ return;
+}
+
+sub _clone_fetchSource
+{
+ my $self = shift;
+ my $source = shift;
+
+ vlog(
+ 0,
+ _tr(
+ "Cloning vendor-OS from '%s' to '%s'...\n", $source,
+ $self->{'vendor-os-path'}
+ )
+ );
+ my $excludeIncludeList = $self->_clone_determineIncludeExcludeList();
+ vlog(1, "using exclude-include-filter:\n$excludeIncludeList\n");
+ my $additionalRsyncOptions = $ENV{SLX_RSYNC_OPTIONS} || '';
+ my $rsyncCmd
+ = "rsync -av --delete --exclude-from=- $additionalRsyncOptions"
+ . " $source $self->{'vendor-os-path'}";
+ vlog(2, "executing: $rsyncCmd\n");
+ my $rsyncFH;
+ open($rsyncFH, '|-', $rsyncCmd)
+ or croak(
+ _tr(
+ "unable to start rsync for source '%s', giving up! (%s)\n",
+ $source, $!
+ )
+ );
+ print $rsyncFH $excludeIncludeList;
+ if (!close($rsyncFH)) {
+ print "rsync-result=", 0+$!, "\n";
+ croak _tr(
+ "unable to clone from source '%s', giving up! (%s)\n", $source, $!
+ );
+ }
+ return;
+}
+
+sub _clone_determineIncludeExcludeList
+{
+ my $self = shift;
+
+ my $localFilterFile
+ = "$openslxConfig{'config-path'}/distro-info/clone-filter";
+ my $includeExcludeList
+ = slurpFile($localFilterFile, { failIfMissing => 0 });
+ $includeExcludeList .= $self->{distro}->{'clone-filter'};
+ $includeExcludeList =~ s[^\s+][]igms;
+
+ # remove any leading whitespace, as rsync doesn't like it
+ return $includeExcludeList;
+}
+
+sub _installPlugins
+{
+ my $self = shift;
+ my $plugins = shift;
+ my $isReInstall = shift;
+
+ if (!$plugins) {
+ $plugins = [];
+ my $openslxDB = instantiateClass("OpenSLX::ConfigDB");
+ $openslxDB->connect();
+ # fetch plugins from existing vendor-OS
+ my $vendorOS = $openslxDB->fetchVendorOSByFilter({
+ 'name' => $self->{'vendor-os-name'}
+ });
+ if ($vendorOS) {
+ push @$plugins, $openslxDB->fetchInstalledPlugins($vendorOS->{id});
+ $isReInstall = 1;
+ }
+ $openslxDB->disconnect();
+ }
+
+ return if ! @$plugins;
+
+ require OpenSLX::OSPlugin::Engine;
+ vlog(
+ 0,
+ $isReInstall
+ ? _tr("reinstalling plugins...\n")
+ : _tr("installing default plugins...\n")
+ );
+ for my $pluginInfo (
+ sort {
+ $self->_sortPluginsByDependency($a->{plugin_name},
+ $b->{plugin_name});
+ } @$plugins
+ ) {
+ my $pluginName = $pluginInfo->{plugin_name};
+ my $pluginEngine = OpenSLX::OSPlugin::Engine->new();
+ vlog(0, _tr("\t%s\n", $pluginName));
+ $pluginEngine->initialize(
+ $pluginName, $self->{'vendor-os-name'}, $pluginInfo->{attrs}
+ );
+ $pluginEngine->installPlugin();
+ }
+ vlog(0, _tr("done with plugins.\n"));
+
+ return;
+}
+
+sub _sortPluginsByDependency
+{
+ my $self = shift;
+ my $pluginNameA = shift;
+ my $pluginNameB = shift;
+
+ my $pluginA = OpenSLX::OSPlugin::Roster->getPlugin($pluginNameA);
+ if ($pluginA->dependsOnPlugin($pluginNameB)) {
+ return 1;
+ }
+ my $pluginB = OpenSLX::OSPlugin::Roster->getPlugin($pluginNameB);
+ if ($pluginB->dependsOnPlugin($pluginNameA)) {
+ return -1;
+ }
+ return 0;
+}
+
+################################################################################
+### utility methods
+################################################################################
+sub _changePersonalityIfNeeded
+{
+ my $self = shift;
+
+ my $distroName = $self->{'distro-name'};
+ if ($self->_hostIs64Bit() && $distroName !~ m[_64]) {
+ vlog(2, 'entering 32-bit personality');
+ OpenSLX::Syscall->enter32BitPersonality();
+ }
+ return;
+}
+
+sub _hostIs64Bit
+{
+ my $self = shift;
+
+ $self->{arch} = `uname -m` unless defined $self->{arch};
+ return ($self->{arch} =~ m[64]);
+}
+
+1;
+
+=pod
+
+=head1 NAME
+
+OpenSLX::OSSetup::Engine - driver engine for OSSetup API
+
+=head1 SYNOPSIS
+
+...
+
+=cut
+
diff --git a/src/installer/OpenSLX/OSSetup/MetaPackager/Base.pm b/src/installer/OpenSLX/OSSetup/MetaPackager/Base.pm
new file mode 100644
index 00000000..f149d0f5
--- /dev/null
+++ b/src/installer/OpenSLX/OSSetup/MetaPackager/Base.pm
@@ -0,0 +1,98 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# Base.pm
+# - provides empty base of the OpenSLX OSSetup::MetaPackager API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSSetup::MetaPackager::Base;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+use Scalar::Util qw( weaken );
+
+use OpenSLX::Basics;
+
+################################################################################
+### 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;
+ weaken($self->{'engine'});
+ # avoid circular reference between meta-packager and its engine
+
+ return;
+}
+
+sub initPackageSources
+{
+}
+
+sub setupPackageSource
+{
+}
+
+sub updateBasicVendorOS
+{
+}
+
+sub installPackages
+{
+}
+
+sub removePackages
+{
+}
+
+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/src/installer/OpenSLX/OSSetup/MetaPackager/apt.pm b/src/installer/OpenSLX/OSSetup/MetaPackager/apt.pm
new file mode 100644
index 00000000..ecb87a35
--- /dev/null
+++ b/src/installer/OpenSLX/OSSetup/MetaPackager/apt.pm
@@ -0,0 +1,142 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# apt.pm
+# - provides apt-get-specific overrides of the OpenSLX::OSSetup::MetaPackager API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSSetup::MetaPackager::apt;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSSetup::MetaPackager::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### implementation
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {
+ 'name' => 'apt',
+ };
+ return bless $self, $class;
+}
+
+sub initPackageSources
+{
+ my $self = shift;
+
+ $ENV{LC_ALL} = 'POSIX';
+
+ # remove any existing sources
+ slxsystem('rm -f /etc/apt/sources.list');
+
+ # create default timezone if there isn't any
+ if (!-e '/etc/timezone') {
+ spitFile('/etc/timezone', "$openslxConfig{'default-timezone'}\n");
+ }
+
+ # create kernel config if there isn't any
+ if (!-e '/etc/kernel-img.conf') {
+ my $kernelConfig = unshiftHereDoc(<<" END-OF-HERE");
+ # Kernel image management overrides
+ # See kernel-img.conf(5) for details
+ do_symlinks = yes
+ relative_links = yes
+ do_bootloader = no
+ do_bootfloppy = no
+ do_initrd = yes
+ link_in_boot = yes
+ END-OF-HERE
+ spitFile('/etc/kernel-img.conf', $kernelConfig);
+ }
+
+ return 1;
+}
+
+sub setupPackageSource
+{
+ my $self = shift;
+ my $repoName = shift;
+ my $repoInfo = shift;
+ my $excludeList = shift;
+ my $repoURLs = shift;
+
+ my $baseURL = shift @$repoURLs;
+ my $distribution = $repoInfo->{'distribution'};
+ my $components = $repoInfo->{'components'};
+
+ my $sourcesList = "deb $baseURL $distribution $components\n";
+
+ foreach my $mirrorURL (@$repoURLs) {
+ $sourcesList .= "deb $mirrorURL $distribution $components\n";
+ }
+
+ appendFile('/etc/apt/sources.list', $sourcesList);
+
+ return;
+}
+
+sub installPackages
+{
+ my $self = shift;
+ my $packages = shift;
+ my $doRefresh = shift || 0;
+
+ $packages =~ tr{\n}{ };
+
+ if ($doRefresh && slxsystem("apt-get -y update")) {
+ die _tr("unable to update repository info (%s)\n", $!);
+ }
+ if ('/var/cache/debconf/slx-defaults.dat') {
+ $ENV{DEBCONF_DB_FALLBACK}
+ = "'File{/var/cache/debconf/slx-defaults.dat}'";
+ }
+ $ENV{DEBIAN_FRONTEND} = 'noninteractive';
+ if (slxsystem("apt-get -y install $packages")) {
+ die _tr("unable to install selection (%s)\n", $!);
+ }
+ delete $ENV{DEBCONF_DB_FALLBACK};
+ delete $ENV{DEBIAN_FRONTEND};
+
+ return 1;
+}
+
+sub removePackages
+{
+ my $self = shift;
+ my $pkgSelection = shift;
+
+ if (slxsystem("apt-get -y remove $pkgSelection")) {
+ die _tr("unable to remove selection (%s)\n", $!);
+ }
+
+ return 1;
+}
+
+sub updateBasicVendorOS
+{
+ my $self = shift;
+
+ if (slxsystem("apt-get -y update")) {
+ die _tr("unable to update repository info (%s)\n", $!);
+ }
+ if (slxsystem("apt-get -y upgrade")) {
+ die _tr("unable to update this vendor-os (%s)\n", $!);
+ }
+
+ return 1;
+}
+
+1; \ No newline at end of file
diff --git a/src/installer/OpenSLX/OSSetup/MetaPackager/smart.pm b/src/installer/OpenSLX/OSSetup/MetaPackager/smart.pm
new file mode 100644
index 00000000..fc178cb7
--- /dev/null
+++ b/src/installer/OpenSLX/OSSetup/MetaPackager/smart.pm
@@ -0,0 +1,127 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# smart.pm
+# - provides smart-specific overrides of the OpenSLX::OSSetup::MetaPackager API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSSetup::MetaPackager::smart;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSSetup::MetaPackager::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### implementation
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {
+ 'name' => 'smart',
+ };
+ return bless $self, $class;
+}
+
+sub initPackageSources
+{
+ my $self = shift;
+
+ $ENV{LC_ALL} = 'POSIX';
+
+ # remove any existing channels
+ slxsystem("rm -f /etc/smart/channels/*");
+ if (slxsystem("smart channel -y --remove-all")) {
+ die _tr("unable to remove existing channels (%s)\n", $!);
+ }
+ return 1;
+}
+
+sub setupPackageSource
+{
+ my $self = shift;
+ my $repoName = shift;
+ my $repoInfo = shift;
+ my $excludeList = shift;
+ my $repoURLs = shift;
+
+ my $repoSubdir = '';
+ if ($repoInfo->{'repo-subdir'}) {
+ $repoSubdir = "/$repoInfo->{'repo-subdir'}";
+ }
+ my $baseURL = shift @$repoURLs;
+ my $repoDescr
+ = qq[$repoName name="$repoInfo->{name}" baseurl=$baseURL$repoSubdir];
+ $repoDescr .= " type=rpm-md";
+ if (slxsystem("smart channel -y --add $repoDescr")) {
+ die _tr("unable to add channel '%s' (%s)\n", $repoName, $!);
+ }
+
+ my $mirrorDescr;
+ foreach my $mirrorURL (@$repoURLs) {
+ $mirrorDescr .= " --add $baseURL$repoSubdir $mirrorURL$repoSubdir";
+ }
+ if (defined $mirrorDescr) {
+ if (slxsystem("smart mirror $mirrorDescr")) {
+ die _tr(
+ "unable to add mirrors for channel '%s' (%s)\n",
+ $repoName, $!
+ );
+ }
+ }
+ return 1;
+}
+
+sub installPackages
+{
+ my $self = shift;
+ my $packages = shift;
+ my $doRefresh = shift || 0;
+
+ $packages =~ tr{\n}{ };
+
+ if ($doRefresh && slxsystem("smart update")) {
+ die _tr("unable to update channel info (%s)\n", $!);
+ }
+ if (slxsystem("smart install -y $packages")) {
+ die _tr("unable to install selection (%s)\n", $!);
+ }
+ return 1;
+}
+
+sub removePackages
+{
+ my $self = shift;
+ my $pkgSelection = shift;
+
+ if (slxsystem("smart remove -y $pkgSelection")) {
+ die _tr("unable to remove selection (%s)\n", $!);
+ }
+ return 1;
+}
+
+sub updateBasicVendorOS
+{
+ my $self = shift;
+
+ if (slxsystem("smart upgrade -y --update")) {
+ if ($! == 2) {
+ # file not found => smart isn't installed
+ die _tr("unable to update this vendor-os, as it seems to lack an installation of smart!\n");
+ }
+ die _tr("unable to update this vendor-os (%s)\n", $!);
+ }
+ return 1;
+}
+
+1; \ No newline at end of file
diff --git a/src/installer/OpenSLX/OSSetup/MetaPackager/yum.pm b/src/installer/OpenSLX/OSSetup/MetaPackager/yum.pm
new file mode 100644
index 00000000..99a10382
--- /dev/null
+++ b/src/installer/OpenSLX/OSSetup/MetaPackager/yum.pm
@@ -0,0 +1,117 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# yum.pm
+# - provides yum-specific overrides of the OpenSLX::OSSetup::MetaPackager API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSSetup::MetaPackager::yum;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSSetup::MetaPackager::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### implementation
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {
+ 'name' => 'yum',
+ };
+ return bless $self, $class;
+}
+
+sub initPackageSources
+{
+ my $self = shift;
+
+ $ENV{LC_ALL} = 'POSIX';
+
+ slxsystem("rm -f /etc/yum.repos.d/*");
+ slxsystem("mkdir -p /etc/yum.repos.d");
+
+ return 1;
+}
+
+sub setupPackageSource
+{
+ my $self = shift;
+ my $repoName = shift;
+ my $repoInfo = shift;
+ my $excludeList = shift;
+ my $repoURLs = shift;
+
+ my $repoSubdir;
+ if (length($repoInfo->{'repo-subdir'})) {
+ $repoSubdir = "/$repoInfo->{'repo-subdir'}";
+ }
+ my $baseURL = shift @$repoURLs;
+
+ my $repoDescr
+ = "[$repoName]\nname=$repoInfo->{name}\nbaseurl=$baseURL$repoSubdir\n";
+ vlog(4,"Adding repo <",$repoName,"> with Base-URL <",$baseURL,"> and Repo-SubDir <",$repoSubdir,">");
+ foreach my $mirrorURL (@$repoURLs) {
+ $repoDescr .= " $mirrorURL$repoSubdir\n";
+ }
+ my $repoFile = "/etc/yum.repos.d/$repoName.repo";
+ spitFile($repoFile, "$repoDescr\nexclude=$excludeList\n");
+
+ return 1;
+}
+
+sub installPackages
+{
+ my $self = shift;
+ my $packages = shift;
+
+ $packages =~ tr{\n}{ };
+ if (slxsystem("mount -t proc proc proc/") != 0){die _tr("unable to mount proc/ for yum \n");};
+ if (slxsystem("yum -y install $packages")) {
+ die _tr("unable to install selection (%s)\n", $!);
+ }
+ if(slxsystem("umount proc/") != 0) {_tr("unable to umount proc/")};
+
+ return 1;
+}
+
+sub removePackages
+{
+ my $self = shift;
+ my $pkgSelection = shift;
+
+ if (slxsystem("yum -y remove $pkgSelection")) {
+ die _tr("unable to remove selection (%s)\n", $!);
+ }
+
+ return 1;
+}
+
+sub updateBasicVendorOS
+{
+ my $self = shift;
+ if (slxsystem("mount -t proc proc proc/") != 0){die _tr("unable to mount proc/ for yum \n");};
+ if (slxsystem("yum -y update")) {
+ if ($! == 2) {
+ # file not found => yum isn't installed
+ die _tr("unable to update this vendor-os, as it seems to lack an installation of yum!\n");
+ }
+ if(slxsystem("umount proc/") != 0) {_tr("unable to umount proc/")};
+ die _tr("unable to update this vendor-os (%s)\n", $!);
+ }
+ if(slxsystem("umount proc/") != 0) {_tr("unable to umount proc/")};
+ return 1;
+}
+
+1; \ No newline at end of file
diff --git a/src/installer/OpenSLX/OSSetup/MetaPackager/zypper.pm b/src/installer/OpenSLX/OSSetup/MetaPackager/zypper.pm
new file mode 100644
index 00000000..4bb22bde
--- /dev/null
+++ b/src/installer/OpenSLX/OSSetup/MetaPackager/zypper.pm
@@ -0,0 +1,122 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# zypper.pm
+# - provides zypper-specific overrides of the OpenSLX::OSSetup::MetaPackager API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSSetup::MetaPackager::zypper;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSSetup::MetaPackager::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### implementation
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {
+ 'name' => 'zypper',
+ };
+ return bless $self, $class;
+}
+
+sub initPackageSources
+{
+ my $self = shift;
+
+ $ENV{LC_ALL} = 'POSIX';
+
+ # remove any existing channels
+ slxsystem("rm -f /etc/zypp/repos.d/*");
+
+ return 1;
+}
+
+sub setupPackageSource
+{
+ my $self = shift;
+ my $repoName = shift;
+ my $repoInfo = shift;
+ my $excludeList = shift;
+ my $repoURLs = shift;
+
+ my $repoSubdir = '';
+ if (defined $repoInfo->{'repo-subdir'} &&
+ length($repoInfo->{'repo-subdir'})) {
+ $repoSubdir = "/$repoInfo->{'repo-subdir'}";
+ }
+ my $baseURL = shift @$repoURLs;
+
+ if ($baseURL =~ m/non-oss/) {
+ # skip non-oss repositories, cause zypper can't realy handle them
+ # correctly; zypper is deacting them with following message:
+ # "Repository type can't be determined."
+ return 1;
+ }
+
+ if (slxsystem("zypper addrepo $baseURL$repoSubdir $repoName")) {
+ die _tr("unable to add repo '%s' (%s)\n", $repoName, $!);
+ }
+
+ return 1;
+}
+
+sub installPackages
+{
+ my $self = shift;
+ my $packages = shift;
+ my $doRefresh = shift || 0;
+
+ $packages =~ tr{\n}{ };
+
+ if ($doRefresh && slxsystem("zypper --non-interactive refresh")) {
+ die _tr("unable to update repo info (%s)\n", $!);
+ }
+ if (slxsystem("zypper --non-interactive install $packages")) {
+ die _tr("unable to install selection (%s)\n", $!);
+ }
+
+ return 1;
+}
+
+sub removePackages
+{
+ my $self = shift;
+ my $pkgSelection = shift;
+
+ if (slxsystem("zypper --non-interactive remove $pkgSelection")) {
+ die _tr("unable to remove selection (%s)\n", $!);
+ }
+
+ return 1;
+}
+
+sub updateBasicVendorOS
+{
+ my $self = shift;
+
+ if (slxsystem("zypper --non-interactive update")) {
+ if ($! == 2) {
+ # file not found => zypper isn't installed
+ die _tr("unable to update this vendor-os, as it seems to lack an installation of zypper!\n");
+ }
+ die _tr("unable to update this vendor-os (%s)\n", $!);
+ }
+
+ return 1;
+}
+
+1;
diff --git a/src/installer/OpenSLX/OSSetup/Packager/Base.pm b/src/installer/OpenSLX/OSSetup/Packager/Base.pm
new file mode 100644
index 00000000..af600b8b
--- /dev/null
+++ b/src/installer/OpenSLX/OSSetup/Packager/Base.pm
@@ -0,0 +1,98 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# Base.pm
+# - provides empty base of the OpenSLX OSSetup::Packager API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSSetup::Packager::Base;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+use Scalar::Util qw( weaken );
+
+use OpenSLX::Basics;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ confess "Creating OpenSLX::OSSetup::Packager::Base-objects directly makes no sense!";
+}
+
+sub initialize
+{
+ my $self = shift;
+ my $engine = shift;
+
+ $self->{'engine'} = $engine;
+ weaken($self->{'engine'});
+ # avoid circular reference between packager and its engine
+
+ return;
+}
+
+sub prepareBootstrap
+{
+}
+
+sub bootstrap
+{
+}
+
+sub importTrustedPackageKeys
+{
+}
+
+sub installPackages
+{
+}
+
+sub getInstalledPackages
+{
+}
+
+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/src/installer/OpenSLX/OSSetup/Packager/dpkg.pm b/src/installer/OpenSLX/OSSetup/Packager/dpkg.pm
new file mode 100644
index 00000000..94aff9c6
--- /dev/null
+++ b/src/installer/OpenSLX/OSSetup/Packager/dpkg.pm
@@ -0,0 +1,102 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# rpm.pm
+# - provides rpm-specific overrides of the OpenSLX::OSSetup::Packager API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSSetup::Packager::dpkg;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSSetup::Packager::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### implementation
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {
+ 'name' => 'dpkg',
+ };
+ return bless $self, $class;
+}
+
+sub prepareBootstrap
+{
+ my $self = shift;
+ my $stage1aDir = shift;
+
+ copyBinaryWithRequiredLibs({
+ 'binary' => '/usr/bin/perl',
+ 'targetFolder' => "$stage1aDir/usr/bin",
+ 'libTargetFolder' => $stage1aDir,
+ });
+
+}
+
+sub bootstrap
+{
+ my $self = shift;
+ my $pkgs = shift;
+
+ my $debootstrapPkg = $pkgs->[0];
+ chdir '..';
+ vlog(2, "unpacking debootstrap ...");
+ if (slxsystem("ash", "-c", "ar x slxbootstrap/$debootstrapPkg")) {
+ die _tr("unable to unarchive package '%s' (%s)", $debootstrapPkg, $!);
+ }
+ if (slxsystem("ash", "-c", "tar xzf data.tar.gz")) {
+ die _tr("unable to untar 'data.tar.gz (%s)", $!);
+ }
+ if (slxsystem("ash", "-c", "rm -f debian-binary *.tar.gz")) {
+ die _tr("unable to cleanup package '%s' (%s)", $debootstrapPkg, $!);
+ }
+ my $arch = $self->{engine}->{'distro-info'}->{arch};
+ my $releaseName = $self->{engine}->{'distro-info'}->{'release-name'};
+ my $baseURL = $self->{engine}->{baseURLs}->[0];
+ my $debootstrapCmd = unshiftHereDoc(<<" END-OF-HERE");
+ /usr/sbin/debootstrap --arch $arch $releaseName \\
+ /slxbootstrap/slxfinal $baseURL
+ END-OF-HERE
+ if (slxsystem("ash", "-c", ". $debootstrapCmd")) {
+ die _tr("unable to run debootstrap (%s)", $!);
+ }
+ return;
+}
+
+sub installPackages
+{
+ my $self = shift;
+ my $pkgs = shift;
+ my $finalPath = shift;
+
+ return unless defined $pkgs && @$pkgs;
+
+ if (slxsystem("dpkg", "--root=$finalPath", "--install", @$pkgs)) {
+ die _tr("error during package-installation (%s)\n", $!);
+ }
+ return;
+}
+
+sub getInstalledPackages
+{
+ my $self = shift;
+
+ my $rpmCmd = 'dpkg-query --showformat "\${package}\n" --show';
+ my $pkgList = qx{$rpmCmd};
+ return split "\n", $pkgList;
+}
+
+1;
diff --git a/src/installer/OpenSLX/OSSetup/Packager/rpm.pm b/src/installer/OpenSLX/OSSetup/Packager/rpm.pm
new file mode 100644
index 00000000..8a86a3d2
--- /dev/null
+++ b/src/installer/OpenSLX/OSSetup/Packager/rpm.pm
@@ -0,0 +1,89 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# rpm.pm
+# - provides rpm-specific overrides of the OpenSLX::OSSetup::Packager API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSSetup::Packager::rpm;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSSetup::Packager::Base);
+
+use OpenSLX::Basics;
+
+################################################################################
+### implementation
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {
+ 'name' => 'rpm',
+ };
+ return bless $self, $class;
+}
+
+sub bootstrap
+{
+ my $self = shift;
+ my $pkgs = shift;
+
+ foreach my $pkg (@$pkgs) {
+ vlog(2, "unpacking package $pkg...");
+ if (slxsystem("ash", "-c", "rpm2cpio $pkg | cpio -i -d -u")) {
+ die _tr("unable to unpack package <%s> (%s)", $pkg, $!);
+ }
+ }
+ return;
+}
+
+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 (slxsystem("rpm", "--root=$finalPath", "--import", "$keyFile")) {
+ die _tr("unable to import package key <%s> (%s)\n", $keyFile, $!);
+ }
+ }
+ return;
+}
+
+sub installPackages
+{
+ my $self = shift;
+ my $pkgs = shift;
+ my $finalPath = shift;
+
+ return unless defined $pkgs && scalar(@$pkgs);
+
+ if (slxsystem("rpm", "--root=$finalPath", "-ivh", @$pkgs)) {
+ die _tr("error during package-installation (%s)\n", $!);
+ }
+ return;
+}
+
+sub getInstalledPackages
+{
+ my $self = shift;
+
+ my $rpmCmd = 'rpm -qa --queryformat="%{NAME}\n"';
+ my $pkgList = `$rpmCmd`;
+ return split "\n", $pkgList;
+}
+
+1;
diff --git a/src/installer/slxos-export b/src/installer/slxos-export
new file mode 100755
index 00000000..8c0733ab
--- /dev/null
+++ b/src/installer/slxos-export
@@ -0,0 +1,323 @@
+#! /usr/bin/perl
+# -----------------------------------------------------------------------------
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+use strict;
+use warnings;
+
+my $abstract = q[
+slxos-export
+ OpenSLX-script to generate an export from a vendor-OS.
+];
+
+use Encode;
+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 lib "$FindBin::RealBin/../config-db";
+# development path to config-db
+
+use OpenSLX::Basics;
+use OpenSLX::OSExport::Engine;
+use OpenSLX::Utils;
+
+my %option;
+
+GetOptions(
+ 'help|?' => \$option{helpReq},
+ 'man' => \$option{manReq},
+ 'version' => \$option{versionReq},
+ )
+ or pod2usage(2);
+pod2usage(-msg => $abstract, -verbose => 0, -exitval => 1) if $option{helpReq};
+if ($option{manReq}) {
+ # avoid dubious problem with perldoc in combination with UTF-8 that
+ # leads to strange dashes and single-quotes being used
+ $ENV{LC_ALL} = 'POSIX';
+ pod2usage(-verbose => 2);
+}
+if ($option{versionReq}) {
+ system('slxversion');
+ exit 1;
+}
+
+openslxInit();
+
+my $action = shift @ARGV || '';
+
+if ($action =~ m[^list-ex]i) {
+ print _tr("List of exported vendor-OSes (exports):\n");
+ foreach my $type (sort keys %supportedExportFileSystems) {
+ # list all image files, followed by the block devices using it:
+ my @files = map {
+ my $image = decode('utf8', $_);
+ $image =~ s[^.+/][];
+ $image;
+ }
+ sort glob("$openslxConfig{'public-path'}/export/$type/*");
+ my %imageFiles;
+ foreach my $file (@files) {
+ if ($file =~ m[^(.+)@(.+)$]) {
+ # it's a link referring to a block device using this image,
+ # we collect the name of the block device:
+ push @{$imageFiles{$1}}, $2;
+ } else {
+ # it's an image file, we setup an empty array of block devices:
+ $imageFiles{$file} = [];
+ }
+ }
+ print join(
+ '',
+ map {
+ my $devices = join(',', @{$imageFiles{$_}});
+ my $name = "${_}::$type";
+ if (length($devices)) {
+ "\t$name".substr(' ' x 30, length($name))."($devices)\n";
+ } else {
+ "\t$name\n";
+ }
+ }
+ grep {
+ # filter out RSYNC_TMP folders:
+ $_ !~ m[###];
+ }
+ sort keys %imageFiles
+ );
+ }
+} elsif ($action =~ m[^list-in]i) {
+ my @vendorOSDirs
+ = grep { -d $_ } glob("$openslxConfig{'private-path'}/stage1/*");
+ print _tr("List of installed vendor-OSes:\n");
+ print join(
+ '',
+ map {
+ my $vendorOS = decode('utf8', $_);
+ $vendorOS =~ s[^.+/][];
+ "\t$vendorOS\n";
+ }
+ sort @vendorOSDirs
+ );
+} elsif ($action =~ m[^list-ty]i) {
+ print _tr("List of supported export types:\n\t");
+ print join("\n\t", sort @supportedExportTypes) . "\n";
+} elsif ($action =~ m[^export]i) {
+ if (scalar(@ARGV) != 2) {
+ print STDERR _tr(
+ "You need to specify exactly one vendor-os-name and one export-type!\n"
+ );
+ pod2usage(2);
+ }
+ my $vendorOSName = shift @ARGV;
+ my $exportType = shift @ARGV;
+
+ # 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 OSExport-engine for given export type and start it:
+ my $engine = OpenSLX::OSExport::Engine->new;
+ $engine->initializeForNew($vendorOSName, $exportType);
+ if (!-e $engine->{'vendor-os-path'}) {
+ die _tr("vendor-OS '%s' doesn't exist, giving up!\n",
+ $engine->{'vendor-os-path'});
+ }
+ $engine->exportVendorOS();
+} elsif ($action =~ m[^remove]i) {
+ if (scalar(@ARGV) != 1) {
+ print STDERR _tr("You need to specify exactly one export-name!\n");
+ pod2usage(2);
+ }
+ my $exportName = shift @ARGV;
+
+ # 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 OSExport-engine for given export type and start it:
+ my $engine = OpenSLX::OSExport::Engine->new;
+ $engine->initializeFromExisting($exportName);
+ $engine->purgeExport();
+} else {
+ vlog(0, _tr(unshiftHereDoc(<<' END-OF-HERE'), $0));
+ You need to specify exactly one action:
+ export
+ list-exported
+ list-installed
+ list-types
+ remove
+ Try '%s --help' for more info.
+ END-OF-HERE
+}
+
+=head1 NAME
+
+slxos-export - OpenSLX-script to generate an export from a vendor-OS.
+
+=head1 SYNOPSIS
+
+slxos-export [options] <action>
+
+=head3 Options
+
+ --help brief help message
+ --log-level=<int> level of logging verbosity (0-3)
+ --man show full documentation
+ --version show version
+
+=head3 Actions
+
+=over 8
+
+=item B<< export <vendor-OS-name> <export-type> >>
+
+exports the vendor-OS with the given name using the given export type and
+adds it to the config-DB, too. The export will be named as the vendor-OS,
+but with an additional '-<X>' appended to it (where <X> will be replaced
+by the chosen export-type).
+
+=item B<< list-exported >>
+
+list all exported vendor-OSes
+
+=item B<< list-installed >>
+
+list all installed vendor-OSes
+
+=item B<< list-types >>
+
+list all supported export types
+
+=item B<< remove <export-name> >>
+
+removes the export with the given name from disk and config-DB
+
+=back
+
+=head1 DESCRIPTION
+
+B<slxos-export> converts an installed vendor-OS into a form that can be accessed
+via network by booting clients.
+
+The resulting form of such a conversion is called an I<export> and those come
+in different flavors:
+
+=over 8
+
+=item B< Export Type 'nfs'>
+
+NFS (network file system) is a well established networking file system, which
+is supported by LINUX since long.
+
+=item B< Export Type 'sqfs-nbd'>
+
+Squash-FS is a rather modern filesystem providing very good compression,
+resulting in considerably reduced network traffic during boot (and execution).
+However, in order to mount a squash-fs that resides on the server, the client
+has to get access to it first. This can be established via a network block
+device, which basically "transports" a block device over the network (from
+server to client), making it possible to use more or less any file system over
+the network.
+So, this example translates to 'use a squashfs on a network block device'.
+
+=back
+
+When invoking slxos-export, you have to pass it a vendor-OS name and the export
+type you want to use and it will do the conversion (which can take a while, so
+please be patient).
+
+The resulting export will be stored under C</srv/openslx/export>.
+
+=head1 OPTIONS
+
+=over 4
+
+=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
+
+=head1 EXAMPLES
+
+=over 8
+
+=head3 Exporting a Vendor-OS via NFS
+
+=item B<< slxos-export export suse-10.2 nfs >>
+
+Exports the installed vendor-OS suse-10.2 via nfs, the
+resulting NFS-export will live in C</srv/openslx/export/nfs/suse-10.2>.
+
+=back
+
+=head3 Exporting a Vendor-OS via NBD
+
+=over 8
+
+=item B<< slxos-export export ubuntu-6.10 sqfs-nbd >>
+
+Exports the installed vendor-OS ubuntu-6.10 via nbd, the resulting
+Squash-FS will live in C</srv/openslx/export/nbd/ubuntu-6.10>.
+
+=back
+
+=head3 Removing an Export
+
+=over 8
+
+=item B<< slxos-export remove ubuntu-6.10 nbd >>
+
+Wipes the squash-FS of the export named 'ubuntu-6.10' from disk (i.e. the
+file C</srv/openslx/export/nbd/ubuntu-6.10> will be deleted) and
+removes that export from the config-DB, too.
+
+=back
+
+=head1 SEE ALSO
+
+slxsettings, slxos-setup, slxconfig, slxconfig-demuxer
+
+=head1 GENERAL OPENSLX OPTIONS
+
+Being a part of OpenSLX, this script supports several other options
+which can be used to overrule the OpenSLX settings:
+
+ --db-name=<string> name of database
+ --db-spec=<string> full DBI-specification of database
+ --db-type=<string> type of database to connect to
+ --locale=<string> locale to use for translations
+ --log-level=<int> level of logging verbosity (0-3)
+ --logfile=<string> file to write logging output to
+ --private-path=<string> path to private data
+ --public-path=<string> path to public (client-accesible) data
+ --temp-path=<string> path to temporary data
+
+Please refer to the C<slxsettings>-manpage for a more detailed description
+of these options.
+
+=cut
+
diff --git a/src/installer/slxos-setup b/src/installer/slxos-setup
new file mode 100755
index 00000000..8812a19b
--- /dev/null
+++ b/src/installer/slxos-setup
@@ -0,0 +1,402 @@
+#! /usr/bin/perl
+# -----------------------------------------------------------------------------
+# Copyright (c) 2006..2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+use strict;
+use warnings;
+
+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 Encode;
+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 lib "$FindBin::RealBin/../config-db";
+ # development path to config-db
+
+use OpenSLX::Basics;
+use OpenSLX::OSSetup::Engine;
+use OpenSLX::Utils;
+
+my %option;
+
+GetOptions(
+ 'help|?' => \$option{helpReq},
+ 'man' => \$option{manReq},
+ 'version' => \$option{versionReq},
+) or pod2usage(2);
+pod2usage(-msg => $abstract, -verbose => 0, -exitval => 1) if $option{helpReq};
+if ($option{manReq}) {
+ # avoid dubious problem with perldoc in combination with UTF-8 that
+ # leads to strange dashes and single-quotes being used
+ $ENV{LC_ALL} = 'POSIX';
+ pod2usage(-verbose => 2)
+}
+if ($option{versionReq}) {
+ system('slxversion');
+ exit 1;
+}
+
+if ($> != 0) {
+ die _tr("Sorry, this script can only be executed by the superuser!\n");
+}
+
+openslxInit();
+
+my $action = shift @ARGV || '';
+
+# create ossetup-engine for given distro and start it:
+my $engine = OpenSLX::OSSetup::Engine->new;
+if ($action =~ m[^import]i) {
+ my $vendorOSName = shift @ARGV;
+ if (!defined $vendorOSName) {
+ print STDERR _tr("You need to give the name of the vendor-os you'd like to import!\n");
+ pod2usage(2);
+ }
+ # 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, $!);
+ $engine->initialize($vendorOSName, 'import');
+ if (!-e $engine->{'vendor-os-path'}) {
+ die _tr("'%s' doesn't exist, giving up!\n", $engine->{'vendor-os-path'});
+ }
+ $engine->addInstalledVendorOSToConfigDB();
+} elsif ($action =~ m[^update]i) {
+ my $vendorOSName = shift @ARGV;
+ if (!defined $vendorOSName) {
+ print STDERR _tr("You need to give the name of the vendor-os you'd like to update!\n");
+ pod2usage(2);
+ }
+ # 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, $!);
+ $engine->initialize($vendorOSName, 'update');
+ $engine->updateVendorOS();
+} elsif ($action =~ m[^shell]i) {
+ my $vendorOSName = shift @ARGV;
+ if (!defined $vendorOSName) {
+ print STDERR _tr("You need to give the name of the vendor-os you'd like to start of shell for!\n");
+ pod2usage(2);
+ }
+ # 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, $!);
+ $engine->initialize($vendorOSName, 'shell');
+ $engine->startChrootedShellForVendorOS();
+} elsif ($action =~ m[^install]i) {
+ my $vendorOSName = shift @ARGV;
+ if (!defined $vendorOSName) {
+ print STDERR _tr("You need to give the name of the vendor-os you'd like to install!\n");
+ pod2usage(2);
+ }
+ # 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, $!);
+ $engine->initialize($vendorOSName, 'install');
+ $engine->installVendorOS();
+} elsif ($action =~ m[^clone]i) {
+ my $source = shift @ARGV;
+ my $vendorOSName = shift @ARGV;
+ if (!defined $source || !defined $vendorOSName) {
+ print STDERR _tr("You need to specify exactly one source and one vendor-OS-name!\n");
+ pod2usage(2);
+ }
+ # 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, $!);
+ $engine->initialize($vendorOSName, 'clone');
+ $engine->cloneVendorOS($source);
+} elsif ($action =~ m[^remove]i) {
+ my $vendorOSName = shift @ARGV;
+ if (!defined $vendorOSName) {
+ print STDERR _tr("You need to specify exactly one vendor-OS-name!\n");
+ pod2usage(2);
+ }
+ # 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, $!);
+ $engine->initialize($vendorOSName, 'remove');
+ $engine->removeVendorOS();
+} elsif ($action =~ m[^list-se]i) {
+ my $vendorOSName = shift @ARGV;
+ if (!defined $vendorOSName) {
+ print STDERR _tr("You need to specify exactly one vendor-OS-name!\n");
+ pod2usage(2);
+ }
+ # 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, $!);
+ $engine->initialize($vendorOSName, 'install');
+ print _tr("List of supported selections for '%s':\n", $vendorOSName);
+ print join('', map { "\t$_\n" }
+ sort keys %{$engine->{'distro-info'}->{selection}});
+} elsif ($action =~ m[^list-su]i) {
+ print _tr("List of supported distros:\n");
+ print join('', map {
+ "\t$_"
+ .(' 'x(20-length($_)))
+ ."\t($supportedDistros{$_})\n"
+ }
+ sort keys %supportedDistros);
+} elsif ($action =~ m[^list-in]i) {
+ print _tr("List of installed vendor-OSes:\n");
+ print join(
+ '',
+ map {
+ my $vendorOS = decode('utf8', $_);
+ $vendorOS =~ s[^.+/][];
+ "\t$vendorOS\n";
+ }
+ grep { -d $_ }
+ sort glob("$openslxConfig{'private-path'}/stage1/*")
+ );
+} else {
+ vlog(0, _tr(unshiftHereDoc(<<' END-OF-HERE'), $0));
+ You need to specify exactly one action:
+ clone
+ import-into-db
+ install
+ list-installed
+ list-selections
+ list-supported
+ remove
+ shell
+ update
+ Try '%s --help' for more info.
+ END-OF-HERE
+}
+
+
+
+=head1 NAME
+
+slxos-setup - OpenSLX-script to install a vendor-OS.
+
+=head1 SYNOPSIS
+
+slxos-setup [options] <action> <action-params> ...
+
+=head3 Options
+
+ --help brief help message
+ --log-level=<int> level of logging verbosity (0-3)
+ --man show full documentation
+ --version show version
+
+=head3 Actions
+
+=over 8
+
+=item B<< clone <rsync-source-uri> <vendor-os-name> >>
+
+clones an existing operating system via rsync
+
+=item B<< import-into-db <vendor-os-name> >>
+
+imports a vendor-OS into the openslx-db
+
+=item B<< install <vendor-os-name> >>
+
+installs a vendor-OS into a folder
+
+=item B<< list-installed >>
+
+show installed vendor-OSes
+
+=item B<< list-selections <vendor-os-name> >>
+
+show available selections for given vendor-OS
+
+=item B<< list-supported >>
+
+show supported distros
+
+=item B<< remove <vendor-os-name> >>
+
+removes an installed vendor-OS
+
+=item B<< shell <vendor-os-name> >>
+
+starts a chrooted shell for an installed vendor-OS
+
+=item B<< update <vendor-os-name> >>
+
+updates an installed vendor-OS
+
+=back
+
+=head1 DESCRIPTION
+
+B<slxos-setup> installs an operating system into a folder which
+will be used as a OpenSLX-stage1-system (a.k.a. a I<vendor-OS>).
+
+You can either install a vendor-OS from scratch (causing the required
+packages to be downloaded or copied from a local source). Installing
+is supported for several different LINUX distributions, but not for all
+of them.
+
+Alternatively, a locally installed operating system can be cloned
+into a vendor-OS.
+
+When invoking slxos-setup, you have to pass it the name of the vendor-OS
+you wish to create.
+
+=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.
+
+=item B<vendor-os-name>
+
+The vendor-os-name is the name of the vendor-OS that shall be installed,
+cloned, imported or updated. It corresponds to a folder in the OpenSLX-
+stage1-path (usually /var/opt/openslx/stage1).
+The general format of a vendor-os-name is:
+
+ <distro-name>-<release-version>
+or
+ <distro-name>-<release-version>-<selection>
+
+The distro-name is something like 'suse' or 'fedora', and the release-version
+is a numerical version, e.g. '10.1' or '6'.
+
+If you specify a selection, too, you state that you want all the packages
+that are provided by the specific selection (many distributions offer several
+different package selections for installation, like 'kde' or 'gnome').
+If you do not specify any selection, you will get the default selection of
+that distribution.
+
+If you pass an unknown selection, you will see a list of the selections
+that are available. The available selections for any vendor-OS can be requested
+via the 'list-selections' action.
+
+In clone-mode, it is a good idea to specify some unique string as the selection
+part of the vendor-os-name, such that you will easily recognize the vendor-OS
+at a later stage. We recommend something like '-cloned-from-<name-of-rsync-source>'.
+
+=item B<rsync-source-uri>
+
+When cloning a vendor-OS, slxos-setup needs to know where to fetch
+the existing OS-files from. Please check the 'rsync' docs for what
+format an rsync-uri has.
+
+=back
+
+=head1 EXAMPLES
+
+=head3 Installing a Vendor-OS
+
+=over 8
+
+=item B<< slxos-setup install suse-11.1 >>
+
+Installs the distro suse-11.1 as a new vendor-OS.
+
+=item B<< slxos-setup install suse-11.1-gnome >>
+
+Installs the 'gnome'-selection of distro suse-11.1 as a new
+vendor-OS.
+
+=back
+
+=head3 Cloning an Operating System to Make a New Vendor-OS
+
+=over 8
+
+=item B<< slxos-setup clone my_server:/ suse-11.1-clone-my_server >>
+
+Clones the suse-11.1 system from server 'my_server' as a new
+vendor-OS, which will be named 'suse-11.1-clone-my_server'.
+
+=back
+
+=head3 Updating a Vendor-OS
+
+=over 8
+
+=item B<< slxos-setup update suse-11.1 >>
+
+Updates the (existing) vendor-OS 'suse-11.1'.
+
+=back
+
+=head3 Importing an Existing Vendor-OS into the Config-DB
+
+=over 8
+
+=item B<< slxos-setup import-into-db suse-11.1 >>
+
+Imports the (existing) vendor-OS 'suse-11.1' into the config-DB.
+
+=back
+
+=head3 Removing a Vendor-OS
+
+=over 8
+
+=item B<< slxos-setup remove suse-11.1 >>
+
+Wipes the (existing) vendor-OS 'suse-11.1' from disk and removes it
+from the config-DB, too.
+
+=back
+
+=head1 SEE ALSO
+
+slxsettings, slxos-export, slxconfig, slxconfig-demuxer
+
+=head1 GENERAL OPENSLX OPTIONS
+
+Being a part of OpenSLX, this script supports several other options
+which can be used to overrule the OpenSLX settings:
+
+ --db-name=<string> name of database
+ --db-spec=<string> full DBI-specification of database
+ --db-type=<string> type of database to connect to
+ --locale=<string> locale to use for translations
+ --log-level=<int> level of logging verbosity (0-3)
+ --logfile=<string> file to write logging output to
+ --private-path=<string> path to private data
+ --public-path=<string> path to public (client-accesible) data
+ --temp-path=<string> path to temporary data
+
+Please refer to the C<slxsettings>-manpage for a more detailed description
+of these options.
+
+=cut
diff --git a/src/lib/OpenSLX/Basics.pm b/src/lib/OpenSLX/Basics.pm
new file mode 100644
index 00000000..4ac40166
--- /dev/null
+++ b/src/lib/OpenSLX/Basics.pm
@@ -0,0 +1,856 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+package OpenSLX::Basics;
+
+use strict;
+use warnings;
+
+our (@ISA, @EXPORT, $VERSION);
+
+use Exporter;
+$VERSION = 1.01;
+@ISA = qw(Exporter);
+
+@EXPORT = qw(
+ &openslxInit %openslxConfig %cmdlineConfig
+ &_tr
+ &warn &die &croak &carp &confess &cluck
+ &callInSubprocess &executeInSubprocess &slxsystem
+ &vlog
+ &checkParams
+ &instantiateClass &loadDistroModule
+);
+
+=head1 NAME
+
+OpenSLX::Basics - implements basic functionality for OpenSLX.
+
+=head1 DESCRIPTION
+
+This module exports basic functions, which are expected to be used all across
+OpenSLX.
+
+=cut
+
+our (%openslxConfig, %cmdlineConfig, %openslxPath);
+
+use subs qw(die warn);
+
+use open ':utf8';
+
+require Carp; # do not import anything as we are going to overload carp
+ # and croak!
+use Config::General;
+use Encode;
+use FindBin;
+use Getopt::Long;
+use POSIX qw(locale_h);
+
+my $translations;
+
+=head1 PUBLIC VARIABLES
+
+=over
+
+=item B<%openslxConfig>
+
+This hash holds the active openslx configuration.
+
+The initial content is based on environment variables or default values. Calling
+C<openslxInit()> will read the configuration files and/or cmdline arguments
+and modify this hash accordingly.
+
+The individual entries of this hash are documented in the manual of the
+I<slxsettings>-script, so please look there if you'd like to know more.
+
+=cut
+
+%openslxConfig = (
+ 'db-name' => $ENV{SLX_DB_NAME} || 'openslx',
+ 'db-spec' => $ENV{SLX_DB_SPEC},
+ 'db-type' => $ENV{SLX_DB_TYPE} || 'SQLite',
+ 'locale' => setlocale(LC_MESSAGES),
+ 'locale-charmap' => `locale charmap`,
+ 'base-path' => $ENV{SLX_BASE_PATH} || '/opt/openslx',
+ 'config-path' => $ENV{SLX_CONFIG_PATH} || '/etc/opt/openslx',
+ 'log-level' => $ENV{SLX_VERBOSE_LEVEL} || '0',
+ 'private-path' => $ENV{SLX_PRIVATE_PATH} || '/var/opt/openslx',
+ 'public-path' => $ENV{SLX_PUBLIC_PATH} || '/srv/openslx',
+ 'temp-path' => $ENV{SLX_TEMP_PATH} || '/tmp',
+
+ #
+ # options useful during development only:
+ #
+ 'debug-confess' => '0',
+ #
+ # only settable programmatically:
+ #
+ 'log-pids' => '0',
+
+ #
+ # extended settings follow, which are only supported by slxsettings,
+ # but not by any other script:
+ #
+ 'db-user' => undef,
+ 'db-passwd' => undef,
+ 'default-shell' => 'bash',
+ 'default-timezone' => 'Europe/Berlin',
+ 'mirrors-preferred-top-level-domain' => undef,
+ 'mirrors-to-try-count' => '20',
+ 'mirrors-to-use-count' => '5',
+ 'ossetup-max-try-count' => '5',
+ 'pxe-default-menu-entry' => undef,
+ 'pxe-passwd' => 'secret',
+ 'pxe-timeout' => '100',
+ 'pxe-title' => 'Welcome to OpenSLX',
+ 'pxe-totaltimeout' => '600',
+ 'syslinux-theme' => 'openslx',
+);
+chomp($openslxConfig{'locale-charmap'});
+
+=item B<%cmdlineConfig>
+
+This hash holds the config items that were specified via cmdline. This can be
+useful if you need to find out which settings have been specified via cmdline
+and which ones have come from a config file.
+
+Currently, only the slxsettings script and some tests make use of this hash.
+
+=cut
+
+# specification of cmdline arguments that are shared by all openslx-scripts:
+my %openslxCmdlineArgs = (
+
+ # name of database, defaults to 'openslx'
+ 'db-name=s' => \$cmdlineConfig{'db-name'},
+
+ # full specification of database, a special string defining the
+ # precise database to connect to (the contents of this string
+ # depend on db-type)
+ 'db-spec=s' => \$cmdlineConfig{'db-spec'},
+
+ # type of database to connect to (SQLite, mysql, ...), defaults to 'SQLite'
+ 'db-type=s' => \$cmdlineConfig{'db-type'},
+
+ # activates debug mode, this will show the lines where any error occured
+ # (followed by a stacktrace):
+ 'debug-confess' => \$cmdlineConfig{'debug-confess'},
+
+ # locale to use for translations
+ 'locale=s' => \$cmdlineConfig{'locale'},
+
+ # locale-charmap to use for I/O (iso-8859-1, utf-8, etc.)
+ 'locale-charmap=s' => \$cmdlineConfig{'locale-charmap'},
+
+ # level of logging verbosity (0-3)
+ 'log-level=i' => \$cmdlineConfig{'log-level'},
+
+ # file to write logging output to, defaults to STDERR
+ 'logfile=s' => \$cmdlineConfig{'locale'},
+
+ # path to private data (which is *not* accesible by clients and contains
+ # database, vendorOSes and all local extensions [system specific scripts])
+ 'private-path=s' => \$cmdlineConfig{'private-path'},
+
+ # path to public data (which is accesible by clients and contains
+ # PXE-configurations, kernels, initramfs and client configurations)
+ 'public-path=s' => \$cmdlineConfig{'public-path'},
+
+ # path to temporary data (used during demuxing)
+ 'temp-path=s' => \$cmdlineConfig{'temp-path'},
+);
+
+# filehandle used for logging:
+my $openslxLog = *STDERR;
+
+$Carp::CarpLevel = 1;
+
+=back
+
+=head1 PUBLIC FUNCTIONS
+
+=over
+
+=item B<openslxInit()>
+
+Initializes OpenSLX environment - every script should invoke this function
+before it invokes any other.
+
+Basically, this function reads in the configuration and sets up logging
+and translation backends.
+
+Returns 1 upon success and dies in case of a problem.
+
+=cut
+
+sub openslxInit
+{
+ # evaluate cmdline arguments:
+ Getopt::Long::Configure('no_pass_through');
+ GetOptions(%openslxCmdlineArgs);
+
+ # try to read and evaluate config files:
+ my $configPath
+ = $cmdlineConfig{'config-path'} || $openslxConfig{'config-path'};
+ my $sharePath = "$openslxConfig{'base-path'}/share";
+ my $verboseLevel = $cmdlineConfig{'log-level'} || 0;
+ foreach my $f (
+ "$sharePath/settings.default",
+ "$configPath/settings",
+ "$ENV{HOME}/.openslx/settings"
+ ) {
+ next unless -e $f;
+ if ($verboseLevel >= 2) {
+ vlog(0, "reading config-file $f...");
+ }
+ my $configObject = Config::General->new(
+ -AutoTrue => 1,
+ -ConfigFile => $f,
+ -LowerCaseNames => 1,
+ -SplitPolicy => 'equalsign',
+ );
+ my %config = $configObject->getall();
+ foreach my $key (keys %config) {
+ # N.B.: these config files are used by shell-scripts, too, so in
+ # order to comply with shell-style, the config files use shell
+ # syntax and an uppercase, underline-as-separator format.
+ # Internally, we use lowercase, minus-as-separator format, so we
+ # need to convert the environment variable names to our own
+ # internal style here (e.g. 'SLX_BASE_PATH' to 'base-path'):
+ my $ourKey = $key;
+ $ourKey =~ s[^slx_][];
+ $ourKey =~ tr/_/-/;
+ $openslxConfig{$ourKey} = $config{$key};
+ }
+ }
+
+ # push any cmdline argument into our config hash, possibly overriding any
+ # setting from the config files:
+ while (my ($key, $val) = each(%cmdlineConfig)) {
+ next unless defined $val;
+ $openslxConfig{$key} = $val;
+ }
+
+ if (defined $openslxConfig{'logfile'}) {
+ open($openslxLog, '>>', $openslxConfig{'logfile'})
+ or croak(
+ _tr(
+ "unable to append to logfile '%s'! (%s)",
+ $openslxConfig{'logfile'}, $!
+ )
+ );
+ }
+ if ($openslxConfig{'log-level'} >= 2) {
+ foreach my $key (sort keys %openslxConfig) {
+ my $val = $openslxConfig{$key} || '';
+ vlog(2, "config-dump: $key = $val");
+ }
+ }
+
+ # setup translation "engine":
+ _trInit();
+
+ return 1;
+}
+
+=item B<vlog($level, $message)>
+
+Logs the given I<$message> if the current log level is equal or greater than
+the given I<$level>.
+
+=cut
+
+sub vlog
+{
+ my $minLevel = shift;
+ return if $minLevel > $openslxConfig{'log-level'};
+ my $str = join("", '-' x $minLevel, @_);
+ if (substr($str, -1, 1) ne "\n") {
+ $str .= "\n";
+ }
+ if ($openslxConfig{'log-pids'}) {
+ print $openslxLog "$$: $str";
+ } else {
+ print $openslxLog $str;
+ }
+ return;
+}
+
+=item B<_tr($originalMsg, @msgParams)>
+
+Translates the english text given in I<$originalMsg> to the currently selected
+language, passing on any given additional I<$msgParams> to the translation
+process (as printf arguments).
+
+N.B.: although it starts with an underscore, this is still a public function!
+
+=cut
+
+sub _tr
+{
+ my $trOrig = shift;
+
+ my $trKey = $trOrig;
+ $trKey =~ s[\n][\\n]g;
+ $trKey =~ s[\t][\\t]g;
+
+ my $formatStr;
+ if (defined $translations) {
+ $formatStr = $translations->{$trKey};
+ }
+ if (!defined $formatStr) {
+ $formatStr = $trOrig;
+ }
+ return sprintf($formatStr, @_);
+}
+
+=item B<callInSubprocess($childFunc)>
+
+Forks the current process and invokes the code given in I<$childFunc> in the
+child process. The parent blocks until the child has executed that function.
+
+If an error occured during execution of I<$childFunc>, the parent process will
+cleanup the child and then pass back that error with an invocation of die().
+
+If the process of executing I<$childFunc> is being interrupted by a signal,
+the parent will cleanup and then exit with an appropriate exit code.
+
+=cut
+
+sub callInSubprocess
+{
+ my $childFunc = shift;
+
+ my $pid = fork();
+ if (!$pid) {
+ # child -> execute the given function and exit:
+ if (! eval { $childFunc->(); 1 }) {
+ $@ = "*** $@" unless substr( $@, 0, 4) eq '*** ';
+ print STDERR "$@\n";
+ }
+ exit 0;
+ }
+
+ # parent -> pass on interrupt- and terminate-signals to child ...
+ $SIG{INT} = sub { kill 'INT', $pid; };
+ $SIG{TERM} = sub { kill 'TERM', $pid; };
+
+ # ... and wait until child has done its work
+ waitpid($pid, 0);
+ exit $? if $?;
+
+ return;
+}
+
+=item B<executeInSubprocess(@cmdlineArgs)>
+
+Forks the current process and executes the program given in I<@cmdlineArgs> in
+the child process.
+
+The parent process returns immediately after having spawned the new process,
+returning the process-ID of the child.
+
+=cut
+
+sub executeInSubprocess
+{
+ my @cmdlineArgs = @_;
+
+ my $pid = fork();
+ if (!$pid) {
+
+ # child...
+ # ...exec the given cmdline:
+ exec(@cmdlineArgs);
+ }
+
+ # parent...
+ return $pid;
+}
+
+=item B<slxsystem(@cmdlineArgs)>
+
+Executes a new program specified by I<@cmdlineArgs> and waits until it is done.
+
+Returns the exit code of the execution (usually 0 if everything is ok).
+
+If any signal (other than SIGPIPE) interrupts the execution, this function
+dies with an appropriate error message. SIGPIPE is being ignored in order
+to ignore any failed FTP connections and the like (we just return the
+error code instead).
+
+=cut
+
+sub slxsystem
+{
+ vlog(2, _tr("executing: %s", join ' ', @_));
+ my $res = system(@_);
+ if ($res > 0) {
+ # check if child got killed, if so we stop, too (unless the signal is
+ # SIGPIPE, which we ignore in order to loop over failed FTP connections
+ # and the like):
+ my $signalNo = $res & 127;
+ if ($signalNo > 0 && $signalNo != 13) {
+ die _tr(
+ "child-process received signal '%s', parent stops!", $signalNo
+ );
+ }
+ }
+ return $res;
+}
+
+=item B<cluck()>, B<carp()>, B<warn()>, B<confess()>, B<croak()>, B<die()>
+
+Overrides of the respective functions in I<Carp::> or I<CORE::> that mark
+any warnings with '°°°' and any errors with '***' in order to make them
+more visible in the output.
+
+=cut
+
+sub cluck
+{
+ _doThrowOrWarn('cluck', @_);
+ return;
+}
+
+sub carp
+{
+ _doThrowOrWarn('carp', @_);
+ return;
+}
+
+sub warn
+{
+ _doThrowOrWarn('warn', @_);
+ return;
+}
+
+sub confess
+{
+ _doThrowOrWarn('confess', @_);
+ return;
+}
+
+sub croak
+{
+ _doThrowOrWarn('croak', @_);
+ return;
+}
+
+sub die
+{
+ _doThrowOrWarn('die', @_);
+ return;
+}
+
+=item B<checkParams($params, $paramsSpec)>
+
+Utility function that can be used by any function that accepts param-hashes
+to check if the parameters given in I<$params> actually match the expectations
+specified in I<$paramsSpec>.
+
+Each individual parameter has a specification that describes the expectation
+that the calling function has towards this param. The following specifications
+are supported:
+
+* '!' - the parameter is required
+* '?' - the parameter is optional
+* 'm{regex}' - the parameter must match the given regex
+* '!class=...' - the parameter is required and must be an object of the given class
+* '?class=...' - if the parameter has been given, it must be an object of the given class
+
+The function will confess for any unknown, missing, or non-matching param.
+
+=cut
+
+sub checkParams
+{
+ my $params = shift or confess('need to pass in params-hashref!');
+ my $paramsSpec = shift or confess('need to pass in params-spec-hashref!');
+
+ # print a warning for any unknown parameters that have been given:
+ my @unknownParams
+ = grep { !exists $paramsSpec->{$_}; }
+ keys %$params;
+ if (@unknownParams) {
+ my $unknownParamsStr = join ',', @unknownParams;
+ confess("Enocuntered unknown params: '$unknownParamsStr'!\n");
+ }
+
+ # check if all required params have been specified:
+ foreach my $param (keys %$paramsSpec) {
+ my $spec = $paramsSpec->{$param};
+ if (ref($spec) eq 'HASH') {
+ # Handle nested specs by recursion:
+ my $subParams = $params->{$param};
+ if (!defined $subParams) {
+ confess("Required param '$param' is missing!");
+ }
+ checkParams($subParams, $spec);
+ }
+ elsif (ref($spec) eq 'ARRAY') {
+ # Handle nested spec arrays by looped recursion:
+ my $subParams = $params->{$param};
+ if (!defined $subParams) {
+ confess("Required param '$param' is missing!");
+ }
+ elsif (ref($subParams) ne 'ARRAY') {
+ confess("Value for param '$param' must be an array-ref!");
+ }
+ foreach my $subParam (@$subParams) {
+ checkParams($subParam, $spec->[0]);
+ }
+ }
+ elsif ($spec eq '!') {
+ # required parameter:
+ if (!exists $params->{$param}) {
+ confess("Required param '$param' is missing!");
+ }
+ }
+ elsif ($spec =~ m{^\!class=(.+)$}i) {
+ my $class = $1;
+ # required parameter ...
+ if (!exists $params->{$param}) {
+ confess("Required param '$param' is missing!");
+ }
+ # ... of specific class
+ if (!$params->{$param}->isa($class)) {
+ confess("Param '$param' is not a '$class', but that is required!");
+ }
+ }
+ elsif ($spec eq '?') {
+ # optional parameter - nothing to do
+ }
+ elsif ($spec =~ m{^\?class=(.+)$}i) {
+ my $class = $1;
+ # optional parameter ...
+ if (exists $params->{$param}) {
+ # ... has been given, so it must match specific class
+ if (!$params->{$param}->isa($class)) {
+ confess("Param '$param' is not a '$class', but that is required!");
+ }
+ }
+ }
+ elsif ($spec =~ m{^m{(.+)}$}) {
+ # try to match given regex:
+ my $regex = $1;
+ my $value = $params->{$param};
+ if ($value !~ m{$regex}) {
+ confess("Required param '$param' isn't matching regex '$regex' (given value was '$value')!");
+ }
+ }
+ else {
+ # complain about unknown spec:
+ confess("Unknown param-spec '$spec' encountered!");
+ }
+ }
+
+ return scalar 1;
+}
+
+=item B<instantiateClass($class, $flags)>
+
+Loads the required module and instantiates an object of the class given in
+I<$class>.
+
+The following flags can be specified via I<$flags>-hashref:
+
+=over
+
+=item acceptMissing [optional]
+
+Usually, this function will die if the corresponding module could not be found
+(acceptMissing == 0). Pass in acceptMissing => 1 if you want this function
+to return undef instead.
+
+=item pathToClass [optional]
+
+Sometimes, the module specified in I<$class> lives relative to another path.
+If so, you can specify the base path of that module via this flag.
+
+=item incPaths [optional]
+
+Some modules live outside of the standard perl search paths. If you'd like to
+load such a module, you can specify one (or more) paths that will be added
+to @INC while trying to load the module.
+
+=item version [optional]
+
+If you require a specific version of the module, you can specify the version
+number via the I<$version> flag.
+
+=back
+
+=cut
+
+sub instantiateClass
+{
+ my $class = shift;
+ my $flags = shift || {};
+
+ checkParams($flags, {
+ 'acceptMissing' => '?',
+ 'pathToClass' => '?',
+ 'incPaths' => '?',
+ 'version' => '?',
+ });
+ my $pathToClass = $flags->{pathToClass};
+ my $requestedVersion = $flags->{version};
+ my $incPaths = $flags->{incPaths} || [];
+
+ my $moduleName = defined $pathToClass ? "$pathToClass/$class" : $class;
+ $moduleName =~ s[::][/]g;
+ $moduleName .= '.pm';
+
+ vlog(3, "trying to load $moduleName...");
+ local @INC = @INC;
+ foreach my $incPath (@$incPaths) {
+ next if grep { $_ eq $incPath } @INC;
+ unshift @INC, $incPath;
+ }
+ if (!eval { require $moduleName; 1 } ) {
+ # check if module does not exists anywhere in search path
+ if ($! == 2) {
+ return if $flags->{acceptMissing};
+ die _tr("Module '%s' not found!\n", $moduleName);
+ }
+ # some other error (probably compilation problems)
+ die _tr("Unable to load module '%s' (%s)\n", $moduleName, $@);
+ }
+ if (defined $requestedVersion) {
+ my $classVersion = $class->VERSION;
+ if ($classVersion < $requestedVersion) {
+ die _tr(
+ 'Could not load class <%s> (Version <%s> required, but <%s> found)',
+ $class, $requestedVersion, $classVersion);
+ }
+ }
+ return $class->new;
+}
+
+=item B<loadDistroModule($params)>
+
+Tries to determine the most appropriate distro module for the context specified
+via the given I<$params>.
+
+During that process, this function will try to load several different modules,
+working its way from the most specific down to a generic fallback.
+
+For example: when given I<suse-10.3_x86_64> as distroName, this function would
+try the following modules:
+
+=over
+
+=item I<Suse_10_3_x86_64>
+
+=item I<Suse_10_3>
+
+=item I<Suse_10>
+
+=item I<Suse>
+
+=item I<Base> (or whatever has been given as fallback name)
+
+=back
+
+The I<$params>-hashref supports the following entries:
+
+=over
+
+=item distroName
+
+Specifies the name of the distro as it was retrieved from the vendor-OS
+(e.g. 'suse-10.2' or 'ubuntu-8.04_amd64').
+
+=item distroScope
+
+Specifies the scope of the required distro class (e.g.
+'OpenSLX::OSSetup::Distro' or 'vmware::OpenSLX::Distro').
+
+=item fallbackName [optional]
+
+Instead of the default 'Base', you can specify the name of a different fallback
+class that will be tried if no module matching the given distro name could be
+found.
+
+=item pathToClass [optional]
+
+If you require the distro modules to be loaded relative to a specific path,
+you can specify that base path via the I<$pathToClass> param.
+
+=back
+
+=cut
+
+sub loadDistroModule
+{
+ my $params = shift;
+
+ checkParams($params, {
+ 'distroName' => '!',
+ 'distroScope' => '!',
+ 'fallbackName' => '?',
+ 'pathToClass' => '?',
+ });
+ my $distroName = ucfirst(lc($params->{distroName}));
+ my $distroScope = $params->{distroScope};
+ my $fallbackName = $params->{fallbackName} || 'Base';
+ my $pathToClass = $params->{pathToClass};
+
+ vlog(1, "finding a ${distroScope} module for $distroName ...");
+
+ # try to load the distro module starting with the given name and then
+ # working the way upwards (from most specific to generic).
+ $distroName =~ tr{.-}{__};
+ my @distroModules;
+ my $blockRX = qr{
+ ^(.+?)_ # everything before the last block (the rest is dropped)
+ (?:x86_)? # takes care to treat 'x86_64' as one block
+ [^_]*$ # the last _-block
+ }x;
+ while($distroName =~ m{$blockRX}) {
+ push @distroModules, $distroName;
+ $distroName = $1;
+ }
+ push @distroModules, $distroName;
+ push @distroModules, $fallbackName;
+
+ my $pluginBasePath = "$openslxConfig{'base-path'}/lib/plugins";
+
+ my $distro;
+ for my $distroModule (@distroModules) {
+ my $loaded = eval {
+ vlog(1, "trying ${distroScope}::$distroModule ...");
+ my $flags = { acceptMissing => 1 };
+ if ($pathToClass) {
+ $flags->{incPaths} = [ $pathToClass ];
+ }
+ $distro = instantiateClass("${distroScope}::$distroModule", $flags);
+ return 0 if !$distro; # module does not exist, try next
+ vlog(1, "ok - using ${distroScope}::$distroModule.");
+ 1;
+ };
+ last if $loaded;
+ if (!defined $loaded) {
+ die _tr(
+ "Error when trying to load distro module '%s':\n%s",
+ $distroModule, $@
+ );
+ }
+ }
+
+ return $distro;
+}
+
+sub _trInit
+{
+ # activate automatic charset conversion on all the standard I/O streams,
+ # just to give *some* support to shells in other charsets:
+ binmode(STDIN, ":encoding($openslxConfig{'locale-charmap'})");
+ binmode(STDOUT, ":encoding($openslxConfig{'locale-charmap'})");
+ binmode(STDERR, ":encoding($openslxConfig{'locale-charmap'})");
+
+ my $locale = $openslxConfig{'locale'};
+ if (lc($locale) eq 'c') {
+ # treat locale 'c' as equivalent for 'posix':
+ $locale = 'posix';
+ }
+
+ if (lc($locale) ne 'posix') {
+ # parse locale and canonicalize it (e.g. to 'de_DE') and generate
+ # two filenames from it (language+country and language only):
+ if ($locale !~ m{^\s*([^_]+)(?:_(\w+))?}) {
+ die "locale $locale has unknown format!?!";
+ }
+ my @locales;
+ if (defined $2) {
+ push @locales, lc($1) . '_' . uc($2);
+ }
+ push @locales, lc($1);
+
+ # try to load any of the Translation modules (starting with the more
+ # specific one [language+country]):
+ my $loadedTranslationModule;
+ foreach my $trName (@locales) {
+ vlog(2, "trying to load translation module $trName...");
+ my $trModule = "OpenSLX/Translations/$trName.pm";
+ my $trModuleSpec = "OpenSLX::Translations::$trName";
+ if (eval { require $trModule } ) {
+ # copy the translations available in the given locale into our
+ # hash:
+ $translations = $trModuleSpec->getAllTranslations();
+ $loadedTranslationModule = $trModule;
+ vlog(
+ 1,
+ _tr(
+ "translations module %s loaded successfully", $trModule
+ )
+ );
+ last;
+ }
+ }
+ if (!defined $loadedTranslationModule) {
+ vlog(1,
+ "unable to load any translations module for locale '$locale' ($!)."
+ );
+ }
+ }
+ return;
+}
+
+sub _doThrowOrWarn
+{
+ my $type = shift;
+ my $msg = shift;
+
+ # use '! ' for warnings and '***' for errors
+ $msg =~ s[^(! |\*\*\*) ][]gms;
+ if ($type eq 'carp' || $type eq 'warn' || $type eq 'cluck') {
+ $msg =~ s[^][! ]gms;
+ }
+ else {
+ $msg =~ s[^][*** ]gms;
+ }
+
+ if ($openslxConfig{'debug-confess'}) {
+ my %functionFor = (
+ 'carp' => sub { Carp::cluck @_ },
+ 'cluck' => sub { Carp::cluck @_ },
+ 'confess' => sub { Carp::confess @_ },
+ 'croak' => sub { Carp::confess @_ },
+ 'die' => sub { Carp::confess @_ },
+ 'warn' => sub { Carp::cluck @_ },
+ );
+ my $func = $functionFor{$type};
+ $func->($msg);
+ }
+ else {
+ chomp $msg;
+ my %functionFor = (
+ 'carp' => sub { Carp::carp @_ },
+ 'cluck' => sub { Carp::cluck @_ },
+ 'confess' => sub { Carp::confess @_ },
+ 'croak' => sub { Carp::croak @_ },
+ 'die' => sub { CORE::die @_},
+ 'warn' => sub { CORE::warn @_ },
+ );
+ my $func = $functionFor{$type};
+ $func->("$msg\n");
+ }
+ return;
+}
+
+
+=back
+
+=cut
+
+1;
diff --git a/src/lib/OpenSLX/ConfigFolder.pm b/src/lib/OpenSLX/ConfigFolder.pm
new file mode 100644
index 00000000..fd52821e
--- /dev/null
+++ b/src/lib/OpenSLX/ConfigFolder.pm
@@ -0,0 +1,154 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+package OpenSLX::ConfigFolder;
+
+use strict;
+use warnings;
+
+our (@ISA, @EXPORT, $VERSION);
+
+use Exporter;
+$VERSION = 1.01;
+@ISA = qw(Exporter);
+
+@EXPORT = qw(
+ &createConfigFolderForDefaultSystem
+ &createConfigFolderForSystem
+);
+
+=head1 NAME
+
+OpenSLX::ConfigFolder - implements configuration folder related functionality
+for OpenSLX.
+
+=head1 DESCRIPTION
+
+This module exports functions that create configuration folders for specific
+system, which will be used by the slxconfig-demuxer when building an initramfs
+for each system.
+
+=cut
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+=head1 PUBLIC FUNCTIONS
+
+=over
+
+=item B<createConfigFolderForDefaultSystem()>
+
+Creates the configuration folder for the default system.
+
+The resulting folder will be named C<default> and will be created
+in the I<OpenSLX-private-path>C</config>-folder (usually
+C</var/opt/openslx/config>).
+
+Within that folder, two subfolders, C<initramfs> and C<rootfs> will be created.
+
+In the C<initramfs>-subfolder, two files will be created: C<preinit.local>
+and C<postinit.local>, who are empty stub-scripts meant to be edited by the
+OpenSLX admin.
+
+The functions returns 1 if any folder or file had to be created and 0 if all the
+required folders & files already existed.
+
+=cut
+
+sub createConfigFolderForDefaultSystem
+{
+ my $result = 0;
+ my $defaultConfigPath = "$openslxConfig{'private-path'}/config/default";
+ if (!-e "$defaultConfigPath/initramfs") {
+ slxsystem("mkdir -p $defaultConfigPath/initramfs");
+ $result = 1;
+ }
+ if (!-e "$defaultConfigPath/rootfs") {
+ slxsystem("mkdir -p $defaultConfigPath/rootfs");
+ $result = 1;
+ }
+
+ # create default pre-/postinit scripts for us in initramfs:
+ my $preInitFile = "$defaultConfigPath/initramfs/preinit.local";
+ if (!-e $preInitFile) {
+ my $preInit = unshiftHereDoc(<<' END-of-HERE');
+ #!/bin/sh
+ #
+ # This script allows the local admin to extend the
+ # capabilities at the beginning of the initramfs (stage3).
+ # The toolset is rather limited and you have to keep in mind
+ # that stage4 rootfs has the prefix '/mnt'.
+ END-of-HERE
+ spitFile($preInitFile, $preInit);
+ slxsystem("chmod u+x $preInitFile");
+ $result = 1;
+ }
+
+ my $postInitFile = "$defaultConfigPath/initramfs/postinit.local";
+ if (!-e $postInitFile) {
+ my $postInit = unshiftHereDoc(<<' END-of-HERE');
+ #!/bin/sh
+ #
+ # This script allows the local admin to extend the
+ # capabilities at the end of the initramfs (stage3).
+ # The toolset is rather limited and you have to keep in mind
+ # that stage4 rootfs has the prefix '/mnt'.
+ # But you may use some special slx-functions available via
+ # inclusion: '. /etc/functions' ...
+ END-of-HERE
+ spitFile($postInitFile, $postInit);
+ slxsystem("chmod u+x $postInitFile");
+ $result = 1;
+ }
+ return $result;
+}
+
+=item B<createConfigFolderForSystem($systemName)>
+
+Creates the configuration folder for the system whose name has been given in
+I<$systemName>.
+
+The resulting folder will be named just like the system and will be created
+in the I<OpenSLX-private-path>C</config>-folder (usually
+C</var/opt/openslx/config>).
+
+In that folder, a single subfolder C<default> will be created (representing
+the default setup for all clients of that system). Within that folder, two
+subfolders, C<initramfs> and C<rootfs> will be created.
+
+The functions returns 1 if any folder had to be created and 0 if all the
+required folders already existed.
+
+=cut
+
+sub createConfigFolderForSystem
+{
+ my $systemName = shift || confess "need to pass in system-name!";
+
+ my $result = 0;
+ my $systemConfigPath
+ = "$openslxConfig{'private-path'}/config/$systemName/default";
+ if (!-e "$systemConfigPath/initramfs") {
+ slxsystem("mkdir -p $systemConfigPath/initramfs");
+ $result = 1;
+ }
+ if (!-e "$systemConfigPath/rootfs") {
+ slxsystem("mkdir -p $systemConfigPath/rootfs");
+ $result = 1;
+ }
+ return $result;
+}
+
+=back
+
+=cut
+
+1;
diff --git a/src/lib/OpenSLX/DistroUtils.pm b/src/lib/OpenSLX/DistroUtils.pm
new file mode 100644
index 00000000..d7456d92
--- /dev/null
+++ b/src/lib/OpenSLX/DistroUtils.pm
@@ -0,0 +1,90 @@
+# Copyright (c) 2008, 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# DistroUtils.pm
+# - provides utility distro based functions for OpenSLX
+# -----------------------------------------------------------------------------
+package OpenSLX::DistroUtils;
+
+use strict;
+use warnings;
+
+use OpenSLX::Utils;
+use OpenSLX::Basics;
+
+use Data::Dumper;
+
+use OpenSLX::DistroUtils::Engine;
+use OpenSLX::DistroUtils::InitFile;
+
+use Exporter;
+
+use vars qw(@ISA @EXPORT $VERSION);
+
+use Exporter;
+$VERSION = 1.01;
+@ISA = qw(Exporter);
+
+@EXPORT = qw(
+ newInitFile
+ getInitFileForDistro
+ simpleInitFile
+ getKernelVersionForDistro
+);
+
+
+
+sub newInitFile {
+ return OpenSLX::DistroUtils::InitFile->new();
+}
+
+
+sub simpleInitFile {
+ my $config = shift;
+ my $initFile = OpenSLX::DistroUtils::InitFile->new();
+
+ return $initFile->simpleSetup($config);
+}
+
+
+sub getInitFileForDistro {
+ my $initFile = shift;
+ my $distroName = shift;
+ my $distro;
+
+ my $engine = OpenSLX::DistroUtils::Engine->new();
+
+ if ($distroName) {
+ $distro = $engine->loadDistro($distroName);
+ } else {
+ $distro = $engine->loadDistro('Base');
+ }
+
+ #return $distro->dumpInit($initFile);
+ return $distro->generateInitFile($initFile);
+}
+
+sub getKernelVersionForDistro {
+ my $kernelPath = shift;
+ my $distroName = shift;
+ my $distro;
+
+ my $engine = OpenSLX::DistroUtils::Engine->new();
+
+ if ($distroName) {
+ $distro = $engine->loadDistro($distroName);
+ } else {
+ $distro = $engine->loadDistro('Base');
+ }
+
+ return $distro->getKernelVersion($kernelPath);
+}
+
+1; \ No newline at end of file
diff --git a/src/lib/OpenSLX/DistroUtils/Base.pm b/src/lib/OpenSLX/DistroUtils/Base.pm
new file mode 100644
index 00000000..f9e6b13b
--- /dev/null
+++ b/src/lib/OpenSLX/DistroUtils/Base.pm
@@ -0,0 +1,429 @@
+# Copyright (c) 2008, 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# DistroUtils.pm
+# - provides base for distro based utils for OpenSLX
+# -----------------------------------------------------------------------------
+package OpenSLX::DistroUtils::Base;
+
+use Data::Dumper;
+use OpenSLX::Utils;
+use Clone qw(clone);
+use Switch;
+
+use strict;
+use warnings;
+
+sub new
+{
+ my $class = shift;
+ my $self = {};
+ return bless $self, $class;
+}
+
+sub dumpInit
+{
+ my $self = shift;
+ my $initFile = shift;
+
+ print Dumper($initFile->{'configHash'});
+
+ print $self->generateInitFile($initFile);
+}
+
+sub _concatContent
+{
+ my $self = shift;
+ my $block = shift;
+
+ my $output;
+
+ $output = "#";
+ $output .= $block->{'blockDesc'};
+ $output .= "\n";
+
+ my $content = $block->{'content'};
+ while ( my ($priority, $contentArray) = each %$content )
+ {
+ $output .= join("\n", @$contentArray);
+ $output .= "\n";
+ }
+
+ return $output;
+}
+
+sub _renderInfoBlock
+{
+ my $self = shift;
+ my $config = shift;
+
+ my $tpl = unshiftHereDoc(<<' End-of-Here');
+ ### BEGIN INIT INFO
+ # Provides: %s
+ # Required-Start: %s
+ # Required-Stop: %s
+ # Default-Start: %s
+ # Default-Stop: %s
+ # Short-Description: %s
+ ### END INIT INFO
+
+ End-of-Here
+
+ return sprintf(
+ $tpl,
+ $config->{'name'},
+ $config->{'requiredStart'},
+ $config->{'requiredStop'},
+ $config->{'defaultStart'},
+ $config->{'defaultStop'},
+ $config->{'shortDesc'}
+ );
+}
+
+sub _insertSystemHelperFunctions
+{
+ my $self = shift;
+ my $content = shift;
+
+ # do some regex
+
+ # ubuntu:
+ # log_end_msg
+ # log_progress_msg
+ # log_daemon_msg
+ # log_action_msg
+
+ # start-stop-daemon
+
+ # suse http://de.opensuse.org/Paketbau/SUSE-Paketkonventionen/Init-Skripte
+
+ return $content;
+}
+
+sub _renderHighlevelConfig
+{
+ my $self = shift;
+ my $initFile = shift;
+
+ my $element;
+ my $hlc = $initFile->{'configHash'}->{'highlevelConfig'};
+
+ while ( $element = shift(@$hlc)){
+ switch ($element->{type}) {
+ case 'daemon' {
+ my $tpl;
+ $tpl = "%s_BIN=%s \n";
+ $tpl .= "[ -x %s_BIN ] || exit 5\n\n";
+ $tpl .= "%s_OPTS=\"%s\" \n";
+ $tpl .= "[ -f /etc/sysconfig/%s ] . /etc/sysconfig/%s \n\n";
+ $tpl .= "[ -f /etc/default/%s ] . /etc/default/%s \n\n";
+ $tpl .= "%s_PIDFILE=\"/var/run/%s.init.pid\" \n\n";
+ $initFile->addToBlock('head',
+ sprintf(
+ $tpl,
+ uc($element->{shortname}),
+ $element->{binary},
+ uc($element->{shortname}),
+ uc($element->{shortname}),
+ $element->{parameters},
+ $element->{shortname},
+ $element->{shortname},
+ $element->{shortname},
+ $element->{shortname},
+ uc($element->{shortname}),
+ $element->{shortname}
+ ),
+ $element->{priority}
+ );
+
+ $tpl = "echo -n \"Starting %s \"\n";
+ $tpl .= "startproc -f -p \$%s_PIDFILE \$%s_BIN \$%s_OPTS\n";
+ $tpl .= "rc_status -v";
+ $initFile->addToCase('start',
+ sprintf(
+ $tpl,
+ $element->{desc},
+ uc($element->{shortname}),
+ uc($element->{shortname}),
+ uc($element->{shortname})
+ ),
+ $element->{priority}
+ );
+
+ $tpl = "echo -n \"Shutting down %s\" \n";
+ $tpl .= "killproc -p \$%s_PIDFILE -TERM \$%s_BIN\n";
+ $tpl .= "rc_status -v";
+ $initFile->addToCase('stop',
+ sprintf(
+ $tpl,
+ $element->{desc},
+ uc($element->{shortname}),
+ uc($element->{shortname})
+ ),
+ 10 - $element->{priority}
+ );
+
+ $tpl = "## Stop the service and if this succeeds (i.e. the \n";
+ $tpl .= "## service was running before), start it again.\n";
+ $tpl .= "\$0 status >/dev/null && \$0 restart\n\n";
+ $tpl .= "# Remember status and be quiet\n";
+ $tpl .= "rc_status";
+ $initFile->addToCase('try-restart',
+ $tpl,
+ $element->{priority}
+ );
+
+ $tpl = "## Stop the service and regardless of whether it was \n";
+ $tpl .= "## running or not, start it again.\n";
+ $tpl .= "\$0 stop\n";
+ $tpl .= "\$0 start\n\n";
+ $tpl .= "# Remember status and be quiet\n";
+ $tpl .= "rc_status";
+ $initFile->addToCase('restart',
+ $tpl,
+ $element->{priority}
+ );
+
+ $tpl = "echo -n \"Reload service %s\"\n";
+ $tpl .= "killproc -p \$%s_PIDFILE -HUP \$%s_BIN\n";
+ $tpl .= "rc_status -v";
+ $initFile->addToCase('reload',
+ sprintf(
+ $tpl,
+ $element->{desc},
+ uc($element->{shortname}),
+ uc($element->{shortname}),
+ uc($element->{shortname})
+ ),
+ $element->{priority}
+ );
+
+ $tpl = "echo -n \"Checking for service %s\"\n";
+ $tpl .= "checkproc -p \$%s_PIDFILE \$%s_BIN\n";
+ $tpl .= "rc_status -v";
+ $initFile->addToCase('status',
+ sprintf(
+ $tpl,
+ $element->{desc},
+ uc($element->{shortname}),
+ uc($element->{shortname})
+ ),
+ $element->{priority}
+ );
+
+
+ }
+ case 'function' {
+ my $tpl;
+ $tpl = "%s () { \n";
+ $tpl .= "%s";
+ $tpl .= "\n}\n";
+ $initFile->addToBlock('functions',
+ sprintf(
+ $tpl,
+ $element->{name},
+ $element->{script}
+ )
+ );
+
+ }
+ case 'functionCall' {
+ my $tpl;
+ $tpl = "%s %s\n";
+ #$tpl .= "%s\n ";
+ $initFile->addToCase($element->{block},
+ sprintf(
+ $tpl,
+ $element->{function},
+ $element->{parameters},
+ ""
+ ),
+ $element->{priority}
+ );
+
+ }
+ }
+ }
+
+}
+
+
+sub _getInitsystemIncludes
+{
+ return "\n";
+}
+
+sub _renderCasePrefix
+{
+ return "\n";
+}
+
+sub _renderFooter
+{
+ return "exit 0\n";
+}
+
+sub _generateUsage
+{
+ my $self = shift;
+ my $usage = shift;
+ my $tpl;
+
+ $tpl = "## print out usage \n";
+ $tpl .= "echo \"Usage: \$0 {%s}\" >&2 \n";
+ $tpl .= "exit 1";
+
+ return sprintf(
+ $tpl,
+ $usage
+ );
+}
+
+sub _getAuthorBlock
+{
+ my $tpl;
+
+ $tpl = "# Copyright (c) 2009 - OpenSLX GmbH \n";
+ $tpl .= "# \n";
+ $tpl .= "# This program is free software distributed under the GPL version 2. \n";
+ $tpl .= "# See http://openslx.org/COPYING \n";
+ $tpl .= "# \n";
+ $tpl .= "# If you have any feedback please consult http://openslx.org/feedback and \n";
+ $tpl .= "# send your suggestions, praise, or complaints to feedback\@openslx.org \n";
+ $tpl .= "# \n";
+ $tpl .= "# General information about OpenSLX can be found at http://openslx.org/ \n";
+ $tpl .= "# -----------------------------------------------------------------------------\n";
+ $tpl .= "# §filename§ \n";
+ $tpl .= "# - §desc§ \n";
+ $tpl .= "# §generated§ \n";
+ $tpl .= "# -----------------------------------------------------------------------------\n\n";
+
+ return sprintf(
+ $tpl
+ );
+}
+
+sub generateInitFile
+{
+ my $self = shift;
+ my $initFile = shift;
+ my $content;
+ my @usage;
+
+ # get a copy of initFile object before modifying it..
+ my $initFileCopy = clone($initFile);
+
+ $self->_renderHighlevelConfig($initFileCopy);
+
+ my $config = $initFileCopy->{'configHash'};
+ my $output;
+
+ # head
+ $output = "#!/bin/sh\n";
+ $output .= $self->_getAuthorBlock();
+ $output .= $self->_renderInfoBlock($config);
+ $output .= $self->_getInitsystemIncludes();
+
+ if (keys(%{$config->{'blocks'}->{'head'}->{'content'}}) > 0) {
+ $output .= $self->_concatContent($config->{'blocks'}->{'head'});
+ }
+
+ # functions
+ if (keys(%{$config->{'blocks'}->{'functions'}->{'content'}}) > 0) {
+ $output .= $self->_concatContent($config->{'blocks'}->{'functions'});
+ }
+
+ # case block
+ $output .= $self->_renderCasePrefix();
+ $output .= "\ncase \"\$1\" in \n";
+
+ # get caseBlocks in defined order
+ my @blocks = sort{
+ $config->{'caseBlocks'}->{$a}->{'order'} <=>
+ $config->{'caseBlocks'}->{$b}->{'order'}
+ }
+ keys(%{$config->{'caseBlocks'}});
+
+ # case block
+ while (@blocks)
+ {
+ my $block= shift(@blocks);
+ if (keys(%{$config->{'caseBlocks'}->{$block}->{'content'}}) > 0) {
+ push(@usage, $block);
+ $output .= " $block)\n";
+ $content = $self->_concatContent($config->{'caseBlocks'}->{$block});
+ $content =~ s/^/ /mg;
+ $output .= $content;
+ $output .= " ;;\n";
+ } else {
+ if ($config->{'caseBlocks'}->{$block}->{'required'}) {
+ print "required block $block undefined";
+ }
+ }
+ }
+
+ # autogenerate usage
+ if (scalar(grep(/usage/, @usage)) == 0) {
+ $initFileCopy->addToCase(
+ 'usage',
+ $self->_generateUsage(join(', ',@usage))
+ );
+
+ $output .= " *)\n";
+ $content = $self->_concatContent($config->{'caseBlocks'}->{'usage'});
+ $content =~ s/^/ /mg;
+ $output .= $content;
+ $output .= " ;;\n";
+
+ }
+
+ # footer
+ $output .= "esac\n\n";
+ $output .= $self->_renderFooter();
+
+ return $output;
+
+}
+
+sub getKernelVersion
+{
+ my $self = shift;
+ my $kernelPath = shift;
+
+
+ my $newestKernelFile;
+ my $newestKernelFileSortKey = '';
+ my $kernelPattern = '{vmlinuz,kernel-genkernel-x86}-*';
+ foreach my $kernelFile (glob("$kernelPath/$kernelPattern")) {
+ next unless $kernelFile =~ m{
+ (?:vmlinuz|x86)-(\d+)\.(\d+)\.(\d+)(?:\.(\d+))?-(\d+(?:\.\d+)?)
+ }x;
+ my $sortKey
+ = sprintf("%02d.%02d.%02d.%02d-%2.1f", $1, $2, $3, $4||0, $5);
+ if ($newestKernelFileSortKey lt $sortKey) {
+ $newestKernelFile = $kernelFile;
+ $newestKernelFileSortKey = $sortKey;
+ }
+ }
+
+ if (!defined $newestKernelFile) {
+ die; #_tr("unable to pick a kernel-file from path '%s'!", $kernelPath);
+ }
+
+ $newestKernelFile =~ /.*?-([.\-0-9]*)-([a-zA-Z]*?)$/;
+ my $kernel = {};
+ $kernel->{'version'} = $1;
+ $kernel->{'suffix'} = $2;
+ return $kernel;
+
+}
+
+
+1;
diff --git a/src/lib/OpenSLX/DistroUtils/Engine.pm b/src/lib/OpenSLX/DistroUtils/Engine.pm
new file mode 100644
index 00000000..16c3e585
--- /dev/null
+++ b/src/lib/OpenSLX/DistroUtils/Engine.pm
@@ -0,0 +1,58 @@
+# Copyright (c) 2008, 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# Engine.pm
+# - provides engine to distro based utils for OpenSLX
+# -----------------------------------------------------------------------------
+package OpenSLX::DistroUtils::Engine;
+
+use OpenSLX::Basics;
+
+use strict;
+use warnings;
+
+sub new
+{
+ my $class = shift;
+ my $self = {};
+ return bless $self, $class;
+}
+
+
+sub loadDistro {
+ my $self = shift;
+ my $distroName = shift;
+ $distroName = ucfirst($distroName);
+
+ my $distro;
+
+ my $loaded = eval {
+ $distro = instantiateClass("OpenSLX::DistroUtils::${distroName}");
+ return 0 if !$distro; # module does not exist, try next
+ 1;
+ };
+
+ if (!$loaded) {
+ vlog(1, "can't find distro specific class, try base class..");
+ $loaded = eval {
+ $distro = instantiateClass("OpenSLX::DistroUtils::Base");
+ return 0 if !$distro; # module does not exist, try next
+ 1;
+ };
+ }
+
+ if (!$loaded) {
+ vlog(1, "failed to load DistroUtils!");
+ }
+
+ return $distro;
+}
+
+1;
diff --git a/src/lib/OpenSLX/DistroUtils/InitFile.pm b/src/lib/OpenSLX/DistroUtils/InitFile.pm
new file mode 100644
index 00000000..ab729959
--- /dev/null
+++ b/src/lib/OpenSLX/DistroUtils/InitFile.pm
@@ -0,0 +1,232 @@
+# Copyright (c) 2008, 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# InitFile.pm
+# - configuration object for runlevel script
+# -----------------------------------------------------------------------------
+package OpenSLX::DistroUtils::InitFile;
+
+use strict;
+use warnings;
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+sub new {
+ my $class = shift;
+ my $params = shift || {};
+ my $self = {
+ };
+
+ $self->{'configHash'} = _initialConfigHash();
+
+ return bless $self, $class;
+}
+
+sub _initialConfigHash() {
+ return {
+ 'name' => "",
+ 'requiredStart' => "\$remote_fs",
+ 'requiredStop' => "\$remote_fs",
+ 'defaultStart' => "2 3 4 5",
+ 'defaultStop' => "1",
+ 'shortDesc' => "",
+ 'blocks' => {
+ 'head' => {
+ 'blockDesc' => "head: file existing checks, etc.",
+ 'content' => {}
+ },
+ 'functions' => {
+ 'blockDesc' => "functions: helper functions",
+ 'content' => {}
+ }
+ },
+ 'caseBlocks' => {
+ 'start' => {
+ 'blockDesc' => "start: defines start function for initscript",
+ 'content' => {},
+ 'order' => 1,
+ 'required' => 1
+ },
+ 'stop' => {
+ 'blockDesc' => "stop: defines stop function for initscript",
+ 'content' => {},
+ 'order' => 2,
+ 'required' => 1
+ },
+ 'reload' => {
+ 'blockDesc' => "reload: defines reload function for initscript",
+ 'content' => {},
+ 'order' => 3,
+ 'required' => 0
+ },
+ 'force-reload' => {
+ 'blockDesc' => "force-reload: defines force-reload function for initscript",
+ 'content' => {},
+ 'order' => 4,
+ 'required' => 0
+ },
+ 'restart' => {
+ 'blockDesc' => "restart: defines restart function for initscript",
+ 'content' => {},
+ 'order' => 5,
+ 'required' => 1
+ },
+ 'try-restart' => {
+ 'blockDesc' => "restart: defines restart function for initscript",
+ 'content' => {},
+ 'order' => 6,
+ 'required' => 0
+ },
+ 'status' => {
+ 'blockDesc' => "status: defines status function for initscript",
+ 'content' => {},
+ 'order' => 7,
+ 'required' => 0
+ },
+ 'usage' => {
+ 'blockDesc' => "usage: defines usage function for initscript",
+ 'content' => {},
+ 'order' => 8,
+ 'required' => 0
+ }
+ }
+ };
+}
+
+sub addToCase {
+ my $self = shift;
+ my $blockName = shift;
+ my $content = shift;
+ my $priority = shift || 5;
+
+ #check if block is valid..
+
+ push(@{$self->{'configHash'}->{'caseBlocks'}->{$blockName}->{'content'}->{$priority}}, $content);
+
+ return $self;
+}
+
+sub addToBlock {
+ my $self = shift;
+ my $blockName = shift;
+ my $content = shift;
+ my $priority = shift || 5;
+
+ #check if block is valid..
+
+ push(@{$self->{'configHash'}->{'blocks'}->{$blockName}->{'content'}->{$priority}}, $content);
+
+ return $self;
+}
+
+sub setName {
+ my $self = shift;
+ my $name = shift;
+
+ $self->{'configHash'}->{'name'} = $name;
+ return $self;
+}
+
+sub setDesc {
+ my $self = shift;
+ my $desc = shift;
+
+ $self->{'configHash'}->{'shortDesc'} = $desc;
+ return $self;
+}
+
+sub addFunction {
+ my $self = shift;
+ my $name = shift;
+ my $script = shift;
+ my $flags = shift || {};
+ my $priority = $flags->{priority} || 5;
+
+ push(@{$self->{'configHash'}->{'highlevelConfig'}},
+ {
+ name => $name,
+ script => $script,
+ priority => $priority,
+ type => 'function'
+ });
+ return 1;
+}
+
+sub addFunctionCall {
+ my $self = shift;
+ my $function = shift;
+ my $block = shift;
+ my $flags = shift;
+ my $priority = $flags->{priority} || 5;
+ my $parameters = $flags->{parameters} || "";
+
+ push(@{$self->{'configHash'}->{'highlevelConfig'}},
+ {
+ function => $function,
+ block => $block,
+ parameters => $parameters,
+ priority => $priority,
+ type => 'functionCall'
+ });
+ return 1;
+}
+
+sub addScript {
+ my $self = shift;
+ my $name = shift;
+ my $script = shift;
+ my $flags = shift || {};
+ my $block = $flags->{block} || 'start';
+ my $required = $flags->{required} || 1;
+ my $errormsg = $flags->{errormsg} || "$name failed!";
+ my $priority = $flags->{priority} || 5;
+
+ push(@{$self->{'configHash'}->{'highlevelConfig'}},
+ {
+ name => $name,
+ script => $script,
+ block => $block,
+ required => $required,
+ priority => $priority,
+ errormsg => $errormsg,
+ type => 'script'
+ });
+ return 1;
+}
+
+sub addDaemon {
+ my $self = shift;
+ my $binary = shift;
+ $binary =~ m/\/([^\/]*)$/;
+ my $shortname = $1;
+ my $parameters = shift || "";
+ my $flags = shift || {};
+ my $required = $flags->{required} || 1;
+ my $desc = $flags->{desc} || "$shortname";
+ my $errormsg = $flags->{errormsg} || "$desc failed!";
+ my $priority = $flags->{priority} || 5;
+
+ push(@{$self->{'configHash'}->{'highlevelConfig'}},
+ {
+ binary => $binary,
+ shortname => $shortname,
+ parameters => $parameters,
+ desc => $desc,
+ errormsg => $errormsg,
+ required => $required,
+ priority => $priority,
+ type => 'daemon'
+ });
+ return 1;
+}
+
+
+1;
diff --git a/src/lib/OpenSLX/DistroUtils/Suse.pm b/src/lib/OpenSLX/DistroUtils/Suse.pm
new file mode 100644
index 00000000..8a41c2eb
--- /dev/null
+++ b/src/lib/OpenSLX/DistroUtils/Suse.pm
@@ -0,0 +1,174 @@
+# Copyright (c) 2008, 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# Suse.pm
+# - provides suse specific functions for distro based utils for OpenSLX
+# -----------------------------------------------------------------------------
+package OpenSLX::DistroUtils::Suse;
+
+use strict;
+use warnings;
+use Switch;
+
+use base qw(OpenSLX::DistroUtils::Base);
+
+
+sub _renderCasePrefix
+{
+ return "rc_reset\n";
+}
+
+sub _renderFooter
+{
+ return "rc_exit\n";
+}
+
+
+sub _renderHighlevelConfig {
+ my $self = shift;
+ my $initFile = shift;
+
+ my $element;
+ my $hlc = $initFile->{'configHash'}->{'highlevelConfig'};
+
+ while ( $element = shift(@$hlc)){
+ switch ($element->{type}) {
+ case 'daemon' {
+ my $tpl;
+ $tpl = "%s_BIN=%s \n";
+ $tpl .= "[ -x %s_BIN ] || exit 5\n\n";
+ $tpl .= "%s_OPTS=\"%s\" \n";
+ $tpl .= "[ -f /etc/sysconfig/%s ] . /etc/sysconfig/%s \n\n";
+ $tpl .= "%s_PIDFILE=\"/var/run/%s.init.pid\" \n\n";
+ $initFile->addToBlock('head',
+ sprintf(
+ $tpl,
+ uc($element->{shortname}),
+ $element->{binary},
+ uc($element->{shortname}),
+ uc($element->{shortname}),
+ $element->{parameters},
+ $element->{shortname},
+ $element->{shortname},
+ uc($element->{shortname}),
+ $element->{shortname}
+ )
+ );
+
+ $tpl = "echo -n \"Starting %s \"\n";
+ $tpl .= "startproc -f -p \$%s_PIDFILE \$%s_BIN \$%s_OPTS\n";
+ $tpl .= "rc_status -v";
+ $initFile->addToCase('start',
+ sprintf(
+ $tpl,
+ $element->{desc},
+ uc($element->{shortname}),
+ uc($element->{shortname}),
+ uc($element->{shortname})
+ )
+ );
+
+ $tpl = "echo -n \"Shutting down %s\" \n";
+ $tpl .= "killproc -p \$%s_PIDFILE -TERM \$%s_BIN\n";
+ $tpl .= "rc_status -v";
+ $initFile->addToCase('stop',
+ sprintf(
+ $tpl,
+ $element->{desc},
+ uc($element->{shortname}),
+ uc($element->{shortname})
+ )
+ );
+
+ $tpl = "## Stop the service and if this succeeds (i.e. the \n";
+ $tpl .= "## service was running before), start it again.\n";
+ $tpl .= "\$0 status >/dev/null && \$0 restart\n\n";
+ $tpl .= "# Remember status and be quiet\n";
+ $tpl .= "rc_status";
+ $initFile->addToCase('try-restart',
+ $tpl
+ );
+
+ $tpl = "## Stop the service and regardless of whether it was \n";
+ $tpl .= "## running or not, start it again.\n";
+ $tpl .= "\$0 stop\n";
+ $tpl .= "\$0 start\n\n";
+ $tpl .= "# Remember status and be quiet\n";
+ $tpl .= "rc_status";
+ $initFile->addToCase('restart',
+ $tpl
+ );
+
+ $tpl = "echo -n \"Reload service %s\"\n";
+ $tpl .= "killproc -p \$%s_PIDFILE -HUP \$%s_BIN\n";
+ $tpl .= "rc_status -v";
+ $initFile->addToCase('reload',
+ sprintf(
+ $tpl,
+ $element->{desc},
+ uc($element->{shortname}),
+ uc($element->{shortname}),
+ uc($element->{shortname})
+ )
+ );
+
+ $tpl = "echo -n \"Checking for service %s\"\n";
+ $tpl .= "checkproc -p \$%s_PIDFILE \$%s_BIN\n";
+ $tpl .= "rc_status -v";
+ $initFile->addToCase('status',
+ sprintf(
+ $tpl,
+ $element->{desc},
+ uc($element->{shortname}),
+ uc($element->{shortname})
+ )
+ );
+
+
+ }
+ case 'function' {
+ my $tpl;
+ $tpl = "%s () { \n";
+ $tpl .= "%s";
+ $tpl .= "\n}\n";
+ $initFile->addToBlock('functions',
+ sprintf(
+ $tpl,
+ $element->{name},
+ $element->{script}
+ )
+ );
+
+ }
+ case 'functionCall' {
+ my $tpl;
+ $tpl = "%s %s\n";
+ #$tpl .= "%s\n ";
+ $initFile->addToCase($element->{block},
+ sprintf(
+ $tpl,
+ $element->{function},
+ $element->{parameters},
+ ""
+ ),
+ $element->{priority}
+ );
+
+ }
+ }
+ }
+}
+
+sub _getInitsystemIncludes
+{
+ return ". /etc/rc.status\n\n";
+}
+
+1; \ No newline at end of file
diff --git a/src/lib/OpenSLX/DistroUtils/Ubuntu.pm b/src/lib/OpenSLX/DistroUtils/Ubuntu.pm
new file mode 100644
index 00000000..915c19c6
--- /dev/null
+++ b/src/lib/OpenSLX/DistroUtils/Ubuntu.pm
@@ -0,0 +1,172 @@
+# Copyright (c) 2008, 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# Ubuntu.pm
+# - provides ubuntu specific functions for distro based utils for OpenSLX
+# -----------------------------------------------------------------------------
+package OpenSLX::DistroUtils::Ubuntu;
+
+use strict;
+use warnings;
+use Switch;
+
+use base qw(OpenSLX::DistroUtils::Base);
+
+sub _getInitsystemIncludes
+{
+ return ". /lib/lsb/init-functions\n\n";
+}
+
+sub _renderCasePrefix
+{
+ return "";
+}
+
+sub _renderFooter
+{
+ return "exit 0\n";
+}
+
+
+sub _renderHighlevelConfig {
+ my $self = shift;
+ my $initFile = shift;
+
+ my $element;
+ my $hlc = $initFile->{'configHash'}->{'highlevelConfig'};
+
+ while ( $element = shift(@$hlc)){
+ switch ($element->{type}) {
+ case 'daemon' {
+ $element->{binary} =~ m/\/([^\/]*)$/;
+ my $shortname = $1;
+ my $tpl = "export %s_PARAMS=\"%s\" \n";
+ $tpl .= "if [ -f /etc/default/%s ]; then . /etc/default/%s; fi \n";
+ $initFile->addToBlock('head',
+ sprintf(
+ $tpl,
+ uc($shortname),
+ $element->{parameters},
+ $shortname,
+ $shortname
+ )
+ );
+
+
+ $tpl = "log_daemon_msg \"Starting %s\" \"%s\" \n";
+ $tpl .= "start-stop-daemon --start --quiet --oknodo ";
+ $tpl .= "--pidfile /var/run/%s.pid --exec %s -- \$%s_PARAMS \n";
+ $tpl .= "log_end_msg \$?";
+ $initFile->addToCase('start',
+ sprintf(
+ $tpl,
+ $element->{description},
+ $shortname,
+ $shortname,
+ $element->{binary},
+ uc($shortname)
+ )
+ );
+
+ $tpl = "start-stop-daemon --stop --quiet --oknodo ";
+ $tpl .= "--pidfile /var/run/%s.pid \n";
+ $tpl .= "log_end_msg \$?";
+ $initFile->addToCase('stop',
+ sprintf(
+ $tpl,
+ $shortname
+ )
+ );
+
+ $tpl = "log_daemon_msg \"Restarting %s\" \"%s\"\n";
+ $tpl .= "\$0 stop\n";
+ $tpl .= "case \"\$?\" in\n";
+ $tpl .= " 0|1)\n";
+ $tpl .= " \$0 start\n";
+ $tpl .= " case \"\$?\" in\n";
+ $tpl .= " 0) log_end_msg 0 ;;\n";
+ $tpl .= " 1) log_end_msg 1 ;; # Old process is still running\n";
+ $tpl .= " *) log_end_msg 1 ;; # Failed to start\n";
+ $tpl .= " esac\n";
+ $tpl .= " ;;\n";
+ $tpl .= " *)\n";
+ $tpl .= " # Failed to stop\n";
+ $tpl .= " log_end_msg 1\n";
+ $tpl .= " ;;\n";
+ $tpl .= "esac\n";
+ $tpl .= ";;\n";
+
+ $initFile->addToCase('restart',
+ sprintf(
+ $tpl,
+ $shortname
+ )
+ );
+
+
+ $tpl = "start-stop-daemon --stop --signal 1 --quiet ";
+ $tpl .= "--pidfile /var/run/%s.pid --name \$s\n";
+ $tpl .= "return 0\n";
+ $initFile->addToCase('reload',
+ sprintf(
+ $tpl,
+ $shortname,
+ $element->{binary}
+ )
+ );
+
+ $tpl = "status_of_proc -p /var/run/%s.pid %s_BIN %s && exit 0 || exit \$?";
+ $initFile->addToCase('status',
+ sprintf(
+ $tpl,
+ $element->{shortname},
+ $element->{binary},
+ $element->{shortname}
+ )
+ );
+
+
+ }
+ case 'function' {
+ my $tpl;
+ $tpl = "%s () { \n";
+ $tpl .= "%s";
+ $tpl .= "\n}\n";
+ $initFile->addToBlock('functions',
+ sprintf(
+ $tpl,
+ $element->{name},
+ $element->{script}
+ )
+ );
+
+ }
+ case 'functionCall' {
+ my $tpl;
+ $tpl = "%s %s\n";
+ #$tpl .= "%s\n ";
+ $initFile->addToCase($element->{block},
+ sprintf(
+ $tpl,
+ $element->{function},
+ $element->{parameters},
+ ""
+ ),
+ $element->{priority}
+ );
+
+ }
+
+ }
+ }
+
+}
+
+1; \ No newline at end of file
diff --git a/src/lib/OpenSLX/LibScanner.pm b/src/lib/OpenSLX/LibScanner.pm
new file mode 100644
index 00000000..e1f42ba4
--- /dev/null
+++ b/src/lib/OpenSLX/LibScanner.pm
@@ -0,0 +1,262 @@
+# Copyright (c) 2006-2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# LibScanner.pm
+# - module that recursively scans a given binary for library dependencies
+# -----------------------------------------------------------------------------
+package OpenSLX::LibScanner;
+
+use strict;
+use warnings;
+
+use File::Find;
+use File::Path;
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $params = shift || {};
+
+ checkParams($params, {
+ 'root-path' => '!',
+ 'verbose' => '?',
+ } );
+
+ my $self = {
+ rootPath => $params->{'root-path'},
+ verbose => $params->{'verbose'} || 0,
+ };
+
+ return bless $self, $class;
+}
+
+sub determineRequiredLibs
+{
+ my $self = shift;
+ my @binaries = @_;
+
+ $self->{filesToDo} = [];
+ $self->{libs} = [];
+ $self->{libInfo} = {};
+
+ $self->_fetchLoaderConfig();
+
+ foreach my $binary (@binaries) {
+ if (substr($binary, 0, 1) ne '/') {
+ # force relative paths relative to $rootPath:
+ $binary = "$self->{rootPath}/$binary";
+ }
+ if (!-e $binary) {
+ warn _tr("$0: unable to find file '%s', skipping it\n", $binary);
+ next;
+ }
+ push @{$self->{filesToDo}}, $binary;
+ }
+
+ foreach my $file (@{$self->{filesToDo}}) {
+ $self->_addLibsForBinary($file);
+ }
+
+ return @{$self->{libs}};
+}
+
+sub _fetchLoaderConfig
+{
+ my $self = shift;
+
+ my @libFolders;
+
+ if (!-e "$self->{rootPath}/etc") {
+ die _tr("'%s'-folder not found, maybe wrong root-path?\n",
+ "$self->{rootPath}/etc");
+ }
+ $self->_fetchLoaderConfigFile("$self->{rootPath}/etc/ld.so.conf");
+
+ # add "trusted" folders /lib and /usr/lib if not already in place:
+ if (!grep { m[^$self->{rootPath}/lib$] } @libFolders) {
+ push @libFolders, "$self->{rootPath}/lib";
+ }
+ if (!grep { m[^$self->{rootPath}/usr/lib$] } @libFolders) {
+ push @libFolders, "$self->{rootPath}/usr/lib";
+ }
+
+ # add lib32-folders for 64-bit Debians, as they do not
+ # refer those in ld.so.conf (which I find strange...)
+ if (-e '/lib32' && !grep { m[^$self->{rootPath}/lib32$] } @libFolders) {
+ push @libFolders, "$self->{rootPath}/lib32";
+ }
+ if (-e '/usr/lib32'
+ && !grep { m[^$self->{rootPath}/usr/lib32$] } @libFolders)
+ {
+ push @libFolders, "$self->{rootPath}/usr/lib32";
+ }
+
+ push @{$self->{libFolders}}, @libFolders;
+
+ return;
+}
+
+sub _fetchLoaderConfigFile
+{
+ my $self = shift;
+ my $ldConfFile = shift;
+
+ return unless -e $ldConfFile;
+ my $ldconfFH;
+ if (!open($ldconfFH, '<', $ldConfFile)) {
+ warn(_tr("unable to open file '%s' (%s)", $ldConfFile, $!));
+ return;
+ }
+ while (<$ldconfFH>) {
+ chomp;
+ if (m{^\s*include\s+(.+?)\s*$}i) {
+ my @incFiles = glob("$self->{rootPath}$1");
+ foreach my $incFile (@incFiles) {
+ if ($incFile) {
+ $self->_fetchLoaderConfigFile($incFile);
+ }
+ }
+ next;
+ }
+ if (m{\S+}i) {
+ s[=.+][];
+ # remove any lib-type specifications (e.g. '=libc5')
+ push @{$self->{libFolders}}, "$self->{rootPath}$_";
+ }
+ }
+ close $ldconfFH
+ or die(_tr("unable to close file '%s' (%s)", $ldConfFile, $!));
+ return;
+}
+
+sub _addLibsForBinary
+{
+ my $self = shift;
+ my $binary = shift;
+
+ # first do some checks:
+ warn _tr("analyzing '%s'...\n", $binary) if $self->{verbose};
+ my $fileInfo = `file --dereference --brief --mime $binary 2>/dev/null`;
+ if ($?) {
+ die _tr("unable to fetch file info for '%s', giving up!\n", $binary);
+ }
+ chomp $fileInfo;
+ warn _tr("\tinfo is: '%s'...\n", $fileInfo) if $self->{verbose};
+ if ($fileInfo !~ m[^application/(x-executable|x-shared)]i) {
+ # ignore anything that's not an executable or a shared library
+ warn _tr(
+ "%s: ignored, as it isn't an executable or a shared library\n",
+ $binary
+ );
+ next;
+ }
+
+ # fetch file info again, this time without '--mime' in order to get the architecture
+ # bitwidth:
+ $fileInfo = `file --dereference --brief $binary 2>/dev/null`;
+ if ($?) {
+ die _tr("unable to fetch file info for '%s', giving up!\n", $binary);
+ }
+ chomp $fileInfo;
+ warn _tr("\tinfo is: '%s'...\n", $fileInfo) if $self->{verbose};
+ my $bitwidth = ($fileInfo =~ m[64-bit]i) ? 64 : 32;
+ # determine whether binary is 32- or 64-bit platform
+
+ # now find out about needed libs, we first try objdump...
+ warn _tr("\ttrying objdump...\n") if $self->{verbose};
+ my $res = `objdump -p $binary 2>/dev/null`;
+ if (!$?) {
+ # find out if rpath is set for binary:
+ my $rpath;
+ if ($res =~ m[^\s*RPATH\s*(\S+)]im) {
+ $rpath = $1;
+ warn _tr("\trpath='%s'\n", $rpath) if $self->{verbose};
+ }
+ while ($res =~ m[^\s*NEEDED\s*(.+?)\s*$]gm) {
+ $self->_addLib($1, $bitwidth, $rpath);
+ }
+ } else {
+ # ...objdump failed, so we try readelf instead:
+ warn _tr("\ttrying readelf...\n") if $self->{verbose};
+ $res = `readelf -d $binary 2>/dev/null`;
+ if ($?) {
+ die _tr(
+ "neither objdump nor readelf seems to be installed, giving up!\n"
+ );
+ }
+ # find out if rpath is set for binary:
+ my $rpath;
+ if ($res =~ m{Library\s*rpath:\s*\[([^\]]+)}im) {
+ $rpath = $1;
+ warn _tr("\trpath='%s'\n", $rpath) if $self->{verbose};
+ }
+ while ($res =~ m{\(NEEDED\)[^\[]+\[(.+?)\]\s*$}gm) {
+ $self->_addLib($1, $bitwidth, $rpath);
+ }
+ }
+ return;
+}
+
+sub _addLib
+{
+ my $self = shift;
+ my $lib = shift;
+ my $bitwidth = shift;
+ my $rpath = shift;
+
+ if (!exists $self->{libInfo}->{$lib}) {
+ my $libPath;
+ my @folders = @{$self->{libFolders}};
+ if (defined $rpath) {
+ # add rpath if given (explicit paths set during link stage)
+ push @folders, split ':', $rpath;
+ }
+ foreach my $folder (@folders) {
+ if (-e "$folder/$lib") {
+ # have library matching name, now check if the platform is ok, too:
+ my $libFileInfo =
+ `file --dereference --brief $folder/$lib 2>/dev/null`;
+ if ($?) {
+ die _tr("unable to fetch file info for '%s', giving up!\n",
+ $folder / $lib);
+ }
+ my $libBitwidth = ($libFileInfo =~ m[64-bit]i) ? 64 : 32;
+ if ($bitwidth != $libBitwidth) {
+ vlog(
+ 0,
+ _tr(
+ '%s has wrong bitwidth (%s instead of %s)',
+ "$folder/$lib", $libBitwidth, $bitwidth
+ )
+ ) if $self->{verbose};
+ next;
+ }
+ $libPath = "$folder/$lib";
+ last;
+ }
+ }
+ if (!defined $libPath) {
+ die _tr("unable to find lib %s!\n", $lib);
+ }
+ print "found $libPath\n" if $self->{verbose};
+ push @{$self->{libs}}, $libPath;
+ $self->{libInfo}->{$lib} = 1;
+ push @{$self->{filesToDo}}, $libPath;
+ }
+ return;
+}
+
+1;
diff --git a/src/lib/OpenSLX/ScopedResource.pm b/src/lib/OpenSLX/ScopedResource.pm
new file mode 100644
index 00000000..af912691
--- /dev/null
+++ b/src/lib/OpenSLX/ScopedResource.pm
@@ -0,0 +1,174 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+package OpenSLX::ScopedResource;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+=head1 NAME
+
+OpenSLX::ScopedResource - provides a helper class that implements the
+'resource-acquisition-by-definition' pattern.
+
+=head1 SYNOPSIS
+
+{ # some scope
+
+ my $distroSession = OpenSLX::ScopedResource->new({
+ name => 'distro::session',
+ acquire => sub { $distro->startSession(); 1 },
+ release => sub { $distro->finishSession(); 1 },
+ });
+
+ die $@ if ! eval {
+ # do something dangerous and unpredictable here:
+ doRandomStuff();
+ 1;
+ };
+
+}
+# the distro-session will be cleanly finished, no matter if we died or not
+
+=head1 DESCRIPTION
+
+The class C<ScopedResource> wraps any resource such that the resource will be
+acquired when an object of this class is created. Whenever the ScopedResource
+object is being destroyed (e.g. by leaving scope) the wrapped resource will
+automatically be released.
+
+The main purpose of this class is to make it simple to implement reliable
+resource acquisition and release management even if the structure of the code
+that refers to that resource is rather complex.
+
+Furthermore, this class handles cases where the script handling those resources
+is spread across different process and/or makes us of signal handlers.
+
+=cut
+
+# make sure that we catch any signals in order to properly release scoped
+# resources
+use sigtrap qw( die normal-signals error-signals );
+
+use OpenSLX::Basics;
+
+=head1 PUBLIC METHODS
+
+=over
+
+=item B<new($params)>
+
+Creates a ScopedResource object for the resource specified by the given
+I<$params>.
+
+As part of creation of the object, the resource will be acquired.
+
+The I<$params>-hashref requires the following entries:
+
+=over
+
+=item C<name>
+
+Gives a name for the wrapped resource. This is just used in log messages
+concerning the acquisition and release of that resource.
+
+=item C<acuire>
+
+Gives the code that is going to be executed in order to acquire the resource.
+
+=item C<release>
+
+Gives the code that is going to be executed in order to release the resource.
+
+=back
+
+=cut
+
+sub new
+{
+ my $class = shift;
+ my $params = shift;
+
+ checkParams($params, {
+ name => '!',
+ acquire => '!',
+ release => '!',
+ });
+
+ my $self = {
+ name => $params->{name},
+ owner => 0,
+ acquire => $params->{acquire},
+ release => $params->{release},
+ };
+
+ bless $self, $class;
+
+ $self->_acquire();
+
+ return $self;
+}
+
+=item B<DESTROY()>
+
+Releases the resource (if it had been acquired by this process) and cleans up.
+
+=cut
+
+sub DESTROY
+{
+ my $self = shift;
+
+ $self->_release();
+
+ # remove references to functions, in order to release any closures
+ $self->{acquire} = undef;
+ $self->{release} = undef;
+
+ return;
+}
+
+sub _acquire
+{
+ my $self = shift;
+
+ # acquire the resource and set ourselves as owner
+ if ($self->{acquire}->()) {
+ vlog(1, "process $$ acquired resource $self->{name}");
+ $self->{owner} = $$;
+ }
+}
+
+sub _release
+{
+ my $self = shift;
+
+ # only release the resource if invoked by the owning process
+ vlog(3, "process $$ tries to release resource $self->{name}");
+ return if $self->{owner} != $$;
+
+ # ignore ctrl-c while we are trying to release the resource, as otherwise
+ # the resource would be leaked
+ local $SIG{INT} = 'IGNORE';
+
+ # release the resource and unset owner
+ if ($self->{release}->()) {
+ vlog(1, "process $$ released resource $self->{name}");
+ $self->{owner} = 0;
+ }
+}
+
+=back
+
+=cut
+
+1;
diff --git a/src/lib/OpenSLX/Syscall.pm b/src/lib/OpenSLX/Syscall.pm
new file mode 100644
index 00000000..2d9182a7
--- /dev/null
+++ b/src/lib/OpenSLX/Syscall.pm
@@ -0,0 +1,129 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# PerlHeaders.pm
+# - provides automatic generation of required perl headers (for syscalls)
+# -----------------------------------------------------------------------------
+package OpenSLX::Syscall;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01;
+
+=head1 NAME
+
+OpenSLX::Syscall - provides wrapper functions for syscalls.
+
+=head1 DESCRIPTION
+
+This module exports one wrapper function for each syscall that OpenSLX is
+using. Each of these functions takes care to load all required Perl-headers
+before trying to invoke the respective syscall.
+
+=cut
+
+use Config;
+use File::Path;
+
+use OpenSLX::Basics;
+
+=head1 PUBLIC FUNCTIONS
+
+=over
+
+=item B<enter32BitPersonality()>
+
+Invokes the I<personality()> syscall in order to enter the 32-bit personality
+(C<PER_LINUX32>).
+
+=cut
+
+sub enter32BitPersonality
+{
+ _loadPerlHeader('syscall.ph');
+ _loadPerlHeader('linux/personality.ph', 'sys/personality.ph');
+
+ syscall(&SYS_personality, PER_LINUX32()) != -1
+ or warn _tr("unable to invoke syscall '%s'! ($!)", 'personality');
+
+ return;
+}
+
+sub _loadPerlHeader
+{
+ my @phFiles = @_;
+
+ my @alreadyLoaded = grep { exists $INC{$_} } @phFiles;
+ return if @alreadyLoaded;
+
+ my $phLibDir = $Config{installsitearch};
+ local @INC = @INC;
+ push @INC, "$phLibDir/asm";
+
+ # Unability to load an existing Perl header may be caused by missing
+ # asm-(kernel-)headers, since for instance openSUSE 11 does not provide
+ # any of these).
+ # If they are missing, we just have a go at creating all of them:
+ mkpath($phLibDir) unless -e $phLibDir;
+ if (!-e "$phLibDir/asm") {
+ if (-l "/usr/include/asm") {
+ my $asmFolder = readlink("/usr/include/asm");
+ slxsystem("cd /usr/include && h2ph -rQ -d $phLibDir $asmFolder") == 0
+ or die _tr('unable to create Perl-header from "asm" folder! (%s)', $!);
+ slxsystem("mv $phLibDir/$asmFolder $phLibDir/asm") == 0
+ or die _tr('unable to cleanup "asm" folder for Perl headers! (%s)', $!);
+ }
+ elsif (-d "/usr/include/asm") {
+ slxsystem("cd /usr/include && h2ph -rQ -d $phLibDir asm") == 0
+ or die _tr('unable to create Perl-header from "asm" folder! (%s)', $!);
+ }
+ else {
+ die _tr(
+ 'the folder "/usr/include/asm" is required - please install kernel headers!\
+ \n(maybe linux-libc-dev missing)!'
+ );
+ }
+ }
+ if (-e "/usr/include/asm-generic" && !-e "$phLibDir/asm-generic") {
+ slxsystem("cd /usr/include && h2ph -rQ -d $phLibDir asm-generic") == 0
+ or die _tr('unable to create Perl-header from "asm-generic" folder! (%s)', $!);
+ }
+
+ for my $phFile (@phFiles) {
+ return 1 if eval { require $phFile };
+
+ warn(_tr(
+ 'unable to load Perl-header "%s", trying to create it ...',
+ $phFile
+ ));
+
+ # perl-header has not been provided by host-OS, so we create it
+ # manually from C-header (via h2ph):
+ (my $hFile = $phFile) =~ s{\.ph$}{.h};
+ if (-e "/usr/include/$hFile") {
+ slxsystem("cd /usr/include && h2ph -aQ -d $phLibDir $hFile") == 0
+ or die _tr('unable to create %s! (%s)', $phFile, $!);
+ }
+
+ return 1 if eval { require $phFile };
+ }
+
+ die _tr(
+ 'unable to load any of these perl headers: %s (%s)',
+ join(',', @phFiles), $@
+ );
+}
+
+=back
+
+=cut
+
+1;
diff --git a/src/lib/OpenSLX/Translations/de.pm b/src/lib/OpenSLX/Translations/de.pm
new file mode 100644
index 00000000..b0783b81
--- /dev/null
+++ b/src/lib/OpenSLX/Translations/de.pm
@@ -0,0 +1,359 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# de.pm
+# - OpenSLX-translations for the German language.
+# -----------------------------------------------------------------------------
+package OpenSLX::Translations::de;
+
+use strict;
+use warnings;
+
+our $VERSION = 0.02;
+
+my %translations;
+
+################################################################################
+### Implementation
+################################################################################
+sub getAllTranslations
+{
+ my $class = shift;
+ return \%translations;
+}
+
+################################################################################
+### Translations
+################################################################################
+
+%translations = (
+ q{NEW:%s doesn't seem to be installed,\nso there is no support for %s available, sorry!\n}
+ =>
+ qq{},
+
+ q{NEW:%s has wrong bitwidth (%s instead of %s)}
+ =>
+ qq{},
+
+ q{NEW:%s: ignored, as it isn't an executable or a shared library\n}
+ =>
+ qq{},
+
+ q{NEW:'%s' already exists!\n}
+ =>
+ qq{},
+
+ q{NEW:'%s' not found, maybe wrong root-path?\n}
+ =>
+ qq{},
+
+ q{NEW:\trpath='%s'\n}
+ =>
+ qq{},
+
+ q{NEW:\ttrying objdump...\n}
+ =>
+ qq{},
+
+ q{NEW:\ttrying readelf...\n}
+ =>
+ qq{},
+
+ q{NEW:analyzing '%s'...\n}
+ =>
+ qq{},
+
+ q{NEW:Can't add column to table <%s> (%s)}
+ =>
+ qq{},
+
+ q{NEW:Can't add columns to table <%s> (%s)}
+ =>
+ qq{},
+
+ q{NEW:Can't change columns in table <%s> (%s)}
+ =>
+ qq{},
+
+ q{NEW:Can't create table <%s> (%s)}
+ =>
+ qq{},
+
+ q{NEW:Can't delete from table <%s> (%s)}
+ =>
+ qq{},
+
+ q{NEW:Can't drop columns from table <%s> (%s)}
+ =>
+ qq{},
+
+ q{NEW:Can't drop table <%s> (%s)}
+ =>
+ qq{},
+
+ q{NEW:Can't execute SQL-statement <%s> (%s)}
+ =>
+ qq{},
+
+ q{NEW:Can't insert into table <%s> (%s)}
+ =>
+ qq{},
+
+ q{NEW:Can't lock ID-file <%s> (%s)}
+ =>
+ qq{},
+
+ q{NEW:Can't open ID-file <%s> (%s)}
+ =>
+ qq{},
+
+ q{NEW:Can't prepare SQL-statement <%s> (%s)}
+ =>
+ qq{},
+
+ q{NEW:Can't rename table <%s> (%s)}
+ =>
+ qq{},
+
+ q{NEW:Can't to seek ID-file <%s> (%s)}
+ =>
+ qq{},
+
+ q{NEW:Can't truncate ID-file <%s> (%s)}
+ =>
+ qq{},
+
+ q{NEW:Can't update ID-file <%s> (%s)}
+ =>
+ qq{},
+
+ q{NEW:Can't update table <%s> (%s)}
+ =>
+ qq{},
+
+ q{NEW:Cannot connect to database <%s> (%s)}
+ =>
+ qq{},
+
+ q{NEW:config-file <%s> has incorrect syntax here:\n\t%s\n}
+ =>
+ qq{},
+
+ q{NEW:copying kernel %s to %s/kernel}
+ =>
+ qq{},
+
+ q{Could not determine schema version of database}
+ =>
+ qq{Die Version des Datenbank-Schemas konnte nicht bestimmt werden},
+
+ q{NEW:Could not load module <%s> (Version <%s> required, but <%s> found)}
+ =>
+ qq{},
+
+ q{NEW:creating tar %s}
+ =>
+ qq{},
+
+ q{NEW:DB matches current schema version %s}
+ =>
+ qq{},
+
+ q{NEW:executing %s}
+ =>
+ qq{},
+
+ q{NEW:exporting client %d:%s}
+ =>
+ qq{},
+
+ q{NEW:exporting system %d:%s}
+ =>
+ qq{},
+
+ q{NEW:generating initialramfs %s/initramfs}
+ =>
+ qq{},
+
+ q{NEW:ignoring unknown key <%s>}
+ =>
+ qq{},
+
+ q{NEW:List of supported systems:\n\t}
+ =>
+ qq{},
+
+ q{NEW:Lock-file <%s> exists, script is already running.\nPlease remove the logfile and try again if you are sure that no one else\nis executing this script.\n}
+ =>
+ qq{},
+
+ q{NEW:merging %s (val=%s)}
+ =>
+ qq{},
+
+ q{NEW:merging from default client...}
+ =>
+ qq{},
+
+ q{NEW:merging from group %d:%s...}
+ =>
+ qq{},
+
+ q{NEW:neither objdump nor readelf seems to be installed, giving up!\n}
+ =>
+ qq{},
+
+ q{no}
+ =>
+ qq{nein},
+
+ q{NEW:Our schema-version is %s, DB is %s, upgrading DB...}
+ =>
+ qq{},
+
+ q{NEW:PXE-system %s already exists!}
+ =>
+ qq{},
+
+ q{NEW:removing %s}
+ =>
+ qq{},
+
+ q{NEW:setting %s to <%s>}
+ =>
+ qq{},
+
+ q{NEW:slxldd: unable to find file '%s', skipping it\n}
+ =>
+ qq{},
+
+ q{NEW:Sorry, system '%s' is unsupported.\n}
+ =>
+ qq{},
+
+ q{NEW:system-error: illegal target-path <%s>!}
+ =>
+ qq{},
+
+ q{This will overwrite the current OpenSLX-database with an example dataset.\nAll your data (%s systems and %s clients) will be lost!\nDo you want to continue(%s/%s)? }
+ =>
+ qq{Die aktuelle OpenSLX-Datenbank wird mit einem Beispiel-Datensatz überschrieben.\nAlle Daten (%s Systeme und %s Clients) werden gelöscht!\nMöchten Sie den Vorgang fortsetzen(%s/%s)? },
+
+ q{NEW:translations module %s loaded successfully}
+ =>
+ qq{},
+
+ q{NEW:Unable to access client-config-path '%s'!}
+ =>
+ qq{},
+
+ q{NEW:unable to create db-datadir %s! (%s)\n}
+ =>
+ qq{},
+
+ q{NEW:Unable to create lock-file <%s>, exiting!\n}
+ =>
+ qq{},
+
+ q{NEW:Unable to create or access temp-path '%s'!}
+ =>
+ qq{},
+
+ q{NEW:Unable to create or access tftpboot-path '%s'!}
+ =>
+ qq{},
+
+ q{NEW:unable to execute shell-command:\n\t%s \n\t(%s)}
+ =>
+ qq{},
+
+ q{NEW:unable to fetch file info for '%s', giving up!\n}
+ =>
+ qq{},
+
+ q{NEW:Unable to load DB-module <%s> (%s)\n}
+ =>
+ qq{},
+
+ q{NEW:Unable to load DB-module <%s>\nthat database type is not supported (yet?)\n}
+ =>
+ qq{},
+
+ q{NEW:unable to load DHCP-Export backend '%s'! (%s)\n}
+ =>
+ qq{},
+
+ q{NEW:Unable to load module <%s> (Version <%s> required)}
+ =>
+ qq{},
+
+ q{NEW:Unable to load module <%s> (Version <%s> required, but <%s> found)}
+ =>
+ qq{},
+
+ q{NEW:Unable to load system-module <%s> (%s)\n}
+ =>
+ qq{},
+
+ q{NEW:Unable to load system-module <%s>!\n}
+ =>
+ qq{},
+
+ q{NEW:Unable to write local settings file <%s> (%s)}
+ =>
+ qq{},
+
+ q{NEW:unknown settings key <%s>!\n}
+ =>
+ qq{},
+
+ q{NEW:UnknownDbSchemaColumnDescr}
+ =>
+ qq{},
+
+ q{UnknownDbSchemaCommand}
+ =>
+ qq{Unbekannter DbSchema-Befehl <%s> wird übergangen},
+
+ q{NEW:UnknownDbSchemaTypeDescr}
+ =>
+ qq{},
+
+ q{NEW:upgrade done}
+ =>
+ qq{},
+
+ q{NEW:writing dhcp-config for %s clients}
+ =>
+ qq{},
+
+ q{NEW:writing PXE-file %s}
+ =>
+ qq{},
+
+ q{yes}
+ =>
+ qq{ja},
+
+ q{NEW:You need to specify at least one file!\n}
+ =>
+ qq{},
+
+ q{NEW:You need to specify exactly one system name!\n}
+ =>
+ qq{},
+
+ q{NEW:You need to specify the root-path!\n}
+ =>
+ qq{},
+
+);
+
+1;
diff --git a/src/lib/OpenSLX/Translations/posix.pm b/src/lib/OpenSLX/Translations/posix.pm
new file mode 100644
index 00000000..61a94c93
--- /dev/null
+++ b/src/lib/OpenSLX/Translations/posix.pm
@@ -0,0 +1,359 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# posix.pm
+# - OpenSLX-translations for the posix locale (English language).
+# -----------------------------------------------------------------------------
+package OpenSLX::Translations::posix;
+
+use strict;
+use warnings;
+
+our $VERSION = 0.02;
+
+my %translations;
+
+################################################################################
+### Implementation
+################################################################################
+sub getAllTranslations
+{
+ my $class = shift;
+ return \%translations;
+}
+
+################################################################################
+### Translations
+################################################################################
+
+%translations = (
+ q{%s doesn't seem to be installed,\nso there is no support for %s available, sorry!\n}
+ =>
+ qq{%s doesn't seem to be installed,\nso there is no support for %s available, sorry!\n},
+
+ q{%s has wrong bitwidth (%s instead of %s)}
+ =>
+ qq{%s has wrong bitwidth (%s instead of %s)},
+
+ q{%s: ignored, as it isn't an executable or a shared library\n}
+ =>
+ qq{%s: ignored, as it isn't an executable or a shared library\n},
+
+ q{'%s' already exists!\n}
+ =>
+ qq{'%s' already exists!\n},
+
+ q{'%s' not found, maybe wrong root-path?\n}
+ =>
+ qq{'%s' not found, maybe wrong root-path?\n},
+
+ q{\trpath='%s'\n}
+ =>
+ qq{\trpath='%s'\n},
+
+ q{\ttrying objdump...\n}
+ =>
+ qq{\ttrying objdump...\n},
+
+ q{\ttrying readelf...\n}
+ =>
+ qq{\ttrying readelf...\n},
+
+ q{analyzing '%s'...\n}
+ =>
+ qq{analyzing '%s'...\n},
+
+ q{Can't add column to table <%s> (%s)}
+ =>
+ qq{Can't add column to table <%s> (%s)},
+
+ q{Can't add columns to table <%s> (%s)}
+ =>
+ qq{Can't add columns to table <%s> (%s)},
+
+ q{Can't change columns in table <%s> (%s)}
+ =>
+ qq{Can't change columns in table <%s> (%s)},
+
+ q{Can't create table <%s> (%s)}
+ =>
+ qq{Can't create table <%s> (%s)},
+
+ q{Can't delete from table <%s> (%s)}
+ =>
+ qq{Can't delete from table <%s> (%s)},
+
+ q{Can't drop columns from table <%s> (%s)}
+ =>
+ qq{Can't drop columns from table <%s> (%s)},
+
+ q{Can't drop table <%s> (%s)}
+ =>
+ qq{Can't drop table <%s> (%s)},
+
+ q{Can't execute SQL-statement <%s> (%s)}
+ =>
+ qq{Can't execute SQL-statement <%s> (%s)},
+
+ q{Can't insert into table <%s> (%s)}
+ =>
+ qq{Can't insert into table <%s> (%s)},
+
+ q{Can't lock ID-file <%s> (%s)}
+ =>
+ qq{Can't lock ID-file <%s> (%s)},
+
+ q{Can't open ID-file <%s> (%s)}
+ =>
+ qq{Can't open ID-file <%s> (%s)},
+
+ q{Can't prepare SQL-statement <%s> (%s)}
+ =>
+ qq{Can't prepare SQL-statement <%s> (%s)},
+
+ q{Can't rename table <%s> (%s)}
+ =>
+ qq{Can't rename table <%s> (%s)},
+
+ q{Can't to seek ID-file <%s> (%s)}
+ =>
+ qq{Can't to seek ID-file <%s> (%s)},
+
+ q{Can't truncate ID-file <%s> (%s)}
+ =>
+ qq{Can't truncate ID-file <%s> (%s)},
+
+ q{Can't update ID-file <%s> (%s)}
+ =>
+ qq{Can't update ID-file <%s> (%s)},
+
+ q{Can't update table <%s> (%s)}
+ =>
+ qq{Can't update table <%s> (%s)},
+
+ q{Cannot connect to database <%s> (%s)}
+ =>
+ qq{Cannot connect to database <%s> (%s)},
+
+ q{config-file <%s> has incorrect syntax here:\n\t%s\n}
+ =>
+ qq{config-file <%s> has incorrect syntax here:\n\t%s\n},
+
+ q{copying kernel %s to %s/kernel}
+ =>
+ qq{copying kernel %s to %s/kernel},
+
+ q{Could not determine schema version of database}
+ =>
+ qq{Could not determine schema version of database},
+
+ q{Could not load module <%s> (Version <%s> required, but <%s> found)}
+ =>
+ qq{Could not load module <%s> (Version <%s> required, but <%s> found)},
+
+ q{creating tar %s}
+ =>
+ qq{creating tar %s},
+
+ q{DB matches current schema version %s}
+ =>
+ qq{DB matches current schema version %s},
+
+ q{executing %s}
+ =>
+ qq{executing %s},
+
+ q{exporting client %d:%s}
+ =>
+ qq{exporting client %d:%s},
+
+ q{exporting system %d:%s}
+ =>
+ qq{exporting system %d:%s},
+
+ q{generating initialramfs %s/initramfs}
+ =>
+ qq{generating initialramfs %s/initramfs},
+
+ q{ignoring unknown key <%s>}
+ =>
+ qq{ignoring unknown key <%s>},
+
+ q{List of supported systems:\n\t}
+ =>
+ qq{List of supported systems:\n\t},
+
+ q{Lock-file <%s> exists, script is already running.\nPlease remove the logfile and try again if you are sure that no one else\nis executing this script.\n}
+ =>
+ qq{Lock-file <%s> exists, script is already running.\nPlease remove the logfile and try again if you are sure that no one else\nis executing this script.\n},
+
+ q{merging %s (val=%s)}
+ =>
+ qq{merging %s (val=%s)},
+
+ q{merging from default client...}
+ =>
+ qq{merging from default client...},
+
+ q{merging from group %d:%s...}
+ =>
+ qq{merging from group %d:%s...},
+
+ q{neither objdump nor readelf seems to be installed, giving up!\n}
+ =>
+ qq{neither objdump nor readelf seems to be installed, giving up!\n},
+
+ q{no}
+ =>
+ qq{no},
+
+ q{Our schema-version is %s, DB is %s, upgrading DB...}
+ =>
+ qq{Our schema-version is %s, DB is %s, upgrading DB...},
+
+ q{PXE-system %s already exists!}
+ =>
+ qq{PXE-system %s already exists!},
+
+ q{removing %s}
+ =>
+ qq{removing %s},
+
+ q{setting %s to <%s>}
+ =>
+ qq{setting %s to <%s>},
+
+ q{slxldd: unable to find file '%s', skipping it\n}
+ =>
+ qq{slxldd: unable to find file '%s', skipping it\n},
+
+ q{Sorry, system '%s' is unsupported.\n}
+ =>
+ qq{Sorry, system '%s' is unsupported.\n},
+
+ q{system-error: illegal target-path <%s>!}
+ =>
+ qq{system-error: illegal target-path <%s>!},
+
+ q{This will overwrite the current OpenSLX-database with an example dataset.\nAll your data (%s systems and %s clients) will be lost!\nDo you want to continue(%s/%s)? }
+ =>
+ qq{This will overwrite the current OpenSLX-database with an example dataset.\nAll your data (%s systems and %s clients) will be lost!\nDo you want to continue(%s/%s)? },
+
+ q{translations module %s loaded successfully}
+ =>
+ qq{translations module %s loaded successfully},
+
+ q{Unable to access client-config-path '%s'!}
+ =>
+ qq{Unable to access client-config-path '%s'!},
+
+ q{unable to create db-datadir %s! (%s)\n}
+ =>
+ qq{unable to create db-datadir %s! (%s)\n},
+
+ q{Unable to create lock-file <%s>, exiting!\n}
+ =>
+ qq{Unable to create lock-file <%s>, exiting!\n},
+
+ q{Unable to create or access temp-path '%s'!}
+ =>
+ qq{Unable to create or access temp-path '%s'!},
+
+ q{Unable to create or access tftpboot-path '%s'!}
+ =>
+ qq{Unable to create or access tftpboot-path '%s'!},
+
+ q{unable to execute shell-command:\n\t%s \n\t(%s)}
+ =>
+ qq{unable to execute shell-command:\n\t%s \n\t(%s)},
+
+ q{unable to fetch file info for '%s', giving up!\n}
+ =>
+ qq{unable to fetch file info for '%s', giving up!\n},
+
+ q{Unable to load DB-module <%s> (%s)\n}
+ =>
+ qq{Unable to load DB-module <%s> (%s)\n},
+
+ q{Unable to load DB-module <%s>\nthat database type is not supported (yet?)\n}
+ =>
+ qq{Unable to load DB-module <%s>\nthat database type is not supported (yet?)\n},
+
+ q{unable to load DHCP-Export backend '%s'! (%s)\n}
+ =>
+ qq{unable to load DHCP-Export backend '%s'! (%s)\n},
+
+ q{Unable to load module <%s> (Version <%s> required)}
+ =>
+ qq{Unable to load module <%s> (Version <%s> required)},
+
+ q{Unable to load module <%s> (Version <%s> required, but <%s> found)}
+ =>
+ qq{Unable to load module <%s> (Version <%s> required, but <%s> found)},
+
+ q{Unable to load system-module <%s> (%s)\n}
+ =>
+ qq{Unable to load system-module <%s> (%s)\n},
+
+ q{Unable to load system-module <%s>!\n}
+ =>
+ qq{Unable to load system-module <%s>!\n},
+
+ q{Unable to write local settings file <%s> (%s)}
+ =>
+ qq{Unable to write local settings file <%s> (%s)},
+
+ q{unknown settings key <%s>!\n}
+ =>
+ qq{unknown settings key <%s>!\n},
+
+ q{UnknownDbSchemaColumnDescr}
+ =>
+ qq{UnknownDbSchemaColumnDescr},
+
+ q{UnknownDbSchemaCommand}
+ =>
+ qq{UnknownDbSchemaCommand},
+
+ q{UnknownDbSchemaTypeDescr}
+ =>
+ qq{UnknownDbSchemaTypeDescr},
+
+ q{upgrade done}
+ =>
+ qq{upgrade done},
+
+ q{writing dhcp-config for %s clients}
+ =>
+ qq{writing dhcp-config for %s clients},
+
+ q{writing PXE-file %s}
+ =>
+ qq{writing PXE-file %s},
+
+ q{yes}
+ =>
+ qq{yes},
+
+ q{You need to specify at least one file!\n}
+ =>
+ qq{You need to specify at least one file!\n},
+
+ q{You need to specify exactly one system name!\n}
+ =>
+ qq{You need to specify exactly one system name!\n},
+
+ q{You need to specify the root-path!\n}
+ =>
+ qq{You need to specify the root-path!\n},
+
+);
+
+1;
diff --git a/src/lib/OpenSLX/Utils.pm b/src/lib/OpenSLX/Utils.pm
new file mode 100644
index 00000000..6e722c00
--- /dev/null
+++ b/src/lib/OpenSLX/Utils.pm
@@ -0,0 +1,701 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# Utils.pm
+# - provides utility functions for OpenSLX
+# -----------------------------------------------------------------------------
+package OpenSLX::Utils;
+
+use strict;
+use warnings;
+
+use vars qw(@ISA @EXPORT $VERSION);
+
+use Exporter;
+$VERSION = 1.01;
+@ISA = qw(Exporter);
+
+@EXPORT = qw(
+ copyFile fakeFile linkFile
+ copyBinaryWithRequiredLibs
+ slurpFile spitFile appendFile
+ followLink
+ unshiftHereDoc
+ string2Array trim
+ chrootInto
+ mergeHash
+ getFQDN
+ readPassword
+ hostIs64Bit
+ getAvailableBusyboxApplets
+ grabLock
+ pathOf
+ isInPath
+);
+
+=head1 NAME
+
+OpenSLX::Utils - provides utility functions for OpenSLX.
+
+=head1 DESCRIPTION
+
+This module exports utility functions, which are expected to be used all across
+OpenSLX.
+
+=cut
+
+use Fcntl qw(:DEFAULT :flock);
+use File::Basename;
+use File::Path;
+use Socket;
+use Sys::Hostname;
+use Term::ReadLine;
+
+use OpenSLX::Basics;
+use OpenSLX::ScopedResource;
+
+=head1 PUBLIC FUNCTIONS
+
+=over
+
+=item B<copyFile($fileName, $targetDir, $targetFileName)>
+
+Copies the file specified by I<$fileName> to the folder I<$targetDir>,
+preserving the permissions and optionally renaming it to I<$targetFileName>
+during the process.
+
+If I<$targetDir> does not exist yet, it will be created.
+
+=cut
+
+sub copyFile
+{
+ my $fileName = shift || croak 'need to pass in a fileName!';
+ my $targetDir = shift || croak 'need to pass in target dir!';
+ my $targetFileName = shift || '';
+
+ mkpath($targetDir) unless -d $targetDir;
+ my $target = "$targetDir/$targetFileName";
+ vlog(2, _tr("copying '%s' to '%s'", $fileName, $target));
+ if (system("cp -p $fileName $target")) {
+ croak(
+ _tr(
+ "unable to copy file '%s' to dir '%s' (%s)",
+ $fileName, $target, $!
+ )
+ );
+ }
+ return;
+}
+
+=item B<fakeFile($fullPath)>
+
+Creates the (empty) file I<$fullPath> unless it already exists.
+
+If the parent directory of I<$fullPath> does not exist yet, it will be created.
+
+=cut
+
+sub fakeFile
+{
+ my $fullPath = shift || croak 'need to pass in full path!';
+
+ return if -e $fullPath;
+
+ my $targetDir = dirname($fullPath);
+ mkpath($targetDir) unless -d $targetDir;
+
+ if (system("touch", $fullPath)) {
+ croak(_tr("unable to create file '%s' (%s)", $fullPath, $!));
+ }
+ return;
+}
+
+=item B<linkFile($linkTarget, $linkName)>
+
+Creates the link I<$linkName> that points to I<$linkTarget>.
+
+If the directory where the new link shall live does not exist yet, it will be
+created.
+
+=cut
+
+sub linkFile
+{
+ my $linkTarget = shift || croak 'need to pass in link target!';
+ my $linkName = shift || croak 'need to pass in link name!';
+
+ my $targetDir = dirname($linkName);
+ mkpath($targetDir) unless -d $targetDir;
+ if (system("ln -sfn $linkTarget $linkName")) {
+ croak(
+ _tr(
+ "unable to create link '%s' to '%s' (%s)",
+ $linkName, $linkTarget, $!
+ )
+ );
+ }
+ return;
+}
+
+=item B<slurpFile($fileName, $flags)>
+
+Reads the file specified by <$fileName> and returns the contents.
+
+The optional hash-ref I<$flags> supports the following entries:
+
+=over
+
+=item failIfMissing
+
+Specifies what shall happen if the file does not exist: die (failIfMissing == 1)
+or return an empty string (failIfMissing == 0). Defaults to 1.
+
+=item io-layer
+
+Specifies the Perl-IO-layer that shall be applied to the file (defaults to
+'utf8').
+
+=back
+
+=cut
+
+sub slurpFile
+{
+ my $fileName = shift || confess 'need to pass in fileName!';
+ my $flags = shift || {};
+
+ checkParams($flags, {
+ 'failIfMissing' => '?',
+ 'io-layer' => '?',
+ });
+ my $failIfMissing
+ = exists $flags->{failIfMissing} ? $flags->{failIfMissing} : 1;
+ my $ioLayer = $flags->{'io-layer'} || 'utf8';
+
+ my $fh;
+ if (!open($fh, "<:$ioLayer", $fileName)) {
+ return '' unless $failIfMissing;
+ croak _tr("could not open file '%s' for reading! (%s)", $fileName, $!);
+ }
+ if (wantarray()) {
+ my @content = <$fh>;
+ close($fh)
+ or croak _tr("unable to close file '%s' (%s)\n", $fileName, $!);
+ return @content;
+ }
+ else {
+ local $/;
+ my $content = <$fh>;
+ close($fh)
+ or croak _tr("unable to close file '%s' (%s)\n", $fileName, $!);
+ return $content;
+ }
+}
+
+=item B<spitFile($fileName, $content, $flags)>
+
+Writes the given I<$content> to the file specified by <$fileName>, creating
+the file (and any missing directories) if it does not exist yet.
+
+The optional hash-ref I<$flags> supports the following entries:
+
+=over
+
+=item io-layer
+
+Specifies the Perl-IO-layer that shall be applied to the file (defaults to
+'utf8').
+
+=item mode
+
+Specifies the file mode that shall be applied to the file (via chmod).
+
+=back
+
+=cut
+
+sub spitFile
+{
+ my $fileName = shift || croak 'need to pass in a fileName!';
+ my $content = shift || '';
+ my $flags = shift || {};
+
+ checkParams($flags, {
+ 'io-layer' => '?',
+ 'mode' => '?',
+ });
+ my $ioLayer = $flags->{'io-layer'} || 'utf8';
+
+ my $targetDir = dirname($fileName);
+ mkpath($targetDir) unless -d $targetDir;
+
+ my $fh;
+ open($fh, ">:$ioLayer", $fileName)
+ or croak _tr("unable to create file '%s' (%s)\n", $fileName, $!);
+ print $fh $content
+ or croak _tr("unable to print to file '%s' (%s)\n", $fileName, $!);
+ close($fh)
+ or croak _tr("unable to close file '%s' (%s)\n", $fileName, $!);
+ if (defined $flags->{mode}) {
+ chmod $flags->{mode}, $fileName;
+ }
+ return;
+}
+
+=item B<appendFile($fileName, $content, $flags)>
+
+Appends the given I<$content> to the file specified by <$fileName>, creating
+the file (and any missing directories) if it does not exist yet.
+
+The optional hash-ref I<$flags> supports the following entries:
+
+=over
+
+=item io-layer
+
+Specifies the Perl-IO-layer that shall be applied to the file (defaults to
+'utf8').
+
+=back
+
+=cut
+
+sub appendFile
+{
+ my $fileName = shift || croak 'need to pass in a fileName!';
+ my $content = shift;
+ my $flags = shift || {};
+
+ checkParams($flags, {
+ 'io-layer' => '?',
+ });
+ my $ioLayer = $flags->{'io-layer'} || 'utf8';
+
+ my $targetDir = dirname($fileName);
+ mkpath($targetDir) unless -d $targetDir;
+
+ my $fh;
+ open($fh, ">>:$ioLayer", $fileName)
+ or croak _tr("unable to create file '%s' (%s)\n", $fileName, $!);
+ print $fh $content
+ or croak _tr("unable to print to file '%s' (%s)\n", $fileName, $!);
+ close($fh)
+ or croak _tr("unable to close file '%s' (%s)\n", $fileName, $!);
+ return;
+}
+
+=item B<followLink($path, $prefixedPath)>
+
+Deeply traverses the given I<$path> until it no longer contains a link and
+returns the resulting file or directory.
+
+If you pass in a I<$prefixedPath>, each link will be resolved relatively to
+that path (useful for example with respect to chroot-environments).
+
+=cut
+
+sub followLink
+{
+ my $path = shift || croak 'need to pass in a path!';
+ my $prefixedPath = shift || '';
+
+ my $target;
+ while (-l "$path") {
+ $target = readlink "$path";
+ if (substr($target, 0, 1) eq '/') {
+ $path = "$prefixedPath$target";
+ }
+ else {
+ $path = $prefixedPath . dirname($path) . '/' . $target;
+ }
+ }
+ return $path;
+}
+
+=item B<copyBinaryWithRequiredLibs($params)>
+
+Copies a binary to a specified folder, taking along all the libraries that
+are required by this binary.
+
+The hash-ref I<$params> supports the following entries:
+
+=over
+
+=item binary
+
+The full path to the binary that shall be copied.
+
+=item targetFolder
+
+The full path to the folder where the binary shall be copied to.
+
+=item libTargetFolder
+
+Defines a path relatively to which all required libs will be copied to.
+
+An example: during execution of
+
+ copyBinaryWithRequiredLibs({
+ binary => '/bin/ls',
+ targetFolder => '/tmp/slx-initramfs/bin',
+ libTargetFolder => '/tmp/slx-initramfs',
+ });
+
+the library C<lib/libc-2.6.1.so> will be copied to
+C</tmp/slx-initramfs/lib/libc-2.6.1.so>.
+
+=item targetName [optional]
+
+If you'd like to rename the binary while copying, you can specify the new name
+in this entry.
+
+=back
+
+=cut
+
+sub copyBinaryWithRequiredLibs {
+ my $params = shift;
+
+ checkParams($params, {
+ 'binary' => '!', # file to copy
+ 'targetFolder' => '!', # where file shall be copied to
+ 'libTargetFolder' => '!', # base target folder for libs
+ 'targetName' => '?', # name of binary in target folder
+ });
+ copyFile($params->{binary}, $params->{targetFolder}, $params->{targetName});
+
+ # determine all required libraries and copy those, too:
+ vlog(1, _tr("calling slxldd for $params->{binary}"));
+ my $slxlddCmd = "slxldd $params->{binary}";
+ vlog(2, "executing: $slxlddCmd");
+ my $requiredLibsStr = qx{$slxlddCmd};
+ if ($?) {
+ die _tr(
+ "slxldd couldn't determine the libs required by '%s'! (%s)",
+ $params->{binary}, $?
+ );
+ }
+ chomp $requiredLibsStr;
+ vlog(2, "slxldd results:\n$requiredLibsStr");
+
+ foreach my $lib (split "\n", $requiredLibsStr) {
+ my $libDir = dirname($lib);
+ my $targetLib = "$params->{libTargetFolder}$libDir";
+ next if -e "$targetLib/$lib";
+ vlog(3, "copying lib '$lib'");
+ copyFile($lib, $targetLib);
+ }
+ return $requiredLibsStr;
+}
+
+=item B<unshiftHereDoc($content)>
+
+Returns the here-doc (or string) given in I<$content> such that the leading
+whitespace found on the first line will be removed from all lines.
+
+As an example: if you pass in the string
+
+ #!/bin/sh
+ if [ -n "$be_nice" ]; then
+ echo "bummer!" >/etc/passwd
+ fi
+
+you will get this:
+
+#!/bin/sh
+if [ -n "$be_nice" ]; then
+ echo "bummer!" >/etc/passwd
+fi
+
+=cut
+
+sub unshiftHereDoc
+{
+ my $content = shift;
+ return $content unless $content =~ m{^(\s+)};
+ my $shiftStr = $1;
+ $content =~ s[^$shiftStr][]gms;
+ return $content;
+}
+
+=item B<string2Array($string)>
+
+Returns the given string split into an array, using newlines as separator.
+
+In the resulting array, empty entries will have been removed and each entry
+will be trimmed of leading or trailing whitespace and comments (lines starting
+with a #).
+
+=cut
+
+sub string2Array
+{
+ my $string = shift || '';
+
+ my @lines = split m[\n], $string;
+ for my $line (@lines) {
+ # remove leading and trailing whitespace:
+ $line =~ s{^\s*(.*?)\s*$}{$1};
+ }
+
+ # drop empty lines and comments:
+ return grep { length($_) > 0 && $_ !~ m[^\s*#]; } @lines;
+}
+
+=item B<chrootInto($osDir)>
+
+Does a chroot() into the given directory (which is supposed to contain at
+least the fragments of an operating system).
+
+=cut
+
+sub chrootInto
+{
+ my $osDir = shift;
+
+ vlog(2, "chrooting into $osDir...");
+ chdir $osDir
+ or die _tr("unable to chdir into '%s' (%s)\n", $osDir, $!);
+
+ # ...do chroot
+ chroot "."
+ or die _tr("unable to chroot into '%s' (%s)\n", $osDir, $!);
+ return;
+}
+
+=item B<mergeHash($targetHash, $sourceHash, $fillOnly)>
+
+Deeply copies values from I<$sourceHash> into I<$targetHash>.
+
+If you pass in 1 for I<$fillOnly>, only hash entries that do not exist in
+I<$targetHash> will be copied (C<Merge>-mode), otherwise all values from
+I<$sourceHash> will be copied over (C<Push>-mode).
+
+Returns the resulting I<$targetHash> for convenience.
+
+=cut
+
+sub mergeHash
+{
+ my $targetHash = shift;
+ my $sourceHash = shift;
+ my $fillOnly = shift || 0;
+
+ foreach my $key (keys %{$sourceHash}) {
+ my $sourceVal = $sourceHash->{$key};
+ if (ref($sourceVal) eq 'HASH') {
+ if (!exists $targetHash->{$key}) {
+ $targetHash->{$key} = {};
+ }
+ mergeHash($targetHash->{$key}, $sourceVal);
+ }
+ elsif (ref($sourceVal) eq 'ARRAY') {
+ if (!exists $targetHash->{$key}) {
+ $targetHash->{$key} = [];
+ }
+ foreach my $val (@{$sourceHash->{$key}}) {
+ my $targetVal = {};
+ push @{$targetHash->{$key}}, $targetVal;
+ mergeHash($targetVal, $sourceVal);
+ }
+ }
+ else {
+ next if $fillOnly && exists $targetHash->{$key};
+ $targetHash->{$key} = $sourceVal;
+ }
+ }
+ return $targetHash;
+}
+
+=item B<getFQDN()>
+
+Determines the fully-qualified-domain-name (FQDN) of the computer executing
+this function and returns it.
+
+=cut
+
+sub getFQDN
+{
+ my $hostName = hostname();
+
+ my $hostAddr = gethostbyname($hostName)
+ or die(_tr("unable to get address of host '%s'", $hostName));
+ my $FQDN = gethostbyaddr($hostAddr, AF_INET)
+ or die(_tr("unable to get dns-name of address '%s'", $hostAddr));
+ return $FQDN;
+}
+
+=item B<readPassword($prompt)>
+
+Outputs the given I<$prompt> and then reads a password from the terminal
+(trying to make sure that the characters are not echoed in a readable form).
+
+=cut
+
+sub readPassword
+{
+ my $prompt = shift;
+
+ my $term = Term::ReadLine->new('slx');
+ my $attribs = $term->Attribs;
+ $attribs->{redisplay_function} = $attribs->{shadow_redisplay};
+
+ return $term->readline($prompt);
+}
+
+=item B<hostIs64Bit()>
+
+Returns 1 if the host (the computer executing this function) is running a
+64-bit OS, 0 if not (i.e. 32-bit).
+
+=cut
+
+sub hostIs64Bit
+{
+ my $arch = qx{uname -m};
+ return $arch =~ m[64];
+}
+
+=item B<getAvailableBusyboxApplets()>
+
+Returns the list of the applets that is provided by the given busybox binary.
+
+=cut
+
+sub getAvailableBusyboxApplets
+{
+ my $busyboxBinary = shift;
+
+ my $busyboxHelp = qx{$busyboxBinary --help};
+ if ($busyboxHelp !~ m{defined functions:(.+)\z}ims) {
+ die "unable to parse busybox --help output:\n$busyboxHelp";
+ }
+ my $rawAppletList = $1;
+ my @busyboxApplets
+ = map {
+ $_ =~ s{\s+}{}igms;
+ $_;
+ }
+ split m{,}, $rawAppletList;
+
+ return @busyboxApplets;
+}
+
+=item grabLock()
+
+=cut
+
+sub grabLock
+{
+ my $lockName = shift || die 'you need to pass a lock-name to grabLock()!';
+
+ my $lockPath = "$openslxConfig{'private-path'}/locks";
+ mkpath($lockPath) unless -e $lockPath;
+
+ # drop any trailing slashes from lock name:
+ $lockName =~ s{/+$}{};
+ my $lockFile = "$lockPath/$lockName";
+
+ my $lockFH;
+
+ my $lock = OpenSLX::ScopedResource->new({
+ name => "lock::$lockName",
+ acquire => sub {
+ # use a lock-file to implement the actual locking:
+ if (-e $lockFile) {
+ my $ctime = (stat($lockFile))[10];
+ my $now = time();
+ if ($now - $ctime > 15 * 60) {
+ # existing lock file is older than 15 minutes, we consider
+ # that to be a leftover (which shouldn't happen of course)
+ # and wipe it:
+ unlink $lockFile;
+ }
+ }
+
+ local $| = 1;
+ my $waiting;
+ while(!(sysopen($lockFH, $lockFile, O_RDWR | O_CREAT | O_EXCL)
+ && syswrite($lockFH, getpgrp() . "\n"))) {
+ if ($! == 13) {
+ die _tr(
+ qq[Unable to create lock "%s", giving up!], $lockFile
+ );
+ } else {
+ # check if the lock is owned by our own process group
+ # and only block if it isn't (this allows recursive locking)
+ my $pgrpOfLock
+ = slurpFile($lockFile, { failIfMissing => 0});
+ last if $pgrpOfLock && $pgrpOfLock == getpgrp();
+
+ # wait for lock to become available
+ if (!$waiting) {
+ print _tr('waiting for "%s"-lock ', $lockName);
+ $waiting = 1;
+ }
+ else {
+ print '.';
+ }
+ sleep(1);
+ }
+ }
+ print "ok\n" if $waiting;
+ 1
+ },
+ release => sub {
+ close($lockFH);
+ unlink $lockFile;
+ 1
+ },
+ });
+
+ return $lock;
+}
+
+=item B<pathOf()>
+
+Returns the path of a binary it is installed in.
+
+=cut
+
+sub pathOf
+{
+ my $binary = shift;
+ return qx{which $binary 2>/dev/null};
+}
+
+=item B<isInpath()>
+
+Returns whether a binary is found.
+
+=cut
+
+sub isInPath
+{
+ my $binary = shift;
+ my $path = pathOf($binary);
+
+ return $path ? 1 : 0;
+}
+
+
+sub trim
+{
+ my $string = shift;
+
+ $string =~ s/^\s+//;
+ $string =~ s/\s+$//;
+
+ return $string;
+}
+
+
+1;
diff --git a/src/lib/distro-info/clone-filter.example b/src/lib/distro-info/clone-filter.example
new file mode 100644
index 00000000..14582c3c
--- /dev/null
+++ b/src/lib/distro-info/clone-filter.example
@@ -0,0 +1,14 @@
+# this file defines the filter rules used when cloning any vendor-OS
+#
+# copy this file to 'clone-filter' and add your own filters to it
+# in order to overrule the filters provided by openslx
+#
+#Examples:
+# the following line would include anything below /var/spool/
+#+ /var/spool/*
+#
+# this would exclude anything in /etc that starts with dhcpd.conf
+#- /etc/dhcpd.conf*
+#
+# and this would exclude all rpmnew-files:
+#- *.rpmnew
diff --git a/src/lib/distro-info/debian-3.1/mirrors/base b/src/lib/distro-info/debian-3.1/mirrors/base
new file mode 100644
index 00000000..7d6aaa9e
--- /dev/null
+++ b/src/lib/distro-info/debian-3.1/mirrors/base
@@ -0,0 +1,287 @@
+ftp://ameba.sc-uni.ktu.lt/debian
+ftp://artfiles.org/debian
+ftp://bigmirror.crossbowproject.net/pub/debian
+ftp://carroll.aset.psu.edu/pub/linux/distributions/debian
+http://cdn.debian.or.jp/debian
+ftp://cudlug.cudenver.edu/debian
+ftp://debian.balt.net/debian
+ftp://debian.bsnet.se/debian
+ftp://debian.cict.fr/debian
+ftp://debian.cites.uiuc.edu/pub/debian
+ftp://debian.cn99.com/debian
+http://debian.co.il/debian
+ftp://debian.cruisix.net/debian
+http://debian.csg.uzh.ch/debian
+ftp://debian.csie.nctu.edu.tw/debian
+http://debian.csie.ntu.edu.tw/debian
+ftp://debian.csie.ntu.edu.tw/pub/debian
+ftp://debian.ens-cachan.fr/debian
+http://debian.ens-cachan.fr/ftp/debian
+http://debian.eso-es.net/debian
+ftp://debian.essentkabel.com/debian
+ftp://debian.fastbull.org/debian
+ftp://debian.fastweb.it/debian
+http://debian.fifi.org/debian
+ftp://debian.fifi.org/pub/debian
+ftp://debian.ibisc.univ-evry.fr/debian
+ftp://debian.ihug.co.nz/debian
+http://debian.indika.net.id/debian
+ftp://debian.inode.at/debian
+http://debian.intergenia.de/debian
+ftp://debian.internet.gr/debian
+ftp://debian.iskon.hr/debian
+ftp://debian.lcs.mit.edu/debian
+http://debian.logiclinux.com/debian
+ftp://debian.ludost.net/debian
+http://debian.midco.net/debian
+ftp://debian.mines.inpl-nancy.fr/debian
+ftp://debian.mirror.ac.za/debian
+ftp://debian.mirror.frontiernet.net/debian
+ftp://debian.mirror.inra.fr/debian
+ftp://debian.mirror.iweb.ca/debian
+ftp://debian.mirror.rafal.ca/debian
+ftp://debian.mirrors.crysys.hu/debian
+ftp://debian.mirrors.easynet.fr/debian
+ftp://debian.mirrors.tds.net/debian
+ftp://debian.nctu.edu.tw/debian
+ftp://debian.netcologne.de/debian
+http://debian.osdn.org.ua/debian
+ftp://debian.osdn.org.ua/pub/Debian/debian
+ftp://debian.osuosl.org/debian
+http://debian.otenet.gr/debian
+ftp://debian.otenet.gr/pub/linux/debian
+http://debian.pffa.de/mirrors/debian
+ftp://debian.pffa.de/pub/mirrors/debian
+http://debian.pop-sc.rnp.br/debian
+ftp://debian.savoirfairelinux.net/debian
+ftp://debian.secsup.org/pub/linux/debian
+ftp://debian.sh.cvut.cz/debian
+http://debian.shimpinomori.net/debian
+ftp://debian.swordcoast.net/debian
+ftp://debian.telecoms.bg/debian
+ftp://debian.torredehanoi.org/debian
+ftp://debian.tu-bs.de/debian
+ftp://debian.ua.pt/debian
+http://debian.ubiobio.cl/debian
+ftp://debian.uchicago.edu/debian
+ftp://debian.udsu.ru/debian
+http://debian.unesr.edu.ve/debian
+http://debian.uni-c.dk/debian
+ftp://debian.uni-essen.de/debian
+http://debian.uni.edu.ni/debian
+ftp://debian.wow-vision.com.sg/debian
+http://debian.yorku.ca/debian
+ftp://dennou-k.gfd-dennou.org/library/Linux/debian
+ftp://dennou-q.gfd-dennou.org/library/Linux/debian
+ftp://distro.ibiblio.org/pub/linux/distributions/debian
+ftp://download.mirror.ac.uk/sites/ftp.debian.org/debian
+http://freedom.dicea.unifi.it/ftp/pub/linux/debian
+ftp://freedom.dicea.unifi.it/pub/linux/debian
+ftp://ftp-stud.fht-esslingen.de/debian
+ftp://ftp.arnes.si/packages/debian
+http://ftp.at.debian.org/debian
+http://ftp.au.debian.org/debian
+ftp://ftp.belnet.be/debian
+http://ftp.bg.debian.org/debian
+ftp://ftp.bme.hu/OS/Linux/dist/debian
+ftp://ftp.bononia.it/debian
+http://ftp.br.debian.org/debian
+ftp://ftp.caliu.info/debian
+ftp://ftp.carnet.hr/debian
+ftp://ftp.cc.uoc.gr/mirrors/linux/debian
+ftp://ftp.ccc.uba.ar/pub/linux/debian/debian
+http://ftp.ch.debian.org/debian
+ftp://ftp.cica.es/debian
+http://ftp.cl.debian.org/debian
+ftp://ftp.coe.psu.ac.th/debian
+ftp://ftp.corbina.ru/pub/Linux/debian
+ftp://ftp.crihan.fr/debian
+ftp://ftp.cs.unm.edu/mirrors/debian
+http://ftp.cz.debian.org/debian
+http://ftp.de.debian.org/debian
+ftp://ftp.debian.ikoula.com/debian
+ftp://ftp.debian.nl/debian
+ftp://ftp.debian.org/debian
+ftp://ftp.debian.sk/debian
+ftp://ftp.debian.skynet.be/debian
+http://ftp.debian.skynet.be/ftp/debian
+http://ftp.dk.debian.org/debian
+http://ftp.dkuug.dk/debian
+ftp://ftp.dkuug.dk/pub/debian
+ftp://ftp.dti.ad.jp/pub/Linux/debian
+ftp://ftp.duth.gr/debian
+ftp://ftp.easynet.be/debian
+http://ftp.easynet.be/ftp/debian
+http://ftp.ee.debian.org/debian
+ftp://ftp.egr.msu.edu/debian
+ftp://ftp.eq.uc.pt/pub/software/Linux/debian
+http://ftp.eq.uc.pt/software/Linux/debian
+http://ftp.es.debian.org/debian
+ftp://ftp.esat.net/pub/linux/debian
+ftp://ftp.eutelia.it/pub/Debian_Mirror
+http://ftp.fi.debian.org/debian
+http://ftp.fr.debian.org/debian
+http://ftp.freenet.de/debian
+ftp://ftp.freenet.de/pub/ftp.debian.org/debian
+ftp://ftp.fu-berlin.de/pub/unix/linux/mirrors/debian
+ftp://ftp.funet.fi/pub/linux/mirrors/debian
+ftp://ftp.grokthis.net/mirrors/debian
+http://ftp.gtlib.gatech.edu/debian
+ftp://ftp.gtlib.gatech.edu/pub/debian
+ftp://ftp.gul.uc3m.es/debian
+http://ftp.gva.es/mirror/debian
+http://ftp.hk.debian.org/debian
+ftp://ftp.hosteurope.de/pub/linux/debian
+http://ftp.hr.debian.org/debian
+http://ftp.hu.debian.org/debian
+ftp://ftp.icm.edu.pl/pub/Linux/debian
+http://ftp.ie.debian.org/debian
+ftp://ftp.iinet.net.au/debian/debian
+ftp://ftp.iitm.ac.in/debian
+ftp://ftp.informatik.hu-berlin.de/pub/Mirrors/ftp.de.debian.org/debian
+ftp://ftp.irb.hr/debian
+http://ftp.is.debian.org/debian
+http://ftp.it.debian.org/debian
+ftp://ftp.iut-bm.univ-fcomte.fr/debian
+ftp://ftp.jaist.ac.jp/pub/Linux/Debian
+http://ftp.jp.debian.org/debian
+ftp://ftp.jyu.fi/debian
+ftp://ftp.keystealth.org/debian
+http://ftp.kr.debian.org/debian
+ftp://ftp.kulnet.kuleuven.ac.be/debian
+ftp://ftp.linux.pt/pub/mirrors/debian
+ftp://ftp.lip6.fr/pub/linux/distributions/debian
+ftp://ftp.lug.ro/debian
+ftp://ftp.man.szczecin.pl/pub/Linux/debian
+ftp://ftp.mgts.by/debian
+ftp://ftp.mikesnet.ro/debian
+ftp://ftp.mipt.ru/debian
+ftp://ftp.monash.edu.au/pub/linux/debian
+ftp://ftp.mpi-sb.mpg.de/pub/linux/distributions/debian/debian
+http://ftp.mx.debian.org/debian
+ftp://ftp.ndlug.nd.edu/debian
+http://ftp.ndlug.nd.edu/mirrors/debian
+ftp://ftp.nerim.net/debian
+http://ftp.nl.debian.org/debian
+ftp://ftp.nluug.nl/pub/os/Linux/distr/debian
+http://ftp.no.debian.org/debian
+ftp://ftp.ntua.gr/pub/linux/debian
+http://ftp.nz.debian.org/debian
+http://ftp.pl.debian.org/debian
+ftp://ftp.port80.se/debian
+ftp://ftp.psn.ru/debian
+http://ftp.pt.debian.org/debian
+ftp://ftp.pucpr.br/debian
+ftp://ftp.rediris.es/debian
+ftp://ftp.riken.jp/pub/Linux/debian/debian
+http://ftp.ro.debian.org/debian
+ftp://ftp.rrzn.uni-hannover.de/debian/debian
+http://ftp.ru.debian.org/debian
+ftp://ftp.scarlet.be/pub/debian
+http://ftp.se.debian.org/debian
+http://ftp.si.debian.org/debian
+http://ftp.sk.debian.org/debian
+http://ftp.softnet.tuc.gr/ftp/linux/debian
+ftp://ftp.stw-bonn.de/debian
+ftp://ftp.sun.ac.za/debian
+http://ftp.sun.ac.za/ftp/debian
+ftp://ftp.sunet.se/pub/os/Linux/distributions/debian
+http://ftp.surfnet.nl/os/Linux/distr/debian
+ftp://ftp.surfnet.nl/pub/os/Linux/distr/debian
+ftp://ftp.telepac.pt/pub/debian
+http://ftp.thaios.net/debian
+ftp://ftp.ticklers.org/debian
+ftp://ftp.tiscali.de/pub/debian/debian
+http://ftp.tiscali.nl/debian
+ftp://ftp.tiscali.nl/pub/mirrors/debian
+http://ftp.tr.debian.org/debian
+ftp://ftp.tu-chemnitz.de/pub/linux/debian/debian
+ftp://ftp.tu-clausthal.de/pub/linux/debian
+ftp://ftp.tu-graz.ac.at/mirror/debian
+http://ftp.tw.debian.org/debian
+ftp://ftp.twaren.net/debian
+ftp://ftp.u-picardie.fr/mirror/debian
+ftp://ftp.u-strasbg.fr/debian
+ftp://ftp.udc.es/debian
+http://ftp.uk.debian.org/debian
+ftp://ftp.um.es/mirror/debian
+http://ftp.uni-bayreuth.de/linux/Debian/debian
+ftp://ftp.uni-bayreuth.de/pub/linux/Debian/debian
+ftp://ftp.uni-kl.de/debian
+ftp://ftp.uni-koeln.de/debian
+ftp://ftp.uni-sofia.bg/debian
+ftp://ftp.unina.it/pub/linux/distributions/debian
+ftp://ftp.univie.ac.at/systems/linux/debian/debian
+http://ftp.us.debian.org/debian
+ftp://ftp.uwa.edu.au/debian
+ftp://ftp.uwsg.indiana.edu/linux/debian
+ftp://ftp.vectranet.pl/debian
+http://ftp.wa.au.debian.org/debian
+ftp://ftp.yz.yamagata-u.ac.jp/debian
+ftp://ftp.zcu.cz/mirrors/debian
+http://ftp2.de.debian.org/debian
+http://ftp2.fr.debian.org/debian
+ftp://ftp3.nrc.ca/debian
+ftp://ftp5.gwdg.de/pub/linux/debian/debian
+ftp://gd.tuwien.ac.at/opsys/linux/debian
+ftp://gladiator.real-time.com/linux/debian
+ftp://gulus.usherbrooke.ca/debian
+ftp://jane.uab.cat/debian
+ftp://kebo.vlsm.org/debian
+ftp://linorg.usp.br/debian
+http://linux.iq.usp.br/debian
+ftp://linux.org.by/debian
+ftp://lug.mtu.edu/debian
+ftp://mi.mirror.garr.it/mirrors/debian
+ftp://mir1.ovh.net/debian
+http://mir2.ovh.net/debian
+ftp://mirror.aarnet.edu.au/debian
+http://mirror.anl.gov/debian
+ftp://mirror.anl.gov/pub/debian
+ftp://mirror.cc.columbia.edu/pub/linux/debian/debian
+ftp://mirror.cs.wisc.edu/pub/mirrors/linux/debian
+ftp://mirror.datafast.net.au/debian
+ftp://mirror.eftel.com/debian
+ftp://mirror.inter.net.il/pub/debian
+http://mirror.isoc.org.il/pub/debian
+ftp://mirror.nttu.edu.tw/debian
+http://mirror.nus.edu.sg/Debian
+ftp://mirror.nus.edu.sg/pub/Debian
+ftp://mirror.optus.net/debian
+ftp://mirror.ox.ac.uk/debian
+ftp://mirror.pacific.net.au/debian
+http://mirror.peer1.net/debian
+ftp://mirror.positive-internet.com/debian
+ftp://mirror.scarlet-internet.nl/pub/debian
+http://mirror.switch.ch/ftp/mirror/debian
+ftp://mirror.switch.ch/mirror/debian
+http://mirror.tucdemonic.org/debian
+http://mirror.ynet.sk/debian
+ftp://mirrors.geekbone.org/debian
+ftp://mirrors.geeks.org/debian
+ftp://mirrors.ircam.fr/pub/debian
+ftp://mirrors.kernel.org/debian
+http://mirrors.nfsi.pt/debian
+ftp://mirrors.nfsi.pt/pub/debian
+ftp://mirrors.telianet.dk/debian
+http://mirrors.tummy.com/debian
+http://mirrors.uol.com.br/pub/debian
+ftp://mirrors.usc.edu/pub/linux/distributions/debian
+http://mmc.igeofcu.unam.mx/debian
+ftp://opensource.nchc.org.tw/debian
+http://ring.asahi-net.or.jp/archives/linux/debian/debian
+ftp://ring.asahi-net.or.jp/pub/linux/debian/debian
+ftp://sb.itc.u-tokyo.ac.jp/DEBIAN
+http://sft.if.usp.br/debian
+http://sluglug.ucsc.edu/debian
+http://sunsite.informatik.rwth-aachen.de/ftp/pub/Linux/debian
+ftp://sunsite.informatik.rwth-aachen.de/pub/Linux/debian
+ftp://techweb.rfa.org/debian
+ftp://the.earth.li/debian
+ftp://ukdebian.mirror.anlx.net/debian
+ftp://webb.ens-cachan.fr/debian
+ftp://www.las.ic.unicamp.br/pub/debian
+ftp://www.mirrorservice.org/sites/ftp.debian.org/debian
+http://www.ring.gr.jp/archives/linux/debian/debian
+ftp://www.ring.gr.jp/pub/linux/debian/debian
+http://www.zentek-international.com/mirrors/debian
diff --git a/src/lib/distro-info/debian-3.1/prereqfiles/etc/hosts b/src/lib/distro-info/debian-3.1/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/debian-3.1/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/debian-3.1/prereqfiles/var/cache/debconf/slx-defaults.dat b/src/lib/distro-info/debian-3.1/prereqfiles/var/cache/debconf/slx-defaults.dat
new file mode 100644
index 00000000..c621a472
--- /dev/null
+++ b/src/lib/distro-info/debian-3.1/prereqfiles/var/cache/debconf/slx-defaults.dat
@@ -0,0 +1,16 @@
+Name: locales/default_environment_locale
+Template: locales/default_environment_locale
+Value: de_DE.UTF-8
+Owners: locales
+Flags: seen
+Variables:
+ locales = de_DE.UTF-8
+
+Name: locales/locales_to_be_generated
+Template: locales/locales_to_be_generated
+Value: de_DE.UTF-8 UTF-8
+Owners: locales
+Flags: seen
+Variables:
+ locales = aa_DJ ISO-8859-1, aa_ER UTF-8, aa_ER@saaho UTF-8, aa_ET UTF-8, af_ZA ISO-8859-1, am_ET UTF-8, an_ES ISO-8859-15, ar_AE ISO-8859-6, ar_AE.UTF-8 UTF-8, ar_BH ISO-8859-6, ar_BH.UTF-8 UTF-8, ar_DZ ISO-8859-6, ar_DZ.UTF-8 UTF-8, ar_EG ISO-8859-6, ar_EG.UTF-8 UTF-8, ar_IN UTF-8, ar_IQ ISO-8859-6, ar_IQ.UTF-8 UTF-8, ar_JO ISO-8859-6, ar_JO.UTF-8 UTF-8, ar_KW ISO-8859-6, ar_KW.UTF-8 UTF-8, ar_LB ISO-8859-6, ar_LB.UTF-8 UTF-8, ar_LY ISO-8859-6, ar_LY.UTF-8 UTF-8, ar_MA ISO-8859-6, ar_MA.UTF-8 UTF-8, ar_OM ISO-8859-6, ar_OM.UTF-8 UTF-8, ar_QA ISO-8859-6, ar_QA.UTF-8 UTF-8, ar_SA ISO-8859-6, ar_SA.UTF-8 UTF-8, ar_SD ISO-8859-6, ar_SD.UTF-8 UTF-8, ar_SY ISO-8859-6, ar_SY.UTF-8 UTF-8, ar_TN ISO-8859-6, ar_TN.UTF-8 UTF-8, ar_YE ISO-8859-6, ar_YE.UTF-8 UTF-8, az_AZ.UTF-8 UTF-8, be_BY CP1251, be_BY.UTF-8 UTF-8, bg_BG CP1251, bg_BG.UTF-8 UTF-8, bn_BD UTF-8, bn_IN UTF-8, br_FR ISO-8859-1, br_FR@euro ISO-8859-15, bs_BA ISO-8859-2, byn_ER UTF-8, ca_ES ISO-8859-1, ca_ES.UTF-8 UTF-8, ca_ES.UTF-8@euro UTF-8, ca_ES@euro ISO-8859-15, cs_CZ ISO-8859-2, cs_CZ.UTF-8 UTF-8, cy_GB ISO-8859-14, cy_GB.UTF-8 UTF-8, da_DK ISO-8859-1, da_DK.ISO-8859-15 ISO-8859-15, da_DK.UTF-8 UTF-8, de_AT ISO-8859-1, de_AT.UTF-8 UTF-8, de_AT.UTF-8@euro UTF-8, de_AT@euro ISO-8859-15, de_BE ISO-8859-1, de_BE.UTF-8 UTF-8, de_BE.UTF-8@euro UTF-8, de_BE@euro ISO-8859-15, de_CH ISO-8859-1, de_CH.UTF-8 UTF-8, de_DE ISO-8859-1, de_DE.UTF-8 UTF-8, de_DE.UTF-8@euro UTF-8, de_DE@euro ISO-8859-15, de_LU ISO-8859-1, de_LU.UTF-8 UTF-8, de_LU.UTF-8@euro UTF-8, de_LU@euro ISO-8859-15, el_GR ISO-8859-7, el_GR.UTF-8 UTF-8, en_AU ISO-8859-1, en_AU.UTF-8 UTF-8, en_BW ISO-8859-1, en_BW.UTF-8 UTF-8, en_CA ISO-8859-1, en_CA.UTF-8 UTF-8, en_DK ISO-8859-1, en_DK.UTF-8 UTF-8, en_GB ISO-8859-1, en_GB.ISO-8859-15 ISO-8859-15, en_GB.UTF-8 UTF-8, en_HK ISO-8859-1, en_HK.UTF-8 UTF-8, en_IE ISO-8859-1, en_IE.UTF-8 UTF-8, en_IE.UTF-8@euro UTF-8, en_IE@euro ISO-8859-15, en_IN UTF-8, en_NZ ISO-8859-1, en_NZ.UTF-8 UTF-8, en_PH ISO-8859-1, en_PH.UTF-8 UTF-8, en_SG ISO-8859-1, en_SG.UTF-8 UTF-8, en_US ISO-8859-1, en_US.ISO-8859-15 ISO-8859-15, en_US.UTF-8 UTF-8, en_ZA ISO-8859-1, en_ZA.UTF-8 UTF-8, en_ZW ISO-8859-1, en_ZW.UTF-8 UTF-8, es_AR ISO-8859-1, es_AR.UTF-8 UTF-8, es_BO ISO-8859-1, es_BO.UTF-8 UTF-8, es_CL ISO-8859-1, es_CL.UTF-8 UTF-8, es_CO ISO-8859-1, es_CO.UTF-8 UTF-8, es_CR ISO-8859-1, es_CR.UTF-8 UTF-8, es_DO ISO-8859-1, es_DO.UTF-8 UTF-8, es_EC ISO-8859-1, es_EC.UTF-8 UTF-8, es_ES ISO-8859-1, es_ES.UTF-8 UTF-8, es_ES.UTF-8@euro UTF-8, es_ES@euro ISO-8859-15, es_GT ISO-8859-1, es_GT.UTF-8 UTF-8, es_HN ISO-8859-1, es_HN.UTF-8 UTF-8, es_MX ISO-8859-1, es_MX.UTF-8 UTF-8, es_NI ISO-8859-1, es_NI.UTF-8 UTF-8, es_PA ISO-8859-1, es_PA.UTF-8 UTF-8, es_PE ISO-8859-1, es_PE.UTF-8 UTF-8, es_PR ISO-8859-1, es_PR.UTF-8 UTF-8, es_PY ISO-8859-1, es_PY.UTF-8 UTF-8, es_SV ISO-8859-1, es_SV.UTF-8 UTF-8, es_US ISO-8859-1, es_US.UTF-8 UTF-8, es_UY ISO-8859-1, es_UY.UTF-8 UTF-8, es_VE ISO-8859-1, es_VE.UTF-8 UTF-8, et_EE ISO-8859-1, et_EE.ISO-8859-15 ISO-8859-15, et_EE.UTF-8 UTF-8, eu_ES ISO-8859-1, eu_ES.UTF-8 UTF-8, eu_ES.UTF-8@euro UTF-8, eu_ES@euro ISO-8859-15, eu_FR ISO-8859-1, eu_FR.UTF-8 UTF-8, eu_FR@euro ISO-8859-15, fa_IR UTF-8, fi_FI ISO-8859-1, fi_FI.UTF-8 UTF-8, fi_FI.UTF-8@euro UTF-8, fi_FI@euro ISO-8859-15, fo_FO ISO-8859-1, fo_FO.UTF-8 UTF-8, fr_BE ISO-8859-1, fr_BE.UTF-8 UTF-8, fr_BE.UTF-8@euro UTF-8, fr_BE@euro ISO-8859-15, fr_CA ISO-8859-1, fr_CA.UTF-8 UTF-8, fr_CH ISO-8859-1, fr_CH.UTF-8 UTF-8, fr_FR ISO-8859-1, fr_FR.UTF-8 UTF-8, fr_FR.UTF-8@euro UTF-8, fr_FR@euro ISO-8859-15, fr_LU ISO-8859-1, fr_LU.UTF-8 UTF-8, fr_LU.UTF-8@euro UTF-8, fr_LU@euro ISO-8859-15, ga_IE ISO-8859-1, ga_IE.UTF-8 UTF-8, ga_IE.UTF-8@euro UTF-8, ga_IE@euro ISO-8859-15, gd_GB ISO-8859-15, gez_ER UTF-8, gez_ER@abegede UTF-8, gez_ET UTF-8, gez_ET@abegede UTF-8, gl_ES ISO-8859-1, gl_ES.UTF-8 UTF-8, gl_ES.UTF-8@euro UTF-8, gl_ES@euro ISO-8859-15, gu_IN UTF-8, gv_GB ISO-8859-1, gv_GB.UTF-8 UTF-8, he_IL ISO-8859-8, he_IL.UTF-8 UTF-8, hi_IN UTF-8, hr_HR ISO-8859-2, hr_HR.UTF-8 UTF-8, hu_HU ISO-8859-2, hu_HU.UTF-8 UTF-8, id_ID ISO-8859-1, id_ID.UTF-8 UTF-8, is_IS ISO-8859-1, is_IS.UTF-8 UTF-8, it_CH ISO-8859-1, it_CH.UTF-8 UTF-8, it_IT ISO-8859-1, it_IT.UTF-8 UTF-8, it_IT.UTF-8@euro UTF-8, it_IT@euro ISO-8859-15, iw_IL ISO-8859-8, iw_IL.UTF-8 UTF-8, ja_JP.EUC-JP EUC-JP, ja_JP.UTF-8 UTF-8, ka_GE GEORGIAN-PS, kl_GL ISO-8859-1, kl_GL.UTF-8 UTF-8, kn_IN UTF-8, ko_KR.EUC-KR EUC-KR, ko_KR.UTF-8 UTF-8, kw_GB ISO-8859-1, kw_GB.UTF-8 UTF-8, lg_UG ISO-8859-10, lo_LA UTF-8, lt_LT ISO-8859-13, lt_LT.UTF-8 UTF-8, lv_LV ISO-8859-13, lv_LV.UTF-8 UTF-8, mi_NZ ISO-8859-13, mk_MK ISO-8859-5, mk_MK.UTF-8 UTF-8, ml_IN UTF-8, mn_MN UTF-8, mr_IN UTF-8, ms_MY ISO-8859-1, ms_MY.UTF-8 UTF-8, mt_MT ISO-8859-3, mt_MT.UTF-8 UTF-8, nb_NO ISO-8859-1, nb_NO.UTF-8 UTF-8, ne_NP UTF-8, nl_BE ISO-8859-1, nl_BE.UTF-8 UTF-8, nl_BE.UTF-8@euro UTF-8, nl_BE@euro ISO-8859-15, nl_NL ISO-8859-1, nl_NL.UTF-8 UTF-8, nl_NL.UTF-8@euro UTF-8, nl_NL@euro ISO-8859-15, nn_NO ISO-8859-1, nn_NO.UTF-8 UTF-8, no_NO ISO-8859-1, no_NO.UTF-8 UTF-8, oc_FR ISO-8859-1, om_ET UTF-8, om_KE ISO-8859-1, pa_IN UTF-8, pl_PL ISO-8859-2, pl_PL.UTF-8 UTF-8, pt_BR ISO-8859-1, pt_BR.UTF-8 UTF-8, pt_PT ISO-8859-1, pt_PT.UTF-8 UTF-8, pt_PT.UTF-8@euro UTF-8, pt_PT@euro ISO-8859-15, ro_RO ISO-8859-2, ro_RO.UTF-8 UTF-8, ru_RU ISO-8859-5, ru_RU.KOI8-R KOI8-R, ru_RU.UTF-8 UTF-8, ru_UA KOI8-U, ru_UA.UTF-8 UTF-8, se_NO UTF-8, sid_ET UTF-8, sk_SK ISO-8859-2, sk_SK.UTF-8 UTF-8, sl_SI ISO-8859-2, sl_SI.UTF-8 UTF-8, so_DJ ISO-8859-1, so_ET UTF-8, so_KE ISO-8859-1, so_SO ISO-8859-1, sq_AL ISO-8859-1, sq_AL.UTF-8 UTF-8, sr_YU ISO-8859-2, sr_YU.UTF-8 UTF-8, sr_YU.UTF-8@cyrillic UTF-8, sr_YU@cyrillic ISO-8859-5, st_ZA ISO-8859-1, st_ZA.UTF-8 UTF-8, sv_FI ISO-8859-1, sv_FI.UTF-8 UTF-8, sv_FI.UTF-8@euro UTF-8, sv_FI@euro ISO-8859-15, sv_SE ISO-8859-1, sv_SE.ISO-8859-15 ISO-8859-15, sv_SE.UTF-8 UTF-8, ta_IN UTF-8, te_IN UTF-8, tg_TJ KOI8-T, th_TH TIS-620, th_TH.UTF-8 UTF-8, ti_ER UTF-8, ti_ET UTF-8, tig_ER UTF-8, tl_PH ISO-8859-1, tr_TR ISO-8859-9, tr_TR.UTF-8 UTF-8, tt_RU.UTF-8 UTF-8, uk_UA KOI8-U, uk_UA.UTF-8 UTF-8, ur_PK UTF-8, uz_UZ ISO-8859-1, uz_UZ@cyrillic UTF-8, vi_VN UTF-8, vi_VN.TCVN TCVN5712-1, wa_BE ISO-8859-1, wa_BE.UTF-8 UTF-8, wa_BE@euro ISO-8859-15, xh_ZA ISO-8859-1, xh_ZA.UTF-8 UTF-8, yi_US CP1255, zh_CN GB2312, zh_CN.GB18030 GB18030, zh_CN.GBK GBK, zh_CN.UTF-8 UTF-8, zh_HK BIG5-HKSCS, zh_HK.UTF-8 UTF-8, zh_SG GB2312, zh_SG.GBK GBK, zh_TW BIG5, zh_TW.EUC-TW EUC-TW, zh_TW.UTF-8 UTF-8, zu_ZA ISO-8859-1, zu_ZA.UTF-8 UTF-8
+
diff --git a/src/lib/distro-info/debian-3.1/settings.default b/src/lib/distro-info/debian-3.1/settings.default
new file mode 100644
index 00000000..50b12768
--- /dev/null
+++ b/src/lib/distro-info/debian-3.1/settings.default
@@ -0,0 +1,41 @@
+arch = i386
+package-subdir = pool
+prereq-packages = main/d/debootstrap/debootstrap_0.3.3.2_all.deb
+release-name = sarge
+<repository base>
+ components = main
+ distribution = sarge
+ name = Debian 3.1
+ repo-subdir = dists
+ file-for-speedtest = dists/sarge/main/binary-i386/Packages.gz
+</repository>
+<selection minimal>
+ packages = <<END
+ kernel-image-2.6-386
+ locales
+ END
+</selection>
+<selection gnome>
+ base = minimal
+ packages = <<END
+ gnome
+ END
+</selection>
+<selection kde>
+ base = minimal
+ packages = <<END
+ kde
+ END
+</selection>
+<selection default>
+ base = minimal
+</selection>
+<selection openslx-build>
+ base = minimal
+ packages = <<END
+ bzip2
+ gcc
+ libc6-dev
+ make
+ END
+</selection>
diff --git a/src/lib/distro-info/debian-3.1/settings.example b/src/lib/distro-info/debian-3.1/settings.example
new file mode 100644
index 00000000..ac54855d
--- /dev/null
+++ b/src/lib/distro-info/debian-3.1/settings.example
@@ -0,0 +1,17 @@
+# rename this file to 'settings' and edit it as you please
+#
+# for a list of all options, have a look at the corresponding
+# settings.default in /opt/openslx/share/distro-info
+
+# use local installation source
+#<repository base>
+# local-url = /srv/ftp/pub/debian
+#</repository>
+
+# add a new selection:
+#<selection my_kde>
+# base = kde
+# packages = <<END
+# kinternet
+# END
+#</selection>
diff --git a/src/lib/distro-info/debian-4.0/mirrors/base b/src/lib/distro-info/debian-4.0/mirrors/base
new file mode 100644
index 00000000..7d6aaa9e
--- /dev/null
+++ b/src/lib/distro-info/debian-4.0/mirrors/base
@@ -0,0 +1,287 @@
+ftp://ameba.sc-uni.ktu.lt/debian
+ftp://artfiles.org/debian
+ftp://bigmirror.crossbowproject.net/pub/debian
+ftp://carroll.aset.psu.edu/pub/linux/distributions/debian
+http://cdn.debian.or.jp/debian
+ftp://cudlug.cudenver.edu/debian
+ftp://debian.balt.net/debian
+ftp://debian.bsnet.se/debian
+ftp://debian.cict.fr/debian
+ftp://debian.cites.uiuc.edu/pub/debian
+ftp://debian.cn99.com/debian
+http://debian.co.il/debian
+ftp://debian.cruisix.net/debian
+http://debian.csg.uzh.ch/debian
+ftp://debian.csie.nctu.edu.tw/debian
+http://debian.csie.ntu.edu.tw/debian
+ftp://debian.csie.ntu.edu.tw/pub/debian
+ftp://debian.ens-cachan.fr/debian
+http://debian.ens-cachan.fr/ftp/debian
+http://debian.eso-es.net/debian
+ftp://debian.essentkabel.com/debian
+ftp://debian.fastbull.org/debian
+ftp://debian.fastweb.it/debian
+http://debian.fifi.org/debian
+ftp://debian.fifi.org/pub/debian
+ftp://debian.ibisc.univ-evry.fr/debian
+ftp://debian.ihug.co.nz/debian
+http://debian.indika.net.id/debian
+ftp://debian.inode.at/debian
+http://debian.intergenia.de/debian
+ftp://debian.internet.gr/debian
+ftp://debian.iskon.hr/debian
+ftp://debian.lcs.mit.edu/debian
+http://debian.logiclinux.com/debian
+ftp://debian.ludost.net/debian
+http://debian.midco.net/debian
+ftp://debian.mines.inpl-nancy.fr/debian
+ftp://debian.mirror.ac.za/debian
+ftp://debian.mirror.frontiernet.net/debian
+ftp://debian.mirror.inra.fr/debian
+ftp://debian.mirror.iweb.ca/debian
+ftp://debian.mirror.rafal.ca/debian
+ftp://debian.mirrors.crysys.hu/debian
+ftp://debian.mirrors.easynet.fr/debian
+ftp://debian.mirrors.tds.net/debian
+ftp://debian.nctu.edu.tw/debian
+ftp://debian.netcologne.de/debian
+http://debian.osdn.org.ua/debian
+ftp://debian.osdn.org.ua/pub/Debian/debian
+ftp://debian.osuosl.org/debian
+http://debian.otenet.gr/debian
+ftp://debian.otenet.gr/pub/linux/debian
+http://debian.pffa.de/mirrors/debian
+ftp://debian.pffa.de/pub/mirrors/debian
+http://debian.pop-sc.rnp.br/debian
+ftp://debian.savoirfairelinux.net/debian
+ftp://debian.secsup.org/pub/linux/debian
+ftp://debian.sh.cvut.cz/debian
+http://debian.shimpinomori.net/debian
+ftp://debian.swordcoast.net/debian
+ftp://debian.telecoms.bg/debian
+ftp://debian.torredehanoi.org/debian
+ftp://debian.tu-bs.de/debian
+ftp://debian.ua.pt/debian
+http://debian.ubiobio.cl/debian
+ftp://debian.uchicago.edu/debian
+ftp://debian.udsu.ru/debian
+http://debian.unesr.edu.ve/debian
+http://debian.uni-c.dk/debian
+ftp://debian.uni-essen.de/debian
+http://debian.uni.edu.ni/debian
+ftp://debian.wow-vision.com.sg/debian
+http://debian.yorku.ca/debian
+ftp://dennou-k.gfd-dennou.org/library/Linux/debian
+ftp://dennou-q.gfd-dennou.org/library/Linux/debian
+ftp://distro.ibiblio.org/pub/linux/distributions/debian
+ftp://download.mirror.ac.uk/sites/ftp.debian.org/debian
+http://freedom.dicea.unifi.it/ftp/pub/linux/debian
+ftp://freedom.dicea.unifi.it/pub/linux/debian
+ftp://ftp-stud.fht-esslingen.de/debian
+ftp://ftp.arnes.si/packages/debian
+http://ftp.at.debian.org/debian
+http://ftp.au.debian.org/debian
+ftp://ftp.belnet.be/debian
+http://ftp.bg.debian.org/debian
+ftp://ftp.bme.hu/OS/Linux/dist/debian
+ftp://ftp.bononia.it/debian
+http://ftp.br.debian.org/debian
+ftp://ftp.caliu.info/debian
+ftp://ftp.carnet.hr/debian
+ftp://ftp.cc.uoc.gr/mirrors/linux/debian
+ftp://ftp.ccc.uba.ar/pub/linux/debian/debian
+http://ftp.ch.debian.org/debian
+ftp://ftp.cica.es/debian
+http://ftp.cl.debian.org/debian
+ftp://ftp.coe.psu.ac.th/debian
+ftp://ftp.corbina.ru/pub/Linux/debian
+ftp://ftp.crihan.fr/debian
+ftp://ftp.cs.unm.edu/mirrors/debian
+http://ftp.cz.debian.org/debian
+http://ftp.de.debian.org/debian
+ftp://ftp.debian.ikoula.com/debian
+ftp://ftp.debian.nl/debian
+ftp://ftp.debian.org/debian
+ftp://ftp.debian.sk/debian
+ftp://ftp.debian.skynet.be/debian
+http://ftp.debian.skynet.be/ftp/debian
+http://ftp.dk.debian.org/debian
+http://ftp.dkuug.dk/debian
+ftp://ftp.dkuug.dk/pub/debian
+ftp://ftp.dti.ad.jp/pub/Linux/debian
+ftp://ftp.duth.gr/debian
+ftp://ftp.easynet.be/debian
+http://ftp.easynet.be/ftp/debian
+http://ftp.ee.debian.org/debian
+ftp://ftp.egr.msu.edu/debian
+ftp://ftp.eq.uc.pt/pub/software/Linux/debian
+http://ftp.eq.uc.pt/software/Linux/debian
+http://ftp.es.debian.org/debian
+ftp://ftp.esat.net/pub/linux/debian
+ftp://ftp.eutelia.it/pub/Debian_Mirror
+http://ftp.fi.debian.org/debian
+http://ftp.fr.debian.org/debian
+http://ftp.freenet.de/debian
+ftp://ftp.freenet.de/pub/ftp.debian.org/debian
+ftp://ftp.fu-berlin.de/pub/unix/linux/mirrors/debian
+ftp://ftp.funet.fi/pub/linux/mirrors/debian
+ftp://ftp.grokthis.net/mirrors/debian
+http://ftp.gtlib.gatech.edu/debian
+ftp://ftp.gtlib.gatech.edu/pub/debian
+ftp://ftp.gul.uc3m.es/debian
+http://ftp.gva.es/mirror/debian
+http://ftp.hk.debian.org/debian
+ftp://ftp.hosteurope.de/pub/linux/debian
+http://ftp.hr.debian.org/debian
+http://ftp.hu.debian.org/debian
+ftp://ftp.icm.edu.pl/pub/Linux/debian
+http://ftp.ie.debian.org/debian
+ftp://ftp.iinet.net.au/debian/debian
+ftp://ftp.iitm.ac.in/debian
+ftp://ftp.informatik.hu-berlin.de/pub/Mirrors/ftp.de.debian.org/debian
+ftp://ftp.irb.hr/debian
+http://ftp.is.debian.org/debian
+http://ftp.it.debian.org/debian
+ftp://ftp.iut-bm.univ-fcomte.fr/debian
+ftp://ftp.jaist.ac.jp/pub/Linux/Debian
+http://ftp.jp.debian.org/debian
+ftp://ftp.jyu.fi/debian
+ftp://ftp.keystealth.org/debian
+http://ftp.kr.debian.org/debian
+ftp://ftp.kulnet.kuleuven.ac.be/debian
+ftp://ftp.linux.pt/pub/mirrors/debian
+ftp://ftp.lip6.fr/pub/linux/distributions/debian
+ftp://ftp.lug.ro/debian
+ftp://ftp.man.szczecin.pl/pub/Linux/debian
+ftp://ftp.mgts.by/debian
+ftp://ftp.mikesnet.ro/debian
+ftp://ftp.mipt.ru/debian
+ftp://ftp.monash.edu.au/pub/linux/debian
+ftp://ftp.mpi-sb.mpg.de/pub/linux/distributions/debian/debian
+http://ftp.mx.debian.org/debian
+ftp://ftp.ndlug.nd.edu/debian
+http://ftp.ndlug.nd.edu/mirrors/debian
+ftp://ftp.nerim.net/debian
+http://ftp.nl.debian.org/debian
+ftp://ftp.nluug.nl/pub/os/Linux/distr/debian
+http://ftp.no.debian.org/debian
+ftp://ftp.ntua.gr/pub/linux/debian
+http://ftp.nz.debian.org/debian
+http://ftp.pl.debian.org/debian
+ftp://ftp.port80.se/debian
+ftp://ftp.psn.ru/debian
+http://ftp.pt.debian.org/debian
+ftp://ftp.pucpr.br/debian
+ftp://ftp.rediris.es/debian
+ftp://ftp.riken.jp/pub/Linux/debian/debian
+http://ftp.ro.debian.org/debian
+ftp://ftp.rrzn.uni-hannover.de/debian/debian
+http://ftp.ru.debian.org/debian
+ftp://ftp.scarlet.be/pub/debian
+http://ftp.se.debian.org/debian
+http://ftp.si.debian.org/debian
+http://ftp.sk.debian.org/debian
+http://ftp.softnet.tuc.gr/ftp/linux/debian
+ftp://ftp.stw-bonn.de/debian
+ftp://ftp.sun.ac.za/debian
+http://ftp.sun.ac.za/ftp/debian
+ftp://ftp.sunet.se/pub/os/Linux/distributions/debian
+http://ftp.surfnet.nl/os/Linux/distr/debian
+ftp://ftp.surfnet.nl/pub/os/Linux/distr/debian
+ftp://ftp.telepac.pt/pub/debian
+http://ftp.thaios.net/debian
+ftp://ftp.ticklers.org/debian
+ftp://ftp.tiscali.de/pub/debian/debian
+http://ftp.tiscali.nl/debian
+ftp://ftp.tiscali.nl/pub/mirrors/debian
+http://ftp.tr.debian.org/debian
+ftp://ftp.tu-chemnitz.de/pub/linux/debian/debian
+ftp://ftp.tu-clausthal.de/pub/linux/debian
+ftp://ftp.tu-graz.ac.at/mirror/debian
+http://ftp.tw.debian.org/debian
+ftp://ftp.twaren.net/debian
+ftp://ftp.u-picardie.fr/mirror/debian
+ftp://ftp.u-strasbg.fr/debian
+ftp://ftp.udc.es/debian
+http://ftp.uk.debian.org/debian
+ftp://ftp.um.es/mirror/debian
+http://ftp.uni-bayreuth.de/linux/Debian/debian
+ftp://ftp.uni-bayreuth.de/pub/linux/Debian/debian
+ftp://ftp.uni-kl.de/debian
+ftp://ftp.uni-koeln.de/debian
+ftp://ftp.uni-sofia.bg/debian
+ftp://ftp.unina.it/pub/linux/distributions/debian
+ftp://ftp.univie.ac.at/systems/linux/debian/debian
+http://ftp.us.debian.org/debian
+ftp://ftp.uwa.edu.au/debian
+ftp://ftp.uwsg.indiana.edu/linux/debian
+ftp://ftp.vectranet.pl/debian
+http://ftp.wa.au.debian.org/debian
+ftp://ftp.yz.yamagata-u.ac.jp/debian
+ftp://ftp.zcu.cz/mirrors/debian
+http://ftp2.de.debian.org/debian
+http://ftp2.fr.debian.org/debian
+ftp://ftp3.nrc.ca/debian
+ftp://ftp5.gwdg.de/pub/linux/debian/debian
+ftp://gd.tuwien.ac.at/opsys/linux/debian
+ftp://gladiator.real-time.com/linux/debian
+ftp://gulus.usherbrooke.ca/debian
+ftp://jane.uab.cat/debian
+ftp://kebo.vlsm.org/debian
+ftp://linorg.usp.br/debian
+http://linux.iq.usp.br/debian
+ftp://linux.org.by/debian
+ftp://lug.mtu.edu/debian
+ftp://mi.mirror.garr.it/mirrors/debian
+ftp://mir1.ovh.net/debian
+http://mir2.ovh.net/debian
+ftp://mirror.aarnet.edu.au/debian
+http://mirror.anl.gov/debian
+ftp://mirror.anl.gov/pub/debian
+ftp://mirror.cc.columbia.edu/pub/linux/debian/debian
+ftp://mirror.cs.wisc.edu/pub/mirrors/linux/debian
+ftp://mirror.datafast.net.au/debian
+ftp://mirror.eftel.com/debian
+ftp://mirror.inter.net.il/pub/debian
+http://mirror.isoc.org.il/pub/debian
+ftp://mirror.nttu.edu.tw/debian
+http://mirror.nus.edu.sg/Debian
+ftp://mirror.nus.edu.sg/pub/Debian
+ftp://mirror.optus.net/debian
+ftp://mirror.ox.ac.uk/debian
+ftp://mirror.pacific.net.au/debian
+http://mirror.peer1.net/debian
+ftp://mirror.positive-internet.com/debian
+ftp://mirror.scarlet-internet.nl/pub/debian
+http://mirror.switch.ch/ftp/mirror/debian
+ftp://mirror.switch.ch/mirror/debian
+http://mirror.tucdemonic.org/debian
+http://mirror.ynet.sk/debian
+ftp://mirrors.geekbone.org/debian
+ftp://mirrors.geeks.org/debian
+ftp://mirrors.ircam.fr/pub/debian
+ftp://mirrors.kernel.org/debian
+http://mirrors.nfsi.pt/debian
+ftp://mirrors.nfsi.pt/pub/debian
+ftp://mirrors.telianet.dk/debian
+http://mirrors.tummy.com/debian
+http://mirrors.uol.com.br/pub/debian
+ftp://mirrors.usc.edu/pub/linux/distributions/debian
+http://mmc.igeofcu.unam.mx/debian
+ftp://opensource.nchc.org.tw/debian
+http://ring.asahi-net.or.jp/archives/linux/debian/debian
+ftp://ring.asahi-net.or.jp/pub/linux/debian/debian
+ftp://sb.itc.u-tokyo.ac.jp/DEBIAN
+http://sft.if.usp.br/debian
+http://sluglug.ucsc.edu/debian
+http://sunsite.informatik.rwth-aachen.de/ftp/pub/Linux/debian
+ftp://sunsite.informatik.rwth-aachen.de/pub/Linux/debian
+ftp://techweb.rfa.org/debian
+ftp://the.earth.li/debian
+ftp://ukdebian.mirror.anlx.net/debian
+ftp://webb.ens-cachan.fr/debian
+ftp://www.las.ic.unicamp.br/pub/debian
+ftp://www.mirrorservice.org/sites/ftp.debian.org/debian
+http://www.ring.gr.jp/archives/linux/debian/debian
+ftp://www.ring.gr.jp/pub/linux/debian/debian
+http://www.zentek-international.com/mirrors/debian
diff --git a/src/lib/distro-info/debian-4.0/prereqfiles/etc/hosts b/src/lib/distro-info/debian-4.0/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/debian-4.0/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/debian-4.0/settings.default b/src/lib/distro-info/debian-4.0/settings.default
new file mode 100644
index 00000000..075754e3
--- /dev/null
+++ b/src/lib/distro-info/debian-4.0/settings.default
@@ -0,0 +1,32 @@
+arch = i386
+package-subdir = pool
+prereq-packages = main/d/debootstrap/debootstrap_0.3.3.2etch1_all.deb
+release-name = etch
+<repository base>
+ components = main
+ distribution = etch
+ name = Debian 4.0
+ repo-subdir = dists
+ file-for-speedtest = dists/etch/main/binary-i386/Packages.bz2
+</repository>
+<selection minimal>
+ packages = <<END
+ linux-image-486
+ locales-all
+ END
+</selection>
+<selection gnome>
+ base = minimal
+ packages = <<END
+ gnome
+ END
+</selection>
+<selection kde>
+ base = minimal
+ packages = <<END
+ kde
+ END
+</selection>
+<selection default>
+ base = minimal
+</selection>
diff --git a/src/lib/distro-info/debian-4.0/settings.example b/src/lib/distro-info/debian-4.0/settings.example
new file mode 100644
index 00000000..ac54855d
--- /dev/null
+++ b/src/lib/distro-info/debian-4.0/settings.example
@@ -0,0 +1,17 @@
+# rename this file to 'settings' and edit it as you please
+#
+# for a list of all options, have a look at the corresponding
+# settings.default in /opt/openslx/share/distro-info
+
+# use local installation source
+#<repository base>
+# local-url = /srv/ftp/pub/debian
+#</repository>
+
+# add a new selection:
+#<selection my_kde>
+# base = kde
+# packages = <<END
+# kinternet
+# END
+#</selection>
diff --git a/src/lib/distro-info/debian-4.0_amd64/mirrors/base b/src/lib/distro-info/debian-4.0_amd64/mirrors/base
new file mode 100644
index 00000000..7d6aaa9e
--- /dev/null
+++ b/src/lib/distro-info/debian-4.0_amd64/mirrors/base
@@ -0,0 +1,287 @@
+ftp://ameba.sc-uni.ktu.lt/debian
+ftp://artfiles.org/debian
+ftp://bigmirror.crossbowproject.net/pub/debian
+ftp://carroll.aset.psu.edu/pub/linux/distributions/debian
+http://cdn.debian.or.jp/debian
+ftp://cudlug.cudenver.edu/debian
+ftp://debian.balt.net/debian
+ftp://debian.bsnet.se/debian
+ftp://debian.cict.fr/debian
+ftp://debian.cites.uiuc.edu/pub/debian
+ftp://debian.cn99.com/debian
+http://debian.co.il/debian
+ftp://debian.cruisix.net/debian
+http://debian.csg.uzh.ch/debian
+ftp://debian.csie.nctu.edu.tw/debian
+http://debian.csie.ntu.edu.tw/debian
+ftp://debian.csie.ntu.edu.tw/pub/debian
+ftp://debian.ens-cachan.fr/debian
+http://debian.ens-cachan.fr/ftp/debian
+http://debian.eso-es.net/debian
+ftp://debian.essentkabel.com/debian
+ftp://debian.fastbull.org/debian
+ftp://debian.fastweb.it/debian
+http://debian.fifi.org/debian
+ftp://debian.fifi.org/pub/debian
+ftp://debian.ibisc.univ-evry.fr/debian
+ftp://debian.ihug.co.nz/debian
+http://debian.indika.net.id/debian
+ftp://debian.inode.at/debian
+http://debian.intergenia.de/debian
+ftp://debian.internet.gr/debian
+ftp://debian.iskon.hr/debian
+ftp://debian.lcs.mit.edu/debian
+http://debian.logiclinux.com/debian
+ftp://debian.ludost.net/debian
+http://debian.midco.net/debian
+ftp://debian.mines.inpl-nancy.fr/debian
+ftp://debian.mirror.ac.za/debian
+ftp://debian.mirror.frontiernet.net/debian
+ftp://debian.mirror.inra.fr/debian
+ftp://debian.mirror.iweb.ca/debian
+ftp://debian.mirror.rafal.ca/debian
+ftp://debian.mirrors.crysys.hu/debian
+ftp://debian.mirrors.easynet.fr/debian
+ftp://debian.mirrors.tds.net/debian
+ftp://debian.nctu.edu.tw/debian
+ftp://debian.netcologne.de/debian
+http://debian.osdn.org.ua/debian
+ftp://debian.osdn.org.ua/pub/Debian/debian
+ftp://debian.osuosl.org/debian
+http://debian.otenet.gr/debian
+ftp://debian.otenet.gr/pub/linux/debian
+http://debian.pffa.de/mirrors/debian
+ftp://debian.pffa.de/pub/mirrors/debian
+http://debian.pop-sc.rnp.br/debian
+ftp://debian.savoirfairelinux.net/debian
+ftp://debian.secsup.org/pub/linux/debian
+ftp://debian.sh.cvut.cz/debian
+http://debian.shimpinomori.net/debian
+ftp://debian.swordcoast.net/debian
+ftp://debian.telecoms.bg/debian
+ftp://debian.torredehanoi.org/debian
+ftp://debian.tu-bs.de/debian
+ftp://debian.ua.pt/debian
+http://debian.ubiobio.cl/debian
+ftp://debian.uchicago.edu/debian
+ftp://debian.udsu.ru/debian
+http://debian.unesr.edu.ve/debian
+http://debian.uni-c.dk/debian
+ftp://debian.uni-essen.de/debian
+http://debian.uni.edu.ni/debian
+ftp://debian.wow-vision.com.sg/debian
+http://debian.yorku.ca/debian
+ftp://dennou-k.gfd-dennou.org/library/Linux/debian
+ftp://dennou-q.gfd-dennou.org/library/Linux/debian
+ftp://distro.ibiblio.org/pub/linux/distributions/debian
+ftp://download.mirror.ac.uk/sites/ftp.debian.org/debian
+http://freedom.dicea.unifi.it/ftp/pub/linux/debian
+ftp://freedom.dicea.unifi.it/pub/linux/debian
+ftp://ftp-stud.fht-esslingen.de/debian
+ftp://ftp.arnes.si/packages/debian
+http://ftp.at.debian.org/debian
+http://ftp.au.debian.org/debian
+ftp://ftp.belnet.be/debian
+http://ftp.bg.debian.org/debian
+ftp://ftp.bme.hu/OS/Linux/dist/debian
+ftp://ftp.bononia.it/debian
+http://ftp.br.debian.org/debian
+ftp://ftp.caliu.info/debian
+ftp://ftp.carnet.hr/debian
+ftp://ftp.cc.uoc.gr/mirrors/linux/debian
+ftp://ftp.ccc.uba.ar/pub/linux/debian/debian
+http://ftp.ch.debian.org/debian
+ftp://ftp.cica.es/debian
+http://ftp.cl.debian.org/debian
+ftp://ftp.coe.psu.ac.th/debian
+ftp://ftp.corbina.ru/pub/Linux/debian
+ftp://ftp.crihan.fr/debian
+ftp://ftp.cs.unm.edu/mirrors/debian
+http://ftp.cz.debian.org/debian
+http://ftp.de.debian.org/debian
+ftp://ftp.debian.ikoula.com/debian
+ftp://ftp.debian.nl/debian
+ftp://ftp.debian.org/debian
+ftp://ftp.debian.sk/debian
+ftp://ftp.debian.skynet.be/debian
+http://ftp.debian.skynet.be/ftp/debian
+http://ftp.dk.debian.org/debian
+http://ftp.dkuug.dk/debian
+ftp://ftp.dkuug.dk/pub/debian
+ftp://ftp.dti.ad.jp/pub/Linux/debian
+ftp://ftp.duth.gr/debian
+ftp://ftp.easynet.be/debian
+http://ftp.easynet.be/ftp/debian
+http://ftp.ee.debian.org/debian
+ftp://ftp.egr.msu.edu/debian
+ftp://ftp.eq.uc.pt/pub/software/Linux/debian
+http://ftp.eq.uc.pt/software/Linux/debian
+http://ftp.es.debian.org/debian
+ftp://ftp.esat.net/pub/linux/debian
+ftp://ftp.eutelia.it/pub/Debian_Mirror
+http://ftp.fi.debian.org/debian
+http://ftp.fr.debian.org/debian
+http://ftp.freenet.de/debian
+ftp://ftp.freenet.de/pub/ftp.debian.org/debian
+ftp://ftp.fu-berlin.de/pub/unix/linux/mirrors/debian
+ftp://ftp.funet.fi/pub/linux/mirrors/debian
+ftp://ftp.grokthis.net/mirrors/debian
+http://ftp.gtlib.gatech.edu/debian
+ftp://ftp.gtlib.gatech.edu/pub/debian
+ftp://ftp.gul.uc3m.es/debian
+http://ftp.gva.es/mirror/debian
+http://ftp.hk.debian.org/debian
+ftp://ftp.hosteurope.de/pub/linux/debian
+http://ftp.hr.debian.org/debian
+http://ftp.hu.debian.org/debian
+ftp://ftp.icm.edu.pl/pub/Linux/debian
+http://ftp.ie.debian.org/debian
+ftp://ftp.iinet.net.au/debian/debian
+ftp://ftp.iitm.ac.in/debian
+ftp://ftp.informatik.hu-berlin.de/pub/Mirrors/ftp.de.debian.org/debian
+ftp://ftp.irb.hr/debian
+http://ftp.is.debian.org/debian
+http://ftp.it.debian.org/debian
+ftp://ftp.iut-bm.univ-fcomte.fr/debian
+ftp://ftp.jaist.ac.jp/pub/Linux/Debian
+http://ftp.jp.debian.org/debian
+ftp://ftp.jyu.fi/debian
+ftp://ftp.keystealth.org/debian
+http://ftp.kr.debian.org/debian
+ftp://ftp.kulnet.kuleuven.ac.be/debian
+ftp://ftp.linux.pt/pub/mirrors/debian
+ftp://ftp.lip6.fr/pub/linux/distributions/debian
+ftp://ftp.lug.ro/debian
+ftp://ftp.man.szczecin.pl/pub/Linux/debian
+ftp://ftp.mgts.by/debian
+ftp://ftp.mikesnet.ro/debian
+ftp://ftp.mipt.ru/debian
+ftp://ftp.monash.edu.au/pub/linux/debian
+ftp://ftp.mpi-sb.mpg.de/pub/linux/distributions/debian/debian
+http://ftp.mx.debian.org/debian
+ftp://ftp.ndlug.nd.edu/debian
+http://ftp.ndlug.nd.edu/mirrors/debian
+ftp://ftp.nerim.net/debian
+http://ftp.nl.debian.org/debian
+ftp://ftp.nluug.nl/pub/os/Linux/distr/debian
+http://ftp.no.debian.org/debian
+ftp://ftp.ntua.gr/pub/linux/debian
+http://ftp.nz.debian.org/debian
+http://ftp.pl.debian.org/debian
+ftp://ftp.port80.se/debian
+ftp://ftp.psn.ru/debian
+http://ftp.pt.debian.org/debian
+ftp://ftp.pucpr.br/debian
+ftp://ftp.rediris.es/debian
+ftp://ftp.riken.jp/pub/Linux/debian/debian
+http://ftp.ro.debian.org/debian
+ftp://ftp.rrzn.uni-hannover.de/debian/debian
+http://ftp.ru.debian.org/debian
+ftp://ftp.scarlet.be/pub/debian
+http://ftp.se.debian.org/debian
+http://ftp.si.debian.org/debian
+http://ftp.sk.debian.org/debian
+http://ftp.softnet.tuc.gr/ftp/linux/debian
+ftp://ftp.stw-bonn.de/debian
+ftp://ftp.sun.ac.za/debian
+http://ftp.sun.ac.za/ftp/debian
+ftp://ftp.sunet.se/pub/os/Linux/distributions/debian
+http://ftp.surfnet.nl/os/Linux/distr/debian
+ftp://ftp.surfnet.nl/pub/os/Linux/distr/debian
+ftp://ftp.telepac.pt/pub/debian
+http://ftp.thaios.net/debian
+ftp://ftp.ticklers.org/debian
+ftp://ftp.tiscali.de/pub/debian/debian
+http://ftp.tiscali.nl/debian
+ftp://ftp.tiscali.nl/pub/mirrors/debian
+http://ftp.tr.debian.org/debian
+ftp://ftp.tu-chemnitz.de/pub/linux/debian/debian
+ftp://ftp.tu-clausthal.de/pub/linux/debian
+ftp://ftp.tu-graz.ac.at/mirror/debian
+http://ftp.tw.debian.org/debian
+ftp://ftp.twaren.net/debian
+ftp://ftp.u-picardie.fr/mirror/debian
+ftp://ftp.u-strasbg.fr/debian
+ftp://ftp.udc.es/debian
+http://ftp.uk.debian.org/debian
+ftp://ftp.um.es/mirror/debian
+http://ftp.uni-bayreuth.de/linux/Debian/debian
+ftp://ftp.uni-bayreuth.de/pub/linux/Debian/debian
+ftp://ftp.uni-kl.de/debian
+ftp://ftp.uni-koeln.de/debian
+ftp://ftp.uni-sofia.bg/debian
+ftp://ftp.unina.it/pub/linux/distributions/debian
+ftp://ftp.univie.ac.at/systems/linux/debian/debian
+http://ftp.us.debian.org/debian
+ftp://ftp.uwa.edu.au/debian
+ftp://ftp.uwsg.indiana.edu/linux/debian
+ftp://ftp.vectranet.pl/debian
+http://ftp.wa.au.debian.org/debian
+ftp://ftp.yz.yamagata-u.ac.jp/debian
+ftp://ftp.zcu.cz/mirrors/debian
+http://ftp2.de.debian.org/debian
+http://ftp2.fr.debian.org/debian
+ftp://ftp3.nrc.ca/debian
+ftp://ftp5.gwdg.de/pub/linux/debian/debian
+ftp://gd.tuwien.ac.at/opsys/linux/debian
+ftp://gladiator.real-time.com/linux/debian
+ftp://gulus.usherbrooke.ca/debian
+ftp://jane.uab.cat/debian
+ftp://kebo.vlsm.org/debian
+ftp://linorg.usp.br/debian
+http://linux.iq.usp.br/debian
+ftp://linux.org.by/debian
+ftp://lug.mtu.edu/debian
+ftp://mi.mirror.garr.it/mirrors/debian
+ftp://mir1.ovh.net/debian
+http://mir2.ovh.net/debian
+ftp://mirror.aarnet.edu.au/debian
+http://mirror.anl.gov/debian
+ftp://mirror.anl.gov/pub/debian
+ftp://mirror.cc.columbia.edu/pub/linux/debian/debian
+ftp://mirror.cs.wisc.edu/pub/mirrors/linux/debian
+ftp://mirror.datafast.net.au/debian
+ftp://mirror.eftel.com/debian
+ftp://mirror.inter.net.il/pub/debian
+http://mirror.isoc.org.il/pub/debian
+ftp://mirror.nttu.edu.tw/debian
+http://mirror.nus.edu.sg/Debian
+ftp://mirror.nus.edu.sg/pub/Debian
+ftp://mirror.optus.net/debian
+ftp://mirror.ox.ac.uk/debian
+ftp://mirror.pacific.net.au/debian
+http://mirror.peer1.net/debian
+ftp://mirror.positive-internet.com/debian
+ftp://mirror.scarlet-internet.nl/pub/debian
+http://mirror.switch.ch/ftp/mirror/debian
+ftp://mirror.switch.ch/mirror/debian
+http://mirror.tucdemonic.org/debian
+http://mirror.ynet.sk/debian
+ftp://mirrors.geekbone.org/debian
+ftp://mirrors.geeks.org/debian
+ftp://mirrors.ircam.fr/pub/debian
+ftp://mirrors.kernel.org/debian
+http://mirrors.nfsi.pt/debian
+ftp://mirrors.nfsi.pt/pub/debian
+ftp://mirrors.telianet.dk/debian
+http://mirrors.tummy.com/debian
+http://mirrors.uol.com.br/pub/debian
+ftp://mirrors.usc.edu/pub/linux/distributions/debian
+http://mmc.igeofcu.unam.mx/debian
+ftp://opensource.nchc.org.tw/debian
+http://ring.asahi-net.or.jp/archives/linux/debian/debian
+ftp://ring.asahi-net.or.jp/pub/linux/debian/debian
+ftp://sb.itc.u-tokyo.ac.jp/DEBIAN
+http://sft.if.usp.br/debian
+http://sluglug.ucsc.edu/debian
+http://sunsite.informatik.rwth-aachen.de/ftp/pub/Linux/debian
+ftp://sunsite.informatik.rwth-aachen.de/pub/Linux/debian
+ftp://techweb.rfa.org/debian
+ftp://the.earth.li/debian
+ftp://ukdebian.mirror.anlx.net/debian
+ftp://webb.ens-cachan.fr/debian
+ftp://www.las.ic.unicamp.br/pub/debian
+ftp://www.mirrorservice.org/sites/ftp.debian.org/debian
+http://www.ring.gr.jp/archives/linux/debian/debian
+ftp://www.ring.gr.jp/pub/linux/debian/debian
+http://www.zentek-international.com/mirrors/debian
diff --git a/src/lib/distro-info/debian-4.0_amd64/prereqfiles/etc/hosts b/src/lib/distro-info/debian-4.0_amd64/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/debian-4.0_amd64/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/debian-4.0_amd64/settings.default b/src/lib/distro-info/debian-4.0_amd64/settings.default
new file mode 100644
index 00000000..22126f66
--- /dev/null
+++ b/src/lib/distro-info/debian-4.0_amd64/settings.default
@@ -0,0 +1,41 @@
+arch = amd64
+package-subdir = pool
+prereq-packages = main/d/debootstrap/debootstrap_0.3.3.2etch1_all.deb
+release-name = etch
+<repository base>
+ components = main
+ distribution = etch
+ name = Debian 4.0
+ repo-subdir = dists
+ file-for-speedtest = dists/etch/main/binary-amd64/Packages.bz2
+</repository>
+<selection minimal>
+ packages = <<END
+ linux-image-amd64
+ locales-all
+ END
+</selection>
+<selection gnome>
+ base = minimal
+ packages = <<END
+ gnome
+ END
+</selection>
+<selection kde>
+ base = minimal
+ packages = <<END
+ kde
+ END
+</selection>
+<selection default>
+ base = minimal
+</selection>
+<selection openslx-build>
+ base = minimal
+ packages = <<END
+ bzip2
+ gcc
+ libc6-dev
+ make
+ END
+</selection>
diff --git a/src/lib/distro-info/debian-4.0_amd64/settings.example b/src/lib/distro-info/debian-4.0_amd64/settings.example
new file mode 100644
index 00000000..ac54855d
--- /dev/null
+++ b/src/lib/distro-info/debian-4.0_amd64/settings.example
@@ -0,0 +1,17 @@
+# rename this file to 'settings' and edit it as you please
+#
+# for a list of all options, have a look at the corresponding
+# settings.default in /opt/openslx/share/distro-info
+
+# use local installation source
+#<repository base>
+# local-url = /srv/ftp/pub/debian
+#</repository>
+
+# add a new selection:
+#<selection my_kde>
+# base = kde
+# packages = <<END
+# kinternet
+# END
+#</selection>
diff --git a/src/lib/distro-info/debian-5.0/mirrors/base b/src/lib/distro-info/debian-5.0/mirrors/base
new file mode 100644
index 00000000..7d6aaa9e
--- /dev/null
+++ b/src/lib/distro-info/debian-5.0/mirrors/base
@@ -0,0 +1,287 @@
+ftp://ameba.sc-uni.ktu.lt/debian
+ftp://artfiles.org/debian
+ftp://bigmirror.crossbowproject.net/pub/debian
+ftp://carroll.aset.psu.edu/pub/linux/distributions/debian
+http://cdn.debian.or.jp/debian
+ftp://cudlug.cudenver.edu/debian
+ftp://debian.balt.net/debian
+ftp://debian.bsnet.se/debian
+ftp://debian.cict.fr/debian
+ftp://debian.cites.uiuc.edu/pub/debian
+ftp://debian.cn99.com/debian
+http://debian.co.il/debian
+ftp://debian.cruisix.net/debian
+http://debian.csg.uzh.ch/debian
+ftp://debian.csie.nctu.edu.tw/debian
+http://debian.csie.ntu.edu.tw/debian
+ftp://debian.csie.ntu.edu.tw/pub/debian
+ftp://debian.ens-cachan.fr/debian
+http://debian.ens-cachan.fr/ftp/debian
+http://debian.eso-es.net/debian
+ftp://debian.essentkabel.com/debian
+ftp://debian.fastbull.org/debian
+ftp://debian.fastweb.it/debian
+http://debian.fifi.org/debian
+ftp://debian.fifi.org/pub/debian
+ftp://debian.ibisc.univ-evry.fr/debian
+ftp://debian.ihug.co.nz/debian
+http://debian.indika.net.id/debian
+ftp://debian.inode.at/debian
+http://debian.intergenia.de/debian
+ftp://debian.internet.gr/debian
+ftp://debian.iskon.hr/debian
+ftp://debian.lcs.mit.edu/debian
+http://debian.logiclinux.com/debian
+ftp://debian.ludost.net/debian
+http://debian.midco.net/debian
+ftp://debian.mines.inpl-nancy.fr/debian
+ftp://debian.mirror.ac.za/debian
+ftp://debian.mirror.frontiernet.net/debian
+ftp://debian.mirror.inra.fr/debian
+ftp://debian.mirror.iweb.ca/debian
+ftp://debian.mirror.rafal.ca/debian
+ftp://debian.mirrors.crysys.hu/debian
+ftp://debian.mirrors.easynet.fr/debian
+ftp://debian.mirrors.tds.net/debian
+ftp://debian.nctu.edu.tw/debian
+ftp://debian.netcologne.de/debian
+http://debian.osdn.org.ua/debian
+ftp://debian.osdn.org.ua/pub/Debian/debian
+ftp://debian.osuosl.org/debian
+http://debian.otenet.gr/debian
+ftp://debian.otenet.gr/pub/linux/debian
+http://debian.pffa.de/mirrors/debian
+ftp://debian.pffa.de/pub/mirrors/debian
+http://debian.pop-sc.rnp.br/debian
+ftp://debian.savoirfairelinux.net/debian
+ftp://debian.secsup.org/pub/linux/debian
+ftp://debian.sh.cvut.cz/debian
+http://debian.shimpinomori.net/debian
+ftp://debian.swordcoast.net/debian
+ftp://debian.telecoms.bg/debian
+ftp://debian.torredehanoi.org/debian
+ftp://debian.tu-bs.de/debian
+ftp://debian.ua.pt/debian
+http://debian.ubiobio.cl/debian
+ftp://debian.uchicago.edu/debian
+ftp://debian.udsu.ru/debian
+http://debian.unesr.edu.ve/debian
+http://debian.uni-c.dk/debian
+ftp://debian.uni-essen.de/debian
+http://debian.uni.edu.ni/debian
+ftp://debian.wow-vision.com.sg/debian
+http://debian.yorku.ca/debian
+ftp://dennou-k.gfd-dennou.org/library/Linux/debian
+ftp://dennou-q.gfd-dennou.org/library/Linux/debian
+ftp://distro.ibiblio.org/pub/linux/distributions/debian
+ftp://download.mirror.ac.uk/sites/ftp.debian.org/debian
+http://freedom.dicea.unifi.it/ftp/pub/linux/debian
+ftp://freedom.dicea.unifi.it/pub/linux/debian
+ftp://ftp-stud.fht-esslingen.de/debian
+ftp://ftp.arnes.si/packages/debian
+http://ftp.at.debian.org/debian
+http://ftp.au.debian.org/debian
+ftp://ftp.belnet.be/debian
+http://ftp.bg.debian.org/debian
+ftp://ftp.bme.hu/OS/Linux/dist/debian
+ftp://ftp.bononia.it/debian
+http://ftp.br.debian.org/debian
+ftp://ftp.caliu.info/debian
+ftp://ftp.carnet.hr/debian
+ftp://ftp.cc.uoc.gr/mirrors/linux/debian
+ftp://ftp.ccc.uba.ar/pub/linux/debian/debian
+http://ftp.ch.debian.org/debian
+ftp://ftp.cica.es/debian
+http://ftp.cl.debian.org/debian
+ftp://ftp.coe.psu.ac.th/debian
+ftp://ftp.corbina.ru/pub/Linux/debian
+ftp://ftp.crihan.fr/debian
+ftp://ftp.cs.unm.edu/mirrors/debian
+http://ftp.cz.debian.org/debian
+http://ftp.de.debian.org/debian
+ftp://ftp.debian.ikoula.com/debian
+ftp://ftp.debian.nl/debian
+ftp://ftp.debian.org/debian
+ftp://ftp.debian.sk/debian
+ftp://ftp.debian.skynet.be/debian
+http://ftp.debian.skynet.be/ftp/debian
+http://ftp.dk.debian.org/debian
+http://ftp.dkuug.dk/debian
+ftp://ftp.dkuug.dk/pub/debian
+ftp://ftp.dti.ad.jp/pub/Linux/debian
+ftp://ftp.duth.gr/debian
+ftp://ftp.easynet.be/debian
+http://ftp.easynet.be/ftp/debian
+http://ftp.ee.debian.org/debian
+ftp://ftp.egr.msu.edu/debian
+ftp://ftp.eq.uc.pt/pub/software/Linux/debian
+http://ftp.eq.uc.pt/software/Linux/debian
+http://ftp.es.debian.org/debian
+ftp://ftp.esat.net/pub/linux/debian
+ftp://ftp.eutelia.it/pub/Debian_Mirror
+http://ftp.fi.debian.org/debian
+http://ftp.fr.debian.org/debian
+http://ftp.freenet.de/debian
+ftp://ftp.freenet.de/pub/ftp.debian.org/debian
+ftp://ftp.fu-berlin.de/pub/unix/linux/mirrors/debian
+ftp://ftp.funet.fi/pub/linux/mirrors/debian
+ftp://ftp.grokthis.net/mirrors/debian
+http://ftp.gtlib.gatech.edu/debian
+ftp://ftp.gtlib.gatech.edu/pub/debian
+ftp://ftp.gul.uc3m.es/debian
+http://ftp.gva.es/mirror/debian
+http://ftp.hk.debian.org/debian
+ftp://ftp.hosteurope.de/pub/linux/debian
+http://ftp.hr.debian.org/debian
+http://ftp.hu.debian.org/debian
+ftp://ftp.icm.edu.pl/pub/Linux/debian
+http://ftp.ie.debian.org/debian
+ftp://ftp.iinet.net.au/debian/debian
+ftp://ftp.iitm.ac.in/debian
+ftp://ftp.informatik.hu-berlin.de/pub/Mirrors/ftp.de.debian.org/debian
+ftp://ftp.irb.hr/debian
+http://ftp.is.debian.org/debian
+http://ftp.it.debian.org/debian
+ftp://ftp.iut-bm.univ-fcomte.fr/debian
+ftp://ftp.jaist.ac.jp/pub/Linux/Debian
+http://ftp.jp.debian.org/debian
+ftp://ftp.jyu.fi/debian
+ftp://ftp.keystealth.org/debian
+http://ftp.kr.debian.org/debian
+ftp://ftp.kulnet.kuleuven.ac.be/debian
+ftp://ftp.linux.pt/pub/mirrors/debian
+ftp://ftp.lip6.fr/pub/linux/distributions/debian
+ftp://ftp.lug.ro/debian
+ftp://ftp.man.szczecin.pl/pub/Linux/debian
+ftp://ftp.mgts.by/debian
+ftp://ftp.mikesnet.ro/debian
+ftp://ftp.mipt.ru/debian
+ftp://ftp.monash.edu.au/pub/linux/debian
+ftp://ftp.mpi-sb.mpg.de/pub/linux/distributions/debian/debian
+http://ftp.mx.debian.org/debian
+ftp://ftp.ndlug.nd.edu/debian
+http://ftp.ndlug.nd.edu/mirrors/debian
+ftp://ftp.nerim.net/debian
+http://ftp.nl.debian.org/debian
+ftp://ftp.nluug.nl/pub/os/Linux/distr/debian
+http://ftp.no.debian.org/debian
+ftp://ftp.ntua.gr/pub/linux/debian
+http://ftp.nz.debian.org/debian
+http://ftp.pl.debian.org/debian
+ftp://ftp.port80.se/debian
+ftp://ftp.psn.ru/debian
+http://ftp.pt.debian.org/debian
+ftp://ftp.pucpr.br/debian
+ftp://ftp.rediris.es/debian
+ftp://ftp.riken.jp/pub/Linux/debian/debian
+http://ftp.ro.debian.org/debian
+ftp://ftp.rrzn.uni-hannover.de/debian/debian
+http://ftp.ru.debian.org/debian
+ftp://ftp.scarlet.be/pub/debian
+http://ftp.se.debian.org/debian
+http://ftp.si.debian.org/debian
+http://ftp.sk.debian.org/debian
+http://ftp.softnet.tuc.gr/ftp/linux/debian
+ftp://ftp.stw-bonn.de/debian
+ftp://ftp.sun.ac.za/debian
+http://ftp.sun.ac.za/ftp/debian
+ftp://ftp.sunet.se/pub/os/Linux/distributions/debian
+http://ftp.surfnet.nl/os/Linux/distr/debian
+ftp://ftp.surfnet.nl/pub/os/Linux/distr/debian
+ftp://ftp.telepac.pt/pub/debian
+http://ftp.thaios.net/debian
+ftp://ftp.ticklers.org/debian
+ftp://ftp.tiscali.de/pub/debian/debian
+http://ftp.tiscali.nl/debian
+ftp://ftp.tiscali.nl/pub/mirrors/debian
+http://ftp.tr.debian.org/debian
+ftp://ftp.tu-chemnitz.de/pub/linux/debian/debian
+ftp://ftp.tu-clausthal.de/pub/linux/debian
+ftp://ftp.tu-graz.ac.at/mirror/debian
+http://ftp.tw.debian.org/debian
+ftp://ftp.twaren.net/debian
+ftp://ftp.u-picardie.fr/mirror/debian
+ftp://ftp.u-strasbg.fr/debian
+ftp://ftp.udc.es/debian
+http://ftp.uk.debian.org/debian
+ftp://ftp.um.es/mirror/debian
+http://ftp.uni-bayreuth.de/linux/Debian/debian
+ftp://ftp.uni-bayreuth.de/pub/linux/Debian/debian
+ftp://ftp.uni-kl.de/debian
+ftp://ftp.uni-koeln.de/debian
+ftp://ftp.uni-sofia.bg/debian
+ftp://ftp.unina.it/pub/linux/distributions/debian
+ftp://ftp.univie.ac.at/systems/linux/debian/debian
+http://ftp.us.debian.org/debian
+ftp://ftp.uwa.edu.au/debian
+ftp://ftp.uwsg.indiana.edu/linux/debian
+ftp://ftp.vectranet.pl/debian
+http://ftp.wa.au.debian.org/debian
+ftp://ftp.yz.yamagata-u.ac.jp/debian
+ftp://ftp.zcu.cz/mirrors/debian
+http://ftp2.de.debian.org/debian
+http://ftp2.fr.debian.org/debian
+ftp://ftp3.nrc.ca/debian
+ftp://ftp5.gwdg.de/pub/linux/debian/debian
+ftp://gd.tuwien.ac.at/opsys/linux/debian
+ftp://gladiator.real-time.com/linux/debian
+ftp://gulus.usherbrooke.ca/debian
+ftp://jane.uab.cat/debian
+ftp://kebo.vlsm.org/debian
+ftp://linorg.usp.br/debian
+http://linux.iq.usp.br/debian
+ftp://linux.org.by/debian
+ftp://lug.mtu.edu/debian
+ftp://mi.mirror.garr.it/mirrors/debian
+ftp://mir1.ovh.net/debian
+http://mir2.ovh.net/debian
+ftp://mirror.aarnet.edu.au/debian
+http://mirror.anl.gov/debian
+ftp://mirror.anl.gov/pub/debian
+ftp://mirror.cc.columbia.edu/pub/linux/debian/debian
+ftp://mirror.cs.wisc.edu/pub/mirrors/linux/debian
+ftp://mirror.datafast.net.au/debian
+ftp://mirror.eftel.com/debian
+ftp://mirror.inter.net.il/pub/debian
+http://mirror.isoc.org.il/pub/debian
+ftp://mirror.nttu.edu.tw/debian
+http://mirror.nus.edu.sg/Debian
+ftp://mirror.nus.edu.sg/pub/Debian
+ftp://mirror.optus.net/debian
+ftp://mirror.ox.ac.uk/debian
+ftp://mirror.pacific.net.au/debian
+http://mirror.peer1.net/debian
+ftp://mirror.positive-internet.com/debian
+ftp://mirror.scarlet-internet.nl/pub/debian
+http://mirror.switch.ch/ftp/mirror/debian
+ftp://mirror.switch.ch/mirror/debian
+http://mirror.tucdemonic.org/debian
+http://mirror.ynet.sk/debian
+ftp://mirrors.geekbone.org/debian
+ftp://mirrors.geeks.org/debian
+ftp://mirrors.ircam.fr/pub/debian
+ftp://mirrors.kernel.org/debian
+http://mirrors.nfsi.pt/debian
+ftp://mirrors.nfsi.pt/pub/debian
+ftp://mirrors.telianet.dk/debian
+http://mirrors.tummy.com/debian
+http://mirrors.uol.com.br/pub/debian
+ftp://mirrors.usc.edu/pub/linux/distributions/debian
+http://mmc.igeofcu.unam.mx/debian
+ftp://opensource.nchc.org.tw/debian
+http://ring.asahi-net.or.jp/archives/linux/debian/debian
+ftp://ring.asahi-net.or.jp/pub/linux/debian/debian
+ftp://sb.itc.u-tokyo.ac.jp/DEBIAN
+http://sft.if.usp.br/debian
+http://sluglug.ucsc.edu/debian
+http://sunsite.informatik.rwth-aachen.de/ftp/pub/Linux/debian
+ftp://sunsite.informatik.rwth-aachen.de/pub/Linux/debian
+ftp://techweb.rfa.org/debian
+ftp://the.earth.li/debian
+ftp://ukdebian.mirror.anlx.net/debian
+ftp://webb.ens-cachan.fr/debian
+ftp://www.las.ic.unicamp.br/pub/debian
+ftp://www.mirrorservice.org/sites/ftp.debian.org/debian
+http://www.ring.gr.jp/archives/linux/debian/debian
+ftp://www.ring.gr.jp/pub/linux/debian/debian
+http://www.zentek-international.com/mirrors/debian
diff --git a/src/lib/distro-info/debian-5.0/prereqfiles/etc/hosts b/src/lib/distro-info/debian-5.0/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/debian-5.0/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/debian-5.0/settings.default b/src/lib/distro-info/debian-5.0/settings.default
new file mode 100644
index 00000000..40af4b20
--- /dev/null
+++ b/src/lib/distro-info/debian-5.0/settings.default
@@ -0,0 +1,32 @@
+arch = i386
+package-subdir = pool
+prereq-packages = main/d/debootstrap/debootstrap_0.3.3.2etch1_all.deb
+release-name = etch
+<repository base>
+ components = main
+ distribution = etch
+ name = Debian 5.0
+ repo-subdir = dists
+ file-for-speedtest = dists/etch/main/binary-i386/Packages.bz2
+</repository>
+<selection minimal>
+ packages = <<END
+ linux-image-486
+ locales-all
+ END
+</selection>
+<selection gnome>
+ base = minimal
+ packages = <<END
+ gnome
+ END
+</selection>
+<selection kde>
+ base = minimal
+ packages = <<END
+ kde
+ END
+</selection>
+<selection default>
+ base = minimal
+</selection>
diff --git a/src/lib/distro-info/debian-5.0/settings.example b/src/lib/distro-info/debian-5.0/settings.example
new file mode 100644
index 00000000..ac54855d
--- /dev/null
+++ b/src/lib/distro-info/debian-5.0/settings.example
@@ -0,0 +1,17 @@
+# rename this file to 'settings' and edit it as you please
+#
+# for a list of all options, have a look at the corresponding
+# settings.default in /opt/openslx/share/distro-info
+
+# use local installation source
+#<repository base>
+# local-url = /srv/ftp/pub/debian
+#</repository>
+
+# add a new selection:
+#<selection my_kde>
+# base = kde
+# packages = <<END
+# kinternet
+# END
+#</selection>
diff --git a/src/lib/distro-info/fedora-6/export-filter.example b/src/lib/distro-info/fedora-6/export-filter.example
new file mode 100644
index 00000000..a414fef4
--- /dev/null
+++ b/src/lib/distro-info/fedora-6/export-filter.example
@@ -0,0 +1,15 @@
+# this file defines the filter rules used when exporting a vendor-OS
+# of this distro
+#
+# copy this file to 'export-filter' and add your own filters to it
+# in order to overrule the filters provided by openslx
+#
+#Examples:
+# the following line would include anything below /var/spool/
+#+ /var/spool/*
+#
+# this would exclude anything in /etc that starts with dhcpd.conf
+#- /etc/dhcpd.conf*
+#
+# and this would exclude all rpmnew-files:
+#- *.rpmnew
diff --git a/src/lib/distro-info/fedora-6/mirrors/base b/src/lib/distro-info/fedora-6/mirrors/base
new file mode 100644
index 00000000..1ff185e4
--- /dev/null
+++ b/src/lib/distro-info/fedora-6/mirrors/base
@@ -0,0 +1,105 @@
+ftp://alviss.et.tudelft.nl/pub/fedora/linux/core/6/i386/os
+http://distro.ibiblio.org/pub/linux/distributions/fedora/linux/core/6/i386/os
+http://download.fedora.redhat.com/pub/fedora/linux/6/i386/os
+http://fedora.kiewel-online.de/linux/core/6/i386/os
+http://fedora.mirror.facebook.com/linux/core/6/i386/os
+http://fedora.mirror.garr.it/mirrors/fedora/linux/core/6/i386/os
+http://fedora.secsup.org/linux/6/i386/os
+ftp://fedora.secsup.org/pub/linux/redhat/fedora/linux/core/6/i386/os
+http://fr2.rpmfind.net/linux/fedora/core/6/i386/os
+http://ftp-stud.hs-esslingen.de/pub/fedora/linux/core/6/i386/os
+ftp://ftp.applios.net/pub/fedora/linux/core/6/i386/os
+http://ftp.astral.ro/mirrors/fedora/pub/fedora/linux/core/6/i386/os
+http://ftp.belnet.be/linux/fedora/linux/core/6/i386/os
+ftp://ftp.ceid.upatras.gr/pub/fedora/linux/core/6/i386/os
+http://ftp.chg.ru/pub/Linux/fedora/linux/core/6/i386/os
+http://ftp.cica.es/fedora/linux/core/6/i386/os
+ftp://ftp.ciril.fr/pub/linux/fedora/linux/core/6/i386/os
+http://ftp.crc.dk/fedora/linux/core/6/i386/os
+ftp://ftp.crc.dk/pub/mirrors/fedora/linux/core/6/i386/os
+ftp://ftp.cru.fr/pub/linux/fedora/core/6/i386/os
+ftp://ftp.cs.hacettepe.edu.tr/pub/mirrors/fedora/linux/core/6/i386/os
+ftp://ftp.cse.buffalo.edu/pub/Linux/fedora/linux/core/6/i386/os
+http://ftp.dti.ad.jp/pub/Linux/Fedora/core/6/i386/os
+http://ftp.fi.muni.cz/pub/linux/fedora/linux/core/6/i386/os
+ftp://ftp.free.fr/mirrors/fedora.redhat.com/fedora/linux/core/6/i386/os
+http://ftp.funet.fi/pub/mirrors/fedora.redhat.com/pub/fedora/linux/6/i386/os
+ftp://ftp.gtlib.gatech.edu/pub/fedora.redhat/linux/core/6/i386/os
+http://ftp.gts.lug.ro/fedora/linux/core/6/i386/os
+http://ftp.gui.uva.es/sites/fedora.redhat.com/linux/core/6/i386/os
+http://ftp.heanet.ie/pub/fedora/linux/core/6/i386/os
+http://ftp.hostrino.com/pub/fedora/linux/core/6/i386/os
+http://ftp.iij.ad.jp/pub/linux/fedora/core/6/i386/os
+http://ftp.jaist.ac.jp/pub/Linux/Fedora/core/6/i386/os
+ftp://ftp.kaist.ac.kr/fedora/linux/core/6/i386/os
+http://ftp.kaist.ac.kr/pub/fedora/linux/core/6/i386/os
+http://ftp.kddilabs.jp/Linux/packages/fedora/core/6/i386/os
+http://ftp.linux.ee/pub/fedora/linux/core/6/i386/os
+http://ftp.linux.ncsu.edu/pub/fedora/linux/core/6/i386/os
+ftp://ftp.linux.org.tr/pub/fedora/linux/core/6/i386/os
+http://ftp.lip6.fr/ftp/pub/linux/distributions/fedora/6/i386/os
+ftp://ftp.mirrorservice.org/sites/download.fedora.redhat.com/pub/fedora/linux/core/6/i386/os
+ftp://ftp.muug.mb.ca/pub/fedora/linux/core/6/i386/os
+http://ftp.nluug.nl/pub/os/Linux/distr/fedora/linux/core/6/i386/os
+ftp://ftp.otenet.gr/pub/linux/fedora/linux/core/6/i386/os
+ftp://ftp.proxad.net/mirrors/fedora.redhat.com/fedora/linux/core/6/i386/os
+http://ftp.ps.pl/pub/Linux/fedora-linux/core/6/i386/os
+http://ftp.pwr.wroc.pl/pub/linux/fedora/linux/core/6/i386/os
+ftp://ftp.rediris.es/mirror/fedora-redhat/core/6/i386/os
+http://ftp.rhnet.is/pub/fedora/linux/core/6/i386/os
+http://ftp.riken.jp/Linux/fedora/core/6/i386/os
+ftp://ftp.solnet.ch/mirror/fedora/linux/core/6/i386/os
+http://ftp.stw-bonn.de/pub/fedora/linux/core/6/i386/os
+http://ftp.SURFnet.nl/pub/os/Linux/distr/fedora/linux/core/6/i386/os
+http://ftp.tlk-l.net/pub/mirrors/fedora/core/6/i386/os
+http://ftp.tu-chemnitz.de/pub/linux/fedora-enchilada/linux/core/6/i386/os
+ftp://ftp.tvnet.hu/pub/fedora/linux/core/6/i386/os
+ftp://ftp.uci.edu/mirrors/fedora/linux/core/6/i386/os
+http://ftp.udl.es/pub/fedora/linux/core/6/i386/os
+http://ftp.uni-bayreuth.de/linux/fedora/linux/core/6/i386/os
+ftp://ftp.uni-bayreuth.de/pub/linux/fedora/linux/core/6/i386/os
+ftp://ftp.uninett.no/pub/linux/Fedora/core/6/i386/os
+http://ftp.univie.ac.at/systems/linux/fedora/core/6/i386/os
+http://ftp.upjs.sk/pub/fedora/linux/core/6/i386/os
+http://ftp.usf.edu/pub/fedora/linux/core/6/i386/os
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/fedora/linux/core/6/i386/os
+http://gulus.usherbrooke.ca/pub/distro/fedora/linux/core/6/i386/os
+http://kdeforge.unl.edu/mirrors/fedora/linux/core/6/i386/os
+ftp://limestone.uoregon.edu/fedora/linux/6/i386/os
+http://limestone.uoregon.edu/ftp/fedora/linux/6/i386/os
+http://linux.nssl.noaa.gov/fedora/linux/core/6/i386/os
+http://mirror.aarnet.edu.au/pub/fedora/linux/core/6/i386/os
+http://mirror.anl.gov/pub/fedora/linux/core/6/i386/os
+http://mirror.cc.vt.edu/pub/fedora/linux/core/6/i386/os
+http://mirror.cogentco.com/pub/linux/fedora/linux/core/6/i386/os
+ftp://mirror.cs.princeton.edu/pub/mirrors/fedora/linux/core/6/i386/os
+http://mirror.fraunhofer.de/download.fedora.redhat.com/fedora/linux/core/6/i386/os
+http://mirror.hiwaay.net/pub/fedora/linux/core/6/i386/os
+http://mirror.internode.on.net/pub/fedora/linux/core/6/i386/os
+http://mirror.karneval.cz/pub/linux/fedora/linux/core/6/i386/os
+http://mirror.linux.duke.edu/pub/fedora/linux/core/6/i386/os
+http://mirror.newnanutilities.org/pub/fedora/linux/core/6/i386/os
+http://mirror.nuvio.com/pub/fedora/linux/core/6/i386/os
+ftp://mirror.nyi.net/fedora/linux/core/6/i386/os
+http://mirror.optus.net/fedora/linux/core/6/i386/os
+http://mirror.pacific.net.au/linux/fedora/linux/core/6/i386/os
+http://mirror.stanford.edu/fedora/linux/core/6/i386/os
+ftp://mirror.stanford.edu/pub/mirrors/fedora/linux/core/6/i386/os
+http://mirror.steadfast.net/fedora/core/6/i386/os
+http://mirror.switch.ch/ftp/mirror/fedora/linux/core/6/i386/os
+ftp://mirror.switch.ch/mirror/fedora/linux/core/6/i386/os
+http://mirror.usu.edu/mirrors/fedora/linux/core/6/i386/os
+http://mirror.web-ster.com/fedora/core/6/i386/os
+http://mirrors.cat.pdx.edu/fedora/linux/core/6/i386/os
+http://mirrors.ircam.fr/pub/fedora/linux/core/6/i386/os
+http://mirrors.kernel.org/fedora/core/6/i386/os
+http://mirrors.tummy.com/pub/fedora.redhat.com/fedora/linux/core/6/i386/os
+http://mirrors.usc.edu/pub/linux/distributions/fedora/linux/core/6/i386/os
+http://srl.cs.jhu.edu/YUM/fedora/core/6/i386/os
+http://sunsite.icm.edu.pl/pub/Linux/fedora/linux/core/6/i386/os
+http://sunsite.mff.cuni.cz/MIRRORS/fedora.redhat.com/linux/core/6/i386/os
+http://sunsite.rediris.es/mirror/fedora-redhat/core/6/i386/os
+http://www.gtlib.gatech.edu/pub/fedora.redhat/linux/core/6/i386/os
+http://www.jur-linux.org/download/fedora/6/i386/os
+http://www.mirrorservice.org/sites/download.fedora.redhat.com/pub/fedora/linux/core/6/i386/os
+http://www.muug.mb.ca/pub/fedora/linux/core/6/i386/os
diff --git a/src/lib/distro-info/fedora-6/mirrors/base_update b/src/lib/distro-info/fedora-6/mirrors/base_update
new file mode 100644
index 00000000..b490c5b4
--- /dev/null
+++ b/src/lib/distro-info/fedora-6/mirrors/base_update
@@ -0,0 +1,90 @@
+ftp://alviss.et.tudelft.nl/pub/fedora/linux/core/updates/6/i386
+http://distro.ibiblio.org/pub/linux/distributions/fedora/linux/core/updates/6/i386
+http://download.fedora.redhat.com/pub/fedora/linux/updates/6/i386
+http://fedora.kiewel-online.de/linux/core/updates/6/i386
+http://fedora.mirror.facebook.com/linux/core/updates/6/i386
+http://fedora.mirror.garr.it/mirrors/fedora/linux/core/updates/6/i386
+http://fedora.secsup.org/linux/updates/6/i386
+ftp://fedora.secsup.org/pub/linux/redhat/fedora/linux/core/updates/6/i386
+http://fr2.rpmfind.net/linux/fedora/core/updates/6/i386
+http://ftp-stud.hs-esslingen.de/pub/fedora/linux/core/updates/6/i386
+http://ftp.astral.ro/mirrors/fedora/pub/fedora/linux/core/updates/6/i386
+http://ftp.belnet.be/linux/fedora/linux/core/updates/6/i386
+ftp://ftp.ceid.upatras.gr/pub/fedora/linux/core/updates/6/i386
+http://ftp.cica.es/fedora/linux/core/updates/6/i386
+ftp://ftp.ciril.fr/pub/linux/fedora/linux/core/updates/6/i386
+http://ftp.crc.dk/fedora/linux/core/updates/6/i386
+ftp://ftp.crc.dk/pub/mirrors/fedora/linux/core/updates/6/i386
+ftp://ftp.cru.fr/pub/linux/fedora/core/updates/6/i386
+ftp://ftp.cs.hacettepe.edu.tr/pub/mirrors/fedora/linux/core/updates/6/i386
+ftp://ftp.cse.buffalo.edu/pub/Linux/fedora/linux/core/updates/6/i386
+http://ftp.dti.ad.jp/pub/Linux/Fedora/core/updates/6/i386
+http://ftp.fi.muni.cz/pub/linux/fedora/linux/core/updates/6/i386
+ftp://ftp.free.fr/mirrors/fedora.redhat.com/fedora/linux/core/updates/6/i386
+http://ftp.funet.fi/pub/mirrors/fedora.redhat.com/pub/fedora/linux/updates/6/i386
+ftp://ftp.gtlib.gatech.edu/pub/fedora.redhat/linux/core/updates/6/i386
+http://ftp.gts.lug.ro/fedora/linux/core/updates/6/i386
+http://ftp.heanet.ie/pub/fedora/linux/core/updates/6/i386
+http://ftp.iij.ad.jp/pub/linux/fedora/core/updates/6/i386
+http://ftp.jaist.ac.jp/pub/Linux/Fedora/core/updates/6/i386
+ftp://ftp.kaist.ac.kr/fedora/linux/core/updates/6/i386
+http://ftp.kaist.ac.kr/pub/fedora/linux/core/updates/6/i386
+http://ftp.kddilabs.jp/Linux/packages/fedora/core/updates/6/i386
+http://ftp.linux.ncsu.edu/pub/fedora/linux/core/updates/6/i386
+ftp://ftp.linux.org.tr/pub/fedora/linux/core/updates/6/i386
+ftp://ftp.mirrorservice.org/sites/download.fedora.redhat.com/pub/fedora/linux/core/updates/6/i386
+ftp://ftp.muug.mb.ca/pub/fedora/linux/core/updates/6/i386
+http://ftp.nluug.nl/pub/os/Linux/distr/fedora/linux/core/updates/6/i386
+http://ftp.ntua.gr/pub/linux/fedora/linux/core/updates/6/i386
+ftp://ftp.otenet.gr/pub/linux/fedora/linux/core/updates/6/i386
+ftp://ftp.proxad.net/mirrors/fedora.redhat.com/fedora/linux/core/updates/6/i386
+http://ftp.ps.pl/pub/Linux/fedora-linux/core/updates/6/i386
+http://ftp.pwr.wroc.pl/pub/linux/fedora/linux/core/updates/6/i386
+ftp://ftp.rediris.es/mirror/fedora-redhat/core/updates/6/i386
+http://ftp.rhnet.is/pub/fedora/linux/core/updates/6/i386
+http://ftp.riken.jp/Linux/fedora/core/updates/6/i386
+ftp://ftp.solnet.ch/mirror/fedora/linux/core/updates/6/i386
+http://ftp.stw-bonn.de/pub/fedora/linux/core/updates/6/i386
+http://ftp.SURFnet.nl/pub/os/Linux/distr/fedora/linux/core/updates/6/i386
+http://ftp.tlk-l.net/pub/mirrors/fedora/core/updates/6/i386
+http://ftp.tu-chemnitz.de/pub/linux/fedora-enchilada/linux/core/updates/6/i386
+ftp://ftp.tvnet.hu/pub/fedora/linux/core/updates/6/i386
+ftp://ftp.uci.edu/mirrors/fedora/linux/core/updates/6/i386
+http://ftp.udl.es/pub/fedora/linux/core/updates/6/i386
+ftp://ftp.uninett.no/pub/linux/Fedora/core/updates/6/i386
+http://ftp.univie.ac.at/systems/linux/fedora/core/updates/6/i386
+http://ftp.upjs.sk/pub/fedora/linux/core/updates/6/i386
+http://ftp.usf.edu/pub/fedora/linux/core/updates/6/i386
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/fedora/linux/core/updates/6/i386
+http://gulus.usherbrooke.ca/pub/distro/fedora/linux/core/updates/6/i386
+http://kdeforge.unl.edu/mirrors/fedora/linux/core/updates/6/i386
+http://limestone.uoregon.edu/ftp/fedora/linux/updates/6/i386
+http://linux.nssl.noaa.gov/fedora/linux/core/updates/6/i386
+http://mirror.aarnet.edu.au/pub/fedora/linux/core/updates/6/i386
+http://mirror.anl.gov/pub/fedora/linux/core/updates/6/i386
+http://mirror.cc.vt.edu/pub/fedora/linux/core/updates/6/i386
+http://mirror.cogentco.com/pub/linux/fedora/linux/core/updates/6/i386
+ftp://mirror.cs.princeton.edu/pub/mirrors/fedora/linux/core/updates/6/i386
+http://mirror.fraunhofer.de/download.fedora.redhat.com/fedora/linux/core/updates/6/i386
+http://mirror.hiwaay.net/pub/fedora/linux/core/updates/6/i386
+http://mirror.internode.on.net/pub/fedora/linux/core/updates/6/i386
+http://mirror.karneval.cz/pub/linux/fedora/linux/core/updates/6/i386
+http://mirror.linux.duke.edu/pub/fedora/linux/core/updates/6/i386
+http://mirror.newnanutilities.org/pub/fedora/linux/core/updates/6/i386
+http://mirror.nuvio.com/pub/fedora/linux/core/updates/6/i386
+ftp://mirror.nyi.net/fedora/linux/core/updates/6/i386
+http://mirror.optus.net/fedora/linux/core/updates/6/i386
+http://mirror.stanford.edu/fedora/linux/core/updates/6/i386
+http://mirror.steadfast.net/fedora/core/updates/6/i386
+http://mirror.switch.ch/ftp/mirror/fedora/linux/core/updates/6/i386
+ftp://mirror.switch.ch/mirror/fedora/linux/core/updates/6/i386
+http://mirror.web-ster.com/fedora/core/updates/6/i386
+http://mirrors.cat.pdx.edu/fedora/linux/core/updates/6/i386
+http://mirrors.ircam.fr/pub/fedora/linux/core/updates/6/i386
+http://mirrors.kernel.org/fedora/core/updates/6/i386
+http://mirrors.tummy.com/pub/fedora.redhat.com/fedora/linux/core/updates/6/i386
+http://mirrors.usc.edu/pub/linux/distributions/fedora/linux/core/updates/6/i386
+http://srl.cs.jhu.edu/YUM/fedora/core/updates/6/i386
+http://sunsite.mff.cuni.cz/MIRRORS/fedora.redhat.com/linux/core/updates/6/i386
+http://www.jur-linux.org/download/fedora/updates/6/i386
+http://www.muug.mb.ca/pub/fedora/linux/core/updates/6/i386
diff --git a/src/lib/distro-info/fedora-6/prereqfiles/etc/hosts b/src/lib/distro-info/fedora-6/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/fedora-6/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/fedora-6/settings.default b/src/lib/distro-info/fedora-6/settings.default
new file mode 100644
index 00000000..53dfbe74
--- /dev/null
+++ b/src/lib/distro-info/fedora-6/settings.default
@@ -0,0 +1,125 @@
+bootstrap-packages = <<END
+ audit-libs-1.2.8-1.fc6.i386.rpm
+ basesystem-8.0-5.1.1.noarch.rpm
+ bash-3.1-16.1.i386.rpm
+ beecrypt-4.1.2-10.1.1.i386.rpm
+ bzip2-libs-1.0.3-3.i386.rpm
+ chkconfig-1.3.30-1.i386.rpm
+ coreutils-5.97-11.i386.rpm
+ cpio-2.6-19.i386.rpm
+ cracklib-2.8.9-3.1.i386.rpm
+ cracklib-dicts-2.8.9-3.1.i386.rpm
+ db4-4.3.29-9.fc6.i386.rpm
+ device-mapper-1.02.07-3.i386.rpm
+ dmraid-1.0.0.rc13-1.fc6.i386.rpm
+ e2fsprogs-1.39-7.i386.rpm
+ e2fsprogs-libs-1.39-7.i386.rpm
+ elfutils-libelf-0.123-1.fc6.i386.rpm
+ ethtool-3-1.2.2.i386.rpm
+ expat-1.95.8-8.2.1.i386.rpm
+ fedora-release-6-4.noarch.rpm
+ fedora-release-notes-6-3.noarch.rpm
+ filesystem-2.4.0-1.i386.rpm
+ findutils-4.2.27-4.1.i386.rpm
+ gawk-3.1.5-11.i386.rpm
+ gdbm-1.8.0-26.2.1.i386.rpm
+ glib2-2.12.3-2.fc6.i386.rpm
+ glibc-2.5-3.i386.rpm
+ glibc-common-2.5-3.i386.rpm
+ grep-2.5.1-54.1.i386.rpm
+ gzip-1.3.5-9.i386.rpm
+ info-4.8-11.1.i386.rpm
+ initscripts-8.45.3-1.i386.rpm
+ iproute-2.6.16-6.fc6.i386.rpm
+ iputils-20020927-41.fc6.i386.rpm
+ kernel-2.6.18-1.2798.fc6.i586.rpm
+ kpartx-0.4.7-5.i386.rpm
+ krb5-libs-1.5-7.i386.rpm
+ less-394-4.1.i386.rpm
+ libacl-2.2.39-1.1.i386.rpm
+ libattr-2.4.32-1.1.i386.rpm
+ libcap-1.10-25.i386.rpm
+ libgcc-4.1.1-30.i386.rpm
+ libselinux-1.30.29-2.i386.rpm
+ libsepol-1.12.27-1.i386.rpm
+ libstdc++-4.1.1-30.i386.rpm
+ libtermcap-2.0.8-46.1.i386.rpm
+ lvm2-2.02.06-4.i386.rpm
+ MAKEDEV-3.23-1.2.i386.rpm
+ mcstrans-0.1.8-3.i386.rpm
+ mingetty-1.07-5.2.2.i386.rpm
+ mkinitrd-5.1.19-1.i386.rpm
+ mktemp-1.5-23.2.2.i386.rpm
+ module-init-tools-3.3-0.pre1.4.17.i386.rpm
+ nash-5.1.19-1.i386.rpm
+ ncurses-5.5-24.20060715.i386.rpm
+ neon-0.25.5-5.1.i386.rpm
+ net-tools-1.60-73.i386.rpm
+ openssl-0.9.8b-8.i386.rpm
+ pam-0.99.6.2-3.fc6.i386.rpm
+ pcre-6.6-1.1.i386.rpm
+ popt-1.10.2-32.i386.rpm
+ procps-3.2.7-8.i386.rpm
+ psmisc-22.2-5.i386.rpm
+ python-2.4.3-18.fc6.i386.rpm
+ readline-5.1-1.1.i386.rpm
+ rpm-4.4.2-32.i386.rpm
+ rpm-libs-4.4.2-32.i386.rpm
+ sed-4.1.5-5.fc6.i386.rpm
+ setup-2.5.55-1.noarch.rpm
+ shadow-utils-4.0.17-5.i386.rpm
+ sqlite-3.3.6-2.i386.rpm
+ sysklogd-1.4.1-39.2.i386.rpm
+ SysVinit-2.86-14.i386.rpm
+ tar-1.15.1-19.i386.rpm
+ termcap-5.5-1.20060701.1.noarch.rpm
+ tzdata-2006m-2.fc6.noarch.rpm
+ udev-095-14.i386.rpm
+ util-linux-2.13-0.44.fc6.i386.rpm
+ zlib-1.2.3-3.i386.rpm
+END
+<metapackager yum>
+ packages = <<END
+ libxml2-2.6.26-2.1.1.i386.rpm
+ python-elementtree-1.2.6-5.i386.rpm
+ python-sqlite-1.1.7-1.2.1.i386.rpm
+ python-urlgrabber-2.9.9-2.noarch.rpm
+ rpm-python-4.4.2-32.i386.rpm
+ yum-3.0-6.noarch.rpm
+ yum-metadata-parser-1.0-8.fc6.i386.rpm
+ END
+</metapackager>
+package-subdir = Fedora/RPMS
+prereq-packages = <<END
+ beecrypt-4.1.2-10.1.1.i386.rpm
+ bzip2-libs-1.0.3-3.i386.rpm
+ e2fsprogs-libs-1.39-7.i386.rpm
+ elfutils-libelf-0.123-1.fc6.i386.rpm
+ expat-1.95.8-8.2.1.i386.rpm
+ glibc-2.5-3.i386.rpm
+ krb5-libs-1.5-7.i386.rpm
+ libgcc-4.1.1-30.i386.rpm
+ libselinux-1.30.29-2.i386.rpm
+ libsepol-1.12.27-1.i386.rpm
+ libstdc++-4.1.1-30.i386.rpm
+ neon-0.25.5-5.1.i386.rpm
+ openssl-0.9.8b-8.i386.rpm
+ popt-1.10.2-32.i386.rpm
+ rpm-4.4.2-32.i386.rpm
+ rpm-libs-4.4.2-32.i386.rpm
+ sqlite-3.3.6-2.i386.rpm
+ zlib-1.2.3-3.i386.rpm
+END
+<repository base>
+ name = Fedora Core 6
+</repository>
+<repository base_update>
+ name = Fedora Core 6 updates
+</repository>
+<selection minimal>
+ packages = <<END
+ END
+</selection>
+<selection default>
+ base = minimal
+</selection>
diff --git a/src/lib/distro-info/fedora-6/settings.example b/src/lib/distro-info/fedora-6/settings.example
new file mode 100644
index 00000000..22883d4b
--- /dev/null
+++ b/src/lib/distro-info/fedora-6/settings.example
@@ -0,0 +1,20 @@
+# rename this file to 'settings' and edit it as you please
+#
+# for a list of all options, have a look at the corresponding
+# settings.default in /opt/openslx/share/distro-info
+
+# use local installation source
+#<repository base>
+# local-url = /srv/ftp/pub/pub/linux/fedora/linux/core/6/i386/os
+#</repository>
+#<repository base_update>
+# local-url = /srv/ftp/pub/linux/fedora/linux/core/updates/6/i386
+#</repository>
+
+# add a new selection:
+#<selection my_kde>
+# base = kde
+# packages = <<END
+# kinternet
+# END
+#</selection>
diff --git a/src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY b/src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY
new file mode 100644
index 00000000..592eba55
--- /dev/null
+++ b/src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY
@@ -0,0 +1,34 @@
+The following public key can be used to verify RPM packages built and
+signed by Red Hat, Inc. using `rpm -K' using the GNU GPG package.
+Questions about this key should be sent to security@redhat.com.
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.0.0 (GNU/Linux)
+Comment: For info see http://www.gnupg.org
+
+mQGiBDfqVDgRBADBKr3Bl6PO8BQ0H8sJoD6p9U7Yyl7pjtZqioviPwXP+DCWd4u8
+HQzcxAZ57m8ssA1LK1Fx93coJhDzM130+p5BG9mYSWShLabR3N1KXdXQYYcowTOM
+GxdwYRGr1Spw8QydLhjVfU1VSl4xt6bupPbWJbyjkg5Z3P7BlUOUJmrx3wCgobNV
+EDGaWYJcch5z5B1of/41G8kEAKii6q7Gu/vhXXnLS6m15oNnPVybyngiw/23dKjS
+ZVG7rKANEK2mxg1VB+vc/uUc4k49UxJJfCZg1gu1sPFV3GSa+Y/7jsiLktQvCiLP
+lncQt1dV+ENmHR5BdIDPWDzKBVbgWnSDnqQ6KrZ7T6AlZ74VMpjGxxkWU6vV2xsW
+XCLPA/9P/vtImA8CZN3jxGgtK5GGtDNJ/cMhhuv5tnfwFg4b/VGo2Jr8mhLUqoIb
+E6zeGAmZbUpdckDco8D5fiFmqTf5+++pCEpJLJkkzel/32N2w4qzPrcRMCiBURES
+PjCLd4Y5rPoU8E4kOHc/4BuHN903tiCsCPloCrWsQZ7UdxfQ5LQiUmVkIEhhdCwg
+SW5jIDxzZWN1cml0eUByZWRoYXQuY29tPohVBBMRAgAVBQI36lQ4AwsKAwMVAwID
+FgIBAheAAAoJECGRgM3bQqYOsBQAnRVtg7B25Hm11PHcpa8FpeddKiq2AJ9aO8sB
+XmLDmPOEFI75mpTrKYHF6rkCDQQ36lRyEAgAokgI2xJ+3bZsk8jRA8ORIX8DH05U
+lMH27qFYzLbT6npXwXYIOtVn0K2/iMDj+oEB1Aa2au4OnddYaLWp06v3d+XyS0t+
+5ab2ZfIQzdh7wCwxqRkzR+/H5TLYbMG+hvtTdylfqIX0WEfoOXMtWEGSVwyUsnM3
+Jy3LOi48rQQSCKtCAUdV20FoIGWhwnb/gHU1BnmES6UdQujFBE6EANqPhp0coYoI
+hHJ2oIO8ujQItvvNaU88j/s/izQv5e7MXOgVSjKe/WX3s2JtB/tW7utpy12wh1J+
+JsFdbLV/t8CozUTpJgx5mVA3RKlxjTA+On+1IEUWioB+iVfT7Ov/0kcAzwADBQf9
+E4SKCWRand8K0XloMYgmipxMhJNnWDMLkokvbMNTUoNpSfRoQJ9EheXDxwMpTPwK
+ti/PYrrL2J11P2ed0x7zm8v3gLrY0cue1iSba+8glY+p31ZPOr5ogaJw7ZARgoS8
+BwjyRymXQp+8Dete0TELKOL2/itDOPGHW07SsVWOR6cmX4VlRRcWB5KejaNvdrE5
+4XFtOd04NMgWI63uqZc4zkRa+kwEZtmbz3tHSdRCCE+Y7YVP6IUf/w6YPQFQriWY
+FiA6fD10eB+BlIUqIw80VgjsBKmCwvKkn4jg8kibXgj4/TzQSx77uYokw1EqQ2wk
+OZoaEtcubsNMquuLCMWijYhGBBgRAgAGBQI36lRyAAoJECGRgM3bQqYOhyYAnj7h
+VDY/FJAGqmtZpwVp9IlitW5tAJ4xQApr/jNFZCTksnI+4O1765F7tA==
+=3AHZ
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-beta b/src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-beta
new file mode 100644
index 00000000..ffcf6aed
--- /dev/null
+++ b/src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-beta
@@ -0,0 +1,32 @@
+The following public key can be used to verify RPM packages built and
+signed by Red Hat, Inc. for this beta using `rpm -K' using the GNU GPG
+package. Questions about this key should be sent to security@redhat.com.
+
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.0.6 (GNU/Linux)
+Comment: For info see http://www.gnupg.org
+
+mQGiBDySTqsRBACzc7xuCIp10oj5B2PAV4XzDeVxprv/WTMreSNSK+iC0bEz0IBp
+Vnn++qtyiXfH+bGIE9jqZgIEnpttWhUOaU5LhcLFzy+m8NWfngIFP9QfGmGAe9Gd
+LFeAdhj4RmSG/vgr7vDd83Hz22dv403Ar/sliWO4vDOrMmZBG57WGYTWtwCgkMsi
+UUQuJ6slbzKn82w+bYxOlL0EAIylWJGaTkKOTL5DqVR3ik9aT0Dt3FNVYiuhcKBe
+II4E3KOIVA9kO8in1IZjx2gs6K2UV+GsoAVANdfKL7l9O+k+J8OxhE74oycvYJxW
+QzCgXMZkNcvW5wyXwEMcr6TVd/5BGztcMw8oT3/l2MtAEG/vn1XaWToRSO1XDMDz
++AjUA/4m0mTkN8S4wjzJG8lqN7+quW3UOaiCe8J3SFrrrhE0XbY9cTJI/9nuXHU1
+VjqOSmXQYH2Db7UOroFTBiWhlAedA4O4yuK52AJnvSsHbnJSEmn9rpo5z1Q8F+qI
+mDlzriJdrIrVLeDiUeTlpH3kpG38D7007GhXBV72k1gpMoMcpbQ3UmVkIEhhdCwg
+SW5jLiAoQmV0YSBUZXN0IFNvZnR3YXJlKSA8cmF3aGlkZUByZWRoYXQuY29tPohX
+BBMRAgAXBQI8l5p/BQsHCgMEAxUDAgMWAgECF4AACgkQ/TcmiYl9oHqdeQCfZjw4
+F9sir3XfRAjVe9kYNcQ8hnIAn0WgyT7H5RriWYTOCfauOmd+cAW4iEYEEBECAAYF
+AjyXmqQACgkQIZGAzdtCpg5nDQCfepuRUyuVJvhuQkPWySETYvRw+WoAnjAWhx6q
+0npMx4OE1JGFi8ymKXktuQENBDySTq4QBADKL/mK7S8E3synxISlu7R6fUvu07Oc
+RoX96n0Di6T+BS99hC44XzHjMDhUX2ZzVvYS88EZXoUDDkB/8g7SwZrOJ/QE1zrI
+JmSVciNhSYWwqeT40Evs88ajZUfDiNbS/cSC6oui98iS4vxd7sE7IPY+FSx9vuAR
+xOa9vBnJY/dx0wADBQQAosm+Iltt2uigC6LJzxNOoIdB5r0GqTC1o5sHCeNqXJhU
+ExAG8m74uzMlYVLOpGZi4y4NwwAWvCWC0MWWnnu+LGFy1wKiJKRjhv5F+WkFutY5
+WHV5L44vp9jSIlBCRG+84jheTh8xqhndM9wOfPwWdYYu1vxrB8Tn6kA17PcYfHSI
+RgQYEQIABgUCPJJergAKCRD9NyaJiX2geiCPAJ4nEM4NtI9Uj8lONDk6FU86PmoL
+yACfb68fBd2pWEzLKsOk9imIobHHpzE=
+=gpIn
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-fedora b/src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-fedora
new file mode 100644
index 00000000..17d4ec70
--- /dev/null
+++ b/src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-fedora
@@ -0,0 +1,27 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.0.7 (GNU/Linux)
+
+mQGiBD+dnTsRBACwnlz4AhctOLlVBAsq+RaU82nb5P3bD1YJJpsAce1Ckd2sBUOJ
+D11NUCqH8c7EctOquOZ5zTcWxHiWWbLyKQwUw2SUvnWa5SSbi8kI8q9MTPsPvhwt
+gMrQMLenMO+nsrxrSaG6XcD+ssfJNxC7NQVCQAj3pvvg9rKi3ygsM7CXHwCghgsq
+X6TOr55HE90DbEsoq3b/jjsD/i8aIZ6urUgrpAkQslcakXdJLKgSdwjRUgVZgvYZ
+b7kAx1iPq0t/AhB3NJw3zW4AAKJohGg3xj5K4V8PJEZrSIpoRYlF43Kqlfu2p5gh
+WT89SP4YAlWPeTqf0+dTYUYz3b144k2ZFOdRuXIRxunoYNAUr9oMrxBXbJ/eY+0U
+QX3pBACYzKizyY4JJgd0zFJmNkcdK9nzcm+btYFnYQo33w5GSE686UNr+9yiXt9t
+mPRvNEbj3u+xoAX8B/5k3aZ5NbUhV64/VcKlUdRIxNlFCG7I9KgxeHWAYwi7yqOG
+XM3T/v6o7GLdQEB0ChFqS7kUlqmwLV+C3QhlrFe/Cuk26i+Q6rQiRmVkb3JhIFBy
+b2plY3QgPGZlZG9yYUByZWRoYXQuY29tPohbBBMRAgAbBQI/nZ07BgsJCAcDAgMV
+AgMDFgIBAh4BAheAAAoJELRCadBPKm/S2PAAnRTlhorITphab+oxAHtbxZF9BVyD
+AJ9WOVaZUG53IWWIAXOGv3j/cmr3lohGBBMRAgAGBQI/nZ22AAoJECGRgM3bQqYO
+R5QAoIp1G+omVktq/snxpmz5UeHjlSYjAKCRr/ea/L7S7ZTxB18cf1TYfad1x4hG
+BBARAgAGBQI/ntjgAAoJECnVuiSN9W0FUSUAoJnrone4J0o1HMkRz+6g9KVuO2Fy
+AJ0XyebOzVmI9U5OyOfnNmYV0wnQcrkBDQQ/nZ08EAQAugOfLWJbKwMA9vg2mJU5
+94TZU0HRJkx/fqYhx0YxWWRpzplrEyvcDXuYcWi1Hwh0tD86T4fR5GV6joWiWClz
+D+Hwhhb6gcSdeSGlGLlZAvWYtFSHWiv+3LaI9w8Vtczl99Bh2WiMDNDDGw0RQg6Z
+aftldLSe4j1pffpFGQ8SuisAAwUEAKVxqLT7fC5xQ6oclcZ+PhoDlePQ1BiTS7tu
+GM07bFF4nNvY91LL7S31pooz3XbGSWP8jxzSv1Fw35YhSmWGOBOEXluqMbVQGJJ5
+m8fqJOjC0imbfeWgr/T7zLrJeiljDxvX+6TyawyWQngF6v1Hq6FRV0O0bOp9Npt5
+zqCbDGs/iEYEGBECAAYFAj+dnTwACgkQtEJp0E8qb9L//gCcDVYnDegNCOxDn1se
+dDwxw+0h8OcAn1CZHof15QqxnTwEnvwF2QeOI5dn
+=mJAx
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-fedora-extras b/src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-fedora-extras
new file mode 100644
index 00000000..e89f1643
--- /dev/null
+++ b/src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-fedora-extras
@@ -0,0 +1,35 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.0.7 (GNU/Linux)
+
+mQGiBEG+vu8RBACyH3cUSp+DXbyIvZ075bGDhjhRCf8m44UW2cCQdO/45CJBkRnC
+AA6SHthCrXCVKIuuo1jSwy8kMXt1P/7IpF6Tc8ZMzcHKTyNetuuD/A7oavgnrJNb
+QVTScqbD6VrvjUAPpDz5TMPqMMFYwylp+ySKMQpoPOYoqdNE3XwnA5vOywCg44+S
+KDWIV0j5xCeIAoa47VmgF2cEAK/FIZRkbb7+i2Fob1mxKsnuLN/xx67aBpU2w7HO
+scVnkke08lRestDVk/6xb+lrq+gVLdNBfAANBrOcwRv2heu+Zu3PZGuC166/JWFM
+kx5a9TkI0zQAw72LqKeX4VDBRz5fUoIs/C+3aGc5Mh+h8fZYjJGf0kr/90rnd/0e
+WqsBA/9ONArdHN44aICt7xku/t98p9Da04A7kRYTHlLrBk5i0U4JJXKei7ZAzNi4
+Or//8ATepQdsBMCJVx1Ss/vJKxupLG9Mw43nbNuA5SmOSPnAoyglYadKyaUXBbVj
+mkqf9ZkjOMfD5u9PEWMWMq3f8uf05qxsrBDeiyc7Fk0jBYTvnrQ4RmVkb3JhIFBy
+ZSBFeHRyYXMgUmVsZWFzZSA8cHJlLWV4dHJhc0BmZWRvcmFwcm9qZWN0Lm9yZz6I
+XgQTEQIAHgUCQb6+7wIbAwYLCQgHAwIDFQIDAxYCAQIeAQIXgAAKCRCC7ZUEGscM
+5uAMAKC+XaPSCYIpdcmJYEe9rNxYMz/hLwCeOyBYUYA2L0WnbfXuNafRqwta/s2I
+RgQSEQIABgUCQgD+/AAKCRC0QmnQTypv0lVYAJoCLolPSuAj873GbV2+m3Bj6sS/
+UACeNcDmIWeruRld83uSQcx4xJyEOUa0KUZlZG9yYSBQcm9qZWN0IDxmZWRvcmEt
+ZXh0cmFzQHJlZGhhdC5jb20+iF4EExECAB4FAkIAeFQCGwMGCwkIBwMCAxUCAwMW
+AgECHgECF4AACgkQgu2VBBrHDOYu8wCffLm57mvcYApV7eqvHXr29gNAbLwAoJVq
+JWvgBIvg8/4MiqwKAQ1MDkIUiEYEEhECAAYFAkIA/wQACgkQtEJp0E8qb9LQJACf
+c0LteS513+5O6erQO7RBUxC/NI4AniDHK+Ogf5l5Gs2ciwD+WApsZ4mPtDBGZWRv
+cmEgUHJvamVjdCA8ZmVkb3JhLWV4dHJhc0BmZWRvcmFwcm9qZWN0Lm9yZz6IXgQT
+EQIAHgUCQgB4iQIbAwYLCQgHAwIDFQIDAxYCAQIeAQIXgAAKCRCC7ZUEGscM5gZ7
+AJ9n8CYN6nvMqxCbQQZwvs7e/J4//QCeM3nDwC5EfEbEtOHPIYAqTf3IQZaIRgQS
+EQIABgUCQgD/BAAKCRC0QmnQTypv0qKuAJ0cnqk9BbbblRSBbn72bK/BAquzywCe
+M7S0C6rfrYlfOjQHQdVB5GitT9u5AQ0EQb6+8RAEAJmsZ5apOFz0Fj6RwX0D+nOU
+Atdzd3zpTNzu4j8+L750ePutjuwizEmCxKycchuG+gGasLmdxY+xk5AUB7gLt4ms
+eKsWyHvQt+H4wG8jjOjHWXlaJkZaYQUxpVPd6/11hkoqpodJ9ckfoIJnpUJWDcd3
+HTW7jdq+ZtBXjQlwvh3HAAMHA/9g50+hqjn23d91SaFTkvaAySZYHEF/xm5sOV1X
+Z37XNFdl7JRl6BN7y59PE9Nk6qP4yHqH1G2YNDL3BmejChMF5GmEqluNdnvfFvwk
+yqPvE7qCv8BhktPqsnrpFmtfeDFI4vztD08oab9LdkDvQwLHBZpc+wCb4VJzOkaZ
+7e7VP4hJBBgRAgAJBQJBvr7xAhsMAAoJEILtlQQaxwzmxdYAn3X4X/ENC3V4yPDR
+7X6oVeIVr5fvAJ4n5vY10NpvYKV5arzKd8DSW2m5Bg==
+=N/fy
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-fedora-legacy b/src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-fedora-legacy
new file mode 100644
index 00000000..d15e7e90
--- /dev/null
+++ b/src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-fedora-legacy
@@ -0,0 +1,30 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.0.7 (GNU/Linux)
+
+mQGiBEALkQkRBACCBCp/a5rsqy2Q0NW/2OMkYtsb3k5M6dsQYoHDLiZK4VG1j+Bf
+2zzp+HJiUnLFp/l7mROuRioU9/UHpEYFIVunBYXeZf84OxB+mruh9UZtYn3oVXtH
+oaMI7hIFirTZ5eEY7zrfvTbvZ2Sm5cE3F2G5sWVOfxhl5opinuWN4xtSwwCggooh
+LqarkF4KN6D8xoyjrhLaxiMD/Az7RE6oH0Vwl9dX7YmccymDEesT5Ql6Q5FvfkuZ
+F5ZaQwaBO2ko2hMMh2AdCxoYAZPjWqC5r6Wy9P8hMfh+A0S4zon2DE/r0d4vLEY2
+HoptwtElq6gpltydx+/vXhZWkwCO//Kz9wXgZr496KtGXmEKYtdlVScBW6OvdyyD
+18zeA/9RuY59C7uxxe6cu7amqjP52xx5rHGkdJD5E8o3rmjdsr9tJ3FcjtIV0DV2
+BkfLIMnsp2gd972n7JBzlA9LJ+JTtMzvf9WdrErpRz1VeI1jHe4/hNGe3hd6xJIE
+rxj5FH+LwTj3vfErZdKsWOuudNkz1N4AwZr/k05gV3bi7j8RCLRIRmVkb3JhIExl
+Z2FjeSAoaHR0cDovL3d3dy5mZWRvcmFsZWdhY3kub3JnKSA8c2Vjbm90aWNlQGZl
+ZG9yYWxlZ2FjeS5vcmc+iFkEExECABkFAkALkQkECwcDAgMVAgMDFgIBAh4BAheA
+AAoJEBCMRRJzEAL686wAn3bA5dioMd0UDpUaES9TglLDpONbAJ467XWdHHwhxuHz
+oxWc3q7rWPBinLkCDQRAC5EuEAgAsPAVcrvrKB1A/hxoM61KEgaLB9GnGUOgoaV6
+I58stO3sxaxj3bblrpIJjo02BA49xrtL8kpqjKveABThVC1yiSYfySmXKHlO09cv
+A+qj+QSxieRciFKc50F1+j8q5Hqcigxzwhr4sJt5IhAx6HIwar5uxNNBgE98JN42
+GthUH39G+alRmzVd+3gQCLFroJSzHtFX7IlwHM33owAZwIVGlUhlBTHdbsvGf0xG
+mPYkI+JAUXpTTsnP7kR0/Ktm3zAHBEMw19eqQ5MSwVo28cA+jq2sLrL5DiE5quCd
+tB/RVnUUdbfN/o8sN6yxssNB6ZOB61l0K8bvm+9Qgstn/EQFSwADBggAmmFJueD1
+iXehZsRtaH+qZw7z6Q6jUPxDTiuVPhLkUux3wOSWMOp6S+ZYliCaw32TBKgE2SwT
+NnvTJYsuGLf3ECxOxMmu2McDHYZM82zRV4PRBMKFfiOa67/x5lhZgEkqf9TO+wk5
+M67GYbjZoyBaYEiE+eWD2cdema3n3zXzy+q2UEkHkzHx6ME9dRrgND3EW2hC9GJ6
+7wY9h+BlUR6Am4o0/ZLZJ2QEvyVnlI3/zZo9L6h8waZKI4l16nuDr/O8z2UOYc/X
+OMwBJCVwvbB2Z/f91dhy2EVWJZyyZBCG/FMXXDchxKwJOOQgrVbxWGDIMSdyHLUL
+2FuWnC/vdKc7wYhGBBgRAgAGBQJAC5EuAAoJEBCMRRJzEAL6wkcAnAlIrH0JuGjL
+T17HoheG/iUbj4Z4AJ9b/7OPGgNglwrLQJfihyPzManKYw==
+=wmoy
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-fedora-rawhide b/src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-fedora-rawhide
new file mode 100644
index 00000000..f61eeb11
--- /dev/null
+++ b/src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-fedora-rawhide
@@ -0,0 +1,21 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.0.7 (GNU/Linux)
+
+mQGiBD+doUwRBADudl/P8RqkzaHstvwbT93MByo7yX+xHcr0FaVAoG9Qfn+2O0qy
+nbNIz9BoieCx9zfgruBBaYjcT1p7QjdyfvF3wLq6ak84ne+QW91rctzqG8JqPhSB
+e34L7T0JnsUdiLfnfq895Hy67SYTOcJ6sN1Eg/eKYPP0CHKL9BY9atGRZwCg14Kh
+va6OSfIDyV6DNnfYF+cUSwsEALARvclTS8lLL+4sgZthg4D4Od4mYayr0QpKpoBI
+0RxOj26v038unOGqEjjqX/F36PwQv6wt6DmaGd9atQ/VUqW4cnKmNfaxJVAqznqW
+q80FKzTPH/JC/20v/5xx0FoxEVSCoKs2YPdXEQfEUAzNG9JC4GHNCxt2Gtnt4o5l
+sn15BADepds5sa/ptu//hJcYhrvcgzUJQR/JQdDbtK+Rzrvi2oZQFZUHzCVVxxfE
+0AULmX5bEC08nAGtp418ceeo1PdqlcVE+kaxuFpPgto/Sd1FvJW4P2B1a7rcUjGc
+BarOMVY8QpFZs5iIlkzZdPns1BCijWlhltOiyrdxyNrM49hjlrRGRmVkb3JhIFBy
+b2plY3QgYXV0b21hdGVkIGJ1aWxkIHNpZ25pbmcga2V5ICgyMDAzKSA8cmF3aGlk
+ZUByZWRoYXQuY29tPohbBBMRAgAbBQI/naFMBgsJCAcDAgMVAgMDFgIBAh4BAheA
+AAoJEOE4XU4c3byppW8An385Vt7LXSAIHqdH85QTCH512cr+AJ9vB4inXB6lxOoq
+sbnKY0HG4Sr1IIhGBBMRAgAGBQI/naOPAAoJELRCadBPKm/SFMgAn2/FfBhf2Yov
+j3gH8Z1t+bbsHRkLAJ94tjdweTZmfZsQZ7YaDXpeJ2iY+4hGBBARAgAGBQI/ntkG
+AAoJECnVuiSN9W0Fi5gAn3wSpemY+8rq8aFfRLEumrSksfUoAJ95YyaGdRXv+fWt
+KfPJSNTqsqhiKA==
+=umuG
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-fedora-test b/src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-fedora-test
new file mode 100644
index 00000000..efb8d813
--- /dev/null
+++ b/src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-fedora-test
@@ -0,0 +1,20 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.0.7 (GNU/Linux)
+
+mQGiBD+do/cRBACAF7Gv91v32uUrT4nZe+qKgLl59HmtvmaOzT4lInrF95Sget7p
+2TpnIqh5H0x0VGpdoeNfHvlXCw+aP50mTJv91BYmLfelkTzokqpEU5YpqGOqa5BV
+jelnoK1VKOcXMB28d79Gz9tn7friZN4SnyWbcSIA4C3dHNhsjifIYf0rywCg3y19
+3N6jODa0VSGeeEb4whE2xccD/i/rqk0MQmW6td2Dz2jTBaHxyf7FIcH18YDtwraD
+otBRxqGkTVyFGc1q7ZTrRsbzdjIfxbp2C6GT2VJ5kHuRm9jf7JdW5fOhun+oLimR
+erTlrPmgz8qQRcqUm6fkmUsYufL1u7DdyfxX7jI2ngkbAR+CsZ8Cj5JhBMeAXc/D
+WWhPA/4mzZ70hn1OrGLokzxNr4O7u1+n0thsxGN0qfuTNGIc09UKCoAN42he7Qjs
+kIqiE7gLtLzx8elxVOK19tNcaAiLoqmtxlLQqB03pLy4V0tMP9QcWQETbc67qTd1
+zASiefGjf364j4lQd+X9AqdyhUrnax3UgPD5IxilBp92Cw7Qi7QzRmVkb3JhIFBy
+b2plY3QgKFRlc3QgU29mdHdhcmUpIDxyYXdoaWRlQHJlZGhhdC5jb20+iFsEExEC
+ABsFAj+do/cGCwkIBwMCAxUCAwMWAgECHgECF4AACgkQ2oTL1DDJ7Pgh8QCgqNNs
+b7xdW+UhzyZw+DEAQF6e+q4AmwVus4u9REyd/aigK2RvrdtcsNy0iEYEExECAAYF
+Aj+dpBoACgkQtEJp0E8qb9Ji4QCfanY0CXnRwtBnm8GEMRNqgfGgcc0AnRunlejp
+JRxGPaRsmY/11stYll32iEYEEBECAAYFAj+e2SIACgkQKdW6JI31bQWWNQCfTKcX
+/7lerpwIVHcAILDduz9qxssAn1t46ERJ9EqsxJxSFlN7oBPyNkt6
+=R9He
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-rawhide b/src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-rawhide
new file mode 100644
index 00000000..2cb42458
--- /dev/null
+++ b/src/lib/distro-info/fedora-6/trusted-package-keys/RPM-GPG-KEY-rawhide
@@ -0,0 +1,24 @@
+By using `rpm -K' and the GNU GPG package, the following public key can be
+used to verify RPM packages built and signed by Red Hat, Inc. for rawhide
+and testing. Questions about this key should be sent to
+security@redhat.com.
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.0.7 (GNU/Linux)
+
+mQGiBD9DmVMRBACW9LRPUtKnUTNeSQN5huiPA0+d0hGLTEG1kkUj47zWC3RXZ1Xh
+c/6yzWOrPk85Q7ys/dGoLLqsfekkxDVipUE0iS+47VMYgm531x4cd2oKnQb3Z/2R
+3A6kjDkc2KyTmfOsZ8DTdL76u81Rnv6MCQjXTJCFOQzv3yxmn6ZDhOoSkwCg24J2
+Qh0zuvvtyfNMsj+S8ksase8D/1qQgcURZDYZkaxrQSsdyZWsqb4NT51snXG5wE4L
+Yh1VGH26YU/kY7YxU5TPo8kbQTztkqaoFHk/O6zx+Q/iS8Izv2ByTsZv0F/Weym7
+Fyf+x+PTA7oDvV9hN/aJy/UPF+t4GRrsEV2mH8Ee3hIZGKSWwTwZZh+JyfIcqkyU
+zwY9BACLOZ8xZjHzU4MjZw2qgWemr96Zyr2foGl0+2G1STnluWf24//nNWBiLFuA
+txucItsppnUM0qB5RZ69N4c9MOmCZkBoahP3Q30qAsaAN4RaaE6AG7Yms0wtPW3m
+qzzhcuCtRAumXqA/oQWYqmHaEwUPenJaxut5rasApm2r5QxaQbRFUmVkIEhhdCwg
+SW5jLiBhdXRvbWF0ZWQgYnVpbGQgc2lnbmluZyBrZXkgKDIwMDMpIDxyYXdoaWRl
+QHJlZGhhdC5jb20+iFsEExECABsFAj9DmVMGCwkIBwMCAxUCAwMWAgECHgECF4AA
+CgkQlM1XQuQY46oixwCfUKmLRHSIBd1FbGTaR5ARBfSsK+MAn1BfxKyahkQ0ScN7
+9RNaYei9kxGIiEYEExECAAYFAj9DvtMACgkQIZGAzdtCpg5exACeJlj9DExab5AK
+C0eQHr8td+WRJ0QAnRNDGXQCBENRgFNgcecDMAr7P6se
+=LmwA
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/fedora-6_x86_64/export-filter.example b/src/lib/distro-info/fedora-6_x86_64/export-filter.example
new file mode 100644
index 00000000..a414fef4
--- /dev/null
+++ b/src/lib/distro-info/fedora-6_x86_64/export-filter.example
@@ -0,0 +1,15 @@
+# this file defines the filter rules used when exporting a vendor-OS
+# of this distro
+#
+# copy this file to 'export-filter' and add your own filters to it
+# in order to overrule the filters provided by openslx
+#
+#Examples:
+# the following line would include anything below /var/spool/
+#+ /var/spool/*
+#
+# this would exclude anything in /etc that starts with dhcpd.conf
+#- /etc/dhcpd.conf*
+#
+# and this would exclude all rpmnew-files:
+#- *.rpmnew
diff --git a/src/lib/distro-info/fedora-6_x86_64/mirrors/base b/src/lib/distro-info/fedora-6_x86_64/mirrors/base
new file mode 100644
index 00000000..71f25f3c
--- /dev/null
+++ b/src/lib/distro-info/fedora-6_x86_64/mirrors/base
@@ -0,0 +1,101 @@
+ftp://alviss.et.tudelft.nl/pub/fedora/linux/core/6/x86_64/os
+http://distro.ibiblio.org/pub/linux/distributions/fedora/linux/core/6/x86_64/os
+http://download.fedora.redhat.com/pub/fedora/linux/6/x86_64/os
+http://fedora.kiewel-online.de/linux/core/6/x86_64/os
+http://fedora.mirror.facebook.com/linux/core/6/x86_64/os
+http://fedora.mirror.garr.it/mirrors/fedora/linux/core/6/x86_64/os
+http://fedora.secsup.org/linux/6/x86_64/os
+ftp://fedora.secsup.org/pub/linux/redhat/fedora/linux/core/6/x86_64/os
+http://fr2.rpmfind.net/linux/fedora/core/6/x86_64/os
+http://ftp-stud.hs-esslingen.de/pub/fedora/linux/core/6/x86_64/os
+http://ftp.astral.ro/mirrors/fedora/pub/fedora/linux/core/6/x86_64/os
+http://ftp.belnet.be/linux/fedora/linux/core/6/x86_64/os
+ftp://ftp.ceid.upatras.gr/pub/fedora/linux/core/6/x86_64/os
+http://ftp.chg.ru/pub/Linux/fedora/linux/core/6/x86_64/os
+http://ftp.cica.es/fedora/linux/core/6/x86_64/os
+ftp://ftp.ciril.fr/pub/linux/fedora/linux/core/6/x86_64/os
+http://ftp.crc.dk/fedora/linux/core/6/x86_64/os
+ftp://ftp.crc.dk/pub/mirrors/fedora/linux/core/6/x86_64/os
+ftp://ftp.cru.fr/pub/linux/fedora/core/6/x86_64/os
+ftp://ftp.cse.buffalo.edu/pub/Linux/fedora/linux/core/6/x86_64/os
+http://ftp.dti.ad.jp/pub/Linux/Fedora/core/6/x86_64/os
+http://ftp.fi.muni.cz/pub/linux/fedora/linux/core/6/x86_64/os
+ftp://ftp.free.fr/mirrors/fedora.redhat.com/fedora/linux/core/6/x86_64/os
+http://ftp.funet.fi/pub/mirrors/fedora.redhat.com/pub/fedora/linux/6/x86_64/os
+ftp://ftp.gtlib.gatech.edu/pub/fedora.redhat/linux/core/6/x86_64/os
+http://ftp.gts.lug.ro/fedora/linux/core/6/x86_64/os
+http://ftp.gui.uva.es/sites/fedora.redhat.com/linux/core/6/x86_64/os
+http://ftp.heanet.ie/pub/fedora/linux/core/6/x86_64/os
+http://ftp.hostrino.com/pub/fedora/linux/core/6/x86_64/os
+http://ftp.iij.ad.jp/pub/linux/fedora/core/6/x86_64/os
+http://ftp.jaist.ac.jp/pub/Linux/Fedora/core/6/x86_64/os
+ftp://ftp.kaist.ac.kr/fedora/linux/core/6/x86_64/os
+http://ftp.kaist.ac.kr/pub/fedora/linux/core/6/x86_64/os
+http://ftp.kddilabs.jp/Linux/packages/fedora/core/6/x86_64/os
+http://ftp.linux.ee/pub/fedora/linux/core/6/x86_64/os
+http://ftp.linux.ncsu.edu/pub/fedora/linux/core/6/x86_64/os
+ftp://ftp.linux.org.tr/pub/fedora/linux/core/6/x86_64/os
+http://ftp.lip6.fr/ftp/pub/linux/distributions/fedora/6/x86_64/os
+ftp://ftp.mirrorservice.org/sites/download.fedora.redhat.com/pub/fedora/linux/core/6/x86_64/os
+ftp://ftp.muug.mb.ca/pub/fedora/linux/core/6/x86_64/os
+http://ftp.nluug.nl/pub/os/Linux/distr/fedora/linux/core/6/x86_64/os
+ftp://ftp.otenet.gr/pub/linux/fedora/linux/core/6/x86_64/os
+ftp://ftp.proxad.net/mirrors/fedora.redhat.com/fedora/linux/core/6/x86_64/os
+http://ftp.ps.pl/pub/Linux/fedora-linux/core/6/x86_64/os
+http://ftp.pwr.wroc.pl/pub/linux/fedora/linux/core/6/x86_64/os
+ftp://ftp.rediris.es/mirror/fedora-redhat/core/6/x86_64/os
+http://ftp.rhnet.is/pub/fedora/linux/core/6/x86_64/os
+http://ftp.riken.jp/Linux/fedora/core/6/x86_64/os
+ftp://ftp.solnet.ch/mirror/fedora/linux/core/6/x86_64/os
+http://ftp.stw-bonn.de/pub/fedora/linux/core/6/x86_64/os
+http://ftp.SURFnet.nl/pub/os/Linux/distr/fedora/linux/core/6/x86_64/os
+http://ftp.tlk-l.net/pub/mirrors/fedora/core/6/x86_64/os
+http://ftp.tu-chemnitz.de/pub/linux/fedora-enchilada/linux/core/6/x86_64/os
+ftp://ftp.tvnet.hu/pub/fedora/linux/core/6/x86_64/os
+ftp://ftp.uci.edu/mirrors/fedora/linux/core/6/x86_64/os
+http://ftp.udl.es/pub/fedora/linux/core/6/x86_64/os
+http://ftp.uni-bayreuth.de/linux/fedora/linux/core/6/x86_64/os
+ftp://ftp.uni-bayreuth.de/pub/linux/fedora/linux/core/6/x86_64/os
+ftp://ftp.uninett.no/pub/linux/Fedora/core/6/x86_64/os
+http://ftp.upjs.sk/pub/fedora/linux/core/6/x86_64/os
+http://ftp.usf.edu/pub/fedora/linux/core/6/x86_64/os
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/fedora/linux/core/6/x86_64/os
+http://gulus.usherbrooke.ca/pub/distro/fedora/linux/core/6/x86_64/os
+http://kdeforge.unl.edu/mirrors/fedora/linux/core/6/x86_64/os
+ftp://limestone.uoregon.edu/fedora/linux/6/x86_64/os
+http://limestone.uoregon.edu/ftp/fedora/linux/6/x86_64/os
+http://linux.nssl.noaa.gov/fedora/linux/core/6/x86_64/os
+http://mirror.aarnet.edu.au/pub/fedora/linux/core/6/x86_64/os
+http://mirror.anl.gov/pub/fedora/linux/core/6/x86_64/os
+http://mirror.cc.vt.edu/pub/fedora/linux/core/6/x86_64/os
+http://mirror.cogentco.com/pub/linux/fedora/linux/core/6/x86_64/os
+ftp://mirror.cs.princeton.edu/pub/mirrors/fedora/linux/core/6/x86_64/os
+http://mirror.fraunhofer.de/download.fedora.redhat.com/fedora/linux/core/6/x86_64/os
+http://mirror.hiwaay.net/pub/fedora/linux/core/6/x86_64/os
+http://mirror.internode.on.net/pub/fedora/linux/core/6/x86_64/os
+http://mirror.karneval.cz/pub/linux/fedora/linux/core/6/x86_64/os
+http://mirror.linux.duke.edu/pub/fedora/linux/core/6/x86_64/os
+http://mirror.nuvio.com/pub/fedora/linux/core/6/x86_64/os
+ftp://mirror.nyi.net/fedora/linux/core/6/x86_64/os
+http://mirror.optus.net/fedora/linux/core/6/x86_64/os
+http://mirror.pacific.net.au/linux/fedora/linux/core/6/x86_64/os
+http://mirror.stanford.edu/fedora/linux/core/6/x86_64/os
+ftp://mirror.stanford.edu/pub/mirrors/fedora/linux/core/6/x86_64/os
+http://mirror.steadfast.net/fedora/core/6/x86_64/os
+http://mirror.switch.ch/ftp/mirror/fedora/linux/core/6/x86_64/os
+ftp://mirror.switch.ch/mirror/fedora/linux/core/6/x86_64/os
+http://mirror.usu.edu/mirrors/fedora/linux/core/6/x86_64/os
+http://mirror.web-ster.com/fedora/core/6/x86_64/os
+http://mirrors.cat.pdx.edu/fedora/linux/core/6/x86_64/os
+http://mirrors.ircam.fr/pub/fedora/linux/core/6/x86_64/os
+http://mirrors.kernel.org/fedora/core/6/x86_64/os
+http://mirrors.tummy.com/pub/fedora.redhat.com/fedora/linux/core/6/x86_64/os
+http://mirrors.usc.edu/pub/linux/distributions/fedora/linux/core/6/x86_64/os
+http://srl.cs.jhu.edu/YUM/fedora/core/6/x86_64/os
+http://sunsite.icm.edu.pl/pub/Linux/fedora/linux/core/6/x86_64/os
+http://sunsite.mff.cuni.cz/MIRRORS/fedora.redhat.com/linux/core/6/x86_64/os
+http://sunsite.rediris.es/mirror/fedora-redhat/core/6/x86_64/os
+http://www.gtlib.gatech.edu/pub/fedora.redhat/linux/core/6/x86_64/os
+http://www.jur-linux.org/download/fedora/6/x86_64/os
+http://www.mirrorservice.org/sites/download.fedora.redhat.com/pub/fedora/linux/core/6/x86_64/os
+http://www.muug.mb.ca/pub/fedora/linux/core/6/x86_64/os
diff --git a/src/lib/distro-info/fedora-6_x86_64/mirrors/base_update b/src/lib/distro-info/fedora-6_x86_64/mirrors/base_update
new file mode 100644
index 00000000..2775b991
--- /dev/null
+++ b/src/lib/distro-info/fedora-6_x86_64/mirrors/base_update
@@ -0,0 +1,90 @@
+ftp://alviss.et.tudelft.nl/pub/fedora/linux/core/updates/6/x86_64
+http://distro.ibiblio.org/pub/linux/distributions/fedora/linux/core/updates/6/x86_64
+http://download.fedora.redhat.com/pub/fedora/linux/updates/6/x86_64
+http://fedora.kiewel-online.de/linux/core/updates/6/x86_64
+http://fedora.mirror.facebook.com/linux/core/updates/6/x86_64
+http://fedora.mirror.garr.it/mirrors/fedora/linux/core/updates/6/x86_64
+http://fedora.secsup.org/linux/updates/6/x86_64
+ftp://fedora.secsup.org/pub/linux/redhat/fedora/linux/core/updates/6/x86_64
+http://fr2.rpmfind.net/linux/fedora/core/updates/6/x86_64
+http://ftp-stud.hs-esslingen.de/pub/fedora/linux/core/updates/6/x86_64
+http://ftp.astral.ro/mirrors/fedora/pub/fedora/linux/core/updates/6/x86_64
+http://ftp.belnet.be/linux/fedora/linux/core/updates/6/x86_64
+ftp://ftp.ceid.upatras.gr/pub/fedora/linux/core/updates/6/x86_64
+http://ftp.chg.ru/pub/Linux/fedora/linux/core/updates/6/x86_64
+http://ftp.cica.es/fedora/linux/core/updates/6/x86_64
+ftp://ftp.ciril.fr/pub/linux/fedora/linux/core/updates/6/x86_64
+http://ftp.crc.dk/fedora/linux/core/updates/6/x86_64
+ftp://ftp.crc.dk/pub/mirrors/fedora/linux/core/updates/6/x86_64
+ftp://ftp.cru.fr/pub/linux/fedora/core/updates/6/x86_64
+http://ftp.dti.ad.jp/pub/Linux/Fedora/core/updates/6/x86_64
+http://ftp.fi.muni.cz/pub/linux/fedora/linux/core/updates/6/x86_64
+ftp://ftp.free.fr/mirrors/fedora.redhat.com/fedora/linux/core/updates/6/x86_64
+http://ftp.funet.fi/pub/mirrors/fedora.redhat.com/pub/fedora/linux/updates/6/x86_64
+ftp://ftp.gtlib.gatech.edu/pub/fedora.redhat/linux/core/updates/6/x86_64
+http://ftp.gts.lug.ro/fedora/linux/core/updates/6/x86_64
+http://ftp.gui.uva.es/sites/fedora.redhat.com/linux/core/updates/6/x86_64
+http://ftp.heanet.ie/pub/fedora/linux/core/updates/6/x86_64
+http://ftp.iij.ad.jp/pub/linux/fedora/core/updates/6/x86_64
+http://ftp.jaist.ac.jp/pub/Linux/Fedora/core/updates/6/x86_64
+ftp://ftp.kaist.ac.kr/fedora/linux/core/updates/6/x86_64
+http://ftp.kaist.ac.kr/pub/fedora/linux/core/updates/6/x86_64
+http://ftp.kddilabs.jp/Linux/packages/fedora/core/updates/6/x86_64
+http://ftp.linux.ee/pub/fedora/linux/core/updates/6/x86_64
+http://ftp.linux.ncsu.edu/pub/fedora/linux/core/updates/6/x86_64
+ftp://ftp.linux.org.tr/pub/fedora/linux/core/updates/6/x86_64
+ftp://ftp.mirrorservice.org/sites/download.fedora.redhat.com/pub/fedora/linux/core/updates/6/x86_64
+ftp://ftp.muug.mb.ca/pub/fedora/linux/core/updates/6/x86_64
+http://ftp.nluug.nl/pub/os/Linux/distr/fedora/linux/core/updates/6/x86_64
+ftp://ftp.otenet.gr/pub/linux/fedora/linux/core/updates/6/x86_64
+ftp://ftp.proxad.net/mirrors/fedora.redhat.com/fedora/linux/core/updates/6/x86_64
+http://ftp.ps.pl/pub/Linux/fedora-linux/core/updates/6/x86_64
+http://ftp.pwr.wroc.pl/pub/linux/fedora/linux/core/updates/6/x86_64
+ftp://ftp.rediris.es/mirror/fedora-redhat/core/updates/6/x86_64
+http://ftp.rhnet.is/pub/fedora/linux/core/updates/6/x86_64
+http://ftp.riken.jp/Linux/fedora/core/updates/6/x86_64
+ftp://ftp.solnet.ch/mirror/fedora/linux/core/updates/6/x86_64
+http://ftp.stw-bonn.de/pub/fedora/linux/core/updates/6/x86_64
+http://ftp.SURFnet.nl/pub/os/Linux/distr/fedora/linux/core/updates/6/x86_64
+http://ftp.tlk-l.net/pub/mirrors/fedora/core/updates/6/x86_64
+http://ftp.tu-chemnitz.de/pub/linux/fedora-enchilada/linux/core/updates/6/x86_64
+ftp://ftp.tvnet.hu/pub/fedora/linux/core/updates/6/x86_64
+ftp://ftp.uci.edu/mirrors/fedora/linux/core/updates/6/x86_64
+http://ftp.udl.es/pub/fedora/linux/core/updates/6/x86_64
+ftp://ftp.uninett.no/pub/linux/Fedora/core/updates/6/x86_64
+http://ftp.upjs.sk/pub/fedora/linux/core/updates/6/x86_64
+http://ftp.usf.edu/pub/fedora/linux/core/updates/6/x86_64
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/fedora/linux/core/updates/6/x86_64
+http://gulus.usherbrooke.ca/pub/distro/fedora/linux/core/updates/6/x86_64
+http://kdeforge.unl.edu/mirrors/fedora/linux/core/updates/6/x86_64
+http://limestone.uoregon.edu/ftp/fedora/linux/updates/6/x86_64
+http://linux.nssl.noaa.gov/fedora/linux/core/updates/6/x86_64
+http://mirror.aarnet.edu.au/pub/fedora/linux/core/updates/6/x86_64
+http://mirror.anl.gov/pub/fedora/linux/core/updates/6/x86_64
+http://mirror.cc.vt.edu/pub/fedora/linux/core/updates/6/x86_64
+http://mirror.cogentco.com/pub/linux/fedora/linux/core/updates/6/x86_64
+ftp://mirror.cs.princeton.edu/pub/mirrors/fedora/linux/core/updates/6/x86_64
+http://mirror.fraunhofer.de/download.fedora.redhat.com/fedora/linux/core/updates/6/x86_64
+http://mirror.hiwaay.net/pub/fedora/linux/core/updates/6/x86_64
+http://mirror.internode.on.net/pub/fedora/linux/core/updates/6/x86_64
+http://mirror.karneval.cz/pub/linux/fedora/linux/core/updates/6/x86_64
+http://mirror.linux.duke.edu/pub/fedora/linux/core/updates/6/x86_64
+http://mirror.newnanutilities.org/pub/fedora/linux/core/updates/6/x86_64
+http://mirror.nuvio.com/pub/fedora/linux/core/updates/6/x86_64
+ftp://mirror.nyi.net/fedora/linux/core/updates/6/x86_64
+http://mirror.optus.net/fedora/linux/core/updates/6/x86_64
+http://mirror.stanford.edu/fedora/linux/core/updates/6/x86_64
+http://mirror.steadfast.net/fedora/core/updates/6/x86_64
+http://mirror.switch.ch/ftp/mirror/fedora/linux/core/updates/6/x86_64
+ftp://mirror.switch.ch/mirror/fedora/linux/core/updates/6/x86_64
+http://mirror.web-ster.com/fedora/core/updates/6/x86_64
+http://mirrors.cat.pdx.edu/fedora/linux/core/updates/6/x86_64
+http://mirrors.ircam.fr/pub/fedora/linux/core/updates/6/x86_64
+http://mirrors.kernel.org/fedora/core/updates/6/x86_64
+http://mirrors.tummy.com/pub/fedora.redhat.com/fedora/linux/core/updates/6/x86_64
+http://mirrors.usc.edu/pub/linux/distributions/fedora/linux/core/updates/6/x86_64
+http://srl.cs.jhu.edu/YUM/fedora/core/updates/6/x86_64
+http://sunsite.mff.cuni.cz/MIRRORS/fedora.redhat.com/linux/core/updates/6/x86_64
+http://www.jur-linux.org/download/fedora/updates/6/x86_64
+http://www.mirrorservice.org/sites/download.fedora.redhat.com/pub/fedora/linux/core/updates/6/x86_64
+http://www.muug.mb.ca/pub/fedora/linux/core/updates/6/x86_64
diff --git a/src/lib/distro-info/fedora-6_x86_64/prereqfiles/etc/hosts b/src/lib/distro-info/fedora-6_x86_64/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/fedora-6_x86_64/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/fedora-6_x86_64/settings.default b/src/lib/distro-info/fedora-6_x86_64/settings.default
new file mode 100644
index 00000000..3e940b94
--- /dev/null
+++ b/src/lib/distro-info/fedora-6_x86_64/settings.default
@@ -0,0 +1,125 @@
+bootstrap-packages = <<END
+ audit-libs-1.2.8-1.fc6.x86_64.rpm
+ basesystem-8.0-5.1.1.noarch.rpm
+ bash-3.1-16.1.x86_64.rpm
+ beecrypt-4.1.2-10.1.1.x86_64.rpm
+ bzip2-libs-1.0.3-3.x86_64.rpm
+ chkconfig-1.3.30-1.x86_64.rpm
+ coreutils-5.97-11.x86_64.rpm
+ cpio-2.6-19.x86_64.rpm
+ cracklib-2.8.9-3.1.x86_64.rpm
+ cracklib-dicts-2.8.9-3.1.x86_64.rpm
+ db4-4.3.29-9.fc6.x86_64.rpm
+ device-mapper-1.02.07-3.x86_64.rpm
+ dmraid-1.0.0.rc13-1.fc6.x86_64.rpm
+ e2fsprogs-1.39-7.x86_64.rpm
+ e2fsprogs-libs-1.39-7.x86_64.rpm
+ elfutils-libelf-0.123-1.fc6.x86_64.rpm
+ ethtool-3-1.2.2.x86_64.rpm
+ expat-1.95.8-8.2.1.x86_64.rpm
+ fedora-release-6-4.noarch.rpm
+ fedora-release-notes-6-3.noarch.rpm
+ filesystem-2.4.0-1.x86_64.rpm
+ findutils-4.2.27-4.1.x86_64.rpm
+ gawk-3.1.5-11.x86_64.rpm
+ gdbm-1.8.0-26.2.1.x86_64.rpm
+ glib2-2.12.3-2.fc6.x86_64.rpm
+ glibc-2.5-3.x86_64.rpm
+ glibc-common-2.5-3.x86_64.rpm
+ grep-2.5.1-54.1.x86_64.rpm
+ gzip-1.3.5-9.x86_64.rpm
+ info-4.8-11.1.x86_64.rpm
+ initscripts-8.45.3-1.x86_64.rpm
+ iproute-2.6.16-6.fc6.x86_64.rpm
+ iputils-20020927-41.fc6.x86_64.rpm
+ kernel-2.6.18-1.2798.fc6.x86_64.rpm
+ kpartx-0.4.7-5.x86_64.rpm
+ krb5-libs-1.5-7.x86_64.rpm
+ less-394-4.1.x86_64.rpm
+ libacl-2.2.39-1.1.x86_64.rpm
+ libattr-2.4.32-1.1.x86_64.rpm
+ libcap-1.10-25.x86_64.rpm
+ libgcc-4.1.1-30.x86_64.rpm
+ libselinux-1.30.29-2.x86_64.rpm
+ libsepol-1.12.27-1.x86_64.rpm
+ libstdc++-4.1.1-30.x86_64.rpm
+ libtermcap-2.0.8-46.1.x86_64.rpm
+ lvm2-2.02.06-4.x86_64.rpm
+ MAKEDEV-3.23-1.2.x86_64.rpm
+ mcstrans-0.1.8-3.x86_64.rpm
+ mingetty-1.07-5.2.2.x86_64.rpm
+ mkinitrd-5.1.19-1.x86_64.rpm
+ mktemp-1.5-23.2.2.x86_64.rpm
+ module-init-tools-3.3-0.pre1.4.17.x86_64.rpm
+ nash-5.1.19-1.x86_64.rpm
+ ncurses-5.5-24.20060715.x86_64.rpm
+ neon-0.25.5-5.1.x86_64.rpm
+ net-tools-1.60-73.x86_64.rpm
+ openssl-0.9.8b-8.x86_64.rpm
+ pam-0.99.6.2-3.fc6.x86_64.rpm
+ pcre-6.6-1.1.x86_64.rpm
+ popt-1.10.2-32.x86_64.rpm
+ procps-3.2.7-8.x86_64.rpm
+ psmisc-22.2-5.x86_64.rpm
+ python-2.4.3-18.fc6.x86_64.rpm
+ readline-5.1-1.1.x86_64.rpm
+ rpm-4.4.2-32.x86_64.rpm
+ rpm-libs-4.4.2-32.x86_64.rpm
+ sed-4.1.5-5.fc6.x86_64.rpm
+ setup-2.5.55-1.noarch.rpm
+ shadow-utils-4.0.17-5.x86_64.rpm
+ sqlite-3.3.6-2.x86_64.rpm
+ sysklogd-1.4.1-39.2.x86_64.rpm
+ SysVinit-2.86-14.x86_64.rpm
+ tar-1.15.1-19.x86_64.rpm
+ termcap-5.5-1.20060701.1.noarch.rpm
+ tzdata-2006m-2.fc6.noarch.rpm
+ udev-095-14.x86_64.rpm
+ util-linux-2.13-0.44.fc6.x86_64.rpm
+ zlib-1.2.3-3.x86_64.rpm
+END
+<metapackager yum>
+ packages = <<END
+ libxml2-2.6.26-2.1.1.x86_64.rpm
+ python-elementtree-1.2.6-5.x86_64.rpm
+ python-sqlite-1.1.7-1.2.1.x86_64.rpm
+ python-urlgrabber-2.9.9-2.noarch.rpm
+ rpm-python-4.4.2-32.x86_64.rpm
+ yum-3.0-6.noarch.rpm
+ yum-metadata-parser-1.0-8.fc6.x86_64.rpm
+ END
+</metapackager>
+package-subdir = Fedora/RPMS
+prereq-packages = <<END
+ beecrypt-4.1.2-10.1.1.x86_64.rpm
+ bzip2-libs-1.0.3-3.x86_64.rpm
+ e2fsprogs-libs-1.39-7.x86_64.rpm
+ elfutils-libelf-0.123-1.fc6.x86_64.rpm
+ expat-1.95.8-8.2.1.x86_64.rpm
+ glibc-2.5-3.x86_64.rpm
+ krb5-libs-1.5-7.x86_64.rpm
+ libgcc-4.1.1-30.x86_64.rpm
+ libselinux-1.30.29-2.x86_64.rpm
+ libsepol-1.12.27-1.x86_64.rpm
+ libstdc++-4.1.1-30.x86_64.rpm
+ neon-0.25.5-5.1.x86_64.rpm
+ openssl-0.9.8b-8.x86_64.rpm
+ popt-1.10.2-32.x86_64.rpm
+ rpm-4.4.2-32.x86_64.rpm
+ rpm-libs-4.4.2-32.x86_64.rpm
+ sqlite-3.3.6-2.x86_64.rpm
+ zlib-1.2.3-3.x86_64.rpm
+END
+<repository base>
+ name = Fedora Core 6
+</repository>
+<repository base_update>
+ name = Fedora Core 6 updates
+</repository>
+<selection minimal>
+ packages = <<END
+ END
+</selection>
+<selection default>
+ base = minimal
+</selection>
diff --git a/src/lib/distro-info/fedora-6_x86_64/settings.example b/src/lib/distro-info/fedora-6_x86_64/settings.example
new file mode 100644
index 00000000..c41e6d33
--- /dev/null
+++ b/src/lib/distro-info/fedora-6_x86_64/settings.example
@@ -0,0 +1,20 @@
+# rename this file to 'settings' and edit it as you please
+#
+# for a list of all options, have a look at the corresponding
+# settings.default in /opt/openslx/share/distro-info
+
+# use local installation source
+#<repository base>
+# local-url = /srv/ftp/pub/pub/linux/fedora/linux/core/6/x86_64/os
+#</repository>
+#<repository base_update>
+# local-url = /srv/ftp/pub/linux/fedora/linux/core/updates/6/x86_64
+#</repository>
+
+# add a new selection:
+#<selection my_kde>
+# base = kde
+# packages = <<END
+# kinternet
+# END
+#</selection>
diff --git a/src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY b/src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY
new file mode 100644
index 00000000..592eba55
--- /dev/null
+++ b/src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY
@@ -0,0 +1,34 @@
+The following public key can be used to verify RPM packages built and
+signed by Red Hat, Inc. using `rpm -K' using the GNU GPG package.
+Questions about this key should be sent to security@redhat.com.
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.0.0 (GNU/Linux)
+Comment: For info see http://www.gnupg.org
+
+mQGiBDfqVDgRBADBKr3Bl6PO8BQ0H8sJoD6p9U7Yyl7pjtZqioviPwXP+DCWd4u8
+HQzcxAZ57m8ssA1LK1Fx93coJhDzM130+p5BG9mYSWShLabR3N1KXdXQYYcowTOM
+GxdwYRGr1Spw8QydLhjVfU1VSl4xt6bupPbWJbyjkg5Z3P7BlUOUJmrx3wCgobNV
+EDGaWYJcch5z5B1of/41G8kEAKii6q7Gu/vhXXnLS6m15oNnPVybyngiw/23dKjS
+ZVG7rKANEK2mxg1VB+vc/uUc4k49UxJJfCZg1gu1sPFV3GSa+Y/7jsiLktQvCiLP
+lncQt1dV+ENmHR5BdIDPWDzKBVbgWnSDnqQ6KrZ7T6AlZ74VMpjGxxkWU6vV2xsW
+XCLPA/9P/vtImA8CZN3jxGgtK5GGtDNJ/cMhhuv5tnfwFg4b/VGo2Jr8mhLUqoIb
+E6zeGAmZbUpdckDco8D5fiFmqTf5+++pCEpJLJkkzel/32N2w4qzPrcRMCiBURES
+PjCLd4Y5rPoU8E4kOHc/4BuHN903tiCsCPloCrWsQZ7UdxfQ5LQiUmVkIEhhdCwg
+SW5jIDxzZWN1cml0eUByZWRoYXQuY29tPohVBBMRAgAVBQI36lQ4AwsKAwMVAwID
+FgIBAheAAAoJECGRgM3bQqYOsBQAnRVtg7B25Hm11PHcpa8FpeddKiq2AJ9aO8sB
+XmLDmPOEFI75mpTrKYHF6rkCDQQ36lRyEAgAokgI2xJ+3bZsk8jRA8ORIX8DH05U
+lMH27qFYzLbT6npXwXYIOtVn0K2/iMDj+oEB1Aa2au4OnddYaLWp06v3d+XyS0t+
+5ab2ZfIQzdh7wCwxqRkzR+/H5TLYbMG+hvtTdylfqIX0WEfoOXMtWEGSVwyUsnM3
+Jy3LOi48rQQSCKtCAUdV20FoIGWhwnb/gHU1BnmES6UdQujFBE6EANqPhp0coYoI
+hHJ2oIO8ujQItvvNaU88j/s/izQv5e7MXOgVSjKe/WX3s2JtB/tW7utpy12wh1J+
+JsFdbLV/t8CozUTpJgx5mVA3RKlxjTA+On+1IEUWioB+iVfT7Ov/0kcAzwADBQf9
+E4SKCWRand8K0XloMYgmipxMhJNnWDMLkokvbMNTUoNpSfRoQJ9EheXDxwMpTPwK
+ti/PYrrL2J11P2ed0x7zm8v3gLrY0cue1iSba+8glY+p31ZPOr5ogaJw7ZARgoS8
+BwjyRymXQp+8Dete0TELKOL2/itDOPGHW07SsVWOR6cmX4VlRRcWB5KejaNvdrE5
+4XFtOd04NMgWI63uqZc4zkRa+kwEZtmbz3tHSdRCCE+Y7YVP6IUf/w6YPQFQriWY
+FiA6fD10eB+BlIUqIw80VgjsBKmCwvKkn4jg8kibXgj4/TzQSx77uYokw1EqQ2wk
+OZoaEtcubsNMquuLCMWijYhGBBgRAgAGBQI36lRyAAoJECGRgM3bQqYOhyYAnj7h
+VDY/FJAGqmtZpwVp9IlitW5tAJ4xQApr/jNFZCTksnI+4O1765F7tA==
+=3AHZ
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-beta b/src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-beta
new file mode 100644
index 00000000..ffcf6aed
--- /dev/null
+++ b/src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-beta
@@ -0,0 +1,32 @@
+The following public key can be used to verify RPM packages built and
+signed by Red Hat, Inc. for this beta using `rpm -K' using the GNU GPG
+package. Questions about this key should be sent to security@redhat.com.
+
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.0.6 (GNU/Linux)
+Comment: For info see http://www.gnupg.org
+
+mQGiBDySTqsRBACzc7xuCIp10oj5B2PAV4XzDeVxprv/WTMreSNSK+iC0bEz0IBp
+Vnn++qtyiXfH+bGIE9jqZgIEnpttWhUOaU5LhcLFzy+m8NWfngIFP9QfGmGAe9Gd
+LFeAdhj4RmSG/vgr7vDd83Hz22dv403Ar/sliWO4vDOrMmZBG57WGYTWtwCgkMsi
+UUQuJ6slbzKn82w+bYxOlL0EAIylWJGaTkKOTL5DqVR3ik9aT0Dt3FNVYiuhcKBe
+II4E3KOIVA9kO8in1IZjx2gs6K2UV+GsoAVANdfKL7l9O+k+J8OxhE74oycvYJxW
+QzCgXMZkNcvW5wyXwEMcr6TVd/5BGztcMw8oT3/l2MtAEG/vn1XaWToRSO1XDMDz
++AjUA/4m0mTkN8S4wjzJG8lqN7+quW3UOaiCe8J3SFrrrhE0XbY9cTJI/9nuXHU1
+VjqOSmXQYH2Db7UOroFTBiWhlAedA4O4yuK52AJnvSsHbnJSEmn9rpo5z1Q8F+qI
+mDlzriJdrIrVLeDiUeTlpH3kpG38D7007GhXBV72k1gpMoMcpbQ3UmVkIEhhdCwg
+SW5jLiAoQmV0YSBUZXN0IFNvZnR3YXJlKSA8cmF3aGlkZUByZWRoYXQuY29tPohX
+BBMRAgAXBQI8l5p/BQsHCgMEAxUDAgMWAgECF4AACgkQ/TcmiYl9oHqdeQCfZjw4
+F9sir3XfRAjVe9kYNcQ8hnIAn0WgyT7H5RriWYTOCfauOmd+cAW4iEYEEBECAAYF
+AjyXmqQACgkQIZGAzdtCpg5nDQCfepuRUyuVJvhuQkPWySETYvRw+WoAnjAWhx6q
+0npMx4OE1JGFi8ymKXktuQENBDySTq4QBADKL/mK7S8E3synxISlu7R6fUvu07Oc
+RoX96n0Di6T+BS99hC44XzHjMDhUX2ZzVvYS88EZXoUDDkB/8g7SwZrOJ/QE1zrI
+JmSVciNhSYWwqeT40Evs88ajZUfDiNbS/cSC6oui98iS4vxd7sE7IPY+FSx9vuAR
+xOa9vBnJY/dx0wADBQQAosm+Iltt2uigC6LJzxNOoIdB5r0GqTC1o5sHCeNqXJhU
+ExAG8m74uzMlYVLOpGZi4y4NwwAWvCWC0MWWnnu+LGFy1wKiJKRjhv5F+WkFutY5
+WHV5L44vp9jSIlBCRG+84jheTh8xqhndM9wOfPwWdYYu1vxrB8Tn6kA17PcYfHSI
+RgQYEQIABgUCPJJergAKCRD9NyaJiX2geiCPAJ4nEM4NtI9Uj8lONDk6FU86PmoL
+yACfb68fBd2pWEzLKsOk9imIobHHpzE=
+=gpIn
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-fedora b/src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-fedora
new file mode 100644
index 00000000..17d4ec70
--- /dev/null
+++ b/src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-fedora
@@ -0,0 +1,27 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.0.7 (GNU/Linux)
+
+mQGiBD+dnTsRBACwnlz4AhctOLlVBAsq+RaU82nb5P3bD1YJJpsAce1Ckd2sBUOJ
+D11NUCqH8c7EctOquOZ5zTcWxHiWWbLyKQwUw2SUvnWa5SSbi8kI8q9MTPsPvhwt
+gMrQMLenMO+nsrxrSaG6XcD+ssfJNxC7NQVCQAj3pvvg9rKi3ygsM7CXHwCghgsq
+X6TOr55HE90DbEsoq3b/jjsD/i8aIZ6urUgrpAkQslcakXdJLKgSdwjRUgVZgvYZ
+b7kAx1iPq0t/AhB3NJw3zW4AAKJohGg3xj5K4V8PJEZrSIpoRYlF43Kqlfu2p5gh
+WT89SP4YAlWPeTqf0+dTYUYz3b144k2ZFOdRuXIRxunoYNAUr9oMrxBXbJ/eY+0U
+QX3pBACYzKizyY4JJgd0zFJmNkcdK9nzcm+btYFnYQo33w5GSE686UNr+9yiXt9t
+mPRvNEbj3u+xoAX8B/5k3aZ5NbUhV64/VcKlUdRIxNlFCG7I9KgxeHWAYwi7yqOG
+XM3T/v6o7GLdQEB0ChFqS7kUlqmwLV+C3QhlrFe/Cuk26i+Q6rQiRmVkb3JhIFBy
+b2plY3QgPGZlZG9yYUByZWRoYXQuY29tPohbBBMRAgAbBQI/nZ07BgsJCAcDAgMV
+AgMDFgIBAh4BAheAAAoJELRCadBPKm/S2PAAnRTlhorITphab+oxAHtbxZF9BVyD
+AJ9WOVaZUG53IWWIAXOGv3j/cmr3lohGBBMRAgAGBQI/nZ22AAoJECGRgM3bQqYO
+R5QAoIp1G+omVktq/snxpmz5UeHjlSYjAKCRr/ea/L7S7ZTxB18cf1TYfad1x4hG
+BBARAgAGBQI/ntjgAAoJECnVuiSN9W0FUSUAoJnrone4J0o1HMkRz+6g9KVuO2Fy
+AJ0XyebOzVmI9U5OyOfnNmYV0wnQcrkBDQQ/nZ08EAQAugOfLWJbKwMA9vg2mJU5
+94TZU0HRJkx/fqYhx0YxWWRpzplrEyvcDXuYcWi1Hwh0tD86T4fR5GV6joWiWClz
+D+Hwhhb6gcSdeSGlGLlZAvWYtFSHWiv+3LaI9w8Vtczl99Bh2WiMDNDDGw0RQg6Z
+aftldLSe4j1pffpFGQ8SuisAAwUEAKVxqLT7fC5xQ6oclcZ+PhoDlePQ1BiTS7tu
+GM07bFF4nNvY91LL7S31pooz3XbGSWP8jxzSv1Fw35YhSmWGOBOEXluqMbVQGJJ5
+m8fqJOjC0imbfeWgr/T7zLrJeiljDxvX+6TyawyWQngF6v1Hq6FRV0O0bOp9Npt5
+zqCbDGs/iEYEGBECAAYFAj+dnTwACgkQtEJp0E8qb9L//gCcDVYnDegNCOxDn1se
+dDwxw+0h8OcAn1CZHof15QqxnTwEnvwF2QeOI5dn
+=mJAx
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-fedora-extras b/src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-fedora-extras
new file mode 100644
index 00000000..e89f1643
--- /dev/null
+++ b/src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-fedora-extras
@@ -0,0 +1,35 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.0.7 (GNU/Linux)
+
+mQGiBEG+vu8RBACyH3cUSp+DXbyIvZ075bGDhjhRCf8m44UW2cCQdO/45CJBkRnC
+AA6SHthCrXCVKIuuo1jSwy8kMXt1P/7IpF6Tc8ZMzcHKTyNetuuD/A7oavgnrJNb
+QVTScqbD6VrvjUAPpDz5TMPqMMFYwylp+ySKMQpoPOYoqdNE3XwnA5vOywCg44+S
+KDWIV0j5xCeIAoa47VmgF2cEAK/FIZRkbb7+i2Fob1mxKsnuLN/xx67aBpU2w7HO
+scVnkke08lRestDVk/6xb+lrq+gVLdNBfAANBrOcwRv2heu+Zu3PZGuC166/JWFM
+kx5a9TkI0zQAw72LqKeX4VDBRz5fUoIs/C+3aGc5Mh+h8fZYjJGf0kr/90rnd/0e
+WqsBA/9ONArdHN44aICt7xku/t98p9Da04A7kRYTHlLrBk5i0U4JJXKei7ZAzNi4
+Or//8ATepQdsBMCJVx1Ss/vJKxupLG9Mw43nbNuA5SmOSPnAoyglYadKyaUXBbVj
+mkqf9ZkjOMfD5u9PEWMWMq3f8uf05qxsrBDeiyc7Fk0jBYTvnrQ4RmVkb3JhIFBy
+ZSBFeHRyYXMgUmVsZWFzZSA8cHJlLWV4dHJhc0BmZWRvcmFwcm9qZWN0Lm9yZz6I
+XgQTEQIAHgUCQb6+7wIbAwYLCQgHAwIDFQIDAxYCAQIeAQIXgAAKCRCC7ZUEGscM
+5uAMAKC+XaPSCYIpdcmJYEe9rNxYMz/hLwCeOyBYUYA2L0WnbfXuNafRqwta/s2I
+RgQSEQIABgUCQgD+/AAKCRC0QmnQTypv0lVYAJoCLolPSuAj873GbV2+m3Bj6sS/
+UACeNcDmIWeruRld83uSQcx4xJyEOUa0KUZlZG9yYSBQcm9qZWN0IDxmZWRvcmEt
+ZXh0cmFzQHJlZGhhdC5jb20+iF4EExECAB4FAkIAeFQCGwMGCwkIBwMCAxUCAwMW
+AgECHgECF4AACgkQgu2VBBrHDOYu8wCffLm57mvcYApV7eqvHXr29gNAbLwAoJVq
+JWvgBIvg8/4MiqwKAQ1MDkIUiEYEEhECAAYFAkIA/wQACgkQtEJp0E8qb9LQJACf
+c0LteS513+5O6erQO7RBUxC/NI4AniDHK+Ogf5l5Gs2ciwD+WApsZ4mPtDBGZWRv
+cmEgUHJvamVjdCA8ZmVkb3JhLWV4dHJhc0BmZWRvcmFwcm9qZWN0Lm9yZz6IXgQT
+EQIAHgUCQgB4iQIbAwYLCQgHAwIDFQIDAxYCAQIeAQIXgAAKCRCC7ZUEGscM5gZ7
+AJ9n8CYN6nvMqxCbQQZwvs7e/J4//QCeM3nDwC5EfEbEtOHPIYAqTf3IQZaIRgQS
+EQIABgUCQgD/BAAKCRC0QmnQTypv0qKuAJ0cnqk9BbbblRSBbn72bK/BAquzywCe
+M7S0C6rfrYlfOjQHQdVB5GitT9u5AQ0EQb6+8RAEAJmsZ5apOFz0Fj6RwX0D+nOU
+Atdzd3zpTNzu4j8+L750ePutjuwizEmCxKycchuG+gGasLmdxY+xk5AUB7gLt4ms
+eKsWyHvQt+H4wG8jjOjHWXlaJkZaYQUxpVPd6/11hkoqpodJ9ckfoIJnpUJWDcd3
+HTW7jdq+ZtBXjQlwvh3HAAMHA/9g50+hqjn23d91SaFTkvaAySZYHEF/xm5sOV1X
+Z37XNFdl7JRl6BN7y59PE9Nk6qP4yHqH1G2YNDL3BmejChMF5GmEqluNdnvfFvwk
+yqPvE7qCv8BhktPqsnrpFmtfeDFI4vztD08oab9LdkDvQwLHBZpc+wCb4VJzOkaZ
+7e7VP4hJBBgRAgAJBQJBvr7xAhsMAAoJEILtlQQaxwzmxdYAn3X4X/ENC3V4yPDR
+7X6oVeIVr5fvAJ4n5vY10NpvYKV5arzKd8DSW2m5Bg==
+=N/fy
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-fedora-legacy b/src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-fedora-legacy
new file mode 100644
index 00000000..d15e7e90
--- /dev/null
+++ b/src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-fedora-legacy
@@ -0,0 +1,30 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.0.7 (GNU/Linux)
+
+mQGiBEALkQkRBACCBCp/a5rsqy2Q0NW/2OMkYtsb3k5M6dsQYoHDLiZK4VG1j+Bf
+2zzp+HJiUnLFp/l7mROuRioU9/UHpEYFIVunBYXeZf84OxB+mruh9UZtYn3oVXtH
+oaMI7hIFirTZ5eEY7zrfvTbvZ2Sm5cE3F2G5sWVOfxhl5opinuWN4xtSwwCggooh
+LqarkF4KN6D8xoyjrhLaxiMD/Az7RE6oH0Vwl9dX7YmccymDEesT5Ql6Q5FvfkuZ
+F5ZaQwaBO2ko2hMMh2AdCxoYAZPjWqC5r6Wy9P8hMfh+A0S4zon2DE/r0d4vLEY2
+HoptwtElq6gpltydx+/vXhZWkwCO//Kz9wXgZr496KtGXmEKYtdlVScBW6OvdyyD
+18zeA/9RuY59C7uxxe6cu7amqjP52xx5rHGkdJD5E8o3rmjdsr9tJ3FcjtIV0DV2
+BkfLIMnsp2gd972n7JBzlA9LJ+JTtMzvf9WdrErpRz1VeI1jHe4/hNGe3hd6xJIE
+rxj5FH+LwTj3vfErZdKsWOuudNkz1N4AwZr/k05gV3bi7j8RCLRIRmVkb3JhIExl
+Z2FjeSAoaHR0cDovL3d3dy5mZWRvcmFsZWdhY3kub3JnKSA8c2Vjbm90aWNlQGZl
+ZG9yYWxlZ2FjeS5vcmc+iFkEExECABkFAkALkQkECwcDAgMVAgMDFgIBAh4BAheA
+AAoJEBCMRRJzEAL686wAn3bA5dioMd0UDpUaES9TglLDpONbAJ467XWdHHwhxuHz
+oxWc3q7rWPBinLkCDQRAC5EuEAgAsPAVcrvrKB1A/hxoM61KEgaLB9GnGUOgoaV6
+I58stO3sxaxj3bblrpIJjo02BA49xrtL8kpqjKveABThVC1yiSYfySmXKHlO09cv
+A+qj+QSxieRciFKc50F1+j8q5Hqcigxzwhr4sJt5IhAx6HIwar5uxNNBgE98JN42
+GthUH39G+alRmzVd+3gQCLFroJSzHtFX7IlwHM33owAZwIVGlUhlBTHdbsvGf0xG
+mPYkI+JAUXpTTsnP7kR0/Ktm3zAHBEMw19eqQ5MSwVo28cA+jq2sLrL5DiE5quCd
+tB/RVnUUdbfN/o8sN6yxssNB6ZOB61l0K8bvm+9Qgstn/EQFSwADBggAmmFJueD1
+iXehZsRtaH+qZw7z6Q6jUPxDTiuVPhLkUux3wOSWMOp6S+ZYliCaw32TBKgE2SwT
+NnvTJYsuGLf3ECxOxMmu2McDHYZM82zRV4PRBMKFfiOa67/x5lhZgEkqf9TO+wk5
+M67GYbjZoyBaYEiE+eWD2cdema3n3zXzy+q2UEkHkzHx6ME9dRrgND3EW2hC9GJ6
+7wY9h+BlUR6Am4o0/ZLZJ2QEvyVnlI3/zZo9L6h8waZKI4l16nuDr/O8z2UOYc/X
+OMwBJCVwvbB2Z/f91dhy2EVWJZyyZBCG/FMXXDchxKwJOOQgrVbxWGDIMSdyHLUL
+2FuWnC/vdKc7wYhGBBgRAgAGBQJAC5EuAAoJEBCMRRJzEAL6wkcAnAlIrH0JuGjL
+T17HoheG/iUbj4Z4AJ9b/7OPGgNglwrLQJfihyPzManKYw==
+=wmoy
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-fedora-rawhide b/src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-fedora-rawhide
new file mode 100644
index 00000000..f61eeb11
--- /dev/null
+++ b/src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-fedora-rawhide
@@ -0,0 +1,21 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.0.7 (GNU/Linux)
+
+mQGiBD+doUwRBADudl/P8RqkzaHstvwbT93MByo7yX+xHcr0FaVAoG9Qfn+2O0qy
+nbNIz9BoieCx9zfgruBBaYjcT1p7QjdyfvF3wLq6ak84ne+QW91rctzqG8JqPhSB
+e34L7T0JnsUdiLfnfq895Hy67SYTOcJ6sN1Eg/eKYPP0CHKL9BY9atGRZwCg14Kh
+va6OSfIDyV6DNnfYF+cUSwsEALARvclTS8lLL+4sgZthg4D4Od4mYayr0QpKpoBI
+0RxOj26v038unOGqEjjqX/F36PwQv6wt6DmaGd9atQ/VUqW4cnKmNfaxJVAqznqW
+q80FKzTPH/JC/20v/5xx0FoxEVSCoKs2YPdXEQfEUAzNG9JC4GHNCxt2Gtnt4o5l
+sn15BADepds5sa/ptu//hJcYhrvcgzUJQR/JQdDbtK+Rzrvi2oZQFZUHzCVVxxfE
+0AULmX5bEC08nAGtp418ceeo1PdqlcVE+kaxuFpPgto/Sd1FvJW4P2B1a7rcUjGc
+BarOMVY8QpFZs5iIlkzZdPns1BCijWlhltOiyrdxyNrM49hjlrRGRmVkb3JhIFBy
+b2plY3QgYXV0b21hdGVkIGJ1aWxkIHNpZ25pbmcga2V5ICgyMDAzKSA8cmF3aGlk
+ZUByZWRoYXQuY29tPohbBBMRAgAbBQI/naFMBgsJCAcDAgMVAgMDFgIBAh4BAheA
+AAoJEOE4XU4c3byppW8An385Vt7LXSAIHqdH85QTCH512cr+AJ9vB4inXB6lxOoq
+sbnKY0HG4Sr1IIhGBBMRAgAGBQI/naOPAAoJELRCadBPKm/SFMgAn2/FfBhf2Yov
+j3gH8Z1t+bbsHRkLAJ94tjdweTZmfZsQZ7YaDXpeJ2iY+4hGBBARAgAGBQI/ntkG
+AAoJECnVuiSN9W0Fi5gAn3wSpemY+8rq8aFfRLEumrSksfUoAJ95YyaGdRXv+fWt
+KfPJSNTqsqhiKA==
+=umuG
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-fedora-test b/src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-fedora-test
new file mode 100644
index 00000000..efb8d813
--- /dev/null
+++ b/src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-fedora-test
@@ -0,0 +1,20 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.0.7 (GNU/Linux)
+
+mQGiBD+do/cRBACAF7Gv91v32uUrT4nZe+qKgLl59HmtvmaOzT4lInrF95Sget7p
+2TpnIqh5H0x0VGpdoeNfHvlXCw+aP50mTJv91BYmLfelkTzokqpEU5YpqGOqa5BV
+jelnoK1VKOcXMB28d79Gz9tn7friZN4SnyWbcSIA4C3dHNhsjifIYf0rywCg3y19
+3N6jODa0VSGeeEb4whE2xccD/i/rqk0MQmW6td2Dz2jTBaHxyf7FIcH18YDtwraD
+otBRxqGkTVyFGc1q7ZTrRsbzdjIfxbp2C6GT2VJ5kHuRm9jf7JdW5fOhun+oLimR
+erTlrPmgz8qQRcqUm6fkmUsYufL1u7DdyfxX7jI2ngkbAR+CsZ8Cj5JhBMeAXc/D
+WWhPA/4mzZ70hn1OrGLokzxNr4O7u1+n0thsxGN0qfuTNGIc09UKCoAN42he7Qjs
+kIqiE7gLtLzx8elxVOK19tNcaAiLoqmtxlLQqB03pLy4V0tMP9QcWQETbc67qTd1
+zASiefGjf364j4lQd+X9AqdyhUrnax3UgPD5IxilBp92Cw7Qi7QzRmVkb3JhIFBy
+b2plY3QgKFRlc3QgU29mdHdhcmUpIDxyYXdoaWRlQHJlZGhhdC5jb20+iFsEExEC
+ABsFAj+do/cGCwkIBwMCAxUCAwMWAgECHgECF4AACgkQ2oTL1DDJ7Pgh8QCgqNNs
+b7xdW+UhzyZw+DEAQF6e+q4AmwVus4u9REyd/aigK2RvrdtcsNy0iEYEExECAAYF
+Aj+dpBoACgkQtEJp0E8qb9Ji4QCfanY0CXnRwtBnm8GEMRNqgfGgcc0AnRunlejp
+JRxGPaRsmY/11stYll32iEYEEBECAAYFAj+e2SIACgkQKdW6JI31bQWWNQCfTKcX
+/7lerpwIVHcAILDduz9qxssAn1t46ERJ9EqsxJxSFlN7oBPyNkt6
+=R9He
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-rawhide b/src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-rawhide
new file mode 100644
index 00000000..2cb42458
--- /dev/null
+++ b/src/lib/distro-info/fedora-6_x86_64/trusted-package-keys/RPM-GPG-KEY-rawhide
@@ -0,0 +1,24 @@
+By using `rpm -K' and the GNU GPG package, the following public key can be
+used to verify RPM packages built and signed by Red Hat, Inc. for rawhide
+and testing. Questions about this key should be sent to
+security@redhat.com.
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.0.7 (GNU/Linux)
+
+mQGiBD9DmVMRBACW9LRPUtKnUTNeSQN5huiPA0+d0hGLTEG1kkUj47zWC3RXZ1Xh
+c/6yzWOrPk85Q7ys/dGoLLqsfekkxDVipUE0iS+47VMYgm531x4cd2oKnQb3Z/2R
+3A6kjDkc2KyTmfOsZ8DTdL76u81Rnv6MCQjXTJCFOQzv3yxmn6ZDhOoSkwCg24J2
+Qh0zuvvtyfNMsj+S8ksase8D/1qQgcURZDYZkaxrQSsdyZWsqb4NT51snXG5wE4L
+Yh1VGH26YU/kY7YxU5TPo8kbQTztkqaoFHk/O6zx+Q/iS8Izv2ByTsZv0F/Weym7
+Fyf+x+PTA7oDvV9hN/aJy/UPF+t4GRrsEV2mH8Ee3hIZGKSWwTwZZh+JyfIcqkyU
+zwY9BACLOZ8xZjHzU4MjZw2qgWemr96Zyr2foGl0+2G1STnluWf24//nNWBiLFuA
+txucItsppnUM0qB5RZ69N4c9MOmCZkBoahP3Q30qAsaAN4RaaE6AG7Yms0wtPW3m
+qzzhcuCtRAumXqA/oQWYqmHaEwUPenJaxut5rasApm2r5QxaQbRFUmVkIEhhdCwg
+SW5jLiBhdXRvbWF0ZWQgYnVpbGQgc2lnbmluZyBrZXkgKDIwMDMpIDxyYXdoaWRl
+QHJlZGhhdC5jb20+iFsEExECABsFAj9DmVMGCwkIBwMCAxUCAwMWAgECHgECF4AA
+CgkQlM1XQuQY46oixwCfUKmLRHSIBd1FbGTaR5ARBfSsK+MAn1BfxKyahkQ0ScN7
+9RNaYei9kxGIiEYEExECAAYFAj9DvtMACgkQIZGAzdtCpg5exACeJlj9DExab5AK
+C0eQHr8td+WRJ0QAnRNDGXQCBENRgFNgcecDMAr7P6se
+=LmwA
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/scilin-4.7/export-filter.example b/src/lib/distro-info/scilin-4.7/export-filter.example
new file mode 100644
index 00000000..a414fef4
--- /dev/null
+++ b/src/lib/distro-info/scilin-4.7/export-filter.example
@@ -0,0 +1,15 @@
+# this file defines the filter rules used when exporting a vendor-OS
+# of this distro
+#
+# copy this file to 'export-filter' and add your own filters to it
+# in order to overrule the filters provided by openslx
+#
+#Examples:
+# the following line would include anything below /var/spool/
+#+ /var/spool/*
+#
+# this would exclude anything in /etc that starts with dhcpd.conf
+#- /etc/dhcpd.conf*
+#
+# and this would exclude all rpmnew-files:
+#- *.rpmnew
diff --git a/src/lib/distro-info/scilin-4.7/prereqfiles/etc/group b/src/lib/distro-info/scilin-4.7/prereqfiles/etc/group
new file mode 100644
index 00000000..505cb221
--- /dev/null
+++ b/src/lib/distro-info/scilin-4.7/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/src/lib/distro-info/scilin-4.7/prereqfiles/etc/hosts b/src/lib/distro-info/scilin-4.7/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/scilin-4.7/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/scilin-4.7/prereqfiles/etc/passwd b/src/lib/distro-info/scilin-4.7/prereqfiles/etc/passwd
new file mode 100644
index 00000000..9b8fc4fe
--- /dev/null
+++ b/src/lib/distro-info/scilin-4.7/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/src/lib/distro-info/scilin-4.7/prereqfiles/etc/shadow b/src/lib/distro-info/scilin-4.7/prereqfiles/etc/shadow
new file mode 100644
index 00000000..cd100a5a
--- /dev/null
+++ b/src/lib/distro-info/scilin-4.7/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/src/lib/distro-info/scilin-4.7/settings.default b/src/lib/distro-info/scilin-4.7/settings.default
new file mode 100644
index 00000000..79f006fc
--- /dev/null
+++ b/src/lib/distro-info/scilin-4.7/settings.default
@@ -0,0 +1,30 @@
+bootstrap-packages = <<END
+ to-be-filled-in (List of base RPMs)
+END
+<metapackager yum>
+ packages = <<END
+ to-be-filled-in (List of RPMs for the YUM packager)
+ END
+</metapackager>
+package-subdir = ???
+prereq-packages = <<END
+ to-be-filled-in (List of needed RPMs)
+END
+<repository base>
+ name = Scientific Linux 4.7
+ repo-subdir = ?
+ file-for-speedtest = ?
+</repository>
+<selection minimal>
+ packages = <<END
+ glibc-locale
+ END
+</selection>
+<selection kde>
+ base = minimal
+ packages = <<END
+ END
+</selection>
+<selection default>
+ base = minimal
+</selection>
diff --git a/src/lib/distro-info/scilin-4.7/settings.example b/src/lib/distro-info/scilin-4.7/settings.example
new file mode 100644
index 00000000..5ae02428
--- /dev/null
+++ b/src/lib/distro-info/scilin-4.7/settings.example
@@ -0,0 +1,17 @@
+# rename this file to 'settings' and edit it as you please
+#
+# for a list of all options, have a look at the corresponding
+# settings.default in /opt/openslx/share/distro-info
+
+# use local installation source
+#<repository base>
+# local-url = /srv/ftp/pub/some-distribution/inst-source
+#</repository>
+
+# add a new selection:
+#<selection my_number_crunsher>
+# base = minimal
+# packages = <<END
+# crunsher_app
+# END
+#</selection>
diff --git a/src/lib/distro-info/scilin-5.3/export-filter.example b/src/lib/distro-info/scilin-5.3/export-filter.example
new file mode 100644
index 00000000..a414fef4
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.3/export-filter.example
@@ -0,0 +1,15 @@
+# this file defines the filter rules used when exporting a vendor-OS
+# of this distro
+#
+# copy this file to 'export-filter' and add your own filters to it
+# in order to overrule the filters provided by openslx
+#
+#Examples:
+# the following line would include anything below /var/spool/
+#+ /var/spool/*
+#
+# this would exclude anything in /etc that starts with dhcpd.conf
+#- /etc/dhcpd.conf*
+#
+# and this would exclude all rpmnew-files:
+#- *.rpmnew
diff --git a/src/lib/distro-info/scilin-5.3/prereqfiles/etc/group b/src/lib/distro-info/scilin-5.3/prereqfiles/etc/group
new file mode 100644
index 00000000..505cb221
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.3/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/src/lib/distro-info/scilin-5.3/prereqfiles/etc/hosts b/src/lib/distro-info/scilin-5.3/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.3/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/scilin-5.3/prereqfiles/etc/passwd b/src/lib/distro-info/scilin-5.3/prereqfiles/etc/passwd
new file mode 100644
index 00000000..9b8fc4fe
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.3/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/src/lib/distro-info/scilin-5.3/prereqfiles/etc/shadow b/src/lib/distro-info/scilin-5.3/prereqfiles/etc/shadow
new file mode 100644
index 00000000..cd100a5a
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.3/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/src/lib/distro-info/scilin-5.3/settings.default b/src/lib/distro-info/scilin-5.3/settings.default
new file mode 100644
index 00000000..9f964927
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.3/settings.default
@@ -0,0 +1,30 @@
+bootstrap-packages = <<END
+ to-be-filled-in (List of base RPMs)
+END
+<metapackager yum>
+ packages = <<END
+ to-be-filled-in (List of RPMs for the YUM packager)
+ END
+</metapackager>
+package-subdir = ???
+prereq-packages = <<END
+ to-be-filled-in (List of needed RPMs)
+END
+<repository base>
+ name = Scientific Linux 5.3
+ repo-subdir = ?
+ file-for-speedtest = ?
+</repository>
+<selection minimal>
+ packages = <<END
+ glibc-locale
+ END
+</selection>
+<selection kde>
+ base = minimal
+ packages = <<END
+ END
+</selection>
+<selection default>
+ base = minimal
+</selection>
diff --git a/src/lib/distro-info/scilin-5.3/settings.example b/src/lib/distro-info/scilin-5.3/settings.example
new file mode 100644
index 00000000..5ae02428
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.3/settings.example
@@ -0,0 +1,17 @@
+# rename this file to 'settings' and edit it as you please
+#
+# for a list of all options, have a look at the corresponding
+# settings.default in /opt/openslx/share/distro-info
+
+# use local installation source
+#<repository base>
+# local-url = /srv/ftp/pub/some-distribution/inst-source
+#</repository>
+
+# add a new selection:
+#<selection my_number_crunsher>
+# base = minimal
+# packages = <<END
+# crunsher_app
+# END
+#</selection>
diff --git a/src/lib/distro-info/scilin-5.4/export-filter.example b/src/lib/distro-info/scilin-5.4/export-filter.example
new file mode 100644
index 00000000..a414fef4
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.4/export-filter.example
@@ -0,0 +1,15 @@
+# this file defines the filter rules used when exporting a vendor-OS
+# of this distro
+#
+# copy this file to 'export-filter' and add your own filters to it
+# in order to overrule the filters provided by openslx
+#
+#Examples:
+# the following line would include anything below /var/spool/
+#+ /var/spool/*
+#
+# this would exclude anything in /etc that starts with dhcpd.conf
+#- /etc/dhcpd.conf*
+#
+# and this would exclude all rpmnew-files:
+#- *.rpmnew
diff --git a/src/lib/distro-info/scilin-5.4/prereqfiles/etc/group b/src/lib/distro-info/scilin-5.4/prereqfiles/etc/group
new file mode 100644
index 00000000..505cb221
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.4/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/src/lib/distro-info/scilin-5.4/prereqfiles/etc/hosts b/src/lib/distro-info/scilin-5.4/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.4/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/scilin-5.4/prereqfiles/etc/passwd b/src/lib/distro-info/scilin-5.4/prereqfiles/etc/passwd
new file mode 100644
index 00000000..9b8fc4fe
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.4/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/src/lib/distro-info/scilin-5.4/prereqfiles/etc/shadow b/src/lib/distro-info/scilin-5.4/prereqfiles/etc/shadow
new file mode 100644
index 00000000..cd100a5a
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.4/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/src/lib/distro-info/scilin-5.4/settings.default b/src/lib/distro-info/scilin-5.4/settings.default
new file mode 100644
index 00000000..5b86aab9
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.4/settings.default
@@ -0,0 +1,30 @@
+bootstrap-packages = <<END
+ to-be-filled-in (List of base RPMs)
+END
+<metapackager yum>
+ packages = <<END
+ to-be-filled-in (List of RPMs for the YUM packager)
+ END
+</metapackager>
+package-subdir = ???
+prereq-packages = <<END
+ to-be-filled-in (List of needed RPMs)
+END
+<repository base>
+ name = Scientific Linux 5.4
+ repo-subdir = ?
+ file-for-speedtest = ?
+</repository>
+<selection minimal>
+ packages = <<END
+ glibc-locale
+ END
+</selection>
+<selection kde>
+ base = minimal
+ packages = <<END
+ END
+</selection>
+<selection default>
+ base = minimal
+</selection>
diff --git a/src/lib/distro-info/scilin-5.4/settings.example b/src/lib/distro-info/scilin-5.4/settings.example
new file mode 100644
index 00000000..5ae02428
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.4/settings.example
@@ -0,0 +1,17 @@
+# rename this file to 'settings' and edit it as you please
+#
+# for a list of all options, have a look at the corresponding
+# settings.default in /opt/openslx/share/distro-info
+
+# use local installation source
+#<repository base>
+# local-url = /srv/ftp/pub/some-distribution/inst-source
+#</repository>
+
+# add a new selection:
+#<selection my_number_crunsher>
+# base = minimal
+# packages = <<END
+# crunsher_app
+# END
+#</selection>
diff --git a/src/lib/distro-info/scilin-5.4_x86_64/export-filter.example b/src/lib/distro-info/scilin-5.4_x86_64/export-filter.example
new file mode 100644
index 00000000..a414fef4
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.4_x86_64/export-filter.example
@@ -0,0 +1,15 @@
+# this file defines the filter rules used when exporting a vendor-OS
+# of this distro
+#
+# copy this file to 'export-filter' and add your own filters to it
+# in order to overrule the filters provided by openslx
+#
+#Examples:
+# the following line would include anything below /var/spool/
+#+ /var/spool/*
+#
+# this would exclude anything in /etc that starts with dhcpd.conf
+#- /etc/dhcpd.conf*
+#
+# and this would exclude all rpmnew-files:
+#- *.rpmnew
diff --git a/src/lib/distro-info/scilin-5.4_x86_64/prereqfiles/etc/group b/src/lib/distro-info/scilin-5.4_x86_64/prereqfiles/etc/group
new file mode 100644
index 00000000..505cb221
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.4_x86_64/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/src/lib/distro-info/scilin-5.4_x86_64/prereqfiles/etc/hosts b/src/lib/distro-info/scilin-5.4_x86_64/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.4_x86_64/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/scilin-5.4_x86_64/prereqfiles/etc/passwd b/src/lib/distro-info/scilin-5.4_x86_64/prereqfiles/etc/passwd
new file mode 100644
index 00000000..9b8fc4fe
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.4_x86_64/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/src/lib/distro-info/scilin-5.4_x86_64/prereqfiles/etc/shadow b/src/lib/distro-info/scilin-5.4_x86_64/prereqfiles/etc/shadow
new file mode 100644
index 00000000..cd100a5a
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.4_x86_64/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/src/lib/distro-info/scilin-5.4_x86_64/settings.default b/src/lib/distro-info/scilin-5.4_x86_64/settings.default
new file mode 100644
index 00000000..fdc4f5f4
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.4_x86_64/settings.default
@@ -0,0 +1,30 @@
+bootstrap-packages = <<END
+ to-be-filled-in (List of base RPMs)
+END
+<metapackager yum>
+ packages = <<END
+ to-be-filled-in (List of RPMs for the YUM packager)
+ END
+</metapackager>
+package-subdir = ???
+prereq-packages = <<END
+ to-be-filled-in (List of needed RPMs)
+END
+<repository base>
+ name = Scientific Linux 5.4 64Bit
+ repo-subdir = ?
+ file-for-speedtest = ?
+</repository>
+<selection minimal>
+ packages = <<END
+ glibc-locale
+ END
+</selection>
+<selection kde>
+ base = minimal
+ packages = <<END
+ END
+</selection>
+<selection default>
+ base = minimal
+</selection>
diff --git a/src/lib/distro-info/scilin-5.4_x86_64/settings.example b/src/lib/distro-info/scilin-5.4_x86_64/settings.example
new file mode 100644
index 00000000..5ae02428
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.4_x86_64/settings.example
@@ -0,0 +1,17 @@
+# rename this file to 'settings' and edit it as you please
+#
+# for a list of all options, have a look at the corresponding
+# settings.default in /opt/openslx/share/distro-info
+
+# use local installation source
+#<repository base>
+# local-url = /srv/ftp/pub/some-distribution/inst-source
+#</repository>
+
+# add a new selection:
+#<selection my_number_crunsher>
+# base = minimal
+# packages = <<END
+# crunsher_app
+# END
+#</selection>
diff --git a/src/lib/distro-info/scilin-5.5/export-filter.example b/src/lib/distro-info/scilin-5.5/export-filter.example
new file mode 100644
index 00000000..a414fef4
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.5/export-filter.example
@@ -0,0 +1,15 @@
+# this file defines the filter rules used when exporting a vendor-OS
+# of this distro
+#
+# copy this file to 'export-filter' and add your own filters to it
+# in order to overrule the filters provided by openslx
+#
+#Examples:
+# the following line would include anything below /var/spool/
+#+ /var/spool/*
+#
+# this would exclude anything in /etc that starts with dhcpd.conf
+#- /etc/dhcpd.conf*
+#
+# and this would exclude all rpmnew-files:
+#- *.rpmnew
diff --git a/src/lib/distro-info/scilin-5.5/prereqfiles/etc/group b/src/lib/distro-info/scilin-5.5/prereqfiles/etc/group
new file mode 100644
index 00000000..505cb221
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.5/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/src/lib/distro-info/scilin-5.5/prereqfiles/etc/hosts b/src/lib/distro-info/scilin-5.5/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.5/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/scilin-5.5/prereqfiles/etc/passwd b/src/lib/distro-info/scilin-5.5/prereqfiles/etc/passwd
new file mode 100644
index 00000000..9b8fc4fe
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.5/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/src/lib/distro-info/scilin-5.5/prereqfiles/etc/shadow b/src/lib/distro-info/scilin-5.5/prereqfiles/etc/shadow
new file mode 100644
index 00000000..cd100a5a
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.5/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/src/lib/distro-info/scilin-5.5/settings.default b/src/lib/distro-info/scilin-5.5/settings.default
new file mode 100644
index 00000000..29996f63
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.5/settings.default
@@ -0,0 +1,30 @@
+bootstrap-packages = <<END
+ to-be-filled-in (List of base RPMs)
+END
+<metapackager yum>
+ packages = <<END
+ to-be-filled-in (List of RPMs for the YUM packager)
+ END
+</metapackager>
+package-subdir = ???
+prereq-packages = <<END
+ to-be-filled-in (List of needed RPMs)
+END
+<repository base>
+ name = Scientific Linux 5.5
+ repo-subdir = ?
+ file-for-speedtest = ?
+</repository>
+<selection minimal>
+ packages = <<END
+ glibc-locale
+ END
+</selection>
+<selection kde>
+ base = minimal
+ packages = <<END
+ END
+</selection>
+<selection default>
+ base = minimal
+</selection>
diff --git a/src/lib/distro-info/scilin-5.5/settings.example b/src/lib/distro-info/scilin-5.5/settings.example
new file mode 100644
index 00000000..5ae02428
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.5/settings.example
@@ -0,0 +1,17 @@
+# rename this file to 'settings' and edit it as you please
+#
+# for a list of all options, have a look at the corresponding
+# settings.default in /opt/openslx/share/distro-info
+
+# use local installation source
+#<repository base>
+# local-url = /srv/ftp/pub/some-distribution/inst-source
+#</repository>
+
+# add a new selection:
+#<selection my_number_crunsher>
+# base = minimal
+# packages = <<END
+# crunsher_app
+# END
+#</selection>
diff --git a/src/lib/distro-info/scilin-5.5_x86_64/export-filter.example b/src/lib/distro-info/scilin-5.5_x86_64/export-filter.example
new file mode 100644
index 00000000..a414fef4
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.5_x86_64/export-filter.example
@@ -0,0 +1,15 @@
+# this file defines the filter rules used when exporting a vendor-OS
+# of this distro
+#
+# copy this file to 'export-filter' and add your own filters to it
+# in order to overrule the filters provided by openslx
+#
+#Examples:
+# the following line would include anything below /var/spool/
+#+ /var/spool/*
+#
+# this would exclude anything in /etc that starts with dhcpd.conf
+#- /etc/dhcpd.conf*
+#
+# and this would exclude all rpmnew-files:
+#- *.rpmnew
diff --git a/src/lib/distro-info/scilin-5.5_x86_64/prereqfiles/etc/group b/src/lib/distro-info/scilin-5.5_x86_64/prereqfiles/etc/group
new file mode 100644
index 00000000..505cb221
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.5_x86_64/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/src/lib/distro-info/scilin-5.5_x86_64/prereqfiles/etc/hosts b/src/lib/distro-info/scilin-5.5_x86_64/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.5_x86_64/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/scilin-5.5_x86_64/prereqfiles/etc/passwd b/src/lib/distro-info/scilin-5.5_x86_64/prereqfiles/etc/passwd
new file mode 100644
index 00000000..9b8fc4fe
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.5_x86_64/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/src/lib/distro-info/scilin-5.5_x86_64/prereqfiles/etc/shadow b/src/lib/distro-info/scilin-5.5_x86_64/prereqfiles/etc/shadow
new file mode 100644
index 00000000..cd100a5a
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.5_x86_64/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/src/lib/distro-info/scilin-5.5_x86_64/settings.default b/src/lib/distro-info/scilin-5.5_x86_64/settings.default
new file mode 100644
index 00000000..7c0f832b
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.5_x86_64/settings.default
@@ -0,0 +1,30 @@
+bootstrap-packages = <<END
+ to-be-filled-in (List of base RPMs)
+END
+<metapackager yum>
+ packages = <<END
+ to-be-filled-in (List of RPMs for the YUM packager)
+ END
+</metapackager>
+package-subdir = ???
+prereq-packages = <<END
+ to-be-filled-in (List of needed RPMs)
+END
+<repository base>
+ name = Scientific Linux 5.5 64Bit
+ repo-subdir = ?
+ file-for-speedtest = ?
+</repository>
+<selection minimal>
+ packages = <<END
+ glibc-locale
+ END
+</selection>
+<selection kde>
+ base = minimal
+ packages = <<END
+ END
+</selection>
+<selection default>
+ base = minimal
+</selection>
diff --git a/src/lib/distro-info/scilin-5.5_x86_64/settings.example b/src/lib/distro-info/scilin-5.5_x86_64/settings.example
new file mode 100644
index 00000000..5ae02428
--- /dev/null
+++ b/src/lib/distro-info/scilin-5.5_x86_64/settings.example
@@ -0,0 +1,17 @@
+# rename this file to 'settings' and edit it as you please
+#
+# for a list of all options, have a look at the corresponding
+# settings.default in /opt/openslx/share/distro-info
+
+# use local installation source
+#<repository base>
+# local-url = /srv/ftp/pub/some-distribution/inst-source
+#</repository>
+
+# add a new selection:
+#<selection my_number_crunsher>
+# base = minimal
+# packages = <<END
+# crunsher_app
+# END
+#</selection>
diff --git a/src/lib/distro-info/suse-10.2/export-filter.example b/src/lib/distro-info/suse-10.2/export-filter.example
new file mode 100644
index 00000000..a414fef4
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2/export-filter.example
@@ -0,0 +1,15 @@
+# this file defines the filter rules used when exporting a vendor-OS
+# of this distro
+#
+# copy this file to 'export-filter' and add your own filters to it
+# in order to overrule the filters provided by openslx
+#
+#Examples:
+# the following line would include anything below /var/spool/
+#+ /var/spool/*
+#
+# this would exclude anything in /etc that starts with dhcpd.conf
+#- /etc/dhcpd.conf*
+#
+# and this would exclude all rpmnew-files:
+#- *.rpmnew
diff --git a/src/lib/distro-info/suse-10.2/mirrors/base b/src/lib/distro-info/suse-10.2/mirrors/base
new file mode 100644
index 00000000..fae4451d
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2/mirrors/base
@@ -0,0 +1,2 @@
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/discontinued/10.2/repo/oss
+http://download.opensuse.org/distribution/10.2/repo/oss \ No newline at end of file
diff --git a/src/lib/distro-info/suse-10.2/mirrors/base_non-oss b/src/lib/distro-info/suse-10.2/mirrors/base_non-oss
new file mode 100644
index 00000000..3ecadd23
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2/mirrors/base_non-oss
@@ -0,0 +1,2 @@
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/discontinued/10.2/repo/non-oss
+http://download.opensuse.org/distribution/10.2/repo/non-oss \ No newline at end of file
diff --git a/src/lib/distro-info/suse-10.2/mirrors/base_update b/src/lib/distro-info/suse-10.2/mirrors/base_update
new file mode 100644
index 00000000..5422bc2f
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2/mirrors/base_update
@@ -0,0 +1,6 @@
+http://distro.ibiblio.org/pub/linux/distributions/suse/suse/update/10.2
+http://lisa.gov.pt/ftp/suse/update/10.2
+http://mirrors.kernel.org/suse/update/10.2
+http://suse.cs.utah.edu/suse/update/10.2
+http://suse.mirrors.tds.net/pub/suse/update/10.2
+http://www.mirrorservice.org/sites/ftp.suse.com/pub/suse/update/10.2
diff --git a/src/lib/distro-info/suse-10.2/prereqfiles/etc/group b/src/lib/distro-info/suse-10.2/prereqfiles/etc/group
new file mode 100644
index 00000000..505cb221
--- /dev/null
+++ b/src/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/src/lib/distro-info/suse-10.2/prereqfiles/etc/hosts b/src/lib/distro-info/suse-10.2/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/suse-10.2/prereqfiles/etc/passwd b/src/lib/distro-info/suse-10.2/prereqfiles/etc/passwd
new file mode 100644
index 00000000..9b8fc4fe
--- /dev/null
+++ b/src/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/src/lib/distro-info/suse-10.2/prereqfiles/etc/shadow b/src/lib/distro-info/suse-10.2/prereqfiles/etc/shadow
new file mode 100644
index 00000000..cd100a5a
--- /dev/null
+++ b/src/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/src/lib/distro-info/suse-10.2/settings.default b/src/lib/distro-info/suse-10.2/settings.default
new file mode 100644
index 00000000..f17a1b0a
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2/settings.default
@@ -0,0 +1,1061 @@
+bootstrap-packages = <<END
+ 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/bzip2-1.0.3-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/glibc-2.5-25.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/popt-1.7-304.i586.rpm
+ i586/readline-5.1-55.i586.rpm
+ i586/reiserfs-3.6.19-37.i586.rpm
+ i586/rpm-4.4.2-76.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
+ i586/zlib-1.2.3-33.i586.rpm
+ noarch/pciutils-ids-2006.11.18-2.noarch.rpm
+ noarch/suse-build-key-1.0-707.noarch.rpm
+END
+<metapackager smart>
+ packages = <<END
+ i586/python-2.5-19.i586.rpm
+ i586/python-xml-2.5-19.i586.rpm
+ i586/rpm-python-4.4.2-76.i586.rpm
+ i586/smart-0.42-43.i586.rpm
+ END
+</metapackager>
+<metapackager yum>
+ packages = <<END
+ 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/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/rpm-python-4.4.2-76.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
+ END
+</metapackager>
+package-subdir = suse
+prereq-packages = <<END
+ 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
+END
+<repository base>
+ name = openSUSE 10.2
+ repo-subdir = suse
+ file-for-speedtest = suse/setup/descr/packages.en.gz
+</repository>
+<repository base_non-oss>
+ name = openSUSE 10.2 non-OSS
+ repo-subdir = suse
+ file-for-speedtest = suse/setup/descr/packages.en.gz
+</repository>
+<repository base_update>
+ name = openSUSE 10.2 updates
+ file-for-speedtest = repodata/primary.xml.gz
+</repository>
+<selection minimal>
+ packages = <<END
+ glibc-locale
+ END
+</selection>
+<selection textmode>
+ base = minimal
+ packages = <<END
+ acl
+ acpid
+ apparmor-docs
+ apparmor-profiles
+ apparmor-utils
+ ash
+ at
+ atk
+ attr
+ audit
+ autofs
+ autoyast2
+ bc
+ bind-libs
+ bind-utils
+ boost
+ bootsplash-theme-SuSE
+ compat
+ compat-libstdc++
+ compat-openssl097g
+ cpufrequtils
+ cron
+ cups-client
+ cyrus-sasl
+ cyrus-sasl-saslauthd
+ db-utils
+ deltarpm
+ dhcpcd
+ dmraid
+ dos2unix
+ dosfstools
+ ed
+ eject
+ ethtool
+ fbset
+ findutils
+ fontconfig
+ freetype2
+ gdb
+ gdbm
+ glib2
+ glibc-i18ndata
+ gpm
+ hal-resmgr
+ hfsutils
+ ifplugd
+ initviocons
+ inst-source-utils
+ iputils
+ joe
+ kbd
+ kernel-default
+ krb5
+ ksh
+ ksymoops
+ libacl
+ libapparmor
+ libart_lgpl
+ libattr
+ libcap
+ libcom_err
+ libdrm
+ libevent
+ libgcc41
+ libgcrypt
+ libgimpprint
+ libgpg-error
+ libicu
+ libidn
+ libjpeg
+ liblazy
+ liblcms
+ libltdl
+ libmng
+ libnscd
+ libopencdk
+ libpcap
+ libpng
+ librpcsecgss
+ libstdc++41
+ libtiff
+ libusb
+ libvolume_id
+ libxcrypt
+ lukemftp
+ lvm2
+ lzo
+ mailx
+ man
+ man-pages
+ microcode_ctl
+ module-init-tools
+ multipath-tools
+ nbd
+ ncurses
+ net-snmp
+ nfs-utils
+ nfsidmap
+ nscd
+ ntfsprogs
+ openSUSE-release
+ openct
+ opensc
+ openssh
+ openssl
+ patch
+ pax
+ perl-Crypt-SmbHash
+ perl-URI
+ perl-XML-Parser
+ perl-XML-Writer
+ postfix
+ powersave-libs
+ preload
+ procinfo
+ procmail
+ procps
+ providers
+ qlogic-firmware
+ recode
+ rrdtool
+ rsync
+ sash
+ screen
+ scsi
+ sensors
+ sharutils
+ smartmontools
+ smpppd
+ squashfs-kmp-default
+ strace
+ sudo
+ suse-build-key
+ suspend
+ sysfsutils
+ syslog-ng
+ tcpd
+ tcpdump
+ tcsh
+ telnet
+ terminfo
+ timezone
+ ulimit
+ usbutils
+ utempter
+ vim
+ wdiff
+ wget
+ wvstreams
+ xfsprogs
+ xinetd
+ xntp
+ yast2-apparmor
+ yast2-backup
+ yast2-bluetooth
+ yast2-bootfloppy
+ yast2-irda
+ yast2-iscsi-client
+ yast2-mail
+ yast2-ncurses
+ yast2-nis-client
+ yast2-ntp-client
+ yast2-online-update-frontend
+ yast2-power-management
+ yast2-powertweak
+ yast2-profile-manager
+ yast2-repair
+ yast2-restore
+ yast2-runlevel
+ yast2-samba-client
+ yast2-scanner
+ yast2-sudo
+ yast2-support
+ yast2-theme-openSUSE
+ yast2-trans-de
+ yast2-tv
+ ypbind
+ zip
+ zisofs-tools
+ zsh
+ END
+</selection>
+<selection kde>
+ base = textmode
+ packages = <<END
+ 3ddiag
+ 915resolution
+ a2ps
+ aaa_base
+ aaa_skel
+ aalib
+ acl
+ acpid
+ AdobeICCProfiles
+ agfa-fonts
+ alsa
+ amarok
+ amarok-libvisual
+ amarok-xine
+ apparmor-docs
+ apparmor-parser
+ apparmor-profiles
+ apparmor-utils
+ arts
+ ash
+ aspell
+ aspell-de
+ aspell-en
+ at
+ atk
+ attr
+ audiofile
+ audit
+ audit-libs
+ autofs
+ autoyast2
+ autoyast2-installation
+ bash
+ bc
+ bind-libs
+ bind-utils
+ binutils
+ blocxx
+ bluez-libs
+ bluez-utils
+ boost
+ bootsplash
+ bootsplash-theme-SuSE
+ bzip2
+ cabextract
+ cairo
+ cdparanoia
+ cdrdao
+ CheckHardware
+ checkmedia
+ chromium
+ classpath
+ compat
+ compat-libstdc++
+ compat-openssl097g
+ compiz
+ coreutils
+ cpio
+ cpp
+ cpp41
+ cpufrequtils
+ cracklib
+ cron
+ Crystalcursors
+ cups
+ cups-client
+ cups-drivers
+ cups-libs
+ curl
+ cyrus-sasl
+ cyrus-sasl-crammd5
+ cyrus-sasl-digestmd5
+ cyrus-sasl-plain
+ cyrus-sasl-saslauthd
+ db
+ dbus-1
+ dbus-1-glib
+ dbus-1-mono
+ dbus-1-qt3
+ dbus-1-x11
+ db-utils
+ dcraw
+ dejavu
+ deltarpm
+ desktop-data-SuSE
+ desktop-file-utils
+ desktop-translations
+ device-mapper
+ dhcdbd
+ dhcp
+ dhcpcd
+ dhcp-client
+ dialog
+ diffutils
+ digikam
+ digikamimageplugins
+ dirmngr
+ dmraid
+ dos2unix
+ dosbootdisk
+ dosfstools
+ dvd+rw-tools
+ e2fsprogs
+ ed
+ efont-unicode
+ eject
+ enscript
+ esound
+ ethtool
+ evms
+ evms-gui
+ exiftool
+ expat
+ fam
+ fbset
+ fftw3
+ file
+ fileshareset
+ filesystem
+ fillup
+ findutils
+ flac
+ flash-player
+ fontconfig
+ fonts-config
+ foomatic-filters
+ freealut
+ freeciv
+ freeglut
+ freetype
+ freetype2
+ fribidi
+ frozen-bubble
+ ft2demos
+ ftgl
+ fvwm2
+ gail
+ gawk
+ gcc41-gij
+ gcc-gij
+ gconf2
+ gdb
+ gdbm
+ gettext
+ ghostscript-fonts-other
+ ghostscript-fonts-std
+ ghostscript-library
+ ghostscript-x11
+ giflib
+ gimp
+ gimp-help
+ gle
+ glib
+ glib2
+ glibc
+ glibc-i18ndata
+ glib-sharp2
+ glitz
+ gmime
+ gmp
+ gnokii
+ gnome-filesystem
+ gnome-icon-theme
+ gnome-keyring
+ gnome-mime-data
+ gnome-vfs2
+ gnutls
+ gpart
+ gpg
+ gpg2
+ gpgme
+ gpm
+ GraphicsMagick
+ grep
+ groff
+ grub
+ gsf-sharp
+ gstreamer010
+ gstreamer010-plugins-base
+ gtk
+ gtk2
+ gtk-sharp2
+ gtksourceview
+ gutenprint
+ gwenview
+ gzip
+ hal
+ hal-resmgr
+ hdparm
+ hfsutils
+ hplip
+ hplip-hpijs
+ htdig
+ hwinfo
+ id3lib
+ ifnteuro
+ ifplugd
+ ImageMagick
+ ImageMagick-Magick++
+ imlib
+ imlib2
+ imlib2-loaders
+ info
+ info2html
+ initviocons
+ insserv
+ inst-source-utils
+ intlfnts
+ iproute2
+ iptables
+ iputils
+ irqbalance
+ ispell
+ ispell-american
+ ispell-german
+ ispell-ngerman
+ jack
+ java-1_4_2-gcj-compat
+ java-1_5_0-sun
+ java-1_5_0-sun-plugin
+ jfsutils
+ joe
+ jpackage-utils
+ jpeg
+ k3b
+ kaffeine
+ kbd
+ kcm_gtk
+ kde3-i18n-de
+ kdeaddons3-kicker
+ kdeaddons3-konqueror
+ kdeartwork3-kscreensaver
+ kdeartwork3-xscreensaver
+ kdebase3
+ kdebase3-kdm
+ kdebase3-ksysguardd
+ kdebase3-nsplugin
+ kdebase3-samba
+ kdebase3-session
+ kdebase3-SuSE
+ kdebluetooth
+ kdegames3
+ kdegraphics3
+ kdegraphics3-kamera
+ kdegraphics3-pdf
+ kdegraphics3-postscript
+ kdegraphics3-scan
+ kdelibs3
+ kdelibs3-doc
+ kdemultimedia3
+ kdemultimedia3-CD
+ kdemultimedia3-mixer
+ kdenetwork3
+ kdenetwork3-InstantMessenger
+ kdenetwork3-news
+ kdenetwork3-vnc
+ kdepim3
+ kdepim3-kpilot
+ kdepim3-networkstatus
+ kdepim3-notes
+ kdetv
+ kdeutils3
+ kernel-default
+ kio_ipodslave
+ kio_iso
+ kio_slp
+ kipi-plugins
+ kitchensync
+ klogd
+ knights
+ koffice
+ koffice-i18n-de
+ koffice-i18n-de-doc
+ koffice-illustration
+ konversation
+ kpowersave
+ krb5
+ krecord
+ ksh
+ ksudoku
+ ksymoops
+ ktorrent
+ kwin-decor-suse2
+ lbreakout
+ ldapcpplib
+ less
+ libacl
+ libakode
+ libao
+ libapparmor
+ libart_lgpl
+ libattr
+ libbeagle
+ libbonobo
+ libbonoboui
+ libcap
+ libcom_err
+ libcroco
+ libdrm
+ libevent
+ libexif
+ libgcc41
+ libgcj41
+ libgcrypt
+ libgimpprint
+ libglade2
+ libgnome
+ libgnomecanvas
+ libgnomecups
+ libgnomeprint
+ libgnomeprintui
+ libgnomesu
+ libgnomeui
+ libgpg-error
+ libgphoto2
+ libgpod
+ libgsf
+ libgsf-gnome
+ libgssapi
+ libgtkhtml
+ libical
+ libicu
+ libidl
+ libidn
+ libieee1284
+ libjasper
+ libjpeg
+ libkexif
+ libkipi
+ libksba
+ liblazy
+ liblcms
+ libltdl
+ libmal
+ libmikmod
+ libmng
+ libmpcdec
+ libmtp
+ libmusicbrainz
+ libnetpbm
+ libnjb
+ libnl
+ libnscd
+ libofa
+ libogg
+ liboil
+ libopencdk
+ libopensync
+ libopensync-plugin-file
+ libopensync-plugin-gnokii
+ libopensync-plugin-gpe
+ libopensync-plugin-irmc
+ libopensync-plugin-kdepim
+ libopensync-plugin-opie
+ libopensync-plugin-palm
+ libopensync-plugin-sunbird
+ libopensync-plugin-syncml
+ libopensync-tools
+ libpcap
+ libpng
+ libqt4
+ libqt4-dbus-1
+ libqt4-qt3support
+ libqt4-sql
+ libqt4-x11
+ libqtpod
+ librpcsecgss
+ librsvg
+ libsamplerate
+ libsmbclient
+ libsndfile
+ libsoup
+ libstdc++41
+ libstroke
+ libsyncml
+ libtheora
+ libtiff
+ libtunepimp
+ libusb
+ libvisual
+ libvolume_id
+ libvorbis
+ libwmf
+ libwnck
+ libxcrypt
+ libxml2
+ libxslt
+ liby2util
+ libzio
+ libzypp
+ libzypp-zmd-backend
+ limal
+ limal-bootloader
+ limal-perl
+ logrotate
+ lsb
+ lsof
+ lua-libs
+ lukemftp
+ lvm2
+ lzo
+ m4
+ mailx
+ make
+ man
+ man-pages
+ manufacturer-PPDs
+ master-boot-code
+ mdadm
+ mDNSResponder-lib
+ Mesa
+ metacity
+ microcode_ctl
+ mingetty
+ mkinitrd
+ mkisofs
+ mktemp
+ module-init-tools
+ mono-core
+ mono-data
+ mono-data-sqlite
+ mono-web
+ MozillaFirefox
+ MozillaFirefox-translations
+ mozilla-nspr
+ mozilla-nss
+ mozilla-xulrunner181
+ multipath-tools
+ myspell-american
+ myspell-german
+ ncurses
+ neon
+ netcat
+ netcfg
+ netpbm
+ net-snmp
+ net-tools
+ NetworkManager
+ NetworkManager-kde
+ nfsidmap
+ nfs-utils
+ nscd
+ ntfsprogs
+ numlockx
+ ocrad
+ openal
+ openct
+ OpenEXR
+ openldap2-client
+ openobex
+ OpenOffice_org
+ OpenOffice_org-de
+ OpenOffice_org-kde
+ OpenOffice_org-Quickstarter
+ opensc
+ openslp
+ openssh
+ openssh-askpass
+ openssl
+ opensuse-manual_de
+ opensuse-manual_en
+ openSUSE-release
+ orbit2
+ pam
+ pam-config
+ pam-modules
+ pango
+ parted
+ patch
+ pax
+ pciutils
+ pciutils-ids
+ pcre
+ pcsc-lite
+ perl
+ perl-Bootloader
+ perl-Compress-Zlib
+ perl-Config-Crontab
+ perl-Crypt-SmbHash
+ perl-Crypt-SSLeay
+ perl-DBD-SQLite
+ perl-DBI
+ perl-Digest-HMAC
+ perl-Digest-MD4
+ perl-Digest-SHA1
+ perl-File-Tail
+ perl-gettext
+ perl-HTML-Parser
+ perl-HTML-Tagset
+ perl-IO-Zlib
+ perl-libwww-perl
+ perl-Net-Daemon
+ perl-Net-DNS
+ perl-Net-IP
+ perl-PlRPC
+ perl-spamassassin
+ perl-TermReadKey
+ perl-TimeDate
+ perl-URI
+ perl-XML-Parser
+ perl-XML-Writer
+ permissions
+ phalanx
+ pilot-link
+ pinentry
+ pinentry-qt
+ pkgconfig
+ pmtools
+ pm-utils
+ PolicyKit
+ poppler
+ poppler-qt
+ popt
+ portmap
+ postfix
+ powersave
+ powersave-libs
+ ppp
+ pptp
+ preload
+ procinfo
+ procmail
+ procps
+ providers
+ psmisc
+ pwdutils
+ python
+ python-qt
+ python-xml
+ qca
+ qlogic-firmware
+ qscintilla
+ qt3
+ qtcurve-gtk2
+ rdesktop
+ readline
+ RealPlayer
+ recode
+ reiserfs
+ release-notes
+ resmgr
+ rpm
+ rrdtool
+ rsync
+ ruby
+ sane
+ sane-frontends
+ sash
+ sax2
+ sax2-gui
+ sax2-ident
+ sax2-libsax
+ sax2-libsax-perl
+ sax2-tools
+ scpm
+ screen
+ scsi
+ SDL
+ SDL_image
+ SDL_mixer
+ SDL_net
+ SDL_Pango
+ SDL_perl
+ SDL_ttf
+ sed
+ sensors
+ sgml-skel
+ shared-mime-info
+ sharutils
+ siga
+ smartmontools
+ smpppd
+ spamassassin
+ speex
+ sqlite
+ sqlite2
+ sqlite-zmd
+ startup-notification
+ strace
+ sudo
+ supertux
+ suse-build-key
+ SuSEfirewall2
+ susehelp
+ susehelp_de
+ suseRegister
+ suspend
+ sysconfig
+ sysfsutils
+ syslog-ng
+ sysvinit
+ taglib
+ tar
+ tcl
+ tcpd
+ tcpdump
+ tcsh
+ telnet
+ terminfo
+ tightvnc
+ timezone
+ tk
+ udev
+ ufraw
+ ufraw-gimp
+ ulimit
+ unclutter
+ unzip
+ update-alternatives
+ usbutils
+ utempter
+ util-linux
+ v4l-conf
+ vim
+ w3m
+ wbxml2
+ wdiff
+ wget
+ wireless-tools
+ wodim
+ words
+ wpa_supplicant
+ wv
+ wvdial
+ wvstreams
+ x11-input-synaptics
+ x11-input-wacom
+ x11-tools
+ xaw3d
+ xdg-menu
+ xdg-utils
+ xdmbgrd
+ xfsprogs
+ xgl
+ xgl-hardware-list
+ xine-lib
+ xinetd
+ xkeyboard-config
+ xli
+ xlockmore
+ xmoto
+ xntp
+ xorg-x11
+ xorg-x11-driver-input
+ xorg-x11-driver-video
+ xorg-x11-fonts
+ xorg-x11-fonts-core
+ xorg-x11-libfontenc
+ xorg-x11-libICE
+ xorg-x11-libs
+ xorg-x11-libSM
+ xorg-x11-libX11
+ xorg-x11-libX11-ccache
+ xorg-x11-libXau
+ xorg-x11-libXdmcp
+ xorg-x11-libXext
+ xorg-x11-libXfixes
+ xorg-x11-libxkbfile
+ xorg-x11-libXmu
+ xorg-x11-libXp
+ xorg-x11-libXpm
+ xorg-x11-libXprintUtil
+ xorg-x11-libXrender
+ xorg-x11-libXt
+ xorg-x11-libXv
+ xorg-x11-server
+ xorg-x11-Xvnc
+ xpdf-tools
+ xscreensaver
+ xterm
+ xtermset
+ yast2
+ yast2-apparmor
+ yast2-backup
+ yast2-bluetooth
+ yast2-bootfloppy
+ yast2-bootloader
+ yast2-control-center
+ yast2-core
+ yast2-country
+ yast2-firewall
+ yast2-hardware-detection
+ yast2-inetd
+ yast2-installation
+ yast2-irda
+ yast2-iscsi-client
+ yast2-kerberos-client
+ yast2-ldap
+ yast2-ldap-client
+ yast2-mail
+ yast2-mail-aliases
+ yast2-mouse
+ yast2-ncurses
+ yast2-network
+ yast2-nfs-client
+ yast2-nis-client
+ yast2-ntp-client
+ yast2-online-update
+ yast2-online-update-frontend
+ yast2-packager
+ yast2-pam
+ yast2-perl-bindings
+ yast2-pkg-bindings
+ yast2-power-management
+ yast2-powertweak
+ yast2-printer
+ yast2-profile-manager
+ yast2-qt
+ yast2-registration
+ yast2-repair
+ yast2-restore
+ yast2-runlevel
+ yast2-samba-client
+ yast2-samba-server
+ yast2-scanner
+ yast2-schema
+ yast2-security
+ yast2-slp
+ yast2-sound
+ yast2-storage
+ yast2-storage-evms
+ yast2-storage-lib
+ yast2-sudo
+ yast2-support
+ yast2-sysconfig
+ yast2-theme-openSUSE
+ yast2-trans-de
+ yast2-transfer
+ yast2-trans-stats
+ yast2-tune
+ yast2-tv
+ yast2-update
+ yast2-users
+ yast2-x11
+ yast2-xml
+ ypbind
+ yp-tools
+ zip
+ zisofs-tools
+ zlib
+ zsh
+ zvbi
+ END
+</selection>
+<selection gnome>
+ base = textmode
+ packages = <<END
+ END
+</selection>
+<selection default>
+ base = minimal
+</selection>
+
diff --git a/src/lib/distro-info/suse-10.2/settings.example b/src/lib/distro-info/suse-10.2/settings.example
new file mode 100644
index 00000000..2905cef4
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2/settings.example
@@ -0,0 +1,23 @@
+# rename this file to 'settings' and edit it as you please
+#
+# for a list of all options, have a look at the corresponding
+# settings.default in /opt/openslx/share/distro-info
+
+# use local installation source
+#<repository base>
+# local-url = /srv/ftp/pub/opensuse/distribution/10.2/repo/oss
+#</repository>
+#<repository base_non-oss>
+# local-url = /srv/ftp/pub/opensuse/distribution/10.2/repo/non-oss
+#</repository>
+#<repository base_update>
+# local-url = /srv/ftp/pub/suse/update/10.2
+#</repository>
+
+# add a new selection:
+#<selection my_kde>
+# base = kde
+# packages = <<END
+# kinternet
+# END
+#</selection>
diff --git a/src/lib/distro-info/suse-10.2/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc b/src/lib/distro-info/suse-10.2/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc
new file mode 100644
index 00000000..434ca172
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc
@@ -0,0 +1,17 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.5 (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/src/lib/distro-info/suse-10.2/trusted-package-keys/gpg-pubkey-307e3d54-44201d5d.asc b/src/lib/distro-info/suse-10.2/trusted-package-keys/gpg-pubkey-307e3d54-44201d5d.asc
new file mode 100644
index 00000000..e0628d2c
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2/trusted-package-keys/gpg-pubkey-307e3d54-44201d5d.asc
@@ -0,0 +1,13 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.5 (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/src/lib/distro-info/suse-10.2/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc b/src/lib/distro-info/suse-10.2/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc
new file mode 100644
index 00000000..5a4e4912
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc
@@ -0,0 +1,30 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.5 (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/src/lib/distro-info/suse-10.2/trusted-package-keys/gpg-pubkey-7e2e3b05-44748aba.asc b/src/lib/distro-info/suse-10.2/trusted-package-keys/gpg-pubkey-7e2e3b05-44748aba.asc
new file mode 100644
index 00000000..e81d472f
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2/trusted-package-keys/gpg-pubkey-7e2e3b05-44748aba.asc
@@ -0,0 +1,20 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.5 (GNU/Linux)
+
+mQGiBER0iroRBADfqUeJmPCXqPJFnf3CVKy40dL1F+gfvP+JHN7/uu4c9+oCYjI1
+uAE8iGTm/Twb/Zzbs4dt0iWjhNFXbRi42rMww4d/8QcPYZ21WSehh+fv8nCjt2sw
+LeC87ar2SR8OTpJBK0fQlcd4e6H5GMntfI6SYEUOPd8m/eQ+4+1AxpUUpwCgswaF
+13fePZGI//pDn5tGjbvmaP8D/R3qum/I+oDS8lbFeeDS10GkEkwTYec13gdfsq6I
+yzIj7VBsC+rGfbipv+VGR61Q4d19pOHKLDekr9OG+3G4ZcYM4NQvQZR+QIlp3xWu
+nBmYD1LRkHLVj+Z4DGQhjjOffkPSuacKPymMaZ/aRiLgTIAo97W2YPhutscXrLSG
+2Y+BA/4jsyaDb7kbW4wc8RtPIcuFEheVqgBeRakP9Uj47kBMBEpPtI/mIdY5liKk
+ztKnuQG6ROYLNV/PW0ZbE1uT64C710weh4cB3PnZLV5P10deDLBjHk8MJQGCTSDD
+JYvhutUzQfshAU6j2kErGvKdZxWGezab34vFyMP2oLGqswPAJrRQTm92ZWxsIFBy
+b3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20pIDxub3ZlbGwt
+cHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6IZgQTEQIAJgUCRHSKugIbAwUJA8JnAAYL
+CQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEBTCi8l+LjsFWEoAn13x+5ObqkW08gYF
+YNDlcGPjQuGPAJ9kAQbVUvvh1u9mBgu91cQ9W/TkHYhGBBMRAgAGBQJEexD/AAoJ
+EKhO2uicgArKFLwAn0B+g2mJ5n8LrBziTQ5SjnSPyDBXAJwJoYTta5Sfw/3vVGpU
+fJAKVDoB9w==
+=tJSz
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-10.2/trusted-package-keys/gpg-pubkey-9c800aca-40d8063e.asc b/src/lib/distro-info/suse-10.2/trusted-package-keys/gpg-pubkey-9c800aca-40d8063e.asc
new file mode 100644
index 00000000..2769097c
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2/trusted-package-keys/gpg-pubkey-9c800aca-40d8063e.asc
@@ -0,0 +1,37 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.5 (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/src/lib/distro-info/suse-10.2/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc b/src/lib/distro-info/suse-10.2/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc
new file mode 100644
index 00000000..d653ac28
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc
@@ -0,0 +1,31 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.5 (GNU/Linux)
+
+mQILBERqCJkBEACdqhZWdAbUHLIumXMEgv+GFjr1ZzVHgynnFOzztU/8sxZNa9cm
+YV4HZpVfjMr7fos3ArzyiPPt/336cf7w9p79/ZS4rHSNPDMlPCtXYvFxUbvU0/GY
+q4jwcBsrJ0xaJ9CP5bWyAgVKOb7Y6k0ktaLjRR+tDfMsHA4H0ClMoRr6ATw8NL0e
+VCfAHuzqCKvX1If8ng+wTivtAhKvz/WwQiELNELmPfc5tZHOw8NgP/r0Pze18Hn2
+dlAHu0WpC7uoR00vscsMIJiJJPcsxbL1F1eADKnk+wEy8Go+EJeJ5i0WoFbqD52q
+Lv/C/oY6NVtVY0MBwtn+oQNSnQ4JBsB/Akdt53LAi0ZtNQxMyUW+76R8FCOmVCV8
+WGiF5CPRP0yvG80AMBjBjKjHb/v8ov5MnIyFimzAHS1gQcUNxTEYA/5eFwoYcGcK
+weGq9FUjPTzLQAgvp7XmOzHpSAfJ7qysxFTepNsSZZhgizJyInrdQldr+GYcUNqB
+krD9MWmFop975OxhCTEnNv/HcE79r8WD26HzDFYxTiTJbr0pU/ivBzo+rjq+YG2V
+stJk+udVYmZTnC4LmXus8JiNuqBXbxNscwCBpcJ8YcfCV6uh+7E0XfXZsgVUFLp1
+NF+ylYRGTycOlWoZODrnJevZW7N9O3bWRx/G2P4bJD07LsDLe4i5hymf5QAGKbRQ
+Tm92ZWxsIFByb3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20p
+IDxub3ZlbGwtcHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6JAjMEEwECAB0FAkRqCJkG
+CwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRBHijLooZEiCKSFD/93vZHCAMLEfksU
+KnvXl08bv1rfuamuyJnE3ANRE5RDyypriHMCnkVxazvQ2WI4W4UEjluL9+SzZwtV
+ZvKVoAr31614nSyWwv2YnJTHfjMG+xRlkolZMnuIiB9PcCBo9+GPU0ABuzo4pEJW
+NIRoSS1NFbAZBhtUnY0cN+trM5QObLl7xXTavLyGk//blkk57fov7GXsQJlZUig0
+l2yt5XNyGpLUnTMDumHh8b389quF+0+ZfdwOy7A768xjipAZiTvIujBrEv51wrxh
+0HBT0VGA0MhD9t0B+Ce4BM9P/iVMO00naaOp6PqMfPPKxQQqer8qy1i6UWBx95SY
+mKZBIvOm2d9PezDxkckCu61r6krx1iKnT1wdprCAkIYwALK118SpbxuyGW0bhRHc
+wsc/akzWH72fS0Xu49mvL4k4A2U9asdeQid3dMgbtm5mSWof0yiU/G4YNn0yeXoY
+oG1VbCAqQbFX1Rvd6GITJVqI+ekW/uMA9BP78dF8wBeG0+QmpQnSf+eOsxB/RT8o
+Kb4hHY+29MUlg+i9ceVt7hoKr03J/uIG5TXFXRYLaI0iAFVlKfWxpqDfS2XA4+dD
+VYt+5RDgBcnxDaTB4FE9GqcYScNfe7+NFtL0p0wOPftbmgZzGjucTmrD8mDUNdqA
+xGK7vlk4GATSfOQlq7G6LXW6RYnInohGBBMRAgAGBQJEazMlAAoJEKhO2uicgArK
+2vMAn0TbVDESEVKVuFZStrfIzOvJQrR9AJsH733Ju1kE99GFrdfCeGqpckmNhg==
+=E+qN
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-10.2/trusted-package-keys/pubring.gpg b/src/lib/distro-info/suse-10.2/trusted-package-keys/pubring.gpg
new file mode 100644
index 00000000..5e96ad54
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2/trusted-package-keys/pubring.gpg
Binary files differ
diff --git a/src/lib/distro-info/suse-10.2_x86_64/export-filter.example b/src/lib/distro-info/suse-10.2_x86_64/export-filter.example
new file mode 100644
index 00000000..a414fef4
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2_x86_64/export-filter.example
@@ -0,0 +1,15 @@
+# this file defines the filter rules used when exporting a vendor-OS
+# of this distro
+#
+# copy this file to 'export-filter' and add your own filters to it
+# in order to overrule the filters provided by openslx
+#
+#Examples:
+# the following line would include anything below /var/spool/
+#+ /var/spool/*
+#
+# this would exclude anything in /etc that starts with dhcpd.conf
+#- /etc/dhcpd.conf*
+#
+# and this would exclude all rpmnew-files:
+#- *.rpmnew
diff --git a/src/lib/distro-info/suse-10.2_x86_64/mirrors/base b/src/lib/distro-info/suse-10.2_x86_64/mirrors/base
new file mode 100644
index 00000000..fae4451d
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2_x86_64/mirrors/base
@@ -0,0 +1,2 @@
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/discontinued/10.2/repo/oss
+http://download.opensuse.org/distribution/10.2/repo/oss \ No newline at end of file
diff --git a/src/lib/distro-info/suse-10.2_x86_64/mirrors/base_non-oss b/src/lib/distro-info/suse-10.2_x86_64/mirrors/base_non-oss
new file mode 100644
index 00000000..3ecadd23
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2_x86_64/mirrors/base_non-oss
@@ -0,0 +1,2 @@
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/discontinued/10.2/repo/non-oss
+http://download.opensuse.org/distribution/10.2/repo/non-oss \ No newline at end of file
diff --git a/src/lib/distro-info/suse-10.2_x86_64/mirrors/base_update b/src/lib/distro-info/suse-10.2_x86_64/mirrors/base_update
new file mode 100644
index 00000000..02d2ff3d
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2_x86_64/mirrors/base_update
@@ -0,0 +1,5 @@
+http://lisa.gov.pt/ftp/suse/update/10.2
+http://mirrors.kernel.org/suse/update/10.2
+http://suse.cs.utah.edu/suse/update/10.2
+http://suse.mirrors.tds.net/pub/suse/update/10.2
+http://www.mirrorservice.org/sites/ftp.suse.com/pub/suse/update/10.2
diff --git a/src/lib/distro-info/suse-10.2_x86_64/prereqfiles/etc/group b/src/lib/distro-info/suse-10.2_x86_64/prereqfiles/etc/group
new file mode 100644
index 00000000..505cb221
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2_x86_64/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/src/lib/distro-info/suse-10.2_x86_64/prereqfiles/etc/hosts b/src/lib/distro-info/suse-10.2_x86_64/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2_x86_64/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/suse-10.2_x86_64/prereqfiles/etc/passwd b/src/lib/distro-info/suse-10.2_x86_64/prereqfiles/etc/passwd
new file mode 100644
index 00000000..9b8fc4fe
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2_x86_64/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/src/lib/distro-info/suse-10.2_x86_64/prereqfiles/etc/shadow b/src/lib/distro-info/suse-10.2_x86_64/prereqfiles/etc/shadow
new file mode 100644
index 00000000..cd100a5a
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2_x86_64/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/src/lib/distro-info/suse-10.2_x86_64/settings.default b/src/lib/distro-info/suse-10.2_x86_64/settings.default
new file mode 100644
index 00000000..e17a378c
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2_x86_64/settings.default
@@ -0,0 +1,1061 @@
+bootstrap-packages = <<END
+ x86_64/aaa_base-10.2-38.x86_64.rpm
+ x86_64/aaa_skel-2006.5.19-20.x86_64.rpm
+ x86_64/audit-libs-1.2.6-20.x86_64.rpm
+ x86_64/bash-3.1-55.x86_64.rpm
+ x86_64/blocxx-1.0.0-36.x86_64.rpm
+ x86_64/bzip2-1.0.3-36.x86_64.rpm
+ x86_64/coreutils-6.4-10.x86_64.rpm
+ x86_64/cpio-2.6-40.x86_64.rpm
+ x86_64/cracklib-2.8.9-20.x86_64.rpm
+ x86_64/cyrus-sasl-2.1.22-28.x86_64.rpm
+ x86_64/db-4.4.20-16.x86_64.rpm
+ x86_64/diffutils-2.8.7-38.x86_64.rpm
+ x86_64/e2fsprogs-1.39-21.x86_64.rpm
+ x86_64/file-4.17-23.x86_64.rpm
+ x86_64/filesystem-10.2-22.x86_64.rpm
+ x86_64/fillup-1.42-138.x86_64.rpm
+ x86_64/findutils-4.2.28-24.x86_64.rpm
+ x86_64/gawk-3.1.5-41.x86_64.rpm
+ x86_64/gdbm-1.8.3-261.x86_64.rpm
+ x86_64/glibc-2.5-25.x86_64.rpm
+ x86_64/glibc-32bit-2.5-25.x86_64.rpm
+ x86_64/gpg-1.4.5-24.x86_64.rpm
+ x86_64/grep-2.5.1a-40.x86_64.rpm
+ x86_64/gzip-1.3.5-178.x86_64.rpm
+ x86_64/info-4.8-43.x86_64.rpm
+ x86_64/insserv-1.04.0-42.x86_64.rpm
+ x86_64/irqbalance-0.09-80.x86_64.rpm
+ x86_64/kernel-default-2.6.18.2-34.x86_64.rpm
+ x86_64/libacl-2.2.34-33.x86_64.rpm
+ x86_64/libattr-2.4.28-38.x86_64.rpm
+ x86_64/libcom_err-1.39-21.x86_64.rpm
+ x86_64/libgcc41-4.1.2_20061115-5.x86_64.rpm
+ x86_64/libstdc++41-4.1.2_20061115-5.x86_64.rpm
+ x86_64/libvolume_id-103-12.x86_64.rpm
+ x86_64/libxcrypt-2.4-30.x86_64.rpm
+ x86_64/libzio-0.2-20.x86_64.rpm
+ x86_64/limal-1.2.9-5.x86_64.rpm
+ x86_64/limal-bootloader-1.2.4-6.x86_64.rpm
+ x86_64/limal-perl-1.2.9-5.x86_64.rpm
+ x86_64/logrotate-3.7.4-21.x86_64.rpm
+ x86_64/mdadm-2.5.3-17.x86_64.rpm
+ x86_64/mingetty-0.9.6s-107.x86_64.rpm
+ x86_64/mkinitrd-1.2-149.x86_64.rpm
+ x86_64/mktemp-1.5-763.x86_64.rpm
+ x86_64/module-init-tools-3.2.2-62.x86_64.rpm
+ x86_64/ncurses-5.5-42.x86_64.rpm
+ x86_64/net-tools-1.60-606.x86_64.rpm
+ x86_64/openldap2-client-2.3.27-25.x86_64.rpm
+ x86_64/openssl-0.9.8d-17.x86_64.rpm
+ x86_64/openSUSE-release-10.2-35.x86_64.rpm
+ x86_64/pam-0.99.6.3-24.x86_64.rpm
+ x86_64/pciutils-2.2.4-13.x86_64.rpm
+ x86_64/pcre-6.7-21.x86_64.rpm
+ x86_64/perl-5.8.8-32.x86_64.rpm
+ x86_64/perl-Bootloader-0.4.5-3.x86_64.rpm
+ x86_64/perl-gettext-1.05-31.x86_64.rpm
+ x86_64/permissions-2006.11.13-5.x86_64.rpm
+ x86_64/popt-1.7-304.x86_64.rpm
+ x86_64/readline-5.1-55.x86_64.rpm
+ x86_64/reiserfs-3.6.19-37.x86_64.rpm
+ x86_64/rpm-4.4.2-76.x86_64.rpm
+ x86_64/sed-4.1.5-21.x86_64.rpm
+ x86_64/sysvinit-2.86-47.x86_64.rpm
+ x86_64/udev-103-12.x86_64.rpm
+ x86_64/util-linux-2.12r-61.x86_64.rpm
+ x86_64/zlib-1.2.3-33.x86_64.rpm
+ noarch/pciutils-ids-2006.11.18-2.noarch.rpm
+ noarch/suse-build-key-1.0-707.noarch.rpm
+END
+<metapackager smart>
+ packages = <<END
+ x86_64/python-2.5-19.x86_64.rpm
+ x86_64/python-xml-2.5-19.x86_64.rpm
+ x86_64/rpm-python-4.4.2-76.x86_64.rpm
+ x86_64/smart-0.42-43.x86_64.rpm
+ END
+</metapackager>
+<metapackager yum>
+ packages = <<END
+ x86_64/glib2-2.12.4-15.x86_64.rpm
+ x86_64/gnome-filesystem-0.1-288.x86_64.rpm
+ x86_64/libxml2-2.6.26-26.x86_64.rpm
+ x86_64/libxml2-python-2.6.26-29.x86_64.rpm
+ x86_64/python-2.5-19.x86_64.rpm
+ x86_64/python-sqlite-1.1.8-11.x86_64.rpm
+ x86_64/python-urlgrabber-3.1.0-18.x86_64.rpm
+ x86_64/python-xml-2.5-19.x86_64.rpm
+ x86_64/rpm-python-4.4.2-76.x86_64.rpm
+ x86_64/sqlite-3.3.8-14.x86_64.rpm
+ x86_64/yum-3.0.1-9.x86_64.rpm
+ x86_64/yum-metadata-parser-1.0.2-23.x86_64.rpm
+ END
+</metapackager>
+package-subdir = suse
+prereq-packages = <<END
+ x86_64/bzip2-1.0.3-36.x86_64.rpm
+ x86_64/glibc-2.5-25.x86_64.rpm
+ x86_64/popt-1.7-304.x86_64.rpm
+ x86_64/rpm-4.4.2-76.x86_64.rpm
+ x86_64/zlib-1.2.3-33.x86_64.rpm
+END
+<repository base>
+ name = openSUSE 10.2
+ repo-subdir = suse
+ file-for-speedtest = suse/setup/descr/packages.en.gz
+</repository>
+<repository base_non-oss>
+ name = openSUSE 10.2 non-OSS
+ repo-subdir = suse
+ file-for-speedtest = suse/setup/descr/packages.en.gz
+</repository>
+<repository base_update>
+ name = openSUSE 10.2 updates
+ file-for-speedtest = repodata/primary.xml.gz
+</repository>
+<selection minimal>
+ packages = <<END
+ glibc-locale
+ END
+</selection>
+<selection textmode>
+ base = minimal
+ packages = <<END
+ acl
+ acpid
+ apparmor-docs
+ apparmor-profiles
+ apparmor-utils
+ ash
+ at
+ atk
+ attr
+ audit
+ autofs
+ autoyast2
+ bc
+ bind-libs
+ bind-utils
+ boost
+ bootsplash-theme-SuSE
+ compat
+ compat-libstdc++
+ compat-openssl097g
+ cpufrequtils
+ cron
+ cups-client
+ cyrus-sasl
+ cyrus-sasl-saslauthd
+ db-utils
+ deltarpm
+ dhcpcd
+ dmraid
+ dos2unix
+ dosfstools
+ ed
+ eject
+ ethtool
+ fbset
+ findutils
+ fontconfig
+ freetype2
+ gdb
+ gdbm
+ glib2
+ glibc-i18ndata
+ gpm
+ hal-resmgr
+ hfsutils
+ ifplugd
+ initviocons
+ inst-source-utils
+ iputils
+ joe
+ kbd
+ kernel-default
+ krb5
+ ksh
+ ksymoops
+ libacl
+ libapparmor
+ libart_lgpl
+ libattr
+ libcap
+ libcom_err
+ libdrm
+ libevent
+ libgcc41
+ libgcrypt
+ libgimpprint
+ libgpg-error
+ libicu
+ libidn
+ libjpeg
+ liblazy
+ liblcms
+ libltdl
+ libmng
+ libnscd
+ libopencdk
+ libpcap
+ libpng
+ librpcsecgss
+ libstdc++41
+ libtiff
+ libusb
+ libvolume_id
+ libxcrypt
+ lukemftp
+ lvm2
+ lzo
+ mailx
+ man
+ man-pages
+ microcode_ctl
+ module-init-tools
+ multipath-tools
+ nbd
+ ncurses
+ net-snmp
+ nfs-utils
+ nfsidmap
+ nscd
+ ntfsprogs
+ openSUSE-release
+ openct
+ opensc
+ openssh
+ openssl
+ patch
+ pax
+ perl-Crypt-SmbHash
+ perl-URI
+ perl-XML-Parser
+ perl-XML-Writer
+ postfix
+ powersave-libs
+ preload
+ procinfo
+ procmail
+ procps
+ providers
+ qlogic-firmware
+ recode
+ rrdtool
+ rsync
+ sash
+ screen
+ scsi
+ sensors
+ sharutils
+ smartmontools
+ smpppd
+ squashfs-kmp-default
+ strace
+ sudo
+ suse-build-key
+ suspend
+ sysfsutils
+ syslog-ng
+ tcpd
+ tcpdump
+ tcsh
+ telnet
+ terminfo
+ timezone
+ ulimit
+ usbutils
+ utempter
+ vim
+ wdiff
+ wget
+ wvstreams
+ xfsprogs
+ xinetd
+ xntp
+ yast2-apparmor
+ yast2-backup
+ yast2-bluetooth
+ yast2-bootfloppy
+ yast2-irda
+ yast2-iscsi-client
+ yast2-mail
+ yast2-ncurses
+ yast2-nis-client
+ yast2-ntp-client
+ yast2-online-update-frontend
+ yast2-power-management
+ yast2-powertweak
+ yast2-profile-manager
+ yast2-repair
+ yast2-restore
+ yast2-runlevel
+ yast2-samba-client
+ yast2-scanner
+ yast2-sudo
+ yast2-support
+ yast2-theme-openSUSE
+ yast2-trans-de
+ yast2-tv
+ ypbind
+ zip
+ zisofs-tools
+ zsh
+ END
+</selection>
+<selection kde>
+ base = textmode
+ packages = <<END
+ 3ddiag
+ 915resolution
+ a2ps
+ aaa_base
+ aaa_skel
+ aalib
+ acl
+ acpid
+ AdobeICCProfiles
+ agfa-fonts
+ alsa
+ amarok
+ amarok-libvisual
+ amarok-xine
+ apparmor-docs
+ apparmor-parser
+ apparmor-profiles
+ apparmor-utils
+ arts
+ ash
+ aspell
+ aspell-de
+ aspell-en
+ at
+ atk
+ attr
+ audiofile
+ audit
+ audit-libs
+ autofs
+ autoyast2
+ autoyast2-installation
+ bash
+ bc
+ bind-libs
+ bind-utils
+ binutils
+ blocxx
+ bluez-libs
+ bluez-utils
+ boost
+ bootsplash
+ bootsplash-theme-SuSE
+ bzip2
+ cabextract
+ cairo
+ cdparanoia
+ cdrdao
+ CheckHardware
+ checkmedia
+ chromium
+ classpath
+ compat
+ compat-libstdc++
+ compat-openssl097g
+ compiz
+ coreutils
+ cpio
+ cpp
+ cpp41
+ cpufrequtils
+ cracklib
+ cron
+ Crystalcursors
+ cups
+ cups-client
+ cups-drivers
+ cups-libs
+ curl
+ cyrus-sasl
+ cyrus-sasl-crammd5
+ cyrus-sasl-digestmd5
+ cyrus-sasl-plain
+ cyrus-sasl-saslauthd
+ db
+ dbus-1
+ dbus-1-glib
+ dbus-1-mono
+ dbus-1-qt3
+ dbus-1-x11
+ db-utils
+ dcraw
+ dejavu
+ deltarpm
+ desktop-data-SuSE
+ desktop-file-utils
+ desktop-translations
+ device-mapper
+ dhcdbd
+ dhcp
+ dhcpcd
+ dhcp-client
+ dialog
+ diffutils
+ digikam
+ digikamimageplugins
+ dirmngr
+ dmraid
+ dos2unix
+ dosbootdisk
+ dosfstools
+ dvd+rw-tools
+ e2fsprogs
+ ed
+ efont-unicode
+ eject
+ enscript
+ esound
+ ethtool
+ evms
+ evms-gui
+ exiftool
+ expat
+ fam
+ fbset
+ fftw3
+ file
+ fileshareset
+ filesystem
+ fillup
+ findutils
+ flac
+ flash-player
+ fontconfig
+ fonts-config
+ foomatic-filters
+ freealut
+ freeciv
+ freeglut
+ freetype
+ freetype2
+ fribidi
+ frozen-bubble
+ ft2demos
+ ftgl
+ fvwm2
+ gail
+ gawk
+ gcc41-gij
+ gcc-gij
+ gconf2
+ gdb
+ gdbm
+ gettext
+ ghostscript-fonts-other
+ ghostscript-fonts-std
+ ghostscript-library
+ ghostscript-x11
+ giflib
+ gimp
+ gimp-help
+ gle
+ glib
+ glib2
+ glibc
+ glibc-i18ndata
+ glib-sharp2
+ glitz
+ gmime
+ gmp
+ gnokii
+ gnome-filesystem
+ gnome-icon-theme
+ gnome-keyring
+ gnome-mime-data
+ gnome-vfs2
+ gnutls
+ gpart
+ gpg
+ gpg2
+ gpgme
+ gpm
+ GraphicsMagick
+ grep
+ groff
+ grub
+ gsf-sharp
+ gstreamer010
+ gstreamer010-plugins-base
+ gtk
+ gtk2
+ gtk-sharp2
+ gtksourceview
+ gutenprint
+ gwenview
+ gzip
+ hal
+ hal-resmgr
+ hdparm
+ hfsutils
+ hplip
+ hplip-hpijs
+ htdig
+ hwinfo
+ id3lib
+ ifnteuro
+ ifplugd
+ ImageMagick
+ ImageMagick-Magick++
+ imlib
+ imlib2
+ imlib2-loaders
+ info
+ info2html
+ initviocons
+ insserv
+ inst-source-utils
+ intlfnts
+ iproute2
+ iptables
+ iputils
+ irqbalance
+ ispell
+ ispell-american
+ ispell-german
+ ispell-ngerman
+ jack
+ java-1_4_2-gcj-compat
+ java-1_5_0-sun
+ java-1_5_0-sun-plugin
+ jfsutils
+ joe
+ jpackage-utils
+ jpeg
+ k3b
+ kaffeine
+ kbd
+ kcm_gtk
+ kde3-i18n-de
+ kdeaddons3-kicker
+ kdeaddons3-konqueror
+ kdeartwork3-kscreensaver
+ kdeartwork3-xscreensaver
+ kdebase3
+ kdebase3-kdm
+ kdebase3-ksysguardd
+ kdebase3-nsplugin
+ kdebase3-samba
+ kdebase3-session
+ kdebase3-SuSE
+ kdebluetooth
+ kdegames3
+ kdegraphics3
+ kdegraphics3-kamera
+ kdegraphics3-pdf
+ kdegraphics3-postscript
+ kdegraphics3-scan
+ kdelibs3
+ kdelibs3-doc
+ kdemultimedia3
+ kdemultimedia3-CD
+ kdemultimedia3-mixer
+ kdenetwork3
+ kdenetwork3-InstantMessenger
+ kdenetwork3-news
+ kdenetwork3-vnc
+ kdepim3
+ kdepim3-kpilot
+ kdepim3-networkstatus
+ kdepim3-notes
+ kdetv
+ kdeutils3
+ kernel-default
+ kio_ipodslave
+ kio_iso
+ kio_slp
+ kipi-plugins
+ kitchensync
+ klogd
+ knights
+ koffice
+ koffice-i18n-de
+ koffice-i18n-de-doc
+ koffice-illustration
+ konversation
+ kpowersave
+ krb5
+ krecord
+ ksh
+ ksudoku
+ ksymoops
+ ktorrent
+ kwin-decor-suse2
+ lbreakout
+ ldapcpplib
+ less
+ libacl
+ libakode
+ libao
+ libapparmor
+ libart_lgpl
+ libattr
+ libbeagle
+ libbonobo
+ libbonoboui
+ libcap
+ libcom_err
+ libcroco
+ libdrm
+ libevent
+ libexif
+ libgcc41
+ libgcj41
+ libgcrypt
+ libgimpprint
+ libglade2
+ libgnome
+ libgnomecanvas
+ libgnomecups
+ libgnomeprint
+ libgnomeprintui
+ libgnomesu
+ libgnomeui
+ libgpg-error
+ libgphoto2
+ libgpod
+ libgsf
+ libgsf-gnome
+ libgssapi
+ libgtkhtml
+ libical
+ libicu
+ libidl
+ libidn
+ libieee1284
+ libjasper
+ libjpeg
+ libkexif
+ libkipi
+ libksba
+ liblazy
+ liblcms
+ libltdl
+ libmal
+ libmikmod
+ libmng
+ libmpcdec
+ libmtp
+ libmusicbrainz
+ libnetpbm
+ libnjb
+ libnl
+ libnscd
+ libofa
+ libogg
+ liboil
+ libopencdk
+ libopensync
+ libopensync-plugin-file
+ libopensync-plugin-gnokii
+ libopensync-plugin-gpe
+ libopensync-plugin-irmc
+ libopensync-plugin-kdepim
+ libopensync-plugin-opie
+ libopensync-plugin-palm
+ libopensync-plugin-sunbird
+ libopensync-plugin-syncml
+ libopensync-tools
+ libpcap
+ libpng
+ libqt4
+ libqt4-dbus-1
+ libqt4-qt3support
+ libqt4-sql
+ libqt4-x11
+ libqtpod
+ librpcsecgss
+ librsvg
+ libsamplerate
+ libsmbclient
+ libsndfile
+ libsoup
+ libstdc++41
+ libstroke
+ libsyncml
+ libtheora
+ libtiff
+ libtunepimp
+ libusb
+ libvisual
+ libvolume_id
+ libvorbis
+ libwmf
+ libwnck
+ libxcrypt
+ libxml2
+ libxslt
+ liby2util
+ libzio
+ libzypp
+ libzypp-zmd-backend
+ limal
+ limal-bootloader
+ limal-perl
+ logrotate
+ lsb
+ lsof
+ lua-libs
+ lukemftp
+ lvm2
+ lzo
+ m4
+ mailx
+ make
+ man
+ man-pages
+ manufacturer-PPDs
+ master-boot-code
+ mdadm
+ mDNSResponder-lib
+ Mesa
+ metacity
+ microcode_ctl
+ mingetty
+ mkinitrd
+ mkisofs
+ mktemp
+ module-init-tools
+ mono-core
+ mono-data
+ mono-data-sqlite
+ mono-web
+ MozillaFirefox
+ MozillaFirefox-translations
+ mozilla-nspr
+ mozilla-nss
+ mozilla-xulrunner181
+ multipath-tools
+ myspell-american
+ myspell-german
+ ncurses
+ neon
+ netcat
+ netcfg
+ netpbm
+ net-snmp
+ net-tools
+ NetworkManager
+ NetworkManager-kde
+ nfsidmap
+ nfs-utils
+ nscd
+ ntfsprogs
+ numlockx
+ ocrad
+ openal
+ openct
+ OpenEXR
+ openldap2-client
+ openobex
+ OpenOffice_org
+ OpenOffice_org-de
+ OpenOffice_org-kde
+ OpenOffice_org-Quickstarter
+ opensc
+ openslp
+ openssh
+ openssh-askpass
+ openssl
+ opensuse-manual_de
+ opensuse-manual_en
+ openSUSE-release
+ orbit2
+ pam
+ pam-config
+ pam-modules
+ pango
+ parted
+ patch
+ pax
+ pciutils
+ pciutils-ids
+ pcre
+ pcsc-lite
+ perl
+ perl-Bootloader
+ perl-Compress-Zlib
+ perl-Config-Crontab
+ perl-Crypt-SmbHash
+ perl-Crypt-SSLeay
+ perl-DBD-SQLite
+ perl-DBI
+ perl-Digest-HMAC
+ perl-Digest-MD4
+ perl-Digest-SHA1
+ perl-File-Tail
+ perl-gettext
+ perl-HTML-Parser
+ perl-HTML-Tagset
+ perl-IO-Zlib
+ perl-libwww-perl
+ perl-Net-Daemon
+ perl-Net-DNS
+ perl-Net-IP
+ perl-PlRPC
+ perl-spamassassin
+ perl-TermReadKey
+ perl-TimeDate
+ perl-URI
+ perl-XML-Parser
+ perl-XML-Writer
+ permissions
+ phalanx
+ pilot-link
+ pinentry
+ pinentry-qt
+ pkgconfig
+ pmtools
+ pm-utils
+ PolicyKit
+ poppler
+ poppler-qt
+ popt
+ portmap
+ postfix
+ powersave
+ powersave-libs
+ ppp
+ pptp
+ preload
+ procinfo
+ procmail
+ procps
+ providers
+ psmisc
+ pwdutils
+ python
+ python-qt
+ python-xml
+ qca
+ qlogic-firmware
+ qscintilla
+ qt3
+ qtcurve-gtk2
+ rdesktop
+ readline
+ RealPlayer
+ recode
+ reiserfs
+ release-notes
+ resmgr
+ rpm
+ rrdtool
+ rsync
+ ruby
+ sane
+ sane-frontends
+ sash
+ sax2
+ sax2-gui
+ sax2-ident
+ sax2-libsax
+ sax2-libsax-perl
+ sax2-tools
+ scpm
+ screen
+ scsi
+ SDL
+ SDL_image
+ SDL_mixer
+ SDL_net
+ SDL_Pango
+ SDL_perl
+ SDL_ttf
+ sed
+ sensors
+ sgml-skel
+ shared-mime-info
+ sharutils
+ siga
+ smartmontools
+ smpppd
+ spamassassin
+ speex
+ sqlite
+ sqlite2
+ sqlite-zmd
+ startup-notification
+ strace
+ sudo
+ supertux
+ suse-build-key
+ SuSEfirewall2
+ susehelp
+ susehelp_de
+ suseRegister
+ suspend
+ sysconfig
+ sysfsutils
+ syslog-ng
+ sysvinit
+ taglib
+ tar
+ tcl
+ tcpd
+ tcpdump
+ tcsh
+ telnet
+ terminfo
+ tightvnc
+ timezone
+ tk
+ udev
+ ufraw
+ ufraw-gimp
+ ulimit
+ unclutter
+ unzip
+ update-alternatives
+ usbutils
+ utempter
+ util-linux
+ v4l-conf
+ vim
+ w3m
+ wbxml2
+ wdiff
+ wget
+ wireless-tools
+ wodim
+ words
+ wpa_supplicant
+ wv
+ wvdial
+ wvstreams
+ x11-input-synaptics
+ x11-input-wacom
+ x11-tools
+ xaw3d
+ xdg-menu
+ xdg-utils
+ xdmbgrd
+ xfsprogs
+ xgl
+ xgl-hardware-list
+ xine-lib
+ xinetd
+ xkeyboard-config
+ xli
+ xlockmore
+ xmoto
+ xntp
+ xorg-x11
+ xorg-x11-driver-input
+ xorg-x11-driver-video
+ xorg-x11-fonts
+ xorg-x11-fonts-core
+ xorg-x11-libfontenc
+ xorg-x11-libICE
+ xorg-x11-libs
+ xorg-x11-libSM
+ xorg-x11-libX11
+ xorg-x11-libX11-ccache
+ xorg-x11-libXau
+ xorg-x11-libXdmcp
+ xorg-x11-libXext
+ xorg-x11-libXfixes
+ xorg-x11-libxkbfile
+ xorg-x11-libXmu
+ xorg-x11-libXp
+ xorg-x11-libXpm
+ xorg-x11-libXprintUtil
+ xorg-x11-libXrender
+ xorg-x11-libXt
+ xorg-x11-libXv
+ xorg-x11-server
+ xorg-x11-Xvnc
+ xpdf-tools
+ xscreensaver
+ xterm
+ xtermset
+ yast2
+ yast2-apparmor
+ yast2-backup
+ yast2-bluetooth
+ yast2-bootfloppy
+ yast2-bootloader
+ yast2-control-center
+ yast2-core
+ yast2-country
+ yast2-firewall
+ yast2-hardware-detection
+ yast2-inetd
+ yast2-installation
+ yast2-irda
+ yast2-iscsi-client
+ yast2-kerberos-client
+ yast2-ldap
+ yast2-ldap-client
+ yast2-mail
+ yast2-mail-aliases
+ yast2-mouse
+ yast2-ncurses
+ yast2-network
+ yast2-nfs-client
+ yast2-nis-client
+ yast2-ntp-client
+ yast2-online-update
+ yast2-online-update-frontend
+ yast2-packager
+ yast2-pam
+ yast2-perl-bindings
+ yast2-pkg-bindings
+ yast2-power-management
+ yast2-powertweak
+ yast2-printer
+ yast2-profile-manager
+ yast2-qt
+ yast2-registration
+ yast2-repair
+ yast2-restore
+ yast2-runlevel
+ yast2-samba-client
+ yast2-samba-server
+ yast2-scanner
+ yast2-schema
+ yast2-security
+ yast2-slp
+ yast2-sound
+ yast2-storage
+ yast2-storage-evms
+ yast2-storage-lib
+ yast2-sudo
+ yast2-support
+ yast2-sysconfig
+ yast2-theme-openSUSE
+ yast2-trans-de
+ yast2-transfer
+ yast2-trans-stats
+ yast2-tune
+ yast2-tv
+ yast2-update
+ yast2-users
+ yast2-x11
+ yast2-xml
+ ypbind
+ yp-tools
+ zip
+ zisofs-tools
+ zlib
+ zsh
+ zvbi
+ END
+</selection>
+<selection gnome>
+ base = textmode
+ packages = <<END
+ END
+</selection>
+<selection default>
+ base = minimal
+</selection>
diff --git a/src/lib/distro-info/suse-10.2_x86_64/settings.example b/src/lib/distro-info/suse-10.2_x86_64/settings.example
new file mode 100644
index 00000000..2905cef4
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2_x86_64/settings.example
@@ -0,0 +1,23 @@
+# rename this file to 'settings' and edit it as you please
+#
+# for a list of all options, have a look at the corresponding
+# settings.default in /opt/openslx/share/distro-info
+
+# use local installation source
+#<repository base>
+# local-url = /srv/ftp/pub/opensuse/distribution/10.2/repo/oss
+#</repository>
+#<repository base_non-oss>
+# local-url = /srv/ftp/pub/opensuse/distribution/10.2/repo/non-oss
+#</repository>
+#<repository base_update>
+# local-url = /srv/ftp/pub/suse/update/10.2
+#</repository>
+
+# add a new selection:
+#<selection my_kde>
+# base = kde
+# packages = <<END
+# kinternet
+# END
+#</selection>
diff --git a/src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc b/src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc
new file mode 100644
index 00000000..434ca172
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc
@@ -0,0 +1,17 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.5 (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/src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/gpg-pubkey-307e3d54-44201d5d.asc b/src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/gpg-pubkey-307e3d54-44201d5d.asc
new file mode 100644
index 00000000..e0628d2c
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/gpg-pubkey-307e3d54-44201d5d.asc
@@ -0,0 +1,13 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.5 (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/src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc b/src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc
new file mode 100644
index 00000000..5a4e4912
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc
@@ -0,0 +1,30 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.5 (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/src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/gpg-pubkey-7e2e3b05-44748aba.asc b/src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/gpg-pubkey-7e2e3b05-44748aba.asc
new file mode 100644
index 00000000..e81d472f
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/gpg-pubkey-7e2e3b05-44748aba.asc
@@ -0,0 +1,20 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.5 (GNU/Linux)
+
+mQGiBER0iroRBADfqUeJmPCXqPJFnf3CVKy40dL1F+gfvP+JHN7/uu4c9+oCYjI1
+uAE8iGTm/Twb/Zzbs4dt0iWjhNFXbRi42rMww4d/8QcPYZ21WSehh+fv8nCjt2sw
+LeC87ar2SR8OTpJBK0fQlcd4e6H5GMntfI6SYEUOPd8m/eQ+4+1AxpUUpwCgswaF
+13fePZGI//pDn5tGjbvmaP8D/R3qum/I+oDS8lbFeeDS10GkEkwTYec13gdfsq6I
+yzIj7VBsC+rGfbipv+VGR61Q4d19pOHKLDekr9OG+3G4ZcYM4NQvQZR+QIlp3xWu
+nBmYD1LRkHLVj+Z4DGQhjjOffkPSuacKPymMaZ/aRiLgTIAo97W2YPhutscXrLSG
+2Y+BA/4jsyaDb7kbW4wc8RtPIcuFEheVqgBeRakP9Uj47kBMBEpPtI/mIdY5liKk
+ztKnuQG6ROYLNV/PW0ZbE1uT64C710weh4cB3PnZLV5P10deDLBjHk8MJQGCTSDD
+JYvhutUzQfshAU6j2kErGvKdZxWGezab34vFyMP2oLGqswPAJrRQTm92ZWxsIFBy
+b3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20pIDxub3ZlbGwt
+cHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6IZgQTEQIAJgUCRHSKugIbAwUJA8JnAAYL
+CQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEBTCi8l+LjsFWEoAn13x+5ObqkW08gYF
+YNDlcGPjQuGPAJ9kAQbVUvvh1u9mBgu91cQ9W/TkHYhGBBMRAgAGBQJEexD/AAoJ
+EKhO2uicgArKFLwAn0B+g2mJ5n8LrBziTQ5SjnSPyDBXAJwJoYTta5Sfw/3vVGpU
+fJAKVDoB9w==
+=tJSz
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/gpg-pubkey-9c800aca-40d8063e.asc b/src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/gpg-pubkey-9c800aca-40d8063e.asc
new file mode 100644
index 00000000..2769097c
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/gpg-pubkey-9c800aca-40d8063e.asc
@@ -0,0 +1,37 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.5 (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/src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc b/src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc
new file mode 100644
index 00000000..d653ac28
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc
@@ -0,0 +1,31 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.5 (GNU/Linux)
+
+mQILBERqCJkBEACdqhZWdAbUHLIumXMEgv+GFjr1ZzVHgynnFOzztU/8sxZNa9cm
+YV4HZpVfjMr7fos3ArzyiPPt/336cf7w9p79/ZS4rHSNPDMlPCtXYvFxUbvU0/GY
+q4jwcBsrJ0xaJ9CP5bWyAgVKOb7Y6k0ktaLjRR+tDfMsHA4H0ClMoRr6ATw8NL0e
+VCfAHuzqCKvX1If8ng+wTivtAhKvz/WwQiELNELmPfc5tZHOw8NgP/r0Pze18Hn2
+dlAHu0WpC7uoR00vscsMIJiJJPcsxbL1F1eADKnk+wEy8Go+EJeJ5i0WoFbqD52q
+Lv/C/oY6NVtVY0MBwtn+oQNSnQ4JBsB/Akdt53LAi0ZtNQxMyUW+76R8FCOmVCV8
+WGiF5CPRP0yvG80AMBjBjKjHb/v8ov5MnIyFimzAHS1gQcUNxTEYA/5eFwoYcGcK
+weGq9FUjPTzLQAgvp7XmOzHpSAfJ7qysxFTepNsSZZhgizJyInrdQldr+GYcUNqB
+krD9MWmFop975OxhCTEnNv/HcE79r8WD26HzDFYxTiTJbr0pU/ivBzo+rjq+YG2V
+stJk+udVYmZTnC4LmXus8JiNuqBXbxNscwCBpcJ8YcfCV6uh+7E0XfXZsgVUFLp1
+NF+ylYRGTycOlWoZODrnJevZW7N9O3bWRx/G2P4bJD07LsDLe4i5hymf5QAGKbRQ
+Tm92ZWxsIFByb3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20p
+IDxub3ZlbGwtcHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6JAjMEEwECAB0FAkRqCJkG
+CwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRBHijLooZEiCKSFD/93vZHCAMLEfksU
+KnvXl08bv1rfuamuyJnE3ANRE5RDyypriHMCnkVxazvQ2WI4W4UEjluL9+SzZwtV
+ZvKVoAr31614nSyWwv2YnJTHfjMG+xRlkolZMnuIiB9PcCBo9+GPU0ABuzo4pEJW
+NIRoSS1NFbAZBhtUnY0cN+trM5QObLl7xXTavLyGk//blkk57fov7GXsQJlZUig0
+l2yt5XNyGpLUnTMDumHh8b389quF+0+ZfdwOy7A768xjipAZiTvIujBrEv51wrxh
+0HBT0VGA0MhD9t0B+Ce4BM9P/iVMO00naaOp6PqMfPPKxQQqer8qy1i6UWBx95SY
+mKZBIvOm2d9PezDxkckCu61r6krx1iKnT1wdprCAkIYwALK118SpbxuyGW0bhRHc
+wsc/akzWH72fS0Xu49mvL4k4A2U9asdeQid3dMgbtm5mSWof0yiU/G4YNn0yeXoY
+oG1VbCAqQbFX1Rvd6GITJVqI+ekW/uMA9BP78dF8wBeG0+QmpQnSf+eOsxB/RT8o
+Kb4hHY+29MUlg+i9ceVt7hoKr03J/uIG5TXFXRYLaI0iAFVlKfWxpqDfS2XA4+dD
+VYt+5RDgBcnxDaTB4FE9GqcYScNfe7+NFtL0p0wOPftbmgZzGjucTmrD8mDUNdqA
+xGK7vlk4GATSfOQlq7G6LXW6RYnInohGBBMRAgAGBQJEazMlAAoJEKhO2uicgArK
+2vMAn0TbVDESEVKVuFZStrfIzOvJQrR9AJsH733Ju1kE99GFrdfCeGqpckmNhg==
+=E+qN
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/pubring.gpg b/src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/pubring.gpg
new file mode 100644
index 00000000..5e96ad54
--- /dev/null
+++ b/src/lib/distro-info/suse-10.2_x86_64/trusted-package-keys/pubring.gpg
Binary files differ
diff --git a/src/lib/distro-info/suse-10.3/export-filter.example b/src/lib/distro-info/suse-10.3/export-filter.example
new file mode 100644
index 00000000..a414fef4
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3/export-filter.example
@@ -0,0 +1,15 @@
+# this file defines the filter rules used when exporting a vendor-OS
+# of this distro
+#
+# copy this file to 'export-filter' and add your own filters to it
+# in order to overrule the filters provided by openslx
+#
+#Examples:
+# the following line would include anything below /var/spool/
+#+ /var/spool/*
+#
+# this would exclude anything in /etc that starts with dhcpd.conf
+#- /etc/dhcpd.conf*
+#
+# and this would exclude all rpmnew-files:
+#- *.rpmnew
diff --git a/src/lib/distro-info/suse-10.3/mirrors/base b/src/lib/distro-info/suse-10.3/mirrors/base
new file mode 100644
index 00000000..68f41317
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3/mirrors/base
@@ -0,0 +1,250 @@
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/10.3/repo/oss
+http://opensuse.mirror.ac.za/opensuse/distribution/10.3/repo/oss
+http://www.lizardsource.cn/distribution/10.3/repo/oss
+http://mirror.alva.ge/pub/opensuse/distribution/10.3/repo/oss
+http://mirror.lupaworld.com/opensuse/distribution/10.3/repo/oss
+http://mirror.alva.ge/pub/opensuse/distribution/10.3/repo/oss
+ftp://opensuse.mirror.ac.za/opensuse/distribution/10.3/repo/oss
+http://download.opensuse.or.id/distribution/10.3/repo/oss
+http://mirror.unej.ac.id/opensuse/distribution/10.3/repo/oss
+ftp://www.lizardsource.cn/distribution/10.3/repo/oss
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/10.3/repo/oss
+http://repo.ugm.ac.id/opensuse/distribution/10.3/repo/oss
+http://dl2.foss-id.web.id/opensuse/distribution/10.3/repo/oss
+http://mirror.isoc.org.il/pub/opensuse/distribution/10.3/repo/oss
+http://opensuse.cbn.net.id/distribution/10.3/repo/oss
+ftp://mirror.isoc.org.il/opensuse/distribution/10.3/repo/oss
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/10.3/repo/oss
+ftp://repo.ugm.ac.id/opensuse/distribution/10.3/repo/oss
+http://ftp.kddilabs.jp/Linux/packages/opensuse/distribution/10.3/repo/oss
+ftp://dl2.foss-id.web.id/repo/opensuse/distribution/10.3/repo/oss
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/10.3/repo/oss
+ftp://opensuse.cbn.net.id/pub/opensuse/distribution/10.3/repo/oss
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/distribution/10.3/repo/oss
+ftp://mirror.unej.ac.id/opensuse/distribution/10.3/repo/oss
+http://ftp.riken.jp/Linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp.novell.co.jp/pub/opensuse/distribution/10.3/repo/oss
+http://ftp.daum.net/opensuse/distribution/10.3/repo/oss
+http://mirror.suse.ru/distribution/10.3/repo/oss
+http://77.88.19.68/opensuse/distribution/10.3/repo/oss
+ftp://ftp.kddilabs.jp/Linux/packages/opensusedistribution/10.3/repo/oss
+http://77.88.19.73/opensuse/distribution/10.3/repo/oss
+http://77.88.19.74/opensuse/distribution/10.3/repo/oss
+http://ftp.novell.co.jp/pub/opensuse/distribution/10.3/repo/oss
+http://93.158.155.193/opensuse/distribution/10.3/repo/oss
+ftp://ftp.kaist.ac.kr/opensuse/distribution/10.3/repo/oss
+ftp://ftp.daum.net/opensuse/distribution/10.3/repo/oss
+ftp://ftp.riken.jp/Linux/opensuse/distribution/10.3/repo/oss
+ftp://spreader.yandex.net/opensuse/distribution/10.3/repo/oss
+http://mirror.nus.edu.sg/opensuse/distribution/10.3/repo/oss
+ftp://dispenser.yandex.net/opensuse/distribution/10.3/repo/oss
+ftp://ftp.chg.ru/pub/opensuse/distribution/10.3/repo/oss
+ftp://allotter.yandex.net/opensuse/distribution/10.3/repo/oss
+http://ftp.chg.ru/pub/opensuse/distribution/10.3/repo/oss
+ftp://seeder.yandex.net/opensuse/distribution/10.3/repo/oss
+ftp://mirror.in.th/opensuse/distribution/10.3/repo/oss
+http://ftp.isu.edu.tw/pub/Linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp.isu.edu.tw/pub/Linux/OpenSuSE/distribution/10.3/repo/oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/10.3/repo/oss
+http://ftp.twaren.net/Linux/OpenSuSE/distribution/10.3/repo/oss
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/10.3/repo/oss
+ftp://ftp.twaren.net/Linux/OpenSuSE/distribution/10.3/repo/oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/10.3/repo/oss
+http://mirror-fpt-telecom.fpt.net/opensuse/distribution/10.3/repo/oss
+http://suse.inode.at/opensuse/distribution/10.3/repo/oss
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/distribution/10.3/repo/oss
+http://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/10.3/repo/oss
+http://ftp.tugraz.at/mirror/opensuse/distribution/10.3/repo/oss
+ftp://suse.inode.at/opensuse/distribution/10.3/repo/oss
+ftp://ftp.tugraz.at/mirror/opensuse/distribution/10.3/repo/oss
+http://suse.lagis.at/opensuse/distribution/10.3/repo/oss
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/10.3/repo/oss
+http://mirror.opensuse.com.ba/opensuse/distribution/10.3/repo/oss
+ftp://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/10.3/repo/oss
+http://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/10.3/repo/oss
+ftp://mirror.switch.ch/mirror/opensuse/distribution/10.3/repo/oss
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/10.3/repo/oss
+http://mirrors.netbg.com/opensuse/distribution/10.3/repo/oss
+ftp://mirrors.netbg.com/opensuse/distribution/10.3/repo/oss
+http://mirror.switch.ch/ftp/mirror/opensuse/distribution/10.3/repo/oss
+http://mirror.karneval.cz/pub/linux/opensuse/distribution/10.3/repo/oss
+ftp://suse.lagis.at/opensuse/distribution/10.3/repo/oss
+ftp://mirror.karneval.cz/pub/linux/opensuse/distribution/10.3/repo/oss
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/10.3/repo/oss
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/10.3/repo/oss
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/10.3/repo/oss
+http://ftp.halifax.rwth-aachen.de/opensuse/distribution/10.3/repo/oss
+http://ftp5.gwdg.de/pub/opensuse/distribution/10.3/repo/oss
+http://ftp.linux.cz/pub/linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp5.gwdg.de/pub/opensuse/distribution/10.3/repo/oss
+ftp://ftp.halifax.rwth-aachen.de/opensuse/distribution/10.3/repo/oss
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/distribution/10.3/repo/oss
+http://download.uni-hd.de/ftp/pub/linux/opensuse/distribution/10.3/repo/oss
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/distribution/10.3/repo/oss
+http://ftp.uni-ulm.de/mirrors/opensuse/distribution/10.3/repo/oss
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/10.3/repo/oss
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/distribution/10.3/repo/oss
+http://opensuse.intergenia.de/distribution/10.3/repo/oss
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/distribution/10.3/repo/oss
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/10.3/repo/oss
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp.uni-ulm.de/mirrors/opensuse/distribution/10.3/repo/oss
+http://ftp.uni-kl.de/pub/linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/10.3/repo/oss
+ftp://ftp.uni-kl.de/pub/linux/opensuse/distribution/10.3/repo/oss
+http://ftp3.gwdg.de/pub/opensuse/distribution/10.3/repo/oss
+http://widehat.opensuse.org/distribution/10.3/repo/oss
+http://ftp4.gwdg.de/pub/opensuse/distribution/10.3/repo/oss
+http://ftp.uni-kassel.de/opensuse/distribution/10.3/repo/oss
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/10.3/repo/oss
+http://ftp.uni-bayreuth.de/linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp4.gwdg.de/pub/opensuse/distribution/10.3/repo/oss
+ftp://ftp3.gwdg.de/pub/opensuse/distribution/10.3/repo/oss
+http://opensuse-linuxmigratio.at/distribution/10.3/repo/oss
+http://ftp.tu-ilmenau.de/mirror/opensuse/distribution/10.3/repo/oss
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/10.3/repo/oss
+http://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/10.3/repo/oss
+http://ftp.uni-siegen.de/opensuse/distribution/10.3/repo/oss
+http://ftp.klid.dk/ftp/opensuse/distribution/10.3/repo/oss
+ftp://ftp.uni-bayreuth.de/linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp.klid.dk/opensuse/distribution/10.3/repo/oss
+http://ftp.estpak.ee/pub/suse/opensuse/distribution/10.3/repo/oss
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/10.3/repo/oss
+http://ftp.gui.uva.es/sites/opensuse.org/distribution/10.3/repo/oss
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp.uni-siegen.de/pub/opensuse/distribution/10.3/repo/oss
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/distribution/10.3/repo/oss
+http://suse.bifi.unizar.es/opensuse/distribution/10.3/repo/oss
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/10.3/repo/oss
+ftp://ftp.gui.uva.es/sites/opensuse.org/distribution/10.3/repo/oss
+http://opensuse.mirrors.proxad.net/opensuse/distribution/10.3/repo/oss
+ftp://ftp.rediris.es/pub/mirror/opensuse/distribution/10.3/repo/oss
+http://mirror.ovh.net/opensuse/distribution/10.3/repo/oss
+http://opensuse.cict.fr/distribution/10.3/repo/oss
+http://ftp.rediris.es/pub/mirror/opensuse/distribution/10.3/repo/oss
+ftp://mirror.ovh.net/opensuse/distribution/10.3/repo/oss
+http://fr2.rpmfind.net/linux/opensuse/distribution/10.3/repo/oss
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/distribution/10.3/repo/oss
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/10.3/repo/oss
+http://www.mirrorservice.org/sites/download.opensuse.org/distribution/10.3/repo/oss
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/10.3/repo/oss
+ftp://fr2.rpmfind.net/linux/opensuse/distribution/10.3/repo/oss
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/distribution/10.3/repo/oss
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/distribution/10.3/repo/oss
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/10.3/repo/oss
+http://ftp.ntua.gr/pub/linux/opensuse/distribution/10.3/repo/oss
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/10.3/repo/oss
+ftp://mirror.cict.fr/opensuse/distribution/10.3/repo/oss
+ftp://ftp.ntua.gr/pub/linux/opensusedistribution/10.3/repo/oss
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/10.3/repo/oss
+ftp://www.mirrorservice.org/sites/download.opensuse.org/distribution/10.3/repo/oss
+http://roxen.integrity.hu/pub/opensuse/distribution/10.3/repo/oss
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/10.3/repo/oss
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/10.3/repo/oss
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/10.3/repo/oss
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/10.3/repo/oss
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/10.3/repo/oss
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/10.3/repo/oss
+http://rm.mirror.garr.it/mirrors/opensuse/distribution/10.3/repo/oss
+http://repo1.linux.edu.lv/distribution/10.3/repo/oss
+http://mirror.leaseweb.com/opensuse/distribution/10.3/repo/oss
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/10.3/repo/oss
+ftp://rm.mirror.garr.it/mirrors/opensusedistribution/10.3/repo/oss
+http://mirrors.nl.eu.kernel.org/opensuse/distribution/10.3/repo/oss
+ftp://repo1.linux.edu.lv/distribution/10.3/repo/oss
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/distribution/10.3/repo/oss
+ftp://mirrors.nl.eu.kernel.org/opensuse/distribution/10.3/repo/oss
+http://opensuse.hro.nl/opensuse/distribution/10.3/repo/oss
+http://opensuse.uib.no/distribution/10.3/repo/oss
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/10.3/repo/oss
+http://ftp.uninett.no/pub/linux/opensuse/distribution/10.3/repo/oss
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/distribution/10.3/repo/oss
+ftp://opensuse.hro.nl/opensuse/distribution/10.3/repo/oss
+http://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/distribution/10.3/repo/oss
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/distribution/10.3/repo/oss
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/10.3/repo/oss
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/10.3/repo/oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/10.3/repo/oss
+ftp://mirror.leaseweb.com/opensuse/distribution/10.3/repo/oss
+http://ftp.sileman.pl/pub/opensuse/distribution/10.3/repo/oss
+ftp://ftp.sileman.pl/pub/opensuse/distribution/10.3/repo/oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/10.3/repo/oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/10.3/repo/oss
+http://cesium.di.uminho.pt/pub/opensuse/distribution/10.3/repo/oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/10.3/repo/oss
+ftp://ftp.uninett.no/pub/linux/opensuse/distribution/10.3/repo/oss
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/distribution/10.3/repo/oss
+http://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/10.3/repo/oss
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/10.3/repo/oss
+http://ftp.gts.lug.ro/opensuse/distribution/10.3/repo/oss
+http://ftp.ines.lug.ro/opensuse/distribution/10.3/repo/oss
+ftp://cesium.di.uminho.pt/pub/opensuse/distribution/10.3/repo/oss
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/10.3/repo/oss
+ftp://ftp.gts.lug.ro/opensuse/distribution/10.3/repo/oss
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/10.3/repo/oss
+http://mirrors.se.eu.kernel.org/opensuse/distribution/10.3/repo/oss
+ftp://mirrors.se.eu.kernel.org/opensuse/distribution/10.3/repo/oss
+http://ftp.df.lth.se/pub/opensuse/distribution/10.3/repo/oss
+ftp://ftp.df.lth.se/pub/opensusedistribution/10.3/repo/oss
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/10.3/repo/oss
+ftp://ftp.ines.lug.ro/opensuse/distribution/10.3/repo/oss
+http://opensuse.ynet.sk/distribution/10.3/repo/oss
+http://less.cogeco.net/ftp/openSUSE/distribution/10.3/repo/oss
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/10.3/repo/oss
+ftp://less.cogeco.net/openSUSE/distribution/10.3/repo/oss
+http://www.muug.mb.ca/pub/opensuse/distribution/10.3/repo/oss
+http://linux.dell.com/repo/community/distribution/10.3/repo/oss
+http://ftp.osuosl.org/pub/opensuse/distribution/10.3/repo/oss
+http://opensuse.fastsoft.net/pub/linux/opensuse/distribution/10.3/repo/oss
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/distribution/10.3/repo/oss
+http://suse.mirrors.tds.net/pub/opensuse/distribution/10.3/repo/oss
+http://mirrors.med.harvard.edu/opensuse/distribution/10.3/repo/oss
+ftp://ftp.osuosl.org/pub/opensuse/distribution/10.3/repo/oss
+http://mirror.anl.gov/pub/opensuse/opensuse/distribution/10.3/repo/oss
+http://mirror.umoss.org/opensuse/distribution/10.3/repo/oss
+ftp://suse.mirrors.tds.net/pub/opensuse/distribution/10.3/repo/oss
+http://opensuse.ca.unixheads.org/distribution/10.3/repo/oss
+ftp://opensuse.cs.utah.edu/pub/opensuse/distribution/10.3/repo/oss
+http://mirrors.xmission.com/opensuse/distribution/10.3/repo/oss
+ftp://mirror.anl.gov/pub/opensuse/opensuse/distribution/10.3/repo/oss
+http://opensuse.cs.utah.edu/distribution/10.3/repo/oss
+ftp://mirrors.xmission.com/opensuse/distribution/10.3/repo/oss
+http://mirrors2.kernel.org/opensuse/distribution/10.3/repo/oss
+http://mirror.rackspace.com/openSUSE/distribution/10.3/repo/oss
+http://130.57.19.201/distribution/10.3/repo/oss
+http://mirrors1.kernel.org/opensuse/distribution/10.3/repo/oss
+http://ftp.utexas.edu/opensuse/distribution/10.3/repo/oss
+ftp://130.57.19.201/pub/opensuse/distribution/10.3/repo/oss
+http://www.gtlib.gatech.edu/pub/opensuse/distribution/10.3/repo/oss
+http://ftp.ussg.iu.edu/linux/opensuse/distribution/10.3/repo/oss
+ftp://mirrors1.kernel.org/opensuse/distribution/10.3/repo/oss
+ftp://www.gtlib.gatech.edu/pub/opensuse/distribution/10.3/repo/oss
+ftp://ftp.utexas.edu/mirrors/opensuse/distribution/10.3/repo/oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/10.3/repo/oss
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/distribution/10.3/repo/oss
+ftp://ftp.ussg.iu.edu/linux/opensuse/distribution/10.3/repo/oss
+http://mirror.nyi.net/opensuse/distribution/10.3/repo/oss
+http://mirror.cps.cmich.edu/opensuse/opensuse/distribution/10.3/repo/oss
+ftp://mirror.rackspace.com/openSUSE/distribution/10.3/repo/oss
+http://mirrors.rit.edu/opensuse/distribution/10.3/repo/oss
+ftp://mirrors2.kernel.org/opensuse/distribution/10.3/repo/oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/10.3/repo/oss
+ftp://mirror.nyi.net/opensusedistribution/10.3/repo/oss
+http://ftp.iinet.net.au/pub/opensuse/distribution/10.3/repo/oss
+ftp://ftp.iinet.net.au/pub/opensuse/distribution/10.3/repo/oss
+http://mirror.internode.on.net/pub/opensuse/distribution/10.3/repo/oss
+http://mirror.pacific.net.au/linux/opensuse/distribution/10.3/repo/oss
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/10.3/repo/oss
+http://200.221.9.37/pub/opensuse/distribution/10.3/repo/oss
+http://opensuse.patan.com.ar/distribution/10.3/repo/oss
+http://opensuse.c3sl.ufpr.br/distribution/10.3/repo/oss
+http://opensuse.pop.com.br/distribution/10.3/repo/oss
+ftp://mirror.internode.on.net/pub/opensuse/distribution/10.3/repo/oss
+ftp://opensuse.c3sl.ufpr.br/opensuse/distribution/10.3/repo/oss
+ftp://mirror.pacific.net.au/linux/opensuse/distribution/10.3/repo/oss
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/10.3/repo/oss
diff --git a/src/lib/distro-info/suse-10.3/mirrors/base_non-oss b/src/lib/distro-info/suse-10.3/mirrors/base_non-oss
new file mode 100644
index 00000000..d3202f2b
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3/mirrors/base_non-oss
@@ -0,0 +1,248 @@
+http://opensuse.mirror.ac.za/opensuse/distribution/10.3/repo/non-oss
+http://mirror.lupaworld.com/opensuse/distribution/10.3/repo/non-oss
+ftp://www.lizardsource.cn/distribution/10.3/repo/non-oss
+http://www.lizardsource.cn/distribution/10.3/repo/non-oss
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/10.3/repo/non-oss
+http://mirror.alva.ge/pub/opensuse/distribution/10.3/repo/non-oss
+http://mirror.alva.ge/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://opensuse.mirror.ac.za/opensuse/distribution/10.3/repo/non-oss
+http://download.opensuse.or.id/distribution/10.3/repo/non-oss
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/10.3/repo/non-oss
+ftp://mirror.unej.ac.id/opensuse/distribution/10.3/repo/non-oss
+http://repo.ugm.ac.id/opensuse/distribution/10.3/repo/non-oss
+http://dl2.foss-id.web.id/opensuse/distribution/10.3/repo/non-oss
+http://mirror.unej.ac.id/opensuse/distribution/10.3/repo/non-oss
+http://mirror.isoc.org.il/pub/opensuse/distribution/10.3/repo/non-oss
+http://opensuse.cbn.net.id/distribution/10.3/repo/non-oss
+ftp://dl2.foss-id.web.id/repo/opensuse/distribution/10.3/repo/non-oss
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/10.3/repo/non-oss
+http://ftp.kddilabs.jp/Linux/packages/opensuse/distribution/10.3/repo/non-oss
+ftp://opensuse.cbn.net.id/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://repo.ugm.ac.id/opensuse/distribution/10.3/repo/non-oss
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/distribution/10.3/repo/non-oss
+http://ftp.novell.co.jp/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://mirror.isoc.org.il/opensuse/distribution/10.3/repo/non-oss
+http://ftp.riken.jp/Linux/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/10.3/repo/non-oss
+http://ftp.daum.net/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.riken.jp/Linux/opensuse/distribution/10.3/repo/non-oss
+http://77.88.19.68/opensuse/distribution/10.3/repo/non-oss
+http://77.88.19.73/opensuse/distribution/10.3/repo/non-oss
+http://mirror.suse.ru/distribution/10.3/repo/non-oss
+http://77.88.19.74/opensuse/distribution/10.3/repo/non-oss
+http://93.158.155.193/opensuse/distribution/10.3/repo/non-oss
+ftp://dispenser.yandex.net/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.chg.ru/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://spreader.yandex.net/opensuse/distribution/10.3/repo/non-oss
+ftp://seeder.yandex.net/opensuse/distribution/10.3/repo/non-oss
+ftp://allotter.yandex.net/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.kaist.ac.kr/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.novell.co.jp/pub/opensuse/distribution/10.3/repo/non-oss
+http://ftp.isu.edu.tw/pub/Linux/opensuse/distribution/10.3/repo/non-oss
+http://mirror.nus.edu.sg/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/10.3/repo/non-oss
+http://ftp.ncnu.edu.tw/Linux/opensuse/distribution/10.3/repo/non-oss
+http://ftp.chg.ru/pub/opensuse/distribution/10.3/repo/non-oss
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/10.3/repo/non-oss
+ftp://mirror.in.th/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/10.3/repo/non-oss
+http://ftp.twaren.net/Linux/OpenSuSE/distribution/10.3/repo/non-oss
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/10.3/repo/non-oss
+http://mirror-fpt-telecom.fpt.net/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.isu.edu.tw/pub/Linux/OpenSuSE/distribution/10.3/repo/non-oss
+http://suse.inode.at/opensuse/distribution/10.3/repo/non-oss
+http://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/10.3/repo/non-oss
+http://ftp.tugraz.at/mirror/opensuse/distribution/10.3/repo/non-oss
+ftp://suse.inode.at/opensuse/distribution/10.3/repo/non-oss
+http://suse.lagis.at/opensuse/distribution/10.3/repo/non-oss
+ftp://suse.lagis.at/opensuse/distribution/10.3/repo/non-oss
+http://mirror.opensuse.com.ba/opensuse/distribution/10.3/repo/non-oss
+http://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/10.3/repo/non-oss
+ftp://ftp.tugraz.at/mirror/opensuse/distribution/10.3/repo/non-oss
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/10.3/repo/non-oss
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.twaren.net/Linux/OpenSuSE/distribution/10.3/repo/non-oss
+http://mirrors.netbg.com/opensuse/distribution/10.3/repo/non-oss
+ftp://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/10.3/repo/non-oss
+http://mirror.switch.ch/ftp/mirror/opensuse/distribution/10.3/repo/non-oss
+http://mirror.karneval.cz/pub/linux/opensuse/distribution/10.3/repo/non-oss
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/10.3/repo/non-oss
+http://ftp.linux.cz/pub/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/10.3/repo/non-oss
+ftp://mirror.switch.ch/mirror/opensuse/distribution/10.3/repo/non-oss
+http://ftp.halifax.rwth-aachen.de/opensuse/distribution/10.3/repo/non-oss
+ftp://mirror.karneval.cz/pub/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://mirrors.netbg.com/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/10.3/repo/non-oss
+http://ftp5.gwdg.de/pub/opensuse/distribution/10.3/repo/non-oss
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.halifax.rwth-aachen.de/opensuse/distribution/10.3/repo/non-oss
+http://download.uni-hd.de/ftp/pub/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp5.gwdg.de/pub/opensuse/distribution/10.3/repo/non-oss
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/10.3/repo/non-oss
+http://opensuse.intergenia.de/distribution/10.3/repo/non-oss
+http://ftp.uni-ulm.de/mirrors/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.uni-ulm.de/mirrors/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/distribution/10.3/repo/non-oss
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/distribution/10.3/repo/non-oss
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/10.3/repo/non-oss
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/10.3/repo/non-oss
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/10.3/repo/non-oss
+http://ftp.uni-kl.de/pub/linux/opensuse/distribution/10.3/repo/non-oss
+http://ftp3.gwdg.de/pub/opensuse/distribution/10.3/repo/non-oss
+http://widehat.opensuse.org/distribution/10.3/repo/non-oss
+http://ftp4.gwdg.de/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.uni-kl.de/pub/linux/opensuse/distribution/10.3/repo/non-oss
+http://ftp.uni-kassel.de/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp3.gwdg.de/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/distribution/10.3/repo/non-oss
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/10.3/repo/non-oss
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/10.3/repo/non-oss
+http://ftp.uni-bayreuth.de/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp4.gwdg.de/pub/opensuse/distribution/10.3/repo/non-oss
+http://opensuse-linuxmigratio.at/distribution/10.3/repo/non-oss
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/10.3/repo/non-oss
+http://ftp.tu-ilmenau.de/mirror/opensuse/distribution/10.3/repo/non-oss
+http://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/10.3/repo/non-oss
+http://ftp.uni-siegen.de/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.uni-siegen.de/pub/opensuse/distribution/10.3/repo/non-oss
+http://ftp.klid.dk/ftp/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/distribution/10.3/repo/non-oss
+http://ftp.estpak.ee/pub/suse/opensuse/distribution/10.3/repo/non-oss
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.uni-bayreuth.de/linux/opensuse/distribution/10.3/repo/non-oss
+http://suse.bifi.unizar.es/opensuse/distribution/10.3/repo/non-oss
+http://ftp.gui.uva.es/sites/opensuse.org/distribution/10.3/repo/non-oss
+http://opensuse.mirrors.proxad.net/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.rediris.es/pub/mirror/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.klid.dk/opensuse/distribution/10.3/repo/non-oss
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.gui.uva.es/sites/opensuse.org/distribution/10.3/repo/non-oss
+http://fr2.rpmfind.net/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://fr2.rpmfind.net/linux/opensuse/distribution/10.3/repo/non-oss
+http://mirror.ovh.net/opensuse/distribution/10.3/repo/non-oss
+http://opensuse.cict.fr/distribution/10.3/repo/non-oss
+ftp://mirror.cict.fr/opensuse/distribution/10.3/repo/non-oss
+ftp://mirror.ovh.net/opensuse/distribution/10.3/repo/non-oss
+http://www.mirrorservice.org/sites/download.opensuse.org/distribution/10.3/repo/non-oss
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/10.3/repo/non-oss
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/distribution/10.3/repo/non-oss
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/10.3/repo/non-oss
+http://ftp.ntua.gr/pub/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/10.3/repo/non-oss
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/10.3/repo/non-oss
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/10.3/repo/non-oss
+http://roxen.integrity.hu/pub/opensuse/distribution/10.3/repo/non-oss
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.ntua.gr/pub/linux/opensusedistribution/10.3/repo/non-oss
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/10.3/repo/non-oss
+ftp://www.mirrorservice.org/sites/download.opensuse.org/distribution/10.3/repo/non-oss
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/10.3/repo/non-oss
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/10.3/repo/non-oss
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/distribution/10.3/repo/non-oss
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/10.3/repo/non-oss
+http://rm.mirror.garr.it/mirrors/opensuse/distribution/10.3/repo/non-oss
+http://repo1.linux.edu.lv/distribution/10.3/repo/non-oss
+ftp://repo1.linux.edu.lv/distribution/10.3/repo/non-oss
+http://mirrors.nl.eu.kernel.org/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/10.3/repo/non-oss
+http://mirror.leaseweb.com/opensuse/distribution/10.3/repo/non-oss
+ftp://mirrors.nl.eu.kernel.org/opensuse/distribution/10.3/repo/non-oss
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/distribution/10.3/repo/non-oss
+ftp://rm.mirror.garr.it/mirrors/opensusedistribution/10.3/repo/non-oss
+ftp://mirror.leaseweb.com/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/distribution/10.3/repo/non-oss
+http://opensuse.hro.nl/opensuse/distribution/10.3/repo/non-oss
+ftp://opensuse.hro.nl/opensuse/distribution/10.3/repo/non-oss
+http://opensuse.uib.no/distribution/10.3/repo/non-oss
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/distribution/10.3/repo/non-oss
+http://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/10.3/repo/non-oss
+http://ftp.rediris.es/pub/mirror/opensuse/distribution/10.3/repo/non-oss
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/distribution/10.3/repo/non-oss
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/10.3/repo/non-oss
+http://ftp.uninett.no/pub/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.uninett.no/pub/linux/opensuse/distribution/10.3/repo/non-oss
+http://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/10.3/repo/non-oss
+http://ftp.sileman.pl/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.sileman.pl/pub/opensuse/distribution/10.3/repo/non-oss
+http://cesium.di.uminho.pt/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/10.3/repo/non-oss
+ftp://cesium.di.uminho.pt/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.gts.lug.ro/opensuse/distribution/10.3/repo/non-oss
+http://ftp.ines.lug.ro/opensuse/distribution/10.3/repo/non-oss
+http://ftp.gts.lug.ro/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.ines.lug.ro/opensuse/distribution/10.3/repo/non-oss
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/10.3/repo/non-oss
+http://mirrors.se.eu.kernel.org/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/10.3/repo/non-oss
+http://ftp.df.lth.se/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.df.lth.se/pub/opensusedistribution/10.3/repo/non-oss
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/10.3/repo/non-oss
+ftp://mirrors.se.eu.kernel.org/opensuse/distribution/10.3/repo/non-oss
+http://opensuse.ynet.sk/distribution/10.3/repo/non-oss
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/10.3/repo/non-oss
+http://less.cogeco.net/ftp/openSUSE/distribution/10.3/repo/non-oss
+http://www.muug.mb.ca/pub/opensuse/distribution/10.3/repo/non-oss
+http://linux.dell.com/repo/community/distribution/10.3/repo/non-oss
+http://ftp.osuosl.org/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://less.cogeco.net/openSUSE/distribution/10.3/repo/non-oss
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/10.3/repo/non-oss
+http://opensuse.fastsoft.net/pub/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.osuosl.org/pub/opensuse/distribution/10.3/repo/non-oss
+http://suse.mirrors.tds.net/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://suse.mirrors.tds.net/pub/opensuse/distribution/10.3/repo/non-oss
+http://mirrors.med.harvard.edu/opensuse/distribution/10.3/repo/non-oss
+http://mirror.anl.gov/pub/opensuse/opensuse/distribution/10.3/repo/non-oss
+http://mirror.umoss.org/opensuse/distribution/10.3/repo/non-oss
+ftp://mirror.anl.gov/pub/opensuse/opensuse/distribution/10.3/repo/non-oss
+http://opensuse.cs.utah.edu/distribution/10.3/repo/non-oss
+http://opensuse.ca.unixheads.org/distribution/10.3/repo/non-oss
+http://mirrors.xmission.com/opensuse/distribution/10.3/repo/non-oss
+http://mirrors2.kernel.org/opensuse/distribution/10.3/repo/non-oss
+http://mirrors1.kernel.org/opensuse/distribution/10.3/repo/non-oss
+http://mirror.rackspace.com/openSUSE/distribution/10.3/repo/non-oss
+http://130.57.19.201/distribution/10.3/repo/non-oss
+http://ftp.utexas.edu/opensuse/distribution/10.3/repo/non-oss
+ftp://mirrors2.kernel.org/opensuse/distribution/10.3/repo/non-oss
+ftp://130.57.19.201/pub/opensuse/distribution/10.3/repo/non-oss
+http://www.gtlib.gatech.edu/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://mirrors1.kernel.org/opensuse/distribution/10.3/repo/non-oss
+ftp://mirrors.xmission.com/opensuse/distribution/10.3/repo/non-oss
+ftp://mirror.rackspace.com/openSUSE/distribution/10.3/repo/non-oss
+ftp://www.gtlib.gatech.edu/pub/opensuse/distribution/10.3/repo/non-oss
+http://ftp.ussg.iu.edu/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://opensuse.cs.utah.edu/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.utexas.edu/mirrors/opensuse/distribution/10.3/repo/non-oss
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/distribution/10.3/repo/non-oss
+http://mirror.nyi.net/opensuse/distribution/10.3/repo/non-oss
+http://mirror.cps.cmich.edu/opensuse/opensuse/distribution/10.3/repo/non-oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/10.3/repo/non-oss
+http://mirrors.rit.edu/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.ussg.iu.edu/linux/opensuse/distribution/10.3/repo/non-oss
+http://ftp.iinet.net.au/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://mirror.nyi.net/opensusedistribution/10.3/repo/non-oss
+http://mirror.internode.on.net/pub/opensuse/distribution/10.3/repo/non-oss
+http://mirror.pacific.net.au/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.iinet.net.au/pub/opensuse/distribution/10.3/repo/non-oss
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/10.3/repo/non-oss
+http://200.221.9.37/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://mirror.internode.on.net/pub/opensuse/distribution/10.3/repo/non-oss
+http://opensuse.patan.com.ar/distribution/10.3/repo/non-oss
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/10.3/repo/non-oss
+http://opensuse.c3sl.ufpr.br/distribution/10.3/repo/non-oss
+http://opensuse.pop.com.br/distribution/10.3/repo/non-oss
+ftp://mirror.pacific.net.au/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://opensuse.c3sl.ufpr.br/opensuse/distribution/10.3/repo/non-oss
diff --git a/src/lib/distro-info/suse-10.3/mirrors/base_update b/src/lib/distro-info/suse-10.3/mirrors/base_update
new file mode 100644
index 00000000..eef3a5ff
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3/mirrors/base_update
@@ -0,0 +1,251 @@
+http://opensuse.mirror.ac.za/opensuse/update/10.3
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/update/10.3
+http://mirror.lupaworld.com/opensuse/update/10.3
+ftp://opensuse.mirror.ac.za/opensuse/update/10.3
+http://www.lizardsource.cn/update/10.3
+http://mirror.alva.ge/pub/opensuse/update/10.3
+http://mirror.alva.ge/pub/opensuse/update/10.3
+ftp://www.lizardsource.cn/update/10.3
+http://download.opensuse.or.id/update/10.3
+http://mirror.unej.ac.id/opensuse/update/10.3
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/update/10.3
+ftp://mirror.unej.ac.id/opensuse/update/10.3
+http://repo.ugm.ac.id/opensuse/update/10.3
+http://dl2.foss-id.web.id/opensuse/update/10.3
+http://mirror.isoc.org.il/pub/opensuse/update/10.3
+http://opensuse.cbn.net.id/update/10.3
+ftp://opensuse.cbn.net.id/pub/opensuse/update/10.3
+ftp://mirror.isoc.org.il/opensuse/update/10.3
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/update/10.3
+http://ftp.kddilabs.jp/Linux/packages/opensuse/update/10.3
+ftp://dl2.foss-id.web.id/repo/opensuse/update/10.3
+ftp://ftp.kddilabs.jp/Linux/packages/opensuseupdate/10.3
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/update/10.3
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/update/10.3
+ftp://repo.ugm.ac.id/opensuse/update/10.3
+http://ftp.novell.co.jp/pub/opensuse/update/10.3
+ftp://ftp.riken.jp/Linux/opensuse/update/10.3
+http://mirror.suse.ru/update/10.3
+ftp://ftp.daum.net/opensuse/update/10.3
+http://77.88.19.68/opensuse/update/10.3
+ftp://ftp.novell.co.jp/pub/opensuse/update/10.3
+http://77.88.19.73/opensuse/update/10.3
+http://77.88.19.74/opensuse/update/10.3
+http://ftp.daum.net/opensuse/update/10.3
+http://93.158.155.193/opensuse/update/10.3
+http://ftp.riken.jp/Linux/opensuse/update/10.3
+ftp://ftp.chg.ru/pub/opensuse/update/10.3
+ftp://spreader.yandex.net/opensuse/update/10.3
+ftp://seeder.yandex.net/opensuse/update/10.3
+ftp://dispenser.yandex.net/opensuse/update/10.3
+ftp://allotter.yandex.net/opensuse/update/10.3
+ftp://ftp.kaist.ac.kr/opensuse/update/10.3
+http://ftp.chg.ru/pub/opensuse/update/10.3
+http://mirror.nus.edu.sg/opensuse/update/10.3
+ftp://ftp.suntel.com.tr/pub/opensuse/update/10.3
+http://ftp.isu.edu.tw/pub/Linux/opensuse/update/10.3
+ftp://ftp.suntel.com.tr/pub/opensuse/update/10.3
+ftp://mirror.in.th/opensuse/update/10.3
+http://ftp.ncnu.edu.tw/Linux/opensuse/update/10.3
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/update/10.3
+ftp://ftp.isu.edu.tw/pub/Linux/OpenSuSE/update/10.3
+http://ftp.twaren.net/Linux/OpenSuSE/update/10.3
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/update/10.3
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/update/10.3
+http://mirror-fpt-telecom.fpt.net/opensuse/update/10.3
+http://suse.inode.at/opensuse/update/10.3
+http://gd.tuwien.ac.at/opsys/linux/opensuse/update/10.3
+ftp://ftp.twaren.net/Linux/OpenSuSE/update/10.3
+http://ftp.tugraz.at/mirror/opensuse/update/10.3
+ftp://gd.tuwien.ac.at/opsys/linux/opensuse/update/10.3
+ftp://ftp.tugraz.at/mirror/opensuse/update/10.3
+http://suse.lagis.at/opensuse/update/10.3
+ftp://suse.lagis.at/opensuse/update/10.3
+http://mirror.opensuse.com.ba/opensuse/update/10.3
+http://ftp.belnet.be/mirror/ftp.opensuse.org/update/10.3
+ftp://suse.inode.at/opensuse/update/10.3
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/update/10.3
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/update/10.3
+http://mirrors.netbg.com/opensuse/update/10.3
+ftp://mirrors.netbg.com/opensuse/update/10.3
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/update/10.3
+ftp://mirror.switch.ch/mirror/opensuse/update/10.3
+http://mirror.switch.ch/ftp/mirror/opensuse/update/10.3
+http://ftp.linux.cz/pub/linux/opensuse/update/10.3
+http://mirror.karneval.cz/pub/linux/opensuse/update/10.3
+ftp://mirror.karneval.cz/pub/linux/opensuse/update/10.3
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/update/10.3
+ftp://ftp.halifax.rwth-aachen.de/opensuse/update/10.3
+http://ftp5.gwdg.de/pub/opensuse/update/10.3
+http://download.uni-hd.de/ftp/pub/linux/opensuse/update/10.3
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/update/10.3
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/update/10.3
+ftp://ftp5.gwdg.de/pub/opensuse/update/10.3
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/update/10.3
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/update/10.3
+http://ftp.halifax.rwth-aachen.de/opensuse/update/10.3
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/update/10.3
+http://opensuse.intergenia.de/update/10.3
+http://ftp.uni-ulm.de/mirrors/opensuse/update/10.3
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/update/10.3
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/update/10.3
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/update/10.3
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/update/10.3
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/update/10.3
+http://ftp.uni-kl.de/pub/linux/opensuse/update/10.3
+http://ftp3.gwdg.de/pub/opensuse/update/10.3
+http://widehat.opensuse.org/update/10.3
+ftp://ftp.uni-kl.de/pub/linux/opensuse/update/10.3
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/update/10.3
+ftp://ftp4.gwdg.de/pub/opensuse/update/10.3
+ftp://ftp.uni-ulm.de/mirrors/opensuse/update/10.3
+http://ftp.uni-kassel.de/opensuse/update/10.3
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/update/10.3
+http://ftp4.gwdg.de/pub/opensuse/update/10.3
+http://ftp.uni-bayreuth.de/linux/opensuse/update/10.3
+ftp://ftp3.gwdg.de/pub/opensuse/update/10.3
+http://opensuse-linuxmigratio.at/update/10.3
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/update/10.3
+http://ftp.tu-ilmenau.de/mirror/opensuse/update/10.3
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/update/10.3
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/update/10.3
+http://ftp.uni-siegen.de/opensuse/update/10.3
+ftp://ftp.uni-siegen.de/pub/opensuse/update/10.3
+http://ftp.klid.dk/ftp/opensuse/update/10.3
+http://ftp.estpak.ee/pub/suse/opensuse/update/10.3
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/update/10.3
+http://ftp.gui.uva.es/sites/opensuse.org/update/10.3
+ftp://ftp.uni-bayreuth.de/linux/opensuse/update/10.3
+ftp://ftp.gui.uva.es/sites/opensuse.org/update/10.3
+ftp://ftp.klid.dk/opensuse/update/10.3
+http://suse.bifi.unizar.es/opensuse/update/10.3
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/update/10.3
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/update/10.3
+ftp://ftp.rediris.es/pub/mirror/opensuse/update/10.3
+http://ftp.uni-paderborn.de/pub/linux/opensuse/update/10.3
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/update/10.3
+http://ftp.rediris.es/pub/mirror/opensuse/update/10.3
+http://opensuse.mirrors.proxad.net/opensuse/update/10.3
+http://fr2.rpmfind.net/linux/opensuse/update/10.3
+http://mirror.ovh.net/opensuse/update/10.3
+http://opensuse.cict.fr/update/10.3
+ftp://mirror.ovh.net/opensuse/update/10.3
+http://www.mirrorservice.org/sites/download.opensuse.org/update/10.3
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/update/10.3
+ftp://www.mirrorservice.org/sites/download.opensuse.org/update/10.3
+ftp://fr2.rpmfind.net/linux/opensuse/update/10.3
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/update/10.3
+ftp://mirror.cict.fr/opensuse/update/10.3
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/update/10.3
+http://ftp.ntua.gr/pub/linux/opensuse/update/10.3
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/update/10.3
+ftp://ftp.ntua.gr/pub/linux/opensuseupdate/10.3
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/update/10.3
+http://roxen.integrity.hu/pub/opensuse/update/10.3
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/update/10.3
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/update/10.3
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/update/10.3
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/update/10.3
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/update/10.3
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/update/10.3
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/update/10.3
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/update/10.3
+ftp://rm.mirror.garr.it/mirrors/opensuseupdate/10.3
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/update/10.3
+http://repo1.linux.edu.lv/update/10.3
+ftp://repo1.linux.edu.lv/update/10.3
+http://rm.mirror.garr.it/mirrors/opensuse/update/10.3
+http://mirrors.nl.eu.kernel.org/opensuse/update/10.3
+ftp://mirrors.nl.eu.kernel.org/opensuse/update/10.3
+http://mirror.leaseweb.com/opensuse/update/10.3
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/update/10.3
+http://opensuse.hro.nl/opensuse/update/10.3
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/update/10.3
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/update/10.3
+ftp://mirror.leaseweb.com/opensuse/update/10.3
+ftp://opensuse.hro.nl/opensuse/update/10.3
+http://opensuse.uib.no/update/10.3
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/update/10.3
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/update/10.3
+http://ftp.uninett.no/pub/linux/opensuse/update/10.3
+ftp://ftp.uninett.no/pub/linux/opensuse/update/10.3
+http://ftp.icm.edu.pl/pub/Linux/opensuse/update/10.3
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/update/10.3
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/update/10.3
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/update/10.3
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/update/10.3
+ftp://ftp.pbone.net/pub/opensuse/update/10.3
+http://ftp.sileman.pl/pub/opensuse/update/10.3
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/update/10.3
+ftp://ftp.sileman.pl/pub/opensuse/update/10.3
+ftp://ftp.pbone.net/pub/opensuse/update/10.3
+ftp://cesium.di.uminho.pt/pub/opensuse/update/10.3
+http://cesium.di.uminho.pt/pub/opensuse/update/10.3
+http://ftp.nux.ipb.pt/pub/dists/opensuse/update/10.3
+http://ftp.gts.lug.ro/opensuse/update/10.3
+ftp://ftp.gts.lug.ro/opensuse/update/10.3
+http://ftp.ines.lug.ro/opensuse/update/10.3
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/update/10.3
+ftp://ftp.ines.lug.ro/opensuse/update/10.3
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/update/10.3
+http://mirrors.se.eu.kernel.org/opensuse/update/10.3
+ftp://mirrors.se.eu.kernel.org/opensuse/update/10.3
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/update/10.3
+ftp://ftp.df.lth.se/pub/opensuseupdate/10.3
+http://opensuse.ynet.sk/update/10.3
+http://less.cogeco.net/ftp/openSUSE/update/10.3
+http://www.muug.mb.ca/pub/opensuse/update/10.3
+http://linux.dell.com/repo/community/update/10.3
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/update/10.3
+http://ftp.osuosl.org/pub/opensuse/update/10.3
+ftp://less.cogeco.net/openSUSE/update/10.3
+ftp://ftp.osuosl.org/pub/opensuse/update/10.3
+http://opensuse.fastsoft.net/pub/linux/opensuse/update/10.3
+http://suse.mirrors.tds.net/pub/opensuse/update/10.3
+ftp://www.muug.mb.ca/pub/opensuse/update/10.3
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/update/10.3
+http://mirror.anl.gov/pub/opensuse/opensuse/update/10.3
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/update/10.3
+ftp://mirror.anl.gov/pub/opensuse/opensuse/update/10.3
+http://opensuse.cs.utah.edu/update/10.3
+ftp://suse.mirrors.tds.net/pub/opensuse/update/10.3
+http://mirrors.med.harvard.edu/opensuse/update/10.3
+http://mirrors.xmission.com/opensuse/update/10.3
+http://mirror.umoss.org/opensuse/update/10.3
+ftp://mirrors.xmission.com/opensuse/update/10.3
+http://mirrors2.kernel.org/opensuse/update/10.3
+http://mirrors1.kernel.org/opensuse/update/10.3
+ftp://opensuse.cs.utah.edu/pub/opensuse/update/10.3
+http://opensuse.ca.unixheads.org/update/10.3
+ftp://mirrors2.kernel.org/opensuse/update/10.3
+http://mirror.rackspace.com/openSUSE/update/10.3
+ftp://mirrors1.kernel.org/opensuse/update/10.3
+http://130.57.19.201/update/10.3
+ftp://130.57.19.201/pub/opensuse/update/10.3
+http://www.gtlib.gatech.edu/pub/opensuse/update/10.3
+ftp://mirror.rackspace.com/openSUSE/update/10.3
+ftp://www.gtlib.gatech.edu/pub/opensuse/update/10.3
+http://ftp.ussg.iu.edu/linux/opensuse/update/10.3
+http://ftp.utexas.edu/opensuse/update/10.3
+ftp://ftp.ussg.iu.edu/linux/opensuse/update/10.3
+ftp://ftp.utexas.edu/mirrors/opensuse/update/10.3
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/update/10.3
+http://mirror.nyi.net/opensuse/update/10.3
+http://mirror.cps.cmich.edu/opensuse/opensuse/update/10.3
+ftp://mirror.colorado.edu/pub/opensuse/update/10.3
+http://mirrors.rit.edu/opensuse/update/10.3
+ftp://mirror.nyi.net/opensuseupdate/10.3
+http://ftp.iinet.net.au/pub/opensuse/update/10.3
+http://ftp.netspace.net.au/pub/opensuse/update/10.3
+http://mirror.internode.on.net/pub/opensuse/update/10.3
+http://mirror.pacific.net.au/linux/opensuse/update/10.3
+ftp://ftp.iinet.net.au/pub/opensuse/update/10.3
+ftp://mirror.internode.on.net/pub/opensuse/update/10.3
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/update/10.3
+http://200.221.9.37/pub/opensuse/update/10.3
+ftp://mirror.pacific.net.au/linux/opensuse/update/10.3
+http://opensuse.c3sl.ufpr.br/update/10.3
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/update/10.3
+http://opensuse.patan.com.ar/update/10.3
+http://opensuse.pop.com.br/update/10.3
+ftp://opensuse.c3sl.ufpr.br/opensuse/update/10.3
diff --git a/src/lib/distro-info/suse-10.3/prereqfiles/etc/group b/src/lib/distro-info/suse-10.3/prereqfiles/etc/group
new file mode 100644
index 00000000..505cb221
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3/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/src/lib/distro-info/suse-10.3/prereqfiles/etc/hosts b/src/lib/distro-info/suse-10.3/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/suse-10.3/prereqfiles/etc/passwd b/src/lib/distro-info/suse-10.3/prereqfiles/etc/passwd
new file mode 100644
index 00000000..9b8fc4fe
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3/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/src/lib/distro-info/suse-10.3/prereqfiles/etc/shadow b/src/lib/distro-info/suse-10.3/prereqfiles/etc/shadow
new file mode 100644
index 00000000..cd100a5a
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3/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/src/lib/distro-info/suse-10.3/settings.default b/src/lib/distro-info/suse-10.3/settings.default
new file mode 100644
index 00000000..4372925c
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3/settings.default
@@ -0,0 +1,1064 @@
+bootstrap-packages = <<END
+ i586/aaa_base-10.3-90.i586.rpm
+ i586/aaa_skel-2007.3.7-36.i586.rpm
+ i586/audit-libs-1.5.5-13.i586.rpm
+ i586/bash-3.2-61.i586.rpm
+ i586/blocxx-1.0.0-79.i586.rpm
+ i586/bzip2-1.0.4-42.i586.rpm
+ i586/coreutils-6.9-43.i586.rpm
+ i586/cpio-2.9-17.i586.rpm
+ i586/cracklib-2.8.10-37.i586.rpm
+ i586/cyrus-sasl-2.1.22-82.i586.rpm
+ i586/diffutils-2.8.7-80.i586.rpm
+ i586/e2fsprogs-1.40.2-20.i586.rpm
+ i586/file-4.21-7.i586.rpm
+ i586/filesystem-10.3-50.i586.rpm
+ i586/fillup-1.42-179.i586.rpm
+ i586/findutils-4.2.31-24.i586.rpm
+ i586/gawk-3.1.5g-25.i586.rpm
+ i586/gdbm-1.8.3-302.i586.rpm
+ i586/gpg2-2.0.4-49.i586.rpm
+ i586/grep-2.5.2-28.i586.rpm
+ i586/gzip-1.3.12-34.i586.rpm
+ i586/info-4.9-15.i586.rpm
+ i586/insserv-1.09.0-46.i586.rpm
+ i586/irqbalance-0.55-40.i586.rpm
+ i586/kernel-default-2.6.22.5-31.i586.rpm
+ i586/libacl-2.2.34-75.i586.rpm
+ i586/libattr-2.4.28-81.i586.rpm
+ i586/libbz2-1-1.0.4-42.i586.rpm
+ i586/libcom_err2-1.40.2-20.i586.rpm
+ i586/libgcc42-4.2.1_20070724-17.i586.rpm
+ i586/libstdc++42-4.2.1_20070724-17.i586.rpm
+ i586/libvolume_id-114-19.i586.rpm
+ i586/libxcrypt-2.4-71.i586.rpm
+ i586/libzio-0.4-43.i586.rpm
+ i586/limal-1.3.2-8.i586.rpm
+ i586/limal-perl-1.3.2-8.i586.rpm
+ i586/logrotate-3.7.5-9.i586.rpm
+ i586/mingetty-1.0.7s-25.i586.rpm
+ i586/mkinitrd-2.1-36.i586.rpm
+ i586/mktemp-1.5-804.i586.rpm
+ i586/module-init-tools-3.2.99.pre11-23.i586.rpm
+ i586/ncurses-5.6-41.i586.rpm
+ i586/net-tools-1.60-650.i586.rpm
+ i586/openldap2-client-2.3.37-20.i586.rpm
+ i586/openssl-0.9.8e-45.i586.rpm
+ i586/openSUSE-release-10.3-74.i586.rpm
+ i586/pam-0.99.8.1-15.i586.rpm
+ i586/pciutils-2.2.6-17.i586.rpm
+ i586/pcre-7.2-14.i586.rpm
+ i586/perl-5.8.8-75.i586.rpm
+ i586/perl-Bootloader-0.4.32-2.i586.rpm
+ i586/perl-gettext-1.05-73.i586.rpm
+ i586/permissions-2007.8.10-11.i586.rpm
+ i586/reiserfs-3.6.19-92.i586.rpm
+ i586/rpm-4.4.2-140.i586.rpm
+ i586/sed-4.1.5-64.i586.rpm
+ i586/sysvinit-2.86-102.i586.rpm
+ i586/udev-114-19.i586.rpm
+ i586/util-linux-2.12r+2.13rc2+git20070725-24.i586.rpm
+ noarch/pciutils-ids-2007.9.22-1.noarch.rpm
+ noarch/suse-build-key-1.0-772.noarch.rpm
+END
+<metapackager zypper>
+ packages = <<END
+ i586/glib2-2.14.1-4.i586.rpm
+ i586/libzypp-3.26.2-2.i586.rpm
+ i586/zypper-0.8.23-7.i586.rpm
+ END
+</metapackager>
+<metapackager smart>
+ packages = <<END
+ i586/python-2.5-19.i586.rpm
+ i586/python-xml-2.5-19.i586.rpm
+ i586/rpm-python-4.4.2-76.i586.rpm
+ i586/smart-0.42-43.i586.rpm
+ END
+</metapackager>
+<metapackager yum>
+ packages = <<END
+ 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/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/rpm-python-4.4.2-76.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
+ END
+</metapackager>
+package-subdir = suse
+prereq-packages = <<END
+ i586/bzip2-1.0.4-42.i586.rpm
+ i586/glib2-2.14.1-4.i586.rpm
+ i586/glibc-2.6.1-18.i586.rpm
+ i586/libbz2-1-1.0.4-42.i586.rpm
+ i586/perl-5.8.8-75.i586.rpm
+ i586/popt-1.7-368.i586.rpm
+ i586/rpm-4.4.2-140.i586.rpm
+ i586/zlib-1.2.3-75.i586.rpm
+END
+<repository base>
+ name = openSUSE 10.3
+ repo-subdir = suse
+ file-for-speedtest = suse/setup/descr/packages.en.gz
+</repository>
+<repository base_non-oss>
+ name = openSUSE 10.3 non-OSS
+ repo-subdir = suse
+ file-for-speedtest = suse/setup/descr/packages.en.gz
+</repository>
+<repository base_update>
+ name = openSUSE 10.3 updates
+ file-for-speedtest = repodata/primary.xml.gz
+</repository>
+<selection minimal>
+ packages = <<END
+ glibc-locale
+ END
+</selection>
+<selection textmode>
+ base = minimal
+ packages = <<END
+ acl
+ acpid
+ apparmor-docs
+ apparmor-profiles
+ apparmor-utils
+ ash
+ at
+ atk
+ attr
+ audit
+ autofs
+ autoyast2
+ bc
+ bind-libs
+ bind-utils
+ boost
+ bootsplash-theme-SuSE
+ compat
+ compat-libstdc++
+ compat-openssl097g
+ cpufrequtils
+ cron
+ cups-client
+ cyrus-sasl
+ cyrus-sasl-saslauthd
+ db-utils
+ deltarpm
+ dhcpcd
+ dmraid
+ dos2unix
+ dosfstools
+ ed
+ eject
+ ethtool
+ fbset
+ findutils
+ fontconfig
+ freetype2
+ gdb
+ gdbm
+ glib2
+ glibc-i18ndata
+ gpm
+ hal-resmgr
+ hfsutils
+ ifplugd
+ initviocons
+ inst-source-utils
+ iputils
+ joe
+ kbd
+ kernel-default
+ krb5
+ ksh
+ ksymoops
+ libacl
+ libapparmor
+ libart_lgpl
+ libattr
+ libcap
+ libcom_err
+ libdrm
+ libevent
+ libgcc41
+ libgcrypt
+ libgimpprint
+ libgpg-error
+ libicu
+ libidn
+ libjpeg
+ liblazy
+ liblcms
+ libltdl
+ libmng
+ libnscd
+ libopencdk
+ libpcap
+ libpng
+ librpcsecgss
+ libstdc++41
+ libtiff
+ libusb
+ libvolume_id
+ libxcrypt
+ lukemftp
+ lvm2
+ lzo
+ mailx
+ man
+ man-pages
+ microcode_ctl
+ module-init-tools
+ multipath-tools
+ nbd
+ ncurses
+ net-snmp
+ nfs-utils
+ nfsidmap
+ nscd
+ ntfsprogs
+ openSUSE-release
+ openct
+ opensc
+ openssh
+ openssl
+ patch
+ pax
+ perl-Crypt-SmbHash
+ perl-URI
+ perl-XML-Parser
+ perl-XML-Writer
+ postfix
+ powersave-libs
+ preload
+ procinfo
+ procmail
+ procps
+ providers
+ qlogic-firmware
+ recode
+ rrdtool
+ rsync
+ sash
+ screen
+ scsi
+ sensors
+ sharutils
+ smartmontools
+ smpppd
+ squashfs-kmp-default
+ strace
+ sudo
+ suse-build-key
+ suspend
+ sysfsutils
+ syslog-ng
+ tcpd
+ tcpdump
+ tcsh
+ telnet
+ terminfo
+ timezone
+ ulimit
+ usbutils
+ utempter
+ vim
+ wdiff
+ wget
+ wvstreams
+ xfsprogs
+ xinetd
+ xntp
+ yast2-apparmor
+ yast2-backup
+ yast2-bluetooth
+ yast2-bootfloppy
+ yast2-irda
+ yast2-iscsi-client
+ yast2-mail
+ yast2-ncurses
+ yast2-nis-client
+ yast2-ntp-client
+ yast2-online-update-frontend
+ yast2-power-management
+ yast2-powertweak
+ yast2-profile-manager
+ yast2-repair
+ yast2-restore
+ yast2-runlevel
+ yast2-samba-client
+ yast2-scanner
+ yast2-sudo
+ yast2-support
+ yast2-theme-openSUSE
+ yast2-trans-de
+ yast2-tv
+ ypbind
+ zip
+ zisofs-tools
+ zsh
+ END
+</selection>
+<selection kde>
+ base = textmode
+ packages = <<END
+ 3ddiag
+ 915resolution
+ a2ps
+ aaa_base
+ aaa_skel
+ aalib
+ acl
+ acpid
+ AdobeICCProfiles
+ agfa-fonts
+ alsa
+ amarok
+ amarok-libvisual
+ amarok-xine
+ apparmor-docs
+ apparmor-parser
+ apparmor-profiles
+ apparmor-utils
+ arts
+ ash
+ aspell
+ aspell-de
+ aspell-en
+ at
+ atk
+ attr
+ audiofile
+ audit
+ audit-libs
+ autofs
+ autoyast2
+ autoyast2-installation
+ bash
+ bc
+ bind-libs
+ bind-utils
+ binutils
+ blocxx
+ bluez-libs
+ bluez-utils
+ boost
+ bootsplash
+ bootsplash-theme-SuSE
+ bzip2
+ cabextract
+ cairo
+ cdparanoia
+ cdrdao
+ CheckHardware
+ checkmedia
+ chromium
+ classpath
+ compat
+ compat-libstdc++
+ compat-openssl097g
+ compiz
+ coreutils
+ cpio
+ cpp
+ cpp41
+ cpufrequtils
+ cracklib
+ cron
+ Crystalcursors
+ cups
+ cups-client
+ cups-drivers
+ cups-libs
+ curl
+ cyrus-sasl
+ cyrus-sasl-crammd5
+ cyrus-sasl-digestmd5
+ cyrus-sasl-plain
+ cyrus-sasl-saslauthd
+ db
+ dbus-1
+ dbus-1-glib
+ dbus-1-mono
+ dbus-1-qt3
+ dbus-1-x11
+ db-utils
+ dcraw
+ dejavu
+ deltarpm
+ desktop-data-SuSE
+ desktop-file-utils
+ desktop-translations
+ device-mapper
+ dhcdbd
+ dhcp
+ dhcpcd
+ dhcp-client
+ dialog
+ diffutils
+ digikam
+ digikamimageplugins
+ dirmngr
+ dmraid
+ dos2unix
+ dosbootdisk
+ dosfstools
+ dvd+rw-tools
+ e2fsprogs
+ ed
+ efont-unicode
+ eject
+ enscript
+ esound
+ ethtool
+ evms
+ evms-gui
+ exiftool
+ expat
+ fam
+ fbset
+ fftw3
+ file
+ fileshareset
+ filesystem
+ fillup
+ findutils
+ flac
+ flash-player
+ fontconfig
+ fonts-config
+ foomatic-filters
+ freealut
+ freeciv
+ freeglut
+ freetype
+ freetype2
+ fribidi
+ frozen-bubble
+ ft2demos
+ ftgl
+ fvwm2
+ gail
+ gawk
+ gcc41-gij
+ gcc-gij
+ gconf2
+ gdb
+ gdbm
+ gettext
+ ghostscript-fonts-other
+ ghostscript-fonts-std
+ ghostscript-library
+ ghostscript-x11
+ giflib
+ gimp
+ gimp-help
+ gle
+ glib
+ glib2
+ glibc
+ glibc-i18ndata
+ glib-sharp2
+ glitz
+ gmime
+ gmp
+ gnokii
+ gnome-filesystem
+ gnome-icon-theme
+ gnome-keyring
+ gnome-mime-data
+ gnome-vfs2
+ gnutls
+ gpart
+ gpg
+ gpg2
+ gpgme
+ gpm
+ GraphicsMagick
+ grep
+ groff
+ grub
+ gsf-sharp
+ gstreamer010
+ gstreamer010-plugins-base
+ gtk
+ gtk2
+ gtk-sharp2
+ gtksourceview
+ gutenprint
+ gwenview
+ gzip
+ hal
+ hal-resmgr
+ hdparm
+ hfsutils
+ hplip
+ hplip-hpijs
+ htdig
+ hwinfo
+ id3lib
+ ifnteuro
+ ifplugd
+ ImageMagick
+ ImageMagick-Magick++
+ imlib
+ imlib2
+ imlib2-loaders
+ info
+ info2html
+ initviocons
+ insserv
+ inst-source-utils
+ intlfnts
+ iproute2
+ iptables
+ iputils
+ irqbalance
+ ispell
+ ispell-american
+ ispell-german
+ ispell-ngerman
+ jack
+ java-1_4_2-gcj-compat
+ java-1_5_0-sun
+ java-1_5_0-sun-plugin
+ jfsutils
+ joe
+ jpackage-utils
+ jpeg
+ k3b
+ kaffeine
+ kbd
+ kcm_gtk
+ kde3-i18n-de
+ kdeaddons3-kicker
+ kdeaddons3-konqueror
+ kdeartwork3-kscreensaver
+ kdeartwork3-xscreensaver
+ kdebase3
+ kdebase3-kdm
+ kdebase3-ksysguardd
+ kdebase3-nsplugin
+ kdebase3-samba
+ kdebase3-session
+ kdebase3-SuSE
+ kdebluetooth
+ kdegames3
+ kdegraphics3
+ kdegraphics3-kamera
+ kdegraphics3-pdf
+ kdegraphics3-postscript
+ kdegraphics3-scan
+ kdelibs3
+ kdelibs3-doc
+ kdemultimedia3
+ kdemultimedia3-CD
+ kdemultimedia3-mixer
+ kdenetwork3
+ kdenetwork3-InstantMessenger
+ kdenetwork3-news
+ kdenetwork3-vnc
+ kdepim3
+ kdepim3-kpilot
+ kdepim3-networkstatus
+ kdepim3-notes
+ kdetv
+ kdeutils3
+ kernel-default
+ kio_ipodslave
+ kio_iso
+ kio_slp
+ kipi-plugins
+ kitchensync
+ klogd
+ knights
+ koffice
+ koffice-i18n-de
+ koffice-i18n-de-doc
+ koffice-illustration
+ konversation
+ kpowersave
+ krb5
+ krecord
+ ksh
+ ksudoku
+ ksymoops
+ ktorrent
+ kwin-decor-suse2
+ lbreakout
+ ldapcpplib
+ less
+ libacl
+ libakode
+ libao
+ libapparmor
+ libart_lgpl
+ libattr
+ libbeagle
+ libbonobo
+ libbonoboui
+ libcap
+ libcom_err
+ libcroco
+ libdrm
+ libevent
+ libexif
+ libgcc41
+ libgcj41
+ libgcrypt
+ libgimpprint
+ libglade2
+ libgnome
+ libgnomecanvas
+ libgnomecups
+ libgnomeprint
+ libgnomeprintui
+ libgnomesu
+ libgnomeui
+ libgpg-error
+ libgphoto2
+ libgpod
+ libgsf
+ libgsf-gnome
+ libgssapi
+ libgtkhtml
+ libical
+ libicu
+ libidl
+ libidn
+ libieee1284
+ libjasper
+ libjpeg
+ libkexif
+ libkipi
+ libksba
+ liblazy
+ liblcms
+ libltdl
+ libmal
+ libmikmod
+ libmng
+ libmpcdec
+ libmtp
+ libmusicbrainz
+ libnetpbm
+ libnjb
+ libnl
+ libnscd
+ libofa
+ libogg
+ liboil
+ libopencdk
+ libopensync
+ libopensync-plugin-file
+ libopensync-plugin-gnokii
+ libopensync-plugin-gpe
+ libopensync-plugin-irmc
+ libopensync-plugin-kdepim
+ libopensync-plugin-opie
+ libopensync-plugin-palm
+ libopensync-plugin-sunbird
+ libopensync-plugin-syncml
+ libopensync-tools
+ libpcap
+ libpng
+ libqt4
+ libqt4-dbus-1
+ libqt4-qt3support
+ libqt4-sql
+ libqt4-x11
+ libqtpod
+ librpcsecgss
+ librsvg
+ libsamplerate
+ libsmbclient
+ libsndfile
+ libsoup
+ libstdc++41
+ libstroke
+ libsyncml
+ libtheora
+ libtiff
+ libtunepimp
+ libusb
+ libvisual
+ libvolume_id
+ libvorbis
+ libwmf
+ libwnck
+ libxcrypt
+ libxml2
+ libxslt
+ liby2util
+ libzio
+ libzypp
+ libzypp-zmd-backend
+ limal
+ limal-bootloader
+ limal-perl
+ logrotate
+ lsb
+ lsof
+ lua-libs
+ lukemftp
+ lvm2
+ lzo
+ m4
+ mailx
+ make
+ man
+ man-pages
+ manufacturer-PPDs
+ master-boot-code
+ mdadm
+ mDNSResponder-lib
+ Mesa
+ metacity
+ microcode_ctl
+ mingetty
+ mkinitrd
+ mkisofs
+ mktemp
+ module-init-tools
+ mono-core
+ mono-data
+ mono-data-sqlite
+ mono-web
+ MozillaFirefox
+ MozillaFirefox-translations
+ mozilla-nspr
+ mozilla-nss
+ mozilla-xulrunner181
+ multipath-tools
+ myspell-american
+ myspell-german
+ ncurses
+ neon
+ netcat
+ netcfg
+ netpbm
+ net-snmp
+ net-tools
+ NetworkManager
+ NetworkManager-kde
+ nfsidmap
+ nfs-utils
+ nscd
+ ntfsprogs
+ numlockx
+ ocrad
+ openal
+ openct
+ OpenEXR
+ openldap2-client
+ openobex
+ OpenOffice_org
+ OpenOffice_org-de
+ OpenOffice_org-kde
+ OpenOffice_org-Quickstarter
+ opensc
+ openslp
+ openssh
+ openssh-askpass
+ openssl
+ opensuse-manual_de
+ opensuse-manual_en
+ openSUSE-release
+ orbit2
+ pam
+ pam-config
+ pam-modules
+ pango
+ parted
+ patch
+ pax
+ pciutils
+ pciutils-ids
+ pcre
+ pcsc-lite
+ perl
+ perl-Bootloader
+ perl-Compress-Zlib
+ perl-Config-Crontab
+ perl-Crypt-SmbHash
+ perl-Crypt-SSLeay
+ perl-DBD-SQLite
+ perl-DBI
+ perl-Digest-HMAC
+ perl-Digest-MD4
+ perl-Digest-SHA1
+ perl-File-Tail
+ perl-gettext
+ perl-HTML-Parser
+ perl-HTML-Tagset
+ perl-IO-Zlib
+ perl-libwww-perl
+ perl-Net-Daemon
+ perl-Net-DNS
+ perl-Net-IP
+ perl-PlRPC
+ perl-spamassassin
+ perl-TermReadKey
+ perl-TimeDate
+ perl-URI
+ perl-XML-Parser
+ perl-XML-Writer
+ permissions
+ phalanx
+ pilot-link
+ pinentry
+ pinentry-qt
+ pkgconfig
+ pmtools
+ pm-utils
+ PolicyKit
+ poppler
+ poppler-qt
+ popt
+ portmap
+ postfix
+ powersave
+ powersave-libs
+ ppp
+ pptp
+ preload
+ procinfo
+ procmail
+ procps
+ providers
+ psmisc
+ pwdutils
+ python
+ python-qt
+ python-xml
+ qca
+ qlogic-firmware
+ qscintilla
+ qt3
+ qtcurve-gtk2
+ rdesktop
+ readline
+ RealPlayer
+ recode
+ reiserfs
+ release-notes
+ resmgr
+ rpm
+ rrdtool
+ rsync
+ ruby
+ sane
+ sane-frontends
+ sash
+ sax2
+ sax2-gui
+ sax2-ident
+ sax2-libsax
+ sax2-libsax-perl
+ sax2-tools
+ scpm
+ screen
+ scsi
+ SDL
+ SDL_image
+ SDL_mixer
+ SDL_net
+ SDL_Pango
+ SDL_perl
+ SDL_ttf
+ sed
+ sensors
+ sgml-skel
+ shared-mime-info
+ sharutils
+ siga
+ smartmontools
+ smpppd
+ spamassassin
+ speex
+ sqlite
+ sqlite2
+ sqlite-zmd
+ startup-notification
+ strace
+ sudo
+ supertux
+ suse-build-key
+ SuSEfirewall2
+ susehelp
+ susehelp_de
+ suseRegister
+ suspend
+ sysconfig
+ sysfsutils
+ syslog-ng
+ sysvinit
+ taglib
+ tar
+ tcl
+ tcpd
+ tcpdump
+ tcsh
+ telnet
+ terminfo
+ tightvnc
+ timezone
+ tk
+ udev
+ ufraw
+ ufraw-gimp
+ ulimit
+ unclutter
+ unzip
+ update-alternatives
+ usbutils
+ utempter
+ util-linux
+ v4l-conf
+ vim
+ w3m
+ wbxml2
+ wdiff
+ wget
+ wireless-tools
+ wodim
+ words
+ wpa_supplicant
+ wv
+ wvdial
+ wvstreams
+ x11-input-synaptics
+ x11-input-wacom
+ x11-tools
+ xaw3d
+ xdg-menu
+ xdg-utils
+ xdmbgrd
+ xfsprogs
+ xgl
+ xgl-hardware-list
+ xine-lib
+ xinetd
+ xkeyboard-config
+ xli
+ xlockmore
+ xmoto
+ xntp
+ xorg-x11
+ xorg-x11-driver-input
+ xorg-x11-driver-video
+ xorg-x11-fonts
+ xorg-x11-fonts-core
+ xorg-x11-libfontenc
+ xorg-x11-libICE
+ xorg-x11-libs
+ xorg-x11-libSM
+ xorg-x11-libX11
+ xorg-x11-libX11-ccache
+ xorg-x11-libXau
+ xorg-x11-libXdmcp
+ xorg-x11-libXext
+ xorg-x11-libXfixes
+ xorg-x11-libxkbfile
+ xorg-x11-libXmu
+ xorg-x11-libXp
+ xorg-x11-libXpm
+ xorg-x11-libXprintUtil
+ xorg-x11-libXrender
+ xorg-x11-libXt
+ xorg-x11-libXv
+ xorg-x11-server
+ xorg-x11-Xvnc
+ xpdf-tools
+ xscreensaver
+ xterm
+ xtermset
+ yast2
+ yast2-apparmor
+ yast2-backup
+ yast2-bluetooth
+ yast2-bootfloppy
+ yast2-bootloader
+ yast2-control-center
+ yast2-core
+ yast2-country
+ yast2-firewall
+ yast2-hardware-detection
+ yast2-inetd
+ yast2-installation
+ yast2-irda
+ yast2-iscsi-client
+ yast2-kerberos-client
+ yast2-ldap
+ yast2-ldap-client
+ yast2-mail
+ yast2-mail-aliases
+ yast2-mouse
+ yast2-ncurses
+ yast2-network
+ yast2-nfs-client
+ yast2-nis-client
+ yast2-ntp-client
+ yast2-online-update
+ yast2-online-update-frontend
+ yast2-packager
+ yast2-pam
+ yast2-perl-bindings
+ yast2-pkg-bindings
+ yast2-power-management
+ yast2-powertweak
+ yast2-printer
+ yast2-profile-manager
+ yast2-qt
+ yast2-registration
+ yast2-repair
+ yast2-restore
+ yast2-runlevel
+ yast2-samba-client
+ yast2-samba-server
+ yast2-scanner
+ yast2-schema
+ yast2-security
+ yast2-slp
+ yast2-sound
+ yast2-storage
+ yast2-storage-evms
+ yast2-storage-lib
+ yast2-sudo
+ yast2-support
+ yast2-sysconfig
+ yast2-theme-openSUSE
+ yast2-trans-de
+ yast2-transfer
+ yast2-trans-stats
+ yast2-tune
+ yast2-tv
+ yast2-update
+ yast2-users
+ yast2-x11
+ yast2-xml
+ ypbind
+ yp-tools
+ zip
+ zisofs-tools
+ zlib
+ zsh
+ zvbi
+ END
+</selection>
+<selection gnome>
+ base = textmode
+ packages = <<END
+ END
+</selection>
+<selection default>
+ base = minimal
+</selection>
diff --git a/src/lib/distro-info/suse-10.3/settings.example b/src/lib/distro-info/suse-10.3/settings.example
new file mode 100644
index 00000000..97d663ed
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3/settings.example
@@ -0,0 +1,23 @@
+# rename this file to 'settings' and edit it as you please
+#
+# for a list of all options, have a look at the corresponding
+# settings.default in /opt/openslx/share/distro-info
+
+# use local installation source
+#<repository base>
+# local-url = /srv/ftp/pub/opensuse/distribution/10.3/repo/oss
+#</repository>
+#<repository base_non-oss>
+# local-url = /srv/ftp/pub/opensuse/distribution/10.3/repo/non-oss
+#</repository>
+#<repository base_update>
+# local-url = /srv/ftp/pub/suse/update/10.3
+#</repository>
+
+# add a new selection:
+#<selection my_kde>
+# base = kde
+# packages = <<END
+# kinternet
+# END
+#</selection>
diff --git a/src/lib/distro-info/suse-10.3/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc b/src/lib/distro-info/suse-10.3/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc
new file mode 100644
index 00000000..89fc35cf
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc
@@ -0,0 +1,17 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.4-svn0 (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/src/lib/distro-info/suse-10.3/trusted-package-keys/gpg-pubkey-307e3d54-44201d5d.asc b/src/lib/distro-info/suse-10.3/trusted-package-keys/gpg-pubkey-307e3d54-44201d5d.asc
new file mode 100644
index 00000000..2d21c1ba
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3/trusted-package-keys/gpg-pubkey-307e3d54-44201d5d.asc
@@ -0,0 +1,13 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.4-svn0 (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/src/lib/distro-info/suse-10.3/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc b/src/lib/distro-info/suse-10.3/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc
new file mode 100644
index 00000000..894a4630
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc
@@ -0,0 +1,30 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.4-svn0 (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/src/lib/distro-info/suse-10.3/trusted-package-keys/gpg-pubkey-7e2e3b05-44748aba.asc b/src/lib/distro-info/suse-10.3/trusted-package-keys/gpg-pubkey-7e2e3b05-44748aba.asc
new file mode 100644
index 00000000..a4be6b8b
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3/trusted-package-keys/gpg-pubkey-7e2e3b05-44748aba.asc
@@ -0,0 +1,20 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.4-svn0 (GNU/Linux)
+
+mQGiBER0iroRBADfqUeJmPCXqPJFnf3CVKy40dL1F+gfvP+JHN7/uu4c9+oCYjI1
+uAE8iGTm/Twb/Zzbs4dt0iWjhNFXbRi42rMww4d/8QcPYZ21WSehh+fv8nCjt2sw
+LeC87ar2SR8OTpJBK0fQlcd4e6H5GMntfI6SYEUOPd8m/eQ+4+1AxpUUpwCgswaF
+13fePZGI//pDn5tGjbvmaP8D/R3qum/I+oDS8lbFeeDS10GkEkwTYec13gdfsq6I
+yzIj7VBsC+rGfbipv+VGR61Q4d19pOHKLDekr9OG+3G4ZcYM4NQvQZR+QIlp3xWu
+nBmYD1LRkHLVj+Z4DGQhjjOffkPSuacKPymMaZ/aRiLgTIAo97W2YPhutscXrLSG
+2Y+BA/4jsyaDb7kbW4wc8RtPIcuFEheVqgBeRakP9Uj47kBMBEpPtI/mIdY5liKk
+ztKnuQG6ROYLNV/PW0ZbE1uT64C710weh4cB3PnZLV5P10deDLBjHk8MJQGCTSDD
+JYvhutUzQfshAU6j2kErGvKdZxWGezab34vFyMP2oLGqswPAJrRQTm92ZWxsIFBy
+b3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20pIDxub3ZlbGwt
+cHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6IZgQTEQIAJgUCRHSKugIbAwUJA8JnAAYL
+CQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEBTCi8l+LjsFWEoAn13x+5ObqkW08gYF
+YNDlcGPjQuGPAJ9kAQbVUvvh1u9mBgu91cQ9W/TkHYhGBBMRAgAGBQJEexD/AAoJ
+EKhO2uicgArKFLwAn0B+g2mJ5n8LrBziTQ5SjnSPyDBXAJwJoYTta5Sfw/3vVGpU
+fJAKVDoB9w==
+=tJSz
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-10.3/trusted-package-keys/gpg-pubkey-9c800aca-40d8063e.asc b/src/lib/distro-info/suse-10.3/trusted-package-keys/gpg-pubkey-9c800aca-40d8063e.asc
new file mode 100644
index 00000000..67eedcf6
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3/trusted-package-keys/gpg-pubkey-9c800aca-40d8063e.asc
@@ -0,0 +1,37 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.4-svn0 (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/src/lib/distro-info/suse-10.3/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc b/src/lib/distro-info/suse-10.3/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc
new file mode 100644
index 00000000..279397c3
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc
@@ -0,0 +1,31 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.4-svn0 (GNU/Linux)
+
+mQILBERqCJkBEACdqhZWdAbUHLIumXMEgv+GFjr1ZzVHgynnFOzztU/8sxZNa9cm
+YV4HZpVfjMr7fos3ArzyiPPt/336cf7w9p79/ZS4rHSNPDMlPCtXYvFxUbvU0/GY
+q4jwcBsrJ0xaJ9CP5bWyAgVKOb7Y6k0ktaLjRR+tDfMsHA4H0ClMoRr6ATw8NL0e
+VCfAHuzqCKvX1If8ng+wTivtAhKvz/WwQiELNELmPfc5tZHOw8NgP/r0Pze18Hn2
+dlAHu0WpC7uoR00vscsMIJiJJPcsxbL1F1eADKnk+wEy8Go+EJeJ5i0WoFbqD52q
+Lv/C/oY6NVtVY0MBwtn+oQNSnQ4JBsB/Akdt53LAi0ZtNQxMyUW+76R8FCOmVCV8
+WGiF5CPRP0yvG80AMBjBjKjHb/v8ov5MnIyFimzAHS1gQcUNxTEYA/5eFwoYcGcK
+weGq9FUjPTzLQAgvp7XmOzHpSAfJ7qysxFTepNsSZZhgizJyInrdQldr+GYcUNqB
+krD9MWmFop975OxhCTEnNv/HcE79r8WD26HzDFYxTiTJbr0pU/ivBzo+rjq+YG2V
+stJk+udVYmZTnC4LmXus8JiNuqBXbxNscwCBpcJ8YcfCV6uh+7E0XfXZsgVUFLp1
+NF+ylYRGTycOlWoZODrnJevZW7N9O3bWRx/G2P4bJD07LsDLe4i5hymf5QAGKbRQ
+Tm92ZWxsIFByb3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20p
+IDxub3ZlbGwtcHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6JAjMEEwECAB0FAkRqCJkG
+CwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRBHijLooZEiCKSFD/93vZHCAMLEfksU
+KnvXl08bv1rfuamuyJnE3ANRE5RDyypriHMCnkVxazvQ2WI4W4UEjluL9+SzZwtV
+ZvKVoAr31614nSyWwv2YnJTHfjMG+xRlkolZMnuIiB9PcCBo9+GPU0ABuzo4pEJW
+NIRoSS1NFbAZBhtUnY0cN+trM5QObLl7xXTavLyGk//blkk57fov7GXsQJlZUig0
+l2yt5XNyGpLUnTMDumHh8b389quF+0+ZfdwOy7A768xjipAZiTvIujBrEv51wrxh
+0HBT0VGA0MhD9t0B+Ce4BM9P/iVMO00naaOp6PqMfPPKxQQqer8qy1i6UWBx95SY
+mKZBIvOm2d9PezDxkckCu61r6krx1iKnT1wdprCAkIYwALK118SpbxuyGW0bhRHc
+wsc/akzWH72fS0Xu49mvL4k4A2U9asdeQid3dMgbtm5mSWof0yiU/G4YNn0yeXoY
+oG1VbCAqQbFX1Rvd6GITJVqI+ekW/uMA9BP78dF8wBeG0+QmpQnSf+eOsxB/RT8o
+Kb4hHY+29MUlg+i9ceVt7hoKr03J/uIG5TXFXRYLaI0iAFVlKfWxpqDfS2XA4+dD
+VYt+5RDgBcnxDaTB4FE9GqcYScNfe7+NFtL0p0wOPftbmgZzGjucTmrD8mDUNdqA
+xGK7vlk4GATSfOQlq7G6LXW6RYnInohGBBMRAgAGBQJEazMlAAoJEKhO2uicgArK
+2vMAn0TbVDESEVKVuFZStrfIzOvJQrR9AJsH733Ju1kE99GFrdfCeGqpckmNhg==
+=E+qN
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-10.3/trusted-package-keys/pubring.gpg b/src/lib/distro-info/suse-10.3/trusted-package-keys/pubring.gpg
new file mode 100644
index 00000000..5e96ad54
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3/trusted-package-keys/pubring.gpg
Binary files differ
diff --git a/src/lib/distro-info/suse-10.3_x86_64/export-filter.example b/src/lib/distro-info/suse-10.3_x86_64/export-filter.example
new file mode 100644
index 00000000..a414fef4
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3_x86_64/export-filter.example
@@ -0,0 +1,15 @@
+# this file defines the filter rules used when exporting a vendor-OS
+# of this distro
+#
+# copy this file to 'export-filter' and add your own filters to it
+# in order to overrule the filters provided by openslx
+#
+#Examples:
+# the following line would include anything below /var/spool/
+#+ /var/spool/*
+#
+# this would exclude anything in /etc that starts with dhcpd.conf
+#- /etc/dhcpd.conf*
+#
+# and this would exclude all rpmnew-files:
+#- *.rpmnew
diff --git a/src/lib/distro-info/suse-10.3_x86_64/mirrors/base b/src/lib/distro-info/suse-10.3_x86_64/mirrors/base
new file mode 100644
index 00000000..e990f44a
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3_x86_64/mirrors/base
@@ -0,0 +1,246 @@
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/10.3/repo/oss
+http://opensuse.mirror.ac.za/opensuse/distribution/10.3/repo/oss
+http://www.lizardsource.cn/distribution/10.3/repo/oss
+http://mirror.alva.ge/pub/opensuse/distribution/10.3/repo/oss
+ftp://www.lizardsource.cn/distribution/10.3/repo/oss
+http://mirror.lupaworld.com/opensuse/distribution/10.3/repo/oss
+http://download.opensuse.or.id/distribution/10.3/repo/oss
+http://mirror.unej.ac.id/opensuse/distribution/10.3/repo/oss
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/10.3/repo/oss
+http://mirror.alva.ge/pub/opensuse/distribution/10.3/repo/oss
+http://repo.ugm.ac.id/opensuse/distribution/10.3/repo/oss
+http://dl2.foss-id.web.id/opensuse/distribution/10.3/repo/oss
+http://mirror.isoc.org.il/pub/opensuse/distribution/10.3/repo/oss
+http://opensuse.cbn.net.id/distribution/10.3/repo/oss
+ftp://opensuse.cbn.net.id/pub/opensuse/distribution/10.3/repo/oss
+ftp://opensuse.mirror.ac.za/opensuse/distribution/10.3/repo/oss
+ftp://mirror.isoc.org.il/opensuse/distribution/10.3/repo/oss
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/10.3/repo/oss
+http://ftp.kddilabs.jp/Linux/packages/opensuse/distribution/10.3/repo/oss
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/10.3/repo/oss
+ftp://mirror.unej.ac.id/opensuse/distribution/10.3/repo/oss
+ftp://repo.ugm.ac.id/opensuse/distribution/10.3/repo/oss
+ftp://dl2.foss-id.web.id/repo/opensuse/distribution/10.3/repo/oss
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/distribution/10.3/repo/oss
+http://ftp.novell.co.jp/pub/opensuse/distribution/10.3/repo/oss
+http://ftp.riken.jp/Linux/opensuse/distribution/10.3/repo/oss
+http://ftp.daum.net/opensuse/distribution/10.3/repo/oss
+http://77.88.19.68/opensuse/distribution/10.3/repo/oss
+ftp://ftp.novell.co.jp/pub/opensuse/distribution/10.3/repo/oss
+http://77.88.19.73/opensuse/distribution/10.3/repo/oss
+http://mirror.suse.ru/distribution/10.3/repo/oss
+http://77.88.19.74/opensuse/distribution/10.3/repo/oss
+http://93.158.155.193/opensuse/distribution/10.3/repo/oss
+ftp://ftp.riken.jp/Linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp.chg.ru/pub/opensuse/distribution/10.3/repo/oss
+http://mirror.nus.edu.sg/opensuse/distribution/10.3/repo/oss
+ftp://seeder.yandex.net/opensuse/distribution/10.3/repo/oss
+ftp://dispenser.yandex.net/opensuse/distribution/10.3/repo/oss
+ftp://allotter.yandex.net/opensuse/distribution/10.3/repo/oss
+ftp://spreader.yandex.net/opensuse/distribution/10.3/repo/oss
+http://ftp.chg.ru/pub/opensuse/distribution/10.3/repo/oss
+http://ftp.isu.edu.tw/pub/Linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp.kaist.ac.kr/opensuse/distribution/10.3/repo/oss
+http://ftp.ncnu.edu.tw/Linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/10.3/repo/oss
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/10.3/repo/oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/10.3/repo/oss
+ftp://ftp.isu.edu.tw/pub/Linux/OpenSuSE/distribution/10.3/repo/oss
+http://ftp.twaren.net/Linux/OpenSuSE/distribution/10.3/repo/oss
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/10.3/repo/oss
+ftp://mirror.in.th/opensuse/distribution/10.3/repo/oss
+http://suse.inode.at/opensuse/distribution/10.3/repo/oss
+ftp://ftp.twaren.net/Linux/OpenSuSE/distribution/10.3/repo/oss
+http://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/10.3/repo/oss
+http://mirror.opensuse.com.ba/opensuse/distribution/10.3/repo/oss
+ftp://suse.inode.at/opensuse/distribution/10.3/repo/oss
+http://suse.lagis.at/opensuse/distribution/10.3/repo/oss
+http://ftp.tugraz.at/mirror/opensuse/distribution/10.3/repo/oss
+http://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/10.3/repo/oss
+ftp://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/10.3/repo/oss
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/10.3/repo/oss
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/10.3/repo/oss
+http://mirrors.netbg.com/opensuse/distribution/10.3/repo/oss
+http://mirror.switch.ch/ftp/mirror/opensuse/distribution/10.3/repo/oss
+ftp://mirror.switch.ch/mirror/opensuse/distribution/10.3/repo/oss
+http://mirror.karneval.cz/pub/linux/opensuse/distribution/10.3/repo/oss
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/10.3/repo/oss
+ftp://mirrors.netbg.com/opensuse/distribution/10.3/repo/oss
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/10.3/repo/oss
+http://ftp.linux.cz/pub/linux/opensuse/distribution/10.3/repo/oss
+ftp://suse.lagis.at/opensuse/distribution/10.3/repo/oss
+http://ftp.halifax.rwth-aachen.de/opensuse/distribution/10.3/repo/oss
+ftp://mirror.karneval.cz/pub/linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp.tugraz.at/mirror/opensuse/distribution/10.3/repo/oss
+http://ftp5.gwdg.de/pub/opensuse/distribution/10.3/repo/oss
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/distribution/10.3/repo/oss
+http://download.uni-hd.de/ftp/pub/linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/distribution/10.3/repo/oss
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/10.3/repo/oss
+http://opensuse.intergenia.de/distribution/10.3/repo/oss
+ftp://ftp5.gwdg.de/pub/opensuse/distribution/10.3/repo/oss
+ftp://ftp.halifax.rwth-aachen.de/opensuse/distribution/10.3/repo/oss
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp.uni-ulm.de/mirrors/opensuse/distribution/10.3/repo/oss
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/10.3/repo/oss
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/10.3/repo/oss
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/10.3/repo/oss
+http://ftp.uni-kl.de/pub/linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/10.3/repo/oss
+ftp://ftp.uni-kl.de/pub/linux/opensuse/distribution/10.3/repo/oss
+http://ftp3.gwdg.de/pub/opensuse/distribution/10.3/repo/oss
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/distribution/10.3/repo/oss
+http://widehat.opensuse.org/distribution/10.3/repo/oss
+ftp://ftp3.gwdg.de/pub/opensuse/distribution/10.3/repo/oss
+http://ftp4.gwdg.de/pub/opensuse/distribution/10.3/repo/oss
+http://ftp.uni-kassel.de/opensuse/distribution/10.3/repo/oss
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/10.3/repo/oss
+http://ftp.uni-ulm.de/mirrors/opensuse/distribution/10.3/repo/oss
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/10.3/repo/oss
+ftp://ftp4.gwdg.de/pub/opensuse/distribution/10.3/repo/oss
+http://ftp.uni-bayreuth.de/linux/opensuse/distribution/10.3/repo/oss
+http://opensuse-linuxmigratio.at/distribution/10.3/repo/oss
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/distribution/10.3/repo/oss
+http://ftp.tu-ilmenau.de/mirror/opensuse/distribution/10.3/repo/oss
+http://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/10.3/repo/oss
+http://ftp.uni-siegen.de/opensuse/distribution/10.3/repo/oss
+ftp://ftp.uni-siegen.de/pub/opensuse/distribution/10.3/repo/oss
+ftp://ftp.uni-bayreuth.de/linux/opensuse/distribution/10.3/repo/oss
+http://ftp.klid.dk/ftp/opensuse/distribution/10.3/repo/oss
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/distribution/10.3/repo/oss
+http://ftp.estpak.ee/pub/suse/opensuse/distribution/10.3/repo/oss
+http://suse.bifi.unizar.es/opensuse/distribution/10.3/repo/oss
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/10.3/repo/oss
+ftp://ftp.rediris.es/pub/mirror/opensuse/distribution/10.3/repo/oss
+ftp://ftp.klid.dk/opensuse/distribution/10.3/repo/oss
+http://ftp.rediris.es/pub/mirror/opensuse/distribution/10.3/repo/oss
+http://mirror.ovh.net/opensuse/distribution/10.3/repo/oss
+http://ftp.gui.uva.es/sites/opensuse.org/distribution/10.3/repo/oss
+ftp://ftp.gui.uva.es/sites/opensuse.org/distribution/10.3/repo/oss
+http://fr2.rpmfind.net/linux/opensuse/distribution/10.3/repo/oss
+ftp://fr2.rpmfind.net/linux/opensuse/distribution/10.3/repo/oss
+http://opensuse.cict.fr/distribution/10.3/repo/oss
+ftp://mirror.cict.fr/opensuse/distribution/10.3/repo/oss
+http://opensuse.mirrors.proxad.net/opensuse/distribution/10.3/repo/oss
+http://www.mirrorservice.org/sites/download.opensuse.org/distribution/10.3/repo/oss
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/10.3/repo/oss
+ftp://mirror.ovh.net/opensuse/distribution/10.3/repo/oss
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/10.3/repo/oss
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/distribution/10.3/repo/oss
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/10.3/repo/oss
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/distribution/10.3/repo/oss
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/10.3/repo/oss
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/10.3/repo/oss
+http://ftp.ntua.gr/pub/linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/10.3/repo/oss
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/distribution/10.3/repo/oss
+http://roxen.integrity.hu/pub/opensuse/distribution/10.3/repo/oss
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/10.3/repo/oss
+ftp://ftp.ntua.gr/pub/linux/opensusedistribution/10.3/repo/oss
+ftp://www.mirrorservice.org/sites/download.opensuse.org/distribution/10.3/repo/oss
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/10.3/repo/oss
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/10.3/repo/oss
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/10.3/repo/oss
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/10.3/repo/oss
+http://rm.mirror.garr.it/mirrors/opensuse/distribution/10.3/repo/oss
+ftp://rm.mirror.garr.it/mirrors/opensusedistribution/10.3/repo/oss
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/10.3/repo/oss
+http://mirror.leaseweb.com/opensuse/distribution/10.3/repo/oss
+http://mirrors.nl.eu.kernel.org/opensuse/distribution/10.3/repo/oss
+http://repo1.linux.edu.lv/distribution/10.3/repo/oss
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/distribution/10.3/repo/oss
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/10.3/repo/oss
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/distribution/10.3/repo/oss
+ftp://mirror.leaseweb.com/opensuse/distribution/10.3/repo/oss
+http://opensuse.hro.nl/opensuse/distribution/10.3/repo/oss
+ftp://repo1.linux.edu.lv/distribution/10.3/repo/oss
+ftp://opensuse.hro.nl/opensuse/distribution/10.3/repo/oss
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/distribution/10.3/repo/oss
+http://opensuse.uib.no/distribution/10.3/repo/oss
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/distribution/10.3/repo/oss
+ftp://mirrors.nl.eu.kernel.org/opensuse/distribution/10.3/repo/oss
+http://ftp.uninett.no/pub/linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/distribution/10.3/repo/oss
+http://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/10.3/repo/oss
+ftp://ftp.uninett.no/pub/linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/10.3/repo/oss
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/10.3/repo/oss
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/10.3/repo/oss
+http://ftp.sileman.pl/pub/opensuse/distribution/10.3/repo/oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/10.3/repo/oss
+http://cesium.di.uminho.pt/pub/opensuse/distribution/10.3/repo/oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/10.3/repo/oss
+http://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/10.3/repo/oss
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/10.3/repo/oss
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/10.3/repo/oss
+http://ftp.gts.lug.ro/opensuse/distribution/10.3/repo/oss
+ftp://ftp.sileman.pl/pub/opensuse/distribution/10.3/repo/oss
+http://ftp.ines.lug.ro/opensuse/distribution/10.3/repo/oss
+ftp://ftp.ines.lug.ro/opensuse/distribution/10.3/repo/oss
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/10.3/repo/oss
+http://mirrors.se.eu.kernel.org/opensuse/distribution/10.3/repo/oss
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/10.3/repo/oss
+ftp://cesium.di.uminho.pt/pub/opensuse/distribution/10.3/repo/oss
+http://ftp.df.lth.se/pub/opensuse/distribution/10.3/repo/oss
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/10.3/repo/oss
+ftp://mirrors.se.eu.kernel.org/opensuse/distribution/10.3/repo/oss
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/10.3/repo/oss
+http://opensuse.ynet.sk/distribution/10.3/repo/oss
+ftp://ftp.gts.lug.ro/opensuse/distribution/10.3/repo/oss
+http://less.cogeco.net/ftp/openSUSE/distribution/10.3/repo/oss
+http://www.muug.mb.ca/pub/opensuse/distribution/10.3/repo/oss
+http://linux.dell.com/repo/community/distribution/10.3/repo/oss
+ftp://ftp.df.lth.se/pub/opensusedistribution/10.3/repo/oss
+http://ftp.osuosl.org/pub/opensuse/distribution/10.3/repo/oss
+ftp://less.cogeco.net/openSUSE/distribution/10.3/repo/oss
+ftp://ftp.osuosl.org/pub/opensuse/distribution/10.3/repo/oss
+http://opensuse.fastsoft.net/pub/linux/opensuse/distribution/10.3/repo/oss
+http://suse.mirrors.tds.net/pub/opensuse/distribution/10.3/repo/oss
+http://mirrors.med.harvard.edu/opensuse/distribution/10.3/repo/oss
+http://mirror.anl.gov/pub/opensuse/opensuse/distribution/10.3/repo/oss
+http://mirror.umoss.org/opensuse/distribution/10.3/repo/oss
+http://opensuse.cs.utah.edu/distribution/10.3/repo/oss
+http://mirrors.xmission.com/opensuse/distribution/10.3/repo/oss
+ftp://mirror.anl.gov/pub/opensuse/opensuse/distribution/10.3/repo/oss
+ftp://mirrors.xmission.com/opensuse/distribution/10.3/repo/oss
+http://mirrors2.kernel.org/opensuse/distribution/10.3/repo/oss
+http://opensuse.ca.unixheads.org/distribution/10.3/repo/oss
+http://mirrors1.kernel.org/opensuse/distribution/10.3/repo/oss
+ftp://opensuse.cs.utah.edu/pub/opensuse/distribution/10.3/repo/oss
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/distribution/10.3/repo/oss
+ftp://mirrors2.kernel.org/opensuse/distribution/10.3/repo/oss
+http://mirror.rackspace.com/openSUSE/distribution/10.3/repo/oss
+ftp://mirrors1.kernel.org/opensuse/distribution/10.3/repo/oss
+ftp://mirror.rackspace.com/openSUSE/distribution/10.3/repo/oss
+http://130.57.19.201/distribution/10.3/repo/oss
+http://ftp.utexas.edu/opensuse/distribution/10.3/repo/oss
+ftp://130.57.19.201/pub/opensuse/distribution/10.3/repo/oss
+http://www.gtlib.gatech.edu/pub/opensuse/distribution/10.3/repo/oss
+ftp://www.gtlib.gatech.edu/pub/opensuse/distribution/10.3/repo/oss
+http://ftp.ussg.iu.edu/linux/opensuse/distribution/10.3/repo/oss
+ftp://ftp.utexas.edu/mirrors/opensuse/distribution/10.3/repo/oss
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/distribution/10.3/repo/oss
+http://mirror.cps.cmich.edu/opensuse/opensuse/distribution/10.3/repo/oss
+http://mirror.nyi.net/opensuse/distribution/10.3/repo/oss
+http://mirrors.rit.edu/opensuse/distribution/10.3/repo/oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/10.3/repo/oss
+http://ftp.iinet.net.au/pub/opensuse/distribution/10.3/repo/oss
+ftp://ftp.iinet.net.au/pub/opensuse/distribution/10.3/repo/oss
+http://mirror.internode.on.net/pub/opensuse/distribution/10.3/repo/oss
+ftp://mirror.nyi.net/opensusedistribution/10.3/repo/oss
+http://mirror.pacific.net.au/linux/opensuse/distribution/10.3/repo/oss
+ftp://mirror.internode.on.net/pub/opensuse/distribution/10.3/repo/oss
+http://ftp.netspace.net.au/pub/opensuse/distribution/10.3/repo/oss
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/10.3/repo/oss
+http://200.221.9.37/pub/opensuse/distribution/10.3/repo/oss
+ftp://mirror.pacific.net.au/linux/opensuse/distribution/10.3/repo/oss
+http://opensuse.patan.com.ar/distribution/10.3/repo/oss
+http://opensuse.c3sl.ufpr.br/distribution/10.3/repo/oss
+http://opensuse.pop.com.br/distribution/10.3/repo/oss
+ftp://opensuse.c3sl.ufpr.br/opensuse/distribution/10.3/repo/oss
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/10.3/repo/oss
diff --git a/src/lib/distro-info/suse-10.3_x86_64/mirrors/base_non-oss b/src/lib/distro-info/suse-10.3_x86_64/mirrors/base_non-oss
new file mode 100644
index 00000000..dafe5ee0
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3_x86_64/mirrors/base_non-oss
@@ -0,0 +1,241 @@
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/10.3/repo/non-oss
+http://opensuse.mirror.ac.za/opensuse/distribution/10.3/repo/non-oss
+http://mirror.lupaworld.com/opensuse/distribution/10.3/repo/non-oss
+http://mirror.alva.ge/pub/opensuse/distribution/10.3/repo/non-oss
+http://www.lizardsource.cn/distribution/10.3/repo/non-oss
+http://mirror.alva.ge/pub/opensuse/distribution/10.3/repo/non-oss
+http://download.opensuse.or.id/distribution/10.3/repo/non-oss
+ftp://opensuse.mirror.ac.za/opensuse/distribution/10.3/repo/non-oss
+ftp://www.lizardsource.cn/distribution/10.3/repo/non-oss
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/10.3/repo/non-oss
+http://repo.ugm.ac.id/opensuse/distribution/10.3/repo/non-oss
+http://dl2.foss-id.web.id/opensuse/distribution/10.3/repo/non-oss
+http://mirror.isoc.org.il/pub/opensuse/distribution/10.3/repo/non-oss
+http://opensuse.cbn.net.id/distribution/10.3/repo/non-oss
+http://mirror.unej.ac.id/opensuse/distribution/10.3/repo/non-oss
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/10.3/repo/non-oss
+ftp://repo.ugm.ac.id/opensuse/distribution/10.3/repo/non-oss
+http://ftp.kddilabs.jp/Linux/packages/opensuse/distribution/10.3/repo/non-oss
+ftp://dl2.foss-id.web.id/repo/opensuse/distribution/10.3/repo/non-oss
+ftp://mirror.isoc.org.il/opensuse/distribution/10.3/repo/non-oss
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/10.3/repo/non-oss
+http://ftp.riken.jp/Linux/opensuse/distribution/10.3/repo/non-oss
+ftp://opensuse.cbn.net.id/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.novell.co.jp/pub/opensuse/distribution/10.3/repo/non-oss
+http://ftp.daum.net/opensuse/distribution/10.3/repo/non-oss
+http://ftp.novell.co.jp/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.riken.jp/Linux/opensuse/distribution/10.3/repo/non-oss
+http://77.88.19.68/opensuse/distribution/10.3/repo/non-oss
+http://77.88.19.73/opensuse/distribution/10.3/repo/non-oss
+http://mirror.suse.ru/distribution/10.3/repo/non-oss
+http://77.88.19.74/opensuse/distribution/10.3/repo/non-oss
+http://93.158.155.193/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.kaist.ac.kr/opensuse/distribution/10.3/repo/non-oss
+ftp://dispenser.yandex.net/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.chg.ru/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://allotter.yandex.net/opensuse/distribution/10.3/repo/non-oss
+http://mirror.nus.edu.sg/opensuse/distribution/10.3/repo/non-oss
+ftp://seeder.yandex.net/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/10.3/repo/non-oss
+http://ftp.chg.ru/pub/opensuse/distribution/10.3/repo/non-oss
+http://ftp.isu.edu.tw/pub/Linux/opensuse/distribution/10.3/repo/non-oss
+ftp://mirror.in.th/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/10.3/repo/non-oss
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/10.3/repo/non-oss
+http://ftp.ncnu.edu.tw/Linux/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/distribution/10.3/repo/non-oss
+http://ftp.twaren.net/Linux/OpenSuSE/distribution/10.3/repo/non-oss
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/10.3/repo/non-oss
+http://suse.inode.at/opensuse/distribution/10.3/repo/non-oss
+ftp://suse.inode.at/opensuse/distribution/10.3/repo/non-oss
+http://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/10.3/repo/non-oss
+http://ftp.tugraz.at/mirror/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.twaren.net/Linux/OpenSuSE/distribution/10.3/repo/non-oss
+http://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/10.3/repo/non-oss
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/10.3/repo/non-oss
+ftp://suse.lagis.at/opensuse/distribution/10.3/repo/non-oss
+http://mirror.opensuse.com.ba/opensuse/distribution/10.3/repo/non-oss
+http://mirrors.netbg.com/opensuse/distribution/10.3/repo/non-oss
+http://mirror.switch.ch/ftp/mirror/opensuse/distribution/10.3/repo/non-oss
+ftp://mirrors.netbg.com/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/10.3/repo/non-oss
+http://ftp.linux.cz/pub/linux/opensuse/distribution/10.3/repo/non-oss
+http://suse.lagis.at/opensuse/distribution/10.3/repo/non-oss
+http://mirror.karneval.cz/pub/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/10.3/repo/non-oss
+ftp://mirror.karneval.cz/pub/linux/opensuse/distribution/10.3/repo/non-oss
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/10.3/repo/non-oss
+http://ftp5.gwdg.de/pub/opensuse/distribution/10.3/repo/non-oss
+http://ftp.halifax.rwth-aachen.de/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.halifax.rwth-aachen.de/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.tugraz.at/mirror/opensuse/distribution/10.3/repo/non-oss
+ftp://mirror.switch.ch/mirror/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp5.gwdg.de/pub/opensuse/distribution/10.3/repo/non-oss
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/distribution/10.3/repo/non-oss
+http://download.uni-hd.de/ftp/pub/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/10.3/repo/non-oss
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/distribution/10.3/repo/non-oss
+http://opensuse.intergenia.de/distribution/10.3/repo/non-oss
+http://ftp.uni-ulm.de/mirrors/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/10.3/repo/non-oss
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/10.3/repo/non-oss
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/10.3/repo/non-oss
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/distribution/10.3/repo/non-oss
+http://ftp.uni-kl.de/pub/linux/opensuse/distribution/10.3/repo/non-oss
+http://ftp3.gwdg.de/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.uni-ulm.de/mirrors/opensuse/distribution/10.3/repo/non-oss
+http://widehat.opensuse.org/distribution/10.3/repo/non-oss
+http://ftp4.gwdg.de/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.uni-kl.de/pub/linux/opensuse/distribution/10.3/repo/non-oss
+http://ftp.uni-kassel.de/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/distribution/10.3/repo/non-oss
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/10.3/repo/non-oss
+http://ftp.uni-bayreuth.de/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp4.gwdg.de/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp3.gwdg.de/pub/opensuse/distribution/10.3/repo/non-oss
+http://opensuse-linuxmigratio.at/distribution/10.3/repo/non-oss
+http://ftp.tu-ilmenau.de/mirror/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/distribution/10.3/repo/non-oss
+http://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/10.3/repo/non-oss
+http://ftp.klid.dk/ftp/opensuse/distribution/10.3/repo/non-oss
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/10.3/repo/non-oss
+http://ftp.estpak.ee/pub/suse/opensuse/distribution/10.3/repo/non-oss
+http://ftp.uni-siegen.de/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.uni-siegen.de/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.uni-bayreuth.de/linux/opensuse/distribution/10.3/repo/non-oss
+http://suse.bifi.unizar.es/opensuse/distribution/10.3/repo/non-oss
+http://ftp.gui.uva.es/sites/opensuse.org/distribution/10.3/repo/non-oss
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.gui.uva.es/sites/opensuse.org/distribution/10.3/repo/non-oss
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/10.3/repo/non-oss
+http://opensuse.mirrors.proxad.net/opensuse/distribution/10.3/repo/non-oss
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/distribution/10.3/repo/non-oss
+http://ftp.rediris.es/pub/mirror/opensuse/distribution/10.3/repo/non-oss
+http://mirror.ovh.net/opensuse/distribution/10.3/repo/non-oss
+ftp://mirror.cict.fr/opensuse/distribution/10.3/repo/non-oss
+http://fr2.rpmfind.net/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://mirror.ovh.net/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.klid.dk/opensuse/distribution/10.3/repo/non-oss
+http://opensuse.cict.fr/distribution/10.3/repo/non-oss
+http://www.mirrorservice.org/sites/download.opensuse.org/distribution/10.3/repo/non-oss
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.rediris.es/pub/mirror/opensuse/distribution/10.3/repo/non-oss
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/distribution/10.3/repo/non-oss
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/distribution/10.3/repo/non-oss
+ftp://www.mirrorservice.org/sites/download.opensuse.org/distribution/10.3/repo/non-oss
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/10.3/repo/non-oss
+ftp://fr2.rpmfind.net/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.ntua.gr/pub/linux/opensusedistribution/10.3/repo/non-oss
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/10.3/repo/non-oss
+http://roxen.integrity.hu/pub/opensuse/distribution/10.3/repo/non-oss
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/10.3/repo/non-oss
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/10.3/repo/non-oss
+http://ftp.ntua.gr/pub/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/10.3/repo/non-oss
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/10.3/repo/non-oss
+http://rm.mirror.garr.it/mirrors/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/10.3/repo/non-oss
+http://repo1.linux.edu.lv/distribution/10.3/repo/non-oss
+ftp://repo1.linux.edu.lv/distribution/10.3/repo/non-oss
+http://mirror.leaseweb.com/opensuse/distribution/10.3/repo/non-oss
+http://mirrors.nl.eu.kernel.org/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/10.3/repo/non-oss
+ftp://rm.mirror.garr.it/mirrors/opensusedistribution/10.3/repo/non-oss
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/distribution/10.3/repo/non-oss
+ftp://mirrors.nl.eu.kernel.org/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/distribution/10.3/repo/non-oss
+http://opensuse.hro.nl/opensuse/distribution/10.3/repo/non-oss
+ftp://opensuse.hro.nl/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/distribution/10.3/repo/non-oss
+http://opensuse.uib.no/distribution/10.3/repo/non-oss
+http://ftp.uninett.no/pub/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.uninett.no/pub/linux/opensuse/distribution/10.3/repo/non-oss
+http://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/10.3/repo/non-oss
+ftp://mirror.leaseweb.com/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/10.3/repo/non-oss
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/10.3/repo/non-oss
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/10.3/repo/non-oss
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/10.3/repo/non-oss
+http://cesium.di.uminho.pt/pub/opensuse/distribution/10.3/repo/non-oss
+http://ftp.sileman.pl/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/10.3/repo/non-oss
+ftp://cesium.di.uminho.pt/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.sileman.pl/pub/opensuse/distribution/10.3/repo/non-oss
+http://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/10.3/repo/non-oss
+http://ftp.gts.lug.ro/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.gts.lug.ro/opensuse/distribution/10.3/repo/non-oss
+http://ftp.ines.lug.ro/opensuse/distribution/10.3/repo/non-oss
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/10.3/repo/non-oss
+http://ftp.df.lth.se/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://mirrors.se.eu.kernel.org/opensuse/distribution/10.3/repo/non-oss
+http://mirrors.se.eu.kernel.org/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.df.lth.se/pub/opensusedistribution/10.3/repo/non-oss
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.ines.lug.ro/opensuse/distribution/10.3/repo/non-oss
+http://opensuse.ynet.sk/distribution/10.3/repo/non-oss
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/10.3/repo/non-oss
+http://less.cogeco.net/ftp/openSUSE/distribution/10.3/repo/non-oss
+ftp://less.cogeco.net/openSUSE/distribution/10.3/repo/non-oss
+http://www.muug.mb.ca/pub/opensuse/distribution/10.3/repo/non-oss
+http://linux.dell.com/repo/community/distribution/10.3/repo/non-oss
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/10.3/repo/non-oss
+http://ftp.osuosl.org/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/10.3/repo/non-oss
+http://opensuse.fastsoft.net/pub/linux/opensuse/distribution/10.3/repo/non-oss
+http://suse.mirrors.tds.net/pub/opensuse/distribution/10.3/repo/non-oss
+http://mirrors.med.harvard.edu/opensuse/distribution/10.3/repo/non-oss
+ftp://suse.mirrors.tds.net/pub/opensuse/distribution/10.3/repo/non-oss
+http://mirror.anl.gov/pub/opensuse/opensuse/distribution/10.3/repo/non-oss
+http://mirror.umoss.org/opensuse/distribution/10.3/repo/non-oss
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/distribution/10.3/repo/non-oss
+ftp://mirror.anl.gov/pub/opensuse/opensuse/distribution/10.3/repo/non-oss
+http://opensuse.cs.utah.edu/distribution/10.3/repo/non-oss
+ftp://ftp.osuosl.org/pub/opensuse/distribution/10.3/repo/non-oss
+http://opensuse.ca.unixheads.org/distribution/10.3/repo/non-oss
+ftp://opensuse.cs.utah.edu/pub/opensuse/distribution/10.3/repo/non-oss
+http://mirrors.xmission.com/opensuse/distribution/10.3/repo/non-oss
+http://mirrors2.kernel.org/opensuse/distribution/10.3/repo/non-oss
+http://mirrors1.kernel.org/opensuse/distribution/10.3/repo/non-oss
+ftp://mirrors.xmission.com/opensuse/distribution/10.3/repo/non-oss
+ftp://mirror.rackspace.com/openSUSE/distribution/10.3/repo/non-oss
+http://130.57.19.201/distribution/10.3/repo/non-oss
+ftp://mirrors2.kernel.org/opensuse/distribution/10.3/repo/non-oss
+ftp://130.57.19.201/pub/opensuse/distribution/10.3/repo/non-oss
+http://www.gtlib.gatech.edu/pub/opensuse/distribution/10.3/repo/non-oss
+http://mirror.rackspace.com/openSUSE/distribution/10.3/repo/non-oss
+ftp://mirrors1.kernel.org/opensuse/distribution/10.3/repo/non-oss
+http://ftp.ussg.iu.edu/linux/opensuse/distribution/10.3/repo/non-oss
+http://ftp.utexas.edu/opensuse/distribution/10.3/repo/non-oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/10.3/repo/non-oss
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.ussg.iu.edu/linux/opensuse/distribution/10.3/repo/non-oss
+http://mirror.cps.cmich.edu/opensuse/opensuse/distribution/10.3/repo/non-oss
+http://mirror.nyi.net/opensuse/distribution/10.3/repo/non-oss
+ftp://www.gtlib.gatech.edu/pub/opensuse/distribution/10.3/repo/non-oss
+http://mirrors.rit.edu/opensuse/distribution/10.3/repo/non-oss
+ftp://mirror.nyi.net/opensusedistribution/10.3/repo/non-oss
+http://ftp.iinet.net.au/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.utexas.edu/mirrors/opensuse/distribution/10.3/repo/non-oss
+http://mirror.pacific.net.au/linux/opensuse/distribution/10.3/repo/non-oss
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/10.3/repo/non-oss
+http://200.221.9.37/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://ftp.iinet.net.au/pub/opensuse/distribution/10.3/repo/non-oss
+http://opensuse.patan.com.ar/distribution/10.3/repo/non-oss
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/10.3/repo/non-oss
+http://opensuse.c3sl.ufpr.br/distribution/10.3/repo/non-oss
+ftp://mirror.pacific.net.au/linux/opensuse/distribution/10.3/repo/non-oss
+http://opensuse.pop.com.br/distribution/10.3/repo/non-oss
+ftp://mirror.internode.on.net/pub/opensuse/distribution/10.3/repo/non-oss
+ftp://opensuse.c3sl.ufpr.br/opensuse/distribution/10.3/repo/non-oss
diff --git a/src/lib/distro-info/suse-10.3_x86_64/mirrors/base_update b/src/lib/distro-info/suse-10.3_x86_64/mirrors/base_update
new file mode 100644
index 00000000..a8df5e3f
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3_x86_64/mirrors/base_update
@@ -0,0 +1,246 @@
+http://opensuse.mirror.ac.za/opensuse/update/10.3
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/update/10.3
+ftp://opensuse.mirror.ac.za/opensuse/update/10.3
+http://www.lizardsource.cn/update/10.3
+http://mirror.alva.ge/pub/opensuse/update/10.3
+http://mirror.lupaworld.com/opensuse/update/10.3
+http://mirror.alva.ge/pub/opensuse/update/10.3
+http://download.opensuse.or.id/update/10.3
+http://mirror.unej.ac.id/opensuse/update/10.3
+http://repo.ugm.ac.id/opensuse/update/10.3
+http://dl2.foss-id.web.id/opensuse/update/10.3
+http://mirror.isoc.org.il/pub/opensuse/update/10.3
+http://opensuse.cbn.net.id/update/10.3
+ftp://www.lizardsource.cn/update/10.3
+ftp://opensuse.cbn.net.id/pub/opensuse/update/10.3
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/update/10.3
+ftp://dl2.foss-id.web.id/repo/opensuse/update/10.3
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/update/10.3
+http://ftp.kddilabs.jp/Linux/packages/opensuse/update/10.3
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/update/10.3
+ftp://repo.ugm.ac.id/opensuse/update/10.3
+http://ftp.novell.co.jp/pub/opensuse/update/10.3
+ftp://mirror.isoc.org.il/opensuse/update/10.3
+http://ftp.riken.jp/Linux/opensuse/update/10.3
+ftp://ftp.novell.co.jp/pub/opensuse/update/10.3
+http://ftp.daum.net/opensuse/update/10.3
+ftp://mirror.unej.ac.id/opensuse/update/10.3
+http://77.88.19.68/opensuse/update/10.3
+http://77.88.19.73/opensuse/update/10.3
+http://mirror.suse.ru/update/10.3
+http://77.88.19.74/opensuse/update/10.3
+http://93.158.155.193/opensuse/update/10.3
+ftp://ftp.chg.ru/pub/opensuse/update/10.3
+ftp://ftp.kaist.ac.kr/opensuse/update/10.3
+ftp://dispenser.yandex.net/opensuse/update/10.3
+ftp://ftp.riken.jp/Linux/opensuse/update/10.3
+ftp://spreader.yandex.net/opensuse/update/10.3
+http://mirror.nus.edu.sg/opensuse/update/10.3
+http://ftp.chg.ru/pub/opensuse/update/10.3
+ftp://mirror.in.th/opensuse/update/10.3
+ftp://ftp.suntel.com.tr/pub/opensuse/update/10.3
+http://ftp.isu.edu.tw/pub/Linux/opensuse/update/10.3
+ftp://ftp.suntel.com.tr/pub/opensuse/update/10.3
+http://ftp.ncnu.edu.tw/Linux/opensuse/update/10.3
+ftp://ftp.isu.edu.tw/pub/Linux/OpenSuSE/update/10.3
+ftp://allotter.yandex.net/opensuse/update/10.3
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/update/10.3
+http://ftp.twaren.net/Linux/OpenSuSE/update/10.3
+ftp://seeder.yandex.net/opensuse/update/10.3
+ftp://ftp.twaren.net/Linux/OpenSuSE/update/10.3
+http://mirror-fpt-telecom.fpt.net/opensuse/update/10.3
+http://suse.inode.at/opensuse/update/10.3
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/update/10.3
+ftp://suse.inode.at/opensuse/update/10.3
+http://gd.tuwien.ac.at/opsys/linux/opensuse/update/10.3
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/update/10.3
+http://ftp.tugraz.at/mirror/opensuse/update/10.3
+ftp://gd.tuwien.ac.at/opsys/linux/opensuse/update/10.3
+ftp://ftp.tugraz.at/mirror/opensuse/update/10.3
+http://suse.lagis.at/opensuse/update/10.3
+ftp://suse.lagis.at/opensuse/update/10.3
+http://mirror.opensuse.com.ba/opensuse/update/10.3
+http://ftp.belnet.be/mirror/ftp.opensuse.org/update/10.3
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/update/10.3
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/update/10.3
+http://mirrors.netbg.com/opensuse/update/10.3
+http://mirror.switch.ch/ftp/mirror/opensuse/update/10.3
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/update/10.3
+http://mirror.karneval.cz/pub/linux/opensuse/update/10.3
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/update/10.3
+ftp://mirrors.netbg.com/opensuse/update/10.3
+http://ftp5.gwdg.de/pub/opensuse/update/10.3
+http://ftp.linux.cz/pub/linux/opensuse/update/10.3
+ftp://mirror.switch.ch/mirror/opensuse/update/10.3
+ftp://ftp5.gwdg.de/pub/opensuse/update/10.3
+http://ftp.halifax.rwth-aachen.de/opensuse/update/10.3
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/update/10.3
+ftp://mirror.karneval.cz/pub/linux/opensuse/update/10.3
+ftp://ftp.halifax.rwth-aachen.de/opensuse/update/10.3
+http://download.uni-hd.de/ftp/pub/linux/opensuse/update/10.3
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/update/10.3
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/update/10.3
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/update/10.3
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/update/10.3
+http://opensuse.intergenia.de/update/10.3
+http://ftp.uni-ulm.de/mirrors/opensuse/update/10.3
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/update/10.3
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/update/10.3
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/update/10.3
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/update/10.3
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/update/10.3
+ftp://ftp.uni-ulm.de/mirrors/opensuse/update/10.3
+http://ftp.uni-kl.de/pub/linux/opensuse/update/10.3
+ftp://ftp.uni-kl.de/pub/linux/opensuse/update/10.3
+http://ftp3.gwdg.de/pub/opensuse/update/10.3
+http://widehat.opensuse.org/update/10.3
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/update/10.3
+http://ftp4.gwdg.de/pub/opensuse/update/10.3
+http://ftp.uni-kassel.de/opensuse/update/10.3
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/update/10.3
+http://ftp.uni-bayreuth.de/linux/opensuse/update/10.3
+ftp://ftp4.gwdg.de/pub/opensuse/update/10.3
+ftp://ftp3.gwdg.de/pub/opensuse/update/10.3
+http://opensuse-linuxmigratio.at/update/10.3
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/update/10.3
+http://ftp.tu-ilmenau.de/mirror/opensuse/update/10.3
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/update/10.3
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/update/10.3
+http://ftp.uni-paderborn.de/pub/linux/opensuse/update/10.3
+http://ftp.uni-siegen.de/opensuse/update/10.3
+http://ftp.gui.uva.es/sites/opensuse.org/update/10.3
+ftp://ftp.uni-bayreuth.de/linux/opensuse/update/10.3
+http://ftp.klid.dk/ftp/opensuse/update/10.3
+ftp://ftp.klid.dk/opensuse/update/10.3
+ftp://ftp.gui.uva.es/sites/opensuse.org/update/10.3
+http://ftp.estpak.ee/pub/suse/opensuse/update/10.3
+http://suse.bifi.unizar.es/opensuse/update/10.3
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/update/10.3
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/update/10.3
+ftp://ftp.rediris.es/pub/mirror/opensuse/update/10.3
+http://opensuse.mirrors.proxad.net/opensuse/update/10.3
+http://mirror.ovh.net/opensuse/update/10.3
+ftp://ftp.uni-siegen.de/pub/opensuse/update/10.3
+http://fr2.rpmfind.net/linux/opensuse/update/10.3
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/update/10.3
+http://opensuse.cict.fr/update/10.3
+http://www.mirrorservice.org/sites/download.opensuse.org/update/10.3
+ftp://mirror.ovh.net/opensuse/update/10.3
+ftp://www.mirrorservice.org/sites/download.opensuse.org/update/10.3
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/update/10.3
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/update/10.3
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/update/10.3
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/update/10.3
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/update/10.3
+ftp://fr2.rpmfind.net/linux/opensuse/update/10.3
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/update/10.3
+ftp://ftp.ntua.gr/pub/linux/opensuseupdate/10.3
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/update/10.3
+http://roxen.integrity.hu/pub/opensuse/update/10.3
+http://ftp.ntua.gr/pub/linux/opensuse/update/10.3
+ftp://mirror.cict.fr/opensuse/update/10.3
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/update/10.3
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/update/10.3
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/update/10.3
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/update/10.3
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/update/10.3
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/update/10.3
+http://rm.mirror.garr.it/mirrors/opensuse/update/10.3
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/update/10.3
+http://mirror.leaseweb.com/opensuse/update/10.3
+ftp://repo1.linux.edu.lv/update/10.3
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/update/10.3
+http://mirrors.nl.eu.kernel.org/opensuse/update/10.3
+ftp://rm.mirror.garr.it/mirrors/opensuseupdate/10.3
+http://repo1.linux.edu.lv/update/10.3
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/update/10.3
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/update/10.3
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/update/10.3
+ftp://mirrors.nl.eu.kernel.org/opensuse/update/10.3
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/update/10.3
+http://opensuse.hro.nl/opensuse/update/10.3
+ftp://mirror.leaseweb.com/opensuse/update/10.3
+ftp://opensuse.hro.nl/opensuse/update/10.3
+http://opensuse.uib.no/update/10.3
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/update/10.3
+http://ftp.uninett.no/pub/linux/opensuse/update/10.3
+http://ftp.icm.edu.pl/pub/Linux/opensuse/update/10.3
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/update/10.3
+http://ftp.rediris.es/pub/mirror/opensuse/update/10.3
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/update/10.3
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/update/10.3
+http://ftp.sileman.pl/pub/opensuse/update/10.3
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/update/10.3
+ftp://ftp.sileman.pl/pub/opensuse/update/10.3
+http://cesium.di.uminho.pt/pub/opensuse/update/10.3
+ftp://ftp.pbone.net/pub/opensuse/update/10.3
+ftp://cesium.di.uminho.pt/pub/opensuse/update/10.3
+ftp://ftp.uninett.no/pub/linux/opensuse/update/10.3
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/update/10.3
+http://ftp.nux.ipb.pt/pub/dists/opensuse/update/10.3
+http://ftp.gts.lug.ro/opensuse/update/10.3
+ftp://ftp.gts.lug.ro/opensuse/update/10.3
+http://ftp.ines.lug.ro/opensuse/update/10.3
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/update/10.3
+ftp://ftp.ines.lug.ro/opensuse/update/10.3
+ftp://ftp.pbone.net/pub/opensuse/update/10.3
+http://mirrors.se.eu.kernel.org/opensuse/update/10.3
+http://ftp.df.lth.se/pub/opensuse/update/10.3
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/update/10.3
+ftp://ftp.df.lth.se/pub/opensuseupdate/10.3
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/update/10.3
+ftp://mirrors.se.eu.kernel.org/opensuse/update/10.3
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/update/10.3
+http://opensuse.ynet.sk/update/10.3
+http://less.cogeco.net/ftp/openSUSE/update/10.3
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/update/10.3
+ftp://less.cogeco.net/openSUSE/update/10.3
+http://www.muug.mb.ca/pub/opensuse/update/10.3
+http://linux.dell.com/repo/community/update/10.3
+http://ftp.osuosl.org/pub/opensuse/update/10.3
+http://opensuse.fastsoft.net/pub/linux/opensuse/update/10.3
+http://suse.mirrors.tds.net/pub/opensuse/update/10.3
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/update/10.3
+http://mirrors.med.harvard.edu/opensuse/update/10.3
+http://mirror.anl.gov/pub/opensuse/opensuse/update/10.3
+ftp://ftp.osuosl.org/pub/opensuse/update/10.3
+http://mirror.umoss.org/opensuse/update/10.3
+ftp://mirror.anl.gov/pub/opensuse/opensuse/update/10.3
+http://opensuse.cs.utah.edu/update/10.3
+http://opensuse.ca.unixheads.org/update/10.3
+ftp://opensuse.cs.utah.edu/pub/opensuse/update/10.3
+http://mirrors2.kernel.org/opensuse/update/10.3
+http://mirrors1.kernel.org/opensuse/update/10.3
+http://mirror.rackspace.com/openSUSE/update/10.3
+ftp://mirrors.xmission.com/opensuse/update/10.3
+http://130.57.19.201/update/10.3
+http://ftp.utexas.edu/opensuse/update/10.3
+ftp://mirrors2.kernel.org/opensuse/update/10.3
+ftp://130.57.19.201/pub/opensuse/update/10.3
+http://www.gtlib.gatech.edu/pub/opensuse/update/10.3
+ftp://suse.mirrors.tds.net/pub/opensuse/update/10.3
+ftp://mirrors1.kernel.org/opensuse/update/10.3
+http://mirrors.xmission.com/opensuse/update/10.3
+ftp://mirror.rackspace.com/openSUSE/update/10.3
+http://ftp.ussg.iu.edu/linux/opensuse/update/10.3
+ftp://mirror.colorado.edu/pub/opensuse/update/10.3
+ftp://www.gtlib.gatech.edu/pub/opensuse/update/10.3
+ftp://ftp.utexas.edu/mirrors/opensuse/update/10.3
+http://mirror.nyi.net/opensuse/update/10.3
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/update/10.3
+http://mirrors.rit.edu/opensuse/update/10.3
+ftp://mirror.nyi.net/opensuseupdate/10.3
+http://mirror.cps.cmich.edu/opensuse/opensuse/update/10.3
+http://ftp.iinet.net.au/pub/opensuse/update/10.3
+http://mirror.internode.on.net/pub/opensuse/update/10.3
+http://mirror.pacific.net.au/linux/opensuse/update/10.3
+ftp://ftp.iinet.net.au/pub/opensuse/update/10.3
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/update/10.3
+http://200.221.9.37/pub/opensuse/update/10.3
+http://opensuse.patan.com.ar/update/10.3
+ftp://mirror.internode.on.net/pub/opensuse/update/10.3
+http://opensuse.c3sl.ufpr.br/update/10.3
+http://opensuse.pop.com.br/update/10.3
+ftp://mirror.pacific.net.au/linux/opensuse/update/10.3
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/update/10.3
+ftp://opensuse.c3sl.ufpr.br/opensuse/update/10.3
diff --git a/src/lib/distro-info/suse-10.3_x86_64/prereqfiles/etc/group b/src/lib/distro-info/suse-10.3_x86_64/prereqfiles/etc/group
new file mode 100644
index 00000000..505cb221
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3_x86_64/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/src/lib/distro-info/suse-10.3_x86_64/prereqfiles/etc/hosts b/src/lib/distro-info/suse-10.3_x86_64/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3_x86_64/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/suse-10.3_x86_64/prereqfiles/etc/passwd b/src/lib/distro-info/suse-10.3_x86_64/prereqfiles/etc/passwd
new file mode 100644
index 00000000..9b8fc4fe
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3_x86_64/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/src/lib/distro-info/suse-10.3_x86_64/prereqfiles/etc/shadow b/src/lib/distro-info/suse-10.3_x86_64/prereqfiles/etc/shadow
new file mode 100644
index 00000000..cd100a5a
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3_x86_64/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/src/lib/distro-info/suse-10.3_x86_64/settings.default b/src/lib/distro-info/suse-10.3_x86_64/settings.default
new file mode 100644
index 00000000..c36cea67
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3_x86_64/settings.default
@@ -0,0 +1,972 @@
+bootstrap-packages = <<END
+END
+<metapackager smart>
+ packages = <<END
+ END
+</metapackager>
+<metapackager yum>
+ packages = <<END
+ END
+</metapackager>
+package-subdir = suse
+prereq-packages = <<END
+END
+<repository base>
+ name = openSUSE 10.3
+ repo-subdir = suse
+ file-for-speedtest = suse/setup/descr/packages.en.gz
+</repository>
+<repository base_non-oss>
+ name = openSUSE 10.3 non-OSS
+ repo-subdir = suse
+ file-for-speedtest = suse/setup/descr/packages.en.gz
+</repository>
+<repository base_update>
+ name = openSUSE 10.3 updates
+ file-for-speedtest = repodata/primary.xml.gz
+</repository>
+<selection minimal>
+ packages = <<END
+ glibc-locale
+ END
+</selection>
+<selection textmode>
+ base = minimal
+ packages = <<END
+ acl
+ acpid
+ apparmor-docs
+ apparmor-profiles
+ apparmor-utils
+ ash
+ at
+ atk
+ attr
+ audit
+ autofs
+ autoyast2
+ bc
+ bind-libs
+ bind-utils
+ boost
+ bootsplash-theme-SuSE
+ compat
+ compat-libstdc++
+ compat-openssl097g
+ cpufrequtils
+ cron
+ cups-client
+ cyrus-sasl
+ cyrus-sasl-saslauthd
+ db-utils
+ deltarpm
+ dhcpcd
+ dmraid
+ dos2unix
+ dosfstools
+ ed
+ eject
+ ethtool
+ fbset
+ findutils
+ fontconfig
+ freetype2
+ gdb
+ gdbm
+ glib2
+ glibc-i18ndata
+ gpm
+ hal-resmgr
+ hfsutils
+ ifplugd
+ initviocons
+ inst-source-utils
+ iputils
+ joe
+ kbd
+ kernel-default
+ krb5
+ ksh
+ ksymoops
+ libacl
+ libapparmor
+ libart_lgpl
+ libattr
+ libcap
+ libcom_err
+ libdrm
+ libevent
+ libgcc41
+ libgcrypt
+ libgimpprint
+ libgpg-error
+ libicu
+ libidn
+ libjpeg
+ liblazy
+ liblcms
+ libltdl
+ libmng
+ libnscd
+ libopencdk
+ libpcap
+ libpng
+ librpcsecgss
+ libstdc++41
+ libtiff
+ libusb
+ libvolume_id
+ libxcrypt
+ lukemftp
+ lvm2
+ lzo
+ mailx
+ man
+ man-pages
+ microcode_ctl
+ module-init-tools
+ multipath-tools
+ nbd
+ ncurses
+ net-snmp
+ nfs-utils
+ nfsidmap
+ nscd
+ ntfsprogs
+ openSUSE-release
+ openct
+ opensc
+ openssh
+ openssl
+ patch
+ pax
+ perl-Crypt-SmbHash
+ perl-URI
+ perl-XML-Parser
+ perl-XML-Writer
+ postfix
+ powersave-libs
+ preload
+ procinfo
+ procmail
+ procps
+ providers
+ qlogic-firmware
+ recode
+ rrdtool
+ rsync
+ sash
+ screen
+ scsi
+ sensors
+ sharutils
+ smartmontools
+ smpppd
+ squashfs-kmp-default
+ strace
+ sudo
+ suse-build-key
+ suspend
+ sysfsutils
+ syslog-ng
+ tcpd
+ tcpdump
+ tcsh
+ telnet
+ terminfo
+ timezone
+ ulimit
+ usbutils
+ utempter
+ vim
+ wdiff
+ wget
+ wvstreams
+ xfsprogs
+ xinetd
+ xntp
+ yast2-apparmor
+ yast2-backup
+ yast2-bluetooth
+ yast2-bootfloppy
+ yast2-irda
+ yast2-iscsi-client
+ yast2-mail
+ yast2-ncurses
+ yast2-nis-client
+ yast2-ntp-client
+ yast2-online-update-frontend
+ yast2-power-management
+ yast2-powertweak
+ yast2-profile-manager
+ yast2-repair
+ yast2-restore
+ yast2-runlevel
+ yast2-samba-client
+ yast2-scanner
+ yast2-sudo
+ yast2-support
+ yast2-theme-openSUSE
+ yast2-trans-de
+ yast2-tv
+ ypbind
+ zip
+ zisofs-tools
+ zsh
+ END
+</selection>
+<selection kde>
+ base = textmode
+ packages = <<END
+ 3ddiag
+ 915resolution
+ a2ps
+ aaa_base
+ aaa_skel
+ aalib
+ acl
+ acpid
+ AdobeICCProfiles
+ agfa-fonts
+ alsa
+ amarok
+ amarok-libvisual
+ amarok-xine
+ apparmor-docs
+ apparmor-parser
+ apparmor-profiles
+ apparmor-utils
+ arts
+ ash
+ aspell
+ aspell-de
+ aspell-en
+ at
+ atk
+ attr
+ audiofile
+ audit
+ audit-libs
+ autofs
+ autoyast2
+ autoyast2-installation
+ bash
+ bc
+ bind-libs
+ bind-utils
+ binutils
+ blocxx
+ bluez-libs
+ bluez-utils
+ boost
+ bootsplash
+ bootsplash-theme-SuSE
+ bzip2
+ cabextract
+ cairo
+ cdparanoia
+ cdrdao
+ CheckHardware
+ checkmedia
+ chromium
+ classpath
+ compat
+ compat-libstdc++
+ compat-openssl097g
+ compiz
+ coreutils
+ cpio
+ cpp
+ cpp41
+ cpufrequtils
+ cracklib
+ cron
+ Crystalcursors
+ cups
+ cups-client
+ cups-drivers
+ cups-libs
+ curl
+ cyrus-sasl
+ cyrus-sasl-crammd5
+ cyrus-sasl-digestmd5
+ cyrus-sasl-plain
+ cyrus-sasl-saslauthd
+ db
+ dbus-1
+ dbus-1-glib
+ dbus-1-mono
+ dbus-1-qt3
+ dbus-1-x11
+ db-utils
+ dcraw
+ dejavu
+ deltarpm
+ desktop-data-SuSE
+ desktop-file-utils
+ desktop-translations
+ device-mapper
+ dhcdbd
+ dhcp
+ dhcpcd
+ dhcp-client
+ dialog
+ diffutils
+ digikam
+ digikamimageplugins
+ dirmngr
+ dmraid
+ dos2unix
+ dosbootdisk
+ dosfstools
+ dvd+rw-tools
+ e2fsprogs
+ ed
+ efont-unicode
+ eject
+ enscript
+ esound
+ ethtool
+ evms
+ evms-gui
+ exiftool
+ expat
+ fam
+ fbset
+ fftw3
+ file
+ fileshareset
+ filesystem
+ fillup
+ findutils
+ flac
+ flash-player
+ fontconfig
+ fonts-config
+ foomatic-filters
+ freealut
+ freeciv
+ freeglut
+ freetype
+ freetype2
+ fribidi
+ frozen-bubble
+ ft2demos
+ ftgl
+ fvwm2
+ gail
+ gawk
+ gcc41-gij
+ gcc-gij
+ gconf2
+ gdb
+ gdbm
+ gettext
+ ghostscript-fonts-other
+ ghostscript-fonts-std
+ ghostscript-library
+ ghostscript-x11
+ giflib
+ gimp
+ gimp-help
+ gle
+ glib
+ glib2
+ glibc
+ glibc-i18ndata
+ glib-sharp2
+ glitz
+ gmime
+ gmp
+ gnokii
+ gnome-filesystem
+ gnome-icon-theme
+ gnome-keyring
+ gnome-mime-data
+ gnome-vfs2
+ gnutls
+ gpart
+ gpg
+ gpg2
+ gpgme
+ gpm
+ GraphicsMagick
+ grep
+ groff
+ grub
+ gsf-sharp
+ gstreamer010
+ gstreamer010-plugins-base
+ gtk
+ gtk2
+ gtk-sharp2
+ gtksourceview
+ gutenprint
+ gwenview
+ gzip
+ hal
+ hal-resmgr
+ hdparm
+ hfsutils
+ hplip
+ hplip-hpijs
+ htdig
+ hwinfo
+ id3lib
+ ifnteuro
+ ifplugd
+ ImageMagick
+ ImageMagick-Magick++
+ imlib
+ imlib2
+ imlib2-loaders
+ info
+ info2html
+ initviocons
+ insserv
+ inst-source-utils
+ intlfnts
+ iproute2
+ iptables
+ iputils
+ irqbalance
+ ispell
+ ispell-american
+ ispell-german
+ ispell-ngerman
+ jack
+ java-1_4_2-gcj-compat
+ java-1_5_0-sun
+ java-1_5_0-sun-plugin
+ jfsutils
+ joe
+ jpackage-utils
+ jpeg
+ k3b
+ kaffeine
+ kbd
+ kcm_gtk
+ kde3-i18n-de
+ kdeaddons3-kicker
+ kdeaddons3-konqueror
+ kdeartwork3-kscreensaver
+ kdeartwork3-xscreensaver
+ kdebase3
+ kdebase3-kdm
+ kdebase3-ksysguardd
+ kdebase3-nsplugin
+ kdebase3-samba
+ kdebase3-session
+ kdebase3-SuSE
+ kdebluetooth
+ kdegames3
+ kdegraphics3
+ kdegraphics3-kamera
+ kdegraphics3-pdf
+ kdegraphics3-postscript
+ kdegraphics3-scan
+ kdelibs3
+ kdelibs3-doc
+ kdemultimedia3
+ kdemultimedia3-CD
+ kdemultimedia3-mixer
+ kdenetwork3
+ kdenetwork3-InstantMessenger
+ kdenetwork3-news
+ kdenetwork3-vnc
+ kdepim3
+ kdepim3-kpilot
+ kdepim3-networkstatus
+ kdepim3-notes
+ kdetv
+ kdeutils3
+ kernel-default
+ kio_ipodslave
+ kio_iso
+ kio_slp
+ kipi-plugins
+ kitchensync
+ klogd
+ knights
+ koffice
+ koffice-i18n-de
+ koffice-i18n-de-doc
+ koffice-illustration
+ konversation
+ kpowersave
+ krb5
+ krecord
+ ksh
+ ksudoku
+ ksymoops
+ ktorrent
+ kwin-decor-suse2
+ lbreakout
+ ldapcpplib
+ less
+ libacl
+ libakode
+ libao
+ libapparmor
+ libart_lgpl
+ libattr
+ libbeagle
+ libbonobo
+ libbonoboui
+ libcap
+ libcom_err
+ libcroco
+ libdrm
+ libevent
+ libexif
+ libgcc41
+ libgcj41
+ libgcrypt
+ libgimpprint
+ libglade2
+ libgnome
+ libgnomecanvas
+ libgnomecups
+ libgnomeprint
+ libgnomeprintui
+ libgnomesu
+ libgnomeui
+ libgpg-error
+ libgphoto2
+ libgpod
+ libgsf
+ libgsf-gnome
+ libgssapi
+ libgtkhtml
+ libical
+ libicu
+ libidl
+ libidn
+ libieee1284
+ libjasper
+ libjpeg
+ libkexif
+ libkipi
+ libksba
+ liblazy
+ liblcms
+ libltdl
+ libmal
+ libmikmod
+ libmng
+ libmpcdec
+ libmtp
+ libmusicbrainz
+ libnetpbm
+ libnjb
+ libnl
+ libnscd
+ libofa
+ libogg
+ liboil
+ libopencdk
+ libopensync
+ libopensync-plugin-file
+ libopensync-plugin-gnokii
+ libopensync-plugin-gpe
+ libopensync-plugin-irmc
+ libopensync-plugin-kdepim
+ libopensync-plugin-opie
+ libopensync-plugin-palm
+ libopensync-plugin-sunbird
+ libopensync-plugin-syncml
+ libopensync-tools
+ libpcap
+ libpng
+ libqt4
+ libqt4-dbus-1
+ libqt4-qt3support
+ libqt4-sql
+ libqt4-x11
+ libqtpod
+ librpcsecgss
+ librsvg
+ libsamplerate
+ libsmbclient
+ libsndfile
+ libsoup
+ libstdc++41
+ libstroke
+ libsyncml
+ libtheora
+ libtiff
+ libtunepimp
+ libusb
+ libvisual
+ libvolume_id
+ libvorbis
+ libwmf
+ libwnck
+ libxcrypt
+ libxml2
+ libxslt
+ liby2util
+ libzio
+ libzypp
+ libzypp-zmd-backend
+ limal
+ limal-bootloader
+ limal-perl
+ logrotate
+ lsb
+ lsof
+ lua-libs
+ lukemftp
+ lvm2
+ lzo
+ m4
+ mailx
+ make
+ man
+ man-pages
+ manufacturer-PPDs
+ master-boot-code
+ mdadm
+ mDNSResponder-lib
+ Mesa
+ metacity
+ microcode_ctl
+ mingetty
+ mkinitrd
+ mkisofs
+ mktemp
+ module-init-tools
+ mono-core
+ mono-data
+ mono-data-sqlite
+ mono-web
+ MozillaFirefox
+ MozillaFirefox-translations
+ mozilla-nspr
+ mozilla-nss
+ mozilla-xulrunner181
+ multipath-tools
+ myspell-american
+ myspell-german
+ ncurses
+ neon
+ netcat
+ netcfg
+ netpbm
+ net-snmp
+ net-tools
+ NetworkManager
+ NetworkManager-kde
+ nfsidmap
+ nfs-utils
+ nscd
+ ntfsprogs
+ numlockx
+ ocrad
+ openal
+ openct
+ OpenEXR
+ openldap2-client
+ openobex
+ OpenOffice_org
+ OpenOffice_org-de
+ OpenOffice_org-kde
+ OpenOffice_org-Quickstarter
+ opensc
+ openslp
+ openssh
+ openssh-askpass
+ openssl
+ opensuse-manual_de
+ opensuse-manual_en
+ openSUSE-release
+ orbit2
+ pam
+ pam-config
+ pam-modules
+ pango
+ parted
+ patch
+ pax
+ pciutils
+ pciutils-ids
+ pcre
+ pcsc-lite
+ perl
+ perl-Bootloader
+ perl-Compress-Zlib
+ perl-Config-Crontab
+ perl-Crypt-SmbHash
+ perl-Crypt-SSLeay
+ perl-DBD-SQLite
+ perl-DBI
+ perl-Digest-HMAC
+ perl-Digest-MD4
+ perl-Digest-SHA1
+ perl-File-Tail
+ perl-gettext
+ perl-HTML-Parser
+ perl-HTML-Tagset
+ perl-IO-Zlib
+ perl-libwww-perl
+ perl-Net-Daemon
+ perl-Net-DNS
+ perl-Net-IP
+ perl-PlRPC
+ perl-spamassassin
+ perl-TermReadKey
+ perl-TimeDate
+ perl-URI
+ perl-XML-Parser
+ perl-XML-Writer
+ permissions
+ phalanx
+ pilot-link
+ pinentry
+ pinentry-qt
+ pkgconfig
+ pmtools
+ pm-utils
+ PolicyKit
+ poppler
+ poppler-qt
+ popt
+ portmap
+ postfix
+ powersave
+ powersave-libs
+ ppp
+ pptp
+ preload
+ procinfo
+ procmail
+ procps
+ providers
+ psmisc
+ pwdutils
+ python
+ python-qt
+ python-xml
+ qca
+ qlogic-firmware
+ qscintilla
+ qt3
+ qtcurve-gtk2
+ rdesktop
+ readline
+ RealPlayer
+ recode
+ reiserfs
+ release-notes
+ resmgr
+ rpm
+ rrdtool
+ rsync
+ ruby
+ sane
+ sane-frontends
+ sash
+ sax2
+ sax2-gui
+ sax2-ident
+ sax2-libsax
+ sax2-libsax-perl
+ sax2-tools
+ scpm
+ screen
+ scsi
+ SDL
+ SDL_image
+ SDL_mixer
+ SDL_net
+ SDL_Pango
+ SDL_perl
+ SDL_ttf
+ sed
+ sensors
+ sgml-skel
+ shared-mime-info
+ sharutils
+ siga
+ smartmontools
+ smpppd
+ spamassassin
+ speex
+ sqlite
+ sqlite2
+ sqlite-zmd
+ startup-notification
+ strace
+ sudo
+ supertux
+ suse-build-key
+ SuSEfirewall2
+ susehelp
+ susehelp_de
+ suseRegister
+ suspend
+ sysconfig
+ sysfsutils
+ syslog-ng
+ sysvinit
+ taglib
+ tar
+ tcl
+ tcpd
+ tcpdump
+ tcsh
+ telnet
+ terminfo
+ tightvnc
+ timezone
+ tk
+ udev
+ ufraw
+ ufraw-gimp
+ ulimit
+ unclutter
+ unzip
+ update-alternatives
+ usbutils
+ utempter
+ util-linux
+ v4l-conf
+ vim
+ w3m
+ wbxml2
+ wdiff
+ wget
+ wireless-tools
+ wodim
+ words
+ wpa_supplicant
+ wv
+ wvdial
+ wvstreams
+ x11-input-synaptics
+ x11-input-wacom
+ x11-tools
+ xaw3d
+ xdg-menu
+ xdg-utils
+ xdmbgrd
+ xfsprogs
+ xgl
+ xgl-hardware-list
+ xine-lib
+ xinetd
+ xkeyboard-config
+ xli
+ xlockmore
+ xmoto
+ xntp
+ xorg-x11
+ xorg-x11-driver-input
+ xorg-x11-driver-video
+ xorg-x11-fonts
+ xorg-x11-fonts-core
+ xorg-x11-libfontenc
+ xorg-x11-libICE
+ xorg-x11-libs
+ xorg-x11-libSM
+ xorg-x11-libX11
+ xorg-x11-libX11-ccache
+ xorg-x11-libXau
+ xorg-x11-libXdmcp
+ xorg-x11-libXext
+ xorg-x11-libXfixes
+ xorg-x11-libxkbfile
+ xorg-x11-libXmu
+ xorg-x11-libXp
+ xorg-x11-libXpm
+ xorg-x11-libXprintUtil
+ xorg-x11-libXrender
+ xorg-x11-libXt
+ xorg-x11-libXv
+ xorg-x11-server
+ xorg-x11-Xvnc
+ xpdf-tools
+ xscreensaver
+ xterm
+ xtermset
+ yast2
+ yast2-apparmor
+ yast2-backup
+ yast2-bluetooth
+ yast2-bootfloppy
+ yast2-bootloader
+ yast2-control-center
+ yast2-core
+ yast2-country
+ yast2-firewall
+ yast2-hardware-detection
+ yast2-inetd
+ yast2-installation
+ yast2-irda
+ yast2-iscsi-client
+ yast2-kerberos-client
+ yast2-ldap
+ yast2-ldap-client
+ yast2-mail
+ yast2-mail-aliases
+ yast2-mouse
+ yast2-ncurses
+ yast2-network
+ yast2-nfs-client
+ yast2-nis-client
+ yast2-ntp-client
+ yast2-online-update
+ yast2-online-update-frontend
+ yast2-packager
+ yast2-pam
+ yast2-perl-bindings
+ yast2-pkg-bindings
+ yast2-power-management
+ yast2-powertweak
+ yast2-printer
+ yast2-profile-manager
+ yast2-qt
+ yast2-registration
+ yast2-repair
+ yast2-restore
+ yast2-runlevel
+ yast2-samba-client
+ yast2-samba-server
+ yast2-scanner
+ yast2-schema
+ yast2-security
+ yast2-slp
+ yast2-sound
+ yast2-storage
+ yast2-storage-evms
+ yast2-storage-lib
+ yast2-sudo
+ yast2-support
+ yast2-sysconfig
+ yast2-theme-openSUSE
+ yast2-trans-de
+ yast2-transfer
+ yast2-trans-stats
+ yast2-tune
+ yast2-tv
+ yast2-update
+ yast2-users
+ yast2-x11
+ yast2-xml
+ ypbind
+ yp-tools
+ zip
+ zisofs-tools
+ zlib
+ zsh
+ zvbi
+ END
+</selection>
+<selection gnome>
+ base = textmode
+ packages = <<END
+ END
+</selection>
+<selection default>
+ base = minimal
+</selection>
diff --git a/src/lib/distro-info/suse-10.3_x86_64/settings.example b/src/lib/distro-info/suse-10.3_x86_64/settings.example
new file mode 100644
index 00000000..2905cef4
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3_x86_64/settings.example
@@ -0,0 +1,23 @@
+# rename this file to 'settings' and edit it as you please
+#
+# for a list of all options, have a look at the corresponding
+# settings.default in /opt/openslx/share/distro-info
+
+# use local installation source
+#<repository base>
+# local-url = /srv/ftp/pub/opensuse/distribution/10.2/repo/oss
+#</repository>
+#<repository base_non-oss>
+# local-url = /srv/ftp/pub/opensuse/distribution/10.2/repo/non-oss
+#</repository>
+#<repository base_update>
+# local-url = /srv/ftp/pub/suse/update/10.2
+#</repository>
+
+# add a new selection:
+#<selection my_kde>
+# base = kde
+# packages = <<END
+# kinternet
+# END
+#</selection>
diff --git a/src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc b/src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc
new file mode 100644
index 00000000..89fc35cf
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc
@@ -0,0 +1,17 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.4-svn0 (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/src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/gpg-pubkey-307e3d54-44201d5d.asc b/src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/gpg-pubkey-307e3d54-44201d5d.asc
new file mode 100644
index 00000000..2d21c1ba
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/gpg-pubkey-307e3d54-44201d5d.asc
@@ -0,0 +1,13 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.4-svn0 (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/src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc b/src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc
new file mode 100644
index 00000000..894a4630
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc
@@ -0,0 +1,30 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.4-svn0 (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/src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/gpg-pubkey-7e2e3b05-44748aba.asc b/src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/gpg-pubkey-7e2e3b05-44748aba.asc
new file mode 100644
index 00000000..a4be6b8b
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/gpg-pubkey-7e2e3b05-44748aba.asc
@@ -0,0 +1,20 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.4-svn0 (GNU/Linux)
+
+mQGiBER0iroRBADfqUeJmPCXqPJFnf3CVKy40dL1F+gfvP+JHN7/uu4c9+oCYjI1
+uAE8iGTm/Twb/Zzbs4dt0iWjhNFXbRi42rMww4d/8QcPYZ21WSehh+fv8nCjt2sw
+LeC87ar2SR8OTpJBK0fQlcd4e6H5GMntfI6SYEUOPd8m/eQ+4+1AxpUUpwCgswaF
+13fePZGI//pDn5tGjbvmaP8D/R3qum/I+oDS8lbFeeDS10GkEkwTYec13gdfsq6I
+yzIj7VBsC+rGfbipv+VGR61Q4d19pOHKLDekr9OG+3G4ZcYM4NQvQZR+QIlp3xWu
+nBmYD1LRkHLVj+Z4DGQhjjOffkPSuacKPymMaZ/aRiLgTIAo97W2YPhutscXrLSG
+2Y+BA/4jsyaDb7kbW4wc8RtPIcuFEheVqgBeRakP9Uj47kBMBEpPtI/mIdY5liKk
+ztKnuQG6ROYLNV/PW0ZbE1uT64C710weh4cB3PnZLV5P10deDLBjHk8MJQGCTSDD
+JYvhutUzQfshAU6j2kErGvKdZxWGezab34vFyMP2oLGqswPAJrRQTm92ZWxsIFBy
+b3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20pIDxub3ZlbGwt
+cHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6IZgQTEQIAJgUCRHSKugIbAwUJA8JnAAYL
+CQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEBTCi8l+LjsFWEoAn13x+5ObqkW08gYF
+YNDlcGPjQuGPAJ9kAQbVUvvh1u9mBgu91cQ9W/TkHYhGBBMRAgAGBQJEexD/AAoJ
+EKhO2uicgArKFLwAn0B+g2mJ5n8LrBziTQ5SjnSPyDBXAJwJoYTta5Sfw/3vVGpU
+fJAKVDoB9w==
+=tJSz
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/gpg-pubkey-9c800aca-40d8063e.asc b/src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/gpg-pubkey-9c800aca-40d8063e.asc
new file mode 100644
index 00000000..67eedcf6
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/gpg-pubkey-9c800aca-40d8063e.asc
@@ -0,0 +1,37 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.4-svn0 (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/src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc b/src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc
new file mode 100644
index 00000000..279397c3
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc
@@ -0,0 +1,31 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.4-svn0 (GNU/Linux)
+
+mQILBERqCJkBEACdqhZWdAbUHLIumXMEgv+GFjr1ZzVHgynnFOzztU/8sxZNa9cm
+YV4HZpVfjMr7fos3ArzyiPPt/336cf7w9p79/ZS4rHSNPDMlPCtXYvFxUbvU0/GY
+q4jwcBsrJ0xaJ9CP5bWyAgVKOb7Y6k0ktaLjRR+tDfMsHA4H0ClMoRr6ATw8NL0e
+VCfAHuzqCKvX1If8ng+wTivtAhKvz/WwQiELNELmPfc5tZHOw8NgP/r0Pze18Hn2
+dlAHu0WpC7uoR00vscsMIJiJJPcsxbL1F1eADKnk+wEy8Go+EJeJ5i0WoFbqD52q
+Lv/C/oY6NVtVY0MBwtn+oQNSnQ4JBsB/Akdt53LAi0ZtNQxMyUW+76R8FCOmVCV8
+WGiF5CPRP0yvG80AMBjBjKjHb/v8ov5MnIyFimzAHS1gQcUNxTEYA/5eFwoYcGcK
+weGq9FUjPTzLQAgvp7XmOzHpSAfJ7qysxFTepNsSZZhgizJyInrdQldr+GYcUNqB
+krD9MWmFop975OxhCTEnNv/HcE79r8WD26HzDFYxTiTJbr0pU/ivBzo+rjq+YG2V
+stJk+udVYmZTnC4LmXus8JiNuqBXbxNscwCBpcJ8YcfCV6uh+7E0XfXZsgVUFLp1
+NF+ylYRGTycOlWoZODrnJevZW7N9O3bWRx/G2P4bJD07LsDLe4i5hymf5QAGKbRQ
+Tm92ZWxsIFByb3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20p
+IDxub3ZlbGwtcHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6JAjMEEwECAB0FAkRqCJkG
+CwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRBHijLooZEiCKSFD/93vZHCAMLEfksU
+KnvXl08bv1rfuamuyJnE3ANRE5RDyypriHMCnkVxazvQ2WI4W4UEjluL9+SzZwtV
+ZvKVoAr31614nSyWwv2YnJTHfjMG+xRlkolZMnuIiB9PcCBo9+GPU0ABuzo4pEJW
+NIRoSS1NFbAZBhtUnY0cN+trM5QObLl7xXTavLyGk//blkk57fov7GXsQJlZUig0
+l2yt5XNyGpLUnTMDumHh8b389quF+0+ZfdwOy7A768xjipAZiTvIujBrEv51wrxh
+0HBT0VGA0MhD9t0B+Ce4BM9P/iVMO00naaOp6PqMfPPKxQQqer8qy1i6UWBx95SY
+mKZBIvOm2d9PezDxkckCu61r6krx1iKnT1wdprCAkIYwALK118SpbxuyGW0bhRHc
+wsc/akzWH72fS0Xu49mvL4k4A2U9asdeQid3dMgbtm5mSWof0yiU/G4YNn0yeXoY
+oG1VbCAqQbFX1Rvd6GITJVqI+ekW/uMA9BP78dF8wBeG0+QmpQnSf+eOsxB/RT8o
+Kb4hHY+29MUlg+i9ceVt7hoKr03J/uIG5TXFXRYLaI0iAFVlKfWxpqDfS2XA4+dD
+VYt+5RDgBcnxDaTB4FE9GqcYScNfe7+NFtL0p0wOPftbmgZzGjucTmrD8mDUNdqA
+xGK7vlk4GATSfOQlq7G6LXW6RYnInohGBBMRAgAGBQJEazMlAAoJEKhO2uicgArK
+2vMAn0TbVDESEVKVuFZStrfIzOvJQrR9AJsH733Ju1kE99GFrdfCeGqpckmNhg==
+=E+qN
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/pubring.gpg b/src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/pubring.gpg
new file mode 100644
index 00000000..5e96ad54
--- /dev/null
+++ b/src/lib/distro-info/suse-10.3_x86_64/trusted-package-keys/pubring.gpg
Binary files differ
diff --git a/src/lib/distro-info/suse-11.0/export-filter.example b/src/lib/distro-info/suse-11.0/export-filter.example
new file mode 100644
index 00000000..a414fef4
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0/export-filter.example
@@ -0,0 +1,15 @@
+# this file defines the filter rules used when exporting a vendor-OS
+# of this distro
+#
+# copy this file to 'export-filter' and add your own filters to it
+# in order to overrule the filters provided by openslx
+#
+#Examples:
+# the following line would include anything below /var/spool/
+#+ /var/spool/*
+#
+# this would exclude anything in /etc that starts with dhcpd.conf
+#- /etc/dhcpd.conf*
+#
+# and this would exclude all rpmnew-files:
+#- *.rpmnew
diff --git a/src/lib/distro-info/suse-11.0/mirrors/base b/src/lib/distro-info/suse-11.0/mirrors/base
new file mode 100644
index 00000000..57a0c1ca
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0/mirrors/base
@@ -0,0 +1,252 @@
+http://opensuse.mirror.ac.za/opensuse/distribution/11.0/repo/oss
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.0/repo/oss
+http://www.lizardsource.cn/distribution/11.0/repo/oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.0/repo/oss
+ftp://www.lizardsource.cn/distribution/11.0/repo/oss
+http://download.opensuse.or.id/distribution/11.0/repo/oss
+ftp://opensuse.mirror.ac.za/opensuse/distribution/11.0/repo/oss
+http://mirror.lupaworld.com/opensuse/distribution/11.0/repo/oss
+http://mirror.unej.ac.id/opensuse/distribution/11.0/repo/oss
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.0/repo/oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.0/repo/oss
+http://opensuse.cbn.net.id/distribution/11.0/repo/oss
+http://repo.ugm.ac.id/opensuse/distribution/11.0/repo/oss
+http://dl2.foss-id.web.id/opensuse/distribution/11.0/repo/oss
+ftp://opensuse.cbn.net.id/pub/opensuse/distribution/11.0/repo/oss
+ftp://mirror.unej.ac.id/opensuse/distribution/11.0/repo/oss
+http://mirror.isoc.org.il/pub/opensuse/distribution/11.0/repo/oss
+ftp://repo.ugm.ac.id/opensuse/distribution/11.0/repo/oss
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.0/repo/oss
+ftp://mirror.isoc.org.il/opensuse/distribution/11.0/repo/oss
+ftp://ftp.kddilabs.jp/Linux/packages/opensusedistribution/11.0/repo/oss
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/distribution/11.0/repo/oss
+http://ftp.novell.co.jp/pub/opensuse/distribution/11.0/repo/oss
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.0/repo/oss
+ftp://dl2.foss-id.web.id/repo/opensuse/distribution/11.0/repo/oss
+http://ftp.riken.jp/Linux/opensuse/distribution/11.0/repo/oss
+http://ftp.kddilabs.jp/Linux/packages/opensuse/distribution/11.0/repo/oss
+ftp://ftp.novell.co.jp/pub/opensuse/distribution/11.0/repo/oss
+http://ftp.daum.net/opensuse/distribution/11.0/repo/oss
+ftp://ftp.kaist.ac.kr/opensuse/distribution/11.0/repo/oss
+http://77.88.19.68/opensuse/distribution/11.0/repo/oss
+http://mirror.suse.ru/distribution/11.0/repo/oss
+ftp://ftp.daum.net/opensuse/distribution/11.0/repo/oss
+http://77.88.19.73/opensuse/distribution/11.0/repo/oss
+http://77.88.19.74/opensuse/distribution/11.0/repo/oss
+ftp://ftp.chg.ru/pub/opensuse/distribution/11.0/repo/oss
+http://93.158.155.193/opensuse/distribution/11.0/repo/oss
+ftp://ftp.riken.jp/Linux/opensuse/distribution/11.0/repo/oss
+ftp://dispenser.yandex.net/opensuse/distribution/11.0/repo/oss
+ftp://spreader.yandex.net/opensuse/distribution/11.0/repo/oss
+ftp://seeder.yandex.net/opensuse/distribution/11.0/repo/oss
+ftp://allotter.yandex.net/opensuse/distribution/11.0/repo/oss
+http://mirror.nus.edu.sg/opensuse/distribution/11.0/repo/oss
+ftp://ftp.metu.edu.tr/opensuse/distribution/11.0/repo/oss
+ftp://mirror.in.th/opensuse/distribution/11.0/repo/oss
+http://ftp.isu.edu.tw/pub/Linux/opensuse/distribution/11.0/repo/oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.0/repo/oss
+http://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.0/repo/oss
+http://ftp.chg.ru/pub/opensuse/distribution/11.0/repo/oss
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.0/repo/oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.0/repo/oss
+http://ftp.twaren.net/Linux/OpenSuSE/distribution/11.0/repo/oss
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.0/repo/oss
+ftp://ftp.isu.edu.tw/pub/Linux/OpenSuSE/distribution/11.0/repo/oss
+http://mirror-fpt-telecom.fpt.net/opensuse/distribution/11.0/repo/oss
+ftp://ftp.twaren.net/Linux/OpenSuSE/distribution/11.0/repo/oss
+http://suse.inode.at/opensuse/distribution/11.0/repo/oss
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.0/repo/oss
+http://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.0/repo/oss
+http://ftp.tugraz.at/mirror/opensuse/distribution/11.0/repo/oss
+ftp://suse.inode.at/opensuse/distribution/11.0/repo/oss
+http://suse.lagis.at/opensuse/distribution/11.0/repo/oss
+ftp://suse.lagis.at/opensuse/distribution/11.0/repo/oss
+http://mirror.opensuse.com.ba/opensuse/distribution/11.0/repo/oss
+http://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.0/repo/oss
+ftp://ftp.tugraz.at/mirror/opensuse/distribution/11.0/repo/oss
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.0/repo/oss
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.0/repo/oss
+http://mirror.switch.ch/ftp/mirror/opensuse/distribution/11.0/repo/oss
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.0/repo/oss
+http://mirror.karneval.cz/pub/linux/opensuse/distribution/11.0/repo/oss
+http://mirrors.netbg.com/opensuse/distribution/11.0/repo/oss
+ftp://mirror.karneval.cz/pub/linux/opensuse/distribution/11.0/repo/oss
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.0/repo/oss
+ftp://mirror.switch.ch/mirror/opensuse/distribution/11.0/repo/oss
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.0/repo/oss
+http://ftp.linux.cz/pub/linux/opensuse/distribution/11.0/repo/oss
+http://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.0/repo/oss
+http://ftp5.gwdg.de/pub/opensuse/distribution/11.0/repo/oss
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/distribution/11.0/repo/oss
+ftp://mirrors.netbg.com/opensuse/distribution/11.0/repo/oss
+http://download.uni-hd.de/ftp/pub/linux/opensuse/distribution/11.0/repo/oss
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/distribution/11.0/repo/oss
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.0/repo/oss
+http://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.0/repo/oss
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/distribution/11.0/repo/oss
+ftp://ftp5.gwdg.de/pub/opensuse/distribution/11.0/repo/oss
+http://opensuse.intergenia.de/distribution/11.0/repo/oss
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.0/repo/oss
+ftp://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.0/repo/oss
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.0/repo/oss
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/distribution/11.0/repo/oss
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.0/repo/oss
+ftp://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.0/repo/oss
+http://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.0/repo/oss
+http://ftp3.gwdg.de/pub/opensuse/distribution/11.0/repo/oss
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.0/repo/oss
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.0/repo/oss
+http://widehat.opensuse.org/distribution/11.0/repo/oss
+http://ftp4.gwdg.de/pub/opensuse/distribution/11.0/repo/oss
+ftp://ftp4.gwdg.de/pub/opensuse/distribution/11.0/repo/oss
+http://ftp.uni-kassel.de/opensuse/distribution/11.0/repo/oss
+ftp://ftp3.gwdg.de/pub/opensuse/distribution/11.0/repo/oss
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.0/repo/oss
+ftp://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.0/repo/oss
+http://opensuse-linuxmigratio.at/distribution/11.0/repo/oss
+http://ftp.uni-bayreuth.de/linux/opensuse/distribution/11.0/repo/oss
+http://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.0/repo/oss
+http://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.0/repo/oss
+http://ftp.uni-siegen.de/opensuse/distribution/11.0/repo/oss
+ftp://ftp.uni-bayreuth.de/linux/opensuse/distribution/11.0/repo/oss
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.0/repo/oss
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.0/repo/oss
+http://ftp.klid.dk/ftp/opensuse/distribution/11.0/repo/oss
+http://ftp.estpak.ee/pub/suse/opensuse/distribution/11.0/repo/oss
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.0/repo/oss
+http://ftp.gui.uva.es/sites/opensuse.org/distribution/11.0/repo/oss
+ftp://ftp.uni-siegen.de/pub/opensuse/distribution/11.0/repo/oss
+ftp://ftp.gui.uva.es/sites/opensuse.org/distribution/11.0/repo/oss
+http://ftp.rediris.es/pub/mirror/opensuse/distribution/11.0/repo/oss
+ftp://ftp.klid.dk/opensuse/distribution/11.0/repo/oss
+http://suse.bifi.unizar.es/opensuse/distribution/11.0/repo/oss
+ftp://ftp.rediris.es/pub/mirror/opensuse/distribution/11.0/repo/oss
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.0/repo/oss
+http://opensuse.mirrors.proxad.net/opensuse/distribution/11.0/repo/oss
+http://mirror.ovh.net/opensuse/distribution/11.0/repo/oss
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.0/repo/oss
+http://fr2.rpmfind.net/linux/opensuse/distribution/11.0/repo/oss
+ftp://fr2.rpmfind.net/linux/opensuse/distribution/11.0/repo/oss
+http://opensuse.cict.fr/distribution/11.0/repo/oss
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.0/repo/oss
+ftp://mirror.cict.fr/opensuse/distribution/11.0/repo/oss
+http://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.0/repo/oss
+ftp://mirror.ovh.net/opensuse/distribution/11.0/repo/oss
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.0/repo/oss
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/distribution/11.0/repo/oss
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/distribution/11.0/repo/oss
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/distribution/11.0/repo/oss
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.0/repo/oss
+http://ftp.ntua.gr/pub/linux/opensuse/distribution/11.0/repo/oss
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.0/repo/oss
+ftp://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.0/repo/oss
+http://roxen.integrity.hu/pub/opensuse/distribution/11.0/repo/oss
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.0/repo/oss
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.0/repo/oss
+ftp://ftp.ntua.gr/pub/linux/opensusedistribution/11.0/repo/oss
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/distribution/11.0/repo/oss
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.0/repo/oss
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.0/repo/oss
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.0/repo/oss
+http://rm.mirror.garr.it/mirrors/opensuse/distribution/11.0/repo/oss
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.0/repo/oss
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.0/repo/oss
+http://repo1.linux.edu.lv/distribution/11.0/repo/oss
+http://mirror.leaseweb.com/opensuse/distribution/11.0/repo/oss
+http://mirrors.nl.eu.kernel.org/opensuse/distribution/11.0/repo/oss
+ftp://repo1.linux.edu.lv/distribution/11.0/repo/oss
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/distribution/11.0/repo/oss
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.0/repo/oss
+ftp://rm.mirror.garr.it/mirrors/opensusedistribution/11.0/repo/oss
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/distribution/11.0/repo/oss
+ftp://mirrors.nl.eu.kernel.org/opensuse/distribution/11.0/repo/oss
+http://opensuse.hro.nl/opensuse/distribution/11.0/repo/oss
+http://opensuse.uib.no/distribution/11.0/repo/oss
+http://ftp.uninett.no/pub/linux/opensuse/distribution/11.0/repo/oss
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.0/repo/oss
+http://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.0/repo/oss
+ftp://mirror.leaseweb.com/opensuse/distribution/11.0/repo/oss
+ftp://ftp.uninett.no/pub/linux/opensuse/distribution/11.0/repo/oss
+ftp://opensuse.hro.nl/opensuse/distribution/11.0/repo/oss
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.0/repo/oss
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.0/repo/oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.0/repo/oss
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/distribution/11.0/repo/oss
+http://ftp.sileman.pl/pub/opensuse/distribution/11.0/repo/oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.0/repo/oss
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.0/repo/oss
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.0/repo/oss
+ftp://cesium.di.uminho.pt/pub/opensuse/distribution/11.0/repo/oss
+ftp://ftp.sileman.pl/pub/opensuse/distribution/11.0/repo/oss
+http://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.0/repo/oss
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.0/repo/oss
+http://ftp.gts.lug.ro/opensuse/distribution/11.0/repo/oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.0/repo/oss
+ftp://ftp.gts.lug.ro/opensuse/distribution/11.0/repo/oss
+http://ftp.ines.lug.ro/opensuse/distribution/11.0/repo/oss
+ftp://ftp.ines.lug.ro/opensuse/distribution/11.0/repo/oss
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.0/repo/oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.0/repo/oss
+http://cesium.di.uminho.pt/pub/opensuse/distribution/11.0/repo/oss
+http://mirrors.se.eu.kernel.org/opensuse/distribution/11.0/repo/oss
+http://ftp.df.lth.se/pub/opensuse/distribution/11.0/repo/oss
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.0/repo/oss
+ftp://ftp.df.lth.se/pub/opensusedistribution/11.0/repo/oss
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.0/repo/oss
+http://opensuse.ynet.sk/distribution/11.0/repo/oss
+ftp://mirrors.se.eu.kernel.org/opensuse/distribution/11.0/repo/oss
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.0/repo/oss
+http://less.cogeco.net/ftp/openSUSE/distribution/11.0/repo/oss
+http://www.muug.mb.ca/pub/opensuse/distribution/11.0/repo/oss
+http://linux.dell.com/repo/community/distribution/11.0/repo/oss
+http://ftp.osuosl.org/pub/opensuse/distribution/11.0/repo/oss
+ftp://less.cogeco.net/openSUSE/distribution/11.0/repo/oss
+ftp://www.muug.mb.ca/pub/opensuse/distribution/11.0/repo/oss
+http://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.0/repo/oss
+http://suse.mirrors.tds.net/pub/opensuse/distribution/11.0/repo/oss
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.0/repo/oss
+http://mirrors.med.harvard.edu/opensuse/distribution/11.0/repo/oss
+ftp://suse.mirrors.tds.net/pub/opensuse/distribution/11.0/repo/oss
+http://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.0/repo/oss
+http://mirror.umoss.org/opensuse/distribution/11.0/repo/oss
+http://opensuse.cs.utah.edu/distribution/11.0/repo/oss
+http://opensuse.ca.unixheads.org/distribution/11.0/repo/oss
+http://mirrors.xmission.com/opensuse/distribution/11.0/repo/oss
+ftp://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.0/repo/oss
+http://mirrors2.kernel.org/opensuse/distribution/11.0/repo/oss
+ftp://ftp.osuosl.org/pub/opensuse/distribution/11.0/repo/oss
+http://mirrors1.kernel.org/opensuse/distribution/11.0/repo/oss
+ftp://opensuse.cs.utah.edu/pub/opensuse/distribution/11.0/repo/oss
+http://mirror.rackspace.com/openSUSE/distribution/11.0/repo/oss
+ftp://mirrors.xmission.com/opensuse/distribution/11.0/repo/oss
+http://130.57.19.201/distribution/11.0/repo/oss
+ftp://ftp.utexas.edu/mirrors/opensuse/distribution/11.0/repo/oss
+http://ftp.utexas.edu/opensuse/distribution/11.0/repo/oss
+ftp://mirrors2.kernel.org/opensuse/distribution/11.0/repo/oss
+ftp://130.57.19.201/pub/opensuse/distribution/11.0/repo/oss
+http://www.gtlib.gatech.edu/pub/opensuse/distribution/11.0/repo/oss
+ftp://mirror.rackspace.com/openSUSE/distribution/11.0/repo/oss
+http://ftp.ussg.iu.edu/linux/opensuse/distribution/11.0/repo/oss
+ftp://mirrors1.kernel.org/opensuse/distribution/11.0/repo/oss
+ftp://www.gtlib.gatech.edu/pub/opensuse/distribution/11.0/repo/oss
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/distribution/11.0/repo/oss
+ftp://ftp.ussg.iu.edu/linux/opensuse/distribution/11.0/repo/oss
+http://mirror.cps.cmich.edu/opensuse/opensuse/distribution/11.0/repo/oss
+http://mirror.nyi.net/opensuse/distribution/11.0/repo/oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.0/repo/oss
+ftp://mirror.nyi.net/opensusedistribution/11.0/repo/oss
+http://mirrors.rit.edu/opensuse/distribution/11.0/repo/oss
+http://ftp.iinet.net.au/pub/opensuse/distribution/11.0/repo/oss
+http://ftp.netspace.net.au/pub/opensuse/distribution/11.0/repo/oss
+http://mirror.internode.on.net/pub/opensuse/distribution/11.0/repo/oss
+http://mirror.pacific.net.au/linux/opensuse/distribution/11.0/repo/oss
+ftp://ftp.iinet.net.au/pub/opensuse/distribution/11.0/repo/oss
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.0/repo/oss
+ftp://mirror.internode.on.net/pub/opensuse/distribution/11.0/repo/oss
+http://opensuse.patan.com.ar/distribution/11.0/repo/oss
+http://opensuse.c3sl.ufpr.br/distribution/11.0/repo/oss
+http://200.221.9.37/pub/opensuse/distribution/11.0/repo/oss
+ftp://mirror.pacific.net.au/linux/opensuse/distribution/11.0/repo/oss
+http://opensuse.pop.com.br/distribution/11.0/repo/oss
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.0/repo/oss
+ftp://opensuse.c3sl.ufpr.br/opensuse/distribution/11.0/repo/oss
diff --git a/src/lib/distro-info/suse-11.0/mirrors/base_non-oss b/src/lib/distro-info/suse-11.0/mirrors/base_non-oss
new file mode 100644
index 00000000..f1a418d2
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0/mirrors/base_non-oss
@@ -0,0 +1,246 @@
+http://opensuse.mirror.ac.za/opensuse/distribution/11.0/repo/non-oss
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.0/repo/non-oss
+http://mirror.lupaworld.com/opensuse/distribution/11.0/repo/non-oss
+ftp://opensuse.mirror.ac.za/opensuse/distribution/11.0/repo/non-oss
+http://www.lizardsource.cn/distribution/11.0/repo/non-oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.0/repo/non-oss
+http://download.opensuse.or.id/distribution/11.0/repo/non-oss
+http://mirror.unej.ac.id/opensuse/distribution/11.0/repo/non-oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.0/repo/non-oss
+http://opensuse.cbn.net.id/distribution/11.0/repo/non-oss
+http://repo.ugm.ac.id/opensuse/distribution/11.0/repo/non-oss
+http://dl2.foss-id.web.id/opensuse/distribution/11.0/repo/non-oss
+http://mirror.isoc.org.il/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://repo.ugm.ac.id/opensuse/distribution/11.0/repo/non-oss
+ftp://dl2.foss-id.web.id/repo/opensuse/distribution/11.0/repo/non-oss
+ftp://mirror.isoc.org.il/opensuse/distribution/11.0/repo/non-oss
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.0/repo/non-oss
+ftp://www.lizardsource.cn/distribution/11.0/repo/non-oss
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.0/repo/non-oss
+http://ftp.kddilabs.jp/Linux/packages/opensuse/distribution/11.0/repo/non-oss
+ftp://opensuse.cbn.net.id/pub/opensuse/distribution/11.0/repo/non-oss
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/distribution/11.0/repo/non-oss
+http://ftp.novell.co.jp/pub/opensuse/distribution/11.0/repo/non-oss
+http://ftp.riken.jp/Linux/opensuse/distribution/11.0/repo/non-oss
+http://ftp.daum.net/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.riken.jp/Linux/opensuse/distribution/11.0/repo/non-oss
+http://77.88.19.68/opensuse/distribution/11.0/repo/non-oss
+http://mirror.suse.ru/distribution/11.0/repo/non-oss
+ftp://ftp.kddilabs.jp/Linux/packages/opensusedistribution/11.0/repo/non-oss
+http://77.88.19.73/opensuse/distribution/11.0/repo/non-oss
+http://77.88.19.74/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.chg.ru/pub/opensuse/distribution/11.0/repo/non-oss
+http://93.158.155.193/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.novell.co.jp/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.kaist.ac.kr/opensuse/distribution/11.0/repo/non-oss
+ftp://spreader.yandex.net/opensuse/distribution/11.0/repo/non-oss
+http://mirror.nus.edu.sg/opensuse/distribution/11.0/repo/non-oss
+ftp://seeder.yandex.net/opensuse/distribution/11.0/repo/non-oss
+ftp://dispenser.yandex.net/opensuse/distribution/11.0/repo/non-oss
+http://ftp.isu.edu.tw/pub/Linux/opensuse/distribution/11.0/repo/non-oss
+ftp://allotter.yandex.net/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.0/repo/non-oss
+http://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.0/repo/non-oss
+ftp://mirror.in.th/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.isu.edu.tw/pub/Linux/OpenSuSE/distribution/11.0/repo/non-oss
+http://ftp.twaren.net/Linux/OpenSuSE/distribution/11.0/repo/non-oss
+http://ftp.chg.ru/pub/opensuse/distribution/11.0/repo/non-oss
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.0/repo/non-oss
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.0/repo/non-oss
+http://mirror-fpt-telecom.fpt.net/opensuse/distribution/11.0/repo/non-oss
+http://suse.inode.at/opensuse/distribution/11.0/repo/non-oss
+http://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.0/repo/non-oss
+http://ftp.tugraz.at/mirror/opensuse/distribution/11.0/repo/non-oss
+ftp://suse.inode.at/opensuse/distribution/11.0/repo/non-oss
+http://suse.lagis.at/opensuse/distribution/11.0/repo/non-oss
+http://mirror.opensuse.com.ba/opensuse/distribution/11.0/repo/non-oss
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.twaren.net/Linux/OpenSuSE/distribution/11.0/repo/non-oss
+http://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.0/repo/non-oss
+ftp://ftp.tugraz.at/mirror/opensuse/distribution/11.0/repo/non-oss
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.0/repo/non-oss
+ftp://suse.lagis.at/opensuse/distribution/11.0/repo/non-oss
+http://mirrors.netbg.com/opensuse/distribution/11.0/repo/non-oss
+http://mirror.switch.ch/ftp/mirror/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.0/repo/non-oss
+http://mirror.karneval.cz/pub/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://mirror.karneval.cz/pub/linux/opensuse/distribution/11.0/repo/non-oss
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.0/repo/non-oss
+ftp://mirrors.netbg.com/opensuse/distribution/11.0/repo/non-oss
+http://ftp.linux.cz/pub/linux/opensuse/distribution/11.0/repo/non-oss
+http://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.0/repo/non-oss
+http://ftp5.gwdg.de/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://mirror.switch.ch/mirror/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp5.gwdg.de/pub/opensuse/distribution/11.0/repo/non-oss
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/distribution/11.0/repo/non-oss
+http://download.uni-hd.de/ftp/pub/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.0/repo/non-oss
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.0/repo/non-oss
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/distribution/11.0/repo/non-oss
+http://opensuse.intergenia.de/distribution/11.0/repo/non-oss
+http://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.0/repo/non-oss
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.0/repo/non-oss
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/distribution/11.0/repo/non-oss
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.0/repo/non-oss
+http://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.0/repo/non-oss
+http://ftp3.gwdg.de/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.0/repo/non-oss
+http://widehat.opensuse.org/distribution/11.0/repo/non-oss
+http://ftp4.gwdg.de/pub/opensuse/distribution/11.0/repo/non-oss
+http://ftp.uni-kassel.de/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/distribution/11.0/repo/non-oss
+http://ftp.uni-bayreuth.de/linux/opensuse/distribution/11.0/repo/non-oss
+http://opensuse-linuxmigratio.at/distribution/11.0/repo/non-oss
+http://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.0/repo/non-oss
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp4.gwdg.de/pub/opensuse/distribution/11.0/repo/non-oss
+http://ftp.uni-siegen.de/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp3.gwdg.de/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.0/repo/non-oss
+http://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.klid.dk/opensuse/distribution/11.0/repo/non-oss
+http://ftp.klid.dk/ftp/opensuse/distribution/11.0/repo/non-oss
+http://ftp.estpak.ee/pub/suse/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.uni-bayreuth.de/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.uni-siegen.de/pub/opensuse/distribution/11.0/repo/non-oss
+http://ftp.rediris.es/pub/mirror/opensuse/distribution/11.0/repo/non-oss
+http://suse.bifi.unizar.es/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.rediris.es/pub/mirror/opensuse/distribution/11.0/repo/non-oss
+http://ftp.gui.uva.es/sites/opensuse.org/distribution/11.0/repo/non-oss
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.0/repo/non-oss
+http://opensuse.mirrors.proxad.net/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.gui.uva.es/sites/opensuse.org/distribution/11.0/repo/non-oss
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/distribution/11.0/repo/non-oss
+http://mirror.ovh.net/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.0/repo/non-oss
+http://fr2.rpmfind.net/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://mirror.ovh.net/opensuse/distribution/11.0/repo/non-oss
+http://opensuse.cict.fr/distribution/11.0/repo/non-oss
+ftp://mirror.cict.fr/opensuse/distribution/11.0/repo/non-oss
+http://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.0/repo/non-oss
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.0/repo/non-oss
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/distribution/11.0/repo/non-oss
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.0/repo/non-oss
+http://ftp.ntua.gr/pub/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.0/repo/non-oss
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.ntua.gr/pub/linux/opensusedistribution/11.0/repo/non-oss
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.0/repo/non-oss
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/distribution/11.0/repo/non-oss
+ftp://fr2.rpmfind.net/linux/opensuse/distribution/11.0/repo/non-oss
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.0/repo/non-oss
+http://roxen.integrity.hu/pub/opensuse/distribution/11.0/repo/non-oss
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.0/repo/non-oss
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.0/repo/non-oss
+http://rm.mirror.garr.it/mirrors/opensuse/distribution/11.0/repo/non-oss
+ftp://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.0/repo/non-oss
+ftp://rm.mirror.garr.it/mirrors/opensusedistribution/11.0/repo/non-oss
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.0/repo/non-oss
+http://repo1.linux.edu.lv/distribution/11.0/repo/non-oss
+http://mirror.leaseweb.com/opensuse/distribution/11.0/repo/non-oss
+ftp://mirror.leaseweb.com/opensuse/distribution/11.0/repo/non-oss
+http://mirrors.nl.eu.kernel.org/opensuse/distribution/11.0/repo/non-oss
+ftp://mirrors.nl.eu.kernel.org/opensuse/distribution/11.0/repo/non-oss
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/distribution/11.0/repo/non-oss
+ftp://repo1.linux.edu.lv/distribution/11.0/repo/non-oss
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.0/repo/non-oss
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/distribution/11.0/repo/non-oss
+http://opensuse.hro.nl/opensuse/distribution/11.0/repo/non-oss
+ftp://opensuse.hro.nl/opensuse/distribution/11.0/repo/non-oss
+http://opensuse.uib.no/distribution/11.0/repo/non-oss
+http://ftp.uninett.no/pub/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.uninett.no/pub/linux/opensuse/distribution/11.0/repo/non-oss
+http://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.0/repo/non-oss
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.0/repo/non-oss
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://cesium.di.uminho.pt/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.sileman.pl/pub/opensuse/distribution/11.0/repo/non-oss
+http://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.0/repo/non-oss
+http://ftp.gts.lug.ro/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.gts.lug.ro/opensuse/distribution/11.0/repo/non-oss
+http://ftp.ines.lug.ro/opensuse/distribution/11.0/repo/non-oss
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.0/repo/non-oss
+http://ftp.sileman.pl/pub/opensuse/distribution/11.0/repo/non-oss
+http://cesium.di.uminho.pt/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.0/repo/non-oss
+http://mirrors.se.eu.kernel.org/opensuse/distribution/11.0/repo/non-oss
+ftp://mirrors.se.eu.kernel.org/opensuse/distribution/11.0/repo/non-oss
+http://ftp.df.lth.se/pub/opensuse/distribution/11.0/repo/non-oss
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.ines.lug.ro/opensuse/distribution/11.0/repo/non-oss
+http://opensuse.ynet.sk/distribution/11.0/repo/non-oss
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.0/repo/non-oss
+http://less.cogeco.net/ftp/openSUSE/distribution/11.0/repo/non-oss
+ftp://less.cogeco.net/openSUSE/distribution/11.0/repo/non-oss
+http://linux.dell.com/repo/community/distribution/11.0/repo/non-oss
+ftp://ftp.df.lth.se/pub/opensusedistribution/11.0/repo/non-oss
+http://ftp.osuosl.org/pub/opensuse/distribution/11.0/repo/non-oss
+http://www.muug.mb.ca/pub/opensuse/distribution/11.0/repo/non-oss
+http://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://www.muug.mb.ca/pub/opensuse/distribution/11.0/repo/non-oss
+http://suse.mirrors.tds.net/pub/opensuse/distribution/11.0/repo/non-oss
+http://mirrors.med.harvard.edu/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.osuosl.org/pub/opensuse/distribution/11.0/repo/non-oss
+http://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.0/repo/non-oss
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.0/repo/non-oss
+http://mirror.umoss.org/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.0/repo/non-oss
+http://opensuse.cs.utah.edu/distribution/11.0/repo/non-oss
+ftp://suse.mirrors.tds.net/pub/opensuse/distribution/11.0/repo/non-oss
+http://opensuse.ca.unixheads.org/distribution/11.0/repo/non-oss
+http://mirrors.xmission.com/opensuse/distribution/11.0/repo/non-oss
+ftp://opensuse.cs.utah.edu/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.0/repo/non-oss
+http://mirrors2.kernel.org/opensuse/distribution/11.0/repo/non-oss
+ftp://mirrors.xmission.com/opensuse/distribution/11.0/repo/non-oss
+http://mirrors1.kernel.org/opensuse/distribution/11.0/repo/non-oss
+ftp://mirrors2.kernel.org/opensuse/distribution/11.0/repo/non-oss
+http://mirror.rackspace.com/openSUSE/distribution/11.0/repo/non-oss
+http://130.57.19.201/distribution/11.0/repo/non-oss
+http://ftp.utexas.edu/opensuse/distribution/11.0/repo/non-oss
+ftp://130.57.19.201/pub/opensuse/distribution/11.0/repo/non-oss
+http://www.gtlib.gatech.edu/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://mirrors1.kernel.org/opensuse/distribution/11.0/repo/non-oss
+ftp://www.gtlib.gatech.edu/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.utexas.edu/mirrors/opensuse/distribution/11.0/repo/non-oss
+http://ftp.ussg.iu.edu/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://mirror.rackspace.com/openSUSE/distribution/11.0/repo/non-oss
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/distribution/11.0/repo/non-oss
+http://mirror.nyi.net/opensuse/distribution/11.0/repo/non-oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.0/repo/non-oss
+http://mirrors.rit.edu/opensuse/distribution/11.0/repo/non-oss
+http://mirror.cps.cmich.edu/opensuse/opensuse/distribution/11.0/repo/non-oss
+http://ftp.iinet.net.au/pub/opensuse/distribution/11.0/repo/non-oss
+http://mirror.internode.on.net/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.iinet.net.au/pub/opensuse/distribution/11.0/repo/non-oss
+http://mirror.pacific.net.au/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://mirror.nyi.net/opensusedistribution/11.0/repo/non-oss
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.0/repo/non-oss
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.0/repo/non-oss
+http://opensuse.patan.com.ar/distribution/11.0/repo/non-oss
+http://opensuse.c3sl.ufpr.br/distribution/11.0/repo/non-oss
+http://200.221.9.37/pub/opensuse/distribution/11.0/repo/non-oss
+http://opensuse.pop.com.br/distribution/11.0/repo/non-oss
+ftp://opensuse.c3sl.ufpr.br/opensuse/distribution/11.0/repo/non-oss
diff --git a/src/lib/distro-info/suse-11.0/mirrors/base_update b/src/lib/distro-info/suse-11.0/mirrors/base_update
new file mode 100644
index 00000000..69e373c6
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0/mirrors/base_update
@@ -0,0 +1,252 @@
+http://opensuse.mirror.ac.za/opensuse/update/11.0
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/update/11.0
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/update/11.0
+ftp://opensuse.mirror.ac.za/opensuse/update/11.0
+http://www.lizardsource.cn/update/11.0
+http://mirror.alva.ge/pub/opensuse/update/11.0
+http://mirror.lupaworld.com/opensuse/update/11.0
+http://mirror.alva.ge/pub/opensuse/update/11.0
+http://download.opensuse.or.id/update/11.0
+http://mirror.unej.ac.id/opensuse/update/11.0
+ftp://www.lizardsource.cn/update/11.0
+http://opensuse.cbn.net.id/update/11.0
+http://repo.ugm.ac.id/opensuse/update/11.0
+http://dl2.foss-id.web.id/opensuse/update/11.0
+ftp://repo.ugm.ac.id/opensuse/update/11.0
+ftp://opensuse.cbn.net.id/pub/opensuse/update/11.0
+ftp://mirror.unej.ac.id/opensuse/update/11.0
+http://mirror.isoc.org.il/pub/opensuse/update/11.0
+ftp://dl2.foss-id.web.id/repo/opensuse/update/11.0
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/update/11.0
+http://ftp.kddilabs.jp/Linux/packages/opensuse/update/11.0
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/update/11.0
+http://ftp.novell.co.jp/pub/opensuse/update/11.0
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/update/11.0
+ftp://mirror.isoc.org.il/opensuse/update/11.0
+http://ftp.riken.jp/Linux/opensuse/update/11.0
+ftp://ftp.riken.jp/Linux/opensuse/update/11.0
+http://77.88.19.68/opensuse/update/11.0
+ftp://ftp.novell.co.jp/pub/opensuse/update/11.0
+http://77.88.19.73/opensuse/update/11.0
+http://77.88.19.74/opensuse/update/11.0
+http://93.158.155.193/opensuse/update/11.0
+http://ftp.daum.net/opensuse/update/11.0
+ftp://ftp.daum.net/opensuse/update/11.0
+http://mirror.suse.ru/update/11.0
+ftp://ftp.kaist.ac.kr/opensuse/update/11.0
+ftp://allotter.yandex.net/opensuse/update/11.0
+http://mirror.nus.edu.sg/opensuse/update/11.0
+ftp://spreader.yandex.net/opensuse/update/11.0
+ftp://dispenser.yandex.net/opensuse/update/11.0
+ftp://ftp.chg.ru/pub/opensuse/update/11.0
+ftp://seeder.yandex.net/opensuse/update/11.0
+ftp://ftp.suntel.com.tr/pub/opensuse/update/11.0
+ftp://ftp.metu.edu.tr/opensuse/update/11.0
+ftp://ftp.suntel.com.tr/pub/opensuse/update/11.0
+ftp://ftp.isu.edu.tw/pub/Linux/OpenSuSE/update/11.0
+http://ftp.isu.edu.tw/pub/Linux/opensuse/update/11.0
+http://ftp.ncnu.edu.tw/Linux/opensuse/update/11.0
+http://ftp.chg.ru/pub/opensuse/update/11.0
+ftp://mirror.in.th/opensuse/update/11.0
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/update/11.0
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/update/11.0
+http://ftp.twaren.net/Linux/OpenSuSE/update/11.0
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/update/11.0
+http://suse.inode.at/opensuse/update/11.0
+ftp://ftp.twaren.net/Linux/OpenSuSE/update/11.0
+ftp://suse.inode.at/opensuse/update/11.0
+http://gd.tuwien.ac.at/opsys/linux/opensuse/update/11.0
+http://ftp.tugraz.at/mirror/opensuse/update/11.0
+http://suse.lagis.at/opensuse/update/11.0
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/update/11.0
+http://mirror.opensuse.com.ba/opensuse/update/11.0
+http://mirror-fpt-telecom.fpt.net/opensuse/update/11.0
+http://ftp.belnet.be/mirror/ftp.opensuse.org/update/11.0
+ftp://ftp.tugraz.at/mirror/opensuse/update/11.0
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/update/11.0
+http://mirror.switch.ch/ftp/mirror/opensuse/update/11.0
+ftp://mirrors.netbg.com/opensuse/update/11.0
+ftp://suse.lagis.at/opensuse/update/11.0
+http://mirrors.netbg.com/opensuse/update/11.0
+http://mirror.karneval.cz/pub/linux/opensuse/update/11.0
+http://ftp.halifax.rwth-aachen.de/opensuse/update/11.0
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/update/11.0
+ftp://ftp.halifax.rwth-aachen.de/opensuse/update/11.0
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/update/11.0
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/update/11.0
+http://ftp.linux.cz/pub/linux/opensuse/update/11.0
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/update/11.0
+ftp://mirror.karneval.cz/pub/linux/opensuse/update/11.0
+http://download.uni-hd.de/ftp/pub/linux/opensuse/update/11.0
+http://ftp5.gwdg.de/pub/opensuse/update/11.0
+ftp://mirror.switch.ch/mirror/opensuse/update/11.0
+ftp://ftp5.gwdg.de/pub/opensuse/update/11.0
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/update/11.0
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/update/11.0
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/update/11.0
+http://opensuse.intergenia.de/update/11.0
+http://ftp.uni-ulm.de/mirrors/opensuse/update/11.0
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/update/11.0
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/update/11.0
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/update/11.0
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/update/11.0
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/update/11.0
+http://ftp.uni-kl.de/pub/linux/opensuse/update/11.0
+ftp://ftp.uni-ulm.de/mirrors/opensuse/update/11.0
+http://ftp4.gwdg.de/pub/opensuse/update/11.0
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/update/11.0
+http://ftp.uni-kassel.de/opensuse/update/11.0
+ftp://ftp.uni-kl.de/pub/linux/opensuse/update/11.0
+http://ftp3.gwdg.de/pub/opensuse/update/11.0
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/update/11.0
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/update/11.0
+ftp://ftp4.gwdg.de/pub/opensuse/update/11.0
+http://opensuse-linuxmigratio.at/update/11.0
+http://ftp.tu-ilmenau.de/mirror/opensuse/update/11.0
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/update/11.0
+http://widehat.opensuse.org/update/11.0
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/update/11.0
+http://ftp.uni-bayreuth.de/linux/opensuse/update/11.0
+http://ftp.uni-paderborn.de/pub/linux/opensuse/update/11.0
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/update/11.0
+http://ftp.uni-siegen.de/opensuse/update/11.0
+ftp://ftp3.gwdg.de/pub/opensuse/update/11.0
+ftp://ftp.uni-siegen.de/pub/opensuse/update/11.0
+http://ftp.klid.dk/ftp/opensuse/update/11.0
+ftp://ftp.klid.dk/opensuse/update/11.0
+http://ftp.estpak.ee/pub/suse/opensuse/update/11.0
+ftp://ftp.uni-bayreuth.de/linux/opensuse/update/11.0
+http://ftp.gui.uva.es/sites/opensuse.org/update/11.0
+http://ftp.rediris.es/pub/mirror/opensuse/update/11.0
+http://suse.bifi.unizar.es/opensuse/update/11.0
+ftp://ftp.rediris.es/pub/mirror/opensuse/update/11.0
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/update/11.0
+http://opensuse.mirrors.proxad.net/opensuse/update/11.0
+ftp://ftp.gui.uva.es/sites/opensuse.org/update/11.0
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/update/11.0
+http://mirror.ovh.net/opensuse/update/11.0
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/update/11.0
+ftp://mirror.ovh.net/opensuse/update/11.0
+http://opensuse.cict.fr/update/11.0
+ftp://mirror.cict.fr/opensuse/update/11.0
+http://www.mirrorservice.org/sites/download.opensuse.org/update/11.0
+http://fr2.rpmfind.net/linux/opensuse/update/11.0
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/update/11.0
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/update/11.0
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/update/11.0
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/update/11.0
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/update/11.0
+ftp://www.mirrorservice.org/sites/download.opensuse.org/update/11.0
+http://ftp.ntua.gr/pub/linux/opensuse/update/11.0
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/update/11.0
+ftp://ftp.ntua.gr/pub/linux/opensuseupdate/11.0
+http://roxen.integrity.hu/pub/opensuse/update/11.0
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/update/11.0
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/update/11.0
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/update/11.0
+ftp://fr2.rpmfind.net/linux/opensuse/update/11.0
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/update/11.0
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/update/11.0
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/update/11.0
+ftp://rm.mirror.garr.it/mirrors/opensuseupdate/11.0
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/update/11.0
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/update/11.0
+http://mirror.leaseweb.com/opensuse/update/11.0
+http://rm.mirror.garr.it/mirrors/opensuse/update/11.0
+ftp://mirror.leaseweb.com/opensuse/update/11.0
+http://repo1.linux.edu.lv/update/11.0
+ftp://mirrors.nl.eu.kernel.org/opensuse/update/11.0
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/update/11.0
+ftp://repo1.linux.edu.lv/update/11.0
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/update/11.0
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/update/11.0
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/update/11.0
+http://opensuse.hro.nl/opensuse/update/11.0
+ftp://opensuse.hro.nl/opensuse/update/11.0
+http://opensuse.uib.no/update/11.0
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/update/11.0
+http://ftp.uninett.no/pub/linux/opensuse/update/11.0
+http://ftp.icm.edu.pl/pub/Linux/opensuse/update/11.0
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/update/11.0
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/update/11.0
+http://mirrors.nl.eu.kernel.org/opensuse/update/11.0
+ftp://ftp.pbone.net/pub/opensuse/update/11.0
+ftp://ftp.pbone.net/pub/opensuse/update/11.0
+http://ftp.sileman.pl/pub/opensuse/update/11.0
+ftp://ftp.uninett.no/pub/linux/opensuse/update/11.0
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/update/11.0
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/update/11.0
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/update/11.0
+ftp://ftp.sileman.pl/pub/opensuse/update/11.0
+ftp://cesium.di.uminho.pt/pub/opensuse/update/11.0
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/update/11.0
+http://ftp.gts.lug.ro/opensuse/update/11.0
+http://ftp.nux.ipb.pt/pub/dists/opensuse/update/11.0
+http://ftp.ines.lug.ro/opensuse/update/11.0
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/update/11.0
+ftp://ftp.gts.lug.ro/opensuse/update/11.0
+http://cesium.di.uminho.pt/pub/opensuse/update/11.0
+http://mirrors.se.eu.kernel.org/opensuse/update/11.0
+ftp://ftp.ines.lug.ro/opensuse/update/11.0
+ftp://mirrors.se.eu.kernel.org/opensuse/update/11.0
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/update/11.0
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/update/11.0
+http://ftp.df.lth.se/pub/opensuse/update/11.0
+http://opensuse.ynet.sk/update/11.0
+ftp://ftp.df.lth.se/pub/opensuseupdate/11.0
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/update/11.0
+ftp://less.cogeco.net/openSUSE/update/11.0
+http://linux.dell.com/repo/community/update/11.0
+http://less.cogeco.net/ftp/openSUSE/update/11.0
+http://ftp.osuosl.org/pub/opensuse/update/11.0
+http://www.muug.mb.ca/pub/opensuse/update/11.0
+http://opensuse.fastsoft.net/pub/linux/opensuse/update/11.0
+ftp://ftp.osuosl.org/pub/opensuse/update/11.0
+ftp://www.muug.mb.ca/pub/opensuse/update/11.0
+http://suse.mirrors.tds.net/pub/opensuse/update/11.0
+ftp://suse.mirrors.tds.net/pub/opensuse/update/11.0
+http://mirrors.med.harvard.edu/opensuse/update/11.0
+http://mirror.anl.gov/pub/opensuse/opensuse/update/11.0
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/update/11.0
+http://mirror.umoss.org/opensuse/update/11.0
+http://opensuse.cs.utah.edu/update/11.0
+http://opensuse.ca.unixheads.org/update/11.0
+http://mirrors.xmission.com/opensuse/update/11.0
+ftp://mirror.anl.gov/pub/opensuse/opensuse/update/11.0
+http://mirrors1.kernel.org/opensuse/update/11.0
+http://mirrors2.kernel.org/opensuse/update/11.0
+ftp://mirrors1.kernel.org/opensuse/update/11.0
+ftp://mirrors.xmission.com/opensuse/update/11.0
+http://130.57.19.201/update/11.0
+ftp://130.57.19.201/pub/opensuse/update/11.0
+http://mirror.rackspace.com/openSUSE/update/11.0
+ftp://www.gtlib.gatech.edu/pub/opensuse/update/11.0
+ftp://mirror.rackspace.com/openSUSE/update/11.0
+http://ftp.ussg.iu.edu/linux/opensuse/update/11.0
+http://ftp.utexas.edu/opensuse/update/11.0
+ftp://mirrors2.kernel.org/opensuse/update/11.0
+ftp://ftp.ussg.iu.edu/linux/opensuse/update/11.0
+ftp://mirror.colorado.edu/pub/opensuse/update/11.0
+ftp://ftp.utexas.edu/mirrors/opensuse/update/11.0
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/update/11.0
+ftp://opensuse.cs.utah.edu/pub/opensuse/update/11.0
+http://www.gtlib.gatech.edu/pub/opensuse/update/11.0
+http://mirror.cps.cmich.edu/opensuse/opensuse/update/11.0
+http://mirror.nyi.net/opensuse/update/11.0
+http://mirrors.rit.edu/opensuse/update/11.0
+ftp://mirror.colorado.edu/pub/opensuse/update/11.0
+ftp://mirror.nyi.net/opensuseupdate/11.0
+http://ftp.iinet.net.au/pub/opensuse/update/11.0
+http://ftp.netspace.net.au/pub/opensuse/update/11.0
+http://mirror.internode.on.net/pub/opensuse/update/11.0
+http://mirror.pacific.net.au/linux/opensuse/update/11.0
+ftp://ftp.iinet.net.au/pub/opensuse/update/11.0
+ftp://mirror.internode.on.net/pub/opensuse/update/11.0
+ftp://mirror.pacific.net.au/linux/opensuse/update/11.0
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/update/11.0
+http://opensuse.c3sl.ufpr.br/update/11.0
+http://200.221.9.37/pub/opensuse/update/11.0
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/update/11.0
+http://opensuse.patan.com.ar/update/11.0
+http://opensuse.pop.com.br/update/11.0
+ftp://opensuse.c3sl.ufpr.br/opensuse/update/11.0
diff --git a/src/lib/distro-info/suse-11.0/prereqfiles/etc/group b/src/lib/distro-info/suse-11.0/prereqfiles/etc/group
new file mode 100644
index 00000000..505cb221
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0/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/src/lib/distro-info/suse-11.0/prereqfiles/etc/hosts b/src/lib/distro-info/suse-11.0/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/suse-11.0/prereqfiles/etc/passwd b/src/lib/distro-info/suse-11.0/prereqfiles/etc/passwd
new file mode 100644
index 00000000..9b8fc4fe
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0/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/src/lib/distro-info/suse-11.0/prereqfiles/etc/shadow b/src/lib/distro-info/suse-11.0/prereqfiles/etc/shadow
new file mode 100644
index 00000000..cd100a5a
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0/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/src/lib/distro-info/suse-11.0/settings.default b/src/lib/distro-info/suse-11.0/settings.default
new file mode 100644
index 00000000..a775f942
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0/settings.default
@@ -0,0 +1,1145 @@
+bootstrap-packages = <<END
+ i586/aaa_base-11.1-10007.5.i586.rpm
+ i586/audit-libs-1.7.7-5.1.i586.rpm
+ i586/bash-3.2-141.10.i586.rpm
+ i586/boost-license-1.36.0-9.5.i586.rpm
+ i586/bzip2-1.0.5-34.5.i586.rpm
+ i586/ConsoleKit-0.2.10-60.16.i586.rpm
+ i586/coreutils-6.12-32.10.i586.rpm
+ i586/coreutils-lang-6.12-32.10.i586.rpm
+ i586/cpio-2.9-75.35.i586.rpm
+ i586/cpio-lang-2.9-75.35.i586.rpm
+ i586/cracklib-2.8.12-55.1.i586.rpm
+ i586/cracklib-dict-small-2.8.12-55.1.i586.rpm
+ i586/cron-4.1-194.28.i586.rpm
+ i586/cyrus-sasl-2.1.22-182.1.i586.rpm
+ i586/dbus-1-1.2.4-5.1.i586.rpm
+ i586/dbus-1-glib-0.76-32.1.i586.rpm
+ i586/device-mapper-1.02.27-7.1.i586.rpm
+ i586/diffutils-2.8.7-143.9.i586.rpm
+ i586/dhcpcd-3.2.3-44.1.i586.rpm
+ i586/dirmngr-1.0.2-1.39.i586.rpm
+ i586/e2fsprogs-1.41.1-11.9.i586.rpm
+ i586/elfutils-0.137-3.11.i586.rpm
+ i586/file-4.24-43.1.i586.rpm
+ i586/filesystem-11.1-2.3.i586.rpm
+ i586/fillup-1.42-242.8.i586.rpm
+ i586/findutils-4.4.0-38.27.i586.rpm
+ i586/gawk-3.1.6-1.44.i586.rpm
+ i586/gdbm-1.8.3-371.8.i586.rpm
+ i586/glib2-2.18.2-5.1.i586.rpm
+ i586/glib2-lang-2.18.2-5.1.i586.rpm
+ i586/glib2-branding-upstream-2.18.2-5.1.i586.rpm
+ i586/glibc-2.9-2.8.i586.rpm
+ i586/gpg2-2.0.9-25.105.i586.rpm
+ i586/gpg2-lang-2.0.9-25.105.i586.rpm
+ i586/grep-2.5.2-90.28.i586.rpm
+ i586/gzip-1.3.12-68.36.i586.rpm
+ i586/hal-0.5.12-10.1.i586.rpm
+ i586/info-4.12-1.85.i586.rpm
+ i586/insserv-1.12.0-22.15.i586.rpm
+ i586/irqbalance-0.55-120.8.i586.rpm
+ i586/kernel-default-2.6.27.7-9.1.i586.rpm
+ i586/kernel-default-base-2.6.27.7-9.1.i586.rpm
+ i586/keyutils-1.2-107.4.i586.rpm
+ i586/keyutils-libs-1.2-107.4.i586.rpm
+ i586/krb5-1.6.3-132.1.i586.rpm
+ i586/libacl-2.2.47-27.5.i586.rpm
+ i586/libasm1-0.137-3.11.i586.rpm
+ i586/libasound2-1.0.18-8.7.i586.rpm
+ i586/libattr-2.4.39-67.5.i586.rpm
+ i586/libbz2-1-1.0.5-34.5.i586.rpm
+ i586/libblkid1-1.41.1-11.9.i586.rpm
+ i586/libblocxx6-2.1.0.342-120.1.i586.rpm
+ i586/libboost_signals1_36_0-1.36.0-9.5.i586.rpm
+ i586/libcom_err2-1.41.1-11.9.i586.rpm
+ i586/libcurl4-7.19.0-11.1.i586.rpm
+ i586/libdb-4_5-4.5.20-94.17.i586.rpm
+ i586/libdw1-0.137-3.11.i586.rpm
+ i586/libelf1-0.137-3.11.i586.rpm
+ i586/libext2fs2-1.41.1-11.9.i586.rpm
+ i586/libexpat1-2.0.1-88.10.i586.rpm
+ i586/libgcc43-4.3.3_20081022-9.5.i586.rpm
+ i586/libgcrypt11-1.4.1-4.1.i586.rpm
+ i586/libglib-2_0-0-2.18.2-5.1.i586.rpm
+ i586/libgobject-2_0-0-2.18.2-5.1.i586.rpm
+ i586/libgpg-error0-1.6-6.10.i586.rpm
+ i586/libgthread-2_0-0-2.18.2-5.1.i586.rpm
+ i586/libidn-1.10-2.14.i586.rpm
+ i586/libksba-1.0.4-1.17.i586.rpm
+ i586/libldap-2_4-2-2.4.12-5.3.i586.rpm
+ i586/libncurses5-5.6-89.10.i586.rpm
+ i586/libncurses6-5.6-89.10.i586.rpm
+ i586/libnscd-2.0.2-72.47.i586.rpm
+ i586/libopenssl0_9_8-0.9.8h-28.4.i586.rpm
+ i586/libpt2-2.4.2-2.19.i586.rpm
+ i586/libreadline5-5.2-141.10.i586.rpm
+ i586/libreiserfs-0.3.0.5-107.47.i586.rpm
+ i586/libselinux1-2.0.71-3.38.i586.rpm
+ i586/libsepol1-2.0.32-5.38.i586.rpm
+ i586/libsmbios2-2.0.2-10.9.i586.rpm
+ i586/libstdc++43-4.3.3_20081022-9.5.i586.rpm
+ i586/libusb-0_1-4-0.1.12-136.10.i586.rpm
+ i586/libusb-1_0-0-0.9.3-4.20.i586.rpm
+ i586/libuuid1-1.41.1-11.9.i586.rpm
+ i586/libvolume_id-126-17.25.i586.rpm
+ i586/libvolume_id1-128-9.3.i586.rpm
+ i586/libxcrypt-3.0.1-25.20.i586.rpm
+ i586/libxml2-2.7.1-9.1.i586.rpm
+ i586/libzio-0.9-4.19.i586.rpm
+ i586/limal-1.5.1-1.12.i586.rpm
+ i586/limal-perl-1.5.1-1.12.i586.rpm
+ i586/login-3.37-1.5.i586.rpm
+ i586/logrotate-3.7.7-9.11.i586.rpm
+ i586/m4-1.4.12-1.13.i586.rpm
+ i586/metamail-2.7.19-1244.29.i586.rpm
+ i586/mingetty-1.0.7s-70.41.i586.rpm
+ i586/mkinitrd-2.4-34.1.i586.rpm
+ i586/module-init-tools-3.4-56.5.i586.rpm
+ i586/ncurses-utils-5.6-89.10.i586.rpm
+ i586/net-tools-1.60-725.5.i586.rpm
+ i586/openldap2-client-2.4.12-5.3.i586.rpm
+ i586/openslp-1.2.0-168.6.i586.rpm
+ i586/openssl-0.9.8h-28.4.i586.rpm
+ i586/openSUSE-release-11.1-1.19.i586.rpm
+ i586/openSUSE-release-ftp-11.1-1.19.i586.rpm
+ i586/pam-1.0.2-13.3.i586.rpm
+ i586/pam-config-0.68-1.3.i586.rpm
+ i586/pam-modules-11.1-5.1.i586.rpm
+ i586/parted-1.8.8-91.5.i586.rpm
+ i586/pciutils-3.0.1-1.26.i586.rpm
+ i586/pcre-7.8-1.26.i586.rpm
+ i586/perl-5.10.0-62.10.i586.rpm
+ i586/perl-base-5.10.0-62.10.i586.rpm
+ i586/perl-Bootloader-0.4.81-1.1.i586.rpm
+ i586/perl-gettext-1.05-91.163.i586.rpm
+ i586/permissions-2008.11.25-1.5.i586.rpm
+ i586/pinentry-0.7.5-61.14.i586.rpm
+ i586/pm-utils-0.99.4.20071229-10.3.i586.rpm
+ i586/pmtools-20071116-44.3.i586.rpm
+ i586/PolicyKit-0.9-13.9.i586.rpm
+ i586/popt-1.7-20.1.i586.rpm
+ i586/procmail-3.22-238.15.i586.rpm
+ i586/procps-3.2.7-147.11.i586.rpm
+ i586/psmisc-22.6-61.14.i586.rpm
+ i586/pth-2.0.7-102.29.i586.rpm
+ i586/pwdutils-3.2.2-2.8.i586.rpm
+ i586/reiserfs-3.6.19-116.62.i586.rpm
+ i586/rmail-8.14.3-50.9.i586.rpm
+ i586/rpm-4.4.2.3-20.1.i586.rpm
+ i586/satsolver-tools-0.13.0-3.3.i586.rpm
+ i586/SDL-1.2.13-104.1.i586.rpm
+ i586/sed-4.1.5-85.60.i586.rpm
+ i586/sendmail-8.14.3-50.9.i586.rpm
+ i586/setserial-2.17-716.20.i586.rpm
+ i586/sharutils-4.6.3-3.100.i586.rpm
+ i586/sysvinit-2.86-186.7.i586.rpm
+ i586/tcpd-7.6-855.11.i586.rpm
+ i586/tcsh-6.15.00-93.3.i586.rpm
+ i586/terminfo-base-5.6-89.10.i586.rpm
+ i586/udev-128-9.3.i586.rpm
+ i586/util-linux-2.14.1-10.1.i586.rpm
+ i586/util-linux-lang-2.14.1-10.1.i586.rpm
+ i586/uucp-1.07-50.7.i586.rpm
+ i586/uuid-runtime-1.41.1-11.9.i586.rpm
+ i586/zlib-1.2.3-104.137.i586.rpm
+ noarch/netcfg-11.1-1.14.noarch.rpm
+ noarch/pciutils-ids-2008.11.26-2.4.noarch.rpm
+ noarch/suse-build-key-1.0-907.32.noarch.rpm
+END
+<metapackager zypper>
+ packages = <<END
+ i586/libzypp-5.24.5-1.1.i586.rpm
+ i586/zypper-1.0.2-1.5.i586.rpm
+ END
+</metapackager>
+<metapackager smart>
+ packages = <<END
+ i586/python-2.6.0-2.16.i586.rpm
+ i586/python-xml-2.6.0-2.12.i586.rpm
+ i586/rpm-python-4.4.2.3-20.1.i586.rpm
+ END
+</metapackager>
+<metapackager yum>
+ packages = <<END
+ i586/glib2-2.18.2-4.3.i586.rpm
+ i586/libxml2-2.7.1-8.3.i586.rpm
+ i586/libxml2-python-2.7.1-9.1.i586.rpm
+ i586/python-2.6.0-2.16.i586.rpm
+ i586/python-urlgrabber-3.1.0-178.8.i586.rpm
+ i586/python-xml-2.6.0-2.12.i586.rpm
+ i586/rpm-python-4.4.2.3-20.1.i586.rpm
+ i586/sqlite3-3.6.4-1.8.i586.rpm
+ i586/yum-metadata-parser-1.1.2-107.22.i586.rpm
+ END
+</metapackager>
+
+package-subdir = suse
+prereq-packages = <<END
+ i586/bzip2-1.0.5-34.5.i586.rpm
+ i586/glibc-2.9-2.8.i586.rpm
+ i586/libselinux1-2.0.71-3.38.i586.rpm
+ i586/libbz2-1-1.0.5-34.5.i586.rpm
+ i586/popt-1.7-20.1.i586.rpm
+ i586/rpm-4.4.2.3-20.1.i586.rpm
+ i586/zlib-1.2.3-104.137.i586.rpm
+END
+<repository base>
+ name = openSUSE 11.0
+ repo-subdir = suse
+ file-for-speedtest = suse/setup/descr/packages.en.gz
+</repository>
+<repository base_non-oss>
+ name = openSUSE 11.0 non-OSS
+ repo-subdir = suse
+ file-for-speedtest = suse/setup/descr/packages.en.gz
+</repository>
+<repository base_update>
+ name = openSUSE 11.0 updates
+ file-for-speedtest = repodata/primary.xml.gz
+</repository>
+<selection minimal>
+ packages = <<END
+ glibc-locale
+ END
+</selection>
+<selection textmode>
+ base = minimal
+ packages = <<END
+ acl
+ acpid
+ apparmor-docs
+ apparmor-profiles
+ apparmor-utils
+ ash
+ at
+ atk
+ attr
+ audit
+ autofs
+ autoyast2
+ bc
+ bind-libs
+ bind-utils
+ boost
+ bootsplash-theme-SuSE
+ compat
+ compat-libstdc++
+ compat-openssl097g
+ cpufrequtils
+ cron
+ cups-client
+ cyrus-sasl
+ cyrus-sasl-saslauthd
+ db-utils
+ deltarpm
+ dhcpcd
+ dmraid
+ dos2unix
+ dosfstools
+ ed
+ eject
+ ethtool
+ fbset
+ findutils
+ fontconfig
+ freetype2
+ gdb
+ gdbm
+ glib2
+ glibc-i18ndata
+ gpm
+ hal-resmgr
+ hfsutils
+ ifplugd
+ initviocons
+ inst-source-utils
+ iputils
+ joe
+ kbd
+ kernel-default
+ krb5
+ ksh
+ ksymoops
+ libacl
+ libapparmor
+ libart_lgpl
+ libattr
+ libcap
+ libcom_err
+ libdrm
+ libevent
+ libgcc41
+ libgcrypt
+ libgimpprint
+ libgpg-error
+ libicu
+ libidn
+ libjpeg
+ liblazy
+ liblcms
+ libltdl
+ libmng
+ libnscd
+ libopencdk
+ libpcap
+ libpng
+ librpcsecgss
+ libstdc++41
+ libtiff
+ libusb
+ libvolume_id
+ libxcrypt
+ lukemftp
+ lvm2
+ lzo
+ mailx
+ man
+ man-pages
+ microcode_ctl
+ module-init-tools
+ multipath-tools
+ nbd
+ ncurses
+ net-snmp
+ nfs-utils
+ nfsidmap
+ nscd
+ ntfsprogs
+ openSUSE-release
+ openct
+ opensc
+ openssh
+ openssl
+ patch
+ pax
+ perl-Crypt-SmbHash
+ perl-URI
+ perl-XML-Parser
+ perl-XML-Writer
+ postfix
+ powersave-libs
+ preload
+ procinfo
+ procmail
+ procps
+ providers
+ qlogic-firmware
+ recode
+ rrdtool
+ rsync
+ sash
+ screen
+ scsi
+ sensors
+ sharutils
+ smartmontools
+ smpppd
+ squashfs-kmp-default
+ strace
+ sudo
+ suse-build-key
+ suspend
+ sysfsutils
+ syslog-ng
+ tcpd
+ tcpdump
+ tcsh
+ telnet
+ terminfo
+ timezone
+ ulimit
+ usbutils
+ utempter
+ vim
+ wdiff
+ wget
+ wvstreams
+ xfsprogs
+ xinetd
+ xntp
+ yast2-apparmor
+ yast2-backup
+ yast2-bluetooth
+ yast2-bootfloppy
+ yast2-irda
+ yast2-iscsi-client
+ yast2-mail
+ yast2-ncurses
+ yast2-nis-client
+ yast2-ntp-client
+ yast2-online-update-frontend
+ yast2-power-management
+ yast2-powertweak
+ yast2-profile-manager
+ yast2-repair
+ yast2-restore
+ yast2-runlevel
+ yast2-samba-client
+ yast2-scanner
+ yast2-sudo
+ yast2-support
+ yast2-theme-openSUSE
+ yast2-trans-de
+ yast2-tv
+ ypbind
+ zip
+ zisofs-tools
+ zsh
+ END
+</selection>
+<selection kde>
+ base = textmode
+ packages = <<END
+ 3ddiag
+ 915resolution
+ a2ps
+ aaa_base
+ aaa_skel
+ aalib
+ acl
+ acpid
+ AdobeICCProfiles
+ agfa-fonts
+ alsa
+ amarok
+ amarok-libvisual
+ amarok-xine
+ apparmor-docs
+ apparmor-parser
+ apparmor-profiles
+ apparmor-utils
+ arts
+ ash
+ aspell
+ aspell-de
+ aspell-en
+ at
+ atk
+ attr
+ audiofile
+ audit
+ audit-libs
+ autofs
+ autoyast2
+ autoyast2-installation
+ bash
+ bc
+ bind-libs
+ bind-utils
+ binutils
+ blocxx
+ bluez-libs
+ bluez-utils
+ boost
+ bootsplash
+ bootsplash-theme-SuSE
+ bzip2
+ cabextract
+ cairo
+ cdparanoia
+ cdrdao
+ CheckHardware
+ checkmedia
+ chromium
+ classpath
+ compat
+ compat-libstdc++
+ compat-openssl097g
+ compiz
+ coreutils
+ cpio
+ cpp
+ cpp41
+ cpufrequtils
+ cracklib
+ cron
+ Crystalcursors
+ cups
+ cups-client
+ cups-drivers
+ cups-libs
+ curl
+ cyrus-sasl
+ cyrus-sasl-crammd5
+ cyrus-sasl-digestmd5
+ cyrus-sasl-plain
+ cyrus-sasl-saslauthd
+ db
+ dbus-1
+ dbus-1-glib
+ dbus-1-mono
+ dbus-1-qt3
+ dbus-1-x11
+ db-utils
+ dcraw
+ dejavu
+ deltarpm
+ desktop-data-SuSE
+ desktop-file-utils
+ desktop-translations
+ device-mapper
+ dhcdbd
+ dhcp
+ dhcpcd
+ dhcp-client
+ dialog
+ diffutils
+ digikam
+ digikamimageplugins
+ dirmngr
+ dmraid
+ dos2unix
+ dosbootdisk
+ dosfstools
+ dvd+rw-tools
+ e2fsprogs
+ ed
+ efont-unicode
+ eject
+ enscript
+ esound
+ ethtool
+ evms
+ evms-gui
+ exiftool
+ expat
+ fam
+ fbset
+ fftw3
+ file
+ fileshareset
+ filesystem
+ fillup
+ findutils
+ flac
+ flash-player
+ fontconfig
+ fonts-config
+ foomatic-filters
+ freealut
+ freeciv
+ freeglut
+ freetype
+ freetype2
+ fribidi
+ frozen-bubble
+ ft2demos
+ ftgl
+ fvwm2
+ gail
+ gawk
+ gcc41-gij
+ gcc-gij
+ gconf2
+ gdb
+ gdbm
+ gettext
+ ghostscript-fonts-other
+ ghostscript-fonts-std
+ ghostscript-library
+ ghostscript-x11
+ giflib
+ gimp
+ gimp-help
+ gle
+ glib
+ glib2
+ glibc
+ glibc-i18ndata
+ glib-sharp2
+ glitz
+ gmime
+ gmp
+ gnokii
+ gnome-filesystem
+ gnome-icon-theme
+ gnome-keyring
+ gnome-mime-data
+ gnome-vfs2
+ gnutls
+ gpart
+ gpg
+ gpg2
+ gpgme
+ gpm
+ GraphicsMagick
+ grep
+ groff
+ grub
+ gsf-sharp
+ gstreamer010
+ gstreamer010-plugins-base
+ gtk
+ gtk2
+ gtk-sharp2
+ gtksourceview
+ gutenprint
+ gwenview
+ gzip
+ hal
+ hal-resmgr
+ hdparm
+ hfsutils
+ hplip
+ hplip-hpijs
+ htdig
+ hwinfo
+ id3lib
+ ifnteuro
+ ifplugd
+ ImageMagick
+ ImageMagick-Magick++
+ imlib
+ imlib2
+ imlib2-loaders
+ info
+ info2html
+ initviocons
+ insserv
+ inst-source-utils
+ intlfnts
+ iproute2
+ iptables
+ iputils
+ irqbalance
+ ispell
+ ispell-american
+ ispell-german
+ ispell-ngerman
+ jack
+ java-1_4_2-gcj-compat
+ java-1_5_0-sun
+ java-1_5_0-sun-plugin
+ jfsutils
+ joe
+ jpackage-utils
+ jpeg
+ k3b
+ kaffeine
+ kbd
+ kcm_gtk
+ kde3-i18n-de
+ kdeaddons3-kicker
+ kdeaddons3-konqueror
+ kdeartwork3-kscreensaver
+ kdeartwork3-xscreensaver
+ kdebase3
+ kdebase3-kdm
+ kdebase3-ksysguardd
+ kdebase3-nsplugin
+ kdebase3-samba
+ kdebase3-session
+ kdebase3-SuSE
+ kdebluetooth
+ kdegames3
+ kdegraphics3
+ kdegraphics3-kamera
+ kdegraphics3-pdf
+ kdegraphics3-postscript
+ kdegraphics3-scan
+ kdelibs3
+ kdelibs3-doc
+ kdemultimedia3
+ kdemultimedia3-CD
+ kdemultimedia3-mixer
+ kdenetwork3
+ kdenetwork3-InstantMessenger
+ kdenetwork3-news
+ kdenetwork3-vnc
+ kdepim3
+ kdepim3-kpilot
+ kdepim3-networkstatus
+ kdepim3-notes
+ kdetv
+ kdeutils3
+ kernel-default
+ kio_ipodslave
+ kio_iso
+ kio_slp
+ kipi-plugins
+ kitchensync
+ klogd
+ knights
+ koffice
+ koffice-i18n-de
+ koffice-i18n-de-doc
+ koffice-illustration
+ konversation
+ kpowersave
+ krb5
+ krecord
+ ksh
+ ksudoku
+ ksymoops
+ ktorrent
+ kwin-decor-suse2
+ lbreakout
+ ldapcpplib
+ less
+ libacl
+ libakode
+ libao
+ libapparmor
+ libart_lgpl
+ libattr
+ libbeagle
+ libbonobo
+ libbonoboui
+ libcap
+ libcom_err
+ libcroco
+ libdrm
+ libevent
+ libexif
+ libgcc41
+ libgcj41
+ libgcrypt
+ libgimpprint
+ libglade2
+ libgnome
+ libgnomecanvas
+ libgnomecups
+ libgnomeprint
+ libgnomeprintui
+ libgnomesu
+ libgnomeui
+ libgpg-error
+ libgphoto2
+ libgpod
+ libgsf
+ libgsf-gnome
+ libgssapi
+ libgtkhtml
+ libical
+ libicu
+ libidl
+ libidn
+ libieee1284
+ libjasper
+ libjpeg
+ libkexif
+ libkipi
+ libksba
+ liblazy
+ liblcms
+ libltdl
+ libmal
+ libmikmod
+ libmng
+ libmpcdec
+ libmtp
+ libmusicbrainz
+ libnetpbm
+ libnjb
+ libnl
+ libnscd
+ libofa
+ libogg
+ liboil
+ libopencdk
+ libopensync
+ libopensync-plugin-file
+ libopensync-plugin-gnokii
+ libopensync-plugin-gpe
+ libopensync-plugin-irmc
+ libopensync-plugin-kdepim
+ libopensync-plugin-opie
+ libopensync-plugin-palm
+ libopensync-plugin-sunbird
+ libopensync-plugin-syncml
+ libopensync-tools
+ libpcap
+ libpng
+ libqt4
+ libqt4-dbus-1
+ libqt4-qt3support
+ libqt4-sql
+ libqt4-x11
+ libqtpod
+ librpcsecgss
+ librsvg
+ libsamplerate
+ libsmbclient
+ libsndfile
+ libsoup
+ libstdc++41
+ libstroke
+ libsyncml
+ libtheora
+ libtiff
+ libtunepimp
+ libusb
+ libvisual
+ libvolume_id
+ libvorbis
+ libwmf
+ libwnck
+ libxcrypt
+ libxml2
+ libxslt
+ liby2util
+ libzio
+ libzypp
+ libzypp-zmd-backend
+ limal
+ limal-bootloader
+ limal-perl
+ logrotate
+ lsb
+ lsof
+ lua-libs
+ lukemftp
+ lvm2
+ lzo
+ m4
+ mailx
+ make
+ man
+ man-pages
+ manufacturer-PPDs
+ master-boot-code
+ mdadm
+ mDNSResponder-lib
+ Mesa
+ metacity
+ microcode_ctl
+ mingetty
+ mkinitrd
+ mkisofs
+ mktemp
+ module-init-tools
+ mono-core
+ mono-data
+ mono-data-sqlite
+ mono-web
+ MozillaFirefox
+ MozillaFirefox-translations
+ mozilla-nspr
+ mozilla-nss
+ mozilla-xulrunner181
+ multipath-tools
+ myspell-american
+ myspell-german
+ ncurses
+ neon
+ netcat
+ netcfg
+ netpbm
+ net-snmp
+ net-tools
+ NetworkManager
+ NetworkManager-kde
+ nfsidmap
+ nfs-utils
+ nscd
+ ntfsprogs
+ numlockx
+ ocrad
+ openal
+ openct
+ OpenEXR
+ openldap2-client
+ openobex
+ OpenOffice_org
+ OpenOffice_org-de
+ OpenOffice_org-kde
+ OpenOffice_org-Quickstarter
+ opensc
+ openslp
+ openssh
+ openssh-askpass
+ openssl
+ opensuse-manual_de
+ opensuse-manual_en
+ openSUSE-release
+ orbit2
+ pam
+ pam-config
+ pam-modules
+ pango
+ parted
+ patch
+ pax
+ pciutils
+ pciutils-ids
+ pcre
+ pcsc-lite
+ perl
+ perl-Bootloader
+ perl-Compress-Zlib
+ perl-Config-Crontab
+ perl-Crypt-SmbHash
+ perl-Crypt-SSLeay
+ perl-DBD-SQLite
+ perl-DBI
+ perl-Digest-HMAC
+ perl-Digest-MD4
+ perl-Digest-SHA1
+ perl-File-Tail
+ perl-gettext
+ perl-HTML-Parser
+ perl-HTML-Tagset
+ perl-IO-Zlib
+ perl-libwww-perl
+ perl-Net-Daemon
+ perl-Net-DNS
+ perl-Net-IP
+ perl-PlRPC
+ perl-spamassassin
+ perl-TermReadKey
+ perl-TimeDate
+ perl-URI
+ perl-XML-Parser
+ perl-XML-Writer
+ permissions
+ phalanx
+ pilot-link
+ pinentry
+ pinentry-qt
+ pkgconfig
+ pmtools
+ pm-utils
+ PolicyKit
+ poppler
+ poppler-qt
+ popt
+ portmap
+ postfix
+ powersave
+ powersave-libs
+ ppp
+ pptp
+ preload
+ procinfo
+ procmail
+ procps
+ providers
+ psmisc
+ pwdutils
+ python
+ python-qt
+ python-xml
+ qca
+ qlogic-firmware
+ qscintilla
+ qt3
+ qtcurve-gtk2
+ rdesktop
+ readline
+ RealPlayer
+ recode
+ reiserfs
+ release-notes
+ resmgr
+ rpm
+ rrdtool
+ rsync
+ ruby
+ sane
+ sane-frontends
+ sash
+ sax2
+ sax2-gui
+ sax2-ident
+ sax2-libsax
+ sax2-libsax-perl
+ sax2-tools
+ scpm
+ screen
+ scsi
+ SDL
+ SDL_image
+ SDL_mixer
+ SDL_net
+ SDL_Pango
+ SDL_perl
+ SDL_ttf
+ sed
+ sensors
+ sgml-skel
+ shared-mime-info
+ sharutils
+ siga
+ smartmontools
+ smpppd
+ spamassassin
+ speex
+ sqlite
+ sqlite2
+ sqlite-zmd
+ startup-notification
+ strace
+ sudo
+ supertux
+ suse-build-key
+ SuSEfirewall2
+ susehelp
+ susehelp_de
+ suseRegister
+ suspend
+ sysconfig
+ sysfsutils
+ syslog-ng
+ sysvinit
+ taglib
+ tar
+ tcl
+ tcpd
+ tcpdump
+ tcsh
+ telnet
+ terminfo
+ tightvnc
+ timezone
+ tk
+ udev
+ ufraw
+ ufraw-gimp
+ ulimit
+ unclutter
+ unzip
+ update-alternatives
+ usbutils
+ utempter
+ util-linux
+ v4l-conf
+ vim
+ w3m
+ wbxml2
+ wdiff
+ wget
+ wireless-tools
+ wodim
+ words
+ wpa_supplicant
+ wv
+ wvdial
+ wvstreams
+ x11-input-synaptics
+ x11-input-wacom
+ x11-tools
+ xaw3d
+ xdg-menu
+ xdg-utils
+ xdmbgrd
+ xfsprogs
+ xgl
+ xgl-hardware-list
+ xine-lib
+ xinetd
+ xkeyboard-config
+ xli
+ xlockmore
+ xmoto
+ xntp
+ xorg-x11
+ xorg-x11-driver-input
+ xorg-x11-driver-video
+ xorg-x11-fonts
+ xorg-x11-fonts-core
+ xorg-x11-libfontenc
+ xorg-x11-libICE
+ xorg-x11-libs
+ xorg-x11-libSM
+ xorg-x11-libX11
+ xorg-x11-libX11-ccache
+ xorg-x11-libXau
+ xorg-x11-libXdmcp
+ xorg-x11-libXext
+ xorg-x11-libXfixes
+ xorg-x11-libxkbfile
+ xorg-x11-libXmu
+ xorg-x11-libXp
+ xorg-x11-libXpm
+ xorg-x11-libXprintUtil
+ xorg-x11-libXrender
+ xorg-x11-libXt
+ xorg-x11-libXv
+ xorg-x11-server
+ xorg-x11-Xvnc
+ xpdf-tools
+ xscreensaver
+ xterm
+ xtermset
+ yast2
+ yast2-apparmor
+ yast2-backup
+ yast2-bluetooth
+ yast2-bootfloppy
+ yast2-bootloader
+ yast2-control-center
+ yast2-core
+ yast2-country
+ yast2-firewall
+ yast2-hardware-detection
+ yast2-inetd
+ yast2-installation
+ yast2-irda
+ yast2-iscsi-client
+ yast2-kerberos-client
+ yast2-ldap
+ yast2-ldap-client
+ yast2-mail
+ yast2-mail-aliases
+ yast2-mouse
+ yast2-ncurses
+ yast2-network
+ yast2-nfs-client
+ yast2-nis-client
+ yast2-ntp-client
+ yast2-online-update
+ yast2-online-update-frontend
+ yast2-packager
+ yast2-pam
+ yast2-perl-bindings
+ yast2-pkg-bindings
+ yast2-power-management
+ yast2-powertweak
+ yast2-printer
+ yast2-profile-manager
+ yast2-qt
+ yast2-registration
+ yast2-repair
+ yast2-restore
+ yast2-runlevel
+ yast2-samba-client
+ yast2-samba-server
+ yast2-scanner
+ yast2-schema
+ yast2-security
+ yast2-slp
+ yast2-sound
+ yast2-storage
+ yast2-storage-evms
+ yast2-storage-lib
+ yast2-sudo
+ yast2-support
+ yast2-sysconfig
+ yast2-theme-openSUSE
+ yast2-trans-de
+ yast2-transfer
+ yast2-trans-stats
+ yast2-tune
+ yast2-tv
+ yast2-update
+ yast2-users
+ yast2-x11
+ yast2-xml
+ ypbind
+ yp-tools
+ zip
+ zisofs-tools
+ zlib
+ zsh
+ zvbi
+ END
+</selection>
+<selection gnome>
+ base = textmode
+ packages = <<END
+ END
+</selection>
+<selection default>
+ base = minimal
+</selection>
diff --git a/src/lib/distro-info/suse-11.0/settings.example b/src/lib/distro-info/suse-11.0/settings.example
new file mode 100644
index 00000000..db996216
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0/settings.example
@@ -0,0 +1,23 @@
+# rename this file to 'settings' and edit it as you please
+#
+# for a list of all options, have a look at the corresponding
+# settings.default in /opt/openslx/share/distro-info
+
+# use local installation source
+#<repository base>
+# local-url = /srv/ftp/pub/opensuse/distribution/11.0/repo/oss
+#</repository>
+#<repository base_non-oss>
+# local-url = /srv/ftp/pub/opensuse/distribution/11.0/repo/non-oss
+#</repository>
+#<repository base_update>
+# local-url = /srv/ftp/pub/suse/update/11.0
+#</repository>
+
+# add a new selection:
+#<selection my_kde>
+# base = kde
+# packages = <<END
+# kinternet
+# END
+#</selection>
diff --git a/src/lib/distro-info/suse-11.0/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc b/src/lib/distro-info/suse-11.0/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc
new file mode 100644
index 00000000..ac75d62a
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc
@@ -0,0 +1,17 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (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/src/lib/distro-info/suse-11.0/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc b/src/lib/distro-info/suse-11.0/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc
new file mode 100644
index 00000000..57a9078a
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc
@@ -0,0 +1,13 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+mIsERCAdXQEEAL7MrBTz+3SBWpCm2ae2yaDqV3ezQcs2JlvqidJVhsZqQe9/jkxi
+KTEQW5+TXF/+BlQSiebunRI7oo3+9U8GyRCgs1sf+yRQWMLzZqRaarzRhw9w+Ihl
+edtqYl6/U2JZCb8Adp6d7RzlRliJdJ/VtsfXj2ef7Dwu7elOVSsmaBdtAAYptChT
+dVNFIFBhY2thZ2UgU2lnbmluZyBLZXkgPGJ1aWxkQHN1c2UuZGU+iLgEEwECACIC
+GwMECwcDAgMVAgMDFgIBAh4BAheABQJIHzCqBQkHwXpNAAoJEOOlw2Awfj1UvWgE
+AIRoxE8S6jQB7S43SVcX06FHJeUJ/m+1ErIj9LwJTYrR/8qsDjTgrttgb+nBHkIj
+NhCCLAuR8sWj3CxsUMH2fayryNnwZEWGqnzo7Jtt4R1Ur3h5pHYonFjfoJyFUZjJ
+7Mhw7/TuOWx20FrzqBi8tbHx8pd7Fa5lCUgopVtMh6GR
+=R56j
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.0/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc b/src/lib/distro-info/suse-11.0/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc
new file mode 100644
index 00000000..80380d2f
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc
@@ -0,0 +1,30 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (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/src/lib/distro-info/suse-11.0/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc b/src/lib/distro-info/suse-11.0/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc
new file mode 100644
index 00000000..74ff59e0
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc
@@ -0,0 +1,20 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+mQGiBER0iroRBADfqUeJmPCXqPJFnf3CVKy40dL1F+gfvP+JHN7/uu4c9+oCYjI1
+uAE8iGTm/Twb/Zzbs4dt0iWjhNFXbRi42rMww4d/8QcPYZ21WSehh+fv8nCjt2sw
+LeC87ar2SR8OTpJBK0fQlcd4e6H5GMntfI6SYEUOPd8m/eQ+4+1AxpUUpwCgswaF
+13fePZGI//pDn5tGjbvmaP8D/R3qum/I+oDS8lbFeeDS10GkEkwTYec13gdfsq6I
+yzIj7VBsC+rGfbipv+VGR61Q4d19pOHKLDekr9OG+3G4ZcYM4NQvQZR+QIlp3xWu
+nBmYD1LRkHLVj+Z4DGQhjjOffkPSuacKPymMaZ/aRiLgTIAo97W2YPhutscXrLSG
+2Y+BA/4jsyaDb7kbW4wc8RtPIcuFEheVqgBeRakP9Uj47kBMBEpPtI/mIdY5liKk
+ztKnuQG6ROYLNV/PW0ZbE1uT64C710weh4cB3PnZLV5P10deDLBjHk8MJQGCTSDD
+JYvhutUzQfshAU6j2kErGvKdZxWGezab34vFyMP2oLGqswPAJrRQTm92ZWxsIFBy
+b3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20pIDxub3ZlbGwt
+cHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6IZgQTEQIAJgIbAwYLCQgHAwIEFQIIAwQW
+AgMBAh4BAheABQJIFkiPBQkHhmvVAAoJEBTCi8l+LjsFn4QAn2wgOHudNubNZvTz
+NdaYJKJ0m2qnAJ9hd0nQBhn28H4Ii4a4h7kpGWRxN4hGBBMRAgAGBQJEexD/AAoJ
+EKhO2uicgArKFLwAn0B+g2mJ5n8LrBziTQ5SjnSPyDBXAJwJoYTta5Sfw/3vVGpU
+fJAKVDoB9w==
+=MWDN
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.0/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc b/src/lib/distro-info/suse-11.0/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc
new file mode 100644
index 00000000..daeef8a5
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc
@@ -0,0 +1,37 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (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
+YWdlIFNpZ25pbmcgS2V5IDxidWlsZEBzdXNlLmRlPohiBBMRAgAiAhsDBAsHAwID
+FQIDAxYCAQIeAQIXgAUCSB80OgUJEfKmuQAKCRCoTtronIAKyuJlAJ0cWZifmBO6
+Eh71jattipdMhUYBTwCfSXbJJtuF3c96JPmpmT8be2LDo86IRgQQEQIABgUCOnBe
+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
+1dbriEwEGBECAAwFAkgfNGYFCRHyptQACgkQqE7a6JyACsrv3ACbBLhafFXmTjH3
+JJWFJGWuIOaZUosAniPs4feEyN46gjXGgcZc2Ai8nkm6
+=mY6G
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.0/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc b/src/lib/distro-info/suse-11.0/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc
new file mode 100644
index 00000000..8467c19b
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc
@@ -0,0 +1,31 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+mQILBERqCJkBEACdqhZWdAbUHLIumXMEgv+GFjr1ZzVHgynnFOzztU/8sxZNa9cm
+YV4HZpVfjMr7fos3ArzyiPPt/336cf7w9p79/ZS4rHSNPDMlPCtXYvFxUbvU0/GY
+q4jwcBsrJ0xaJ9CP5bWyAgVKOb7Y6k0ktaLjRR+tDfMsHA4H0ClMoRr6ATw8NL0e
+VCfAHuzqCKvX1If8ng+wTivtAhKvz/WwQiELNELmPfc5tZHOw8NgP/r0Pze18Hn2
+dlAHu0WpC7uoR00vscsMIJiJJPcsxbL1F1eADKnk+wEy8Go+EJeJ5i0WoFbqD52q
+Lv/C/oY6NVtVY0MBwtn+oQNSnQ4JBsB/Akdt53LAi0ZtNQxMyUW+76R8FCOmVCV8
+WGiF5CPRP0yvG80AMBjBjKjHb/v8ov5MnIyFimzAHS1gQcUNxTEYA/5eFwoYcGcK
+weGq9FUjPTzLQAgvp7XmOzHpSAfJ7qysxFTepNsSZZhgizJyInrdQldr+GYcUNqB
+krD9MWmFop975OxhCTEnNv/HcE79r8WD26HzDFYxTiTJbr0pU/ivBzo+rjq+YG2V
+stJk+udVYmZTnC4LmXus8JiNuqBXbxNscwCBpcJ8YcfCV6uh+7E0XfXZsgVUFLp1
+NF+ylYRGTycOlWoZODrnJevZW7N9O3bWRx/G2P4bJD07LsDLe4i5hymf5QAGKbRQ
+Tm92ZWxsIFByb3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20p
+IDxub3ZlbGwtcHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6JAjMEEwECAB0FAkRqCJkG
+CwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRBHijLooZEiCKSFD/93vZHCAMLEfksU
+KnvXl08bv1rfuamuyJnE3ANRE5RDyypriHMCnkVxazvQ2WI4W4UEjluL9+SzZwtV
+ZvKVoAr31614nSyWwv2YnJTHfjMG+xRlkolZMnuIiB9PcCBo9+GPU0ABuzo4pEJW
+NIRoSS1NFbAZBhtUnY0cN+trM5QObLl7xXTavLyGk//blkk57fov7GXsQJlZUig0
+l2yt5XNyGpLUnTMDumHh8b389quF+0+ZfdwOy7A768xjipAZiTvIujBrEv51wrxh
+0HBT0VGA0MhD9t0B+Ce4BM9P/iVMO00naaOp6PqMfPPKxQQqer8qy1i6UWBx95SY
+mKZBIvOm2d9PezDxkckCu61r6krx1iKnT1wdprCAkIYwALK118SpbxuyGW0bhRHc
+wsc/akzWH72fS0Xu49mvL4k4A2U9asdeQid3dMgbtm5mSWof0yiU/G4YNn0yeXoY
+oG1VbCAqQbFX1Rvd6GITJVqI+ekW/uMA9BP78dF8wBeG0+QmpQnSf+eOsxB/RT8o
+Kb4hHY+29MUlg+i9ceVt7hoKr03J/uIG5TXFXRYLaI0iAFVlKfWxpqDfS2XA4+dD
+VYt+5RDgBcnxDaTB4FE9GqcYScNfe7+NFtL0p0wOPftbmgZzGjucTmrD8mDUNdqA
+xGK7vlk4GATSfOQlq7G6LXW6RYnInohGBBMRAgAGBQJEazMlAAoJEKhO2uicgArK
+2vMAn0TbVDESEVKVuFZStrfIzOvJQrR9AJsH733Ju1kE99GFrdfCeGqpckmNhg==
+=E+qN
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.0/trusted-package-keys/pubring.gpg b/src/lib/distro-info/suse-11.0/trusted-package-keys/pubring.gpg
new file mode 100644
index 00000000..53b38ddc
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0/trusted-package-keys/pubring.gpg
Binary files differ
diff --git a/src/lib/distro-info/suse-11.0_x86_64/mirrors/base b/src/lib/distro-info/suse-11.0_x86_64/mirrors/base
new file mode 100644
index 00000000..229683b3
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0_x86_64/mirrors/base
@@ -0,0 +1,248 @@
+http://opensuse.mirror.ac.za/opensuse/distribution/11.0/repo/oss
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.0/repo/oss
+ftp://opensuse.mirror.ac.za/opensuse/distribution/11.0/repo/oss
+http://www.lizardsource.cn/distribution/11.0/repo/oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.0/repo/oss
+http://mirror.lupaworld.com/opensuse/distribution/11.0/repo/oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.0/repo/oss
+ftp://www.lizardsource.cn/distribution/11.0/repo/oss
+http://mirror.unej.ac.id/opensuse/distribution/11.0/repo/oss
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.0/repo/oss
+http://opensuse.cbn.net.id/distribution/11.0/repo/oss
+http://repo.ugm.ac.id/opensuse/distribution/11.0/repo/oss
+http://dl2.foss-id.web.id/opensuse/distribution/11.0/repo/oss
+http://download.opensuse.or.id/distribution/11.0/repo/oss
+http://mirror.isoc.org.il/pub/opensuse/distribution/11.0/repo/oss
+ftp://mirror.isoc.org.il/opensuse/distribution/11.0/repo/oss
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.0/repo/oss
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.0/repo/oss
+ftp://repo.ugm.ac.id/opensuse/distribution/11.0/repo/oss
+http://ftp.kddilabs.jp/Linux/packages/opensuse/distribution/11.0/repo/oss
+ftp://dl2.foss-id.web.id/repo/opensuse/distribution/11.0/repo/oss
+ftp://mirror.unej.ac.id/opensuse/distribution/11.0/repo/oss
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/distribution/11.0/repo/oss
+http://ftp.riken.jp/Linux/opensuse/distribution/11.0/repo/oss
+ftp://opensuse.cbn.net.id/pub/opensuse/distribution/11.0/repo/oss
+ftp://ftp.riken.jp/Linux/opensuse/distribution/11.0/repo/oss
+http://ftp.daum.net/opensuse/distribution/11.0/repo/oss
+http://77.88.19.68/opensuse/distribution/11.0/repo/oss
+http://mirror.suse.ru/distribution/11.0/repo/oss
+http://77.88.19.73/opensuse/distribution/11.0/repo/oss
+http://77.88.19.74/opensuse/distribution/11.0/repo/oss
+http://93.158.155.193/opensuse/distribution/11.0/repo/oss
+ftp://ftp.kaist.ac.kr/opensuse/distribution/11.0/repo/oss
+ftp://ftp.novell.co.jp/pub/opensuse/distribution/11.0/repo/oss
+ftp://spreader.yandex.net/opensuse/distribution/11.0/repo/oss
+ftp://ftp.chg.ru/pub/opensuse/distribution/11.0/repo/oss
+http://mirror.nus.edu.sg/opensuse/distribution/11.0/repo/oss
+ftp://seeder.yandex.net/opensuse/distribution/11.0/repo/oss
+ftp://dispenser.yandex.net/opensuse/distribution/11.0/repo/oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.0/repo/oss
+http://ftp.isu.edu.tw/pub/Linux/opensuse/distribution/11.0/repo/oss
+ftp://allotter.yandex.net/opensuse/distribution/11.0/repo/oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.0/repo/oss
+http://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.0/repo/oss
+ftp://ftp.metu.edu.tr/opensuse/distribution/11.0/repo/oss
+ftp://ftp.isu.edu.tw/pub/Linux/OpenSuSE/distribution/11.0/repo/oss
+ftp://mirror.in.th/opensuse/distribution/11.0/repo/oss
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.0/repo/oss
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.0/repo/oss
+http://ftp.twaren.net/Linux/OpenSuSE/distribution/11.0/repo/oss
+http://ftp.chg.ru/pub/opensuse/distribution/11.0/repo/oss
+http://mirror-fpt-telecom.fpt.net/opensuse/distribution/11.0/repo/oss
+http://suse.inode.at/opensuse/distribution/11.0/repo/oss
+http://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.0/repo/oss
+http://ftp.tugraz.at/mirror/opensuse/distribution/11.0/repo/oss
+ftp://ftp.tugraz.at/mirror/opensuse/distribution/11.0/repo/oss
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.0/repo/oss
+ftp://suse.inode.at/opensuse/distribution/11.0/repo/oss
+http://suse.lagis.at/opensuse/distribution/11.0/repo/oss
+http://mirror.opensuse.com.ba/opensuse/distribution/11.0/repo/oss
+ftp://ftp.twaren.net/Linux/OpenSuSE/distribution/11.0/repo/oss
+http://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.0/repo/oss
+ftp://suse.lagis.at/opensuse/distribution/11.0/repo/oss
+http://mirror.karneval.cz/pub/linux/opensuse/distribution/11.0/repo/oss
+http://mirrors.netbg.com/opensuse/distribution/11.0/repo/oss
+ftp://mirrors.netbg.com/opensuse/distribution/11.0/repo/oss
+http://mirror.switch.ch/ftp/mirror/opensuse/distribution/11.0/repo/oss
+ftp://mirror.switch.ch/mirror/opensuse/distribution/11.0/repo/oss
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.0/repo/oss
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.0/repo/oss
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.0/repo/oss
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.0/repo/oss
+ftp://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.0/repo/oss
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.0/repo/oss
+http://ftp.linux.cz/pub/linux/opensuse/distribution/11.0/repo/oss
+http://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.0/repo/oss
+ftp://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.0/repo/oss
+http://ftp5.gwdg.de/pub/opensuse/distribution/11.0/repo/oss
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/distribution/11.0/repo/oss
+http://download.uni-hd.de/ftp/pub/linux/opensuse/distribution/11.0/repo/oss
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/distribution/11.0/repo/oss
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.0/repo/oss
+ftp://ftp5.gwdg.de/pub/opensuse/distribution/11.0/repo/oss
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.0/repo/oss
+http://opensuse.intergenia.de/distribution/11.0/repo/oss
+http://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.0/repo/oss
+ftp://mirror.karneval.cz/pub/linux/opensuse/distribution/11.0/repo/oss
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/distribution/11.0/repo/oss
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.0/repo/oss
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.0/repo/oss
+ftp://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.0/repo/oss
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.0/repo/oss
+http://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.0/repo/oss
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/distribution/11.0/repo/oss
+http://ftp3.gwdg.de/pub/opensuse/distribution/11.0/repo/oss
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.0/repo/oss
+http://widehat.opensuse.org/distribution/11.0/repo/oss
+http://ftp4.gwdg.de/pub/opensuse/distribution/11.0/repo/oss
+ftp://ftp4.gwdg.de/pub/opensuse/distribution/11.0/repo/oss
+http://ftp.uni-kassel.de/opensuse/distribution/11.0/repo/oss
+ftp://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.0/repo/oss
+ftp://ftp3.gwdg.de/pub/opensuse/distribution/11.0/repo/oss
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.0/repo/oss
+http://ftp.uni-bayreuth.de/linux/opensuse/distribution/11.0/repo/oss
+http://opensuse-linuxmigratio.at/distribution/11.0/repo/oss
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/distribution/11.0/repo/oss
+http://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.0/repo/oss
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.0/repo/oss
+http://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.0/repo/oss
+http://ftp.uni-siegen.de/opensuse/distribution/11.0/repo/oss
+ftp://ftp.uni-bayreuth.de/linux/opensuse/distribution/11.0/repo/oss
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.0/repo/oss
+http://ftp.estpak.ee/pub/suse/opensuse/distribution/11.0/repo/oss
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.0/repo/oss
+http://ftp.klid.dk/ftp/opensuse/distribution/11.0/repo/oss
+http://ftp.gui.uva.es/sites/opensuse.org/distribution/11.0/repo/oss
+ftp://ftp.uni-siegen.de/pub/opensuse/distribution/11.0/repo/oss
+ftp://ftp.rediris.es/pub/mirror/opensuse/distribution/11.0/repo/oss
+http://suse.bifi.unizar.es/opensuse/distribution/11.0/repo/oss
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.0/repo/oss
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.0/repo/oss
+http://opensuse.mirrors.proxad.net/opensuse/distribution/11.0/repo/oss
+ftp://ftp.gui.uva.es/sites/opensuse.org/distribution/11.0/repo/oss
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/distribution/11.0/repo/oss
+http://mirror.ovh.net/opensuse/distribution/11.0/repo/oss
+http://fr2.rpmfind.net/linux/opensuse/distribution/11.0/repo/oss
+ftp://mirror.ovh.net/opensuse/distribution/11.0/repo/oss
+http://ftp.rediris.es/pub/mirror/opensuse/distribution/11.0/repo/oss
+http://opensuse.cict.fr/distribution/11.0/repo/oss
+ftp://ftp.klid.dk/opensuse/distribution/11.0/repo/oss
+ftp://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.0/repo/oss
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.0/repo/oss
+ftp://fr2.rpmfind.net/linux/opensuse/distribution/11.0/repo/oss
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.0/repo/oss
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/distribution/11.0/repo/oss
+ftp://mirror.cict.fr/opensuse/distribution/11.0/repo/oss
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/distribution/11.0/repo/oss
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.0/repo/oss
+http://ftp.ntua.gr/pub/linux/opensuse/distribution/11.0/repo/oss
+ftp://ftp.ntua.gr/pub/linux/opensusedistribution/11.0/repo/oss
+http://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.0/repo/oss
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.0/repo/oss
+http://roxen.integrity.hu/pub/opensuse/distribution/11.0/repo/oss
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.0/repo/oss
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.0/repo/oss
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.0/repo/oss
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.0/repo/oss
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.0/repo/oss
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.0/repo/oss
+http://rm.mirror.garr.it/mirrors/opensuse/distribution/11.0/repo/oss
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.0/repo/oss
+http://repo1.linux.edu.lv/distribution/11.0/repo/oss
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.0/repo/oss
+ftp://repo1.linux.edu.lv/distribution/11.0/repo/oss
+http://mirror.leaseweb.com/opensuse/distribution/11.0/repo/oss
+http://mirrors.nl.eu.kernel.org/opensuse/distribution/11.0/repo/oss
+ftp://mirrors.nl.eu.kernel.org/opensuse/distribution/11.0/repo/oss
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/distribution/11.0/repo/oss
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.0/repo/oss
+ftp://mirror.leaseweb.com/opensuse/distribution/11.0/repo/oss
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/distribution/11.0/repo/oss
+ftp://rm.mirror.garr.it/mirrors/opensusedistribution/11.0/repo/oss
+http://opensuse.hro.nl/opensuse/distribution/11.0/repo/oss
+ftp://opensuse.hro.nl/opensuse/distribution/11.0/repo/oss
+http://opensuse.uib.no/distribution/11.0/repo/oss
+http://ftp.uninett.no/pub/linux/opensuse/distribution/11.0/repo/oss
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.0/repo/oss
+ftp://ftp.uninett.no/pub/linux/opensuse/distribution/11.0/repo/oss
+http://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.0/repo/oss
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/distribution/11.0/repo/oss
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.0/repo/oss
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.0/repo/oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.0/repo/oss
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.0/repo/oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.0/repo/oss
+http://ftp.sileman.pl/pub/opensuse/distribution/11.0/repo/oss
+ftp://ftp.sileman.pl/pub/opensuse/distribution/11.0/repo/oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.0/repo/oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.0/repo/oss
+http://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.0/repo/oss
+http://ftp.gts.lug.ro/opensuse/distribution/11.0/repo/oss
+ftp://ftp.gts.lug.ro/opensuse/distribution/11.0/repo/oss
+http://ftp.ines.lug.ro/opensuse/distribution/11.0/repo/oss
+ftp://cesium.di.uminho.pt/pub/opensuse/distribution/11.0/repo/oss
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.0/repo/oss
+ftp://ftp.ines.lug.ro/opensuse/distribution/11.0/repo/oss
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.0/repo/oss
+http://cesium.di.uminho.pt/pub/opensuse/distribution/11.0/repo/oss
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.0/repo/oss
+http://mirrors.se.eu.kernel.org/opensuse/distribution/11.0/repo/oss
+http://ftp.df.lth.se/pub/opensuse/distribution/11.0/repo/oss
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.0/repo/oss
+http://opensuse.ynet.sk/distribution/11.0/repo/oss
+http://less.cogeco.net/ftp/openSUSE/distribution/11.0/repo/oss
+ftp://ftp.df.lth.se/pub/opensusedistribution/11.0/repo/oss
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.0/repo/oss
+http://www.muug.mb.ca/pub/opensuse/distribution/11.0/repo/oss
+http://linux.dell.com/repo/community/distribution/11.0/repo/oss
+http://ftp.osuosl.org/pub/opensuse/distribution/11.0/repo/oss
+ftp://mirrors.se.eu.kernel.org/opensuse/distribution/11.0/repo/oss
+ftp://less.cogeco.net/openSUSE/distribution/11.0/repo/oss
+http://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.0/repo/oss
+ftp://ftp.osuosl.org/pub/opensuse/distribution/11.0/repo/oss
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.0/repo/oss
+http://suse.mirrors.tds.net/pub/opensuse/distribution/11.0/repo/oss
+http://mirrors.med.harvard.edu/opensuse/distribution/11.0/repo/oss
+http://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.0/repo/oss
+ftp://www.muug.mb.ca/pub/opensuse/distribution/11.0/repo/oss
+http://mirror.umoss.org/opensuse/distribution/11.0/repo/oss
+http://opensuse.cs.utah.edu/distribution/11.0/repo/oss
+ftp://suse.mirrors.tds.net/pub/opensuse/distribution/11.0/repo/oss
+http://opensuse.ca.unixheads.org/distribution/11.0/repo/oss
+http://mirrors.xmission.com/opensuse/distribution/11.0/repo/oss
+ftp://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.0/repo/oss
+http://mirrors2.kernel.org/opensuse/distribution/11.0/repo/oss
+http://mirrors1.kernel.org/opensuse/distribution/11.0/repo/oss
+ftp://opensuse.cs.utah.edu/pub/opensuse/distribution/11.0/repo/oss
+ftp://mirrors2.kernel.org/opensuse/distribution/11.0/repo/oss
+http://mirror.rackspace.com/openSUSE/distribution/11.0/repo/oss
+ftp://mirrors.xmission.com/opensuse/distribution/11.0/repo/oss
+http://130.57.19.201/distribution/11.0/repo/oss
+http://ftp.utexas.edu/opensuse/distribution/11.0/repo/oss
+ftp://mirror.rackspace.com/openSUSE/distribution/11.0/repo/oss
+ftp://130.57.19.201/pub/opensuse/distribution/11.0/repo/oss
+http://www.gtlib.gatech.edu/pub/opensuse/distribution/11.0/repo/oss
+ftp://mirrors1.kernel.org/opensuse/distribution/11.0/repo/oss
+http://ftp.ussg.iu.edu/linux/opensuse/distribution/11.0/repo/oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.0/repo/oss
+ftp://www.gtlib.gatech.edu/pub/opensuse/distribution/11.0/repo/oss
+ftp://ftp.utexas.edu/mirrors/opensuse/distribution/11.0/repo/oss
+http://mirror.cps.cmich.edu/opensuse/opensuse/distribution/11.0/repo/oss
+http://mirror.nyi.net/opensuse/distribution/11.0/repo/oss
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/distribution/11.0/repo/oss
+http://mirrors.rit.edu/opensuse/distribution/11.0/repo/oss
+ftp://mirror.nyi.net/opensusedistribution/11.0/repo/oss
+http://ftp.iinet.net.au/pub/opensuse/distribution/11.0/repo/oss
+http://mirror.internode.on.net/pub/opensuse/distribution/11.0/repo/oss
+ftp://ftp.iinet.net.au/pub/opensuse/distribution/11.0/repo/oss
+http://mirror.pacific.net.au/linux/opensuse/distribution/11.0/repo/oss
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.0/repo/oss
+http://opensuse.patan.com.ar/distribution/11.0/repo/oss
+http://opensuse.c3sl.ufpr.br/distribution/11.0/repo/oss
+http://200.221.9.37/pub/opensuse/distribution/11.0/repo/oss
+ftp://mirror.internode.on.net/pub/opensuse/distribution/11.0/repo/oss
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.0/repo/oss
+http://opensuse.pop.com.br/distribution/11.0/repo/oss
+ftp://opensuse.c3sl.ufpr.br/opensuse/distribution/11.0/repo/oss
+ftp://mirror.pacific.net.au/linux/opensuse/distribution/11.0/repo/oss
diff --git a/src/lib/distro-info/suse-11.0_x86_64/mirrors/base_non-oss b/src/lib/distro-info/suse-11.0_x86_64/mirrors/base_non-oss
new file mode 100644
index 00000000..1e318801
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0_x86_64/mirrors/base_non-oss
@@ -0,0 +1,240 @@
+http://opensuse.mirror.ac.za/opensuse/distribution/11.0/repo/non-oss
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.0/repo/non-oss
+http://mirror.lupaworld.com/opensuse/distribution/11.0/repo/non-oss
+http://www.lizardsource.cn/distribution/11.0/repo/non-oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.0/repo/non-oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.0/repo/non-oss
+http://download.opensuse.or.id/distribution/11.0/repo/non-oss
+http://opensuse.cbn.net.id/distribution/11.0/repo/non-oss
+http://repo.ugm.ac.id/opensuse/distribution/11.0/repo/non-oss
+http://mirror.unej.ac.id/opensuse/distribution/11.0/repo/non-oss
+http://dl2.foss-id.web.id/opensuse/distribution/11.0/repo/non-oss
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.0/repo/non-oss
+ftp://www.lizardsource.cn/distribution/11.0/repo/non-oss
+ftp://opensuse.mirror.ac.za/opensuse/distribution/11.0/repo/non-oss
+http://ftp.kddilabs.jp/Linux/packages/opensuse/distribution/11.0/repo/non-oss
+ftp://dl2.foss-id.web.id/repo/opensuse/distribution/11.0/repo/non-oss
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/distribution/11.0/repo/non-oss
+http://ftp.novell.co.jp/pub/opensuse/distribution/11.0/repo/non-oss
+http://ftp.riken.jp/Linux/opensuse/distribution/11.0/repo/non-oss
+ftp://mirror.unej.ac.id/opensuse/distribution/11.0/repo/non-oss
+ftp://repo.ugm.ac.id/opensuse/distribution/11.0/repo/non-oss
+http://mirror.isoc.org.il/pub/opensuse/distribution/11.0/repo/non-oss
+http://ftp.daum.net/opensuse/distribution/11.0/repo/non-oss
+http://77.88.19.68/opensuse/distribution/11.0/repo/non-oss
+http://mirror.suse.ru/distribution/11.0/repo/non-oss
+http://77.88.19.73/opensuse/distribution/11.0/repo/non-oss
+http://77.88.19.74/opensuse/distribution/11.0/repo/non-oss
+ftp://mirror.isoc.org.il/opensuse/distribution/11.0/repo/non-oss
+http://93.158.155.193/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.kaist.ac.kr/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.riken.jp/Linux/opensuse/distribution/11.0/repo/non-oss
+ftp://seeder.yandex.net/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.0/repo/non-oss
+ftp://dispenser.yandex.net/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.novell.co.jp/pub/opensuse/distribution/11.0/repo/non-oss
+http://mirror.nus.edu.sg/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.chg.ru/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://allotter.yandex.net/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.metu.edu.tr/opensuse/distribution/11.0/repo/non-oss
+ftp://mirror.in.th/opensuse/distribution/11.0/repo/non-oss
+http://ftp.isu.edu.tw/pub/Linux/opensuse/distribution/11.0/repo/non-oss
+http://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.0/repo/non-oss
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.0/repo/non-oss
+ftp://ftp.isu.edu.tw/pub/Linux/OpenSuSE/distribution/11.0/repo/non-oss
+http://ftp.twaren.net/Linux/OpenSuSE/distribution/11.0/repo/non-oss
+http://ftp.chg.ru/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.0/repo/non-oss
+http://suse.inode.at/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.twaren.net/Linux/OpenSuSE/distribution/11.0/repo/non-oss
+ftp://suse.inode.at/opensuse/distribution/11.0/repo/non-oss
+ftp://suse.lagis.at/opensuse/distribution/11.0/repo/non-oss
+http://mirror.opensuse.com.ba/opensuse/distribution/11.0/repo/non-oss
+http://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.0/repo/non-oss
+http://suse.lagis.at/opensuse/distribution/11.0/repo/non-oss
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.0/repo/non-oss
+http://ftp.tugraz.at/mirror/opensuse/distribution/11.0/repo/non-oss
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.0/repo/non-oss
+http://mirrors.netbg.com/opensuse/distribution/11.0/repo/non-oss
+http://mirror.switch.ch/ftp/mirror/opensuse/distribution/11.0/repo/non-oss
+ftp://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.0/repo/non-oss
+ftp://mirror.switch.ch/mirror/opensuse/distribution/11.0/repo/non-oss
+http://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.0/repo/non-oss
+http://mirror.karneval.cz/pub/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.tugraz.at/mirror/opensuse/distribution/11.0/repo/non-oss
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.0/repo/non-oss
+ftp://mirrors.netbg.com/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.0/repo/non-oss
+http://ftp.linux.cz/pub/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://mirror.karneval.cz/pub/linux/opensuse/distribution/11.0/repo/non-oss
+http://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.0/repo/non-oss
+http://ftp5.gwdg.de/pub/opensuse/distribution/11.0/repo/non-oss
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/distribution/11.0/repo/non-oss
+http://download.uni-hd.de/ftp/pub/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/distribution/11.0/repo/non-oss
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp5.gwdg.de/pub/opensuse/distribution/11.0/repo/non-oss
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/distribution/11.0/repo/non-oss
+http://opensuse.intergenia.de/distribution/11.0/repo/non-oss
+http://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.0/repo/non-oss
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.0/repo/non-oss
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/distribution/11.0/repo/non-oss
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.0/repo/non-oss
+http://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.0/repo/non-oss
+http://ftp3.gwdg.de/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.0/repo/non-oss
+http://widehat.opensuse.org/distribution/11.0/repo/non-oss
+http://ftp4.gwdg.de/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.0/repo/non-oss
+http://ftp.uni-kassel.de/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/distribution/11.0/repo/non-oss
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.0/repo/non-oss
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp4.gwdg.de/pub/opensuse/distribution/11.0/repo/non-oss
+http://opensuse-linuxmigratio.at/distribution/11.0/repo/non-oss
+http://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp3.gwdg.de/pub/opensuse/distribution/11.0/repo/non-oss
+http://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.0/repo/non-oss
+http://ftp.uni-siegen.de/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.klid.dk/opensuse/distribution/11.0/repo/non-oss
+http://ftp.estpak.ee/pub/suse/opensuse/distribution/11.0/repo/non-oss
+http://ftp.klid.dk/ftp/opensuse/distribution/11.0/repo/non-oss
+http://ftp.rediris.es/pub/mirror/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.0/repo/non-oss
+http://suse.bifi.unizar.es/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.uni-bayreuth.de/linux/opensuse/distribution/11.0/repo/non-oss
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.0/repo/non-oss
+http://ftp.gui.uva.es/sites/opensuse.org/distribution/11.0/repo/non-oss
+ftp://ftp.uni-siegen.de/pub/opensuse/distribution/11.0/repo/non-oss
+http://opensuse.mirrors.proxad.net/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.rediris.es/pub/mirror/opensuse/distribution/11.0/repo/non-oss
+http://mirror.ovh.net/opensuse/distribution/11.0/repo/non-oss
+http://fr2.rpmfind.net/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://mirror.ovh.net/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.0/repo/non-oss
+http://opensuse.cict.fr/distribution/11.0/repo/non-oss
+http://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.0/repo/non-oss
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.gui.uva.es/sites/opensuse.org/distribution/11.0/repo/non-oss
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/distribution/11.0/repo/non-oss
+ftp://mirror.cict.fr/opensuse/distribution/11.0/repo/non-oss
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.0/repo/non-oss
+ftp://fr2.rpmfind.net/linux/opensuse/distribution/11.0/repo/non-oss
+http://ftp.ntua.gr/pub/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.ntua.gr/pub/linux/opensusedistribution/11.0/repo/non-oss
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.0/repo/non-oss
+ftp://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.0/repo/non-oss
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.0/repo/non-oss
+http://roxen.integrity.hu/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.0/repo/non-oss
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/distribution/11.0/repo/non-oss
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.0/repo/non-oss
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/distribution/11.0/repo/non-oss
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.0/repo/non-oss
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.0/repo/non-oss
+http://rm.mirror.garr.it/mirrors/opensuse/distribution/11.0/repo/non-oss
+ftp://rm.mirror.garr.it/mirrors/opensusedistribution/11.0/repo/non-oss
+http://repo1.linux.edu.lv/distribution/11.0/repo/non-oss
+http://mirror.leaseweb.com/opensuse/distribution/11.0/repo/non-oss
+ftp://mirror.leaseweb.com/opensuse/distribution/11.0/repo/non-oss
+http://mirrors.nl.eu.kernel.org/opensuse/distribution/11.0/repo/non-oss
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/distribution/11.0/repo/non-oss
+ftp://repo1.linux.edu.lv/distribution/11.0/repo/non-oss
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/distribution/11.0/repo/non-oss
+http://opensuse.hro.nl/opensuse/distribution/11.0/repo/non-oss
+http://opensuse.uib.no/distribution/11.0/repo/non-oss
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/distribution/11.0/repo/non-oss
+http://ftp.uninett.no/pub/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.0/repo/non-oss
+http://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.0/repo/non-oss
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.0/repo/non-oss
+ftp://mirrors.nl.eu.kernel.org/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.0/repo/non-oss
+http://ftp.sileman.pl/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.0/repo/non-oss
+ftp://opensuse.hro.nl/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://cesium.di.uminho.pt/pub/opensuse/distribution/11.0/repo/non-oss
+http://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.gts.lug.ro/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.uninett.no/pub/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.sileman.pl/pub/opensuse/distribution/11.0/repo/non-oss
+http://ftp.gts.lug.ro/opensuse/distribution/11.0/repo/non-oss
+http://ftp.ines.lug.ro/opensuse/distribution/11.0/repo/non-oss
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.0/repo/non-oss
+http://cesium.di.uminho.pt/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.0/repo/non-oss
+http://mirrors.se.eu.kernel.org/opensuse/distribution/11.0/repo/non-oss
+ftp://mirrors.se.eu.kernel.org/opensuse/distribution/11.0/repo/non-oss
+http://ftp.df.lth.se/pub/opensuse/distribution/11.0/repo/non-oss
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.ines.lug.ro/opensuse/distribution/11.0/repo/non-oss
+http://opensuse.ynet.sk/distribution/11.0/repo/non-oss
+http://less.cogeco.net/ftp/openSUSE/distribution/11.0/repo/non-oss
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.0/repo/non-oss
+http://www.muug.mb.ca/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.0/repo/non-oss
+ftp://ftp.df.lth.se/pub/opensusedistribution/11.0/repo/non-oss
+http://ftp.osuosl.org/pub/opensuse/distribution/11.0/repo/non-oss
+http://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.0/repo/non-oss
+http://linux.dell.com/repo/community/distribution/11.0/repo/non-oss
+http://suse.mirrors.tds.net/pub/opensuse/distribution/11.0/repo/non-oss
+http://mirrors.med.harvard.edu/opensuse/distribution/11.0/repo/non-oss
+http://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.0/repo/non-oss
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.0/repo/non-oss
+http://mirror.umoss.org/opensuse/distribution/11.0/repo/non-oss
+http://opensuse.cs.utah.edu/distribution/11.0/repo/non-oss
+ftp://ftp.osuosl.org/pub/opensuse/distribution/11.0/repo/non-oss
+http://opensuse.ca.unixheads.org/distribution/11.0/repo/non-oss
+http://mirrors.xmission.com/opensuse/distribution/11.0/repo/non-oss
+ftp://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.0/repo/non-oss
+http://mirrors2.kernel.org/opensuse/distribution/11.0/repo/non-oss
+ftp://mirrors.xmission.com/opensuse/distribution/11.0/repo/non-oss
+ftp://suse.mirrors.tds.net/pub/opensuse/distribution/11.0/repo/non-oss
+http://mirrors1.kernel.org/opensuse/distribution/11.0/repo/non-oss
+ftp://opensuse.cs.utah.edu/pub/opensuse/distribution/11.0/repo/non-oss
+http://mirror.rackspace.com/openSUSE/distribution/11.0/repo/non-oss
+ftp://mirrors1.kernel.org/opensuse/distribution/11.0/repo/non-oss
+http://130.57.19.201/distribution/11.0/repo/non-oss
+http://ftp.utexas.edu/opensuse/distribution/11.0/repo/non-oss
+ftp://mirror.rackspace.com/openSUSE/distribution/11.0/repo/non-oss
+ftp://130.57.19.201/pub/opensuse/distribution/11.0/repo/non-oss
+http://ftp.ussg.iu.edu/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://mirrors2.kernel.org/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.utexas.edu/mirrors/opensuse/distribution/11.0/repo/non-oss
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/distribution/11.0/repo/non-oss
+http://www.gtlib.gatech.edu/pub/opensuse/distribution/11.0/repo/non-oss
+http://mirror.cps.cmich.edu/opensuse/opensuse/distribution/11.0/repo/non-oss
+http://mirrors.rit.edu/opensuse/distribution/11.0/repo/non-oss
+ftp://mirror.nyi.net/opensusedistribution/11.0/repo/non-oss
+http://ftp.iinet.net.au/pub/opensuse/distribution/11.0/repo/non-oss
+http://mirror.internode.on.net/pub/opensuse/distribution/11.0/repo/non-oss
+http://mirror.nyi.net/opensuse/distribution/11.0/repo/non-oss
+http://mirror.pacific.net.au/linux/opensuse/distribution/11.0/repo/non-oss
+ftp://ftp.iinet.net.au/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://mirror.internode.on.net/pub/opensuse/distribution/11.0/repo/non-oss
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.0/repo/non-oss
+ftp://mirror.pacific.net.au/linux/opensuse/distribution/11.0/repo/non-oss
+http://opensuse.patan.com.ar/distribution/11.0/repo/non-oss
+http://200.221.9.37/pub/opensuse/distribution/11.0/repo/non-oss
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.0/repo/non-oss
+http://opensuse.c3sl.ufpr.br/distribution/11.0/repo/non-oss
+ftp://opensuse.c3sl.ufpr.br/opensuse/distribution/11.0/repo/non-oss
+http://opensuse.pop.com.br/distribution/11.0/repo/non-oss
diff --git a/src/lib/distro-info/suse-11.0_x86_64/mirrors/base_update b/src/lib/distro-info/suse-11.0_x86_64/mirrors/base_update
new file mode 100644
index 00000000..40e25e81
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0_x86_64/mirrors/base_update
@@ -0,0 +1,246 @@
+http://opensuse.mirror.ac.za/opensuse/update/11.0
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/update/11.0
+http://mirror.lupaworld.com/opensuse/update/11.0
+ftp://www.lizardsource.cn/update/11.0
+http://www.lizardsource.cn/update/11.0
+http://mirror.alva.ge/pub/opensuse/update/11.0
+http://mirror.alva.ge/pub/opensuse/update/11.0
+http://download.opensuse.or.id/update/11.0
+http://mirror.unej.ac.id/opensuse/update/11.0
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/update/11.0
+http://opensuse.cbn.net.id/update/11.0
+http://repo.ugm.ac.id/opensuse/update/11.0
+http://dl2.foss-id.web.id/opensuse/update/11.0
+ftp://repo.ugm.ac.id/opensuse/update/11.0
+ftp://opensuse.cbn.net.id/pub/opensuse/update/11.0
+ftp://opensuse.mirror.ac.za/opensuse/update/11.0
+http://mirror.isoc.org.il/pub/opensuse/update/11.0
+ftp://dl2.foss-id.web.id/repo/opensuse/update/11.0
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/update/11.0
+http://ftp.kddilabs.jp/Linux/packages/opensuse/update/11.0
+ftp://mirror.unej.ac.id/opensuse/update/11.0
+ftp://mirror.isoc.org.il/opensuse/update/11.0
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/update/11.0
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/update/11.0
+http://ftp.riken.jp/Linux/opensuse/update/11.0
+ftp://ftp.kddilabs.jp/Linux/packages/opensuseupdate/11.0
+ftp://ftp.novell.co.jp/pub/opensuse/update/11.0
+http://ftp.daum.net/opensuse/update/11.0
+http://mirror.suse.ru/update/11.0
+http://77.88.19.68/opensuse/update/11.0
+http://77.88.19.73/opensuse/update/11.0
+ftp://ftp.riken.jp/Linux/opensuse/update/11.0
+http://77.88.19.74/opensuse/update/11.0
+http://93.158.155.193/opensuse/update/11.0
+ftp://dispenser.yandex.net/opensuse/update/11.0
+ftp://ftp.chg.ru/pub/opensuse/update/11.0
+ftp://allotter.yandex.net/opensuse/update/11.0
+http://mirror.nus.edu.sg/opensuse/update/11.0
+ftp://seeder.yandex.net/opensuse/update/11.0
+ftp://ftp.kaist.ac.kr/opensuse/update/11.0
+ftp://spreader.yandex.net/opensuse/update/11.0
+ftp://ftp.metu.edu.tr/opensuse/update/11.0
+ftp://mirror.in.th/opensuse/update/11.0
+ftp://ftp.suntel.com.tr/pub/opensuse/update/11.0
+ftp://ftp.suntel.com.tr/pub/opensuse/update/11.0
+http://ftp.isu.edu.tw/pub/Linux/opensuse/update/11.0
+http://ftp.ncnu.edu.tw/Linux/opensuse/update/11.0
+ftp://ftp.isu.edu.tw/pub/Linux/OpenSuSE/update/11.0
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/update/11.0
+http://ftp.chg.ru/pub/opensuse/update/11.0
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/update/11.0
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/update/11.0
+http://mirror-fpt-telecom.fpt.net/opensuse/update/11.0
+http://ftp.twaren.net/Linux/OpenSuSE/update/11.0
+ftp://ftp.twaren.net/Linux/OpenSuSE/update/11.0
+http://suse.inode.at/opensuse/update/11.0
+ftp://suse.inode.at/opensuse/update/11.0
+http://gd.tuwien.ac.at/opsys/linux/opensuse/update/11.0
+ftp://suse.lagis.at/opensuse/update/11.0
+http://ftp.tugraz.at/mirror/opensuse/update/11.0
+http://suse.lagis.at/opensuse/update/11.0
+http://mirror.opensuse.com.ba/opensuse/update/11.0
+http://ftp.belnet.be/mirror/ftp.opensuse.org/update/11.0
+http://mirrors.netbg.com/opensuse/update/11.0
+ftp://ftp.tugraz.at/mirror/opensuse/update/11.0
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/update/11.0
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/update/11.0
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/update/11.0
+http://mirror.switch.ch/ftp/mirror/opensuse/update/11.0
+ftp://mirror.switch.ch/mirror/opensuse/update/11.0
+http://mirror.karneval.cz/pub/linux/opensuse/update/11.0
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/update/11.0
+ftp://mirrors.netbg.com/opensuse/update/11.0
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/update/11.0
+http://ftp.linux.cz/pub/linux/opensuse/update/11.0
+ftp://mirror.karneval.cz/pub/linux/opensuse/update/11.0
+http://ftp.halifax.rwth-aachen.de/opensuse/update/11.0
+http://ftp5.gwdg.de/pub/opensuse/update/11.0
+ftp://ftp.halifax.rwth-aachen.de/opensuse/update/11.0
+http://download.uni-hd.de/ftp/pub/linux/opensuse/update/11.0
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/update/11.0
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/update/11.0
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/update/11.0
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/update/11.0
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/update/11.0
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/update/11.0
+http://opensuse.intergenia.de/update/11.0
+http://ftp.uni-ulm.de/mirrors/opensuse/update/11.0
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/update/11.0
+ftp://ftp5.gwdg.de/pub/opensuse/update/11.0
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/update/11.0
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/update/11.0
+http://ftp.uni-kl.de/pub/linux/opensuse/update/11.0
+http://ftp3.gwdg.de/pub/opensuse/update/11.0
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/update/11.0
+ftp://ftp.uni-ulm.de/mirrors/opensuse/update/11.0
+http://widehat.opensuse.org/update/11.0
+http://ftp4.gwdg.de/pub/opensuse/update/11.0
+http://ftp.uni-kassel.de/opensuse/update/11.0
+http://ftp.tu-ilmenau.de/mirror/opensuse/update/11.0
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/update/11.0
+ftp://ftp4.gwdg.de/pub/opensuse/update/11.0
+ftp://ftp.uni-kl.de/pub/linux/opensuse/update/11.0
+http://opensuse-linuxmigratio.at/update/11.0
+http://ftp.uni-bayreuth.de/linux/opensuse/update/11.0
+ftp://ftp3.gwdg.de/pub/opensuse/update/11.0
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/update/11.0
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/update/11.0
+http://ftp.uni-paderborn.de/pub/linux/opensuse/update/11.0
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/update/11.0
+http://ftp.uni-siegen.de/opensuse/update/11.0
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/update/11.0
+http://ftp.klid.dk/ftp/opensuse/update/11.0
+http://ftp.estpak.ee/pub/suse/opensuse/update/11.0
+ftp://ftp.uni-bayreuth.de/linux/opensuse/update/11.0
+ftp://ftp.uni-siegen.de/pub/opensuse/update/11.0
+ftp://ftp.gui.uva.es/sites/opensuse.org/update/11.0
+http://ftp.rediris.es/pub/mirror/opensuse/update/11.0
+http://suse.bifi.unizar.es/opensuse/update/11.0
+http://ftp.gui.uva.es/sites/opensuse.org/update/11.0
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/update/11.0
+http://opensuse.mirrors.proxad.net/opensuse/update/11.0
+ftp://ftp.klid.dk/opensuse/update/11.0
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/update/11.0
+http://mirror.ovh.net/opensuse/update/11.0
+http://fr2.rpmfind.net/linux/opensuse/update/11.0
+http://opensuse.cict.fr/update/11.0
+ftp://mirror.cict.fr/opensuse/update/11.0
+http://www.mirrorservice.org/sites/download.opensuse.org/update/11.0
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/update/11.0
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/update/11.0
+ftp://mirror.ovh.net/opensuse/update/11.0
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/update/11.0
+ftp://ftp.rediris.es/pub/mirror/opensuse/update/11.0
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/update/11.0
+ftp://fr2.rpmfind.net/linux/opensuse/update/11.0
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/update/11.0
+http://ftp.ntua.gr/pub/linux/opensuse/update/11.0
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/update/11.0
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/update/11.0
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/update/11.0
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/update/11.0
+http://roxen.integrity.hu/pub/opensuse/update/11.0
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/update/11.0
+ftp://ftp.ntua.gr/pub/linux/opensuseupdate/11.0
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/update/11.0
+http://rm.mirror.garr.it/mirrors/opensuse/update/11.0
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/update/11.0
+http://repo1.linux.edu.lv/update/11.0
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/update/11.0
+http://mirror.leaseweb.com/opensuse/update/11.0
+ftp://mirror.leaseweb.com/opensuse/update/11.0
+http://mirrors.nl.eu.kernel.org/opensuse/update/11.0
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/update/11.0
+ftp://repo1.linux.edu.lv/update/11.0
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/update/11.0
+http://opensuse.hro.nl/opensuse/update/11.0
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/update/11.0
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/update/11.0
+http://opensuse.uib.no/update/11.0
+ftp://rm.mirror.garr.it/mirrors/opensuseupdate/11.0
+http://ftp.uninett.no/pub/linux/opensuse/update/11.0
+ftp://mirrors.nl.eu.kernel.org/opensuse/update/11.0
+http://ftp.icm.edu.pl/pub/Linux/opensuse/update/11.0
+ftp://opensuse.hro.nl/opensuse/update/11.0
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/update/11.0
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/update/11.0
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/update/11.0
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/update/11.0
+ftp://ftp.uninett.no/pub/linux/opensuse/update/11.0
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/update/11.0
+ftp://ftp.pbone.net/pub/opensuse/update/11.0
+http://ftp.sileman.pl/pub/opensuse/update/11.0
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/update/11.0
+ftp://ftp.pbone.net/pub/opensuse/update/11.0
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/update/11.0
+ftp://ftp.sileman.pl/pub/opensuse/update/11.0
+http://ftp.nux.ipb.pt/pub/dists/opensuse/update/11.0
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/update/11.0
+http://ftp.gts.lug.ro/opensuse/update/11.0
+ftp://ftp.gts.lug.ro/opensuse/update/11.0
+http://ftp.ines.lug.ro/opensuse/update/11.0
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/update/11.0
+http://cesium.di.uminho.pt/pub/opensuse/update/11.0
+ftp://cesium.di.uminho.pt/pub/opensuse/update/11.0
+http://mirrors.se.eu.kernel.org/opensuse/update/11.0
+ftp://ftp.ines.lug.ro/opensuse/update/11.0
+http://ftp.df.lth.se/pub/opensuse/update/11.0
+http://opensuse.ynet.sk/update/11.0
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/update/11.0
+ftp://ftp.df.lth.se/pub/opensuseupdate/11.0
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/update/11.0
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/update/11.0
+ftp://mirrors.se.eu.kernel.org/opensuse/update/11.0
+http://less.cogeco.net/ftp/openSUSE/update/11.0
+http://www.muug.mb.ca/pub/opensuse/update/11.0
+http://linux.dell.com/repo/community/update/11.0
+ftp://www.muug.mb.ca/pub/opensuse/update/11.0
+ftp://less.cogeco.net/openSUSE/update/11.0
+http://ftp.osuosl.org/pub/opensuse/update/11.0
+http://suse.mirrors.tds.net/pub/opensuse/update/11.0
+http://opensuse.fastsoft.net/pub/linux/opensuse/update/11.0
+http://mirrors.med.harvard.edu/opensuse/update/11.0
+ftp://ftp.osuosl.org/pub/opensuse/update/11.0
+http://mirror.anl.gov/pub/opensuse/opensuse/update/11.0
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/update/11.0
+http://mirror.umoss.org/opensuse/update/11.0
+http://opensuse.cs.utah.edu/update/11.0
+http://opensuse.ca.unixheads.org/update/11.0
+http://mirrors.xmission.com/opensuse/update/11.0
+http://mirrors2.kernel.org/opensuse/update/11.0
+http://mirrors1.kernel.org/opensuse/update/11.0
+ftp://opensuse.cs.utah.edu/pub/opensuse/update/11.0
+http://mirror.rackspace.com/openSUSE/update/11.0
+http://130.57.19.201/update/11.0
+ftp://mirror.rackspace.com/openSUSE/update/11.0
+http://ftp.utexas.edu/opensuse/update/11.0
+ftp://130.57.19.201/pub/opensuse/update/11.0
+http://ftp.ussg.iu.edu/linux/opensuse/update/11.0
+ftp://mirror.anl.gov/pub/opensuse/opensuse/update/11.0
+http://www.gtlib.gatech.edu/pub/opensuse/update/11.0
+ftp://mirrors1.kernel.org/opensuse/update/11.0
+ftp://www.gtlib.gatech.edu/pub/opensuse/update/11.0
+ftp://mirrors2.kernel.org/opensuse/update/11.0
+ftp://mirror.colorado.edu/pub/opensuse/update/11.0
+ftp://mirrors.xmission.com/opensuse/update/11.0
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/update/11.0
+http://mirror.cps.cmich.edu/opensuse/opensuse/update/11.0
+ftp://ftp.utexas.edu/mirrors/opensuse/update/11.0
+ftp://mirror.colorado.edu/pub/opensuse/update/11.0
+http://mirrors.rit.edu/opensuse/update/11.0
+ftp://mirror.nyi.net/opensuseupdate/11.0
+http://ftp.iinet.net.au/pub/opensuse/update/11.0
+http://mirror.nyi.net/opensuse/update/11.0
+http://mirror.pacific.net.au/linux/opensuse/update/11.0
+http://mirror.internode.on.net/pub/opensuse/update/11.0
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/update/11.0
+ftp://mirror.internode.on.net/pub/opensuse/update/11.0
+ftp://ftp.iinet.net.au/pub/opensuse/update/11.0
+ftp://mirror.pacific.net.au/linux/opensuse/update/11.0
+http://opensuse.patan.com.ar/update/11.0
+http://200.221.9.37/pub/opensuse/update/11.0
+http://opensuse.c3sl.ufpr.br/update/11.0
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/update/11.0
+http://opensuse.pop.com.br/update/11.0
+ftp://opensuse.c3sl.ufpr.br/opensuse/update/11.0
diff --git a/src/lib/distro-info/suse-11.0_x86_64/prereqfiles/etc/group b/src/lib/distro-info/suse-11.0_x86_64/prereqfiles/etc/group
new file mode 100644
index 00000000..505cb221
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0_x86_64/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/src/lib/distro-info/suse-11.0_x86_64/prereqfiles/etc/hosts b/src/lib/distro-info/suse-11.0_x86_64/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0_x86_64/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/suse-11.0_x86_64/prereqfiles/etc/passwd b/src/lib/distro-info/suse-11.0_x86_64/prereqfiles/etc/passwd
new file mode 100644
index 00000000..9b8fc4fe
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0_x86_64/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/src/lib/distro-info/suse-11.0_x86_64/prereqfiles/etc/shadow b/src/lib/distro-info/suse-11.0_x86_64/prereqfiles/etc/shadow
new file mode 100644
index 00000000..cd100a5a
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0_x86_64/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/src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc b/src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc
new file mode 100644
index 00000000..ac75d62a
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc
@@ -0,0 +1,17 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (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/src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc b/src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc
new file mode 100644
index 00000000..57a9078a
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc
@@ -0,0 +1,13 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+mIsERCAdXQEEAL7MrBTz+3SBWpCm2ae2yaDqV3ezQcs2JlvqidJVhsZqQe9/jkxi
+KTEQW5+TXF/+BlQSiebunRI7oo3+9U8GyRCgs1sf+yRQWMLzZqRaarzRhw9w+Ihl
+edtqYl6/U2JZCb8Adp6d7RzlRliJdJ/VtsfXj2ef7Dwu7elOVSsmaBdtAAYptChT
+dVNFIFBhY2thZ2UgU2lnbmluZyBLZXkgPGJ1aWxkQHN1c2UuZGU+iLgEEwECACIC
+GwMECwcDAgMVAgMDFgIBAh4BAheABQJIHzCqBQkHwXpNAAoJEOOlw2Awfj1UvWgE
+AIRoxE8S6jQB7S43SVcX06FHJeUJ/m+1ErIj9LwJTYrR/8qsDjTgrttgb+nBHkIj
+NhCCLAuR8sWj3CxsUMH2fayryNnwZEWGqnzo7Jtt4R1Ur3h5pHYonFjfoJyFUZjJ
+7Mhw7/TuOWx20FrzqBi8tbHx8pd7Fa5lCUgopVtMh6GR
+=R56j
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc b/src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc
new file mode 100644
index 00000000..80380d2f
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc
@@ -0,0 +1,30 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (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/src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc b/src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc
new file mode 100644
index 00000000..74ff59e0
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc
@@ -0,0 +1,20 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+mQGiBER0iroRBADfqUeJmPCXqPJFnf3CVKy40dL1F+gfvP+JHN7/uu4c9+oCYjI1
+uAE8iGTm/Twb/Zzbs4dt0iWjhNFXbRi42rMww4d/8QcPYZ21WSehh+fv8nCjt2sw
+LeC87ar2SR8OTpJBK0fQlcd4e6H5GMntfI6SYEUOPd8m/eQ+4+1AxpUUpwCgswaF
+13fePZGI//pDn5tGjbvmaP8D/R3qum/I+oDS8lbFeeDS10GkEkwTYec13gdfsq6I
+yzIj7VBsC+rGfbipv+VGR61Q4d19pOHKLDekr9OG+3G4ZcYM4NQvQZR+QIlp3xWu
+nBmYD1LRkHLVj+Z4DGQhjjOffkPSuacKPymMaZ/aRiLgTIAo97W2YPhutscXrLSG
+2Y+BA/4jsyaDb7kbW4wc8RtPIcuFEheVqgBeRakP9Uj47kBMBEpPtI/mIdY5liKk
+ztKnuQG6ROYLNV/PW0ZbE1uT64C710weh4cB3PnZLV5P10deDLBjHk8MJQGCTSDD
+JYvhutUzQfshAU6j2kErGvKdZxWGezab34vFyMP2oLGqswPAJrRQTm92ZWxsIFBy
+b3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20pIDxub3ZlbGwt
+cHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6IZgQTEQIAJgIbAwYLCQgHAwIEFQIIAwQW
+AgMBAh4BAheABQJIFkiPBQkHhmvVAAoJEBTCi8l+LjsFn4QAn2wgOHudNubNZvTz
+NdaYJKJ0m2qnAJ9hd0nQBhn28H4Ii4a4h7kpGWRxN4hGBBMRAgAGBQJEexD/AAoJ
+EKhO2uicgArKFLwAn0B+g2mJ5n8LrBziTQ5SjnSPyDBXAJwJoYTta5Sfw/3vVGpU
+fJAKVDoB9w==
+=MWDN
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc b/src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc
new file mode 100644
index 00000000..daeef8a5
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc
@@ -0,0 +1,37 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (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
+YWdlIFNpZ25pbmcgS2V5IDxidWlsZEBzdXNlLmRlPohiBBMRAgAiAhsDBAsHAwID
+FQIDAxYCAQIeAQIXgAUCSB80OgUJEfKmuQAKCRCoTtronIAKyuJlAJ0cWZifmBO6
+Eh71jattipdMhUYBTwCfSXbJJtuF3c96JPmpmT8be2LDo86IRgQQEQIABgUCOnBe
+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
+1dbriEwEGBECAAwFAkgfNGYFCRHyptQACgkQqE7a6JyACsrv3ACbBLhafFXmTjH3
+JJWFJGWuIOaZUosAniPs4feEyN46gjXGgcZc2Ai8nkm6
+=mY6G
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc b/src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc
new file mode 100644
index 00000000..8467c19b
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc
@@ -0,0 +1,31 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+mQILBERqCJkBEACdqhZWdAbUHLIumXMEgv+GFjr1ZzVHgynnFOzztU/8sxZNa9cm
+YV4HZpVfjMr7fos3ArzyiPPt/336cf7w9p79/ZS4rHSNPDMlPCtXYvFxUbvU0/GY
+q4jwcBsrJ0xaJ9CP5bWyAgVKOb7Y6k0ktaLjRR+tDfMsHA4H0ClMoRr6ATw8NL0e
+VCfAHuzqCKvX1If8ng+wTivtAhKvz/WwQiELNELmPfc5tZHOw8NgP/r0Pze18Hn2
+dlAHu0WpC7uoR00vscsMIJiJJPcsxbL1F1eADKnk+wEy8Go+EJeJ5i0WoFbqD52q
+Lv/C/oY6NVtVY0MBwtn+oQNSnQ4JBsB/Akdt53LAi0ZtNQxMyUW+76R8FCOmVCV8
+WGiF5CPRP0yvG80AMBjBjKjHb/v8ov5MnIyFimzAHS1gQcUNxTEYA/5eFwoYcGcK
+weGq9FUjPTzLQAgvp7XmOzHpSAfJ7qysxFTepNsSZZhgizJyInrdQldr+GYcUNqB
+krD9MWmFop975OxhCTEnNv/HcE79r8WD26HzDFYxTiTJbr0pU/ivBzo+rjq+YG2V
+stJk+udVYmZTnC4LmXus8JiNuqBXbxNscwCBpcJ8YcfCV6uh+7E0XfXZsgVUFLp1
+NF+ylYRGTycOlWoZODrnJevZW7N9O3bWRx/G2P4bJD07LsDLe4i5hymf5QAGKbRQ
+Tm92ZWxsIFByb3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20p
+IDxub3ZlbGwtcHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6JAjMEEwECAB0FAkRqCJkG
+CwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRBHijLooZEiCKSFD/93vZHCAMLEfksU
+KnvXl08bv1rfuamuyJnE3ANRE5RDyypriHMCnkVxazvQ2WI4W4UEjluL9+SzZwtV
+ZvKVoAr31614nSyWwv2YnJTHfjMG+xRlkolZMnuIiB9PcCBo9+GPU0ABuzo4pEJW
+NIRoSS1NFbAZBhtUnY0cN+trM5QObLl7xXTavLyGk//blkk57fov7GXsQJlZUig0
+l2yt5XNyGpLUnTMDumHh8b389quF+0+ZfdwOy7A768xjipAZiTvIujBrEv51wrxh
+0HBT0VGA0MhD9t0B+Ce4BM9P/iVMO00naaOp6PqMfPPKxQQqer8qy1i6UWBx95SY
+mKZBIvOm2d9PezDxkckCu61r6krx1iKnT1wdprCAkIYwALK118SpbxuyGW0bhRHc
+wsc/akzWH72fS0Xu49mvL4k4A2U9asdeQid3dMgbtm5mSWof0yiU/G4YNn0yeXoY
+oG1VbCAqQbFX1Rvd6GITJVqI+ekW/uMA9BP78dF8wBeG0+QmpQnSf+eOsxB/RT8o
+Kb4hHY+29MUlg+i9ceVt7hoKr03J/uIG5TXFXRYLaI0iAFVlKfWxpqDfS2XA4+dD
+VYt+5RDgBcnxDaTB4FE9GqcYScNfe7+NFtL0p0wOPftbmgZzGjucTmrD8mDUNdqA
+xGK7vlk4GATSfOQlq7G6LXW6RYnInohGBBMRAgAGBQJEazMlAAoJEKhO2uicgArK
+2vMAn0TbVDESEVKVuFZStrfIzOvJQrR9AJsH733Ju1kE99GFrdfCeGqpckmNhg==
+=E+qN
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/pubring.gpg b/src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/pubring.gpg
new file mode 100644
index 00000000..53b38ddc
--- /dev/null
+++ b/src/lib/distro-info/suse-11.0_x86_64/trusted-package-keys/pubring.gpg
Binary files differ
diff --git a/src/lib/distro-info/suse-11.1/export-filter.example b/src/lib/distro-info/suse-11.1/export-filter.example
new file mode 100644
index 00000000..a414fef4
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1/export-filter.example
@@ -0,0 +1,15 @@
+# this file defines the filter rules used when exporting a vendor-OS
+# of this distro
+#
+# copy this file to 'export-filter' and add your own filters to it
+# in order to overrule the filters provided by openslx
+#
+#Examples:
+# the following line would include anything below /var/spool/
+#+ /var/spool/*
+#
+# this would exclude anything in /etc that starts with dhcpd.conf
+#- /etc/dhcpd.conf*
+#
+# and this would exclude all rpmnew-files:
+#- *.rpmnew
diff --git a/src/lib/distro-info/suse-11.1/mirrors/base b/src/lib/distro-info/suse-11.1/mirrors/base
new file mode 100644
index 00000000..e323dcaa
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1/mirrors/base
@@ -0,0 +1,252 @@
+http://opensuse.mirror.ac.za/opensuse/distribution/11.1/repo/oss
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.1/repo/oss
+http://www.lizardsource.cn/distribution/11.1/repo/oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.1/repo/oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.1/repo/oss
+http://download.opensuse.or.id/distribution/11.1/repo/oss
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.1/repo/oss
+http://mirror.lupaworld.com/opensuse/distribution/11.1/repo/oss
+ftp://www.lizardsource.cn/distribution/11.1/repo/oss
+ftp://opensuse.mirror.ac.za/opensuse/distribution/11.1/repo/oss
+http://repo.ugm.ac.id/opensuse/distribution/11.1/repo/oss
+http://opensuse.cbn.net.id/distribution/11.1/repo/oss
+http://mirror.unej.ac.id/opensuse/distribution/11.1/repo/oss
+http://dl2.foss-id.web.id/opensuse/distribution/11.1/repo/oss
+http://mirror.isoc.org.il/pub/opensuse/distribution/11.1/repo/oss
+ftp://dl2.foss-id.web.id/repo/opensuse/distribution/11.1/repo/oss
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.1/repo/oss
+ftp://opensuse.cbn.net.id/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.kddilabs.jp/Linux/packages/opensuse/distribution/11.1/repo/oss
+ftp://mirror.isoc.org.il/opensuse/distribution/11.1/repo/oss
+ftp://repo.ugm.ac.id/opensuse/distribution/11.1/repo/oss
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.1/repo/oss
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.kddilabs.jp/Linux/packages/opensusedistribution/11.1/repo/oss
+http://ftp.novell.co.jp/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirror.unej.ac.id/opensuse/distribution/11.1/repo/oss
+http://ftp.riken.jp/Linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.riken.jp/Linux/opensuse/distribution/11.1/repo/oss
+http://ftp.daum.net/opensuse/distribution/11.1/repo/oss
+http://77.88.19.68/opensuse/distribution/11.1/repo/oss
+http://77.88.19.73/opensuse/distribution/11.1/repo/oss
+http://mirror.suse.ru/distribution/11.1/repo/oss
+http://77.88.19.74/opensuse/distribution/11.1/repo/oss
+http://93.158.155.193/opensuse/distribution/11.1/repo/oss
+ftp://ftp.daum.net/opensuse/distribution/11.1/repo/oss
+ftp://seeder.yandex.net/opensuse/distribution/11.1/repo/oss
+ftp://ftp.chg.ru/pub/opensuse/distribution/11.1/repo/oss
+ftp://allotter.yandex.net/opensuse/distribution/11.1/repo/oss
+http://mirror.nus.edu.sg/opensuse/distribution/11.1/repo/oss
+ftp://dispenser.yandex.net/opensuse/distribution/11.1/repo/oss
+ftp://ftp.kaist.ac.kr/opensuse/distribution/11.1/repo/oss
+ftp://spreader.yandex.net/opensuse/distribution/11.1/repo/oss
+ftp://ftp.novell.co.jp/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.metu.edu.tr/opensuse/distribution/11.1/repo/oss
+http://ftp.isu.edu.tw/pub/Linux/opensuse/distribution/11.1/repo/oss
+ftp://mirror.in.th/opensuse/distribution/11.1/repo/oss
+ftp://ftp.isu.edu.tw/pub/Linux/OpenSuSE/distribution/11.1/repo/oss
+http://ftp.chg.ru/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.1/repo/oss
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.1/repo/oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.twaren.net/Linux/OpenSuSE/distribution/11.1/repo/oss
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.1/repo/oss
+ftp://ftp.twaren.net/Linux/OpenSuSE/distribution/11.1/repo/oss
+http://suse.inode.at/opensuse/distribution/11.1/repo/oss
+http://mirror-fpt-telecom.fpt.net/opensuse/distribution/11.1/repo/oss
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.1/repo/oss
+http://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.tugraz.at/mirror/opensuse/distribution/11.1/repo/oss
+ftp://suse.inode.at/opensuse/distribution/11.1/repo/oss
+ftp://ftp.tugraz.at/mirror/opensuse/distribution/11.1/repo/oss
+http://suse.lagis.at/opensuse/distribution/11.1/repo/oss
+http://mirror.opensuse.com.ba/opensuse/distribution/11.1/repo/oss
+http://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.1/repo/oss
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+ftp://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.1/repo/oss
+http://mirrors.netbg.com/opensuse/distribution/11.1/repo/oss
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.1/repo/oss
+ftp://suse.lagis.at/opensuse/distribution/11.1/repo/oss
+http://mirror.karneval.cz/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.1/repo/oss
+http://mirror.switch.ch/ftp/mirror/opensuse/distribution/11.1/repo/oss
+http://ftp.linux.cz/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+http://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.1/repo/oss
+ftp://mirror.karneval.cz/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://mirrors.netbg.com/opensuse/distribution/11.1/repo/oss
+http://ftp5.gwdg.de/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.1/repo/oss
+ftp://mirror.switch.ch/mirror/opensuse/distribution/11.1/repo/oss
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/distribution/11.1/repo/oss
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp5.gwdg.de/pub/opensuse/distribution/11.1/repo/oss
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/distribution/11.1/repo/oss
+http://download.uni-hd.de/ftp/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.1/repo/oss
+http://opensuse.intergenia.de/distribution/11.1/repo/oss
+http://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.1/repo/oss
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.1/repo/oss
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.1/repo/oss
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.1/repo/oss
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp3.gwdg.de/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.uni-kassel.de/opensuse/distribution/11.1/repo/oss
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://widehat.opensuse.org/distribution/11.1/repo/oss
+http://ftp4.gwdg.de/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+ftp://ftp4.gwdg.de/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.uni-bayreuth.de/linux/opensuse/distribution/11.1/repo/oss
+http://opensuse-linuxmigratio.at/distribution/11.1/repo/oss
+http://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.1/repo/oss
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.1/repo/oss
+http://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.klid.dk/ftp/opensuse/distribution/11.1/repo/oss
+ftp://ftp3.gwdg.de/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.uni-siegen.de/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uni-siegen.de/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.estpak.ee/pub/suse/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.gui.uva.es/sites/opensuse.org/distribution/11.1/repo/oss
+http://ftp.rediris.es/pub/mirror/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uni-bayreuth.de/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://suse.bifi.unizar.es/opensuse/distribution/11.1/repo/oss
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.1/repo/oss
+http://opensuse.mirrors.proxad.net/opensuse/distribution/11.1/repo/oss
+ftp://ftp.klid.dk/opensuse/distribution/11.1/repo/oss
+http://mirror.ovh.net/opensuse/distribution/11.1/repo/oss
+http://fr2.rpmfind.net/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.gui.uva.es/sites/opensuse.org/distribution/11.1/repo/oss
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.1/repo/oss
+ftp://fr2.rpmfind.net/linux/opensuse/distribution/11.1/repo/oss
+http://opensuse.cict.fr/distribution/11.1/repo/oss
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+ftp://mirror.cict.fr/opensuse/distribution/11.1/repo/oss
+http://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.1/repo/oss
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/oss
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/distribution/11.1/repo/oss
+ftp://ftp.rediris.es/pub/mirror/opensuse/distribution/11.1/repo/oss
+ftp://mirror.ovh.net/opensuse/distribution/11.1/repo/oss
+ftp://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.1/repo/oss
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.1/repo/oss
+http://ftp.ntua.gr/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.1/repo/oss
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/distribution/11.1/repo/oss
+http://roxen.integrity.hu/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.1/repo/oss
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+ftp://ftp.ntua.gr/pub/linux/opensusedistribution/11.1/repo/oss
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.1/repo/oss
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+http://rm.mirror.garr.it/mirrors/opensuse/distribution/11.1/repo/oss
+http://mirror.leaseweb.com/opensuse/distribution/11.1/repo/oss
+ftp://rm.mirror.garr.it/mirrors/opensusedistribution/11.1/repo/oss
+http://mirrors.nl.eu.kernel.org/opensuse/distribution/11.1/repo/oss
+http://repo1.linux.edu.lv/distribution/11.1/repo/oss
+ftp://mirrors.nl.eu.kernel.org/opensuse/distribution/11.1/repo/oss
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/distribution/11.1/repo/oss
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.1/repo/oss
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/distribution/11.1/repo/oss
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/oss
+http://opensuse.hro.nl/opensuse/distribution/11.1/repo/oss
+ftp://repo1.linux.edu.lv/distribution/11.1/repo/oss
+ftp://opensuse.hro.nl/opensuse/distribution/11.1/repo/oss
+http://opensuse.uib.no/distribution/11.1/repo/oss
+ftp://mirror.leaseweb.com/opensuse/distribution/11.1/repo/oss
+http://ftp.uninett.no/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.1/repo/oss
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uninett.no/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.1/repo/oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.1/repo/oss
+http://ftp.sileman.pl/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.1/repo/oss
+http://cesium.di.uminho.pt/pub/opensuse/distribution/11.1/repo/oss
+ftp://cesium.di.uminho.pt/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.sileman.pl/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.1/repo/oss
+http://ftp.gts.lug.ro/opensuse/distribution/11.1/repo/oss
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.1/repo/oss
+http://ftp.ines.lug.ro/opensuse/distribution/11.1/repo/oss
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.1/repo/oss
+http://mirrors.se.eu.kernel.org/opensuse/distribution/11.1/repo/oss
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.1/repo/oss
+ftp://ftp.ines.lug.ro/opensuse/distribution/11.1/repo/oss
+http://ftp.df.lth.se/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.df.lth.se/pub/opensusedistribution/11.1/repo/oss
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.1/repo/oss
+ftp://ftp.gts.lug.ro/opensuse/distribution/11.1/repo/oss
+http://opensuse.ynet.sk/distribution/11.1/repo/oss
+http://less.cogeco.net/ftp/openSUSE/distribution/11.1/repo/oss
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.1/repo/oss
+http://www.muug.mb.ca/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirrors.se.eu.kernel.org/opensuse/distribution/11.1/repo/oss
+http://linux.dell.com/repo/community/distribution/11.1/repo/oss
+ftp://www.muug.mb.ca/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.osuosl.org/pub/opensuse/distribution/11.1/repo/oss
+http://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.osuosl.org/pub/opensuse/distribution/11.1/repo/oss
+http://suse.mirrors.tds.net/pub/opensuse/distribution/11.1/repo/oss
+ftp://less.cogeco.net/openSUSE/distribution/11.1/repo/oss
+http://mirrors.med.harvard.edu/opensuse/distribution/11.1/repo/oss
+http://opensuse.cs.utah.edu/distribution/11.1/repo/oss
+http://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.1/repo/oss
+http://mirror.umoss.org/opensuse/distribution/11.1/repo/oss
+http://opensuse.ca.unixheads.org/distribution/11.1/repo/oss
+ftp://opensuse.cs.utah.edu/pub/opensuse/distribution/11.1/repo/oss
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.1/repo/oss
+http://mirrors.xmission.com/opensuse/distribution/11.1/repo/oss
+ftp://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://suse.mirrors.tds.net/pub/opensuse/distribution/11.1/repo/oss
+http://mirrors2.kernel.org/opensuse/distribution/11.1/repo/oss
+http://mirrors1.kernel.org/opensuse/distribution/11.1/repo/oss
+ftp://mirrors2.kernel.org/opensuse/distribution/11.1/repo/oss
+http://mirror.rackspace.com/openSUSE/distribution/11.1/repo/oss
+http://130.57.19.201/distribution/11.1/repo/oss
+ftp://mirror.rackspace.com/openSUSE/distribution/11.1/repo/oss
+ftp://130.57.19.201/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.utexas.edu/opensuse/distribution/11.1/repo/oss
+http://www.gtlib.gatech.edu/pub/opensuse/distribution/11.1/repo/oss
+ftp://www.gtlib.gatech.edu/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.ussg.iu.edu/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.utexas.edu/mirrors/opensuse/distribution/11.1/repo/oss
+ftp://mirrors.xmission.com/opensuse/distribution/11.1/repo/oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.1/repo/oss
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/distribution/11.1/repo/oss
+http://mirror.cps.cmich.edu/opensuse/opensuse/distribution/11.1/repo/oss
+http://mirror.nyi.net/opensuse/distribution/11.1/repo/oss
+ftp://mirrors1.kernel.org/opensuse/distribution/11.1/repo/oss
+http://mirrors.rit.edu/opensuse/distribution/11.1/repo/oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.iinet.net.au/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirror.nyi.net/opensusedistribution/11.1/repo/oss
+http://mirror.internode.on.net/pub/opensuse/distribution/11.1/repo/oss
+http://mirror.pacific.net.au/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.iinet.net.au/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirror.pacific.net.au/linux/opensuse/distribution/11.1/repo/oss
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.1/repo/oss
+http://opensuse.patan.com.ar/distribution/11.1/repo/oss
+http://200.221.9.37/pub/opensuse/distribution/11.1/repo/oss
+http://opensuse.c3sl.ufpr.br/distribution/11.1/repo/oss
+http://opensuse.pop.com.br/distribution/11.1/repo/oss
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://opensuse.c3sl.ufpr.br/opensuse/distribution/11.1/repo/oss
+ftp://mirror.internode.on.net/pub/opensuse/distribution/11.1/repo/oss
diff --git a/src/lib/distro-info/suse-11.1/mirrors/base_non-oss b/src/lib/distro-info/suse-11.1/mirrors/base_non-oss
new file mode 100644
index 00000000..e987723d
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1/mirrors/base_non-oss
@@ -0,0 +1,250 @@
+http://opensuse.mirror.ac.za/opensuse/distribution/11.1/repo/non-oss
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://mirror.lupaworld.com/opensuse/distribution/11.1/repo/non-oss
+http://www.lizardsource.cn/distribution/11.1/repo/non-oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.1/repo/non-oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://www.lizardsource.cn/distribution/11.1/repo/non-oss
+ftp://opensuse.mirror.ac.za/opensuse/distribution/11.1/repo/non-oss
+http://mirror.unej.ac.id/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.cbn.net.id/distribution/11.1/repo/non-oss
+http://download.opensuse.or.id/distribution/11.1/repo/non-oss
+http://repo.ugm.ac.id/opensuse/distribution/11.1/repo/non-oss
+ftp://opensuse.cbn.net.id/pub/opensuse/distribution/11.1/repo/non-oss
+http://dl2.foss-id.web.id/opensuse/distribution/11.1/repo/non-oss
+http://mirror.isoc.org.il/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.1/repo/non-oss
+ftp://dl2.foss-id.web.id/repo/opensuse/distribution/11.1/repo/non-oss
+http://ftp.kddilabs.jp/Linux/packages/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.1/repo/non-oss
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.isoc.org.il/opensuse/distribution/11.1/repo/non-oss
+http://ftp.novell.co.jp/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://repo.ugm.ac.id/opensuse/distribution/11.1/repo/non-oss
+http://ftp.riken.jp/Linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.novell.co.jp/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.daum.net/opensuse/distribution/11.1/repo/non-oss
+http://77.88.19.68/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.kddilabs.jp/Linux/packages/opensusedistribution/11.1/repo/non-oss
+http://77.88.19.73/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.riken.jp/Linux/opensuse/distribution/11.1/repo/non-oss
+http://mirror.suse.ru/distribution/11.1/repo/non-oss
+http://77.88.19.74/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.chg.ru/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://spreader.yandex.net/opensuse/distribution/11.1/repo/non-oss
+http://mirror.nus.edu.sg/opensuse/distribution/11.1/repo/non-oss
+ftp://dispenser.yandex.net/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.kaist.ac.kr/opensuse/distribution/11.1/repo/non-oss
+ftp://seeder.yandex.net/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.in.th/opensuse/distribution/11.1/repo/non-oss
+ftp://allotter.yandex.net/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.metu.edu.tr/opensuse/distribution/11.1/repo/non-oss
+http://ftp.isu.edu.tw/pub/Linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.isu.edu.tw/pub/Linux/OpenSuSE/distribution/11.1/repo/non-oss
+http://ftp.chg.ru/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.1/repo/non-oss
+http://ftp.twaren.net/Linux/OpenSuSE/distribution/11.1/repo/non-oss
+http://mirror-fpt-telecom.fpt.net/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.twaren.net/Linux/OpenSuSE/distribution/11.1/repo/non-oss
+http://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.1/repo/non-oss
+http://suse.inode.at/opensuse/distribution/11.1/repo/non-oss
+http://ftp.tugraz.at/mirror/opensuse/distribution/11.1/repo/non-oss
+ftp://suse.inode.at/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.tugraz.at/mirror/opensuse/distribution/11.1/repo/non-oss
+http://suse.lagis.at/opensuse/distribution/11.1/repo/non-oss
+ftp://suse.lagis.at/opensuse/distribution/11.1/repo/non-oss
+http://mirror.opensuse.com.ba/opensuse/distribution/11.1/repo/non-oss
+http://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.1/repo/non-oss
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.1/repo/non-oss
+http://mirrors.netbg.com/opensuse/distribution/11.1/repo/non-oss
+http://mirror.switch.ch/ftp/mirror/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.1/repo/non-oss
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+http://mirror.karneval.cz/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://mirrors.netbg.com/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.switch.ch/mirror/opensuse/distribution/11.1/repo/non-oss
+http://ftp.linux.cz/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.karneval.cz/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.1/repo/non-oss
+http://ftp5.gwdg.de/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.1/repo/non-oss
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://download.uni-hd.de/ftp/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.1/repo/non-oss
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp5.gwdg.de/pub/opensuse/distribution/11.1/repo/non-oss
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.intergenia.de/distribution/11.1/repo/non-oss
+http://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.1/repo/non-oss
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.1/repo/non-oss
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.1/repo/non-oss
+http://widehat.opensuse.org/distribution/11.1/repo/non-oss
+http://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.1/repo/non-oss
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp4.gwdg.de/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp3.gwdg.de/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp4.gwdg.de/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.uni-kassel.de/opensuse/distribution/11.1/repo/non-oss
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+http://ftp.uni-bayreuth.de/linux/opensuse/distribution/11.1/repo/non-oss
+http://opensuse-linuxmigratio.at/distribution/11.1/repo/non-oss
+ftp://ftp3.gwdg.de/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.uni-siegen.de/opensuse/distribution/11.1/repo/non-oss
+http://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.1/repo/non-oss
+http://ftp.klid.dk/ftp/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.1/repo/non-oss
+http://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.klid.dk/opensuse/distribution/11.1/repo/non-oss
+http://ftp.estpak.ee/pub/suse/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.gui.uva.es/sites/opensuse.org/distribution/11.1/repo/non-oss
+ftp://ftp.uni-siegen.de/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.uni-bayreuth.de/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.rediris.es/pub/mirror/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.rediris.es/pub/mirror/opensuse/distribution/11.1/repo/non-oss
+http://suse.bifi.unizar.es/opensuse/distribution/11.1/repo/non-oss
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.gui.uva.es/sites/opensuse.org/distribution/11.1/repo/non-oss
+http://opensuse.mirrors.proxad.net/opensuse/distribution/11.1/repo/non-oss
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+http://fr2.rpmfind.net/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.ovh.net/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.cict.fr/distribution/11.1/repo/non-oss
+http://mirror.ovh.net/opensuse/distribution/11.1/repo/non-oss
+http://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.1/repo/non-oss
+ftp://fr2.rpmfind.net/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/non-oss
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/distribution/11.1/repo/non-oss
+ftp://mirror.cict.fr/opensuse/distribution/11.1/repo/non-oss
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://ftp.ntua.gr/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.ntua.gr/pub/linux/opensusedistribution/11.1/repo/non-oss
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/distribution/11.1/repo/non-oss
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.1/repo/non-oss
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.1/repo/non-oss
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+http://rm.mirror.garr.it/mirrors/opensuse/distribution/11.1/repo/non-oss
+http://roxen.integrity.hu/pub/opensuse/distribution/11.1/repo/non-oss
+http://repo1.linux.edu.lv/distribution/11.1/repo/non-oss
+http://mirror.leaseweb.com/opensuse/distribution/11.1/repo/non-oss
+ftp://repo1.linux.edu.lv/distribution/11.1/repo/non-oss
+ftp://mirror.leaseweb.com/opensuse/distribution/11.1/repo/non-oss
+ftp://rm.mirror.garr.it/mirrors/opensusedistribution/11.1/repo/non-oss
+http://mirrors.nl.eu.kernel.org/opensuse/distribution/11.1/repo/non-oss
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/distribution/11.1/repo/non-oss
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.hro.nl/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.uib.no/distribution/11.1/repo/non-oss
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://ftp.uninett.no/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.1/repo/non-oss
+ftp://mirrors.nl.eu.kernel.org/opensuse/distribution/11.1/repo/non-oss
+http://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.uninett.no/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://opensuse.hro.nl/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.sileman.pl/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.1/repo/non-oss
+http://cesium.di.uminho.pt/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://cesium.di.uminho.pt/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.gts.lug.ro/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.sileman.pl/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.ines.lug.ro/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.1/repo/non-oss
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.1/repo/non-oss
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.1/repo/non-oss
+http://mirrors.se.eu.kernel.org/opensuse/distribution/11.1/repo/non-oss
+ftp://mirrors.se.eu.kernel.org/opensuse/distribution/11.1/repo/non-oss
+http://ftp.gts.lug.ro/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.ines.lug.ro/opensuse/distribution/11.1/repo/non-oss
+http://ftp.df.lth.se/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.ynet.sk/distribution/11.1/repo/non-oss
+http://less.cogeco.net/ftp/openSUSE/distribution/11.1/repo/non-oss
+http://linux.dell.com/repo/community/distribution/11.1/repo/non-oss
+ftp://less.cogeco.net/openSUSE/distribution/11.1/repo/non-oss
+ftp://ftp.df.lth.se/pub/opensusedistribution/11.1/repo/non-oss
+http://ftp.osuosl.org/pub/opensuse/distribution/11.1/repo/non-oss
+http://www.muug.mb.ca/pub/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.osuosl.org/pub/opensuse/distribution/11.1/repo/non-oss
+http://suse.mirrors.tds.net/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://mirrors.med.harvard.edu/opensuse/distribution/11.1/repo/non-oss
+ftp://suse.mirrors.tds.net/pub/opensuse/distribution/11.1/repo/non-oss
+http://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.1/repo/non-oss
+ftp://www.muug.mb.ca/pub/opensuse/distribution/11.1/repo/non-oss
+http://mirror.umoss.org/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.cs.utah.edu/distribution/11.1/repo/non-oss
+http://opensuse.ca.unixheads.org/distribution/11.1/repo/non-oss
+ftp://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://mirrors2.kernel.org/opensuse/distribution/11.1/repo/non-oss
+ftp://opensuse.cs.utah.edu/pub/opensuse/distribution/11.1/repo/non-oss
+http://mirrors1.kernel.org/opensuse/distribution/11.1/repo/non-oss
+http://mirrors.xmission.com/opensuse/distribution/11.1/repo/non-oss
+http://mirror.rackspace.com/openSUSE/distribution/11.1/repo/non-oss
+http://130.57.19.201/distribution/11.1/repo/non-oss
+ftp://mirrors.xmission.com/opensuse/distribution/11.1/repo/non-oss
+ftp://130.57.19.201/pub/opensuse/distribution/11.1/repo/non-oss
+http://www.gtlib.gatech.edu/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://mirrors2.kernel.org/opensuse/distribution/11.1/repo/non-oss
+http://ftp.ussg.iu.edu/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.rackspace.com/openSUSE/distribution/11.1/repo/non-oss
+http://ftp.utexas.edu/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.ussg.iu.edu/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.utexas.edu/mirrors/opensuse/distribution/11.1/repo/non-oss
+ftp://www.gtlib.gatech.edu/pub/opensuse/distribution/11.1/repo/non-oss
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/distribution/11.1/repo/non-oss
+http://mirror.cps.cmich.edu/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://mirror.nyi.net/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://mirrors1.kernel.org/opensuse/distribution/11.1/repo/non-oss
+http://mirrors.rit.edu/opensuse/distribution/11.1/repo/non-oss
+http://ftp.iinet.net.au/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.nyi.net/opensusedistribution/11.1/repo/non-oss
+http://mirror.internode.on.net/pub/opensuse/distribution/11.1/repo/non-oss
+http://mirror.pacific.net.au/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.iinet.net.au/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.internode.on.net/pub/opensuse/distribution/11.1/repo/non-oss
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.pacific.net.au/linux/opensuse/distribution/11.1/repo/non-oss
+http://200.221.9.37/pub/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.c3sl.ufpr.br/distribution/11.1/repo/non-oss
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.patan.com.ar/distribution/11.1/repo/non-oss
+http://opensuse.pop.com.br/distribution/11.1/repo/non-oss
+ftp://opensuse.c3sl.ufpr.br/opensuse/distribution/11.1/repo/non-oss
diff --git a/src/lib/distro-info/suse-11.1/mirrors/base_update b/src/lib/distro-info/suse-11.1/mirrors/base_update
new file mode 100644
index 00000000..76260505
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1/mirrors/base_update
@@ -0,0 +1,252 @@
+http://mirror.lupaworld.com/opensuse/update/11.1
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/update/11.1
+http://opensuse.mirror.ac.za/opensuse/update/11.1
+ftp://opensuse.mirror.ac.za/opensuse/update/11.1
+http://www.lizardsource.cn/update/11.1
+http://mirror.alva.ge/pub/opensuse/update/11.1
+http://mirror.alva.ge/pub/opensuse/update/11.1
+http://download.opensuse.or.id/update/11.1
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/update/11.1
+ftp://www.lizardsource.cn/update/11.1
+http://opensuse.cbn.net.id/update/11.1
+http://mirror.unej.ac.id/opensuse/update/11.1
+http://dl2.foss-id.web.id/opensuse/update/11.1
+ftp://mirror.isoc.org.il/opensuse/update/11.1
+http://repo.ugm.ac.id/opensuse/update/11.1
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/update/11.1
+http://mirror.isoc.org.il/pub/opensuse/update/11.1
+http://ftp.kddilabs.jp/Linux/packages/opensuse/update/11.1
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/update/11.1
+ftp://dl2.foss-id.web.id/repo/opensuse/update/11.1
+ftp://mirror.unej.ac.id/opensuse/update/11.1
+ftp://opensuse.cbn.net.id/pub/opensuse/update/11.1
+http://ftp.novell.co.jp/pub/opensuse/update/11.1
+ftp://repo.ugm.ac.id/opensuse/update/11.1
+http://ftp.riken.jp/Linux/opensuse/update/11.1
+ftp://ftp.novell.co.jp/pub/opensuse/update/11.1
+ftp://ftp.kddilabs.jp/Linux/packages/opensuseupdate/11.1
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/update/11.1
+http://77.88.19.68/opensuse/update/11.1
+ftp://ftp.daum.net/opensuse/update/11.1
+http://77.88.19.73/opensuse/update/11.1
+ftp://ftp.riken.jp/Linux/opensuse/update/11.1
+http://mirror.suse.ru/update/11.1
+http://77.88.19.74/opensuse/update/11.1
+http://ftp.daum.net/opensuse/update/11.1
+http://93.158.155.193/opensuse/update/11.1
+ftp://ftp.kaist.ac.kr/opensuse/update/11.1
+ftp://spreader.yandex.net/opensuse/update/11.1
+ftp://ftp.chg.ru/pub/opensuse/update/11.1
+ftp://seeder.yandex.net/opensuse/update/11.1
+http://mirror.nus.edu.sg/opensuse/update/11.1
+ftp://mirror.in.th/opensuse/update/11.1
+ftp://allotter.yandex.net/opensuse/update/11.1
+ftp://ftp.suntel.com.tr/pub/opensuse/update/11.1
+ftp://ftp.metu.edu.tr/opensuse/update/11.1
+ftp://dispenser.yandex.net/opensuse/update/11.1
+ftp://ftp.suntel.com.tr/pub/opensuse/update/11.1
+http://ftp.chg.ru/pub/opensuse/update/11.1
+http://ftp.isu.edu.tw/pub/Linux/opensuse/update/11.1
+http://mirror-fpt-telecom.fpt.net/opensuse/update/11.1
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/update/11.1
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/update/11.1
+http://ftp.ncnu.edu.tw/Linux/opensuse/update/11.1
+http://ftp.twaren.net/Linux/OpenSuSE/update/11.1
+ftp://ftp.isu.edu.tw/pub/Linux/OpenSuSE/update/11.1
+http://suse.inode.at/opensuse/update/11.1
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/update/11.1
+ftp://ftp.twaren.net/Linux/OpenSuSE/update/11.1
+http://ftp.tugraz.at/mirror/opensuse/update/11.1
+ftp://suse.inode.at/opensuse/update/11.1
+http://suse.lagis.at/opensuse/update/11.1
+http://ftp.belnet.be/mirror/ftp.opensuse.org/update/11.1
+ftp://ftp.tugraz.at/mirror/opensuse/update/11.1
+ftp://gd.tuwien.ac.at/opsys/linux/opensuse/update/11.1
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/update/11.1
+ftp://suse.lagis.at/opensuse/update/11.1
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/update/11.1
+http://mirror.opensuse.com.ba/opensuse/update/11.1
+http://mirrors.netbg.com/opensuse/update/11.1
+http://mirror.switch.ch/ftp/mirror/opensuse/update/11.1
+ftp://mirror.switch.ch/mirror/opensuse/update/11.1
+http://mirror.karneval.cz/pub/linux/opensuse/update/11.1
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/update/11.1
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/update/11.1
+http://ftp5.gwdg.de/pub/opensuse/update/11.1
+http://gd.tuwien.ac.at/opsys/linux/opensuse/update/11.1
+http://ftp.linux.cz/pub/linux/opensuse/update/11.1
+http://ftp.halifax.rwth-aachen.de/opensuse/update/11.1
+ftp://mirror.karneval.cz/pub/linux/opensuse/update/11.1
+ftp://mirrors.netbg.com/opensuse/update/11.1
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/update/11.1
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/update/11.1
+ftp://ftp.halifax.rwth-aachen.de/opensuse/update/11.1
+http://download.uni-hd.de/ftp/pub/linux/opensuse/update/11.1
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/update/11.1
+ftp://ftp5.gwdg.de/pub/opensuse/update/11.1
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/update/11.1
+http://opensuse.intergenia.de/update/11.1
+http://ftp.uni-ulm.de/mirrors/opensuse/update/11.1
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/update/11.1
+ftp://ftp.uni-ulm.de/mirrors/opensuse/update/11.1
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/update/11.1
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/update/11.1
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/update/11.1
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/update/11.1
+http://ftp.uni-kl.de/pub/linux/opensuse/update/11.1
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/update/11.1
+http://ftp3.gwdg.de/pub/opensuse/update/11.1
+ftp://ftp.uni-kl.de/pub/linux/opensuse/update/11.1
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/update/11.1
+http://widehat.opensuse.org/update/11.1
+http://ftp4.gwdg.de/pub/opensuse/update/11.1
+ftp://ftp4.gwdg.de/pub/opensuse/update/11.1
+ftp://ftp3.gwdg.de/pub/opensuse/update/11.1
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/update/11.1
+http://ftp.uni-kassel.de/opensuse/update/11.1
+http://ftp.uni-bayreuth.de/linux/opensuse/update/11.1
+http://opensuse-linuxmigratio.at/update/11.1
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/update/11.1
+http://ftp.tu-ilmenau.de/mirror/opensuse/update/11.1
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/update/11.1
+ftp://ftp.uni-siegen.de/pub/opensuse/update/11.1
+http://ftp.uni-paderborn.de/pub/linux/opensuse/update/11.1
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/update/11.1
+ftp://ftp.uni-bayreuth.de/linux/opensuse/update/11.1
+http://ftp.estpak.ee/pub/suse/opensuse/update/11.1
+http://ftp.gui.uva.es/sites/opensuse.org/update/11.1
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/update/11.1
+ftp://ftp.gui.uva.es/sites/opensuse.org/update/11.1
+http://ftp.rediris.es/pub/mirror/opensuse/update/11.1
+ftp://ftp.klid.dk/opensuse/update/11.1
+ftp://ftp.rediris.es/pub/mirror/opensuse/update/11.1
+http://suse.bifi.unizar.es/opensuse/update/11.1
+http://ftp.uni-siegen.de/opensuse/update/11.1
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/update/11.1
+http://ftp.klid.dk/ftp/opensuse/update/11.1
+http://opensuse.mirrors.proxad.net/opensuse/update/11.1
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/update/11.1
+ftp://mirror.ovh.net/opensuse/update/11.1
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/update/11.1
+http://mirror.ovh.net/opensuse/update/11.1
+http://www.mirrorservice.org/sites/download.opensuse.org/update/11.1
+http://fr2.rpmfind.net/linux/opensuse/update/11.1
+ftp://www.mirrorservice.org/sites/download.opensuse.org/update/11.1
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/update/11.1
+ftp://fr2.rpmfind.net/linux/opensuse/update/11.1
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/update/11.1
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/update/11.1
+http://opensuse.cict.fr/update/11.1
+http://ftp.ntua.gr/pub/linux/opensuse/update/11.1
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/update/11.1
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/update/11.1
+ftp://ftp.ntua.gr/pub/linux/opensuseupdate/11.1
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/update/11.1
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/update/11.1
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/update/11.1
+http://roxen.integrity.hu/pub/opensuse/update/11.1
+ftp://mirror.cict.fr/opensuse/update/11.1
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/update/11.1
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/update/11.1
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/update/11.1
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/update/11.1
+http://rm.mirror.garr.it/mirrors/opensuse/update/11.1
+http://repo1.linux.edu.lv/update/11.1
+ftp://repo1.linux.edu.lv/update/11.1
+http://mirror.leaseweb.com/opensuse/update/11.1
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/update/11.1
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/update/11.1
+ftp://mirror.leaseweb.com/opensuse/update/11.1
+ftp://rm.mirror.garr.it/mirrors/opensuseupdate/11.1
+ftp://mirrors.nl.eu.kernel.org/opensuse/update/11.1
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/update/11.1
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/update/11.1
+http://mirrors.nl.eu.kernel.org/opensuse/update/11.1
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/update/11.1
+http://opensuse.hro.nl/opensuse/update/11.1
+http://opensuse.uib.no/update/11.1
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/update/11.1
+http://ftp.uninett.no/pub/linux/opensuse/update/11.1
+http://ftp.icm.edu.pl/pub/Linux/opensuse/update/11.1
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/update/11.1
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/update/11.1
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/update/11.1
+ftp://ftp.uninett.no/pub/linux/opensuse/update/11.1
+ftp://opensuse.hro.nl/opensuse/update/11.1
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/update/11.1
+ftp://ftp.pbone.net/pub/opensuse/update/11.1
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/update/11.1
+http://ftp.sileman.pl/pub/opensuse/update/11.1
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/update/11.1
+ftp://ftp.sileman.pl/pub/opensuse/update/11.1
+ftp://ftp.pbone.net/pub/opensuse/update/11.1
+http://cesium.di.uminho.pt/pub/opensuse/update/11.1
+http://ftp.gts.lug.ro/opensuse/update/11.1
+ftp://cesium.di.uminho.pt/pub/opensuse/update/11.1
+ftp://ftp.gts.lug.ro/opensuse/update/11.1
+http://ftp.nux.ipb.pt/pub/dists/opensuse/update/11.1
+http://ftp.ines.lug.ro/opensuse/update/11.1
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/update/11.1
+ftp://ftp.ines.lug.ro/opensuse/update/11.1
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/update/11.1
+http://mirrors.se.eu.kernel.org/opensuse/update/11.1
+http://ftp.df.lth.se/pub/opensuse/update/11.1
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/update/11.1
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/update/11.1
+http://opensuse.ynet.sk/update/11.1
+ftp://mirrors.se.eu.kernel.org/opensuse/update/11.1
+ftp://ftp.df.lth.se/pub/opensuseupdate/11.1
+ftp://less.cogeco.net/openSUSE/update/11.1
+http://www.muug.mb.ca/pub/opensuse/update/11.1
+http://linux.dell.com/repo/community/update/11.1
+http://ftp.osuosl.org/pub/opensuse/update/11.1
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/update/11.1
+http://less.cogeco.net/ftp/openSUSE/update/11.1
+ftp://www.muug.mb.ca/pub/opensuse/update/11.1
+http://suse.mirrors.tds.net/pub/opensuse/update/11.1
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/update/11.1
+ftp://suse.mirrors.tds.net/pub/opensuse/update/11.1
+http://opensuse.fastsoft.net/pub/linux/opensuse/update/11.1
+http://mirror.anl.gov/pub/opensuse/opensuse/update/11.1
+http://mirror.umoss.org/opensuse/update/11.1
+ftp://mirror.anl.gov/pub/opensuse/opensuse/update/11.1
+http://opensuse.cs.utah.edu/update/11.1
+http://mirrors.med.harvard.edu/opensuse/update/11.1
+ftp://ftp.osuosl.org/pub/opensuse/update/11.1
+http://mirrors.xmission.com/opensuse/update/11.1
+ftp://mirrors.xmission.com/opensuse/update/11.1
+ftp://opensuse.cs.utah.edu/pub/opensuse/update/11.1
+http://mirrors1.kernel.org/opensuse/update/11.1
+http://opensuse.ca.unixheads.org/update/11.1
+http://mirror.rackspace.com/openSUSE/update/11.1
+http://130.57.19.201/update/11.1
+http://mirrors2.kernel.org/opensuse/update/11.1
+ftp://mirrors1.kernel.org/opensuse/update/11.1
+ftp://130.57.19.201/pub/opensuse/update/11.1
+ftp://mirrors2.kernel.org/opensuse/update/11.1
+http://ftp.ussg.iu.edu/linux/opensuse/update/11.1
+ftp://mirror.rackspace.com/openSUSE/update/11.1
+http://ftp.utexas.edu/opensuse/update/11.1
+http://www.gtlib.gatech.edu/pub/opensuse/update/11.1
+ftp://mirror.colorado.edu/pub/opensuse/update/11.1
+ftp://ftp.utexas.edu/mirrors/opensuse/update/11.1
+ftp://www.gtlib.gatech.edu/pub/opensuse/update/11.1
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/update/11.1
+http://mirror.cps.cmich.edu/opensuse/opensuse/update/11.1
+ftp://ftp.ussg.iu.edu/linux/opensuse/update/11.1
+http://mirror.nyi.net/opensuse/update/11.1
+ftp://mirror.colorado.edu/pub/opensuse/update/11.1
+http://mirrors.rit.edu/opensuse/update/11.1
+ftp://mirror.nyi.net/opensuseupdate/11.1
+http://ftp.iinet.net.au/pub/opensuse/update/11.1
+http://mirror.internode.on.net/pub/opensuse/update/11.1
+http://mirror.pacific.net.au/linux/opensuse/update/11.1
+ftp://ftp.iinet.net.au/pub/opensuse/update/11.1
+ftp://mirror.internode.on.net/pub/opensuse/update/11.1
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/update/11.1
+http://opensuse.patan.com.ar/update/11.1
+http://opensuse.c3sl.ufpr.br/update/11.1
+http://200.221.9.37/pub/opensuse/update/11.1
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/update/11.1
+ftp://opensuse.c3sl.ufpr.br/opensuse/update/11.1
+http://opensuse.pop.com.br/update/11.1
diff --git a/src/lib/distro-info/suse-11.1/prereqfiles/etc/group b/src/lib/distro-info/suse-11.1/prereqfiles/etc/group
new file mode 100644
index 00000000..505cb221
--- /dev/null
+++ b/src/lib/distro-info/suse-11.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/src/lib/distro-info/suse-11.1/prereqfiles/etc/hosts b/src/lib/distro-info/suse-11.1/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/suse-11.1/prereqfiles/etc/passwd b/src/lib/distro-info/suse-11.1/prereqfiles/etc/passwd
new file mode 100644
index 00000000..9b8fc4fe
--- /dev/null
+++ b/src/lib/distro-info/suse-11.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/src/lib/distro-info/suse-11.1/prereqfiles/etc/shadow b/src/lib/distro-info/suse-11.1/prereqfiles/etc/shadow
new file mode 100644
index 00000000..cd100a5a
--- /dev/null
+++ b/src/lib/distro-info/suse-11.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/src/lib/distro-info/suse-11.1/settings.default b/src/lib/distro-info/suse-11.1/settings.default
new file mode 100644
index 00000000..36e38866
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1/settings.default
@@ -0,0 +1,1126 @@
+bootstrap-packages = <<END
+ i586/aaa_base-11.1-10007.5.i586.rpm
+ i586/audit-libs-1.7.7-5.1.i586.rpm
+ i586/bash-3.2-141.10.i586.rpm
+ i586/boost-license-1.36.0-9.5.i586.rpm
+ i586/bzip2-1.0.5-34.5.i586.rpm
+ i586/ConsoleKit-0.2.10-60.16.i586.rpm
+ i586/coreutils-6.12-32.10.i586.rpm
+ i586/coreutils-lang-6.12-32.10.i586.rpm
+ i586/cpio-2.9-75.35.i586.rpm
+ i586/cpio-lang-2.9-75.35.i586.rpm
+ i586/cracklib-2.8.12-55.1.i586.rpm
+ i586/cracklib-dict-small-2.8.12-55.1.i586.rpm
+ i586/cron-4.1-194.28.i586.rpm
+ i586/cyrus-sasl-2.1.22-182.1.i586.rpm
+ i586/dbus-1-1.2.4-5.1.i586.rpm
+ i586/dbus-1-glib-0.76-32.1.i586.rpm
+ i586/device-mapper-1.02.27-7.1.i586.rpm
+ i586/diffutils-2.8.7-143.9.i586.rpm
+ i586/dhcpcd-3.2.3-44.1.i586.rpm
+ i586/dirmngr-1.0.2-1.39.i586.rpm
+ i586/e2fsprogs-1.41.1-11.9.i586.rpm
+ i586/elfutils-0.137-3.11.i586.rpm
+ i586/file-4.24-43.1.i586.rpm
+ i586/filesystem-11.1-2.3.i586.rpm
+ i586/fillup-1.42-242.8.i586.rpm
+ i586/findutils-4.4.0-38.27.i586.rpm
+ i586/gawk-3.1.6-1.44.i586.rpm
+ i586/gdbm-1.8.3-371.8.i586.rpm
+ i586/glib2-2.18.2-5.1.i586.rpm
+ i586/glib2-lang-2.18.2-5.1.i586.rpm
+ i586/glib2-branding-upstream-2.18.2-5.1.i586.rpm
+ i586/glibc-2.9-2.8.i586.rpm
+ i586/gpg2-2.0.9-25.105.i586.rpm
+ i586/gpg2-lang-2.0.9-25.105.i586.rpm
+ i586/grep-2.5.2-90.28.i586.rpm
+ i586/gzip-1.3.12-68.36.i586.rpm
+ i586/hal-0.5.12-10.1.i586.rpm
+ i586/info-4.12-1.85.i586.rpm
+ i586/insserv-1.12.0-22.15.i586.rpm
+ i586/irqbalance-0.55-120.8.i586.rpm
+ i586/kernel-default-2.6.27.7-9.1.i586.rpm
+ i586/kernel-default-base-2.6.27.7-9.1.i586.rpm
+ i586/keyutils-1.2-107.4.i586.rpm
+ i586/keyutils-libs-1.2-107.4.i586.rpm
+ i586/krb5-1.6.3-132.1.i586.rpm
+ i586/libacl-2.2.47-27.5.i586.rpm
+ i586/libasm1-0.137-3.11.i586.rpm
+ i586/libasound2-1.0.18-8.7.i586.rpm
+ i586/libattr-2.4.39-67.5.i586.rpm
+ i586/libbz2-1-1.0.5-34.5.i586.rpm
+ i586/libblkid1-1.41.1-11.9.i586.rpm
+ i586/libblocxx6-2.1.0.342-120.1.i586.rpm
+ i586/libboost_signals1_36_0-1.36.0-9.5.i586.rpm
+ i586/libcom_err2-1.41.1-11.9.i586.rpm
+ i586/libcurl4-7.19.0-11.1.i586.rpm
+ i586/libdb-4_5-4.5.20-94.17.i586.rpm
+ i586/libdw1-0.137-3.11.i586.rpm
+ i586/libelf1-0.137-3.11.i586.rpm
+ i586/libext2fs2-1.41.1-11.9.i586.rpm
+ i586/libexpat1-2.0.1-88.10.i586.rpm
+ i586/libgcc43-4.3.3_20081022-9.5.i586.rpm
+ i586/libgcrypt11-1.4.1-4.1.i586.rpm
+ i586/libglib-2_0-0-2.18.2-5.1.i586.rpm
+ i586/libgobject-2_0-0-2.18.2-5.1.i586.rpm
+ i586/libgpg-error0-1.6-6.10.i586.rpm
+ i586/libgthread-2_0-0-2.18.2-5.1.i586.rpm
+ i586/libidn-1.10-2.14.i586.rpm
+ i586/libksba-1.0.4-1.17.i586.rpm
+ i586/libldap-2_4-2-2.4.12-5.3.i586.rpm
+ i586/libncurses5-5.6-89.10.i586.rpm
+ i586/libncurses6-5.6-89.10.i586.rpm
+ i586/libnscd-2.0.2-72.47.i586.rpm
+ i586/libopenssl0_9_8-0.9.8h-28.4.i586.rpm
+ i586/libpt2-2.4.2-2.19.i586.rpm
+ i586/libreadline5-5.2-141.10.i586.rpm
+ i586/libreiserfs-0.3.0.5-107.47.i586.rpm
+ i586/libselinux1-2.0.71-3.38.i586.rpm
+ i586/libsepol1-2.0.32-5.38.i586.rpm
+ i586/libsmbios2-2.0.2-10.9.i586.rpm
+ i586/libstdc++43-4.3.3_20081022-9.5.i586.rpm
+ i586/libusb-0_1-4-0.1.12-136.10.i586.rpm
+ i586/libusb-1_0-0-0.9.3-4.20.i586.rpm
+ i586/libuuid1-1.41.1-11.9.i586.rpm
+ i586/libvolume_id-126-17.25.i586.rpm
+ i586/libvolume_id1-128-9.3.i586.rpm
+ i586/libxcrypt-3.0.1-25.20.i586.rpm
+ i586/libxml2-2.7.1-9.1.i586.rpm
+ i586/libzio-0.9-4.19.i586.rpm
+ i586/limal-1.5.1-1.12.i586.rpm
+ i586/limal-perl-1.5.1-1.12.i586.rpm
+ i586/login-3.37-1.5.i586.rpm
+ i586/logrotate-3.7.7-9.11.i586.rpm
+ i586/m4-1.4.12-1.13.i586.rpm
+ i586/metamail-2.7.19-1244.29.i586.rpm
+ i586/mingetty-1.0.7s-70.41.i586.rpm
+ i586/mkinitrd-2.4-34.1.i586.rpm
+ i586/module-init-tools-3.4-56.5.i586.rpm
+ i586/ncurses-utils-5.6-89.10.i586.rpm
+ i586/net-tools-1.60-725.5.i586.rpm
+ i586/openldap2-client-2.4.12-5.3.i586.rpm
+ i586/openslp-1.2.0-168.6.i586.rpm
+ i586/openssl-0.9.8h-28.4.i586.rpm
+ i586/openSUSE-release-11.1-1.19.i586.rpm
+ i586/openSUSE-release-ftp-11.1-1.19.i586.rpm
+ i586/pam-1.0.2-13.3.i586.rpm
+ i586/pam-config-0.68-1.3.i586.rpm
+ i586/pam-modules-11.1-5.1.i586.rpm
+ i586/parted-1.8.8-91.5.i586.rpm
+ i586/pciutils-3.0.1-1.26.i586.rpm
+ i586/pcre-7.8-1.26.i586.rpm
+ i586/perl-5.10.0-62.10.i586.rpm
+ i586/perl-base-5.10.0-62.10.i586.rpm
+ i586/perl-Bootloader-0.4.81-1.1.i586.rpm
+ i586/perl-gettext-1.05-91.163.i586.rpm
+ i586/permissions-2008.11.25-1.5.i586.rpm
+ i586/pinentry-0.7.5-61.14.i586.rpm
+ i586/pm-utils-0.99.4.20071229-10.3.i586.rpm
+ i586/pmtools-20071116-44.3.i586.rpm
+ i586/PolicyKit-0.9-13.9.i586.rpm
+ i586/popt-1.7-20.1.i586.rpm
+ i586/postfix-2.5.5-6.7.i586.rpm
+ i586/procmail-3.22-238.15.i586.rpm
+ i586/procps-3.2.7-147.11.i586.rpm
+ i586/psmisc-22.6-61.14.i586.rpm
+ i586/pth-2.0.7-102.29.i586.rpm
+ i586/pwdutils-3.2.2-2.8.i586.rpm
+ i586/reiserfs-3.6.19-116.62.i586.rpm
+ i586/rmail-8.14.3-50.9.i586.rpm
+ i586/rpm-4.4.2.3-20.1.i586.rpm
+ i586/satsolver-tools-0.13.0-3.3.i586.rpm
+ i586/SDL-1.2.13-104.1.i586.rpm
+ i586/sed-4.1.5-85.60.i586.rpm
+ i586/setserial-2.17-716.20.i586.rpm
+ i586/sharutils-4.6.3-3.100.i586.rpm
+ i586/sysvinit-2.86-186.7.i586.rpm
+ i586/tcpd-7.6-855.11.i586.rpm
+ i586/tcsh-6.15.00-93.3.i586.rpm
+ i586/terminfo-base-5.6-89.10.i586.rpm
+ i586/udev-128-9.3.i586.rpm
+ i586/util-linux-2.14.1-10.1.i586.rpm
+ i586/util-linux-lang-2.14.1-10.1.i586.rpm
+ i586/uucp-1.07-50.7.i586.rpm
+ i586/uuid-runtime-1.41.1-11.9.i586.rpm
+ i586/zlib-1.2.3-104.137.i586.rpm
+ noarch/netcfg-11.1-1.14.noarch.rpm
+ noarch/pciutils-ids-2008.11.26-2.4.noarch.rpm
+ noarch/suse-build-key-1.0-907.32.noarch.rpm
+END
+<metapackager zypper>
+ packages = <<END
+ i586/libzypp-5.24.5-1.1.i586.rpm
+ i586/zypper-1.0.2-1.5.i586.rpm
+ END
+</metapackager>
+<metapackager smart>
+ packages = <<END
+ i586/python-2.6.0-2.16.i586.rpm
+ i586/python-xml-2.6.0-2.12.i586.rpm
+ i586/rpm-python-4.4.2.3-20.1.i586.rpm
+ END
+</metapackager>
+<metapackager yum>
+ packages = <<END
+ i586/glib2-2.18.2-4.3.i586.rpm
+ i586/libxml2-2.7.1-8.3.i586.rpm
+ i586/libxml2-python-2.7.1-9.1.i586.rpm
+ i586/python-2.6.0-2.16.i586.rpm
+ i586/python-urlgrabber-3.1.0-178.8.i586.rpm
+ i586/python-xml-2.6.0-2.12.i586.rpm
+ i586/rpm-python-4.4.2.3-20.1.i586.rpm
+ i586/sqlite3-3.6.4-1.8.i586.rpm
+ i586/yum-metadata-parser-1.1.2-107.22.i586.rpm
+ END
+</metapackager>
+package-subdir = suse
+prereq-packages = <<END
+ i586/bzip2-1.0.5-34.5.i586.rpm
+ i586/glibc-2.9-2.8.i586.rpm
+ i586/libselinux1-2.0.71-3.38.i586.rpm
+ i586/libbz2-1-1.0.5-34.5.i586.rpm
+ i586/popt-1.7-20.1.i586.rpm
+ i586/rpm-4.4.2.3-20.1.i586.rpm
+ i586/zlib-1.2.3-104.137.i586.rpm
+END
+<repository base>
+ name = openSUSE 11.1
+ repo-subdir = suse
+ file-for-speedtest = suse/setup/descr/packages.en.gz
+</repository>
+<repository base_non-oss>
+ name = openSUSE 11.1 non-OSS
+ file-for-speedtest = suse/setup/descr/packages.en.gz
+</repository>
+<repository base_update>
+ name = openSUSE 11.1 updates
+ file-for-speedtest = repodata/primary.xml.gz
+</repository>
+<selection minimal>
+ packages = <<END
+ glibc-locale
+ END
+</selection>
+<selection textmode>
+ base = minimal
+ packages = <<END
+ acl
+ acpid
+ apparmor-docs
+ apparmor-parser
+ apparmor-profiles
+ apparmor-utils
+ ash
+ at
+ atk
+ attr
+ audit
+ autofs bc
+ bind-libs
+ bind-utils
+ binutils
+ blktrace
+ bundle-lang-common-en
+ cdrkit-cdrtools-compat
+ compat compat-openssl097g
+ cpufrequtils
+ cyrus-sasl-saslauthd
+ db-utils
+ deltarpm
+ dmraid
+ dos2unix
+ dosfstools
+ ed
+ eject
+ ethtool
+ fbset
+ fontconfig
+ freetype2
+ gdb
+ genisoimage
+ glibc-i18ndata
+ gnutls
+ gpm
+ groff
+ hfsutils
+ icedax
+ ifplugd
+ initviocons
+ inst-source-utils
+ iproute2
+ iputils
+ joe
+ kbd
+ klogd
+ kpartx
+ ksh
+ ksymoops
+ lcms
+ less
+ libaio
+ libapparmor1
+ libart_lgpl
+ libatk-1_0-0
+ libcap1
+ libcap2
+ libdrm
+ libevent-1_4-2
+ libgimpprint
+ libgmodule-2_0-0
+ libgnutls26
+ libgssglue1
+ libicu
+ libjpeg
+ liblazy1
+ liblcms1
+ libltdl3
+ libltdl7
+ liblzo2-2
+ libmng
+ libnet
+ libopencdk10
+ libopenct1
+ libopensc2
+ libpcap0
+ libpng12-0
+ libpython2_6-1_0
+ librpcsecgss
+ libsensors3
+ libsensors4
+ libsnmp15
+ libsqlite3-0
+ libtiff3
+ libtirpc1
+ licenses
+ lukemftp
+ lvm2
+ mailx
+ man
+ man-pages
+ microcode_ctl
+ multipath-tools
+ nbd
+ net-snmp
+ nfs-client
+ nfs-kernel-server
+ nfsidmap
+ nscd
+ ntfsprogs
+ ntp
+ openct
+ opensc
+ openssh
+ patch
+ pax
+ pcsc-lite
+ perl-Crypt-SmbHash
+ perl-DBD-SQLite
+ perl-DBI
+ perl-Digest-MD4
+ perl-File-Tail
+ perl-HTML-Parser
+ perl-HTML-Tagset
+ perl-Net-Daemon
+ perl-PlRPC
+ perl-RPC-XML
+ perl-SNMP
+ perl-TermReadKey
+ perl-TimeDate
+ perl-URI
+ perl-XML-Parser
+ perl-XML-Writer
+ perl-libapparmor
+ perl-libwww-perl
+ ppp
+ preload
+ procinfo
+ providers
+ qlogic-firmware
+ recode
+ rpcbind
+ rsync
+ sash
+ screen
+ sensors
+ sg3_utils
+ smartmontools
+ smpppd
+ snmp-mibs
+ sqlite3
+ strace
+ sudo
+ sysconfig
+ sysfsutils
+ syslog-ng
+ tcpdump
+ telnet
+ terminfo
+ timezone
+ ulimit
+ usbutils
+ utempter
+ vim
+ vim-base
+ vim-data
+ wdiff
+ wget
+ wireless-tools
+ wodim
+ wvstreams
+ xfsprogs
+ xinetd
+ yp-tools
+ ypbind
+ zip
+ zisofs-tools
+ zsh
+ END
+</selection>
+<selection kde>
+ base = textmode
+ packages = <<END
+ 3ddiag
+ a2ps
+ aalib
+ alsa
+ alsa-utils
+ amarok
+ amarok-libvisual
+ amarok-xine
+ arts
+ aspell
+ aspell-de
+ aspell-en
+ audiofile
+ autoyast2
+ autoyast2-installation
+ bluez
+ bootsplash
+ bootsplash-branding-openSUSE
+ branding-openSUSE
+ bundle-lang-gnome-en
+ bundle-lang-kde-en
+ cabextract
+ cairo
+ cdparanoia
+ cdrdao
+ check
+ checkmedia
+ chmlib
+ chromium
+ clucene-core
+ compiz
+ compiz-branding-openSUSE
+ compiz-kde4
+ cpp
+ cpp41
+ cpp43
+ cryptsetup
+ Crystalcursors
+ cups
+ cups-client
+ cups-drivers
+ cups-libs
+ curl
+ cyrus-sasl-crammd5
+ cyrus-sasl-digestmd5
+ cyrus-sasl-plain
+ dbus-1-mono
+ dbus-1-python
+ dbus-1-qt3
+ dbus-1-x11
+ dcraw
+ dejavu
+ desktop-data-openSUSE
+ desktop-data-openSUSE-extra-gnome
+ desktop-file-utils
+ dhcp
+ dhcp-client
+ dialog
+ digikam
+ digikamimageplugins
+ DirectFB
+ dnsmasq
+ dvd+rw-tools
+ eel
+ efont-unicode
+ enchant
+ enscript
+ evolution-data-server
+ exiftool
+ expat
+ fam
+ fftw3
+ fileshareset
+ FirmwareUpdateKit
+ flac
+ fonts-config
+ foomatic-filters
+ freealut
+ freeglut
+ freetype
+ fribidi
+ frozen-bubble
+ frozen-bubble-server
+ ft2demos
+ fvwm2
+ gcc-gij
+ gcc41-gij
+ gcc43-gij
+ gconf2
+ gconf2-branding-openSUSE
+ gettext-runtime
+ gfxboot
+ gfxboot-branding-openSUSE
+ ggz
+ ggz-client-libs
+ ghostscript-fonts-other
+ ghostscript-fonts-std
+ ghostscript-library
+ ghostscript-omni
+ ghostscript-x11
+ giflib
+ gimp
+ gimp-branding-openSUSE
+ gimp-help
+ gimp-plugins-python
+ gle
+ glib
+ glib-sharp2
+ glibc-locale
+ glitz
+ gltt
+ gmime
+ gmp
+ gnokii
+ gpart
+ gpgme
+ GraphicsMagick
+ grub
+ gsf-sharp
+ gstreamer-0_10
+ gstreamer-0_10-plugins-base
+ gtk
+ gtk-sharp2
+ gtk2
+ gtk2-branding-openSUSE
+ gtk2-engines
+ gtk2-theme-openSUSE
+ gtksourceview
+ gutenprint
+ gvfs
+ gwenview
+ gwenview-lang
+ hal-palm
+ hdparm
+ hicolor-icon-theme
+ hplip
+ hplip-hpijs
+ htdig
+ hunspell
+ hwinfo
+ icewm
+ icewm-default
+ id3lib
+ ifnteuro
+ IlmBase
+ ImageMagick
+ imlib
+ imlib2
+ imlib2-loaders
+ info2html
+ intlfnts
+ iptables
+ ispell
+ ispell-american
+ ispell-german
+ ispell-ngerman
+ jack
+ jfsutils
+ jpackage-utils
+ jpeg
+ k3b
+ kaffeine
+ kde-susetranslations
+ kde3-i18n-de
+ kde4-ark
+ kde4-filesystem
+ kde4-kdm
+ kde4-kdm-branding-openSUSE
+ kde4-kget
+ kde4-kgreeter-plugins
+ kde4-kmix
+ kde4-knewsticker
+ kde4-konqueror
+ kde4-konqueror-plugins
+ kde4-kopete
+ kde4-kpat
+ kde4-krdc
+ kde4-kscd
+ kde4-ksudoku
+ kde4-kwin
+ kde4-okular
+ kde4-plasma-addons
+ kdeaddons3-kicker
+ kdeartwork3-kscreensaver
+ kdeartwork3-xscreensaver
+ kdebase3
+ kdebase3-nsplugin
+ kdebase3-runtime
+ kdebase3-samba
+ kdebase3-session
+ kdebase3-SuSE
+ kdebase3-SuSE-branding-openSUSE
+ kdebase3-SuSE-lang
+ kdebase4-openSUSE
+ kdebase4-runtime
+ kdebase4-workspace
+ kdebase4-workspace-branding-openSUSE
+ kdebase4-workspace-ksysguardd
+ kdebluetooth
+ kdebluetooth-lang
+ kdegames4-carddecks-default
+ kdegraphics3
+ kdegraphics3-kamera
+ kdegraphics3-scan
+ kdelibs3
+ kdelibs3-default-style
+ kdelibs3-doc
+ kdelibs4
+ kdelibs4-core
+ kdemultimedia3
+ kdepim3
+ kdepim3-kpilot
+ kdepim3-notes
+ kdepimlibs4
+ kdetv
+ kdetv-lang
+ kio_ipodslave
+ kio_iso
+ kio_slp
+ kio_sysinfo
+ kipi-plugins
+ kitchensync
+ knights
+ koffice
+ koffice-i18n-de
+ koffice-i18n-de-doc
+ koffice-illustration
+ konversation
+ kpowersave
+ kpowersave-lang
+ krecord
+ krename
+ krusader
+ ktorrent
+ kwin-decor-suse2
+ lbreakout
+ libakode
+ libakonadi4
+ libakonadiprotocolinternals1
+ libao
+ libarchive2
+ libavahi-client3
+ libavahi-common3
+ libavahi-glib1
+ libbabl-0_0-0
+ libbeagle1
+ libbluetooth3
+ libbonobo
+ libbonoboui
+ libcanberra-gtk
+ libcanberra-gtk0
+ libcanberra0
+ libcroco
+ libcroco-0_6-3
+ libcryptsetup0
+ libdbus-1-qt3-0
+ libdjvulibre21
+ libdns_sd
+ libdvdread4
+ libeel-2-2
+ libenchant1
+ libesd0
+ libevoldap-2_4-2
+ libexempi3
+ libexif
+ libexiv2-4
+ libFLAC++6
+ libFLAC8
+ libflashsupport
+ libfuse2
+ libgcj41
+ libgcj43
+ libgegl-0_0-0
+ libggz2
+ libgio-2_0-0
+ libgio-fam
+ libglade2
+ libgmime-2_0-3
+ libgnome
+ libgnome-desktop-2-7
+ libgnome-menu2
+ libgnomecanvas
+ libgnomecups
+ libgnomekbd
+ libgnomeprint
+ libgnomeprintui
+ libgnomesu
+ libgnomesu0
+ libgnomeui
+ libgomp43
+ libgpgme11
+ libgphoto2
+ libgpod-tools
+ libgpod3
+ libGraphicsMagick2
+ libgsf
+ libgsf-1-114
+ libgsf-gnome
+ libgssglue-devel
+ libgstinterfaces-0_10-0
+ libgstreamer-0_10-0
+ libgtkhtml
+ libgtkimageview0
+ libgtksourceview-2_0-0
+ libgtop
+ libgtop-2_0-7
+ libgvfscommon0
+ libgweather
+ libgweather1
+ libical0
+ libidl
+ libieee1284
+ libjack0
+ libjasper
+ libkcal
+ libkcal2
+ libkcddb4
+ libkcompactdisc4
+ libkdcraw3
+ libkde4
+ libkdecore4
+ libkdegames4
+ libkdepimlibs4
+ libkexiv2-3
+ libkipi0
+ libkmime2
+ libkonq5
+ libktnef1
+ libldapcpp1
+ liblpsolve55
+ liblua5_1
+ libMagick++1
+ libMagickCore1
+ libMagickWand1
+ libmal
+ libmikmod
+ libmpcdec5
+ libmpfr1
+ libmtp8
+ libmusicbrainz4
+ libneon27
+ libnetpbm10
+ libnjb
+ libnjb5
+ libnl
+ libnsssharedhelper0
+ libofa0
+ libogg0
+ liboil
+ libopensync
+ libopensync-plugin-file
+ libopensync-plugin-gnokii
+ libopensync-plugin-gpe
+ libopensync-plugin-irmc
+ libopensync-plugin-kdepim
+ libopensync-plugin-opie
+ libopensync-plugin-palm
+ libopensync-plugin-sunbird
+ libopensync-plugin-syncml
+ libopensync-tools
+ libotr2
+ libphonon4
+ libpisock9
+ libpoppler-glib4
+ libpoppler-qt2
+ libpoppler-qt4-3
+ libpoppler4
+ libpulse0
+ libpulsecore4
+ libqca2
+ libqimageblitz4
+ libqscintilla2-4
+ libqt4
+ libqt4-qt3support
+ libqt4-sql
+ libqt4-sql-unixODBC
+ libqt4-x11
+ libqtpod0
+ libQtWebKit4
+ libraptor1
+ librasqal1
+ libredland0
+ librsvg
+ libsamplerate
+ libsmbclient0
+ libsndfile
+ libsoprano4
+ libsoup
+ libsoup-2_4-1
+ libspectre1
+ libspeex
+ libstrigi0
+ libstroke
+ libsyncml0
+ libtalloc1
+ libtasn1
+ libtasn1-3
+ libtdb1
+ libtheora0
+ libtunepimp
+ libtunepimp5
+ libvisual
+ libvisual-plugins
+ libVNCServer
+ libvorbis
+ libwbclient0
+ libwbxml2-0
+ libwebkit-1_0-1
+ libwmf
+ libwnck
+ libwnck-1-22
+ libwpd-0_8-8
+ libwpg-0_1-1
+ libwps-0_1-1
+ libx86
+ libxine1
+ libxine1-gnome-vfs
+ libxine1-pulse
+ libxklavier
+ libxklavier12
+ libxml2-python
+ libxslt
+ libzip1
+ libzvbi0
+ limal-ca-mgm
+ limal-ca-mgm-perl
+ limal-nfs-server
+ limal-nfs-server-perl
+ lsb
+ lsof
+ make
+ manufacturer-PPDs
+ master-boot-code
+ mdadm
+ mesa
+ metacity
+ misc-console-font
+ modemManager
+ mono-core
+ mono-data
+ mono-data-sqlite
+ mono-web
+ mono-winforms
+ mozilla-nspr
+ mozilla-nss
+ mozilla-xulrunner181
+ mozilla-xulrunner190
+ mozilla-xulrunner190-gnomevfs
+ mozilla-xulrunner190-translations
+ mozillaFirefox
+ mozillaFirefox-branding-openSUSE
+ mozillaFirefox-translations
+ mtools
+ myspell-american
+ myspell-german
+ nautilus
+ neon
+ netcat
+ netpbm
+ networkManager
+ networkManager-glib
+ networkManager-kde
+ numlockx
+ obexftp
+ ocrad
+ openal
+ OpenEXR
+ openobex
+ OpenOffice_org
+ OpenOffice_org-base
+ OpenOffice_org-branding-openSUSE
+ OpenOffice_org-calc
+ OpenOffice_org-components
+ OpenOffice_org-draw
+ OpenOffice_org-filters
+ OpenOffice_org-filters-optional
+ OpenOffice_org-help-de
+ OpenOffice_org-help-en-US
+ OpenOffice_org-icon-themes
+ OpenOffice_org-impress
+ OpenOffice_org-kde
+ OpenOffice_org-l10n-de
+ OpenOffice_org-l10n-extras
+ OpenOffice_org-libs-core
+ OpenOffice_org-libs-extern
+ OpenOffice_org-libs-gui
+ OpenOffice_org-mailmerge
+ OpenOffice_org-math
+ OpenOffice_org-pyuno
+ OpenOffice_org-Quickstarter
+ OpenOffice_org-templates-en
+ OpenOffice_org-templates-labels-a4
+ OpenOffice_org-templates-labels-letter
+ OpenOffice_org-templates-presentation-layouts
+ OpenOffice_org-thesaurus-en
+ OpenOffice_org-ure
+ OpenOffice_org-writer
+ openssh-askpass
+ opensuse-codecs-installer
+ opensuse-manual_de
+ opensuse-manual_en
+ opensuse-manual_en-pdf
+ opt_gnome-compat
+ orbit2
+ oxygen-icon-theme
+ pango
+ perl-Config-Crontab
+ perl-Crypt-SSLeay
+ perl-Digest-HMAC
+ perl-Digest-SHA1
+ perl-IO-Socket-SSL
+ perl-Net-DNS
+ perl-Net-IP
+ perl-Net-SSLeay
+ perl-NetxAP
+ perl-Parse-RecDescent
+ perl-spamassassin
+ perl-X500-DN
+ perl-XML-LibXML
+ perl-XML-LibXML-Common
+ perl-XML-NamespaceSupport
+ perl-XML-SAX
+ perl-XML-Simple
+ phalanx
+ phonon
+ phonon-backend-gstreamer-0_10
+ pilot-link
+ pinentry-qt
+ pkg-config
+ plasma-theme-aya
+ pm-profiler
+ PolicyKit-gnome-libs
+ powerdevil
+ pptp
+ pulseaudio
+ pulseaudio-esound-compat
+ python
+ python-base
+ python-cairo
+ python-gobject2
+ python-gtk
+ python-numeric
+ python-qt
+ python-qt4
+ python-ReportLab
+ python-sip
+ python-xml
+ pyxml
+ qca
+ qt3
+ qtcurve-gtk2
+ rdesktop
+ release-notes-openSUSE
+ rrdtool
+ ruby
+ sane-backends
+ sane-backends-autoconfig
+ sane-frontends
+ sax2
+ sax2-gui
+ sax2-ident
+ sax2-libsax
+ sax2-libsax-perl
+ sax2-tools
+ scpm
+ SDL_image
+ SDL_mixer
+ SDL_net
+ SDL_Pango
+ SDL_perl
+ SDL_ttf
+ sgml-skel
+ shared-mime-info
+ soprano
+ sound-theme-freedesktop
+ spamassassin
+ speex
+ splashy
+ splashy-branding-openSUSE
+ sqlite2
+ startup-notification
+ strigi
+ SuSEfirewall2
+ susehelp
+ susehelp_de
+ susehelp_en
+ suseRegister
+ syslinux
+ taglib
+ tango-icon-theme
+ tar
+ tcl
+ tightvnc
+ tk
+ ufraw
+ ufraw-gimp
+ unclutter
+ unixODBC
+ unzip
+ usb_modeswitch
+ v4l-conf
+ w3m
+ wbxml2
+ words
+ wpa_supplicant
+ wv
+ wvdial
+ x11-input-synaptics
+ x11-input-wacom
+ x11-tools
+ xalan-j2
+ xaw3d
+ xdg-menu
+ xdg-utils
+ xdmbgrd
+ xerces-j2
+ xerces-j2-xml-apis
+ xkeyboard-config
+ xli
+ xlockmore
+ xorg-x11
+ xorg-x11-driver-input
+ xorg-x11-driver-video
+ xorg-x11-driver-video-radeonhd
+ xorg-x11-driver-video-unichrome
+ xorg-x11-fonts
+ xorg-x11-fonts-core
+ xorg-x11-libfontenc
+ xorg-x11-libICE
+ xorg-x11-libs
+ xorg-x11-libSM
+ xorg-x11-libX11
+ xorg-x11-libX11-ccache
+ xorg-x11-libXau
+ xorg-x11-libxcb
+ xorg-x11-libXdmcp
+ xorg-x11-libXext
+ xorg-x11-libXfixes
+ xorg-x11-libxkbfile
+ xorg-x11-libXmu
+ xorg-x11-libXp
+ xorg-x11-libXpm
+ xorg-x11-libXprintUtil
+ xorg-x11-libXrender
+ xorg-x11-libXt
+ xorg-x11-libXv
+ xorg-x11-server
+ xorg-x11-xauth
+ xorg-x11-Xvnc
+ xpdf-tools
+ xscreensaver
+ xterm
+ xtermset
+ yakuake
+ yast2
+ yast2-apparmor
+ yast2-backup
+ yast2-bootloader
+ yast2-branding-openSUSE
+ yast2-control-center
+ yast2-control-center-gnome
+ yast2-control-center-qt
+ yast2-core
+ yast2-country
+ yast2-country-data
+ yast2-firewall
+ yast2-gtk
+ yast2-hardware-detection
+ yast2-inetd
+ yast2-installation
+ yast2-irda
+ yast2-iscsi-client
+ yast2-kerberos-client
+ yast2-ldap
+ yast2-ldap-client
+ yast2-libyui
+ yast2-mail
+ yast2-mouse
+ yast2-ncurses
+ yast2-network
+ yast2-nfs-client
+ yast2-nfs-common
+ yast2-nis-client
+ yast2-ntp-client
+ yast2-online-update
+ yast2-online-update-frontend
+ yast2-packager
+ yast2-pam
+ yast2-perl-bindings
+ yast2-pkg-bindings
+ yast2-power-management
+ yast2-printer
+ yast2-profile-manager
+ yast2-qt
+ yast2-registration
+ yast2-registration-branding-openSUSE
+ yast2-repair
+ yast2-restore
+ yast2-runlevel
+ yast2-samba-client
+ yast2-samba-server
+ yast2-scanner
+ yast2-schema
+ yast2-security
+ yast2-slp
+ yast2-sound
+ yast2-storage
+ yast2-storage-lib
+ yast2-sudo
+ yast2-support
+ yast2-sysconfig
+ yast2-theme-openSUSE
+ yast2-trans-de
+ yast2-trans-stats
+ yast2-transfer
+ yast2-tune
+ yast2-tv
+ yast2-update
+ yast2-users
+ yast2-x11
+ yast2-xml
+ yast2-ycp-ui-bindings
+ zvbi
+ END
+</selection>
+<selection kde-additional>
+ base = kde
+ packages = <<END
+ cm_gtk
+ flash-player
+ java-1_5_0-gcj-compat
+ java-1_5_0-sun
+ java-1_5_0-sun-plugin
+ suspend
+ END
+</selection>
+<selection gnome>
+ base = textmode
+ packages = <<END
+ END
+</selection>
+<selection default>
+ base = minimal
+</selection>
+
diff --git a/src/lib/distro-info/suse-11.1/settings.example b/src/lib/distro-info/suse-11.1/settings.example
new file mode 100644
index 00000000..e57cb43b
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1/settings.example
@@ -0,0 +1,23 @@
+# rename this file to 'settings' and edit it as you please
+#
+# for a list of all options, have a look at the corresponding
+# settings.default in /opt/openslx/share/distro-info
+
+# use local installation source
+#<repository base>
+# local-url = /srv/ftp/pub/opensuse/distribution/11.1/repo/oss
+#</repository>
+#<repository base_non-oss>
+# local-url = /srv/ftp/pub/opensuse/distribution/11.1/repo/non-oss
+#</repository>
+#<repository base_update>
+# local-url = /srv/ftp/pub/suse/update/11.1
+#</repository>
+
+# add a new selection:
+#<selection my_kde>
+# base = kde
+# packages = <<END
+# kinternet
+# END
+#</selection>
diff --git a/src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc b/src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc
new file mode 100644
index 00000000..ac75d62a
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc
@@ -0,0 +1,17 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (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/src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc b/src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc
new file mode 100644
index 00000000..57a9078a
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc
@@ -0,0 +1,13 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+mIsERCAdXQEEAL7MrBTz+3SBWpCm2ae2yaDqV3ezQcs2JlvqidJVhsZqQe9/jkxi
+KTEQW5+TXF/+BlQSiebunRI7oo3+9U8GyRCgs1sf+yRQWMLzZqRaarzRhw9w+Ihl
+edtqYl6/U2JZCb8Adp6d7RzlRliJdJ/VtsfXj2ef7Dwu7elOVSsmaBdtAAYptChT
+dVNFIFBhY2thZ2UgU2lnbmluZyBLZXkgPGJ1aWxkQHN1c2UuZGU+iLgEEwECACIC
+GwMECwcDAgMVAgMDFgIBAh4BAheABQJIHzCqBQkHwXpNAAoJEOOlw2Awfj1UvWgE
+AIRoxE8S6jQB7S43SVcX06FHJeUJ/m+1ErIj9LwJTYrR/8qsDjTgrttgb+nBHkIj
+NhCCLAuR8sWj3CxsUMH2fayryNnwZEWGqnzo7Jtt4R1Ur3h5pHYonFjfoJyFUZjJ
+7Mhw7/TuOWx20FrzqBi8tbHx8pd7Fa5lCUgopVtMh6GR
+=R56j
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc b/src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc
new file mode 100644
index 00000000..80380d2f
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc
@@ -0,0 +1,30 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (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/src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-3dbdc284-49144c3f.asc b/src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-3dbdc284-49144c3f.asc
new file mode 100644
index 00000000..aaec909b
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-3dbdc284-49144c3f.asc
@@ -0,0 +1,19 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+mQENBEkUTD8BCADWLy5d5IpJedHQQSXkC1VK/oAZlJEeBVpSZjMCn8LiHaI9Wq3G
+3Vp6wvsP1b3kssJGzVFNctdXt5tjvOLxvrEfRJuGfqHTKILByqLzkeyWawbFNfSQ
+93/8OunfSTXC1Sx3hgsNXQuOrNVKrDAQUqT620/jj94xNIg09bLSxsjN6EeTvyiO
+mtE9H1J03o9tY6meNL/gcQhxBvwuo205np0JojYBP0pOfN8l9hnIOLkA0yu4ZXig
+oKOVmf4iTjX4NImIWldT+UaWTO18NWcCrujtgHueytwYLBNV5N0oJIP2VYuLZfSD
+VYuPllv7c6O2UEOXJsdbQaVuzU1HLocDyipnABEBAAG0NG9wZW5TVVNFIFByb2pl
+Y3QgU2lnbmluZyBLZXkgPG9wZW5zdXNlQG9wZW5zdXNlLm9yZz6JATwEEwECACYF
+AkkUTD8CGwMFCQPCZwAGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRC4iy/UPb3C
+hIE9B/9DUwwQ5c+8xW0x2Fli5Yn1P+4Wq3nmB+ZTpM5Q1a7A2l+HhpUBsnwx2e/4
+RuXlJ06uYby8UpXCli44jXFepJgiXp7ZRPX5A06aY9Pz0wawsMtYQS716+vSV3e3
+ynZmTGKxj8Z94TEVcEjMP1/XpjW22DcpItRJX2VCW7lUXDmRfQzBEolcfwlF7a1B
+VcSqGZX8JvuTocLX/+fYBhZYQvERw6PUVGoEskMXMoRg6PqWMesW9Bq3cm8oeBa2
+4YmGLkN2ztBIbqRMSv0binKcddHHvRlxVFRXrnnlXrEPKrx9Fbu4vkqrG+EKE6+v
+GO73ROyEcJuuoJTYsKPx6Uic5gRl
+=guZP
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-56b4177a-47965b33.asc b/src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-56b4177a-47965b33.asc
new file mode 100644
index 00000000..f0bb55a3
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-56b4177a-47965b33.asc
@@ -0,0 +1,19 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+mQGiBEeWWzMRBADU8l2IckSzgdUS1dn0WMM7wXK4seoFsHHQw/0unHCQCxpyDMnn
+TKV86p5KTbR1FDdeaZlY0yCV+IGsiIxLyuUdJn8vuA5gA5ZkUr89/HtWaeZVl77J
+HIQxvhDRBWCOO4QNtrZYWvGbvl83wl/zOfdLEs8IGElt0LgfohyTA1qfrwCg/Hac
+tDDscXsPlo5Jek/+3RHVeD0D/30riCpfpLJOmhraLg1EbWsE0mN9IQsl+WDPdoYo
+bB76z6eH3e38618WzP/LTG4WuVbwpSSqmXyfdVpXxWzESfT8q0B8CGpHf/Sa/T/L
+emohmRnLvkf/tAfxFmDMm1jOewJIE9S35jANGHVJcxmfRNpPWC7uHnqjopnsmDkL
+kMEdBAC6YcpDOcMJZ9sJbt/JNZBaoT5CltgMDlSN50t2v/J5em8qMLqCSNF5UJyd
+LFnePHTHy6gVjWbqcC0ncFzOqM1y644Up7BoKSAr1hRTl6Mw9S3UfZZZ0al3JtWt
+8y0eFIW3QP66w1AL0LO2bZMBuOvhb63DXv5iHorcxk0yIFbbybRCb3BlblNVU0U6
+RmFjdG9yeSBPQlMgUHJvamVjdCA8b3BlblNVU0U6RmFjdG9yeUBidWlsZC5vcGVu
+c3VzZS5vcmc+iGYEExECACYFAkeWWzMCGwMFCQQesAAGCwkIBwMCBBUCCAMEFgID
+AQIeAQIXgAAKCRAcchwkVrQXevBsAKCOeScnlH2fWVBJGHTOVJ3M4yBqDACbBeNk
+PuWo05AOQ3M1dLE1hkN36G+IRgQTEQIABgUCR5ZbMwAKCRA7MBG3a51lI7PfAKCc
+9ZtKfI5G/g66V7pSMXh9gi+ykgCgivPfGMDh9HIROwBIudo2qGImOqI=
+=htdw
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc b/src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc
new file mode 100644
index 00000000..74ff59e0
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc
@@ -0,0 +1,20 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+mQGiBER0iroRBADfqUeJmPCXqPJFnf3CVKy40dL1F+gfvP+JHN7/uu4c9+oCYjI1
+uAE8iGTm/Twb/Zzbs4dt0iWjhNFXbRi42rMww4d/8QcPYZ21WSehh+fv8nCjt2sw
+LeC87ar2SR8OTpJBK0fQlcd4e6H5GMntfI6SYEUOPd8m/eQ+4+1AxpUUpwCgswaF
+13fePZGI//pDn5tGjbvmaP8D/R3qum/I+oDS8lbFeeDS10GkEkwTYec13gdfsq6I
+yzIj7VBsC+rGfbipv+VGR61Q4d19pOHKLDekr9OG+3G4ZcYM4NQvQZR+QIlp3xWu
+nBmYD1LRkHLVj+Z4DGQhjjOffkPSuacKPymMaZ/aRiLgTIAo97W2YPhutscXrLSG
+2Y+BA/4jsyaDb7kbW4wc8RtPIcuFEheVqgBeRakP9Uj47kBMBEpPtI/mIdY5liKk
+ztKnuQG6ROYLNV/PW0ZbE1uT64C710weh4cB3PnZLV5P10deDLBjHk8MJQGCTSDD
+JYvhutUzQfshAU6j2kErGvKdZxWGezab34vFyMP2oLGqswPAJrRQTm92ZWxsIFBy
+b3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20pIDxub3ZlbGwt
+cHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6IZgQTEQIAJgIbAwYLCQgHAwIEFQIIAwQW
+AgMBAh4BAheABQJIFkiPBQkHhmvVAAoJEBTCi8l+LjsFn4QAn2wgOHudNubNZvTz
+NdaYJKJ0m2qnAJ9hd0nQBhn28H4Ii4a4h7kpGWRxN4hGBBMRAgAGBQJEexD/AAoJ
+EKhO2uicgArKFLwAn0B+g2mJ5n8LrBziTQ5SjnSPyDBXAJwJoYTta5Sfw/3vVGpU
+fJAKVDoB9w==
+=MWDN
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc b/src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc
new file mode 100644
index 00000000..daeef8a5
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc
@@ -0,0 +1,37 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (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
+YWdlIFNpZ25pbmcgS2V5IDxidWlsZEBzdXNlLmRlPohiBBMRAgAiAhsDBAsHAwID
+FQIDAxYCAQIeAQIXgAUCSB80OgUJEfKmuQAKCRCoTtronIAKyuJlAJ0cWZifmBO6
+Eh71jattipdMhUYBTwCfSXbJJtuF3c96JPmpmT8be2LDo86IRgQQEQIABgUCOnBe
+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
+1dbriEwEGBECAAwFAkgfNGYFCRHyptQACgkQqE7a6JyACsrv3ACbBLhafFXmTjH3
+JJWFJGWuIOaZUosAniPs4feEyN46gjXGgcZc2Ai8nkm6
+=mY6G
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc b/src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc
new file mode 100644
index 00000000..8467c19b
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc
@@ -0,0 +1,31 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+mQILBERqCJkBEACdqhZWdAbUHLIumXMEgv+GFjr1ZzVHgynnFOzztU/8sxZNa9cm
+YV4HZpVfjMr7fos3ArzyiPPt/336cf7w9p79/ZS4rHSNPDMlPCtXYvFxUbvU0/GY
+q4jwcBsrJ0xaJ9CP5bWyAgVKOb7Y6k0ktaLjRR+tDfMsHA4H0ClMoRr6ATw8NL0e
+VCfAHuzqCKvX1If8ng+wTivtAhKvz/WwQiELNELmPfc5tZHOw8NgP/r0Pze18Hn2
+dlAHu0WpC7uoR00vscsMIJiJJPcsxbL1F1eADKnk+wEy8Go+EJeJ5i0WoFbqD52q
+Lv/C/oY6NVtVY0MBwtn+oQNSnQ4JBsB/Akdt53LAi0ZtNQxMyUW+76R8FCOmVCV8
+WGiF5CPRP0yvG80AMBjBjKjHb/v8ov5MnIyFimzAHS1gQcUNxTEYA/5eFwoYcGcK
+weGq9FUjPTzLQAgvp7XmOzHpSAfJ7qysxFTepNsSZZhgizJyInrdQldr+GYcUNqB
+krD9MWmFop975OxhCTEnNv/HcE79r8WD26HzDFYxTiTJbr0pU/ivBzo+rjq+YG2V
+stJk+udVYmZTnC4LmXus8JiNuqBXbxNscwCBpcJ8YcfCV6uh+7E0XfXZsgVUFLp1
+NF+ylYRGTycOlWoZODrnJevZW7N9O3bWRx/G2P4bJD07LsDLe4i5hymf5QAGKbRQ
+Tm92ZWxsIFByb3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20p
+IDxub3ZlbGwtcHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6JAjMEEwECAB0FAkRqCJkG
+CwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRBHijLooZEiCKSFD/93vZHCAMLEfksU
+KnvXl08bv1rfuamuyJnE3ANRE5RDyypriHMCnkVxazvQ2WI4W4UEjluL9+SzZwtV
+ZvKVoAr31614nSyWwv2YnJTHfjMG+xRlkolZMnuIiB9PcCBo9+GPU0ABuzo4pEJW
+NIRoSS1NFbAZBhtUnY0cN+trM5QObLl7xXTavLyGk//blkk57fov7GXsQJlZUig0
+l2yt5XNyGpLUnTMDumHh8b389quF+0+ZfdwOy7A768xjipAZiTvIujBrEv51wrxh
+0HBT0VGA0MhD9t0B+Ce4BM9P/iVMO00naaOp6PqMfPPKxQQqer8qy1i6UWBx95SY
+mKZBIvOm2d9PezDxkckCu61r6krx1iKnT1wdprCAkIYwALK118SpbxuyGW0bhRHc
+wsc/akzWH72fS0Xu49mvL4k4A2U9asdeQid3dMgbtm5mSWof0yiU/G4YNn0yeXoY
+oG1VbCAqQbFX1Rvd6GITJVqI+ekW/uMA9BP78dF8wBeG0+QmpQnSf+eOsxB/RT8o
+Kb4hHY+29MUlg+i9ceVt7hoKr03J/uIG5TXFXRYLaI0iAFVlKfWxpqDfS2XA4+dD
+VYt+5RDgBcnxDaTB4FE9GqcYScNfe7+NFtL0p0wOPftbmgZzGjucTmrD8mDUNdqA
+xGK7vlk4GATSfOQlq7G6LXW6RYnInohGBBMRAgAGBQJEazMlAAoJEKhO2uicgArK
+2vMAn0TbVDESEVKVuFZStrfIzOvJQrR9AJsH733Ju1kE99GFrdfCeGqpckmNhg==
+=E+qN
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.1/trusted-package-keys/pubring.gpg b/src/lib/distro-info/suse-11.1/trusted-package-keys/pubring.gpg
new file mode 100644
index 00000000..5bd5a78e
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1/trusted-package-keys/pubring.gpg
Binary files differ
diff --git a/src/lib/distro-info/suse-11.1_x86_64/mirrors/base b/src/lib/distro-info/suse-11.1_x86_64/mirrors/base
new file mode 100644
index 00000000..8d55eac4
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1_x86_64/mirrors/base
@@ -0,0 +1,247 @@
+http://opensuse.mirror.ac.za/opensuse/distribution/11.1/repo/oss
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.1/repo/oss
+http://mirror.lupaworld.com/opensuse/distribution/11.1/repo/oss
+http://www.lizardsource.cn/distribution/11.1/repo/oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.1/repo/oss
+ftp://www.lizardsource.cn/distribution/11.1/repo/oss
+ftp://opensuse.mirror.ac.za/opensuse/distribution/11.1/repo/oss
+http://download.opensuse.or.id/distribution/11.1/repo/oss
+http://mirror.unej.ac.id/opensuse/distribution/11.1/repo/oss
+http://opensuse.cbn.net.id/distribution/11.1/repo/oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.1/repo/oss
+http://repo.ugm.ac.id/opensuse/distribution/11.1/repo/oss
+http://dl2.foss-id.web.id/opensuse/distribution/11.1/repo/oss
+http://mirror.isoc.org.il/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirror.isoc.org.il/opensuse/distribution/11.1/repo/oss
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.1/repo/oss
+ftp://opensuse.cbn.net.id/pub/opensuse/distribution/11.1/repo/oss
+ftp://dl2.foss-id.web.id/repo/opensuse/distribution/11.1/repo/oss
+http://ftp.kddilabs.jp/Linux/packages/opensuse/distribution/11.1/repo/oss
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.1/repo/oss
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.riken.jp/Linux/opensuse/distribution/11.1/repo/oss
+ftp://mirror.unej.ac.id/opensuse/distribution/11.1/repo/oss
+ftp://ftp.novell.co.jp/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.riken.jp/Linux/opensuse/distribution/11.1/repo/oss
+http://ftp.daum.net/opensuse/distribution/11.1/repo/oss
+ftp://repo.ugm.ac.id/opensuse/distribution/11.1/repo/oss
+http://77.88.19.68/opensuse/distribution/11.1/repo/oss
+http://77.88.19.73/opensuse/distribution/11.1/repo/oss
+http://mirror.suse.ru/distribution/11.1/repo/oss
+http://77.88.19.74/opensuse/distribution/11.1/repo/oss
+http://93.158.155.193/opensuse/distribution/11.1/repo/oss
+ftp://ftp.chg.ru/pub/opensuse/distribution/11.1/repo/oss
+ftp://dispenser.yandex.net/opensuse/distribution/11.1/repo/oss
+ftp://ftp.daum.net/opensuse/distribution/11.1/repo/oss
+http://mirror.nus.edu.sg/opensuse/distribution/11.1/repo/oss
+ftp://seeder.yandex.net/opensuse/distribution/11.1/repo/oss
+ftp://allotter.yandex.net/opensuse/distribution/11.1/repo/oss
+ftp://ftp.kaist.ac.kr/opensuse/distribution/11.1/repo/oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.metu.edu.tr/opensuse/distribution/11.1/repo/oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirror.in.th/opensuse/distribution/11.1/repo/oss
+http://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.1/repo/oss
+http://ftp.chg.ru/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.1/repo/oss
+ftp://ftp.isu.edu.tw/pub/Linux/OpenSuSE/distribution/11.1/repo/oss
+http://ftp.twaren.net/Linux/OpenSuSE/distribution/11.1/repo/oss
+http://mirror-fpt-telecom.fpt.net/opensuse/distribution/11.1/repo/oss
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.1/repo/oss
+http://ftp.isu.edu.tw/pub/Linux/opensuse/distribution/11.1/repo/oss
+http://suse.inode.at/opensuse/distribution/11.1/repo/oss
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.1/repo/oss
+ftp://ftp.twaren.net/Linux/OpenSuSE/distribution/11.1/repo/oss
+http://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.tugraz.at/mirror/opensuse/distribution/11.1/repo/oss
+ftp://ftp.tugraz.at/mirror/opensuse/distribution/11.1/repo/oss
+ftp://suse.inode.at/opensuse/distribution/11.1/repo/oss
+http://suse.lagis.at/opensuse/distribution/11.1/repo/oss
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+http://mirror.opensuse.com.ba/opensuse/distribution/11.1/repo/oss
+http://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.1/repo/oss
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.1/repo/oss
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+http://mirrors.netbg.com/opensuse/distribution/11.1/repo/oss
+http://mirror.switch.ch/ftp/mirror/opensuse/distribution/11.1/repo/oss
+ftp://mirror.switch.ch/mirror/opensuse/distribution/11.1/repo/oss
+ftp://suse.lagis.at/opensuse/distribution/11.1/repo/oss
+http://mirror.karneval.cz/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://mirror.karneval.cz/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.1/repo/oss
+ftp://mirrors.netbg.com/opensuse/distribution/11.1/repo/oss
+http://ftp.linux.cz/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.1/repo/oss
+http://ftp5.gwdg.de/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.1/repo/oss
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/distribution/11.1/repo/oss
+http://download.uni-hd.de/ftp/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.1/repo/oss
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/distribution/11.1/repo/oss
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://opensuse.intergenia.de/distribution/11.1/repo/oss
+ftp://ftp5.gwdg.de/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.1/repo/oss
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.1/repo/oss
+http://widehat.opensuse.org/distribution/11.1/repo/oss
+ftp://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.1/repo/oss
+http://ftp4.gwdg.de/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp3.gwdg.de/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.1/repo/oss
+http://ftp.uni-kassel.de/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+http://opensuse-linuxmigratio.at/distribution/11.1/repo/oss
+ftp://ftp3.gwdg.de/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.1/repo/oss
+ftp://ftp4.gwdg.de/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.uni-siegen.de/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uni-siegen.de/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uni-bayreuth.de/linux/opensuse/distribution/11.1/repo/oss
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+http://ftp.klid.dk/ftp/opensuse/distribution/11.1/repo/oss
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.1/repo/oss
+ftp://ftp.klid.dk/opensuse/distribution/11.1/repo/oss
+http://ftp.estpak.ee/pub/suse/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.gui.uva.es/sites/opensuse.org/distribution/11.1/repo/oss
+ftp://ftp.gui.uva.es/sites/opensuse.org/distribution/11.1/repo/oss
+http://ftp.rediris.es/pub/mirror/opensuse/distribution/11.1/repo/oss
+http://suse.bifi.unizar.es/opensuse/distribution/11.1/repo/oss
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.1/repo/oss
+http://opensuse.mirrors.proxad.net/opensuse/distribution/11.1/repo/oss
+http://mirror.ovh.net/opensuse/distribution/11.1/repo/oss
+ftp://ftp.rediris.es/pub/mirror/opensuse/distribution/11.1/repo/oss
+http://fr2.rpmfind.net/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.1/repo/oss
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+http://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.1/repo/oss
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/oss
+ftp://fr2.rpmfind.net/linux/opensuse/distribution/11.1/repo/oss
+http://opensuse.cict.fr/distribution/11.1/repo/oss
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/distribution/11.1/repo/oss
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://mirror.ovh.net/opensuse/distribution/11.1/repo/oss
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.ntua.gr/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.ntua.gr/pub/linux/opensusedistribution/11.1/repo/oss
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.1/repo/oss
+ftp://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.1/repo/oss
+http://roxen.integrity.hu/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirror.cict.fr/opensuse/distribution/11.1/repo/oss
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.1/repo/oss
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+http://rm.mirror.garr.it/mirrors/opensuse/distribution/11.1/repo/oss
+http://repo1.linux.edu.lv/distribution/11.1/repo/oss
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/oss
+ftp://repo1.linux.edu.lv/distribution/11.1/repo/oss
+http://mirror.leaseweb.com/opensuse/distribution/11.1/repo/oss
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+ftp://mirror.leaseweb.com/opensuse/distribution/11.1/repo/oss
+http://mirrors.nl.eu.kernel.org/opensuse/distribution/11.1/repo/oss
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/distribution/11.1/repo/oss
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/distribution/11.1/repo/oss
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.1/repo/oss
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/distribution/11.1/repo/oss
+http://opensuse.hro.nl/opensuse/distribution/11.1/repo/oss
+http://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.1/repo/oss
+http://opensuse.uib.no/distribution/11.1/repo/oss
+ftp://rm.mirror.garr.it/mirrors/opensusedistribution/11.1/repo/oss
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/distribution/11.1/repo/oss
+http://ftp.uninett.no/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uninett.no/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://opensuse.hro.nl/opensuse/distribution/11.1/repo/oss
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.1/repo/oss
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.sileman.pl/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://mirrors.nl.eu.kernel.org/opensuse/distribution/11.1/repo/oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://ftp.sileman.pl/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.1/repo/oss
+http://cesium.di.uminho.pt/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.gts.lug.ro/opensuse/distribution/11.1/repo/oss
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.1/repo/oss
+ftp://ftp.gts.lug.ro/opensuse/distribution/11.1/repo/oss
+http://ftp.ines.lug.ro/opensuse/distribution/11.1/repo/oss
+http://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.1/repo/oss
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.1/repo/oss
+ftp://cesium.di.uminho.pt/pub/opensuse/distribution/11.1/repo/oss
+http://mirrors.se.eu.kernel.org/opensuse/distribution/11.1/repo/oss
+http://ftp.df.lth.se/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.1/repo/oss
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.1/repo/oss
+http://opensuse.ynet.sk/distribution/11.1/repo/oss
+ftp://mirrors.se.eu.kernel.org/opensuse/distribution/11.1/repo/oss
+ftp://ftp.ines.lug.ro/opensuse/distribution/11.1/repo/oss
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.1/repo/oss
+http://www.muug.mb.ca/pub/opensuse/distribution/11.1/repo/oss
+http://less.cogeco.net/ftp/openSUSE/distribution/11.1/repo/oss
+ftp://ftp.df.lth.se/pub/opensusedistribution/11.1/repo/oss
+http://linux.dell.com/repo/community/distribution/11.1/repo/oss
+http://ftp.osuosl.org/pub/opensuse/distribution/11.1/repo/oss
+ftp://less.cogeco.net/openSUSE/distribution/11.1/repo/oss
+http://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.1/repo/oss
+http://suse.mirrors.tds.net/pub/opensuse/distribution/11.1/repo/oss
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.osuosl.org/pub/opensuse/distribution/11.1/repo/oss
+http://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://www.muug.mb.ca/pub/opensuse/distribution/11.1/repo/oss
+http://mirror.umoss.org/opensuse/distribution/11.1/repo/oss
+ftp://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.1/repo/oss
+http://mirrors.med.harvard.edu/opensuse/distribution/11.1/repo/oss
+http://opensuse.cs.utah.edu/distribution/11.1/repo/oss
+ftp://suse.mirrors.tds.net/pub/opensuse/distribution/11.1/repo/oss
+http://mirrors.xmission.com/opensuse/distribution/11.1/repo/oss
+http://mirrors2.kernel.org/opensuse/distribution/11.1/repo/oss
+http://opensuse.ca.unixheads.org/distribution/11.1/repo/oss
+http://mirrors1.kernel.org/opensuse/distribution/11.1/repo/oss
+ftp://mirrors2.kernel.org/opensuse/distribution/11.1/repo/oss
+http://mirror.rackspace.com/openSUSE/distribution/11.1/repo/oss
+http://130.57.19.201/distribution/11.1/repo/oss
+ftp://mirrors.xmission.com/opensuse/distribution/11.1/repo/oss
+ftp://130.57.19.201/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirrors1.kernel.org/opensuse/distribution/11.1/repo/oss
+http://ftp.ussg.iu.edu/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.utexas.edu/opensuse/distribution/11.1/repo/oss
+ftp://opensuse.cs.utah.edu/pub/opensuse/distribution/11.1/repo/oss
+http://www.gtlib.gatech.edu/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.1/repo/oss
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/distribution/11.1/repo/oss
+ftp://ftp.utexas.edu/mirrors/opensuse/distribution/11.1/repo/oss
+http://mirror.nyi.net/opensuse/distribution/11.1/repo/oss
+http://mirror.cps.cmich.edu/opensuse/opensuse/distribution/11.1/repo/oss
+http://mirrors.rit.edu/opensuse/distribution/11.1/repo/oss
+ftp://ftp.ussg.iu.edu/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.iinet.net.au/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirror.nyi.net/opensusedistribution/11.1/repo/oss
+ftp://mirror.rackspace.com/openSUSE/distribution/11.1/repo/oss
+http://mirror.internode.on.net/pub/opensuse/distribution/11.1/repo/oss
+http://mirror.pacific.net.au/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.iinet.net.au/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirror.internode.on.net/pub/opensuse/distribution/11.1/repo/oss
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://mirror.pacific.net.au/linux/opensuse/distribution/11.1/repo/oss
+http://opensuse.patan.com.ar/distribution/11.1/repo/oss
+http://200.221.9.37/pub/opensuse/distribution/11.1/repo/oss
+http://opensuse.c3sl.ufpr.br/distribution/11.1/repo/oss
+ftp://opensuse.c3sl.ufpr.br/opensuse/distribution/11.1/repo/oss
+http://opensuse.pop.com.br/distribution/11.1/repo/oss
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.1/repo/oss
diff --git a/src/lib/distro-info/suse-11.1_x86_64/mirrors/base_non-oss b/src/lib/distro-info/suse-11.1_x86_64/mirrors/base_non-oss
new file mode 100644
index 00000000..bd887ed3
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1_x86_64/mirrors/base_non-oss
@@ -0,0 +1,246 @@
+http://opensuse.mirror.ac.za/opensuse/distribution/11.1/repo/non-oss
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.1/repo/non-oss
+ftp://opensuse.mirror.ac.za/opensuse/distribution/11.1/repo/non-oss
+http://mirror.lupaworld.com/opensuse/distribution/11.1/repo/non-oss
+http://www.lizardsource.cn/distribution/11.1/repo/non-oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.1/repo/non-oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.1/repo/non-oss
+http://download.opensuse.or.id/distribution/11.1/repo/non-oss
+http://opensuse.cbn.net.id/distribution/11.1/repo/non-oss
+http://repo.ugm.ac.id/opensuse/distribution/11.1/repo/non-oss
+http://mirror.unej.ac.id/opensuse/distribution/11.1/repo/non-oss
+ftp://opensuse.cbn.net.id/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.unej.ac.id/opensuse/distribution/11.1/repo/non-oss
+http://dl2.foss-id.web.id/opensuse/distribution/11.1/repo/non-oss
+http://mirror.isoc.org.il/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.1/repo/non-oss
+ftp://dl2.foss-id.web.id/repo/opensuse/distribution/11.1/repo/non-oss
+ftp://www.lizardsource.cn/distribution/11.1/repo/non-oss
+http://ftp.kddilabs.jp/Linux/packages/opensuse/distribution/11.1/repo/non-oss
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.novell.co.jp/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.1/repo/non-oss
+ftp://repo.ugm.ac.id/opensuse/distribution/11.1/repo/non-oss
+http://ftp.riken.jp/Linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.riken.jp/Linux/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.isoc.org.il/opensuse/distribution/11.1/repo/non-oss
+http://ftp.daum.net/opensuse/distribution/11.1/repo/non-oss
+http://77.88.19.68/opensuse/distribution/11.1/repo/non-oss
+http://77.88.19.73/opensuse/distribution/11.1/repo/non-oss
+http://mirror.suse.ru/distribution/11.1/repo/non-oss
+http://77.88.19.74/opensuse/distribution/11.1/repo/non-oss
+http://93.158.155.193/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.chg.ru/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://seeder.yandex.net/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.kaist.ac.kr/opensuse/distribution/11.1/repo/non-oss
+http://mirror.nus.edu.sg/opensuse/distribution/11.1/repo/non-oss
+ftp://allotter.yandex.net/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.novell.co.jp/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.metu.edu.tr/opensuse/distribution/11.1/repo/non-oss
+ftp://dispenser.yandex.net/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.isu.edu.tw/pub/Linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.chg.ru/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.1/repo/non-oss
+ftp://ftp.isu.edu.tw/pub/Linux/OpenSuSE/distribution/11.1/repo/non-oss
+http://ftp.twaren.net/Linux/OpenSuSE/distribution/11.1/repo/non-oss
+ftp://mirror.in.th/opensuse/distribution/11.1/repo/non-oss
+http://mirror-fpt-telecom.fpt.net/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.1/repo/non-oss
+http://suse.inode.at/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.1/repo/non-oss
+ftp://spreader.yandex.net/opensuse/distribution/11.1/repo/non-oss
+ftp://suse.inode.at/opensuse/distribution/11.1/repo/non-oss
+http://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.tugraz.at/mirror/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.twaren.net/Linux/OpenSuSE/distribution/11.1/repo/non-oss
+http://suse.lagis.at/opensuse/distribution/11.1/repo/non-oss
+ftp://suse.lagis.at/opensuse/distribution/11.1/repo/non-oss
+http://mirror.opensuse.com.ba/opensuse/distribution/11.1/repo/non-oss
+http://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.1/repo/non-oss
+ftp://ftp.tugraz.at/mirror/opensuse/distribution/11.1/repo/non-oss
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+http://mirrors.netbg.com/opensuse/distribution/11.1/repo/non-oss
+ftp://mirrors.netbg.com/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+http://mirror.switch.ch/ftp/mirror/opensuse/distribution/11.1/repo/non-oss
+http://mirror.karneval.cz/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.karneval.cz/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.switch.ch/mirror/opensuse/distribution/11.1/repo/non-oss
+http://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.1/repo/non-oss
+http://ftp5.gwdg.de/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp5.gwdg.de/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/distribution/11.1/repo/non-oss
+http://download.uni-hd.de/ftp/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.1/repo/non-oss
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.linux.cz/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/distribution/11.1/repo/non-oss
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.intergenia.de/distribution/11.1/repo/non-oss
+http://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.1/repo/non-oss
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.1/repo/non-oss
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp3.gwdg.de/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.1/repo/non-oss
+http://widehat.opensuse.org/distribution/11.1/repo/non-oss
+http://ftp4.gwdg.de/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp4.gwdg.de/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.uni-kassel.de/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+http://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://opensuse-linuxmigratio.at/distribution/11.1/repo/non-oss
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.uni-siegen.de/opensuse/distribution/11.1/repo/non-oss
+http://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp3.gwdg.de/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.klid.dk/ftp/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.1/repo/non-oss
+http://ftp.estpak.ee/pub/suse/opensuse/distribution/11.1/repo/non-oss
+http://ftp.gui.uva.es/sites/opensuse.org/distribution/11.1/repo/non-oss
+ftp://ftp.uni-siegen.de/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.uni-bayreuth.de/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.rediris.es/pub/mirror/opensuse/distribution/11.1/repo/non-oss
+http://mirror.ovh.net/opensuse/distribution/11.1/repo/non-oss
+http://suse.bifi.unizar.es/opensuse/distribution/11.1/repo/non-oss
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.mirrors.proxad.net/opensuse/distribution/11.1/repo/non-oss
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.klid.dk/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.rediris.es/pub/mirror/opensuse/distribution/11.1/repo/non-oss
+http://fr2.rpmfind.net/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.ovh.net/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.gui.uva.es/sites/opensuse.org/distribution/11.1/repo/non-oss
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://fr2.rpmfind.net/linux/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.cict.fr/distribution/11.1/repo/non-oss
+http://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.1/repo/non-oss
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/non-oss
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/distribution/11.1/repo/non-oss
+ftp://mirror.cict.fr/opensuse/distribution/11.1/repo/non-oss
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://ftp.ntua.gr/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/distribution/11.1/repo/non-oss
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.1/repo/non-oss
+http://roxen.integrity.hu/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.ntua.gr/pub/linux/opensusedistribution/11.1/repo/non-oss
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+ftp://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.1/repo/non-oss
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.1/repo/non-oss
+http://rm.mirror.garr.it/mirrors/opensuse/distribution/11.1/repo/non-oss
+ftp://rm.mirror.garr.it/mirrors/opensusedistribution/11.1/repo/non-oss
+http://repo1.linux.edu.lv/distribution/11.1/repo/non-oss
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://repo1.linux.edu.lv/distribution/11.1/repo/non-oss
+http://mirror.leaseweb.com/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.leaseweb.com/opensuse/distribution/11.1/repo/non-oss
+http://mirrors.nl.eu.kernel.org/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/distribution/11.1/repo/non-oss
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.hro.nl/opensuse/distribution/11.1/repo/non-oss
+ftp://mirrors.nl.eu.kernel.org/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.1/repo/non-oss
+http://ftp.uninett.no/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.uib.no/distribution/11.1/repo/non-oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.sileman.pl/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.uninett.no/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://opensuse.hro.nl/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.1/repo/non-oss
+http://cesium.di.uminho.pt/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://cesium.di.uminho.pt/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.sileman.pl/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.1/repo/non-oss
+http://ftp.gts.lug.ro/opensuse/distribution/11.1/repo/non-oss
+http://ftp.ines.lug.ro/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.ines.lug.ro/opensuse/distribution/11.1/repo/non-oss
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.1/repo/non-oss
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.1/repo/non-oss
+http://mirrors.se.eu.kernel.org/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.1/repo/non-oss
+http://ftp.df.lth.se/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.ynet.sk/distribution/11.1/repo/non-oss
+ftp://mirrors.se.eu.kernel.org/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.df.lth.se/pub/opensusedistribution/11.1/repo/non-oss
+http://less.cogeco.net/ftp/openSUSE/distribution/11.1/repo/non-oss
+ftp://ftp.gts.lug.ro/opensuse/distribution/11.1/repo/non-oss
+ftp://less.cogeco.net/openSUSE/distribution/11.1/repo/non-oss
+http://www.muug.mb.ca/pub/opensuse/distribution/11.1/repo/non-oss
+http://linux.dell.com/repo/community/distribution/11.1/repo/non-oss
+http://ftp.osuosl.org/pub/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.osuosl.org/pub/opensuse/distribution/11.1/repo/non-oss
+http://suse.mirrors.tds.net/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://www.muug.mb.ca/pub/opensuse/distribution/11.1/repo/non-oss
+http://mirrors.med.harvard.edu/opensuse/distribution/11.1/repo/non-oss
+http://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://mirror.umoss.org/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.cs.utah.edu/distribution/11.1/repo/non-oss
+http://opensuse.ca.unixheads.org/distribution/11.1/repo/non-oss
+ftp://opensuse.cs.utah.edu/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://mirrors.xmission.com/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://mirrors2.kernel.org/opensuse/distribution/11.1/repo/non-oss
+ftp://mirrors.xmission.com/opensuse/distribution/11.1/repo/non-oss
+http://mirrors1.kernel.org/opensuse/distribution/11.1/repo/non-oss
+http://mirror.rackspace.com/openSUSE/distribution/11.1/repo/non-oss
+http://130.57.19.201/distribution/11.1/repo/non-oss
+ftp://130.57.19.201/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.rackspace.com/openSUSE/distribution/11.1/repo/non-oss
+http://ftp.utexas.edu/opensuse/distribution/11.1/repo/non-oss
+http://www.gtlib.gatech.edu/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://mirrors2.kernel.org/opensuse/distribution/11.1/repo/non-oss
+http://ftp.ussg.iu.edu/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.utexas.edu/mirrors/opensuse/distribution/11.1/repo/non-oss
+ftp://www.gtlib.gatech.edu/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://mirrors1.kernel.org/opensuse/distribution/11.1/repo/non-oss
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/distribution/11.1/repo/non-oss
+http://mirror.cps.cmich.edu/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://mirror.nyi.net/opensuse/distribution/11.1/repo/non-oss
+http://mirrors.rit.edu/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.iinet.net.au/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.nyi.net/opensusedistribution/11.1/repo/non-oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.1/repo/non-oss
+http://mirror.pacific.net.au/linux/opensuse/distribution/11.1/repo/non-oss
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.pacific.net.au/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.internode.on.net/pub/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.patan.com.ar/distribution/11.1/repo/non-oss
+http://200.221.9.37/pub/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.c3sl.ufpr.br/distribution/11.1/repo/non-oss
+http://opensuse.pop.com.br/distribution/11.1/repo/non-oss
+ftp://opensuse.c3sl.ufpr.br/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.1/repo/non-oss
diff --git a/src/lib/distro-info/suse-11.1_x86_64/mirrors/base_update b/src/lib/distro-info/suse-11.1_x86_64/mirrors/base_update
new file mode 100644
index 00000000..d0c666e0
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1_x86_64/mirrors/base_update
@@ -0,0 +1,246 @@
+http://opensuse.mirror.ac.za/opensuse/update/11.1
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/update/11.1
+http://download.opensuse.or.id/update/11.1
+ftp://opensuse.mirror.ac.za/opensuse/update/11.1
+http://mirror.lupaworld.com/opensuse/update/11.1
+http://www.lizardsource.cn/update/11.1
+http://mirror.alva.ge/pub/opensuse/update/11.1
+http://mirror.alva.ge/pub/opensuse/update/11.1
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/update/11.1
+http://mirror.unej.ac.id/opensuse/update/11.1
+http://opensuse.cbn.net.id/update/11.1
+http://repo.ugm.ac.id/opensuse/update/11.1
+ftp://mirror.unej.ac.id/opensuse/update/11.1
+http://dl2.foss-id.web.id/opensuse/update/11.1
+http://mirror.isoc.org.il/pub/opensuse/update/11.1
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/update/11.1
+ftp://dl2.foss-id.web.id/repo/opensuse/update/11.1
+http://ftp.kddilabs.jp/Linux/packages/opensuse/update/11.1
+ftp://mirror.isoc.org.il/opensuse/update/11.1
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/update/11.1
+ftp://opensuse.cbn.net.id/pub/opensuse/update/11.1
+ftp://repo.ugm.ac.id/opensuse/update/11.1
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/update/11.1
+ftp://www.lizardsource.cn/update/11.1
+http://ftp.riken.jp/Linux/opensuse/update/11.1
+http://ftp.daum.net/opensuse/update/11.1
+http://77.88.19.68/opensuse/update/11.1
+ftp://ftp.novell.co.jp/pub/opensuse/update/11.1
+http://77.88.19.73/opensuse/update/11.1
+ftp://ftp.riken.jp/Linux/opensuse/update/11.1
+http://mirror.suse.ru/update/11.1
+http://77.88.19.74/opensuse/update/11.1
+http://93.158.155.193/opensuse/update/11.1
+ftp://dispenser.yandex.net/opensuse/update/11.1
+ftp://ftp.kaist.ac.kr/opensuse/update/11.1
+ftp://ftp.chg.ru/pub/opensuse/update/11.1
+ftp://spreader.yandex.net/opensuse/update/11.1
+ftp://allotter.yandex.net/opensuse/update/11.1
+http://mirror.nus.edu.sg/opensuse/update/11.1
+ftp://seeder.yandex.net/opensuse/update/11.1
+ftp://ftp.metu.edu.tr/opensuse/update/11.1
+ftp://ftp.suntel.com.tr/pub/opensuse/update/11.1
+http://ftp.isu.edu.tw/pub/Linux/opensuse/update/11.1
+ftp://mirror.in.th/opensuse/update/11.1
+ftp://ftp.suntel.com.tr/pub/opensuse/update/11.1
+http://ftp.chg.ru/pub/opensuse/update/11.1
+http://ftp.ncnu.edu.tw/Linux/opensuse/update/11.1
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/update/11.1
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/update/11.1
+http://ftp.twaren.net/Linux/OpenSuSE/update/11.1
+http://mirror-fpt-telecom.fpt.net/opensuse/update/11.1
+http://suse.inode.at/opensuse/update/11.1
+ftp://ftp.twaren.net/Linux/OpenSuSE/update/11.1
+http://gd.tuwien.ac.at/opsys/linux/opensuse/update/11.1
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/update/11.1
+http://ftp.tugraz.at/mirror/opensuse/update/11.1
+ftp://suse.inode.at/opensuse/update/11.1
+http://suse.lagis.at/opensuse/update/11.1
+ftp://suse.lagis.at/opensuse/update/11.1
+http://mirror.opensuse.com.ba/opensuse/update/11.1
+http://ftp.belnet.be/mirror/ftp.opensuse.org/update/11.1
+ftp://ftp.tugraz.at/mirror/opensuse/update/11.1
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/update/11.1
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/update/11.1
+http://mirrors.netbg.com/opensuse/update/11.1
+ftp://mirrors.netbg.com/opensuse/update/11.1
+http://mirror.switch.ch/ftp/mirror/opensuse/update/11.1
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/update/11.1
+http://mirror.karneval.cz/pub/linux/opensuse/update/11.1
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/update/11.1
+http://ftp.linux.cz/pub/linux/opensuse/update/11.1
+ftp://mirror.switch.ch/mirror/opensuse/update/11.1
+http://ftp.halifax.rwth-aachen.de/opensuse/update/11.1
+ftp://mirror.karneval.cz/pub/linux/opensuse/update/11.1
+http://ftp5.gwdg.de/pub/opensuse/update/11.1
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/update/11.1
+ftp://ftp5.gwdg.de/pub/opensuse/update/11.1
+http://download.uni-hd.de/ftp/pub/linux/opensuse/update/11.1
+ftp://ftp.halifax.rwth-aachen.de/opensuse/update/11.1
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/update/11.1
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/update/11.1
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/update/11.1
+http://opensuse.intergenia.de/update/11.1
+http://ftp.uni-ulm.de/mirrors/opensuse/update/11.1
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/update/11.1
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/update/11.1
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/update/11.1
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/update/11.1
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/update/11.1
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/update/11.1
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/update/11.1
+ftp://ftp.uni-ulm.de/mirrors/opensuse/update/11.1
+http://ftp.uni-kl.de/pub/linux/opensuse/update/11.1
+http://ftp3.gwdg.de/pub/opensuse/update/11.1
+http://widehat.opensuse.org/update/11.1
+ftp://ftp4.gwdg.de/pub/opensuse/update/11.1
+http://ftp.uni-kassel.de/opensuse/update/11.1
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/update/11.1
+ftp://ftp3.gwdg.de/pub/opensuse/update/11.1
+http://ftp4.gwdg.de/pub/opensuse/update/11.1
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/update/11.1
+ftp://ftp.uni-kl.de/pub/linux/opensuse/update/11.1
+http://ftp.uni-bayreuth.de/linux/opensuse/update/11.1
+http://opensuse-linuxmigratio.at/update/11.1
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/update/11.1
+http://ftp.uni-siegen.de/opensuse/update/11.1
+http://ftp.tu-ilmenau.de/mirror/opensuse/update/11.1
+http://ftp.uni-paderborn.de/pub/linux/opensuse/update/11.1
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/update/11.1
+http://ftp.klid.dk/ftp/opensuse/update/11.1
+http://ftp.estpak.ee/pub/suse/opensuse/update/11.1
+ftp://ftp.uni-siegen.de/pub/opensuse/update/11.1
+ftp://ftp.uni-bayreuth.de/linux/opensuse/update/11.1
+ftp://ftp.gui.uva.es/sites/opensuse.org/update/11.1
+http://ftp.rediris.es/pub/mirror/opensuse/update/11.1
+ftp://ftp.klid.dk/opensuse/update/11.1
+http://ftp.gui.uva.es/sites/opensuse.org/update/11.1
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/update/11.1
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/update/11.1
+http://opensuse.mirrors.proxad.net/opensuse/update/11.1
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/update/11.1
+http://mirror.ovh.net/opensuse/update/11.1
+http://suse.bifi.unizar.es/opensuse/update/11.1
+ftp://ftp.rediris.es/pub/mirror/opensuse/update/11.1
+http://fr2.rpmfind.net/linux/opensuse/update/11.1
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/update/11.1
+http://opensuse.cict.fr/update/11.1
+ftp://mirror.cict.fr/opensuse/update/11.1
+http://www.mirrorservice.org/sites/download.opensuse.org/update/11.1
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/update/11.1
+ftp://fr2.rpmfind.net/linux/opensuse/update/11.1
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/update/11.1
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/update/11.1
+ftp://mirror.ovh.net/opensuse/update/11.1
+ftp://www.mirrorservice.org/sites/download.opensuse.org/update/11.1
+http://ftp.ntua.gr/pub/linux/opensuse/update/11.1
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/update/11.1
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/update/11.1
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/update/11.1
+http://roxen.integrity.hu/pub/opensuse/update/11.1
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/update/11.1
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/update/11.1
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/update/11.1
+ftp://ftp.ntua.gr/pub/linux/opensuseupdate/11.1
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/update/11.1
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/update/11.1
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/update/11.1
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/update/11.1
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/update/11.1
+http://rm.mirror.garr.it/mirrors/opensuse/update/11.1
+http://repo1.linux.edu.lv/update/11.1
+http://mirror.leaseweb.com/opensuse/update/11.1
+ftp://rm.mirror.garr.it/mirrors/opensuseupdate/11.1
+http://mirrors.nl.eu.kernel.org/opensuse/update/11.1
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/update/11.1
+ftp://mirrors.nl.eu.kernel.org/opensuse/update/11.1
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/update/11.1
+ftp://mirror.leaseweb.com/opensuse/update/11.1
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/update/11.1
+http://opensuse.hro.nl/opensuse/update/11.1
+ftp://repo1.linux.edu.lv/update/11.1
+http://opensuse.uib.no/update/11.1
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/update/11.1
+http://ftp.uninett.no/pub/linux/opensuse/update/11.1
+ftp://ftp.uninett.no/pub/linux/opensuse/update/11.1
+ftp://opensuse.hro.nl/opensuse/update/11.1
+http://ftp.icm.edu.pl/pub/Linux/opensuse/update/11.1
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/update/11.1
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/update/11.1
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/update/11.1
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/update/11.1
+http://ftp.sileman.pl/pub/opensuse/update/11.1
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/update/11.1
+ftp://ftp.pbone.net/pub/opensuse/update/11.1
+http://cesium.di.uminho.pt/pub/opensuse/update/11.1
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/update/11.1
+ftp://ftp.sileman.pl/pub/opensuse/update/11.1
+http://ftp.nux.ipb.pt/pub/dists/opensuse/update/11.1
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/update/11.1
+http://ftp.gts.lug.ro/opensuse/update/11.1
+ftp://cesium.di.uminho.pt/pub/opensuse/update/11.1
+http://ftp.ines.lug.ro/opensuse/update/11.1
+ftp://ftp.ines.lug.ro/opensuse/update/11.1
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/update/11.1
+http://mirrors.se.eu.kernel.org/opensuse/update/11.1
+ftp://ftp.pbone.net/pub/opensuse/update/11.1
+http://ftp.df.lth.se/pub/opensuse/update/11.1
+ftp://ftp.df.lth.se/pub/opensuseupdate/11.1
+ftp://ftp.gts.lug.ro/opensuse/update/11.1
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/update/11.1
+http://less.cogeco.net/ftp/openSUSE/update/11.1
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/update/11.1
+http://opensuse.ynet.sk/update/11.1
+ftp://mirrors.se.eu.kernel.org/opensuse/update/11.1
+http://www.muug.mb.ca/pub/opensuse/update/11.1
+http://linux.dell.com/repo/community/update/11.1
+ftp://www.muug.mb.ca/pub/opensuse/update/11.1
+http://ftp.osuosl.org/pub/opensuse/update/11.1
+http://opensuse.fastsoft.net/pub/linux/opensuse/update/11.1
+http://suse.mirrors.tds.net/pub/opensuse/update/11.1
+http://mirrors.med.harvard.edu/opensuse/update/11.1
+ftp://ftp.osuosl.org/pub/opensuse/update/11.1
+http://mirror.anl.gov/pub/opensuse/opensuse/update/11.1
+http://mirror.umoss.org/opensuse/update/11.1
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/update/11.1
+http://opensuse.cs.utah.edu/update/11.1
+http://opensuse.ca.unixheads.org/update/11.1
+ftp://opensuse.cs.utah.edu/pub/opensuse/update/11.1
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/update/11.1
+http://mirrors.xmission.com/opensuse/update/11.1
+ftp://mirror.anl.gov/pub/opensuse/opensuse/update/11.1
+ftp://suse.mirrors.tds.net/pub/opensuse/update/11.1
+http://mirrors2.kernel.org/opensuse/update/11.1
+ftp://mirrors.xmission.com/opensuse/update/11.1
+http://mirrors1.kernel.org/opensuse/update/11.1
+ftp://mirrors2.kernel.org/opensuse/update/11.1
+http://130.57.19.201/update/11.1
+ftp://mirrors1.kernel.org/opensuse/update/11.1
+ftp://mirror.rackspace.com/openSUSE/update/11.1
+ftp://130.57.19.201/pub/opensuse/update/11.1
+http://ftp.utexas.edu/opensuse/update/11.1
+ftp://mirror.colorado.edu/pub/opensuse/update/11.1
+http://mirror.rackspace.com/openSUSE/update/11.1
+ftp://www.gtlib.gatech.edu/pub/opensuse/update/11.1
+http://www.gtlib.gatech.edu/pub/opensuse/update/11.1
+ftp://ftp.utexas.edu/mirrors/opensuse/update/11.1
+http://ftp.ussg.iu.edu/linux/opensuse/update/11.1
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/update/11.1
+http://mirror.cps.cmich.edu/opensuse/opensuse/update/11.1
+http://mirror.nyi.net/opensuse/update/11.1
+ftp://mirror.colorado.edu/pub/opensuse/update/11.1
+http://mirrors.rit.edu/opensuse/update/11.1
+http://ftp.iinet.net.au/pub/opensuse/update/11.1
+ftp://mirror.nyi.net/opensuseupdate/11.1
+http://mirror.internode.on.net/pub/opensuse/update/11.1
+http://mirror.pacific.net.au/linux/opensuse/update/11.1
+ftp://ftp.iinet.net.au/pub/opensuse/update/11.1
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/update/11.1
+http://200.221.9.37/pub/opensuse/update/11.1
+http://opensuse.c3sl.ufpr.br/update/11.1
+http://opensuse.pop.com.br/update/11.1
+http://opensuse.patan.com.ar/update/11.1
+ftp://mirror.internode.on.net/pub/opensuse/update/11.1
+ftp://mirror.pacific.net.au/linux/opensuse/update/11.1
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/update/11.1
+ftp://opensuse.c3sl.ufpr.br/opensuse/update/11.1
diff --git a/src/lib/distro-info/suse-11.1_x86_64/prereqfiles/etc/group b/src/lib/distro-info/suse-11.1_x86_64/prereqfiles/etc/group
new file mode 100644
index 00000000..505cb221
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1_x86_64/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/src/lib/distro-info/suse-11.1_x86_64/prereqfiles/etc/hosts b/src/lib/distro-info/suse-11.1_x86_64/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1_x86_64/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/suse-11.1_x86_64/prereqfiles/etc/passwd b/src/lib/distro-info/suse-11.1_x86_64/prereqfiles/etc/passwd
new file mode 100644
index 00000000..9b8fc4fe
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1_x86_64/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/src/lib/distro-info/suse-11.1_x86_64/prereqfiles/etc/shadow b/src/lib/distro-info/suse-11.1_x86_64/prereqfiles/etc/shadow
new file mode 100644
index 00000000..cd100a5a
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1_x86_64/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/src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc b/src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc
new file mode 100644
index 00000000..ac75d62a
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc
@@ -0,0 +1,17 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (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/src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc b/src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc
new file mode 100644
index 00000000..57a9078a
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc
@@ -0,0 +1,13 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+mIsERCAdXQEEAL7MrBTz+3SBWpCm2ae2yaDqV3ezQcs2JlvqidJVhsZqQe9/jkxi
+KTEQW5+TXF/+BlQSiebunRI7oo3+9U8GyRCgs1sf+yRQWMLzZqRaarzRhw9w+Ihl
+edtqYl6/U2JZCb8Adp6d7RzlRliJdJ/VtsfXj2ef7Dwu7elOVSsmaBdtAAYptChT
+dVNFIFBhY2thZ2UgU2lnbmluZyBLZXkgPGJ1aWxkQHN1c2UuZGU+iLgEEwECACIC
+GwMECwcDAgMVAgMDFgIBAh4BAheABQJIHzCqBQkHwXpNAAoJEOOlw2Awfj1UvWgE
+AIRoxE8S6jQB7S43SVcX06FHJeUJ/m+1ErIj9LwJTYrR/8qsDjTgrttgb+nBHkIj
+NhCCLAuR8sWj3CxsUMH2fayryNnwZEWGqnzo7Jtt4R1Ur3h5pHYonFjfoJyFUZjJ
+7Mhw7/TuOWx20FrzqBi8tbHx8pd7Fa5lCUgopVtMh6GR
+=R56j
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc b/src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc
new file mode 100644
index 00000000..80380d2f
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc
@@ -0,0 +1,30 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (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/src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-3dbdc284-49144c3f.asc b/src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-3dbdc284-49144c3f.asc
new file mode 100644
index 00000000..aaec909b
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-3dbdc284-49144c3f.asc
@@ -0,0 +1,19 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+mQENBEkUTD8BCADWLy5d5IpJedHQQSXkC1VK/oAZlJEeBVpSZjMCn8LiHaI9Wq3G
+3Vp6wvsP1b3kssJGzVFNctdXt5tjvOLxvrEfRJuGfqHTKILByqLzkeyWawbFNfSQ
+93/8OunfSTXC1Sx3hgsNXQuOrNVKrDAQUqT620/jj94xNIg09bLSxsjN6EeTvyiO
+mtE9H1J03o9tY6meNL/gcQhxBvwuo205np0JojYBP0pOfN8l9hnIOLkA0yu4ZXig
+oKOVmf4iTjX4NImIWldT+UaWTO18NWcCrujtgHueytwYLBNV5N0oJIP2VYuLZfSD
+VYuPllv7c6O2UEOXJsdbQaVuzU1HLocDyipnABEBAAG0NG9wZW5TVVNFIFByb2pl
+Y3QgU2lnbmluZyBLZXkgPG9wZW5zdXNlQG9wZW5zdXNlLm9yZz6JATwEEwECACYF
+AkkUTD8CGwMFCQPCZwAGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRC4iy/UPb3C
+hIE9B/9DUwwQ5c+8xW0x2Fli5Yn1P+4Wq3nmB+ZTpM5Q1a7A2l+HhpUBsnwx2e/4
+RuXlJ06uYby8UpXCli44jXFepJgiXp7ZRPX5A06aY9Pz0wawsMtYQS716+vSV3e3
+ynZmTGKxj8Z94TEVcEjMP1/XpjW22DcpItRJX2VCW7lUXDmRfQzBEolcfwlF7a1B
+VcSqGZX8JvuTocLX/+fYBhZYQvERw6PUVGoEskMXMoRg6PqWMesW9Bq3cm8oeBa2
+4YmGLkN2ztBIbqRMSv0binKcddHHvRlxVFRXrnnlXrEPKrx9Fbu4vkqrG+EKE6+v
+GO73ROyEcJuuoJTYsKPx6Uic5gRl
+=guZP
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-56b4177a-47965b33.asc b/src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-56b4177a-47965b33.asc
new file mode 100644
index 00000000..f0bb55a3
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-56b4177a-47965b33.asc
@@ -0,0 +1,19 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+mQGiBEeWWzMRBADU8l2IckSzgdUS1dn0WMM7wXK4seoFsHHQw/0unHCQCxpyDMnn
+TKV86p5KTbR1FDdeaZlY0yCV+IGsiIxLyuUdJn8vuA5gA5ZkUr89/HtWaeZVl77J
+HIQxvhDRBWCOO4QNtrZYWvGbvl83wl/zOfdLEs8IGElt0LgfohyTA1qfrwCg/Hac
+tDDscXsPlo5Jek/+3RHVeD0D/30riCpfpLJOmhraLg1EbWsE0mN9IQsl+WDPdoYo
+bB76z6eH3e38618WzP/LTG4WuVbwpSSqmXyfdVpXxWzESfT8q0B8CGpHf/Sa/T/L
+emohmRnLvkf/tAfxFmDMm1jOewJIE9S35jANGHVJcxmfRNpPWC7uHnqjopnsmDkL
+kMEdBAC6YcpDOcMJZ9sJbt/JNZBaoT5CltgMDlSN50t2v/J5em8qMLqCSNF5UJyd
+LFnePHTHy6gVjWbqcC0ncFzOqM1y644Up7BoKSAr1hRTl6Mw9S3UfZZZ0al3JtWt
+8y0eFIW3QP66w1AL0LO2bZMBuOvhb63DXv5iHorcxk0yIFbbybRCb3BlblNVU0U6
+RmFjdG9yeSBPQlMgUHJvamVjdCA8b3BlblNVU0U6RmFjdG9yeUBidWlsZC5vcGVu
+c3VzZS5vcmc+iGYEExECACYFAkeWWzMCGwMFCQQesAAGCwkIBwMCBBUCCAMEFgID
+AQIeAQIXgAAKCRAcchwkVrQXevBsAKCOeScnlH2fWVBJGHTOVJ3M4yBqDACbBeNk
+PuWo05AOQ3M1dLE1hkN36G+IRgQTEQIABgUCR5ZbMwAKCRA7MBG3a51lI7PfAKCc
+9ZtKfI5G/g66V7pSMXh9gi+ykgCgivPfGMDh9HIROwBIudo2qGImOqI=
+=htdw
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc b/src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc
new file mode 100644
index 00000000..74ff59e0
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc
@@ -0,0 +1,20 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+mQGiBER0iroRBADfqUeJmPCXqPJFnf3CVKy40dL1F+gfvP+JHN7/uu4c9+oCYjI1
+uAE8iGTm/Twb/Zzbs4dt0iWjhNFXbRi42rMww4d/8QcPYZ21WSehh+fv8nCjt2sw
+LeC87ar2SR8OTpJBK0fQlcd4e6H5GMntfI6SYEUOPd8m/eQ+4+1AxpUUpwCgswaF
+13fePZGI//pDn5tGjbvmaP8D/R3qum/I+oDS8lbFeeDS10GkEkwTYec13gdfsq6I
+yzIj7VBsC+rGfbipv+VGR61Q4d19pOHKLDekr9OG+3G4ZcYM4NQvQZR+QIlp3xWu
+nBmYD1LRkHLVj+Z4DGQhjjOffkPSuacKPymMaZ/aRiLgTIAo97W2YPhutscXrLSG
+2Y+BA/4jsyaDb7kbW4wc8RtPIcuFEheVqgBeRakP9Uj47kBMBEpPtI/mIdY5liKk
+ztKnuQG6ROYLNV/PW0ZbE1uT64C710weh4cB3PnZLV5P10deDLBjHk8MJQGCTSDD
+JYvhutUzQfshAU6j2kErGvKdZxWGezab34vFyMP2oLGqswPAJrRQTm92ZWxsIFBy
+b3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20pIDxub3ZlbGwt
+cHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6IZgQTEQIAJgIbAwYLCQgHAwIEFQIIAwQW
+AgMBAh4BAheABQJIFkiPBQkHhmvVAAoJEBTCi8l+LjsFn4QAn2wgOHudNubNZvTz
+NdaYJKJ0m2qnAJ9hd0nQBhn28H4Ii4a4h7kpGWRxN4hGBBMRAgAGBQJEexD/AAoJ
+EKhO2uicgArKFLwAn0B+g2mJ5n8LrBziTQ5SjnSPyDBXAJwJoYTta5Sfw/3vVGpU
+fJAKVDoB9w==
+=MWDN
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc b/src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc
new file mode 100644
index 00000000..daeef8a5
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc
@@ -0,0 +1,37 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (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
+YWdlIFNpZ25pbmcgS2V5IDxidWlsZEBzdXNlLmRlPohiBBMRAgAiAhsDBAsHAwID
+FQIDAxYCAQIeAQIXgAUCSB80OgUJEfKmuQAKCRCoTtronIAKyuJlAJ0cWZifmBO6
+Eh71jattipdMhUYBTwCfSXbJJtuF3c96JPmpmT8be2LDo86IRgQQEQIABgUCOnBe
+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
+1dbriEwEGBECAAwFAkgfNGYFCRHyptQACgkQqE7a6JyACsrv3ACbBLhafFXmTjH3
+JJWFJGWuIOaZUosAniPs4feEyN46gjXGgcZc2Ai8nkm6
+=mY6G
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc b/src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc
new file mode 100644
index 00000000..8467c19b
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc
@@ -0,0 +1,31 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+mQILBERqCJkBEACdqhZWdAbUHLIumXMEgv+GFjr1ZzVHgynnFOzztU/8sxZNa9cm
+YV4HZpVfjMr7fos3ArzyiPPt/336cf7w9p79/ZS4rHSNPDMlPCtXYvFxUbvU0/GY
+q4jwcBsrJ0xaJ9CP5bWyAgVKOb7Y6k0ktaLjRR+tDfMsHA4H0ClMoRr6ATw8NL0e
+VCfAHuzqCKvX1If8ng+wTivtAhKvz/WwQiELNELmPfc5tZHOw8NgP/r0Pze18Hn2
+dlAHu0WpC7uoR00vscsMIJiJJPcsxbL1F1eADKnk+wEy8Go+EJeJ5i0WoFbqD52q
+Lv/C/oY6NVtVY0MBwtn+oQNSnQ4JBsB/Akdt53LAi0ZtNQxMyUW+76R8FCOmVCV8
+WGiF5CPRP0yvG80AMBjBjKjHb/v8ov5MnIyFimzAHS1gQcUNxTEYA/5eFwoYcGcK
+weGq9FUjPTzLQAgvp7XmOzHpSAfJ7qysxFTepNsSZZhgizJyInrdQldr+GYcUNqB
+krD9MWmFop975OxhCTEnNv/HcE79r8WD26HzDFYxTiTJbr0pU/ivBzo+rjq+YG2V
+stJk+udVYmZTnC4LmXus8JiNuqBXbxNscwCBpcJ8YcfCV6uh+7E0XfXZsgVUFLp1
+NF+ylYRGTycOlWoZODrnJevZW7N9O3bWRx/G2P4bJD07LsDLe4i5hymf5QAGKbRQ
+Tm92ZWxsIFByb3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20p
+IDxub3ZlbGwtcHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6JAjMEEwECAB0FAkRqCJkG
+CwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRBHijLooZEiCKSFD/93vZHCAMLEfksU
+KnvXl08bv1rfuamuyJnE3ANRE5RDyypriHMCnkVxazvQ2WI4W4UEjluL9+SzZwtV
+ZvKVoAr31614nSyWwv2YnJTHfjMG+xRlkolZMnuIiB9PcCBo9+GPU0ABuzo4pEJW
+NIRoSS1NFbAZBhtUnY0cN+trM5QObLl7xXTavLyGk//blkk57fov7GXsQJlZUig0
+l2yt5XNyGpLUnTMDumHh8b389quF+0+ZfdwOy7A768xjipAZiTvIujBrEv51wrxh
+0HBT0VGA0MhD9t0B+Ce4BM9P/iVMO00naaOp6PqMfPPKxQQqer8qy1i6UWBx95SY
+mKZBIvOm2d9PezDxkckCu61r6krx1iKnT1wdprCAkIYwALK118SpbxuyGW0bhRHc
+wsc/akzWH72fS0Xu49mvL4k4A2U9asdeQid3dMgbtm5mSWof0yiU/G4YNn0yeXoY
+oG1VbCAqQbFX1Rvd6GITJVqI+ekW/uMA9BP78dF8wBeG0+QmpQnSf+eOsxB/RT8o
+Kb4hHY+29MUlg+i9ceVt7hoKr03J/uIG5TXFXRYLaI0iAFVlKfWxpqDfS2XA4+dD
+VYt+5RDgBcnxDaTB4FE9GqcYScNfe7+NFtL0p0wOPftbmgZzGjucTmrD8mDUNdqA
+xGK7vlk4GATSfOQlq7G6LXW6RYnInohGBBMRAgAGBQJEazMlAAoJEKhO2uicgArK
+2vMAn0TbVDESEVKVuFZStrfIzOvJQrR9AJsH733Ju1kE99GFrdfCeGqpckmNhg==
+=E+qN
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/pubring.gpg b/src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/pubring.gpg
new file mode 100644
index 00000000..5bd5a78e
--- /dev/null
+++ b/src/lib/distro-info/suse-11.1_x86_64/trusted-package-keys/pubring.gpg
Binary files differ
diff --git a/src/lib/distro-info/suse-11.2/export-filter.example b/src/lib/distro-info/suse-11.2/export-filter.example
new file mode 100644
index 00000000..a414fef4
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2/export-filter.example
@@ -0,0 +1,15 @@
+# this file defines the filter rules used when exporting a vendor-OS
+# of this distro
+#
+# copy this file to 'export-filter' and add your own filters to it
+# in order to overrule the filters provided by openslx
+#
+#Examples:
+# the following line would include anything below /var/spool/
+#+ /var/spool/*
+#
+# this would exclude anything in /etc that starts with dhcpd.conf
+#- /etc/dhcpd.conf*
+#
+# and this would exclude all rpmnew-files:
+#- *.rpmnew
diff --git a/src/lib/distro-info/suse-11.2/mirrors/base b/src/lib/distro-info/suse-11.2/mirrors/base
new file mode 100644
index 00000000..e30465d5
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2/mirrors/base
@@ -0,0 +1,252 @@
+http://opensuse.mirror.ac.za/opensuse/distribution/11.2/repo/oss
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.2/repo/oss
+http://www.lizardsource.cn/distribution/11.2/repo/oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.2/repo/oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.2/repo/oss
+http://download.opensuse.or.id/distribution/11.2/repo/oss
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.2/repo/oss
+http://mirror.lupaworld.com/opensuse/distribution/11.2/repo/oss
+ftp://www.lizardsource.cn/distribution/11.2/repo/oss
+ftp://opensuse.mirror.ac.za/opensuse/distribution/11.2/repo/oss
+http://repo.ugm.ac.id/opensuse/distribution/11.2/repo/oss
+http://opensuse.cbn.net.id/distribution/11.2/repo/oss
+http://mirror.unej.ac.id/opensuse/distribution/11.2/repo/oss
+http://dl2.foss-id.web.id/opensuse/distribution/11.2/repo/oss
+http://mirror.isoc.org.il/pub/opensuse/distribution/11.2/repo/oss
+ftp://dl2.foss-id.web.id/repo/opensuse/distribution/11.2/repo/oss
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.2/repo/oss
+ftp://opensuse.cbn.net.id/pub/opensuse/distribution/11.2/repo/oss
+http://ftp.kddilabs.jp/Linux/packages/opensuse/distribution/11.2/repo/oss
+ftp://mirror.isoc.org.il/opensuse/distribution/11.2/repo/oss
+ftp://repo.ugm.ac.id/opensuse/distribution/11.2/repo/oss
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.2/repo/oss
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/distribution/11.2/repo/oss
+ftp://ftp.kddilabs.jp/Linux/packages/opensusedistribution/11.2/repo/oss
+http://ftp.novell.co.jp/pub/opensuse/distribution/11.2/repo/oss
+ftp://mirror.unej.ac.id/opensuse/distribution/11.2/repo/oss
+http://ftp.riken.jp/Linux/opensuse/distribution/11.2/repo/oss
+ftp://ftp.riken.jp/Linux/opensuse/distribution/11.2/repo/oss
+http://ftp.daum.net/opensuse/distribution/11.2/repo/oss
+http://77.88.19.68/opensuse/distribution/11.2/repo/oss
+http://77.88.19.73/opensuse/distribution/11.2/repo/oss
+http://mirror.suse.ru/distribution/11.2/repo/oss
+http://77.88.19.74/opensuse/distribution/11.2/repo/oss
+http://93.158.155.193/opensuse/distribution/11.2/repo/oss
+ftp://ftp.daum.net/opensuse/distribution/11.2/repo/oss
+ftp://seeder.yandex.net/opensuse/distribution/11.2/repo/oss
+ftp://ftp.chg.ru/pub/opensuse/distribution/11.2/repo/oss
+ftp://allotter.yandex.net/opensuse/distribution/11.2/repo/oss
+http://mirror.nus.edu.sg/opensuse/distribution/11.2/repo/oss
+ftp://dispenser.yandex.net/opensuse/distribution/11.2/repo/oss
+ftp://ftp.kaist.ac.kr/opensuse/distribution/11.2/repo/oss
+ftp://spreader.yandex.net/opensuse/distribution/11.2/repo/oss
+ftp://ftp.novell.co.jp/pub/opensuse/distribution/11.2/repo/oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.2/repo/oss
+ftp://ftp.metu.edu.tr/opensuse/distribution/11.2/repo/oss
+http://ftp.isu.edu.tw/pub/Linux/opensuse/distribution/11.2/repo/oss
+ftp://mirror.in.th/opensuse/distribution/11.2/repo/oss
+ftp://ftp.isu.edu.tw/pub/Linux/OpenSuSE/distribution/11.2/repo/oss
+http://ftp.chg.ru/pub/opensuse/distribution/11.2/repo/oss
+http://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.2/repo/oss
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.2/repo/oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.2/repo/oss
+http://ftp.twaren.net/Linux/OpenSuSE/distribution/11.2/repo/oss
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.2/repo/oss
+ftp://ftp.twaren.net/Linux/OpenSuSE/distribution/11.2/repo/oss
+http://suse.inode.at/opensuse/distribution/11.2/repo/oss
+http://mirror-fpt-telecom.fpt.net/opensuse/distribution/11.2/repo/oss
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.2/repo/oss
+http://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.2/repo/oss
+http://ftp.tugraz.at/mirror/opensuse/distribution/11.2/repo/oss
+ftp://suse.inode.at/opensuse/distribution/11.2/repo/oss
+ftp://ftp.tugraz.at/mirror/opensuse/distribution/11.2/repo/oss
+http://suse.lagis.at/opensuse/distribution/11.2/repo/oss
+http://mirror.opensuse.com.ba/opensuse/distribution/11.2/repo/oss
+http://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.2/repo/oss
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.2/repo/oss
+ftp://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.2/repo/oss
+http://mirrors.netbg.com/opensuse/distribution/11.2/repo/oss
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.2/repo/oss
+ftp://suse.lagis.at/opensuse/distribution/11.2/repo/oss
+http://mirror.karneval.cz/pub/linux/opensuse/distribution/11.2/repo/oss
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.2/repo/oss
+http://mirror.switch.ch/ftp/mirror/opensuse/distribution/11.2/repo/oss
+http://ftp.linux.cz/pub/linux/opensuse/distribution/11.2/repo/oss
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.2/repo/oss
+http://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.2/repo/oss
+ftp://mirror.karneval.cz/pub/linux/opensuse/distribution/11.2/repo/oss
+ftp://mirrors.netbg.com/opensuse/distribution/11.2/repo/oss
+http://ftp5.gwdg.de/pub/opensuse/distribution/11.2/repo/oss
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.2/repo/oss
+ftp://mirror.switch.ch/mirror/opensuse/distribution/11.2/repo/oss
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/distribution/11.2/repo/oss
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.2/repo/oss
+ftp://ftp5.gwdg.de/pub/opensuse/distribution/11.2/repo/oss
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/distribution/11.2/repo/oss
+http://download.uni-hd.de/ftp/pub/linux/opensuse/distribution/11.2/repo/oss
+ftp://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.2/repo/oss
+http://opensuse.intergenia.de/distribution/11.2/repo/oss
+http://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.2/repo/oss
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.2/repo/oss
+ftp://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.2/repo/oss
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.2/repo/oss
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/distribution/11.2/repo/oss
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/distribution/11.2/repo/oss
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.2/repo/oss
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.2/repo/oss
+http://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.2/repo/oss
+http://ftp3.gwdg.de/pub/opensuse/distribution/11.2/repo/oss
+http://ftp.uni-kassel.de/opensuse/distribution/11.2/repo/oss
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.2/repo/oss
+http://widehat.opensuse.org/distribution/11.2/repo/oss
+http://ftp4.gwdg.de/pub/opensuse/distribution/11.2/repo/oss
+ftp://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.2/repo/oss
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.2/repo/oss
+ftp://ftp4.gwdg.de/pub/opensuse/distribution/11.2/repo/oss
+http://ftp.uni-bayreuth.de/linux/opensuse/distribution/11.2/repo/oss
+http://opensuse-linuxmigratio.at/distribution/11.2/repo/oss
+http://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.2/repo/oss
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.2/repo/oss
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.2/repo/oss
+http://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.2/repo/oss
+http://ftp.klid.dk/ftp/opensuse/distribution/11.2/repo/oss
+ftp://ftp3.gwdg.de/pub/opensuse/distribution/11.2/repo/oss
+http://ftp.uni-siegen.de/opensuse/distribution/11.2/repo/oss
+ftp://ftp.uni-siegen.de/pub/opensuse/distribution/11.2/repo/oss
+http://ftp.estpak.ee/pub/suse/opensuse/distribution/11.2/repo/oss
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/distribution/11.2/repo/oss
+http://ftp.gui.uva.es/sites/opensuse.org/distribution/11.2/repo/oss
+http://ftp.rediris.es/pub/mirror/opensuse/distribution/11.2/repo/oss
+ftp://ftp.uni-bayreuth.de/linux/opensuse/distribution/11.2/repo/oss
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.2/repo/oss
+http://suse.bifi.unizar.es/opensuse/distribution/11.2/repo/oss
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.2/repo/oss
+http://opensuse.mirrors.proxad.net/opensuse/distribution/11.2/repo/oss
+ftp://ftp.klid.dk/opensuse/distribution/11.2/repo/oss
+http://mirror.ovh.net/opensuse/distribution/11.2/repo/oss
+http://fr2.rpmfind.net/linux/opensuse/distribution/11.2/repo/oss
+ftp://ftp.gui.uva.es/sites/opensuse.org/distribution/11.2/repo/oss
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.2/repo/oss
+ftp://fr2.rpmfind.net/linux/opensuse/distribution/11.2/repo/oss
+http://opensuse.cict.fr/distribution/11.2/repo/oss
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/distribution/11.2/repo/oss
+ftp://mirror.cict.fr/opensuse/distribution/11.2/repo/oss
+http://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.2/repo/oss
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.2/repo/oss
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/distribution/11.2/repo/oss
+ftp://ftp.rediris.es/pub/mirror/opensuse/distribution/11.2/repo/oss
+ftp://mirror.ovh.net/opensuse/distribution/11.2/repo/oss
+ftp://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.2/repo/oss
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.2/repo/oss
+http://ftp.ntua.gr/pub/linux/opensuse/distribution/11.2/repo/oss
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.2/repo/oss
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.2/repo/oss
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/distribution/11.2/repo/oss
+http://roxen.integrity.hu/pub/opensuse/distribution/11.2/repo/oss
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.2/repo/oss
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.2/repo/oss
+ftp://ftp.ntua.gr/pub/linux/opensusedistribution/11.2/repo/oss
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.2/repo/oss
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.2/repo/oss
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.2/repo/oss
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.2/repo/oss
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.2/repo/oss
+http://rm.mirror.garr.it/mirrors/opensuse/distribution/11.2/repo/oss
+http://mirror.leaseweb.com/opensuse/distribution/11.2/repo/oss
+ftp://rm.mirror.garr.it/mirrors/opensusedistribution/11.2/repo/oss
+http://mirrors.nl.eu.kernel.org/opensuse/distribution/11.2/repo/oss
+http://repo1.linux.edu.lv/distribution/11.2/repo/oss
+ftp://mirrors.nl.eu.kernel.org/opensuse/distribution/11.2/repo/oss
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/distribution/11.2/repo/oss
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.2/repo/oss
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/distribution/11.2/repo/oss
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.2/repo/oss
+http://opensuse.hro.nl/opensuse/distribution/11.2/repo/oss
+ftp://repo1.linux.edu.lv/distribution/11.2/repo/oss
+ftp://opensuse.hro.nl/opensuse/distribution/11.2/repo/oss
+http://opensuse.uib.no/distribution/11.2/repo/oss
+ftp://mirror.leaseweb.com/opensuse/distribution/11.2/repo/oss
+http://ftp.uninett.no/pub/linux/opensuse/distribution/11.2/repo/oss
+http://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.2/repo/oss
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.2/repo/oss
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/distribution/11.2/repo/oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.2/repo/oss
+ftp://ftp.uninett.no/pub/linux/opensuse/distribution/11.2/repo/oss
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.2/repo/oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.2/repo/oss
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.2/repo/oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.2/repo/oss
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.2/repo/oss
+http://ftp.sileman.pl/pub/opensuse/distribution/11.2/repo/oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.2/repo/oss
+http://cesium.di.uminho.pt/pub/opensuse/distribution/11.2/repo/oss
+ftp://cesium.di.uminho.pt/pub/opensuse/distribution/11.2/repo/oss
+ftp://ftp.sileman.pl/pub/opensuse/distribution/11.2/repo/oss
+http://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.2/repo/oss
+http://ftp.gts.lug.ro/opensuse/distribution/11.2/repo/oss
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.2/repo/oss
+http://ftp.ines.lug.ro/opensuse/distribution/11.2/repo/oss
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.2/repo/oss
+http://mirrors.se.eu.kernel.org/opensuse/distribution/11.2/repo/oss
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.2/repo/oss
+ftp://ftp.ines.lug.ro/opensuse/distribution/11.2/repo/oss
+http://ftp.df.lth.se/pub/opensuse/distribution/11.2/repo/oss
+ftp://ftp.df.lth.se/pub/opensusedistribution/11.2/repo/oss
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.2/repo/oss
+ftp://ftp.gts.lug.ro/opensuse/distribution/11.2/repo/oss
+http://opensuse.ynet.sk/distribution/11.2/repo/oss
+http://less.cogeco.net/ftp/openSUSE/distribution/11.2/repo/oss
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.2/repo/oss
+http://www.muug.mb.ca/pub/opensuse/distribution/11.2/repo/oss
+ftp://mirrors.se.eu.kernel.org/opensuse/distribution/11.2/repo/oss
+http://linux.dell.com/repo/community/distribution/11.2/repo/oss
+ftp://www.muug.mb.ca/pub/opensuse/distribution/11.2/repo/oss
+http://ftp.osuosl.org/pub/opensuse/distribution/11.2/repo/oss
+http://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.2/repo/oss
+ftp://ftp.osuosl.org/pub/opensuse/distribution/11.2/repo/oss
+http://suse.mirrors.tds.net/pub/opensuse/distribution/11.2/repo/oss
+ftp://less.cogeco.net/openSUSE/distribution/11.2/repo/oss
+http://mirrors.med.harvard.edu/opensuse/distribution/11.2/repo/oss
+http://opensuse.cs.utah.edu/distribution/11.2/repo/oss
+http://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.2/repo/oss
+http://mirror.umoss.org/opensuse/distribution/11.2/repo/oss
+http://opensuse.ca.unixheads.org/distribution/11.2/repo/oss
+ftp://opensuse.cs.utah.edu/pub/opensuse/distribution/11.2/repo/oss
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.2/repo/oss
+http://mirrors.xmission.com/opensuse/distribution/11.2/repo/oss
+ftp://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.2/repo/oss
+ftp://suse.mirrors.tds.net/pub/opensuse/distribution/11.2/repo/oss
+http://mirrors2.kernel.org/opensuse/distribution/11.2/repo/oss
+http://mirrors1.kernel.org/opensuse/distribution/11.2/repo/oss
+ftp://mirrors2.kernel.org/opensuse/distribution/11.2/repo/oss
+http://mirror.rackspace.com/openSUSE/distribution/11.2/repo/oss
+http://130.57.19.201/distribution/11.2/repo/oss
+ftp://mirror.rackspace.com/openSUSE/distribution/11.2/repo/oss
+ftp://130.57.19.201/pub/opensuse/distribution/11.2/repo/oss
+http://ftp.utexas.edu/opensuse/distribution/11.2/repo/oss
+http://www.gtlib.gatech.edu/pub/opensuse/distribution/11.2/repo/oss
+ftp://www.gtlib.gatech.edu/pub/opensuse/distribution/11.2/repo/oss
+http://ftp.ussg.iu.edu/linux/opensuse/distribution/11.2/repo/oss
+ftp://ftp.utexas.edu/mirrors/opensuse/distribution/11.2/repo/oss
+ftp://mirrors.xmission.com/opensuse/distribution/11.2/repo/oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.2/repo/oss
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/distribution/11.2/repo/oss
+http://mirror.cps.cmich.edu/opensuse/opensuse/distribution/11.2/repo/oss
+http://mirror.nyi.net/opensuse/distribution/11.2/repo/oss
+ftp://mirrors1.kernel.org/opensuse/distribution/11.2/repo/oss
+http://mirrors.rit.edu/opensuse/distribution/11.2/repo/oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.2/repo/oss
+http://ftp.iinet.net.au/pub/opensuse/distribution/11.2/repo/oss
+ftp://mirror.nyi.net/opensusedistribution/11.2/repo/oss
+http://mirror.internode.on.net/pub/opensuse/distribution/11.2/repo/oss
+http://mirror.pacific.net.au/linux/opensuse/distribution/11.2/repo/oss
+ftp://ftp.iinet.net.au/pub/opensuse/distribution/11.2/repo/oss
+ftp://mirror.pacific.net.au/linux/opensuse/distribution/11.2/repo/oss
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.2/repo/oss
+http://opensuse.patan.com.ar/distribution/11.2/repo/oss
+http://200.221.9.37/pub/opensuse/distribution/11.2/repo/oss
+http://opensuse.c3sl.ufpr.br/distribution/11.2/repo/oss
+http://opensuse.pop.com.br/distribution/11.2/repo/oss
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.2/repo/oss
+ftp://opensuse.c3sl.ufpr.br/opensuse/distribution/11.2/repo/oss
+ftp://mirror.internode.on.net/pub/opensuse/distribution/11.2/repo/oss
diff --git a/src/lib/distro-info/suse-11.2/mirrors/base_non-oss b/src/lib/distro-info/suse-11.2/mirrors/base_non-oss
new file mode 100644
index 00000000..47ee0d08
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2/mirrors/base_non-oss
@@ -0,0 +1,250 @@
+http://opensuse.mirror.ac.za/opensuse/distribution/11.2/repo/non-oss
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.2/repo/non-oss
+http://mirror.lupaworld.com/opensuse/distribution/11.2/repo/non-oss
+http://www.lizardsource.cn/distribution/11.2/repo/non-oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.2/repo/non-oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.2/repo/non-oss
+ftp://www.lizardsource.cn/distribution/11.2/repo/non-oss
+ftp://opensuse.mirror.ac.za/opensuse/distribution/11.2/repo/non-oss
+http://mirror.unej.ac.id/opensuse/distribution/11.2/repo/non-oss
+http://opensuse.cbn.net.id/distribution/11.2/repo/non-oss
+http://download.opensuse.or.id/distribution/11.2/repo/non-oss
+http://repo.ugm.ac.id/opensuse/distribution/11.2/repo/non-oss
+ftp://opensuse.cbn.net.id/pub/opensuse/distribution/11.2/repo/non-oss
+http://dl2.foss-id.web.id/opensuse/distribution/11.2/repo/non-oss
+http://mirror.isoc.org.il/pub/opensuse/distribution/11.2/repo/non-oss
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.2/repo/non-oss
+ftp://dl2.foss-id.web.id/repo/opensuse/distribution/11.2/repo/non-oss
+http://ftp.kddilabs.jp/Linux/packages/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.2/repo/non-oss
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/distribution/11.2/repo/non-oss
+ftp://mirror.isoc.org.il/opensuse/distribution/11.2/repo/non-oss
+http://ftp.novell.co.jp/pub/opensuse/distribution/11.2/repo/non-oss
+ftp://repo.ugm.ac.id/opensuse/distribution/11.2/repo/non-oss
+http://ftp.riken.jp/Linux/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.novell.co.jp/pub/opensuse/distribution/11.2/repo/non-oss
+http://ftp.daum.net/opensuse/distribution/11.2/repo/non-oss
+http://77.88.19.68/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.kddilabs.jp/Linux/packages/opensusedistribution/11.2/repo/non-oss
+http://77.88.19.73/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.riken.jp/Linux/opensuse/distribution/11.2/repo/non-oss
+http://mirror.suse.ru/distribution/11.2/repo/non-oss
+http://77.88.19.74/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.chg.ru/pub/opensuse/distribution/11.2/repo/non-oss
+ftp://spreader.yandex.net/opensuse/distribution/11.2/repo/non-oss
+http://mirror.nus.edu.sg/opensuse/distribution/11.2/repo/non-oss
+ftp://dispenser.yandex.net/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.kaist.ac.kr/opensuse/distribution/11.2/repo/non-oss
+ftp://seeder.yandex.net/opensuse/distribution/11.2/repo/non-oss
+ftp://mirror.in.th/opensuse/distribution/11.2/repo/non-oss
+ftp://allotter.yandex.net/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.metu.edu.tr/opensuse/distribution/11.2/repo/non-oss
+http://ftp.isu.edu.tw/pub/Linux/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.isu.edu.tw/pub/Linux/OpenSuSE/distribution/11.2/repo/non-oss
+http://ftp.chg.ru/pub/opensuse/distribution/11.2/repo/non-oss
+http://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.2/repo/non-oss
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.2/repo/non-oss
+http://ftp.twaren.net/Linux/OpenSuSE/distribution/11.2/repo/non-oss
+http://mirror-fpt-telecom.fpt.net/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.twaren.net/Linux/OpenSuSE/distribution/11.2/repo/non-oss
+http://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.2/repo/non-oss
+http://suse.inode.at/opensuse/distribution/11.2/repo/non-oss
+http://ftp.tugraz.at/mirror/opensuse/distribution/11.2/repo/non-oss
+ftp://suse.inode.at/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.tugraz.at/mirror/opensuse/distribution/11.2/repo/non-oss
+http://suse.lagis.at/opensuse/distribution/11.2/repo/non-oss
+ftp://suse.lagis.at/opensuse/distribution/11.2/repo/non-oss
+http://mirror.opensuse.com.ba/opensuse/distribution/11.2/repo/non-oss
+http://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.2/repo/non-oss
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.2/repo/non-oss
+http://mirrors.netbg.com/opensuse/distribution/11.2/repo/non-oss
+http://mirror.switch.ch/ftp/mirror/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.2/repo/non-oss
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.2/repo/non-oss
+http://mirror.karneval.cz/pub/linux/opensuse/distribution/11.2/repo/non-oss
+ftp://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.2/repo/non-oss
+ftp://mirrors.netbg.com/opensuse/distribution/11.2/repo/non-oss
+ftp://mirror.switch.ch/mirror/opensuse/distribution/11.2/repo/non-oss
+http://ftp.linux.cz/pub/linux/opensuse/distribution/11.2/repo/non-oss
+http://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.2/repo/non-oss
+ftp://mirror.karneval.cz/pub/linux/opensuse/distribution/11.2/repo/non-oss
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.2/repo/non-oss
+http://ftp5.gwdg.de/pub/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.2/repo/non-oss
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.2/repo/non-oss
+http://download.uni-hd.de/ftp/pub/linux/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.2/repo/non-oss
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp5.gwdg.de/pub/opensuse/distribution/11.2/repo/non-oss
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/distribution/11.2/repo/non-oss
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/distribution/11.2/repo/non-oss
+http://opensuse.intergenia.de/distribution/11.2/repo/non-oss
+http://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.2/repo/non-oss
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.2/repo/non-oss
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.2/repo/non-oss
+http://widehat.opensuse.org/distribution/11.2/repo/non-oss
+http://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.2/repo/non-oss
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.2/repo/non-oss
+http://ftp4.gwdg.de/pub/opensuse/distribution/11.2/repo/non-oss
+http://ftp3.gwdg.de/pub/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp4.gwdg.de/pub/opensuse/distribution/11.2/repo/non-oss
+http://ftp.uni-kassel.de/opensuse/distribution/11.2/repo/non-oss
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.2/repo/non-oss
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.2/repo/non-oss
+http://ftp.uni-bayreuth.de/linux/opensuse/distribution/11.2/repo/non-oss
+http://opensuse-linuxmigratio.at/distribution/11.2/repo/non-oss
+ftp://ftp3.gwdg.de/pub/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.2/repo/non-oss
+http://ftp.uni-siegen.de/opensuse/distribution/11.2/repo/non-oss
+http://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.2/repo/non-oss
+http://ftp.klid.dk/ftp/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.2/repo/non-oss
+http://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.klid.dk/opensuse/distribution/11.2/repo/non-oss
+http://ftp.estpak.ee/pub/suse/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.2/repo/non-oss
+http://ftp.gui.uva.es/sites/opensuse.org/distribution/11.2/repo/non-oss
+ftp://ftp.uni-siegen.de/pub/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.uni-bayreuth.de/linux/opensuse/distribution/11.2/repo/non-oss
+http://ftp.rediris.es/pub/mirror/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.rediris.es/pub/mirror/opensuse/distribution/11.2/repo/non-oss
+http://suse.bifi.unizar.es/opensuse/distribution/11.2/repo/non-oss
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.gui.uva.es/sites/opensuse.org/distribution/11.2/repo/non-oss
+http://opensuse.mirrors.proxad.net/opensuse/distribution/11.2/repo/non-oss
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/distribution/11.2/repo/non-oss
+http://fr2.rpmfind.net/linux/opensuse/distribution/11.2/repo/non-oss
+ftp://mirror.ovh.net/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.2/repo/non-oss
+http://opensuse.cict.fr/distribution/11.2/repo/non-oss
+http://mirror.ovh.net/opensuse/distribution/11.2/repo/non-oss
+http://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.2/repo/non-oss
+ftp://fr2.rpmfind.net/linux/opensuse/distribution/11.2/repo/non-oss
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.2/repo/non-oss
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/distribution/11.2/repo/non-oss
+ftp://mirror.cict.fr/opensuse/distribution/11.2/repo/non-oss
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.2/repo/non-oss
+http://ftp.ntua.gr/pub/linux/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.ntua.gr/pub/linux/opensusedistribution/11.2/repo/non-oss
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.2/repo/non-oss
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/distribution/11.2/repo/non-oss
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.2/repo/non-oss
+ftp://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.2/repo/non-oss
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.2/repo/non-oss
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.2/repo/non-oss
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.2/repo/non-oss
+http://rm.mirror.garr.it/mirrors/opensuse/distribution/11.2/repo/non-oss
+http://roxen.integrity.hu/pub/opensuse/distribution/11.2/repo/non-oss
+http://repo1.linux.edu.lv/distribution/11.2/repo/non-oss
+http://mirror.leaseweb.com/opensuse/distribution/11.2/repo/non-oss
+ftp://repo1.linux.edu.lv/distribution/11.2/repo/non-oss
+ftp://mirror.leaseweb.com/opensuse/distribution/11.2/repo/non-oss
+ftp://rm.mirror.garr.it/mirrors/opensusedistribution/11.2/repo/non-oss
+http://mirrors.nl.eu.kernel.org/opensuse/distribution/11.2/repo/non-oss
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/distribution/11.2/repo/non-oss
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/distribution/11.2/repo/non-oss
+http://opensuse.hro.nl/opensuse/distribution/11.2/repo/non-oss
+http://opensuse.uib.no/distribution/11.2/repo/non-oss
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/distribution/11.2/repo/non-oss
+http://ftp.uninett.no/pub/linux/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.2/repo/non-oss
+ftp://mirrors.nl.eu.kernel.org/opensuse/distribution/11.2/repo/non-oss
+http://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.2/repo/non-oss
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.uninett.no/pub/linux/opensuse/distribution/11.2/repo/non-oss
+ftp://opensuse.hro.nl/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.2/repo/non-oss
+http://ftp.sileman.pl/pub/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.2/repo/non-oss
+http://cesium.di.uminho.pt/pub/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.2/repo/non-oss
+http://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.2/repo/non-oss
+ftp://cesium.di.uminho.pt/pub/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.gts.lug.ro/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.sileman.pl/pub/opensuse/distribution/11.2/repo/non-oss
+http://ftp.ines.lug.ro/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.2/repo/non-oss
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.2/repo/non-oss
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.2/repo/non-oss
+http://mirrors.se.eu.kernel.org/opensuse/distribution/11.2/repo/non-oss
+ftp://mirrors.se.eu.kernel.org/opensuse/distribution/11.2/repo/non-oss
+http://ftp.gts.lug.ro/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.ines.lug.ro/opensuse/distribution/11.2/repo/non-oss
+http://ftp.df.lth.se/pub/opensuse/distribution/11.2/repo/non-oss
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.2/repo/non-oss
+http://opensuse.ynet.sk/distribution/11.2/repo/non-oss
+http://less.cogeco.net/ftp/openSUSE/distribution/11.2/repo/non-oss
+http://linux.dell.com/repo/community/distribution/11.2/repo/non-oss
+ftp://less.cogeco.net/openSUSE/distribution/11.2/repo/non-oss
+ftp://ftp.df.lth.se/pub/opensusedistribution/11.2/repo/non-oss
+http://ftp.osuosl.org/pub/opensuse/distribution/11.2/repo/non-oss
+http://www.muug.mb.ca/pub/opensuse/distribution/11.2/repo/non-oss
+http://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.osuosl.org/pub/opensuse/distribution/11.2/repo/non-oss
+http://suse.mirrors.tds.net/pub/opensuse/distribution/11.2/repo/non-oss
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.2/repo/non-oss
+http://mirrors.med.harvard.edu/opensuse/distribution/11.2/repo/non-oss
+ftp://suse.mirrors.tds.net/pub/opensuse/distribution/11.2/repo/non-oss
+http://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.2/repo/non-oss
+ftp://www.muug.mb.ca/pub/opensuse/distribution/11.2/repo/non-oss
+http://mirror.umoss.org/opensuse/distribution/11.2/repo/non-oss
+http://opensuse.cs.utah.edu/distribution/11.2/repo/non-oss
+http://opensuse.ca.unixheads.org/distribution/11.2/repo/non-oss
+ftp://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.2/repo/non-oss
+http://mirrors2.kernel.org/opensuse/distribution/11.2/repo/non-oss
+ftp://opensuse.cs.utah.edu/pub/opensuse/distribution/11.2/repo/non-oss
+http://mirrors1.kernel.org/opensuse/distribution/11.2/repo/non-oss
+http://mirrors.xmission.com/opensuse/distribution/11.2/repo/non-oss
+http://mirror.rackspace.com/openSUSE/distribution/11.2/repo/non-oss
+http://130.57.19.201/distribution/11.2/repo/non-oss
+ftp://mirrors.xmission.com/opensuse/distribution/11.2/repo/non-oss
+ftp://130.57.19.201/pub/opensuse/distribution/11.2/repo/non-oss
+http://www.gtlib.gatech.edu/pub/opensuse/distribution/11.2/repo/non-oss
+ftp://mirrors2.kernel.org/opensuse/distribution/11.2/repo/non-oss
+http://ftp.ussg.iu.edu/linux/opensuse/distribution/11.2/repo/non-oss
+ftp://mirror.rackspace.com/openSUSE/distribution/11.2/repo/non-oss
+http://ftp.utexas.edu/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.ussg.iu.edu/linux/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.utexas.edu/mirrors/opensuse/distribution/11.2/repo/non-oss
+ftp://www.gtlib.gatech.edu/pub/opensuse/distribution/11.2/repo/non-oss
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/distribution/11.2/repo/non-oss
+http://mirror.cps.cmich.edu/opensuse/opensuse/distribution/11.2/repo/non-oss
+http://mirror.nyi.net/opensuse/distribution/11.2/repo/non-oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.2/repo/non-oss
+ftp://mirrors1.kernel.org/opensuse/distribution/11.2/repo/non-oss
+http://mirrors.rit.edu/opensuse/distribution/11.2/repo/non-oss
+http://ftp.iinet.net.au/pub/opensuse/distribution/11.2/repo/non-oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.2/repo/non-oss
+ftp://mirror.nyi.net/opensusedistribution/11.2/repo/non-oss
+http://mirror.internode.on.net/pub/opensuse/distribution/11.2/repo/non-oss
+http://mirror.pacific.net.au/linux/opensuse/distribution/11.2/repo/non-oss
+ftp://ftp.iinet.net.au/pub/opensuse/distribution/11.2/repo/non-oss
+ftp://mirror.internode.on.net/pub/opensuse/distribution/11.2/repo/non-oss
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.2/repo/non-oss
+ftp://mirror.pacific.net.au/linux/opensuse/distribution/11.2/repo/non-oss
+http://200.221.9.37/pub/opensuse/distribution/11.2/repo/non-oss
+http://opensuse.c3sl.ufpr.br/distribution/11.2/repo/non-oss
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.2/repo/non-oss
+http://opensuse.patan.com.ar/distribution/11.2/repo/non-oss
+http://opensuse.pop.com.br/distribution/11.2/repo/non-oss
+ftp://opensuse.c3sl.ufpr.br/opensuse/distribution/11.2/repo/non-oss
diff --git a/src/lib/distro-info/suse-11.2/mirrors/base_update b/src/lib/distro-info/suse-11.2/mirrors/base_update
new file mode 100644
index 00000000..bc6e9a4c
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2/mirrors/base_update
@@ -0,0 +1,252 @@
+http://mirror.lupaworld.com/opensuse/update/11.2
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/update/11.2
+http://opensuse.mirror.ac.za/opensuse/update/11.2
+ftp://opensuse.mirror.ac.za/opensuse/update/11.2
+http://www.lizardsource.cn/update/11.2
+http://mirror.alva.ge/pub/opensuse/update/11.2
+http://mirror.alva.ge/pub/opensuse/update/11.2
+http://download.opensuse.or.id/update/11.2
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/update/11.2
+ftp://www.lizardsource.cn/update/11.2
+http://opensuse.cbn.net.id/update/11.2
+http://mirror.unej.ac.id/opensuse/update/11.2
+http://dl2.foss-id.web.id/opensuse/update/11.2
+ftp://mirror.isoc.org.il/opensuse/update/11.2
+http://repo.ugm.ac.id/opensuse/update/11.2
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/update/11.2
+http://mirror.isoc.org.il/pub/opensuse/update/11.2
+http://ftp.kddilabs.jp/Linux/packages/opensuse/update/11.2
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/update/11.2
+ftp://dl2.foss-id.web.id/repo/opensuse/update/11.2
+ftp://mirror.unej.ac.id/opensuse/update/11.2
+ftp://opensuse.cbn.net.id/pub/opensuse/update/11.2
+http://ftp.novell.co.jp/pub/opensuse/update/11.2
+ftp://repo.ugm.ac.id/opensuse/update/11.2
+http://ftp.riken.jp/Linux/opensuse/update/11.2
+ftp://ftp.novell.co.jp/pub/opensuse/update/11.2
+ftp://ftp.kddilabs.jp/Linux/packages/opensuseupdate/11.2
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/update/11.2
+http://77.88.19.68/opensuse/update/11.2
+ftp://ftp.daum.net/opensuse/update/11.2
+http://77.88.19.73/opensuse/update/11.2
+ftp://ftp.riken.jp/Linux/opensuse/update/11.2
+http://mirror.suse.ru/update/11.2
+http://77.88.19.74/opensuse/update/11.2
+http://ftp.daum.net/opensuse/update/11.2
+http://93.158.155.193/opensuse/update/11.2
+ftp://ftp.kaist.ac.kr/opensuse/update/11.2
+ftp://spreader.yandex.net/opensuse/update/11.2
+ftp://ftp.chg.ru/pub/opensuse/update/11.2
+ftp://seeder.yandex.net/opensuse/update/11.2
+http://mirror.nus.edu.sg/opensuse/update/11.2
+ftp://mirror.in.th/opensuse/update/11.2
+ftp://allotter.yandex.net/opensuse/update/11.2
+ftp://ftp.suntel.com.tr/pub/opensuse/update/11.2
+ftp://ftp.metu.edu.tr/opensuse/update/11.2
+ftp://dispenser.yandex.net/opensuse/update/11.2
+ftp://ftp.suntel.com.tr/pub/opensuse/update/11.2
+http://ftp.chg.ru/pub/opensuse/update/11.2
+http://ftp.isu.edu.tw/pub/Linux/opensuse/update/11.2
+http://mirror-fpt-telecom.fpt.net/opensuse/update/11.2
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/update/11.2
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/update/11.2
+http://ftp.ncnu.edu.tw/Linux/opensuse/update/11.2
+http://ftp.twaren.net/Linux/OpenSuSE/update/11.2
+ftp://ftp.isu.edu.tw/pub/Linux/OpenSuSE/update/11.2
+http://suse.inode.at/opensuse/update/11.2
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/update/11.2
+ftp://ftp.twaren.net/Linux/OpenSuSE/update/11.2
+http://ftp.tugraz.at/mirror/opensuse/update/11.2
+ftp://suse.inode.at/opensuse/update/11.2
+http://suse.lagis.at/opensuse/update/11.2
+http://ftp.belnet.be/mirror/ftp.opensuse.org/update/11.2
+ftp://ftp.tugraz.at/mirror/opensuse/update/11.2
+ftp://gd.tuwien.ac.at/opsys/linux/opensuse/update/11.2
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/update/11.2
+ftp://suse.lagis.at/opensuse/update/11.2
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/update/11.2
+http://mirror.opensuse.com.ba/opensuse/update/11.2
+http://mirrors.netbg.com/opensuse/update/11.2
+http://mirror.switch.ch/ftp/mirror/opensuse/update/11.2
+ftp://mirror.switch.ch/mirror/opensuse/update/11.2
+http://mirror.karneval.cz/pub/linux/opensuse/update/11.2
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/update/11.2
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/update/11.2
+http://ftp5.gwdg.de/pub/opensuse/update/11.2
+http://gd.tuwien.ac.at/opsys/linux/opensuse/update/11.2
+http://ftp.linux.cz/pub/linux/opensuse/update/11.2
+http://ftp.halifax.rwth-aachen.de/opensuse/update/11.2
+ftp://mirror.karneval.cz/pub/linux/opensuse/update/11.2
+ftp://mirrors.netbg.com/opensuse/update/11.2
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/update/11.2
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/update/11.2
+ftp://ftp.halifax.rwth-aachen.de/opensuse/update/11.2
+http://download.uni-hd.de/ftp/pub/linux/opensuse/update/11.2
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/update/11.2
+ftp://ftp5.gwdg.de/pub/opensuse/update/11.2
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/update/11.2
+http://opensuse.intergenia.de/update/11.2
+http://ftp.uni-ulm.de/mirrors/opensuse/update/11.2
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/update/11.2
+ftp://ftp.uni-ulm.de/mirrors/opensuse/update/11.2
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/update/11.2
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/update/11.2
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/update/11.2
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/update/11.2
+http://ftp.uni-kl.de/pub/linux/opensuse/update/11.2
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/update/11.2
+http://ftp3.gwdg.de/pub/opensuse/update/11.2
+ftp://ftp.uni-kl.de/pub/linux/opensuse/update/11.2
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/update/11.2
+http://widehat.opensuse.org/update/11.2
+http://ftp4.gwdg.de/pub/opensuse/update/11.2
+ftp://ftp4.gwdg.de/pub/opensuse/update/11.2
+ftp://ftp3.gwdg.de/pub/opensuse/update/11.2
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/update/11.2
+http://ftp.uni-kassel.de/opensuse/update/11.2
+http://ftp.uni-bayreuth.de/linux/opensuse/update/11.2
+http://opensuse-linuxmigratio.at/update/11.2
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/update/11.2
+http://ftp.tu-ilmenau.de/mirror/opensuse/update/11.2
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/update/11.2
+ftp://ftp.uni-siegen.de/pub/opensuse/update/11.2
+http://ftp.uni-paderborn.de/pub/linux/opensuse/update/11.2
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/update/11.2
+ftp://ftp.uni-bayreuth.de/linux/opensuse/update/11.2
+http://ftp.estpak.ee/pub/suse/opensuse/update/11.2
+http://ftp.gui.uva.es/sites/opensuse.org/update/11.2
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/update/11.2
+ftp://ftp.gui.uva.es/sites/opensuse.org/update/11.2
+http://ftp.rediris.es/pub/mirror/opensuse/update/11.2
+ftp://ftp.klid.dk/opensuse/update/11.2
+ftp://ftp.rediris.es/pub/mirror/opensuse/update/11.2
+http://suse.bifi.unizar.es/opensuse/update/11.2
+http://ftp.uni-siegen.de/opensuse/update/11.2
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/update/11.2
+http://ftp.klid.dk/ftp/opensuse/update/11.2
+http://opensuse.mirrors.proxad.net/opensuse/update/11.2
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/update/11.2
+ftp://mirror.ovh.net/opensuse/update/11.2
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/update/11.2
+http://mirror.ovh.net/opensuse/update/11.2
+http://www.mirrorservice.org/sites/download.opensuse.org/update/11.2
+http://fr2.rpmfind.net/linux/opensuse/update/11.2
+ftp://www.mirrorservice.org/sites/download.opensuse.org/update/11.2
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/update/11.2
+ftp://fr2.rpmfind.net/linux/opensuse/update/11.2
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/update/11.2
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/update/11.2
+http://opensuse.cict.fr/update/11.2
+http://ftp.ntua.gr/pub/linux/opensuse/update/11.2
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/update/11.2
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/update/11.2
+ftp://ftp.ntua.gr/pub/linux/opensuseupdate/11.2
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/update/11.2
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/update/11.2
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/update/11.2
+http://roxen.integrity.hu/pub/opensuse/update/11.2
+ftp://mirror.cict.fr/opensuse/update/11.2
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/update/11.2
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/update/11.2
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/update/11.2
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/update/11.2
+http://rm.mirror.garr.it/mirrors/opensuse/update/11.2
+http://repo1.linux.edu.lv/update/11.2
+ftp://repo1.linux.edu.lv/update/11.2
+http://mirror.leaseweb.com/opensuse/update/11.2
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/update/11.2
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/update/11.2
+ftp://mirror.leaseweb.com/opensuse/update/11.2
+ftp://rm.mirror.garr.it/mirrors/opensuseupdate/11.2
+ftp://mirrors.nl.eu.kernel.org/opensuse/update/11.2
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/update/11.2
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/update/11.2
+http://mirrors.nl.eu.kernel.org/opensuse/update/11.2
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/update/11.2
+http://opensuse.hro.nl/opensuse/update/11.2
+http://opensuse.uib.no/update/11.2
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/update/11.2
+http://ftp.uninett.no/pub/linux/opensuse/update/11.2
+http://ftp.icm.edu.pl/pub/Linux/opensuse/update/11.2
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/update/11.2
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/update/11.2
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/update/11.2
+ftp://ftp.uninett.no/pub/linux/opensuse/update/11.2
+ftp://opensuse.hro.nl/opensuse/update/11.2
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/update/11.2
+ftp://ftp.pbone.net/pub/opensuse/update/11.2
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/update/11.2
+http://ftp.sileman.pl/pub/opensuse/update/11.2
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/update/11.2
+ftp://ftp.sileman.pl/pub/opensuse/update/11.2
+ftp://ftp.pbone.net/pub/opensuse/update/11.2
+http://cesium.di.uminho.pt/pub/opensuse/update/11.2
+http://ftp.gts.lug.ro/opensuse/update/11.2
+ftp://cesium.di.uminho.pt/pub/opensuse/update/11.2
+ftp://ftp.gts.lug.ro/opensuse/update/11.2
+http://ftp.nux.ipb.pt/pub/dists/opensuse/update/11.2
+http://ftp.ines.lug.ro/opensuse/update/11.2
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/update/11.2
+ftp://ftp.ines.lug.ro/opensuse/update/11.2
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/update/11.2
+http://mirrors.se.eu.kernel.org/opensuse/update/11.2
+http://ftp.df.lth.se/pub/opensuse/update/11.2
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/update/11.2
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/update/11.2
+http://opensuse.ynet.sk/update/11.2
+ftp://mirrors.se.eu.kernel.org/opensuse/update/11.2
+ftp://ftp.df.lth.se/pub/opensuseupdate/11.2
+ftp://less.cogeco.net/openSUSE/update/11.2
+http://www.muug.mb.ca/pub/opensuse/update/11.2
+http://linux.dell.com/repo/community/update/11.2
+http://ftp.osuosl.org/pub/opensuse/update/11.2
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/update/11.2
+http://less.cogeco.net/ftp/openSUSE/update/11.2
+ftp://www.muug.mb.ca/pub/opensuse/update/11.2
+http://suse.mirrors.tds.net/pub/opensuse/update/11.2
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/update/11.2
+ftp://suse.mirrors.tds.net/pub/opensuse/update/11.2
+http://opensuse.fastsoft.net/pub/linux/opensuse/update/11.2
+http://mirror.anl.gov/pub/opensuse/opensuse/update/11.2
+http://mirror.umoss.org/opensuse/update/11.2
+ftp://mirror.anl.gov/pub/opensuse/opensuse/update/11.2
+http://opensuse.cs.utah.edu/update/11.2
+http://mirrors.med.harvard.edu/opensuse/update/11.2
+ftp://ftp.osuosl.org/pub/opensuse/update/11.2
+http://mirrors.xmission.com/opensuse/update/11.2
+ftp://mirrors.xmission.com/opensuse/update/11.2
+ftp://opensuse.cs.utah.edu/pub/opensuse/update/11.2
+http://mirrors1.kernel.org/opensuse/update/11.2
+http://opensuse.ca.unixheads.org/update/11.2
+http://mirror.rackspace.com/openSUSE/update/11.2
+http://130.57.19.201/update/11.2
+http://mirrors2.kernel.org/opensuse/update/11.2
+ftp://mirrors1.kernel.org/opensuse/update/11.2
+ftp://130.57.19.201/pub/opensuse/update/11.2
+ftp://mirrors2.kernel.org/opensuse/update/11.2
+http://ftp.ussg.iu.edu/linux/opensuse/update/11.2
+ftp://mirror.rackspace.com/openSUSE/update/11.2
+http://ftp.utexas.edu/opensuse/update/11.2
+http://www.gtlib.gatech.edu/pub/opensuse/update/11.2
+ftp://mirror.colorado.edu/pub/opensuse/update/11.2
+ftp://ftp.utexas.edu/mirrors/opensuse/update/11.2
+ftp://www.gtlib.gatech.edu/pub/opensuse/update/11.2
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/update/11.2
+http://mirror.cps.cmich.edu/opensuse/opensuse/update/11.2
+ftp://ftp.ussg.iu.edu/linux/opensuse/update/11.2
+http://mirror.nyi.net/opensuse/update/11.2
+ftp://mirror.colorado.edu/pub/opensuse/update/11.2
+http://mirrors.rit.edu/opensuse/update/11.2
+ftp://mirror.nyi.net/opensuseupdate/11.2
+http://ftp.iinet.net.au/pub/opensuse/update/11.2
+http://mirror.internode.on.net/pub/opensuse/update/11.2
+http://mirror.pacific.net.au/linux/opensuse/update/11.2
+ftp://ftp.iinet.net.au/pub/opensuse/update/11.2
+ftp://mirror.internode.on.net/pub/opensuse/update/11.2
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/update/11.2
+http://opensuse.patan.com.ar/update/11.2
+http://opensuse.c3sl.ufpr.br/update/11.2
+http://200.221.9.37/pub/opensuse/update/11.2
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/update/11.2
+ftp://opensuse.c3sl.ufpr.br/opensuse/update/11.2
+http://opensuse.pop.com.br/update/11.2
diff --git a/src/lib/distro-info/suse-11.2/prereqfiles/etc/group b/src/lib/distro-info/suse-11.2/prereqfiles/etc/group
new file mode 100644
index 00000000..505cb221
--- /dev/null
+++ b/src/lib/distro-info/suse-11.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/src/lib/distro-info/suse-11.2/prereqfiles/etc/hosts b/src/lib/distro-info/suse-11.2/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/suse-11.2/prereqfiles/etc/passwd b/src/lib/distro-info/suse-11.2/prereqfiles/etc/passwd
new file mode 100644
index 00000000..9b8fc4fe
--- /dev/null
+++ b/src/lib/distro-info/suse-11.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/src/lib/distro-info/suse-11.2/prereqfiles/etc/shadow b/src/lib/distro-info/suse-11.2/prereqfiles/etc/shadow
new file mode 100644
index 00000000..cd100a5a
--- /dev/null
+++ b/src/lib/distro-info/suse-11.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/src/lib/distro-info/suse-11.2/settings.default b/src/lib/distro-info/suse-11.2/settings.default
new file mode 100644
index 00000000..7e152670
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2/settings.default
@@ -0,0 +1,1126 @@
+bootstrap-packages = <<END
+ i586/aaa_base-11.2-10007.5.i586.rpm
+ i586/audit-libs-1.7.7-5.1.i586.rpm
+ i586/bash-3.2-141.10.i586.rpm
+ i586/boost-license-1.36.0-9.5.i586.rpm
+ i586/bzip2-1.0.5-34.5.i586.rpm
+ i586/ConsoleKit-0.2.10-60.16.i586.rpm
+ i586/coreutils-6.12-32.10.i586.rpm
+ i586/coreutils-lang-6.12-32.10.i586.rpm
+ i586/cpio-2.9-75.35.i586.rpm
+ i586/cpio-lang-2.9-75.35.i586.rpm
+ i586/cracklib-2.8.12-55.1.i586.rpm
+ i586/cracklib-dict-small-2.8.12-55.1.i586.rpm
+ i586/cron-4.1-194.28.i586.rpm
+ i586/cyrus-sasl-2.1.22-182.1.i586.rpm
+ i586/dbus-1-1.2.4-5.1.i586.rpm
+ i586/dbus-1-glib-0.76-32.1.i586.rpm
+ i586/device-mapper-1.02.27-7.1.i586.rpm
+ i586/diffutils-2.8.7-143.9.i586.rpm
+ i586/dhcpcd-3.2.3-44.1.i586.rpm
+ i586/dirmngr-1.0.2-1.39.i586.rpm
+ i586/e2fsprogs-1.41.1-11.9.i586.rpm
+ i586/elfutils-0.137-3.11.i586.rpm
+ i586/file-4.24-43.1.i586.rpm
+ i586/filesystem-11.2-2.3.i586.rpm
+ i586/fillup-1.42-242.8.i586.rpm
+ i586/findutils-4.4.0-38.27.i586.rpm
+ i586/gawk-3.1.6-1.44.i586.rpm
+ i586/gdbm-1.8.3-371.8.i586.rpm
+ i586/glib2-2.18.2-5.1.i586.rpm
+ i586/glib2-lang-2.18.2-5.1.i586.rpm
+ i586/glib2-branding-upstream-2.18.2-5.1.i586.rpm
+ i586/glibc-2.9-2.8.i586.rpm
+ i586/gpg2-2.0.9-25.105.i586.rpm
+ i586/gpg2-lang-2.0.9-25.105.i586.rpm
+ i586/grep-2.5.2-90.28.i586.rpm
+ i586/gzip-1.3.12-68.36.i586.rpm
+ i586/hal-0.5.12-10.1.i586.rpm
+ i586/info-4.12-1.85.i586.rpm
+ i586/insserv-1.12.0-22.15.i586.rpm
+ i586/irqbalance-0.55-120.8.i586.rpm
+ i586/kernel-default-2.6.27.7-9.1.i586.rpm
+ i586/kernel-default-base-2.6.27.7-9.1.i586.rpm
+ i586/keyutils-1.2-107.4.i586.rpm
+ i586/keyutils-libs-1.2-107.4.i586.rpm
+ i586/krb5-1.6.3-132.1.i586.rpm
+ i586/libacl-2.2.47-27.5.i586.rpm
+ i586/libasm1-0.137-3.11.i586.rpm
+ i586/libasound2-1.0.18-8.7.i586.rpm
+ i586/libattr-2.4.39-67.5.i586.rpm
+ i586/libbz2-1-1.0.5-34.5.i586.rpm
+ i586/libblkid1-1.41.1-11.9.i586.rpm
+ i586/libblocxx6-2.1.0.342-120.1.i586.rpm
+ i586/libboost_signals1_36_0-1.36.0-9.5.i586.rpm
+ i586/libcom_err2-1.41.1-11.9.i586.rpm
+ i586/libcurl4-7.19.0-11.2.i586.rpm
+ i586/libdb-4_5-4.5.20-94.17.i586.rpm
+ i586/libdw1-0.137-3.11.i586.rpm
+ i586/libelf1-0.137-3.11.i586.rpm
+ i586/libext2fs2-1.41.1-11.9.i586.rpm
+ i586/libexpat1-2.0.1-88.10.i586.rpm
+ i586/libgcc43-4.3.3_20081022-9.5.i586.rpm
+ i586/libgcrypt11.2.4.1-4.1.i586.rpm
+ i586/libglib-2_0-0-2.18.2-5.1.i586.rpm
+ i586/libgobject-2_0-0-2.18.2-5.1.i586.rpm
+ i586/libgpg-error0-1.6-6.10.i586.rpm
+ i586/libgthread-2_0-0-2.18.2-5.1.i586.rpm
+ i586/libidn-1.10-2.14.i586.rpm
+ i586/libksba-1.0.4-1.17.i586.rpm
+ i586/libldap-2_4-2-2.4.12-5.3.i586.rpm
+ i586/libncurses5-5.6-89.10.i586.rpm
+ i586/libncurses6-5.6-89.10.i586.rpm
+ i586/libnscd-2.0.2-72.47.i586.rpm
+ i586/libopenssl0_9_8-0.9.8h-28.4.i586.rpm
+ i586/libpt2-2.4.2-2.19.i586.rpm
+ i586/libreadline5-5.2-141.10.i586.rpm
+ i586/libreiserfs-0.3.0.5-107.47.i586.rpm
+ i586/libselinux1-2.0.71-3.38.i586.rpm
+ i586/libsepol1-2.0.32-5.38.i586.rpm
+ i586/libsmbios2-2.0.2-10.9.i586.rpm
+ i586/libstdc++43-4.3.3_20081022-9.5.i586.rpm
+ i586/libusb-0_1-4-0.1.12-136.10.i586.rpm
+ i586/libusb-1_0-0-0.9.3-4.20.i586.rpm
+ i586/libuuid1-1.41.1-11.9.i586.rpm
+ i586/libvolume_id-126-17.25.i586.rpm
+ i586/libvolume_id1-128-9.3.i586.rpm
+ i586/libxcrypt-3.0.1-25.20.i586.rpm
+ i586/libxml2-2.7.1-9.1.i586.rpm
+ i586/libzio-0.9-4.19.i586.rpm
+ i586/limal-1.5.1-1.12.i586.rpm
+ i586/limal-perl-1.5.1-1.12.i586.rpm
+ i586/login-3.37-1.5.i586.rpm
+ i586/logrotate-3.7.7-9.11.i586.rpm
+ i586/m4-1.4.12-1.13.i586.rpm
+ i586/metamail-2.7.19-1244.29.i586.rpm
+ i586/mingetty-1.0.7s-70.41.i586.rpm
+ i586/mkinitrd-2.4-34.1.i586.rpm
+ i586/module-init-tools-3.4-56.5.i586.rpm
+ i586/ncurses-utils-5.6-89.10.i586.rpm
+ i586/net-tools-1.60-725.5.i586.rpm
+ i586/openldap2-client-2.4.12-5.3.i586.rpm
+ i586/openslp-1.2.0-168.6.i586.rpm
+ i586/openssl-0.9.8h-28.4.i586.rpm
+ i586/openSUSE-release-11.2-1.19.i586.rpm
+ i586/openSUSE-release-ftp-11.2-1.19.i586.rpm
+ i586/pam-1.0.2-13.3.i586.rpm
+ i586/pam-config-0.68-1.3.i586.rpm
+ i586/pam-modules-11.2-5.1.i586.rpm
+ i586/parted-1.8.8-91.5.i586.rpm
+ i586/pciutils-3.0.1-1.26.i586.rpm
+ i586/pcre-7.8-1.26.i586.rpm
+ i586/perl-5.10.0-62.10.i586.rpm
+ i586/perl-base-5.10.0-62.10.i586.rpm
+ i586/perl-Bootloader-0.4.81-1.1.i586.rpm
+ i586/perl-gettext-1.05-91.163.i586.rpm
+ i586/permissions-2008.11.25-1.5.i586.rpm
+ i586/pinentry-0.7.5-61.14.i586.rpm
+ i586/pm-utils-0.99.4.20071229-10.3.i586.rpm
+ i586/pmtools-20071116-44.3.i586.rpm
+ i586/PolicyKit-0.9-13.9.i586.rpm
+ i586/popt-1.7-20.1.i586.rpm
+ i586/postfix-2.5.5-6.7.i586.rpm
+ i586/procmail-3.22-238.15.i586.rpm
+ i586/procps-3.2.7-147.11.i586.rpm
+ i586/psmisc-22.6-61.14.i586.rpm
+ i586/pth-2.0.7-102.29.i586.rpm
+ i586/pwdutils-3.2.2-2.8.i586.rpm
+ i586/reiserfs-3.6.19-116.62.i586.rpm
+ i586/rmail-8.14.3-50.9.i586.rpm
+ i586/rpm-4.4.2.3-20.1.i586.rpm
+ i586/satsolver-tools-0.13.0-3.3.i586.rpm
+ i586/SDL-1.2.13-104.1.i586.rpm
+ i586/sed-4.1.5-85.60.i586.rpm
+ i586/setserial-2.17-716.20.i586.rpm
+ i586/sharutils-4.6.3-3.100.i586.rpm
+ i586/sysvinit-2.86-186.7.i586.rpm
+ i586/tcpd-7.6-855.11.i586.rpm
+ i586/tcsh-6.15.00-93.3.i586.rpm
+ i586/terminfo-base-5.6-89.10.i586.rpm
+ i586/udev-128-9.3.i586.rpm
+ i586/util-linux-2.14.1-10.1.i586.rpm
+ i586/util-linux-lang-2.14.1-10.1.i586.rpm
+ i586/uucp-1.07-50.7.i586.rpm
+ i586/uuid-runtime-1.41.1-11.9.i586.rpm
+ i586/zlib-1.2.3-104.137.i586.rpm
+ noarch/netcfg-11.2-1.14.noarch.rpm
+ noarch/pciutils-ids-2008.11.26-2.4.noarch.rpm
+ noarch/suse-build-key-1.0-907.32.noarch.rpm
+END
+<metapackager zypper>
+ packages = <<END
+ i586/libzypp-5.24.5-1.1.i586.rpm
+ i586/zypper-1.0.2-1.5.i586.rpm
+ END
+</metapackager>
+<metapackager smart>
+ packages = <<END
+ i586/python-2.6.0-2.16.i586.rpm
+ i586/python-xml-2.6.0-2.12.i586.rpm
+ i586/rpm-python-4.4.2.3-20.1.i586.rpm
+ END
+</metapackager>
+<metapackager yum>
+ packages = <<END
+ i586/glib2-2.18.2-4.3.i586.rpm
+ i586/libxml2-2.7.1-8.3.i586.rpm
+ i586/libxml2-python-2.7.1-9.1.i586.rpm
+ i586/python-2.6.0-2.16.i586.rpm
+ i586/python-urlgrabber-3.1.0-178.8.i586.rpm
+ i586/python-xml-2.6.0-2.12.i586.rpm
+ i586/rpm-python-4.4.2.3-20.1.i586.rpm
+ i586/sqlite3-3.6.4-1.8.i586.rpm
+ i586/yum-metadata-parser-1.1.2-107.22.i586.rpm
+ END
+</metapackager>
+package-subdir = suse
+prereq-packages = <<END
+ i586/bzip2-1.0.5-34.5.i586.rpm
+ i586/glibc-2.9-2.8.i586.rpm
+ i586/libselinux1-2.0.71-3.38.i586.rpm
+ i586/libbz2-1-1.0.5-34.5.i586.rpm
+ i586/popt-1.7-20.1.i586.rpm
+ i586/rpm-4.4.2.3-20.1.i586.rpm
+ i586/zlib-1.2.3-104.137.i586.rpm
+END
+<repository base>
+ name = openSUSE 11.2
+ repo-subdir = suse
+ file-for-speedtest = suse/setup/descr/packages.en.gz
+</repository>
+<repository base_non-oss>
+ name = openSUSE 11.2 non-OSS
+ file-for-speedtest = suse/setup/descr/packages.en.gz
+</repository>
+<repository base_update>
+ name = openSUSE 11.2 updates
+ file-for-speedtest = repodata/primary.xml.gz
+</repository>
+<selection minimal>
+ packages = <<END
+ glibc-locale
+ END
+</selection>
+<selection textmode>
+ base = minimal
+ packages = <<END
+ acl
+ acpid
+ apparmor-docs
+ apparmor-parser
+ apparmor-profiles
+ apparmor-utils
+ ash
+ at
+ atk
+ attr
+ audit
+ autofs bc
+ bind-libs
+ bind-utils
+ binutils
+ blktrace
+ bundle-lang-common-en
+ cdrkit-cdrtools-compat
+ compat compat-openssl097g
+ cpufrequtils
+ cyrus-sasl-saslauthd
+ db-utils
+ deltarpm
+ dmraid
+ dos2unix
+ dosfstools
+ ed
+ eject
+ ethtool
+ fbset
+ fontconfig
+ freetype2
+ gdb
+ genisoimage
+ glibc-i18ndata
+ gnutls
+ gpm
+ groff
+ hfsutils
+ icedax
+ ifplugd
+ initviocons
+ inst-source-utils
+ iproute2
+ iputils
+ joe
+ kbd
+ klogd
+ kpartx
+ ksh
+ ksymoops
+ lcms
+ less
+ libaio
+ libapparmor1
+ libart_lgpl
+ libatk-1_0-0
+ libcap1
+ libcap2
+ libdrm
+ libevent-1_4-2
+ libgimpprint
+ libgmodule-2_0-0
+ libgnutls26
+ libgssglue1
+ libicu
+ libjpeg
+ liblazy1
+ liblcms1
+ libltdl3
+ libltdl7
+ liblzo2-2
+ libmng
+ libnet
+ libopencdk10
+ libopenct1
+ libopensc2
+ libpcap0
+ libpng12-0
+ libpython2_6-1_0
+ librpcsecgss
+ libsensors3
+ libsensors4
+ libsnmp15
+ libsqlite3-0
+ libtiff3
+ libtirpc1
+ licenses
+ lukemftp
+ lvm2
+ mailx
+ man
+ man-pages
+ microcode_ctl
+ multipath-tools
+ nbd
+ net-snmp
+ nfs-client
+ nfs-kernel-server
+ nfsidmap
+ nscd
+ ntfsprogs
+ ntp
+ openct
+ opensc
+ openssh
+ patch
+ pax
+ pcsc-lite
+ perl-Crypt-SmbHash
+ perl-DBD-SQLite
+ perl-DBI
+ perl-Digest-MD4
+ perl-File-Tail
+ perl-HTML-Parser
+ perl-HTML-Tagset
+ perl-Net-Daemon
+ perl-PlRPC
+ perl-RPC-XML
+ perl-SNMP
+ perl-TermReadKey
+ perl-TimeDate
+ perl-URI
+ perl-XML-Parser
+ perl-XML-Writer
+ perl-libapparmor
+ perl-libwww-perl
+ ppp
+ preload
+ procinfo
+ providers
+ qlogic-firmware
+ recode
+ rpcbind
+ rsync
+ sash
+ screen
+ sensors
+ sg3_utils
+ smartmontools
+ smpppd
+ snmp-mibs
+ sqlite3
+ strace
+ sudo
+ sysconfig
+ sysfsutils
+ syslog-ng
+ tcpdump
+ telnet
+ terminfo
+ timezone
+ ulimit
+ usbutils
+ utempter
+ vim
+ vim-base
+ vim-data
+ wdiff
+ wget
+ wireless-tools
+ wodim
+ wvstreams
+ xfsprogs
+ xinetd
+ yp-tools
+ ypbind
+ zip
+ zisofs-tools
+ zsh
+ END
+</selection>
+<selection kde>
+ base = textmode
+ packages = <<END
+ 3ddiag
+ a2ps
+ aalib
+ alsa
+ alsa-utils
+ amarok
+ amarok-libvisual
+ amarok-xine
+ arts
+ aspell
+ aspell-de
+ aspell-en
+ audiofile
+ autoyast2
+ autoyast2-installation
+ bluez
+ bootsplash
+ bootsplash-branding-openSUSE
+ branding-openSUSE
+ bundle-lang-gnome-en
+ bundle-lang-kde-en
+ cabextract
+ cairo
+ cdparanoia
+ cdrdao
+ check
+ checkmedia
+ chmlib
+ chromium
+ clucene-core
+ compiz
+ compiz-branding-openSUSE
+ compiz-kde4
+ cpp
+ cpp41
+ cpp43
+ cryptsetup
+ Crystalcursors
+ cups
+ cups-client
+ cups-drivers
+ cups-libs
+ curl
+ cyrus-sasl-crammd5
+ cyrus-sasl-digestmd5
+ cyrus-sasl-plain
+ dbus-1-mono
+ dbus-1-python
+ dbus-1-qt3
+ dbus-1-x11
+ dcraw
+ dejavu
+ desktop-data-openSUSE
+ desktop-data-openSUSE-extra-gnome
+ desktop-file-utils
+ dhcp
+ dhcp-client
+ dialog
+ digikam
+ digikamimageplugins
+ DirectFB
+ dnsmasq
+ dvd+rw-tools
+ eel
+ efont-unicode
+ enchant
+ enscript
+ evolution-data-server
+ exiftool
+ expat
+ fam
+ fftw3
+ fileshareset
+ FirmwareUpdateKit
+ flac
+ fonts-config
+ foomatic-filters
+ freealut
+ freeglut
+ freetype
+ fribidi
+ frozen-bubble
+ frozen-bubble-server
+ ft2demos
+ fvwm2
+ gcc-gij
+ gcc41-gij
+ gcc43-gij
+ gconf2
+ gconf2-branding-openSUSE
+ gettext-runtime
+ gfxboot
+ gfxboot-branding-openSUSE
+ ggz
+ ggz-client-libs
+ ghostscript-fonts-other
+ ghostscript-fonts-std
+ ghostscript-library
+ ghostscript-omni
+ ghostscript-x11
+ giflib
+ gimp
+ gimp-branding-openSUSE
+ gimp-help
+ gimp-plugins-python
+ gle
+ glib
+ glib-sharp2
+ glibc-locale
+ glitz
+ gltt
+ gmime
+ gmp
+ gnokii
+ gpart
+ gpgme
+ GraphicsMagick
+ grub
+ gsf-sharp
+ gstreamer-0_10
+ gstreamer-0_10-plugins-base
+ gtk
+ gtk-sharp2
+ gtk2
+ gtk2-branding-openSUSE
+ gtk2-engines
+ gtk2-theme-openSUSE
+ gtksourceview
+ gutenprint
+ gvfs
+ gwenview
+ gwenview-lang
+ hal-palm
+ hdparm
+ hicolor-icon-theme
+ hplip
+ hplip-hpijs
+ htdig
+ hunspell
+ hwinfo
+ icewm
+ icewm-default
+ id3lib
+ ifnteuro
+ IlmBase
+ ImageMagick
+ imlib
+ imlib2
+ imlib2-loaders
+ info2html
+ intlfnts
+ iptables
+ ispell
+ ispell-american
+ ispell-german
+ ispell-ngerman
+ jack
+ jfsutils
+ jpackage-utils
+ jpeg
+ k3b
+ kaffeine
+ kde-susetranslations
+ kde3-i18n-de
+ kde4-ark
+ kde4-filesystem
+ kde4-kdm
+ kde4-kdm-branding-openSUSE
+ kde4-kget
+ kde4-kgreeter-plugins
+ kde4-kmix
+ kde4-knewsticker
+ kde4-konqueror
+ kde4-konqueror-plugins
+ kde4-kopete
+ kde4-kpat
+ kde4-krdc
+ kde4-kscd
+ kde4-ksudoku
+ kde4-kwin
+ kde4-okular
+ kde4-plasma-addons
+ kdeaddons3-kicker
+ kdeartwork3-kscreensaver
+ kdeartwork3-xscreensaver
+ kdebase3
+ kdebase3-nsplugin
+ kdebase3-runtime
+ kdebase3-samba
+ kdebase3-session
+ kdebase3-SuSE
+ kdebase3-SuSE-branding-openSUSE
+ kdebase3-SuSE-lang
+ kdebase4-openSUSE
+ kdebase4-runtime
+ kdebase4-workspace
+ kdebase4-workspace-branding-openSUSE
+ kdebase4-workspace-ksysguardd
+ kdebluetooth
+ kdebluetooth-lang
+ kdegames4-carddecks-default
+ kdegraphics3
+ kdegraphics3-kamera
+ kdegraphics3-scan
+ kdelibs3
+ kdelibs3-default-style
+ kdelibs3-doc
+ kdelibs4
+ kdelibs4-core
+ kdemultimedia3
+ kdepim3
+ kdepim3-kpilot
+ kdepim3-notes
+ kdepimlibs4
+ kdetv
+ kdetv-lang
+ kio_ipodslave
+ kio_iso
+ kio_slp
+ kio_sysinfo
+ kipi-plugins
+ kitchensync
+ knights
+ koffice
+ koffice-i18n-de
+ koffice-i18n-de-doc
+ koffice-illustration
+ konversation
+ kpowersave
+ kpowersave-lang
+ krecord
+ krename
+ krusader
+ ktorrent
+ kwin-decor-suse2
+ lbreakout
+ libakode
+ libakonadi4
+ libakonadiprotocolinternals1
+ libao
+ libarchive2
+ libavahi-client3
+ libavahi-common3
+ libavahi-glib1
+ libbabl-0_0-0
+ libbeagle1
+ libbluetooth3
+ libbonobo
+ libbonoboui
+ libcanberra-gtk
+ libcanberra-gtk0
+ libcanberra0
+ libcroco
+ libcroco-0_6-3
+ libcryptsetup0
+ libdbus-1-qt3-0
+ libdjvulibre21
+ libdns_sd
+ libdvdread4
+ libeel-2-2
+ libenchant1
+ libesd0
+ libevoldap-2_4-2
+ libexempi3
+ libexif
+ libexiv2-4
+ libFLAC++6
+ libFLAC8
+ libflashsupport
+ libfuse2
+ libgcj41
+ libgcj43
+ libgegl-0_0-0
+ libggz2
+ libgio-2_0-0
+ libgio-fam
+ libglade2
+ libgmime-2_0-3
+ libgnome
+ libgnome-desktop-2-7
+ libgnome-menu2
+ libgnomecanvas
+ libgnomecups
+ libgnomekbd
+ libgnomeprint
+ libgnomeprintui
+ libgnomesu
+ libgnomesu0
+ libgnomeui
+ libgomp43
+ libgpgme11
+ libgphoto2
+ libgpod-tools
+ libgpod3
+ libGraphicsMagick2
+ libgsf
+ libgsf-1-114
+ libgsf-gnome
+ libgssglue-devel
+ libgstinterfaces-0_10-0
+ libgstreamer-0_10-0
+ libgtkhtml
+ libgtkimageview0
+ libgtksourceview-2_0-0
+ libgtop
+ libgtop-2_0-7
+ libgvfscommon0
+ libgweather
+ libgweather1
+ libical0
+ libidl
+ libieee1284
+ libjack0
+ libjasper
+ libkcal
+ libkcal2
+ libkcddb4
+ libkcompactdisc4
+ libkdcraw3
+ libkde4
+ libkdecore4
+ libkdegames4
+ libkdepimlibs4
+ libkexiv2-3
+ libkipi0
+ libkmime2
+ libkonq5
+ libktnef1
+ libldapcpp1
+ liblpsolve55
+ liblua5_1
+ libMagick++1
+ libMagickCore1
+ libMagickWand1
+ libmal
+ libmikmod
+ libmpcdec5
+ libmpfr1
+ libmtp8
+ libmusicbrainz4
+ libneon27
+ libnetpbm10
+ libnjb
+ libnjb5
+ libnl
+ libnsssharedhelper0
+ libofa0
+ libogg0
+ liboil
+ libopensync
+ libopensync-plugin-file
+ libopensync-plugin-gnokii
+ libopensync-plugin-gpe
+ libopensync-plugin-irmc
+ libopensync-plugin-kdepim
+ libopensync-plugin-opie
+ libopensync-plugin-palm
+ libopensync-plugin-sunbird
+ libopensync-plugin-syncml
+ libopensync-tools
+ libotr2
+ libphonon4
+ libpisock9
+ libpoppler-glib4
+ libpoppler-qt2
+ libpoppler-qt4-3
+ libpoppler4
+ libpulse0
+ libpulsecore4
+ libqca2
+ libqimageblitz4
+ libqscintilla2-4
+ libqt4
+ libqt4-qt3support
+ libqt4-sql
+ libqt4-sql-unixODBC
+ libqt4-x11
+ libqtpod0
+ libQtWebKit4
+ libraptor1
+ librasqal1
+ libredland0
+ librsvg
+ libsamplerate
+ libsmbclient0
+ libsndfile
+ libsoprano4
+ libsoup
+ libsoup-2_4-1
+ libspectre1
+ libspeex
+ libstrigi0
+ libstroke
+ libsyncml0
+ libtalloc1
+ libtasn1
+ libtasn1-3
+ libtdb1
+ libtheora0
+ libtunepimp
+ libtunepimp5
+ libvisual
+ libvisual-plugins
+ libVNCServer
+ libvorbis
+ libwbclient0
+ libwbxml2-0
+ libwebkit-1_0-1
+ libwmf
+ libwnck
+ libwnck-1-22
+ libwpd-0_8-8
+ libwpg-0_1-1
+ libwps-0_1-1
+ libx86
+ libxine1
+ libxine1-gnome-vfs
+ libxine1-pulse
+ libxklavier
+ libxklavier12
+ libxml2-python
+ libxslt
+ libzip1
+ libzvbi0
+ limal-ca-mgm
+ limal-ca-mgm-perl
+ limal-nfs-server
+ limal-nfs-server-perl
+ lsb
+ lsof
+ make
+ manufacturer-PPDs
+ master-boot-code
+ mdadm
+ mesa
+ metacity
+ misc-console-font
+ modemManager
+ mono-core
+ mono-data
+ mono-data-sqlite
+ mono-web
+ mono-winforms
+ mozilla-nspr
+ mozilla-nss
+ mozilla-xulrunner181
+ mozilla-xulrunner190
+ mozilla-xulrunner190-gnomevfs
+ mozilla-xulrunner190-translations
+ mozillaFirefox
+ mozillaFirefox-branding-openSUSE
+ mozillaFirefox-translations
+ mtools
+ myspell-american
+ myspell-german
+ nautilus
+ neon
+ netcat
+ netpbm
+ networkManager
+ networkManager-glib
+ networkManager-kde
+ numlockx
+ obexftp
+ ocrad
+ openal
+ OpenEXR
+ openobex
+ OpenOffice_org
+ OpenOffice_org-base
+ OpenOffice_org-branding-openSUSE
+ OpenOffice_org-calc
+ OpenOffice_org-components
+ OpenOffice_org-draw
+ OpenOffice_org-filters
+ OpenOffice_org-filters-optional
+ OpenOffice_org-help-de
+ OpenOffice_org-help-en-US
+ OpenOffice_org-icon-themes
+ OpenOffice_org-impress
+ OpenOffice_org-kde
+ OpenOffice_org-l10n-de
+ OpenOffice_org-l10n-extras
+ OpenOffice_org-libs-core
+ OpenOffice_org-libs-extern
+ OpenOffice_org-libs-gui
+ OpenOffice_org-mailmerge
+ OpenOffice_org-math
+ OpenOffice_org-pyuno
+ OpenOffice_org-Quickstarter
+ OpenOffice_org-templates-en
+ OpenOffice_org-templates-labels-a4
+ OpenOffice_org-templates-labels-letter
+ OpenOffice_org-templates-presentation-layouts
+ OpenOffice_org-thesaurus-en
+ OpenOffice_org-ure
+ OpenOffice_org-writer
+ openssh-askpass
+ opensuse-codecs-installer
+ opensuse-manual_de
+ opensuse-manual_en
+ opensuse-manual_en-pdf
+ opt_gnome-compat
+ orbit2
+ oxygen-icon-theme
+ pango
+ perl-Config-Crontab
+ perl-Crypt-SSLeay
+ perl-Digest-HMAC
+ perl-Digest-SHA1
+ perl-IO-Socket-SSL
+ perl-Net-DNS
+ perl-Net-IP
+ perl-Net-SSLeay
+ perl-NetxAP
+ perl-Parse-RecDescent
+ perl-spamassassin
+ perl-X500-DN
+ perl-XML-LibXML
+ perl-XML-LibXML-Common
+ perl-XML-NamespaceSupport
+ perl-XML-SAX
+ perl-XML-Simple
+ phalanx
+ phonon
+ phonon-backend-gstreamer-0_10
+ pilot-link
+ pinentry-qt
+ pkg-config
+ plasma-theme-aya
+ pm-profiler
+ PolicyKit-gnome-libs
+ powerdevil
+ pptp
+ pulseaudio
+ pulseaudio-esound-compat
+ python
+ python-base
+ python-cairo
+ python-gobject2
+ python-gtk
+ python-numeric
+ python-qt
+ python-qt4
+ python-ReportLab
+ python-sip
+ python-xml
+ pyxml
+ qca
+ qt3
+ qtcurve-gtk2
+ rdesktop
+ release-notes-openSUSE
+ rrdtool
+ ruby
+ sane-backends
+ sane-backends-autoconfig
+ sane-frontends
+ sax2
+ sax2-gui
+ sax2-ident
+ sax2-libsax
+ sax2-libsax-perl
+ sax2-tools
+ scpm
+ SDL_image
+ SDL_mixer
+ SDL_net
+ SDL_Pango
+ SDL_perl
+ SDL_ttf
+ sgml-skel
+ shared-mime-info
+ soprano
+ sound-theme-freedesktop
+ spamassassin
+ speex
+ splashy
+ splashy-branding-openSUSE
+ sqlite2
+ startup-notification
+ strigi
+ SuSEfirewall2
+ susehelp
+ susehelp_de
+ susehelp_en
+ suseRegister
+ syslinux
+ taglib
+ tango-icon-theme
+ tar
+ tcl
+ tightvnc
+ tk
+ ufraw
+ ufraw-gimp
+ unclutter
+ unixODBC
+ unzip
+ usb_modeswitch
+ v4l-conf
+ w3m
+ wbxml2
+ words
+ wpa_supplicant
+ wv
+ wvdial
+ x11-input-synaptics
+ x11-input-wacom
+ x11-tools
+ xalan-j2
+ xaw3d
+ xdg-menu
+ xdg-utils
+ xdmbgrd
+ xerces-j2
+ xerces-j2-xml-apis
+ xkeyboard-config
+ xli
+ xlockmore
+ xorg-x11
+ xorg-x11-driver-input
+ xorg-x11-driver-video
+ xorg-x11-driver-video-radeonhd
+ xorg-x11-driver-video-unichrome
+ xorg-x11-fonts
+ xorg-x11-fonts-core
+ xorg-x11-libfontenc
+ xorg-x11-libICE
+ xorg-x11-libs
+ xorg-x11-libSM
+ xorg-x11-libX11
+ xorg-x11-libX11-ccache
+ xorg-x11-libXau
+ xorg-x11-libxcb
+ xorg-x11-libXdmcp
+ xorg-x11-libXext
+ xorg-x11-libXfixes
+ xorg-x11-libxkbfile
+ xorg-x11-libXmu
+ xorg-x11-libXp
+ xorg-x11-libXpm
+ xorg-x11-libXprintUtil
+ xorg-x11-libXrender
+ xorg-x11-libXt
+ xorg-x11-libXv
+ xorg-x11-server
+ xorg-x11-xauth
+ xorg-x11-Xvnc
+ xpdf-tools
+ xscreensaver
+ xterm
+ xtermset
+ yakuake
+ yast2
+ yast2-apparmor
+ yast2-backup
+ yast2-bootloader
+ yast2-branding-openSUSE
+ yast2-control-center
+ yast2-control-center-gnome
+ yast2-control-center-qt
+ yast2-core
+ yast2-country
+ yast2-country-data
+ yast2-firewall
+ yast2-gtk
+ yast2-hardware-detection
+ yast2-inetd
+ yast2-installation
+ yast2-irda
+ yast2-iscsi-client
+ yast2-kerberos-client
+ yast2-ldap
+ yast2-ldap-client
+ yast2-libyui
+ yast2-mail
+ yast2-mouse
+ yast2-ncurses
+ yast2-network
+ yast2-nfs-client
+ yast2-nfs-common
+ yast2-nis-client
+ yast2-ntp-client
+ yast2-online-update
+ yast2-online-update-frontend
+ yast2-packager
+ yast2-pam
+ yast2-perl-bindings
+ yast2-pkg-bindings
+ yast2-power-management
+ yast2-printer
+ yast2-profile-manager
+ yast2-qt
+ yast2-registration
+ yast2-registration-branding-openSUSE
+ yast2-repair
+ yast2-restore
+ yast2-runlevel
+ yast2-samba-client
+ yast2-samba-server
+ yast2-scanner
+ yast2-schema
+ yast2-security
+ yast2-slp
+ yast2-sound
+ yast2-storage
+ yast2-storage-lib
+ yast2-sudo
+ yast2-support
+ yast2-sysconfig
+ yast2-theme-openSUSE
+ yast2-trans-de
+ yast2-trans-stats
+ yast2-transfer
+ yast2-tune
+ yast2-tv
+ yast2-update
+ yast2-users
+ yast2-x11
+ yast2-xml
+ yast2-ycp-ui-bindings
+ zvbi
+ END
+</selection>
+<selection kde-additional>
+ base = kde
+ packages = <<END
+ cm_gtk
+ flash-player
+ java-1_5_0-gcj-compat
+ java-1_5_0-sun
+ java-1_5_0-sun-plugin
+ suspend
+ END
+</selection>
+<selection gnome>
+ base = textmode
+ packages = <<END
+ END
+</selection>
+<selection default>
+ base = minimal
+</selection>
+
diff --git a/src/lib/distro-info/suse-11.2/settings.example b/src/lib/distro-info/suse-11.2/settings.example
new file mode 100644
index 00000000..a8db67df
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2/settings.example
@@ -0,0 +1,23 @@
+# rename this file to 'settings' and edit it as you please
+#
+# for a list of all options, have a look at the corresponding
+# settings.default in /opt/openslx/share/distro-info
+
+# use local installation source
+#<repository base>
+# local-url = /srv/ftp/pub/opensuse/distribution/11.2/repo/oss
+#</repository>
+#<repository base_non-oss>
+# local-url = /srv/ftp/pub/opensuse/distribution/11.2/repo/non-oss
+#</repository>
+#<repository base_update>
+# local-url = /srv/ftp/pub/suse/update/11.2
+#</repository>
+
+# add a new selection:
+#<selection my_kde>
+# base = kde
+# packages = <<END
+# kinternet
+# END
+#</selection>
diff --git a/src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc b/src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc
new file mode 100644
index 00000000..ddcc28cd
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc
@@ -0,0 +1,17 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.12 (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/src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc b/src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc
new file mode 100644
index 00000000..8cc6c669
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc
@@ -0,0 +1,13 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.12 (GNU/Linux)
+
+mIsERCAdXQEEAL7MrBTz+3SBWpCm2ae2yaDqV3ezQcs2JlvqidJVhsZqQe9/jkxi
+KTEQW5+TXF/+BlQSiebunRI7oo3+9U8GyRCgs1sf+yRQWMLzZqRaarzRhw9w+Ihl
+edtqYl6/U2JZCb8Adp6d7RzlRliJdJ/VtsfXj2ef7Dwu7elOVSsmaBdtAAYptChT
+dVNFIFBhY2thZ2UgU2lnbmluZyBLZXkgPGJ1aWxkQHN1c2UuZGU+iLgEEwECACIC
+GwMECwcDAgMVAgMDFgIBAh4BAheABQJIHzCqBQkHwXpNAAoJEOOlw2Awfj1UvWgE
+AIRoxE8S6jQB7S43SVcX06FHJeUJ/m+1ErIj9LwJTYrR/8qsDjTgrttgb+nBHkIj
+NhCCLAuR8sWj3CxsUMH2fayryNnwZEWGqnzo7Jtt4R1Ur3h5pHYonFjfoJyFUZjJ
+7Mhw7/TuOWx20FrzqBi8tbHx8pd7Fa5lCUgopVtMh6GR
+=R56j
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc b/src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc
new file mode 100644
index 00000000..31f2005c
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc
@@ -0,0 +1,30 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.12 (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/src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-3dbdc284-49144c3f.asc b/src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-3dbdc284-49144c3f.asc
new file mode 100644
index 00000000..580858ba
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-3dbdc284-49144c3f.asc
@@ -0,0 +1,19 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.12 (GNU/Linux)
+
+mQENBEkUTD8BCADWLy5d5IpJedHQQSXkC1VK/oAZlJEeBVpSZjMCn8LiHaI9Wq3G
+3Vp6wvsP1b3kssJGzVFNctdXt5tjvOLxvrEfRJuGfqHTKILByqLzkeyWawbFNfSQ
+93/8OunfSTXC1Sx3hgsNXQuOrNVKrDAQUqT620/jj94xNIg09bLSxsjN6EeTvyiO
+mtE9H1J03o9tY6meNL/gcQhxBvwuo205np0JojYBP0pOfN8l9hnIOLkA0yu4ZXig
+oKOVmf4iTjX4NImIWldT+UaWTO18NWcCrujtgHueytwYLBNV5N0oJIP2VYuLZfSD
+VYuPllv7c6O2UEOXJsdbQaVuzU1HLocDyipnABEBAAG0NG9wZW5TVVNFIFByb2pl
+Y3QgU2lnbmluZyBLZXkgPG9wZW5zdXNlQG9wZW5zdXNlLm9yZz6JATwEEwECACYF
+AkkUTD8CGwMFCQPCZwAGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRC4iy/UPb3C
+hIE9B/9DUwwQ5c+8xW0x2Fli5Yn1P+4Wq3nmB+ZTpM5Q1a7A2l+HhpUBsnwx2e/4
+RuXlJ06uYby8UpXCli44jXFepJgiXp7ZRPX5A06aY9Pz0wawsMtYQS716+vSV3e3
+ynZmTGKxj8Z94TEVcEjMP1/XpjW22DcpItRJX2VCW7lUXDmRfQzBEolcfwlF7a1B
+VcSqGZX8JvuTocLX/+fYBhZYQvERw6PUVGoEskMXMoRg6PqWMesW9Bq3cm8oeBa2
+4YmGLkN2ztBIbqRMSv0binKcddHHvRlxVFRXrnnlXrEPKrx9Fbu4vkqrG+EKE6+v
+GO73ROyEcJuuoJTYsKPx6Uic5gRl
+=guZP
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-56b4177a-47965b33.asc b/src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-56b4177a-47965b33.asc
new file mode 100644
index 00000000..fdd693f9
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-56b4177a-47965b33.asc
@@ -0,0 +1,19 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.12 (GNU/Linux)
+
+mQGiBEeWWzMRBADU8l2IckSzgdUS1dn0WMM7wXK4seoFsHHQw/0unHCQCxpyDMnn
+TKV86p5KTbR1FDdeaZlY0yCV+IGsiIxLyuUdJn8vuA5gA5ZkUr89/HtWaeZVl77J
+HIQxvhDRBWCOO4QNtrZYWvGbvl83wl/zOfdLEs8IGElt0LgfohyTA1qfrwCg/Hac
+tDDscXsPlo5Jek/+3RHVeD0D/30riCpfpLJOmhraLg1EbWsE0mN9IQsl+WDPdoYo
+bB76z6eH3e38618WzP/LTG4WuVbwpSSqmXyfdVpXxWzESfT8q0B8CGpHf/Sa/T/L
+emohmRnLvkf/tAfxFmDMm1jOewJIE9S35jANGHVJcxmfRNpPWC7uHnqjopnsmDkL
+kMEdBAC6YcpDOcMJZ9sJbt/JNZBaoT5CltgMDlSN50t2v/J5em8qMLqCSNF5UJyd
+LFnePHTHy6gVjWbqcC0ncFzOqM1y644Up7BoKSAr1hRTl6Mw9S3UfZZZ0al3JtWt
+8y0eFIW3QP66w1AL0LO2bZMBuOvhb63DXv5iHorcxk0yIFbbybRCb3BlblNVU0U6
+RmFjdG9yeSBPQlMgUHJvamVjdCA8b3BlblNVU0U6RmFjdG9yeUBidWlsZC5vcGVu
+c3VzZS5vcmc+iGYEExECACYFAkeWWzMCGwMFCQQesAAGCwkIBwMCBBUCCAMEFgID
+AQIeAQIXgAAKCRAcchwkVrQXevBsAKCOeScnlH2fWVBJGHTOVJ3M4yBqDACbBeNk
+PuWo05AOQ3M1dLE1hkN36G+IRgQTEQIABgUCR5ZbMwAKCRA7MBG3a51lI7PfAKCc
+9ZtKfI5G/g66V7pSMXh9gi+ykgCgivPfGMDh9HIROwBIudo2qGImOqI=
+=htdw
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc b/src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc
new file mode 100644
index 00000000..d0f64278
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc
@@ -0,0 +1,20 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.12 (GNU/Linux)
+
+mQGiBER0iroRBADfqUeJmPCXqPJFnf3CVKy40dL1F+gfvP+JHN7/uu4c9+oCYjI1
+uAE8iGTm/Twb/Zzbs4dt0iWjhNFXbRi42rMww4d/8QcPYZ21WSehh+fv8nCjt2sw
+LeC87ar2SR8OTpJBK0fQlcd4e6H5GMntfI6SYEUOPd8m/eQ+4+1AxpUUpwCgswaF
+13fePZGI//pDn5tGjbvmaP8D/R3qum/I+oDS8lbFeeDS10GkEkwTYec13gdfsq6I
+yzIj7VBsC+rGfbipv+VGR61Q4d19pOHKLDekr9OG+3G4ZcYM4NQvQZR+QIlp3xWu
+nBmYD1LRkHLVj+Z4DGQhjjOffkPSuacKPymMaZ/aRiLgTIAo97W2YPhutscXrLSG
+2Y+BA/4jsyaDb7kbW4wc8RtPIcuFEheVqgBeRakP9Uj47kBMBEpPtI/mIdY5liKk
+ztKnuQG6ROYLNV/PW0ZbE1uT64C710weh4cB3PnZLV5P10deDLBjHk8MJQGCTSDD
+JYvhutUzQfshAU6j2kErGvKdZxWGezab34vFyMP2oLGqswPAJrRQTm92ZWxsIFBy
+b3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20pIDxub3ZlbGwt
+cHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6IZgQTEQIAJgIbAwYLCQgHAwIEFQIIAwQW
+AgMBAh4BAheABQJIFkiPBQkHhmvVAAoJEBTCi8l+LjsFn4QAn2wgOHudNubNZvTz
+NdaYJKJ0m2qnAJ9hd0nQBhn28H4Ii4a4h7kpGWRxN4hGBBMRAgAGBQJEexD/AAoJ
+EKhO2uicgArKFLwAn0B+g2mJ5n8LrBziTQ5SjnSPyDBXAJwJoYTta5Sfw/3vVGpU
+fJAKVDoB9w==
+=MWDN
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc b/src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc
new file mode 100644
index 00000000..c813e864
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc
@@ -0,0 +1,37 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.12 (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
+YWdlIFNpZ25pbmcgS2V5IDxidWlsZEBzdXNlLmRlPohiBBMRAgAiAhsDBAsHAwID
+FQIDAxYCAQIeAQIXgAUCSB80OgUJEfKmuQAKCRCoTtronIAKyuJlAJ0cWZifmBO6
+Eh71jattipdMhUYBTwCfSXbJJtuF3c96JPmpmT8be2LDo86IRgQQEQIABgUCOnBe
+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
+1dbriEwEGBECAAwFAkgfNGYFCRHyptQACgkQqE7a6JyACsrv3ACbBLhafFXmTjH3
+JJWFJGWuIOaZUosAniPs4feEyN46gjXGgcZc2Ai8nkm6
+=mY6G
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc b/src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc
new file mode 100644
index 00000000..18086b97
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc
@@ -0,0 +1,31 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.12 (GNU/Linux)
+
+mQILBERqCJkBEACdqhZWdAbUHLIumXMEgv+GFjr1ZzVHgynnFOzztU/8sxZNa9cm
+YV4HZpVfjMr7fos3ArzyiPPt/336cf7w9p79/ZS4rHSNPDMlPCtXYvFxUbvU0/GY
+q4jwcBsrJ0xaJ9CP5bWyAgVKOb7Y6k0ktaLjRR+tDfMsHA4H0ClMoRr6ATw8NL0e
+VCfAHuzqCKvX1If8ng+wTivtAhKvz/WwQiELNELmPfc5tZHOw8NgP/r0Pze18Hn2
+dlAHu0WpC7uoR00vscsMIJiJJPcsxbL1F1eADKnk+wEy8Go+EJeJ5i0WoFbqD52q
+Lv/C/oY6NVtVY0MBwtn+oQNSnQ4JBsB/Akdt53LAi0ZtNQxMyUW+76R8FCOmVCV8
+WGiF5CPRP0yvG80AMBjBjKjHb/v8ov5MnIyFimzAHS1gQcUNxTEYA/5eFwoYcGcK
+weGq9FUjPTzLQAgvp7XmOzHpSAfJ7qysxFTepNsSZZhgizJyInrdQldr+GYcUNqB
+krD9MWmFop975OxhCTEnNv/HcE79r8WD26HzDFYxTiTJbr0pU/ivBzo+rjq+YG2V
+stJk+udVYmZTnC4LmXus8JiNuqBXbxNscwCBpcJ8YcfCV6uh+7E0XfXZsgVUFLp1
+NF+ylYRGTycOlWoZODrnJevZW7N9O3bWRx/G2P4bJD07LsDLe4i5hymf5QAGKbRQ
+Tm92ZWxsIFByb3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20p
+IDxub3ZlbGwtcHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6JAjMEEwECAB0FAkRqCJkG
+CwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRBHijLooZEiCKSFD/93vZHCAMLEfksU
+KnvXl08bv1rfuamuyJnE3ANRE5RDyypriHMCnkVxazvQ2WI4W4UEjluL9+SzZwtV
+ZvKVoAr31614nSyWwv2YnJTHfjMG+xRlkolZMnuIiB9PcCBo9+GPU0ABuzo4pEJW
+NIRoSS1NFbAZBhtUnY0cN+trM5QObLl7xXTavLyGk//blkk57fov7GXsQJlZUig0
+l2yt5XNyGpLUnTMDumHh8b389quF+0+ZfdwOy7A768xjipAZiTvIujBrEv51wrxh
+0HBT0VGA0MhD9t0B+Ce4BM9P/iVMO00naaOp6PqMfPPKxQQqer8qy1i6UWBx95SY
+mKZBIvOm2d9PezDxkckCu61r6krx1iKnT1wdprCAkIYwALK118SpbxuyGW0bhRHc
+wsc/akzWH72fS0Xu49mvL4k4A2U9asdeQid3dMgbtm5mSWof0yiU/G4YNn0yeXoY
+oG1VbCAqQbFX1Rvd6GITJVqI+ekW/uMA9BP78dF8wBeG0+QmpQnSf+eOsxB/RT8o
+Kb4hHY+29MUlg+i9ceVt7hoKr03J/uIG5TXFXRYLaI0iAFVlKfWxpqDfS2XA4+dD
+VYt+5RDgBcnxDaTB4FE9GqcYScNfe7+NFtL0p0wOPftbmgZzGjucTmrD8mDUNdqA
+xGK7vlk4GATSfOQlq7G6LXW6RYnInohGBBMRAgAGBQJEazMlAAoJEKhO2uicgArK
+2vMAn0TbVDESEVKVuFZStrfIzOvJQrR9AJsH733Ju1kE99GFrdfCeGqpckmNhg==
+=E+qN
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.2/trusted-package-keys/pubring.gpg b/src/lib/distro-info/suse-11.2/trusted-package-keys/pubring.gpg
new file mode 100644
index 00000000..5bd5a78e
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2/trusted-package-keys/pubring.gpg
Binary files differ
diff --git a/src/lib/distro-info/suse-11.2_x86_64/mirrors/base b/src/lib/distro-info/suse-11.2_x86_64/mirrors/base
new file mode 100644
index 00000000..8d55eac4
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2_x86_64/mirrors/base
@@ -0,0 +1,247 @@
+http://opensuse.mirror.ac.za/opensuse/distribution/11.1/repo/oss
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.1/repo/oss
+http://mirror.lupaworld.com/opensuse/distribution/11.1/repo/oss
+http://www.lizardsource.cn/distribution/11.1/repo/oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.1/repo/oss
+ftp://www.lizardsource.cn/distribution/11.1/repo/oss
+ftp://opensuse.mirror.ac.za/opensuse/distribution/11.1/repo/oss
+http://download.opensuse.or.id/distribution/11.1/repo/oss
+http://mirror.unej.ac.id/opensuse/distribution/11.1/repo/oss
+http://opensuse.cbn.net.id/distribution/11.1/repo/oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.1/repo/oss
+http://repo.ugm.ac.id/opensuse/distribution/11.1/repo/oss
+http://dl2.foss-id.web.id/opensuse/distribution/11.1/repo/oss
+http://mirror.isoc.org.il/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirror.isoc.org.il/opensuse/distribution/11.1/repo/oss
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.1/repo/oss
+ftp://opensuse.cbn.net.id/pub/opensuse/distribution/11.1/repo/oss
+ftp://dl2.foss-id.web.id/repo/opensuse/distribution/11.1/repo/oss
+http://ftp.kddilabs.jp/Linux/packages/opensuse/distribution/11.1/repo/oss
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.1/repo/oss
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.riken.jp/Linux/opensuse/distribution/11.1/repo/oss
+ftp://mirror.unej.ac.id/opensuse/distribution/11.1/repo/oss
+ftp://ftp.novell.co.jp/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.riken.jp/Linux/opensuse/distribution/11.1/repo/oss
+http://ftp.daum.net/opensuse/distribution/11.1/repo/oss
+ftp://repo.ugm.ac.id/opensuse/distribution/11.1/repo/oss
+http://77.88.19.68/opensuse/distribution/11.1/repo/oss
+http://77.88.19.73/opensuse/distribution/11.1/repo/oss
+http://mirror.suse.ru/distribution/11.1/repo/oss
+http://77.88.19.74/opensuse/distribution/11.1/repo/oss
+http://93.158.155.193/opensuse/distribution/11.1/repo/oss
+ftp://ftp.chg.ru/pub/opensuse/distribution/11.1/repo/oss
+ftp://dispenser.yandex.net/opensuse/distribution/11.1/repo/oss
+ftp://ftp.daum.net/opensuse/distribution/11.1/repo/oss
+http://mirror.nus.edu.sg/opensuse/distribution/11.1/repo/oss
+ftp://seeder.yandex.net/opensuse/distribution/11.1/repo/oss
+ftp://allotter.yandex.net/opensuse/distribution/11.1/repo/oss
+ftp://ftp.kaist.ac.kr/opensuse/distribution/11.1/repo/oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.metu.edu.tr/opensuse/distribution/11.1/repo/oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirror.in.th/opensuse/distribution/11.1/repo/oss
+http://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.1/repo/oss
+http://ftp.chg.ru/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.1/repo/oss
+ftp://ftp.isu.edu.tw/pub/Linux/OpenSuSE/distribution/11.1/repo/oss
+http://ftp.twaren.net/Linux/OpenSuSE/distribution/11.1/repo/oss
+http://mirror-fpt-telecom.fpt.net/opensuse/distribution/11.1/repo/oss
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.1/repo/oss
+http://ftp.isu.edu.tw/pub/Linux/opensuse/distribution/11.1/repo/oss
+http://suse.inode.at/opensuse/distribution/11.1/repo/oss
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.1/repo/oss
+ftp://ftp.twaren.net/Linux/OpenSuSE/distribution/11.1/repo/oss
+http://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.tugraz.at/mirror/opensuse/distribution/11.1/repo/oss
+ftp://ftp.tugraz.at/mirror/opensuse/distribution/11.1/repo/oss
+ftp://suse.inode.at/opensuse/distribution/11.1/repo/oss
+http://suse.lagis.at/opensuse/distribution/11.1/repo/oss
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+http://mirror.opensuse.com.ba/opensuse/distribution/11.1/repo/oss
+http://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.1/repo/oss
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.1/repo/oss
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+http://mirrors.netbg.com/opensuse/distribution/11.1/repo/oss
+http://mirror.switch.ch/ftp/mirror/opensuse/distribution/11.1/repo/oss
+ftp://mirror.switch.ch/mirror/opensuse/distribution/11.1/repo/oss
+ftp://suse.lagis.at/opensuse/distribution/11.1/repo/oss
+http://mirror.karneval.cz/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://mirror.karneval.cz/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.1/repo/oss
+ftp://mirrors.netbg.com/opensuse/distribution/11.1/repo/oss
+http://ftp.linux.cz/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.1/repo/oss
+http://ftp5.gwdg.de/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.1/repo/oss
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/distribution/11.1/repo/oss
+http://download.uni-hd.de/ftp/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.1/repo/oss
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/distribution/11.1/repo/oss
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://opensuse.intergenia.de/distribution/11.1/repo/oss
+ftp://ftp5.gwdg.de/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.1/repo/oss
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.1/repo/oss
+http://widehat.opensuse.org/distribution/11.1/repo/oss
+ftp://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.1/repo/oss
+http://ftp4.gwdg.de/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp3.gwdg.de/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.1/repo/oss
+http://ftp.uni-kassel.de/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+http://opensuse-linuxmigratio.at/distribution/11.1/repo/oss
+ftp://ftp3.gwdg.de/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.1/repo/oss
+ftp://ftp4.gwdg.de/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.uni-siegen.de/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uni-siegen.de/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uni-bayreuth.de/linux/opensuse/distribution/11.1/repo/oss
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+http://ftp.klid.dk/ftp/opensuse/distribution/11.1/repo/oss
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.1/repo/oss
+ftp://ftp.klid.dk/opensuse/distribution/11.1/repo/oss
+http://ftp.estpak.ee/pub/suse/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.gui.uva.es/sites/opensuse.org/distribution/11.1/repo/oss
+ftp://ftp.gui.uva.es/sites/opensuse.org/distribution/11.1/repo/oss
+http://ftp.rediris.es/pub/mirror/opensuse/distribution/11.1/repo/oss
+http://suse.bifi.unizar.es/opensuse/distribution/11.1/repo/oss
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.1/repo/oss
+http://opensuse.mirrors.proxad.net/opensuse/distribution/11.1/repo/oss
+http://mirror.ovh.net/opensuse/distribution/11.1/repo/oss
+ftp://ftp.rediris.es/pub/mirror/opensuse/distribution/11.1/repo/oss
+http://fr2.rpmfind.net/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.1/repo/oss
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+http://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.1/repo/oss
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/oss
+ftp://fr2.rpmfind.net/linux/opensuse/distribution/11.1/repo/oss
+http://opensuse.cict.fr/distribution/11.1/repo/oss
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/distribution/11.1/repo/oss
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://mirror.ovh.net/opensuse/distribution/11.1/repo/oss
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.ntua.gr/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.ntua.gr/pub/linux/opensusedistribution/11.1/repo/oss
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.1/repo/oss
+ftp://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.1/repo/oss
+http://roxen.integrity.hu/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirror.cict.fr/opensuse/distribution/11.1/repo/oss
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.1/repo/oss
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+http://rm.mirror.garr.it/mirrors/opensuse/distribution/11.1/repo/oss
+http://repo1.linux.edu.lv/distribution/11.1/repo/oss
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/oss
+ftp://repo1.linux.edu.lv/distribution/11.1/repo/oss
+http://mirror.leaseweb.com/opensuse/distribution/11.1/repo/oss
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+ftp://mirror.leaseweb.com/opensuse/distribution/11.1/repo/oss
+http://mirrors.nl.eu.kernel.org/opensuse/distribution/11.1/repo/oss
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/distribution/11.1/repo/oss
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/distribution/11.1/repo/oss
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.1/repo/oss
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/distribution/11.1/repo/oss
+http://opensuse.hro.nl/opensuse/distribution/11.1/repo/oss
+http://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.1/repo/oss
+http://opensuse.uib.no/distribution/11.1/repo/oss
+ftp://rm.mirror.garr.it/mirrors/opensusedistribution/11.1/repo/oss
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/distribution/11.1/repo/oss
+http://ftp.uninett.no/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uninett.no/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://opensuse.hro.nl/opensuse/distribution/11.1/repo/oss
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.1/repo/oss
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.sileman.pl/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://mirrors.nl.eu.kernel.org/opensuse/distribution/11.1/repo/oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://ftp.sileman.pl/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.1/repo/oss
+http://cesium.di.uminho.pt/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.gts.lug.ro/opensuse/distribution/11.1/repo/oss
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.1/repo/oss
+ftp://ftp.gts.lug.ro/opensuse/distribution/11.1/repo/oss
+http://ftp.ines.lug.ro/opensuse/distribution/11.1/repo/oss
+http://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.1/repo/oss
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.1/repo/oss
+ftp://cesium.di.uminho.pt/pub/opensuse/distribution/11.1/repo/oss
+http://mirrors.se.eu.kernel.org/opensuse/distribution/11.1/repo/oss
+http://ftp.df.lth.se/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.1/repo/oss
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.1/repo/oss
+http://opensuse.ynet.sk/distribution/11.1/repo/oss
+ftp://mirrors.se.eu.kernel.org/opensuse/distribution/11.1/repo/oss
+ftp://ftp.ines.lug.ro/opensuse/distribution/11.1/repo/oss
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.1/repo/oss
+http://www.muug.mb.ca/pub/opensuse/distribution/11.1/repo/oss
+http://less.cogeco.net/ftp/openSUSE/distribution/11.1/repo/oss
+ftp://ftp.df.lth.se/pub/opensusedistribution/11.1/repo/oss
+http://linux.dell.com/repo/community/distribution/11.1/repo/oss
+http://ftp.osuosl.org/pub/opensuse/distribution/11.1/repo/oss
+ftp://less.cogeco.net/openSUSE/distribution/11.1/repo/oss
+http://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.1/repo/oss
+http://suse.mirrors.tds.net/pub/opensuse/distribution/11.1/repo/oss
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.osuosl.org/pub/opensuse/distribution/11.1/repo/oss
+http://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://www.muug.mb.ca/pub/opensuse/distribution/11.1/repo/oss
+http://mirror.umoss.org/opensuse/distribution/11.1/repo/oss
+ftp://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.1/repo/oss
+http://mirrors.med.harvard.edu/opensuse/distribution/11.1/repo/oss
+http://opensuse.cs.utah.edu/distribution/11.1/repo/oss
+ftp://suse.mirrors.tds.net/pub/opensuse/distribution/11.1/repo/oss
+http://mirrors.xmission.com/opensuse/distribution/11.1/repo/oss
+http://mirrors2.kernel.org/opensuse/distribution/11.1/repo/oss
+http://opensuse.ca.unixheads.org/distribution/11.1/repo/oss
+http://mirrors1.kernel.org/opensuse/distribution/11.1/repo/oss
+ftp://mirrors2.kernel.org/opensuse/distribution/11.1/repo/oss
+http://mirror.rackspace.com/openSUSE/distribution/11.1/repo/oss
+http://130.57.19.201/distribution/11.1/repo/oss
+ftp://mirrors.xmission.com/opensuse/distribution/11.1/repo/oss
+ftp://130.57.19.201/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirrors1.kernel.org/opensuse/distribution/11.1/repo/oss
+http://ftp.ussg.iu.edu/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.utexas.edu/opensuse/distribution/11.1/repo/oss
+ftp://opensuse.cs.utah.edu/pub/opensuse/distribution/11.1/repo/oss
+http://www.gtlib.gatech.edu/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.1/repo/oss
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/distribution/11.1/repo/oss
+ftp://ftp.utexas.edu/mirrors/opensuse/distribution/11.1/repo/oss
+http://mirror.nyi.net/opensuse/distribution/11.1/repo/oss
+http://mirror.cps.cmich.edu/opensuse/opensuse/distribution/11.1/repo/oss
+http://mirrors.rit.edu/opensuse/distribution/11.1/repo/oss
+ftp://ftp.ussg.iu.edu/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.iinet.net.au/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirror.nyi.net/opensusedistribution/11.1/repo/oss
+ftp://mirror.rackspace.com/openSUSE/distribution/11.1/repo/oss
+http://mirror.internode.on.net/pub/opensuse/distribution/11.1/repo/oss
+http://mirror.pacific.net.au/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.iinet.net.au/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirror.internode.on.net/pub/opensuse/distribution/11.1/repo/oss
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://mirror.pacific.net.au/linux/opensuse/distribution/11.1/repo/oss
+http://opensuse.patan.com.ar/distribution/11.1/repo/oss
+http://200.221.9.37/pub/opensuse/distribution/11.1/repo/oss
+http://opensuse.c3sl.ufpr.br/distribution/11.1/repo/oss
+ftp://opensuse.c3sl.ufpr.br/opensuse/distribution/11.1/repo/oss
+http://opensuse.pop.com.br/distribution/11.1/repo/oss
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.1/repo/oss
diff --git a/src/lib/distro-info/suse-11.2_x86_64/mirrors/base_non-oss b/src/lib/distro-info/suse-11.2_x86_64/mirrors/base_non-oss
new file mode 100644
index 00000000..bd887ed3
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2_x86_64/mirrors/base_non-oss
@@ -0,0 +1,246 @@
+http://opensuse.mirror.ac.za/opensuse/distribution/11.1/repo/non-oss
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.1/repo/non-oss
+ftp://opensuse.mirror.ac.za/opensuse/distribution/11.1/repo/non-oss
+http://mirror.lupaworld.com/opensuse/distribution/11.1/repo/non-oss
+http://www.lizardsource.cn/distribution/11.1/repo/non-oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.1/repo/non-oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.1/repo/non-oss
+http://download.opensuse.or.id/distribution/11.1/repo/non-oss
+http://opensuse.cbn.net.id/distribution/11.1/repo/non-oss
+http://repo.ugm.ac.id/opensuse/distribution/11.1/repo/non-oss
+http://mirror.unej.ac.id/opensuse/distribution/11.1/repo/non-oss
+ftp://opensuse.cbn.net.id/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.unej.ac.id/opensuse/distribution/11.1/repo/non-oss
+http://dl2.foss-id.web.id/opensuse/distribution/11.1/repo/non-oss
+http://mirror.isoc.org.il/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.1/repo/non-oss
+ftp://dl2.foss-id.web.id/repo/opensuse/distribution/11.1/repo/non-oss
+ftp://www.lizardsource.cn/distribution/11.1/repo/non-oss
+http://ftp.kddilabs.jp/Linux/packages/opensuse/distribution/11.1/repo/non-oss
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.novell.co.jp/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.1/repo/non-oss
+ftp://repo.ugm.ac.id/opensuse/distribution/11.1/repo/non-oss
+http://ftp.riken.jp/Linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.riken.jp/Linux/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.isoc.org.il/opensuse/distribution/11.1/repo/non-oss
+http://ftp.daum.net/opensuse/distribution/11.1/repo/non-oss
+http://77.88.19.68/opensuse/distribution/11.1/repo/non-oss
+http://77.88.19.73/opensuse/distribution/11.1/repo/non-oss
+http://mirror.suse.ru/distribution/11.1/repo/non-oss
+http://77.88.19.74/opensuse/distribution/11.1/repo/non-oss
+http://93.158.155.193/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.chg.ru/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://seeder.yandex.net/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.kaist.ac.kr/opensuse/distribution/11.1/repo/non-oss
+http://mirror.nus.edu.sg/opensuse/distribution/11.1/repo/non-oss
+ftp://allotter.yandex.net/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.novell.co.jp/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.metu.edu.tr/opensuse/distribution/11.1/repo/non-oss
+ftp://dispenser.yandex.net/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.isu.edu.tw/pub/Linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.chg.ru/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.1/repo/non-oss
+ftp://ftp.isu.edu.tw/pub/Linux/OpenSuSE/distribution/11.1/repo/non-oss
+http://ftp.twaren.net/Linux/OpenSuSE/distribution/11.1/repo/non-oss
+ftp://mirror.in.th/opensuse/distribution/11.1/repo/non-oss
+http://mirror-fpt-telecom.fpt.net/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.1/repo/non-oss
+http://suse.inode.at/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.1/repo/non-oss
+ftp://spreader.yandex.net/opensuse/distribution/11.1/repo/non-oss
+ftp://suse.inode.at/opensuse/distribution/11.1/repo/non-oss
+http://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.tugraz.at/mirror/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.twaren.net/Linux/OpenSuSE/distribution/11.1/repo/non-oss
+http://suse.lagis.at/opensuse/distribution/11.1/repo/non-oss
+ftp://suse.lagis.at/opensuse/distribution/11.1/repo/non-oss
+http://mirror.opensuse.com.ba/opensuse/distribution/11.1/repo/non-oss
+http://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.1/repo/non-oss
+ftp://ftp.tugraz.at/mirror/opensuse/distribution/11.1/repo/non-oss
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+http://mirrors.netbg.com/opensuse/distribution/11.1/repo/non-oss
+ftp://mirrors.netbg.com/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+http://mirror.switch.ch/ftp/mirror/opensuse/distribution/11.1/repo/non-oss
+http://mirror.karneval.cz/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.karneval.cz/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.switch.ch/mirror/opensuse/distribution/11.1/repo/non-oss
+http://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.1/repo/non-oss
+http://ftp5.gwdg.de/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp5.gwdg.de/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/distribution/11.1/repo/non-oss
+http://download.uni-hd.de/ftp/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.1/repo/non-oss
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.linux.cz/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/distribution/11.1/repo/non-oss
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.intergenia.de/distribution/11.1/repo/non-oss
+http://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.1/repo/non-oss
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.1/repo/non-oss
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp3.gwdg.de/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.1/repo/non-oss
+http://widehat.opensuse.org/distribution/11.1/repo/non-oss
+http://ftp4.gwdg.de/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp4.gwdg.de/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.uni-kassel.de/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+http://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://opensuse-linuxmigratio.at/distribution/11.1/repo/non-oss
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.uni-siegen.de/opensuse/distribution/11.1/repo/non-oss
+http://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp3.gwdg.de/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.klid.dk/ftp/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.1/repo/non-oss
+http://ftp.estpak.ee/pub/suse/opensuse/distribution/11.1/repo/non-oss
+http://ftp.gui.uva.es/sites/opensuse.org/distribution/11.1/repo/non-oss
+ftp://ftp.uni-siegen.de/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.uni-bayreuth.de/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.rediris.es/pub/mirror/opensuse/distribution/11.1/repo/non-oss
+http://mirror.ovh.net/opensuse/distribution/11.1/repo/non-oss
+http://suse.bifi.unizar.es/opensuse/distribution/11.1/repo/non-oss
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.mirrors.proxad.net/opensuse/distribution/11.1/repo/non-oss
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.klid.dk/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.rediris.es/pub/mirror/opensuse/distribution/11.1/repo/non-oss
+http://fr2.rpmfind.net/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.ovh.net/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.gui.uva.es/sites/opensuse.org/distribution/11.1/repo/non-oss
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://fr2.rpmfind.net/linux/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.cict.fr/distribution/11.1/repo/non-oss
+http://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.1/repo/non-oss
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/non-oss
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/distribution/11.1/repo/non-oss
+ftp://mirror.cict.fr/opensuse/distribution/11.1/repo/non-oss
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://ftp.ntua.gr/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/distribution/11.1/repo/non-oss
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.1/repo/non-oss
+http://roxen.integrity.hu/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.ntua.gr/pub/linux/opensusedistribution/11.1/repo/non-oss
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+ftp://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.1/repo/non-oss
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.1/repo/non-oss
+http://rm.mirror.garr.it/mirrors/opensuse/distribution/11.1/repo/non-oss
+ftp://rm.mirror.garr.it/mirrors/opensusedistribution/11.1/repo/non-oss
+http://repo1.linux.edu.lv/distribution/11.1/repo/non-oss
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://repo1.linux.edu.lv/distribution/11.1/repo/non-oss
+http://mirror.leaseweb.com/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.leaseweb.com/opensuse/distribution/11.1/repo/non-oss
+http://mirrors.nl.eu.kernel.org/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/distribution/11.1/repo/non-oss
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.hro.nl/opensuse/distribution/11.1/repo/non-oss
+ftp://mirrors.nl.eu.kernel.org/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.1/repo/non-oss
+http://ftp.uninett.no/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.uib.no/distribution/11.1/repo/non-oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.sileman.pl/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.uninett.no/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://opensuse.hro.nl/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.1/repo/non-oss
+http://cesium.di.uminho.pt/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://cesium.di.uminho.pt/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.sileman.pl/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.1/repo/non-oss
+http://ftp.gts.lug.ro/opensuse/distribution/11.1/repo/non-oss
+http://ftp.ines.lug.ro/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.ines.lug.ro/opensuse/distribution/11.1/repo/non-oss
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.1/repo/non-oss
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.1/repo/non-oss
+http://mirrors.se.eu.kernel.org/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.1/repo/non-oss
+http://ftp.df.lth.se/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.ynet.sk/distribution/11.1/repo/non-oss
+ftp://mirrors.se.eu.kernel.org/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.df.lth.se/pub/opensusedistribution/11.1/repo/non-oss
+http://less.cogeco.net/ftp/openSUSE/distribution/11.1/repo/non-oss
+ftp://ftp.gts.lug.ro/opensuse/distribution/11.1/repo/non-oss
+ftp://less.cogeco.net/openSUSE/distribution/11.1/repo/non-oss
+http://www.muug.mb.ca/pub/opensuse/distribution/11.1/repo/non-oss
+http://linux.dell.com/repo/community/distribution/11.1/repo/non-oss
+http://ftp.osuosl.org/pub/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.osuosl.org/pub/opensuse/distribution/11.1/repo/non-oss
+http://suse.mirrors.tds.net/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://www.muug.mb.ca/pub/opensuse/distribution/11.1/repo/non-oss
+http://mirrors.med.harvard.edu/opensuse/distribution/11.1/repo/non-oss
+http://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://mirror.umoss.org/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.cs.utah.edu/distribution/11.1/repo/non-oss
+http://opensuse.ca.unixheads.org/distribution/11.1/repo/non-oss
+ftp://opensuse.cs.utah.edu/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://mirrors.xmission.com/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://mirrors2.kernel.org/opensuse/distribution/11.1/repo/non-oss
+ftp://mirrors.xmission.com/opensuse/distribution/11.1/repo/non-oss
+http://mirrors1.kernel.org/opensuse/distribution/11.1/repo/non-oss
+http://mirror.rackspace.com/openSUSE/distribution/11.1/repo/non-oss
+http://130.57.19.201/distribution/11.1/repo/non-oss
+ftp://130.57.19.201/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.rackspace.com/openSUSE/distribution/11.1/repo/non-oss
+http://ftp.utexas.edu/opensuse/distribution/11.1/repo/non-oss
+http://www.gtlib.gatech.edu/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://mirrors2.kernel.org/opensuse/distribution/11.1/repo/non-oss
+http://ftp.ussg.iu.edu/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.utexas.edu/mirrors/opensuse/distribution/11.1/repo/non-oss
+ftp://www.gtlib.gatech.edu/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://mirrors1.kernel.org/opensuse/distribution/11.1/repo/non-oss
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/distribution/11.1/repo/non-oss
+http://mirror.cps.cmich.edu/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://mirror.nyi.net/opensuse/distribution/11.1/repo/non-oss
+http://mirrors.rit.edu/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.iinet.net.au/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.nyi.net/opensusedistribution/11.1/repo/non-oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.1/repo/non-oss
+http://mirror.pacific.net.au/linux/opensuse/distribution/11.1/repo/non-oss
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.pacific.net.au/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.internode.on.net/pub/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.patan.com.ar/distribution/11.1/repo/non-oss
+http://200.221.9.37/pub/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.c3sl.ufpr.br/distribution/11.1/repo/non-oss
+http://opensuse.pop.com.br/distribution/11.1/repo/non-oss
+ftp://opensuse.c3sl.ufpr.br/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.1/repo/non-oss
diff --git a/src/lib/distro-info/suse-11.2_x86_64/mirrors/base_update b/src/lib/distro-info/suse-11.2_x86_64/mirrors/base_update
new file mode 100644
index 00000000..d0c666e0
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2_x86_64/mirrors/base_update
@@ -0,0 +1,246 @@
+http://opensuse.mirror.ac.za/opensuse/update/11.1
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/update/11.1
+http://download.opensuse.or.id/update/11.1
+ftp://opensuse.mirror.ac.za/opensuse/update/11.1
+http://mirror.lupaworld.com/opensuse/update/11.1
+http://www.lizardsource.cn/update/11.1
+http://mirror.alva.ge/pub/opensuse/update/11.1
+http://mirror.alva.ge/pub/opensuse/update/11.1
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/update/11.1
+http://mirror.unej.ac.id/opensuse/update/11.1
+http://opensuse.cbn.net.id/update/11.1
+http://repo.ugm.ac.id/opensuse/update/11.1
+ftp://mirror.unej.ac.id/opensuse/update/11.1
+http://dl2.foss-id.web.id/opensuse/update/11.1
+http://mirror.isoc.org.il/pub/opensuse/update/11.1
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/update/11.1
+ftp://dl2.foss-id.web.id/repo/opensuse/update/11.1
+http://ftp.kddilabs.jp/Linux/packages/opensuse/update/11.1
+ftp://mirror.isoc.org.il/opensuse/update/11.1
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/update/11.1
+ftp://opensuse.cbn.net.id/pub/opensuse/update/11.1
+ftp://repo.ugm.ac.id/opensuse/update/11.1
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/update/11.1
+ftp://www.lizardsource.cn/update/11.1
+http://ftp.riken.jp/Linux/opensuse/update/11.1
+http://ftp.daum.net/opensuse/update/11.1
+http://77.88.19.68/opensuse/update/11.1
+ftp://ftp.novell.co.jp/pub/opensuse/update/11.1
+http://77.88.19.73/opensuse/update/11.1
+ftp://ftp.riken.jp/Linux/opensuse/update/11.1
+http://mirror.suse.ru/update/11.1
+http://77.88.19.74/opensuse/update/11.1
+http://93.158.155.193/opensuse/update/11.1
+ftp://dispenser.yandex.net/opensuse/update/11.1
+ftp://ftp.kaist.ac.kr/opensuse/update/11.1
+ftp://ftp.chg.ru/pub/opensuse/update/11.1
+ftp://spreader.yandex.net/opensuse/update/11.1
+ftp://allotter.yandex.net/opensuse/update/11.1
+http://mirror.nus.edu.sg/opensuse/update/11.1
+ftp://seeder.yandex.net/opensuse/update/11.1
+ftp://ftp.metu.edu.tr/opensuse/update/11.1
+ftp://ftp.suntel.com.tr/pub/opensuse/update/11.1
+http://ftp.isu.edu.tw/pub/Linux/opensuse/update/11.1
+ftp://mirror.in.th/opensuse/update/11.1
+ftp://ftp.suntel.com.tr/pub/opensuse/update/11.1
+http://ftp.chg.ru/pub/opensuse/update/11.1
+http://ftp.ncnu.edu.tw/Linux/opensuse/update/11.1
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/update/11.1
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/update/11.1
+http://ftp.twaren.net/Linux/OpenSuSE/update/11.1
+http://mirror-fpt-telecom.fpt.net/opensuse/update/11.1
+http://suse.inode.at/opensuse/update/11.1
+ftp://ftp.twaren.net/Linux/OpenSuSE/update/11.1
+http://gd.tuwien.ac.at/opsys/linux/opensuse/update/11.1
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/update/11.1
+http://ftp.tugraz.at/mirror/opensuse/update/11.1
+ftp://suse.inode.at/opensuse/update/11.1
+http://suse.lagis.at/opensuse/update/11.1
+ftp://suse.lagis.at/opensuse/update/11.1
+http://mirror.opensuse.com.ba/opensuse/update/11.1
+http://ftp.belnet.be/mirror/ftp.opensuse.org/update/11.1
+ftp://ftp.tugraz.at/mirror/opensuse/update/11.1
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/update/11.1
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/update/11.1
+http://mirrors.netbg.com/opensuse/update/11.1
+ftp://mirrors.netbg.com/opensuse/update/11.1
+http://mirror.switch.ch/ftp/mirror/opensuse/update/11.1
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/update/11.1
+http://mirror.karneval.cz/pub/linux/opensuse/update/11.1
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/update/11.1
+http://ftp.linux.cz/pub/linux/opensuse/update/11.1
+ftp://mirror.switch.ch/mirror/opensuse/update/11.1
+http://ftp.halifax.rwth-aachen.de/opensuse/update/11.1
+ftp://mirror.karneval.cz/pub/linux/opensuse/update/11.1
+http://ftp5.gwdg.de/pub/opensuse/update/11.1
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/update/11.1
+ftp://ftp5.gwdg.de/pub/opensuse/update/11.1
+http://download.uni-hd.de/ftp/pub/linux/opensuse/update/11.1
+ftp://ftp.halifax.rwth-aachen.de/opensuse/update/11.1
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/update/11.1
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/update/11.1
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/update/11.1
+http://opensuse.intergenia.de/update/11.1
+http://ftp.uni-ulm.de/mirrors/opensuse/update/11.1
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/update/11.1
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/update/11.1
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/update/11.1
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/update/11.1
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/update/11.1
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/update/11.1
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/update/11.1
+ftp://ftp.uni-ulm.de/mirrors/opensuse/update/11.1
+http://ftp.uni-kl.de/pub/linux/opensuse/update/11.1
+http://ftp3.gwdg.de/pub/opensuse/update/11.1
+http://widehat.opensuse.org/update/11.1
+ftp://ftp4.gwdg.de/pub/opensuse/update/11.1
+http://ftp.uni-kassel.de/opensuse/update/11.1
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/update/11.1
+ftp://ftp3.gwdg.de/pub/opensuse/update/11.1
+http://ftp4.gwdg.de/pub/opensuse/update/11.1
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/update/11.1
+ftp://ftp.uni-kl.de/pub/linux/opensuse/update/11.1
+http://ftp.uni-bayreuth.de/linux/opensuse/update/11.1
+http://opensuse-linuxmigratio.at/update/11.1
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/update/11.1
+http://ftp.uni-siegen.de/opensuse/update/11.1
+http://ftp.tu-ilmenau.de/mirror/opensuse/update/11.1
+http://ftp.uni-paderborn.de/pub/linux/opensuse/update/11.1
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/update/11.1
+http://ftp.klid.dk/ftp/opensuse/update/11.1
+http://ftp.estpak.ee/pub/suse/opensuse/update/11.1
+ftp://ftp.uni-siegen.de/pub/opensuse/update/11.1
+ftp://ftp.uni-bayreuth.de/linux/opensuse/update/11.1
+ftp://ftp.gui.uva.es/sites/opensuse.org/update/11.1
+http://ftp.rediris.es/pub/mirror/opensuse/update/11.1
+ftp://ftp.klid.dk/opensuse/update/11.1
+http://ftp.gui.uva.es/sites/opensuse.org/update/11.1
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/update/11.1
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/update/11.1
+http://opensuse.mirrors.proxad.net/opensuse/update/11.1
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/update/11.1
+http://mirror.ovh.net/opensuse/update/11.1
+http://suse.bifi.unizar.es/opensuse/update/11.1
+ftp://ftp.rediris.es/pub/mirror/opensuse/update/11.1
+http://fr2.rpmfind.net/linux/opensuse/update/11.1
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/update/11.1
+http://opensuse.cict.fr/update/11.1
+ftp://mirror.cict.fr/opensuse/update/11.1
+http://www.mirrorservice.org/sites/download.opensuse.org/update/11.1
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/update/11.1
+ftp://fr2.rpmfind.net/linux/opensuse/update/11.1
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/update/11.1
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/update/11.1
+ftp://mirror.ovh.net/opensuse/update/11.1
+ftp://www.mirrorservice.org/sites/download.opensuse.org/update/11.1
+http://ftp.ntua.gr/pub/linux/opensuse/update/11.1
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/update/11.1
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/update/11.1
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/update/11.1
+http://roxen.integrity.hu/pub/opensuse/update/11.1
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/update/11.1
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/update/11.1
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/update/11.1
+ftp://ftp.ntua.gr/pub/linux/opensuseupdate/11.1
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/update/11.1
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/update/11.1
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/update/11.1
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/update/11.1
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/update/11.1
+http://rm.mirror.garr.it/mirrors/opensuse/update/11.1
+http://repo1.linux.edu.lv/update/11.1
+http://mirror.leaseweb.com/opensuse/update/11.1
+ftp://rm.mirror.garr.it/mirrors/opensuseupdate/11.1
+http://mirrors.nl.eu.kernel.org/opensuse/update/11.1
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/update/11.1
+ftp://mirrors.nl.eu.kernel.org/opensuse/update/11.1
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/update/11.1
+ftp://mirror.leaseweb.com/opensuse/update/11.1
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/update/11.1
+http://opensuse.hro.nl/opensuse/update/11.1
+ftp://repo1.linux.edu.lv/update/11.1
+http://opensuse.uib.no/update/11.1
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/update/11.1
+http://ftp.uninett.no/pub/linux/opensuse/update/11.1
+ftp://ftp.uninett.no/pub/linux/opensuse/update/11.1
+ftp://opensuse.hro.nl/opensuse/update/11.1
+http://ftp.icm.edu.pl/pub/Linux/opensuse/update/11.1
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/update/11.1
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/update/11.1
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/update/11.1
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/update/11.1
+http://ftp.sileman.pl/pub/opensuse/update/11.1
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/update/11.1
+ftp://ftp.pbone.net/pub/opensuse/update/11.1
+http://cesium.di.uminho.pt/pub/opensuse/update/11.1
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/update/11.1
+ftp://ftp.sileman.pl/pub/opensuse/update/11.1
+http://ftp.nux.ipb.pt/pub/dists/opensuse/update/11.1
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/update/11.1
+http://ftp.gts.lug.ro/opensuse/update/11.1
+ftp://cesium.di.uminho.pt/pub/opensuse/update/11.1
+http://ftp.ines.lug.ro/opensuse/update/11.1
+ftp://ftp.ines.lug.ro/opensuse/update/11.1
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/update/11.1
+http://mirrors.se.eu.kernel.org/opensuse/update/11.1
+ftp://ftp.pbone.net/pub/opensuse/update/11.1
+http://ftp.df.lth.se/pub/opensuse/update/11.1
+ftp://ftp.df.lth.se/pub/opensuseupdate/11.1
+ftp://ftp.gts.lug.ro/opensuse/update/11.1
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/update/11.1
+http://less.cogeco.net/ftp/openSUSE/update/11.1
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/update/11.1
+http://opensuse.ynet.sk/update/11.1
+ftp://mirrors.se.eu.kernel.org/opensuse/update/11.1
+http://www.muug.mb.ca/pub/opensuse/update/11.1
+http://linux.dell.com/repo/community/update/11.1
+ftp://www.muug.mb.ca/pub/opensuse/update/11.1
+http://ftp.osuosl.org/pub/opensuse/update/11.1
+http://opensuse.fastsoft.net/pub/linux/opensuse/update/11.1
+http://suse.mirrors.tds.net/pub/opensuse/update/11.1
+http://mirrors.med.harvard.edu/opensuse/update/11.1
+ftp://ftp.osuosl.org/pub/opensuse/update/11.1
+http://mirror.anl.gov/pub/opensuse/opensuse/update/11.1
+http://mirror.umoss.org/opensuse/update/11.1
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/update/11.1
+http://opensuse.cs.utah.edu/update/11.1
+http://opensuse.ca.unixheads.org/update/11.1
+ftp://opensuse.cs.utah.edu/pub/opensuse/update/11.1
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/update/11.1
+http://mirrors.xmission.com/opensuse/update/11.1
+ftp://mirror.anl.gov/pub/opensuse/opensuse/update/11.1
+ftp://suse.mirrors.tds.net/pub/opensuse/update/11.1
+http://mirrors2.kernel.org/opensuse/update/11.1
+ftp://mirrors.xmission.com/opensuse/update/11.1
+http://mirrors1.kernel.org/opensuse/update/11.1
+ftp://mirrors2.kernel.org/opensuse/update/11.1
+http://130.57.19.201/update/11.1
+ftp://mirrors1.kernel.org/opensuse/update/11.1
+ftp://mirror.rackspace.com/openSUSE/update/11.1
+ftp://130.57.19.201/pub/opensuse/update/11.1
+http://ftp.utexas.edu/opensuse/update/11.1
+ftp://mirror.colorado.edu/pub/opensuse/update/11.1
+http://mirror.rackspace.com/openSUSE/update/11.1
+ftp://www.gtlib.gatech.edu/pub/opensuse/update/11.1
+http://www.gtlib.gatech.edu/pub/opensuse/update/11.1
+ftp://ftp.utexas.edu/mirrors/opensuse/update/11.1
+http://ftp.ussg.iu.edu/linux/opensuse/update/11.1
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/update/11.1
+http://mirror.cps.cmich.edu/opensuse/opensuse/update/11.1
+http://mirror.nyi.net/opensuse/update/11.1
+ftp://mirror.colorado.edu/pub/opensuse/update/11.1
+http://mirrors.rit.edu/opensuse/update/11.1
+http://ftp.iinet.net.au/pub/opensuse/update/11.1
+ftp://mirror.nyi.net/opensuseupdate/11.1
+http://mirror.internode.on.net/pub/opensuse/update/11.1
+http://mirror.pacific.net.au/linux/opensuse/update/11.1
+ftp://ftp.iinet.net.au/pub/opensuse/update/11.1
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/update/11.1
+http://200.221.9.37/pub/opensuse/update/11.1
+http://opensuse.c3sl.ufpr.br/update/11.1
+http://opensuse.pop.com.br/update/11.1
+http://opensuse.patan.com.ar/update/11.1
+ftp://mirror.internode.on.net/pub/opensuse/update/11.1
+ftp://mirror.pacific.net.au/linux/opensuse/update/11.1
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/update/11.1
+ftp://opensuse.c3sl.ufpr.br/opensuse/update/11.1
diff --git a/src/lib/distro-info/suse-11.2_x86_64/prereqfiles/etc/group b/src/lib/distro-info/suse-11.2_x86_64/prereqfiles/etc/group
new file mode 100644
index 00000000..505cb221
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2_x86_64/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/src/lib/distro-info/suse-11.2_x86_64/prereqfiles/etc/hosts b/src/lib/distro-info/suse-11.2_x86_64/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2_x86_64/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/suse-11.2_x86_64/prereqfiles/etc/passwd b/src/lib/distro-info/suse-11.2_x86_64/prereqfiles/etc/passwd
new file mode 100644
index 00000000..9b8fc4fe
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2_x86_64/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/src/lib/distro-info/suse-11.2_x86_64/prereqfiles/etc/shadow b/src/lib/distro-info/suse-11.2_x86_64/prereqfiles/etc/shadow
new file mode 100644
index 00000000..cd100a5a
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2_x86_64/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/src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc b/src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc
new file mode 100644
index 00000000..ac75d62a
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc
@@ -0,0 +1,17 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (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/src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc b/src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc
new file mode 100644
index 00000000..57a9078a
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc
@@ -0,0 +1,13 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+mIsERCAdXQEEAL7MrBTz+3SBWpCm2ae2yaDqV3ezQcs2JlvqidJVhsZqQe9/jkxi
+KTEQW5+TXF/+BlQSiebunRI7oo3+9U8GyRCgs1sf+yRQWMLzZqRaarzRhw9w+Ihl
+edtqYl6/U2JZCb8Adp6d7RzlRliJdJ/VtsfXj2ef7Dwu7elOVSsmaBdtAAYptChT
+dVNFIFBhY2thZ2UgU2lnbmluZyBLZXkgPGJ1aWxkQHN1c2UuZGU+iLgEEwECACIC
+GwMECwcDAgMVAgMDFgIBAh4BAheABQJIHzCqBQkHwXpNAAoJEOOlw2Awfj1UvWgE
+AIRoxE8S6jQB7S43SVcX06FHJeUJ/m+1ErIj9LwJTYrR/8qsDjTgrttgb+nBHkIj
+NhCCLAuR8sWj3CxsUMH2fayryNnwZEWGqnzo7Jtt4R1Ur3h5pHYonFjfoJyFUZjJ
+7Mhw7/TuOWx20FrzqBi8tbHx8pd7Fa5lCUgopVtMh6GR
+=R56j
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc b/src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc
new file mode 100644
index 00000000..80380d2f
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc
@@ -0,0 +1,30 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (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/src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-3dbdc284-49144c3f.asc b/src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-3dbdc284-49144c3f.asc
new file mode 100644
index 00000000..aaec909b
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-3dbdc284-49144c3f.asc
@@ -0,0 +1,19 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+mQENBEkUTD8BCADWLy5d5IpJedHQQSXkC1VK/oAZlJEeBVpSZjMCn8LiHaI9Wq3G
+3Vp6wvsP1b3kssJGzVFNctdXt5tjvOLxvrEfRJuGfqHTKILByqLzkeyWawbFNfSQ
+93/8OunfSTXC1Sx3hgsNXQuOrNVKrDAQUqT620/jj94xNIg09bLSxsjN6EeTvyiO
+mtE9H1J03o9tY6meNL/gcQhxBvwuo205np0JojYBP0pOfN8l9hnIOLkA0yu4ZXig
+oKOVmf4iTjX4NImIWldT+UaWTO18NWcCrujtgHueytwYLBNV5N0oJIP2VYuLZfSD
+VYuPllv7c6O2UEOXJsdbQaVuzU1HLocDyipnABEBAAG0NG9wZW5TVVNFIFByb2pl
+Y3QgU2lnbmluZyBLZXkgPG9wZW5zdXNlQG9wZW5zdXNlLm9yZz6JATwEEwECACYF
+AkkUTD8CGwMFCQPCZwAGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRC4iy/UPb3C
+hIE9B/9DUwwQ5c+8xW0x2Fli5Yn1P+4Wq3nmB+ZTpM5Q1a7A2l+HhpUBsnwx2e/4
+RuXlJ06uYby8UpXCli44jXFepJgiXp7ZRPX5A06aY9Pz0wawsMtYQS716+vSV3e3
+ynZmTGKxj8Z94TEVcEjMP1/XpjW22DcpItRJX2VCW7lUXDmRfQzBEolcfwlF7a1B
+VcSqGZX8JvuTocLX/+fYBhZYQvERw6PUVGoEskMXMoRg6PqWMesW9Bq3cm8oeBa2
+4YmGLkN2ztBIbqRMSv0binKcddHHvRlxVFRXrnnlXrEPKrx9Fbu4vkqrG+EKE6+v
+GO73ROyEcJuuoJTYsKPx6Uic5gRl
+=guZP
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-56b4177a-47965b33.asc b/src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-56b4177a-47965b33.asc
new file mode 100644
index 00000000..f0bb55a3
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-56b4177a-47965b33.asc
@@ -0,0 +1,19 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+mQGiBEeWWzMRBADU8l2IckSzgdUS1dn0WMM7wXK4seoFsHHQw/0unHCQCxpyDMnn
+TKV86p5KTbR1FDdeaZlY0yCV+IGsiIxLyuUdJn8vuA5gA5ZkUr89/HtWaeZVl77J
+HIQxvhDRBWCOO4QNtrZYWvGbvl83wl/zOfdLEs8IGElt0LgfohyTA1qfrwCg/Hac
+tDDscXsPlo5Jek/+3RHVeD0D/30riCpfpLJOmhraLg1EbWsE0mN9IQsl+WDPdoYo
+bB76z6eH3e38618WzP/LTG4WuVbwpSSqmXyfdVpXxWzESfT8q0B8CGpHf/Sa/T/L
+emohmRnLvkf/tAfxFmDMm1jOewJIE9S35jANGHVJcxmfRNpPWC7uHnqjopnsmDkL
+kMEdBAC6YcpDOcMJZ9sJbt/JNZBaoT5CltgMDlSN50t2v/J5em8qMLqCSNF5UJyd
+LFnePHTHy6gVjWbqcC0ncFzOqM1y644Up7BoKSAr1hRTl6Mw9S3UfZZZ0al3JtWt
+8y0eFIW3QP66w1AL0LO2bZMBuOvhb63DXv5iHorcxk0yIFbbybRCb3BlblNVU0U6
+RmFjdG9yeSBPQlMgUHJvamVjdCA8b3BlblNVU0U6RmFjdG9yeUBidWlsZC5vcGVu
+c3VzZS5vcmc+iGYEExECACYFAkeWWzMCGwMFCQQesAAGCwkIBwMCBBUCCAMEFgID
+AQIeAQIXgAAKCRAcchwkVrQXevBsAKCOeScnlH2fWVBJGHTOVJ3M4yBqDACbBeNk
+PuWo05AOQ3M1dLE1hkN36G+IRgQTEQIABgUCR5ZbMwAKCRA7MBG3a51lI7PfAKCc
+9ZtKfI5G/g66V7pSMXh9gi+ykgCgivPfGMDh9HIROwBIudo2qGImOqI=
+=htdw
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc b/src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc
new file mode 100644
index 00000000..74ff59e0
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc
@@ -0,0 +1,20 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+mQGiBER0iroRBADfqUeJmPCXqPJFnf3CVKy40dL1F+gfvP+JHN7/uu4c9+oCYjI1
+uAE8iGTm/Twb/Zzbs4dt0iWjhNFXbRi42rMww4d/8QcPYZ21WSehh+fv8nCjt2sw
+LeC87ar2SR8OTpJBK0fQlcd4e6H5GMntfI6SYEUOPd8m/eQ+4+1AxpUUpwCgswaF
+13fePZGI//pDn5tGjbvmaP8D/R3qum/I+oDS8lbFeeDS10GkEkwTYec13gdfsq6I
+yzIj7VBsC+rGfbipv+VGR61Q4d19pOHKLDekr9OG+3G4ZcYM4NQvQZR+QIlp3xWu
+nBmYD1LRkHLVj+Z4DGQhjjOffkPSuacKPymMaZ/aRiLgTIAo97W2YPhutscXrLSG
+2Y+BA/4jsyaDb7kbW4wc8RtPIcuFEheVqgBeRakP9Uj47kBMBEpPtI/mIdY5liKk
+ztKnuQG6ROYLNV/PW0ZbE1uT64C710weh4cB3PnZLV5P10deDLBjHk8MJQGCTSDD
+JYvhutUzQfshAU6j2kErGvKdZxWGezab34vFyMP2oLGqswPAJrRQTm92ZWxsIFBy
+b3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20pIDxub3ZlbGwt
+cHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6IZgQTEQIAJgIbAwYLCQgHAwIEFQIIAwQW
+AgMBAh4BAheABQJIFkiPBQkHhmvVAAoJEBTCi8l+LjsFn4QAn2wgOHudNubNZvTz
+NdaYJKJ0m2qnAJ9hd0nQBhn28H4Ii4a4h7kpGWRxN4hGBBMRAgAGBQJEexD/AAoJ
+EKhO2uicgArKFLwAn0B+g2mJ5n8LrBziTQ5SjnSPyDBXAJwJoYTta5Sfw/3vVGpU
+fJAKVDoB9w==
+=MWDN
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc b/src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc
new file mode 100644
index 00000000..daeef8a5
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc
@@ -0,0 +1,37 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (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
+YWdlIFNpZ25pbmcgS2V5IDxidWlsZEBzdXNlLmRlPohiBBMRAgAiAhsDBAsHAwID
+FQIDAxYCAQIeAQIXgAUCSB80OgUJEfKmuQAKCRCoTtronIAKyuJlAJ0cWZifmBO6
+Eh71jattipdMhUYBTwCfSXbJJtuF3c96JPmpmT8be2LDo86IRgQQEQIABgUCOnBe
+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
+1dbriEwEGBECAAwFAkgfNGYFCRHyptQACgkQqE7a6JyACsrv3ACbBLhafFXmTjH3
+JJWFJGWuIOaZUosAniPs4feEyN46gjXGgcZc2Ai8nkm6
+=mY6G
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc b/src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc
new file mode 100644
index 00000000..8467c19b
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc
@@ -0,0 +1,31 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+mQILBERqCJkBEACdqhZWdAbUHLIumXMEgv+GFjr1ZzVHgynnFOzztU/8sxZNa9cm
+YV4HZpVfjMr7fos3ArzyiPPt/336cf7w9p79/ZS4rHSNPDMlPCtXYvFxUbvU0/GY
+q4jwcBsrJ0xaJ9CP5bWyAgVKOb7Y6k0ktaLjRR+tDfMsHA4H0ClMoRr6ATw8NL0e
+VCfAHuzqCKvX1If8ng+wTivtAhKvz/WwQiELNELmPfc5tZHOw8NgP/r0Pze18Hn2
+dlAHu0WpC7uoR00vscsMIJiJJPcsxbL1F1eADKnk+wEy8Go+EJeJ5i0WoFbqD52q
+Lv/C/oY6NVtVY0MBwtn+oQNSnQ4JBsB/Akdt53LAi0ZtNQxMyUW+76R8FCOmVCV8
+WGiF5CPRP0yvG80AMBjBjKjHb/v8ov5MnIyFimzAHS1gQcUNxTEYA/5eFwoYcGcK
+weGq9FUjPTzLQAgvp7XmOzHpSAfJ7qysxFTepNsSZZhgizJyInrdQldr+GYcUNqB
+krD9MWmFop975OxhCTEnNv/HcE79r8WD26HzDFYxTiTJbr0pU/ivBzo+rjq+YG2V
+stJk+udVYmZTnC4LmXus8JiNuqBXbxNscwCBpcJ8YcfCV6uh+7E0XfXZsgVUFLp1
+NF+ylYRGTycOlWoZODrnJevZW7N9O3bWRx/G2P4bJD07LsDLe4i5hymf5QAGKbRQ
+Tm92ZWxsIFByb3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20p
+IDxub3ZlbGwtcHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6JAjMEEwECAB0FAkRqCJkG
+CwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRBHijLooZEiCKSFD/93vZHCAMLEfksU
+KnvXl08bv1rfuamuyJnE3ANRE5RDyypriHMCnkVxazvQ2WI4W4UEjluL9+SzZwtV
+ZvKVoAr31614nSyWwv2YnJTHfjMG+xRlkolZMnuIiB9PcCBo9+GPU0ABuzo4pEJW
+NIRoSS1NFbAZBhtUnY0cN+trM5QObLl7xXTavLyGk//blkk57fov7GXsQJlZUig0
+l2yt5XNyGpLUnTMDumHh8b389quF+0+ZfdwOy7A768xjipAZiTvIujBrEv51wrxh
+0HBT0VGA0MhD9t0B+Ce4BM9P/iVMO00naaOp6PqMfPPKxQQqer8qy1i6UWBx95SY
+mKZBIvOm2d9PezDxkckCu61r6krx1iKnT1wdprCAkIYwALK118SpbxuyGW0bhRHc
+wsc/akzWH72fS0Xu49mvL4k4A2U9asdeQid3dMgbtm5mSWof0yiU/G4YNn0yeXoY
+oG1VbCAqQbFX1Rvd6GITJVqI+ekW/uMA9BP78dF8wBeG0+QmpQnSf+eOsxB/RT8o
+Kb4hHY+29MUlg+i9ceVt7hoKr03J/uIG5TXFXRYLaI0iAFVlKfWxpqDfS2XA4+dD
+VYt+5RDgBcnxDaTB4FE9GqcYScNfe7+NFtL0p0wOPftbmgZzGjucTmrD8mDUNdqA
+xGK7vlk4GATSfOQlq7G6LXW6RYnInohGBBMRAgAGBQJEazMlAAoJEKhO2uicgArK
+2vMAn0TbVDESEVKVuFZStrfIzOvJQrR9AJsH733Ju1kE99GFrdfCeGqpckmNhg==
+=E+qN
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/pubring.gpg b/src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/pubring.gpg
new file mode 100644
index 00000000..5bd5a78e
--- /dev/null
+++ b/src/lib/distro-info/suse-11.2_x86_64/trusted-package-keys/pubring.gpg
Binary files differ
diff --git a/src/lib/distro-info/suse-11.3/export-filter.example b/src/lib/distro-info/suse-11.3/export-filter.example
new file mode 100644
index 00000000..a414fef4
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3/export-filter.example
@@ -0,0 +1,15 @@
+# this file defines the filter rules used when exporting a vendor-OS
+# of this distro
+#
+# copy this file to 'export-filter' and add your own filters to it
+# in order to overrule the filters provided by openslx
+#
+#Examples:
+# the following line would include anything below /var/spool/
+#+ /var/spool/*
+#
+# this would exclude anything in /etc that starts with dhcpd.conf
+#- /etc/dhcpd.conf*
+#
+# and this would exclude all rpmnew-files:
+#- *.rpmnew
diff --git a/src/lib/distro-info/suse-11.3/mirrors/base b/src/lib/distro-info/suse-11.3/mirrors/base
new file mode 100644
index 00000000..679b0910
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3/mirrors/base
@@ -0,0 +1,252 @@
+http://opensuse.mirror.ac.za/opensuse/distribution/11.3/repo/oss
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.3/repo/oss
+http://www.lizardsource.cn/distribution/11.3/repo/oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.3/repo/oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.3/repo/oss
+http://download.opensuse.or.id/distribution/11.3/repo/oss
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.3/repo/oss
+http://mirror.lupaworld.com/opensuse/distribution/11.3/repo/oss
+ftp://www.lizardsource.cn/distribution/11.3/repo/oss
+ftp://opensuse.mirror.ac.za/opensuse/distribution/11.3/repo/oss
+http://repo.ugm.ac.id/opensuse/distribution/11.3/repo/oss
+http://opensuse.cbn.net.id/distribution/11.3/repo/oss
+http://mirror.unej.ac.id/opensuse/distribution/11.3/repo/oss
+http://dl2.foss-id.web.id/opensuse/distribution/11.3/repo/oss
+http://mirror.isoc.org.il/pub/opensuse/distribution/11.3/repo/oss
+ftp://dl2.foss-id.web.id/repo/opensuse/distribution/11.3/repo/oss
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.3/repo/oss
+ftp://opensuse.cbn.net.id/pub/opensuse/distribution/11.3/repo/oss
+http://ftp.kddilabs.jp/Linux/packages/opensuse/distribution/11.3/repo/oss
+ftp://mirror.isoc.org.il/opensuse/distribution/11.3/repo/oss
+ftp://repo.ugm.ac.id/opensuse/distribution/11.3/repo/oss
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.3/repo/oss
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/distribution/11.3/repo/oss
+ftp://ftp.kddilabs.jp/Linux/packages/opensusedistribution/11.3/repo/oss
+http://ftp.novell.co.jp/pub/opensuse/distribution/11.3/repo/oss
+ftp://mirror.unej.ac.id/opensuse/distribution/11.3/repo/oss
+http://ftp.riken.jp/Linux/opensuse/distribution/11.3/repo/oss
+ftp://ftp.riken.jp/Linux/opensuse/distribution/11.3/repo/oss
+http://ftp.daum.net/opensuse/distribution/11.3/repo/oss
+http://77.88.19.68/opensuse/distribution/11.3/repo/oss
+http://77.88.19.73/opensuse/distribution/11.3/repo/oss
+http://mirror.suse.ru/distribution/11.3/repo/oss
+http://77.88.19.74/opensuse/distribution/11.3/repo/oss
+http://93.158.155.193/opensuse/distribution/11.3/repo/oss
+ftp://ftp.daum.net/opensuse/distribution/11.3/repo/oss
+ftp://seeder.yandex.net/opensuse/distribution/11.3/repo/oss
+ftp://ftp.chg.ru/pub/opensuse/distribution/11.3/repo/oss
+ftp://allotter.yandex.net/opensuse/distribution/11.3/repo/oss
+http://mirror.nus.edu.sg/opensuse/distribution/11.3/repo/oss
+ftp://dispenser.yandex.net/opensuse/distribution/11.3/repo/oss
+ftp://ftp.kaist.ac.kr/opensuse/distribution/11.3/repo/oss
+ftp://spreader.yandex.net/opensuse/distribution/11.3/repo/oss
+ftp://ftp.novell.co.jp/pub/opensuse/distribution/11.3/repo/oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.3/repo/oss
+ftp://ftp.metu.edu.tr/opensuse/distribution/11.3/repo/oss
+http://ftp.isu.edu.tw/pub/Linux/opensuse/distribution/11.3/repo/oss
+ftp://mirror.in.th/opensuse/distribution/11.3/repo/oss
+ftp://ftp.isu.edu.tw/pub/Linux/OpenSuSE/distribution/11.3/repo/oss
+http://ftp.chg.ru/pub/opensuse/distribution/11.3/repo/oss
+http://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.3/repo/oss
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.3/repo/oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.3/repo/oss
+http://ftp.twaren.net/Linux/OpenSuSE/distribution/11.3/repo/oss
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.3/repo/oss
+ftp://ftp.twaren.net/Linux/OpenSuSE/distribution/11.3/repo/oss
+http://suse.inode.at/opensuse/distribution/11.3/repo/oss
+http://mirror-fpt-telecom.fpt.net/opensuse/distribution/11.3/repo/oss
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.3/repo/oss
+http://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.3/repo/oss
+http://ftp.tugraz.at/mirror/opensuse/distribution/11.3/repo/oss
+ftp://suse.inode.at/opensuse/distribution/11.3/repo/oss
+ftp://ftp.tugraz.at/mirror/opensuse/distribution/11.3/repo/oss
+http://suse.lagis.at/opensuse/distribution/11.3/repo/oss
+http://mirror.opensuse.com.ba/opensuse/distribution/11.3/repo/oss
+http://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.3/repo/oss
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.3/repo/oss
+ftp://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.3/repo/oss
+http://mirrors.netbg.com/opensuse/distribution/11.3/repo/oss
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.3/repo/oss
+ftp://suse.lagis.at/opensuse/distribution/11.3/repo/oss
+http://mirror.karneval.cz/pub/linux/opensuse/distribution/11.3/repo/oss
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.3/repo/oss
+http://mirror.switch.ch/ftp/mirror/opensuse/distribution/11.3/repo/oss
+http://ftp.linux.cz/pub/linux/opensuse/distribution/11.3/repo/oss
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.3/repo/oss
+http://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.3/repo/oss
+ftp://mirror.karneval.cz/pub/linux/opensuse/distribution/11.3/repo/oss
+ftp://mirrors.netbg.com/opensuse/distribution/11.3/repo/oss
+http://ftp5.gwdg.de/pub/opensuse/distribution/11.3/repo/oss
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.3/repo/oss
+ftp://mirror.switch.ch/mirror/opensuse/distribution/11.3/repo/oss
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/distribution/11.3/repo/oss
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.3/repo/oss
+ftp://ftp5.gwdg.de/pub/opensuse/distribution/11.3/repo/oss
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/distribution/11.3/repo/oss
+http://download.uni-hd.de/ftp/pub/linux/opensuse/distribution/11.3/repo/oss
+ftp://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.3/repo/oss
+http://opensuse.intergenia.de/distribution/11.3/repo/oss
+http://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.3/repo/oss
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.3/repo/oss
+ftp://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.3/repo/oss
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.3/repo/oss
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/distribution/11.3/repo/oss
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/distribution/11.3/repo/oss
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.3/repo/oss
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.3/repo/oss
+http://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.3/repo/oss
+http://ftp3.gwdg.de/pub/opensuse/distribution/11.3/repo/oss
+http://ftp.uni-kassel.de/opensuse/distribution/11.3/repo/oss
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.3/repo/oss
+http://widehat.opensuse.org/distribution/11.3/repo/oss
+http://ftp4.gwdg.de/pub/opensuse/distribution/11.3/repo/oss
+ftp://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.3/repo/oss
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.3/repo/oss
+ftp://ftp4.gwdg.de/pub/opensuse/distribution/11.3/repo/oss
+http://ftp.uni-bayreuth.de/linux/opensuse/distribution/11.3/repo/oss
+http://opensuse-linuxmigratio.at/distribution/11.3/repo/oss
+http://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.3/repo/oss
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.3/repo/oss
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.3/repo/oss
+http://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.3/repo/oss
+http://ftp.klid.dk/ftp/opensuse/distribution/11.3/repo/oss
+ftp://ftp3.gwdg.de/pub/opensuse/distribution/11.3/repo/oss
+http://ftp.uni-siegen.de/opensuse/distribution/11.3/repo/oss
+ftp://ftp.uni-siegen.de/pub/opensuse/distribution/11.3/repo/oss
+http://ftp.estpak.ee/pub/suse/opensuse/distribution/11.3/repo/oss
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/distribution/11.3/repo/oss
+http://ftp.gui.uva.es/sites/opensuse.org/distribution/11.3/repo/oss
+http://ftp.rediris.es/pub/mirror/opensuse/distribution/11.3/repo/oss
+ftp://ftp.uni-bayreuth.de/linux/opensuse/distribution/11.3/repo/oss
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.3/repo/oss
+http://suse.bifi.unizar.es/opensuse/distribution/11.3/repo/oss
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.3/repo/oss
+http://opensuse.mirrors.proxad.net/opensuse/distribution/11.3/repo/oss
+ftp://ftp.klid.dk/opensuse/distribution/11.3/repo/oss
+http://mirror.ovh.net/opensuse/distribution/11.3/repo/oss
+http://fr2.rpmfind.net/linux/opensuse/distribution/11.3/repo/oss
+ftp://ftp.gui.uva.es/sites/opensuse.org/distribution/11.3/repo/oss
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.3/repo/oss
+ftp://fr2.rpmfind.net/linux/opensuse/distribution/11.3/repo/oss
+http://opensuse.cict.fr/distribution/11.3/repo/oss
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/distribution/11.3/repo/oss
+ftp://mirror.cict.fr/opensuse/distribution/11.3/repo/oss
+http://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.3/repo/oss
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.3/repo/oss
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/distribution/11.3/repo/oss
+ftp://ftp.rediris.es/pub/mirror/opensuse/distribution/11.3/repo/oss
+ftp://mirror.ovh.net/opensuse/distribution/11.3/repo/oss
+ftp://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.3/repo/oss
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.3/repo/oss
+http://ftp.ntua.gr/pub/linux/opensuse/distribution/11.3/repo/oss
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.3/repo/oss
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.3/repo/oss
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/distribution/11.3/repo/oss
+http://roxen.integrity.hu/pub/opensuse/distribution/11.3/repo/oss
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.3/repo/oss
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.3/repo/oss
+ftp://ftp.ntua.gr/pub/linux/opensusedistribution/11.3/repo/oss
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.3/repo/oss
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.3/repo/oss
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.3/repo/oss
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.3/repo/oss
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.3/repo/oss
+http://rm.mirror.garr.it/mirrors/opensuse/distribution/11.3/repo/oss
+http://mirror.leaseweb.com/opensuse/distribution/11.3/repo/oss
+ftp://rm.mirror.garr.it/mirrors/opensusedistribution/11.3/repo/oss
+http://mirrors.nl.eu.kernel.org/opensuse/distribution/11.3/repo/oss
+http://repo1.linux.edu.lv/distribution/11.3/repo/oss
+ftp://mirrors.nl.eu.kernel.org/opensuse/distribution/11.3/repo/oss
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/distribution/11.3/repo/oss
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.3/repo/oss
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/distribution/11.3/repo/oss
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.3/repo/oss
+http://opensuse.hro.nl/opensuse/distribution/11.3/repo/oss
+ftp://repo1.linux.edu.lv/distribution/11.3/repo/oss
+ftp://opensuse.hro.nl/opensuse/distribution/11.3/repo/oss
+http://opensuse.uib.no/distribution/11.3/repo/oss
+ftp://mirror.leaseweb.com/opensuse/distribution/11.3/repo/oss
+http://ftp.uninett.no/pub/linux/opensuse/distribution/11.3/repo/oss
+http://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.3/repo/oss
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.3/repo/oss
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/distribution/11.3/repo/oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.3/repo/oss
+ftp://ftp.uninett.no/pub/linux/opensuse/distribution/11.3/repo/oss
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.3/repo/oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.3/repo/oss
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.3/repo/oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.3/repo/oss
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.3/repo/oss
+http://ftp.sileman.pl/pub/opensuse/distribution/11.3/repo/oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.3/repo/oss
+http://cesium.di.uminho.pt/pub/opensuse/distribution/11.3/repo/oss
+ftp://cesium.di.uminho.pt/pub/opensuse/distribution/11.3/repo/oss
+ftp://ftp.sileman.pl/pub/opensuse/distribution/11.3/repo/oss
+http://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.3/repo/oss
+http://ftp.gts.lug.ro/opensuse/distribution/11.3/repo/oss
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.3/repo/oss
+http://ftp.ines.lug.ro/opensuse/distribution/11.3/repo/oss
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.3/repo/oss
+http://mirrors.se.eu.kernel.org/opensuse/distribution/11.3/repo/oss
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.3/repo/oss
+ftp://ftp.ines.lug.ro/opensuse/distribution/11.3/repo/oss
+http://ftp.df.lth.se/pub/opensuse/distribution/11.3/repo/oss
+ftp://ftp.df.lth.se/pub/opensusedistribution/11.3/repo/oss
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.3/repo/oss
+ftp://ftp.gts.lug.ro/opensuse/distribution/11.3/repo/oss
+http://opensuse.ynet.sk/distribution/11.3/repo/oss
+http://less.cogeco.net/ftp/openSUSE/distribution/11.3/repo/oss
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.3/repo/oss
+http://www.muug.mb.ca/pub/opensuse/distribution/11.3/repo/oss
+ftp://mirrors.se.eu.kernel.org/opensuse/distribution/11.3/repo/oss
+http://linux.dell.com/repo/community/distribution/11.3/repo/oss
+ftp://www.muug.mb.ca/pub/opensuse/distribution/11.3/repo/oss
+http://ftp.osuosl.org/pub/opensuse/distribution/11.3/repo/oss
+http://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.3/repo/oss
+ftp://ftp.osuosl.org/pub/opensuse/distribution/11.3/repo/oss
+http://suse.mirrors.tds.net/pub/opensuse/distribution/11.3/repo/oss
+ftp://less.cogeco.net/openSUSE/distribution/11.3/repo/oss
+http://mirrors.med.harvard.edu/opensuse/distribution/11.3/repo/oss
+http://opensuse.cs.utah.edu/distribution/11.3/repo/oss
+http://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.3/repo/oss
+http://mirror.umoss.org/opensuse/distribution/11.3/repo/oss
+http://opensuse.ca.unixheads.org/distribution/11.3/repo/oss
+ftp://opensuse.cs.utah.edu/pub/opensuse/distribution/11.3/repo/oss
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.3/repo/oss
+http://mirrors.xmission.com/opensuse/distribution/11.3/repo/oss
+ftp://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.3/repo/oss
+ftp://suse.mirrors.tds.net/pub/opensuse/distribution/11.3/repo/oss
+http://mirrors2.kernel.org/opensuse/distribution/11.3/repo/oss
+http://mirrors1.kernel.org/opensuse/distribution/11.3/repo/oss
+ftp://mirrors2.kernel.org/opensuse/distribution/11.3/repo/oss
+http://mirror.rackspace.com/openSUSE/distribution/11.3/repo/oss
+http://130.57.19.201/distribution/11.3/repo/oss
+ftp://mirror.rackspace.com/openSUSE/distribution/11.3/repo/oss
+ftp://130.57.19.201/pub/opensuse/distribution/11.3/repo/oss
+http://ftp.utexas.edu/opensuse/distribution/11.3/repo/oss
+http://www.gtlib.gatech.edu/pub/opensuse/distribution/11.3/repo/oss
+ftp://www.gtlib.gatech.edu/pub/opensuse/distribution/11.3/repo/oss
+http://ftp.ussg.iu.edu/linux/opensuse/distribution/11.3/repo/oss
+ftp://ftp.utexas.edu/mirrors/opensuse/distribution/11.3/repo/oss
+ftp://mirrors.xmission.com/opensuse/distribution/11.3/repo/oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.3/repo/oss
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/distribution/11.3/repo/oss
+http://mirror.cps.cmich.edu/opensuse/opensuse/distribution/11.3/repo/oss
+http://mirror.nyi.net/opensuse/distribution/11.3/repo/oss
+ftp://mirrors1.kernel.org/opensuse/distribution/11.3/repo/oss
+http://mirrors.rit.edu/opensuse/distribution/11.3/repo/oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.3/repo/oss
+http://ftp.iinet.net.au/pub/opensuse/distribution/11.3/repo/oss
+ftp://mirror.nyi.net/opensusedistribution/11.3/repo/oss
+http://mirror.internode.on.net/pub/opensuse/distribution/11.3/repo/oss
+http://mirror.pacific.net.au/linux/opensuse/distribution/11.3/repo/oss
+ftp://ftp.iinet.net.au/pub/opensuse/distribution/11.3/repo/oss
+ftp://mirror.pacific.net.au/linux/opensuse/distribution/11.3/repo/oss
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.3/repo/oss
+http://opensuse.patan.com.ar/distribution/11.3/repo/oss
+http://200.221.9.37/pub/opensuse/distribution/11.3/repo/oss
+http://opensuse.c3sl.ufpr.br/distribution/11.3/repo/oss
+http://opensuse.pop.com.br/distribution/11.3/repo/oss
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.3/repo/oss
+ftp://opensuse.c3sl.ufpr.br/opensuse/distribution/11.3/repo/oss
+ftp://mirror.internode.on.net/pub/opensuse/distribution/11.3/repo/oss
diff --git a/src/lib/distro-info/suse-11.3/mirrors/base_non-oss b/src/lib/distro-info/suse-11.3/mirrors/base_non-oss
new file mode 100644
index 00000000..127e4a13
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3/mirrors/base_non-oss
@@ -0,0 +1,250 @@
+http://opensuse.mirror.ac.za/opensuse/distribution/11.3/repo/non-oss
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.3/repo/non-oss
+http://mirror.lupaworld.com/opensuse/distribution/11.3/repo/non-oss
+http://www.lizardsource.cn/distribution/11.3/repo/non-oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.3/repo/non-oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.3/repo/non-oss
+ftp://www.lizardsource.cn/distribution/11.3/repo/non-oss
+ftp://opensuse.mirror.ac.za/opensuse/distribution/11.3/repo/non-oss
+http://mirror.unej.ac.id/opensuse/distribution/11.3/repo/non-oss
+http://opensuse.cbn.net.id/distribution/11.3/repo/non-oss
+http://download.opensuse.or.id/distribution/11.3/repo/non-oss
+http://repo.ugm.ac.id/opensuse/distribution/11.3/repo/non-oss
+ftp://opensuse.cbn.net.id/pub/opensuse/distribution/11.3/repo/non-oss
+http://dl2.foss-id.web.id/opensuse/distribution/11.3/repo/non-oss
+http://mirror.isoc.org.il/pub/opensuse/distribution/11.3/repo/non-oss
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.3/repo/non-oss
+ftp://dl2.foss-id.web.id/repo/opensuse/distribution/11.3/repo/non-oss
+http://ftp.kddilabs.jp/Linux/packages/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.3/repo/non-oss
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/distribution/11.3/repo/non-oss
+ftp://mirror.isoc.org.il/opensuse/distribution/11.3/repo/non-oss
+http://ftp.novell.co.jp/pub/opensuse/distribution/11.3/repo/non-oss
+ftp://repo.ugm.ac.id/opensuse/distribution/11.3/repo/non-oss
+http://ftp.riken.jp/Linux/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.novell.co.jp/pub/opensuse/distribution/11.3/repo/non-oss
+http://ftp.daum.net/opensuse/distribution/11.3/repo/non-oss
+http://77.88.19.68/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.kddilabs.jp/Linux/packages/opensusedistribution/11.3/repo/non-oss
+http://77.88.19.73/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.riken.jp/Linux/opensuse/distribution/11.3/repo/non-oss
+http://mirror.suse.ru/distribution/11.3/repo/non-oss
+http://77.88.19.74/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.chg.ru/pub/opensuse/distribution/11.3/repo/non-oss
+ftp://spreader.yandex.net/opensuse/distribution/11.3/repo/non-oss
+http://mirror.nus.edu.sg/opensuse/distribution/11.3/repo/non-oss
+ftp://dispenser.yandex.net/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.kaist.ac.kr/opensuse/distribution/11.3/repo/non-oss
+ftp://seeder.yandex.net/opensuse/distribution/11.3/repo/non-oss
+ftp://mirror.in.th/opensuse/distribution/11.3/repo/non-oss
+ftp://allotter.yandex.net/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.metu.edu.tr/opensuse/distribution/11.3/repo/non-oss
+http://ftp.isu.edu.tw/pub/Linux/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.isu.edu.tw/pub/Linux/OpenSuSE/distribution/11.3/repo/non-oss
+http://ftp.chg.ru/pub/opensuse/distribution/11.3/repo/non-oss
+http://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.3/repo/non-oss
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.3/repo/non-oss
+http://ftp.twaren.net/Linux/OpenSuSE/distribution/11.3/repo/non-oss
+http://mirror-fpt-telecom.fpt.net/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.twaren.net/Linux/OpenSuSE/distribution/11.3/repo/non-oss
+http://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.3/repo/non-oss
+http://suse.inode.at/opensuse/distribution/11.3/repo/non-oss
+http://ftp.tugraz.at/mirror/opensuse/distribution/11.3/repo/non-oss
+ftp://suse.inode.at/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.tugraz.at/mirror/opensuse/distribution/11.3/repo/non-oss
+http://suse.lagis.at/opensuse/distribution/11.3/repo/non-oss
+ftp://suse.lagis.at/opensuse/distribution/11.3/repo/non-oss
+http://mirror.opensuse.com.ba/opensuse/distribution/11.3/repo/non-oss
+http://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.3/repo/non-oss
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.3/repo/non-oss
+http://mirrors.netbg.com/opensuse/distribution/11.3/repo/non-oss
+http://mirror.switch.ch/ftp/mirror/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.3/repo/non-oss
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.3/repo/non-oss
+http://mirror.karneval.cz/pub/linux/opensuse/distribution/11.3/repo/non-oss
+ftp://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.3/repo/non-oss
+ftp://mirrors.netbg.com/opensuse/distribution/11.3/repo/non-oss
+ftp://mirror.switch.ch/mirror/opensuse/distribution/11.3/repo/non-oss
+http://ftp.linux.cz/pub/linux/opensuse/distribution/11.3/repo/non-oss
+http://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.3/repo/non-oss
+ftp://mirror.karneval.cz/pub/linux/opensuse/distribution/11.3/repo/non-oss
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.3/repo/non-oss
+http://ftp5.gwdg.de/pub/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.3/repo/non-oss
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.3/repo/non-oss
+http://download.uni-hd.de/ftp/pub/linux/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.3/repo/non-oss
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp5.gwdg.de/pub/opensuse/distribution/11.3/repo/non-oss
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/distribution/11.3/repo/non-oss
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/distribution/11.3/repo/non-oss
+http://opensuse.intergenia.de/distribution/11.3/repo/non-oss
+http://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.3/repo/non-oss
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.3/repo/non-oss
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.3/repo/non-oss
+http://widehat.opensuse.org/distribution/11.3/repo/non-oss
+http://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.3/repo/non-oss
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.3/repo/non-oss
+http://ftp4.gwdg.de/pub/opensuse/distribution/11.3/repo/non-oss
+http://ftp3.gwdg.de/pub/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp4.gwdg.de/pub/opensuse/distribution/11.3/repo/non-oss
+http://ftp.uni-kassel.de/opensuse/distribution/11.3/repo/non-oss
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.3/repo/non-oss
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.3/repo/non-oss
+http://ftp.uni-bayreuth.de/linux/opensuse/distribution/11.3/repo/non-oss
+http://opensuse-linuxmigratio.at/distribution/11.3/repo/non-oss
+ftp://ftp3.gwdg.de/pub/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.3/repo/non-oss
+http://ftp.uni-siegen.de/opensuse/distribution/11.3/repo/non-oss
+http://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.3/repo/non-oss
+http://ftp.klid.dk/ftp/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.3/repo/non-oss
+http://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.klid.dk/opensuse/distribution/11.3/repo/non-oss
+http://ftp.estpak.ee/pub/suse/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.3/repo/non-oss
+http://ftp.gui.uva.es/sites/opensuse.org/distribution/11.3/repo/non-oss
+ftp://ftp.uni-siegen.de/pub/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.uni-bayreuth.de/linux/opensuse/distribution/11.3/repo/non-oss
+http://ftp.rediris.es/pub/mirror/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.rediris.es/pub/mirror/opensuse/distribution/11.3/repo/non-oss
+http://suse.bifi.unizar.es/opensuse/distribution/11.3/repo/non-oss
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.gui.uva.es/sites/opensuse.org/distribution/11.3/repo/non-oss
+http://opensuse.mirrors.proxad.net/opensuse/distribution/11.3/repo/non-oss
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/distribution/11.3/repo/non-oss
+http://fr2.rpmfind.net/linux/opensuse/distribution/11.3/repo/non-oss
+ftp://mirror.ovh.net/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.3/repo/non-oss
+http://opensuse.cict.fr/distribution/11.3/repo/non-oss
+http://mirror.ovh.net/opensuse/distribution/11.3/repo/non-oss
+http://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.3/repo/non-oss
+ftp://fr2.rpmfind.net/linux/opensuse/distribution/11.3/repo/non-oss
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.3/repo/non-oss
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/distribution/11.3/repo/non-oss
+ftp://mirror.cict.fr/opensuse/distribution/11.3/repo/non-oss
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.3/repo/non-oss
+http://ftp.ntua.gr/pub/linux/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.ntua.gr/pub/linux/opensusedistribution/11.3/repo/non-oss
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.3/repo/non-oss
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/distribution/11.3/repo/non-oss
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.3/repo/non-oss
+ftp://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.3/repo/non-oss
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.3/repo/non-oss
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.3/repo/non-oss
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.3/repo/non-oss
+http://rm.mirror.garr.it/mirrors/opensuse/distribution/11.3/repo/non-oss
+http://roxen.integrity.hu/pub/opensuse/distribution/11.3/repo/non-oss
+http://repo1.linux.edu.lv/distribution/11.3/repo/non-oss
+http://mirror.leaseweb.com/opensuse/distribution/11.3/repo/non-oss
+ftp://repo1.linux.edu.lv/distribution/11.3/repo/non-oss
+ftp://mirror.leaseweb.com/opensuse/distribution/11.3/repo/non-oss
+ftp://rm.mirror.garr.it/mirrors/opensusedistribution/11.3/repo/non-oss
+http://mirrors.nl.eu.kernel.org/opensuse/distribution/11.3/repo/non-oss
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/distribution/11.3/repo/non-oss
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/distribution/11.3/repo/non-oss
+http://opensuse.hro.nl/opensuse/distribution/11.3/repo/non-oss
+http://opensuse.uib.no/distribution/11.3/repo/non-oss
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/distribution/11.3/repo/non-oss
+http://ftp.uninett.no/pub/linux/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.3/repo/non-oss
+ftp://mirrors.nl.eu.kernel.org/opensuse/distribution/11.3/repo/non-oss
+http://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.3/repo/non-oss
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.uninett.no/pub/linux/opensuse/distribution/11.3/repo/non-oss
+ftp://opensuse.hro.nl/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.3/repo/non-oss
+http://ftp.sileman.pl/pub/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.3/repo/non-oss
+http://cesium.di.uminho.pt/pub/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.3/repo/non-oss
+http://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.3/repo/non-oss
+ftp://cesium.di.uminho.pt/pub/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.gts.lug.ro/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.sileman.pl/pub/opensuse/distribution/11.3/repo/non-oss
+http://ftp.ines.lug.ro/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.3/repo/non-oss
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.3/repo/non-oss
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.3/repo/non-oss
+http://mirrors.se.eu.kernel.org/opensuse/distribution/11.3/repo/non-oss
+ftp://mirrors.se.eu.kernel.org/opensuse/distribution/11.3/repo/non-oss
+http://ftp.gts.lug.ro/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.ines.lug.ro/opensuse/distribution/11.3/repo/non-oss
+http://ftp.df.lth.se/pub/opensuse/distribution/11.3/repo/non-oss
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.3/repo/non-oss
+http://opensuse.ynet.sk/distribution/11.3/repo/non-oss
+http://less.cogeco.net/ftp/openSUSE/distribution/11.3/repo/non-oss
+http://linux.dell.com/repo/community/distribution/11.3/repo/non-oss
+ftp://less.cogeco.net/openSUSE/distribution/11.3/repo/non-oss
+ftp://ftp.df.lth.se/pub/opensusedistribution/11.3/repo/non-oss
+http://ftp.osuosl.org/pub/opensuse/distribution/11.3/repo/non-oss
+http://www.muug.mb.ca/pub/opensuse/distribution/11.3/repo/non-oss
+http://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.osuosl.org/pub/opensuse/distribution/11.3/repo/non-oss
+http://suse.mirrors.tds.net/pub/opensuse/distribution/11.3/repo/non-oss
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.3/repo/non-oss
+http://mirrors.med.harvard.edu/opensuse/distribution/11.3/repo/non-oss
+ftp://suse.mirrors.tds.net/pub/opensuse/distribution/11.3/repo/non-oss
+http://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.3/repo/non-oss
+ftp://www.muug.mb.ca/pub/opensuse/distribution/11.3/repo/non-oss
+http://mirror.umoss.org/opensuse/distribution/11.3/repo/non-oss
+http://opensuse.cs.utah.edu/distribution/11.3/repo/non-oss
+http://opensuse.ca.unixheads.org/distribution/11.3/repo/non-oss
+ftp://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.3/repo/non-oss
+http://mirrors2.kernel.org/opensuse/distribution/11.3/repo/non-oss
+ftp://opensuse.cs.utah.edu/pub/opensuse/distribution/11.3/repo/non-oss
+http://mirrors1.kernel.org/opensuse/distribution/11.3/repo/non-oss
+http://mirrors.xmission.com/opensuse/distribution/11.3/repo/non-oss
+http://mirror.rackspace.com/openSUSE/distribution/11.3/repo/non-oss
+http://130.57.19.201/distribution/11.3/repo/non-oss
+ftp://mirrors.xmission.com/opensuse/distribution/11.3/repo/non-oss
+ftp://130.57.19.201/pub/opensuse/distribution/11.3/repo/non-oss
+http://www.gtlib.gatech.edu/pub/opensuse/distribution/11.3/repo/non-oss
+ftp://mirrors2.kernel.org/opensuse/distribution/11.3/repo/non-oss
+http://ftp.ussg.iu.edu/linux/opensuse/distribution/11.3/repo/non-oss
+ftp://mirror.rackspace.com/openSUSE/distribution/11.3/repo/non-oss
+http://ftp.utexas.edu/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.ussg.iu.edu/linux/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.utexas.edu/mirrors/opensuse/distribution/11.3/repo/non-oss
+ftp://www.gtlib.gatech.edu/pub/opensuse/distribution/11.3/repo/non-oss
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/distribution/11.3/repo/non-oss
+http://mirror.cps.cmich.edu/opensuse/opensuse/distribution/11.3/repo/non-oss
+http://mirror.nyi.net/opensuse/distribution/11.3/repo/non-oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.3/repo/non-oss
+ftp://mirrors1.kernel.org/opensuse/distribution/11.3/repo/non-oss
+http://mirrors.rit.edu/opensuse/distribution/11.3/repo/non-oss
+http://ftp.iinet.net.au/pub/opensuse/distribution/11.3/repo/non-oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.3/repo/non-oss
+ftp://mirror.nyi.net/opensusedistribution/11.3/repo/non-oss
+http://mirror.internode.on.net/pub/opensuse/distribution/11.3/repo/non-oss
+http://mirror.pacific.net.au/linux/opensuse/distribution/11.3/repo/non-oss
+ftp://ftp.iinet.net.au/pub/opensuse/distribution/11.3/repo/non-oss
+ftp://mirror.internode.on.net/pub/opensuse/distribution/11.3/repo/non-oss
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.3/repo/non-oss
+ftp://mirror.pacific.net.au/linux/opensuse/distribution/11.3/repo/non-oss
+http://200.221.9.37/pub/opensuse/distribution/11.3/repo/non-oss
+http://opensuse.c3sl.ufpr.br/distribution/11.3/repo/non-oss
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.3/repo/non-oss
+http://opensuse.patan.com.ar/distribution/11.3/repo/non-oss
+http://opensuse.pop.com.br/distribution/11.3/repo/non-oss
+ftp://opensuse.c3sl.ufpr.br/opensuse/distribution/11.3/repo/non-oss
diff --git a/src/lib/distro-info/suse-11.3/mirrors/base_update b/src/lib/distro-info/suse-11.3/mirrors/base_update
new file mode 100644
index 00000000..6d560d07
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3/mirrors/base_update
@@ -0,0 +1,252 @@
+http://mirror.lupaworld.com/opensuse/update/11.3
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/update/11.3
+http://opensuse.mirror.ac.za/opensuse/update/11.3
+ftp://opensuse.mirror.ac.za/opensuse/update/11.3
+http://www.lizardsource.cn/update/11.3
+http://mirror.alva.ge/pub/opensuse/update/11.3
+http://mirror.alva.ge/pub/opensuse/update/11.3
+http://download.opensuse.or.id/update/11.3
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/update/11.3
+ftp://www.lizardsource.cn/update/11.3
+http://opensuse.cbn.net.id/update/11.3
+http://mirror.unej.ac.id/opensuse/update/11.3
+http://dl2.foss-id.web.id/opensuse/update/11.3
+ftp://mirror.isoc.org.il/opensuse/update/11.3
+http://repo.ugm.ac.id/opensuse/update/11.3
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/update/11.3
+http://mirror.isoc.org.il/pub/opensuse/update/11.3
+http://ftp.kddilabs.jp/Linux/packages/opensuse/update/11.3
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/update/11.3
+ftp://dl2.foss-id.web.id/repo/opensuse/update/11.3
+ftp://mirror.unej.ac.id/opensuse/update/11.3
+ftp://opensuse.cbn.net.id/pub/opensuse/update/11.3
+http://ftp.novell.co.jp/pub/opensuse/update/11.3
+ftp://repo.ugm.ac.id/opensuse/update/11.3
+http://ftp.riken.jp/Linux/opensuse/update/11.3
+ftp://ftp.novell.co.jp/pub/opensuse/update/11.3
+ftp://ftp.kddilabs.jp/Linux/packages/opensuseupdate/11.3
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/update/11.3
+http://77.88.19.68/opensuse/update/11.3
+ftp://ftp.daum.net/opensuse/update/11.3
+http://77.88.19.73/opensuse/update/11.3
+ftp://ftp.riken.jp/Linux/opensuse/update/11.3
+http://mirror.suse.ru/update/11.3
+http://77.88.19.74/opensuse/update/11.3
+http://ftp.daum.net/opensuse/update/11.3
+http://93.158.155.193/opensuse/update/11.3
+ftp://ftp.kaist.ac.kr/opensuse/update/11.3
+ftp://spreader.yandex.net/opensuse/update/11.3
+ftp://ftp.chg.ru/pub/opensuse/update/11.3
+ftp://seeder.yandex.net/opensuse/update/11.3
+http://mirror.nus.edu.sg/opensuse/update/11.3
+ftp://mirror.in.th/opensuse/update/11.3
+ftp://allotter.yandex.net/opensuse/update/11.3
+ftp://ftp.suntel.com.tr/pub/opensuse/update/11.3
+ftp://ftp.metu.edu.tr/opensuse/update/11.3
+ftp://dispenser.yandex.net/opensuse/update/11.3
+ftp://ftp.suntel.com.tr/pub/opensuse/update/11.3
+http://ftp.chg.ru/pub/opensuse/update/11.3
+http://ftp.isu.edu.tw/pub/Linux/opensuse/update/11.3
+http://mirror-fpt-telecom.fpt.net/opensuse/update/11.3
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/update/11.3
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/update/11.3
+http://ftp.ncnu.edu.tw/Linux/opensuse/update/11.3
+http://ftp.twaren.net/Linux/OpenSuSE/update/11.3
+ftp://ftp.isu.edu.tw/pub/Linux/OpenSuSE/update/11.3
+http://suse.inode.at/opensuse/update/11.3
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/update/11.3
+ftp://ftp.twaren.net/Linux/OpenSuSE/update/11.3
+http://ftp.tugraz.at/mirror/opensuse/update/11.3
+ftp://suse.inode.at/opensuse/update/11.3
+http://suse.lagis.at/opensuse/update/11.3
+http://ftp.belnet.be/mirror/ftp.opensuse.org/update/11.3
+ftp://ftp.tugraz.at/mirror/opensuse/update/11.3
+ftp://gd.tuwien.ac.at/opsys/linux/opensuse/update/11.3
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/update/11.3
+ftp://suse.lagis.at/opensuse/update/11.3
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/update/11.3
+http://mirror.opensuse.com.ba/opensuse/update/11.3
+http://mirrors.netbg.com/opensuse/update/11.3
+http://mirror.switch.ch/ftp/mirror/opensuse/update/11.3
+ftp://mirror.switch.ch/mirror/opensuse/update/11.3
+http://mirror.karneval.cz/pub/linux/opensuse/update/11.3
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/update/11.3
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/update/11.3
+http://ftp5.gwdg.de/pub/opensuse/update/11.3
+http://gd.tuwien.ac.at/opsys/linux/opensuse/update/11.3
+http://ftp.linux.cz/pub/linux/opensuse/update/11.3
+http://ftp.halifax.rwth-aachen.de/opensuse/update/11.3
+ftp://mirror.karneval.cz/pub/linux/opensuse/update/11.3
+ftp://mirrors.netbg.com/opensuse/update/11.3
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/update/11.3
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/update/11.3
+ftp://ftp.halifax.rwth-aachen.de/opensuse/update/11.3
+http://download.uni-hd.de/ftp/pub/linux/opensuse/update/11.3
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/update/11.3
+ftp://ftp5.gwdg.de/pub/opensuse/update/11.3
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/update/11.3
+http://opensuse.intergenia.de/update/11.3
+http://ftp.uni-ulm.de/mirrors/opensuse/update/11.3
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/update/11.3
+ftp://ftp.uni-ulm.de/mirrors/opensuse/update/11.3
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/update/11.3
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/update/11.3
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/update/11.3
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/update/11.3
+http://ftp.uni-kl.de/pub/linux/opensuse/update/11.3
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/update/11.3
+http://ftp3.gwdg.de/pub/opensuse/update/11.3
+ftp://ftp.uni-kl.de/pub/linux/opensuse/update/11.3
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/update/11.3
+http://widehat.opensuse.org/update/11.3
+http://ftp4.gwdg.de/pub/opensuse/update/11.3
+ftp://ftp4.gwdg.de/pub/opensuse/update/11.3
+ftp://ftp3.gwdg.de/pub/opensuse/update/11.3
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/update/11.3
+http://ftp.uni-kassel.de/opensuse/update/11.3
+http://ftp.uni-bayreuth.de/linux/opensuse/update/11.3
+http://opensuse-linuxmigratio.at/update/11.3
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/update/11.3
+http://ftp.tu-ilmenau.de/mirror/opensuse/update/11.3
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/update/11.3
+ftp://ftp.uni-siegen.de/pub/opensuse/update/11.3
+http://ftp.uni-paderborn.de/pub/linux/opensuse/update/11.3
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/update/11.3
+ftp://ftp.uni-bayreuth.de/linux/opensuse/update/11.3
+http://ftp.estpak.ee/pub/suse/opensuse/update/11.3
+http://ftp.gui.uva.es/sites/opensuse.org/update/11.3
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/update/11.3
+ftp://ftp.gui.uva.es/sites/opensuse.org/update/11.3
+http://ftp.rediris.es/pub/mirror/opensuse/update/11.3
+ftp://ftp.klid.dk/opensuse/update/11.3
+ftp://ftp.rediris.es/pub/mirror/opensuse/update/11.3
+http://suse.bifi.unizar.es/opensuse/update/11.3
+http://ftp.uni-siegen.de/opensuse/update/11.3
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/update/11.3
+http://ftp.klid.dk/ftp/opensuse/update/11.3
+http://opensuse.mirrors.proxad.net/opensuse/update/11.3
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/update/11.3
+ftp://mirror.ovh.net/opensuse/update/11.3
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/update/11.3
+http://mirror.ovh.net/opensuse/update/11.3
+http://www.mirrorservice.org/sites/download.opensuse.org/update/11.3
+http://fr2.rpmfind.net/linux/opensuse/update/11.3
+ftp://www.mirrorservice.org/sites/download.opensuse.org/update/11.3
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/update/11.3
+ftp://fr2.rpmfind.net/linux/opensuse/update/11.3
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/update/11.3
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/update/11.3
+http://opensuse.cict.fr/update/11.3
+http://ftp.ntua.gr/pub/linux/opensuse/update/11.3
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/update/11.3
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/update/11.3
+ftp://ftp.ntua.gr/pub/linux/opensuseupdate/11.3
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/update/11.3
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/update/11.3
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/update/11.3
+http://roxen.integrity.hu/pub/opensuse/update/11.3
+ftp://mirror.cict.fr/opensuse/update/11.3
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/update/11.3
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/update/11.3
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/update/11.3
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/update/11.3
+http://rm.mirror.garr.it/mirrors/opensuse/update/11.3
+http://repo1.linux.edu.lv/update/11.3
+ftp://repo1.linux.edu.lv/update/11.3
+http://mirror.leaseweb.com/opensuse/update/11.3
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/update/11.3
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/update/11.3
+ftp://mirror.leaseweb.com/opensuse/update/11.3
+ftp://rm.mirror.garr.it/mirrors/opensuseupdate/11.3
+ftp://mirrors.nl.eu.kernel.org/opensuse/update/11.3
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/update/11.3
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/update/11.3
+http://mirrors.nl.eu.kernel.org/opensuse/update/11.3
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/update/11.3
+http://opensuse.hro.nl/opensuse/update/11.3
+http://opensuse.uib.no/update/11.3
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/update/11.3
+http://ftp.uninett.no/pub/linux/opensuse/update/11.3
+http://ftp.icm.edu.pl/pub/Linux/opensuse/update/11.3
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/update/11.3
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/update/11.3
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/update/11.3
+ftp://ftp.uninett.no/pub/linux/opensuse/update/11.3
+ftp://opensuse.hro.nl/opensuse/update/11.3
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/update/11.3
+ftp://ftp.pbone.net/pub/opensuse/update/11.3
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/update/11.3
+http://ftp.sileman.pl/pub/opensuse/update/11.3
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/update/11.3
+ftp://ftp.sileman.pl/pub/opensuse/update/11.3
+ftp://ftp.pbone.net/pub/opensuse/update/11.3
+http://cesium.di.uminho.pt/pub/opensuse/update/11.3
+http://ftp.gts.lug.ro/opensuse/update/11.3
+ftp://cesium.di.uminho.pt/pub/opensuse/update/11.3
+ftp://ftp.gts.lug.ro/opensuse/update/11.3
+http://ftp.nux.ipb.pt/pub/dists/opensuse/update/11.3
+http://ftp.ines.lug.ro/opensuse/update/11.3
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/update/11.3
+ftp://ftp.ines.lug.ro/opensuse/update/11.3
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/update/11.3
+http://mirrors.se.eu.kernel.org/opensuse/update/11.3
+http://ftp.df.lth.se/pub/opensuse/update/11.3
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/update/11.3
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/update/11.3
+http://opensuse.ynet.sk/update/11.3
+ftp://mirrors.se.eu.kernel.org/opensuse/update/11.3
+ftp://ftp.df.lth.se/pub/opensuseupdate/11.3
+ftp://less.cogeco.net/openSUSE/update/11.3
+http://www.muug.mb.ca/pub/opensuse/update/11.3
+http://linux.dell.com/repo/community/update/11.3
+http://ftp.osuosl.org/pub/opensuse/update/11.3
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/update/11.3
+http://less.cogeco.net/ftp/openSUSE/update/11.3
+ftp://www.muug.mb.ca/pub/opensuse/update/11.3
+http://suse.mirrors.tds.net/pub/opensuse/update/11.3
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/update/11.3
+ftp://suse.mirrors.tds.net/pub/opensuse/update/11.3
+http://opensuse.fastsoft.net/pub/linux/opensuse/update/11.3
+http://mirror.anl.gov/pub/opensuse/opensuse/update/11.3
+http://mirror.umoss.org/opensuse/update/11.3
+ftp://mirror.anl.gov/pub/opensuse/opensuse/update/11.3
+http://opensuse.cs.utah.edu/update/11.3
+http://mirrors.med.harvard.edu/opensuse/update/11.3
+ftp://ftp.osuosl.org/pub/opensuse/update/11.3
+http://mirrors.xmission.com/opensuse/update/11.3
+ftp://mirrors.xmission.com/opensuse/update/11.3
+ftp://opensuse.cs.utah.edu/pub/opensuse/update/11.3
+http://mirrors1.kernel.org/opensuse/update/11.3
+http://opensuse.ca.unixheads.org/update/11.3
+http://mirror.rackspace.com/openSUSE/update/11.3
+http://130.57.19.201/update/11.3
+http://mirrors2.kernel.org/opensuse/update/11.3
+ftp://mirrors1.kernel.org/opensuse/update/11.3
+ftp://130.57.19.201/pub/opensuse/update/11.3
+ftp://mirrors2.kernel.org/opensuse/update/11.3
+http://ftp.ussg.iu.edu/linux/opensuse/update/11.3
+ftp://mirror.rackspace.com/openSUSE/update/11.3
+http://ftp.utexas.edu/opensuse/update/11.3
+http://www.gtlib.gatech.edu/pub/opensuse/update/11.3
+ftp://mirror.colorado.edu/pub/opensuse/update/11.3
+ftp://ftp.utexas.edu/mirrors/opensuse/update/11.3
+ftp://www.gtlib.gatech.edu/pub/opensuse/update/11.3
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/update/11.3
+http://mirror.cps.cmich.edu/opensuse/opensuse/update/11.3
+ftp://ftp.ussg.iu.edu/linux/opensuse/update/11.3
+http://mirror.nyi.net/opensuse/update/11.3
+ftp://mirror.colorado.edu/pub/opensuse/update/11.3
+http://mirrors.rit.edu/opensuse/update/11.3
+ftp://mirror.nyi.net/opensuseupdate/11.3
+http://ftp.iinet.net.au/pub/opensuse/update/11.3
+http://mirror.internode.on.net/pub/opensuse/update/11.3
+http://mirror.pacific.net.au/linux/opensuse/update/11.3
+ftp://ftp.iinet.net.au/pub/opensuse/update/11.3
+ftp://mirror.internode.on.net/pub/opensuse/update/11.3
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/update/11.3
+http://opensuse.patan.com.ar/update/11.3
+http://opensuse.c3sl.ufpr.br/update/11.3
+http://200.221.9.37/pub/opensuse/update/11.3
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/update/11.3
+ftp://opensuse.c3sl.ufpr.br/opensuse/update/11.3
+http://opensuse.pop.com.br/update/11.3
diff --git a/src/lib/distro-info/suse-11.3/prereqfiles/etc/group b/src/lib/distro-info/suse-11.3/prereqfiles/etc/group
new file mode 100644
index 00000000..505cb221
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3/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/src/lib/distro-info/suse-11.3/prereqfiles/etc/hosts b/src/lib/distro-info/suse-11.3/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/suse-11.3/prereqfiles/etc/passwd b/src/lib/distro-info/suse-11.3/prereqfiles/etc/passwd
new file mode 100644
index 00000000..9b8fc4fe
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3/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/src/lib/distro-info/suse-11.3/prereqfiles/etc/shadow b/src/lib/distro-info/suse-11.3/prereqfiles/etc/shadow
new file mode 100644
index 00000000..cd100a5a
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3/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/src/lib/distro-info/suse-11.3/settings.default b/src/lib/distro-info/suse-11.3/settings.default
new file mode 100644
index 00000000..7e152670
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3/settings.default
@@ -0,0 +1,1126 @@
+bootstrap-packages = <<END
+ i586/aaa_base-11.2-10007.5.i586.rpm
+ i586/audit-libs-1.7.7-5.1.i586.rpm
+ i586/bash-3.2-141.10.i586.rpm
+ i586/boost-license-1.36.0-9.5.i586.rpm
+ i586/bzip2-1.0.5-34.5.i586.rpm
+ i586/ConsoleKit-0.2.10-60.16.i586.rpm
+ i586/coreutils-6.12-32.10.i586.rpm
+ i586/coreutils-lang-6.12-32.10.i586.rpm
+ i586/cpio-2.9-75.35.i586.rpm
+ i586/cpio-lang-2.9-75.35.i586.rpm
+ i586/cracklib-2.8.12-55.1.i586.rpm
+ i586/cracklib-dict-small-2.8.12-55.1.i586.rpm
+ i586/cron-4.1-194.28.i586.rpm
+ i586/cyrus-sasl-2.1.22-182.1.i586.rpm
+ i586/dbus-1-1.2.4-5.1.i586.rpm
+ i586/dbus-1-glib-0.76-32.1.i586.rpm
+ i586/device-mapper-1.02.27-7.1.i586.rpm
+ i586/diffutils-2.8.7-143.9.i586.rpm
+ i586/dhcpcd-3.2.3-44.1.i586.rpm
+ i586/dirmngr-1.0.2-1.39.i586.rpm
+ i586/e2fsprogs-1.41.1-11.9.i586.rpm
+ i586/elfutils-0.137-3.11.i586.rpm
+ i586/file-4.24-43.1.i586.rpm
+ i586/filesystem-11.2-2.3.i586.rpm
+ i586/fillup-1.42-242.8.i586.rpm
+ i586/findutils-4.4.0-38.27.i586.rpm
+ i586/gawk-3.1.6-1.44.i586.rpm
+ i586/gdbm-1.8.3-371.8.i586.rpm
+ i586/glib2-2.18.2-5.1.i586.rpm
+ i586/glib2-lang-2.18.2-5.1.i586.rpm
+ i586/glib2-branding-upstream-2.18.2-5.1.i586.rpm
+ i586/glibc-2.9-2.8.i586.rpm
+ i586/gpg2-2.0.9-25.105.i586.rpm
+ i586/gpg2-lang-2.0.9-25.105.i586.rpm
+ i586/grep-2.5.2-90.28.i586.rpm
+ i586/gzip-1.3.12-68.36.i586.rpm
+ i586/hal-0.5.12-10.1.i586.rpm
+ i586/info-4.12-1.85.i586.rpm
+ i586/insserv-1.12.0-22.15.i586.rpm
+ i586/irqbalance-0.55-120.8.i586.rpm
+ i586/kernel-default-2.6.27.7-9.1.i586.rpm
+ i586/kernel-default-base-2.6.27.7-9.1.i586.rpm
+ i586/keyutils-1.2-107.4.i586.rpm
+ i586/keyutils-libs-1.2-107.4.i586.rpm
+ i586/krb5-1.6.3-132.1.i586.rpm
+ i586/libacl-2.2.47-27.5.i586.rpm
+ i586/libasm1-0.137-3.11.i586.rpm
+ i586/libasound2-1.0.18-8.7.i586.rpm
+ i586/libattr-2.4.39-67.5.i586.rpm
+ i586/libbz2-1-1.0.5-34.5.i586.rpm
+ i586/libblkid1-1.41.1-11.9.i586.rpm
+ i586/libblocxx6-2.1.0.342-120.1.i586.rpm
+ i586/libboost_signals1_36_0-1.36.0-9.5.i586.rpm
+ i586/libcom_err2-1.41.1-11.9.i586.rpm
+ i586/libcurl4-7.19.0-11.2.i586.rpm
+ i586/libdb-4_5-4.5.20-94.17.i586.rpm
+ i586/libdw1-0.137-3.11.i586.rpm
+ i586/libelf1-0.137-3.11.i586.rpm
+ i586/libext2fs2-1.41.1-11.9.i586.rpm
+ i586/libexpat1-2.0.1-88.10.i586.rpm
+ i586/libgcc43-4.3.3_20081022-9.5.i586.rpm
+ i586/libgcrypt11.2.4.1-4.1.i586.rpm
+ i586/libglib-2_0-0-2.18.2-5.1.i586.rpm
+ i586/libgobject-2_0-0-2.18.2-5.1.i586.rpm
+ i586/libgpg-error0-1.6-6.10.i586.rpm
+ i586/libgthread-2_0-0-2.18.2-5.1.i586.rpm
+ i586/libidn-1.10-2.14.i586.rpm
+ i586/libksba-1.0.4-1.17.i586.rpm
+ i586/libldap-2_4-2-2.4.12-5.3.i586.rpm
+ i586/libncurses5-5.6-89.10.i586.rpm
+ i586/libncurses6-5.6-89.10.i586.rpm
+ i586/libnscd-2.0.2-72.47.i586.rpm
+ i586/libopenssl0_9_8-0.9.8h-28.4.i586.rpm
+ i586/libpt2-2.4.2-2.19.i586.rpm
+ i586/libreadline5-5.2-141.10.i586.rpm
+ i586/libreiserfs-0.3.0.5-107.47.i586.rpm
+ i586/libselinux1-2.0.71-3.38.i586.rpm
+ i586/libsepol1-2.0.32-5.38.i586.rpm
+ i586/libsmbios2-2.0.2-10.9.i586.rpm
+ i586/libstdc++43-4.3.3_20081022-9.5.i586.rpm
+ i586/libusb-0_1-4-0.1.12-136.10.i586.rpm
+ i586/libusb-1_0-0-0.9.3-4.20.i586.rpm
+ i586/libuuid1-1.41.1-11.9.i586.rpm
+ i586/libvolume_id-126-17.25.i586.rpm
+ i586/libvolume_id1-128-9.3.i586.rpm
+ i586/libxcrypt-3.0.1-25.20.i586.rpm
+ i586/libxml2-2.7.1-9.1.i586.rpm
+ i586/libzio-0.9-4.19.i586.rpm
+ i586/limal-1.5.1-1.12.i586.rpm
+ i586/limal-perl-1.5.1-1.12.i586.rpm
+ i586/login-3.37-1.5.i586.rpm
+ i586/logrotate-3.7.7-9.11.i586.rpm
+ i586/m4-1.4.12-1.13.i586.rpm
+ i586/metamail-2.7.19-1244.29.i586.rpm
+ i586/mingetty-1.0.7s-70.41.i586.rpm
+ i586/mkinitrd-2.4-34.1.i586.rpm
+ i586/module-init-tools-3.4-56.5.i586.rpm
+ i586/ncurses-utils-5.6-89.10.i586.rpm
+ i586/net-tools-1.60-725.5.i586.rpm
+ i586/openldap2-client-2.4.12-5.3.i586.rpm
+ i586/openslp-1.2.0-168.6.i586.rpm
+ i586/openssl-0.9.8h-28.4.i586.rpm
+ i586/openSUSE-release-11.2-1.19.i586.rpm
+ i586/openSUSE-release-ftp-11.2-1.19.i586.rpm
+ i586/pam-1.0.2-13.3.i586.rpm
+ i586/pam-config-0.68-1.3.i586.rpm
+ i586/pam-modules-11.2-5.1.i586.rpm
+ i586/parted-1.8.8-91.5.i586.rpm
+ i586/pciutils-3.0.1-1.26.i586.rpm
+ i586/pcre-7.8-1.26.i586.rpm
+ i586/perl-5.10.0-62.10.i586.rpm
+ i586/perl-base-5.10.0-62.10.i586.rpm
+ i586/perl-Bootloader-0.4.81-1.1.i586.rpm
+ i586/perl-gettext-1.05-91.163.i586.rpm
+ i586/permissions-2008.11.25-1.5.i586.rpm
+ i586/pinentry-0.7.5-61.14.i586.rpm
+ i586/pm-utils-0.99.4.20071229-10.3.i586.rpm
+ i586/pmtools-20071116-44.3.i586.rpm
+ i586/PolicyKit-0.9-13.9.i586.rpm
+ i586/popt-1.7-20.1.i586.rpm
+ i586/postfix-2.5.5-6.7.i586.rpm
+ i586/procmail-3.22-238.15.i586.rpm
+ i586/procps-3.2.7-147.11.i586.rpm
+ i586/psmisc-22.6-61.14.i586.rpm
+ i586/pth-2.0.7-102.29.i586.rpm
+ i586/pwdutils-3.2.2-2.8.i586.rpm
+ i586/reiserfs-3.6.19-116.62.i586.rpm
+ i586/rmail-8.14.3-50.9.i586.rpm
+ i586/rpm-4.4.2.3-20.1.i586.rpm
+ i586/satsolver-tools-0.13.0-3.3.i586.rpm
+ i586/SDL-1.2.13-104.1.i586.rpm
+ i586/sed-4.1.5-85.60.i586.rpm
+ i586/setserial-2.17-716.20.i586.rpm
+ i586/sharutils-4.6.3-3.100.i586.rpm
+ i586/sysvinit-2.86-186.7.i586.rpm
+ i586/tcpd-7.6-855.11.i586.rpm
+ i586/tcsh-6.15.00-93.3.i586.rpm
+ i586/terminfo-base-5.6-89.10.i586.rpm
+ i586/udev-128-9.3.i586.rpm
+ i586/util-linux-2.14.1-10.1.i586.rpm
+ i586/util-linux-lang-2.14.1-10.1.i586.rpm
+ i586/uucp-1.07-50.7.i586.rpm
+ i586/uuid-runtime-1.41.1-11.9.i586.rpm
+ i586/zlib-1.2.3-104.137.i586.rpm
+ noarch/netcfg-11.2-1.14.noarch.rpm
+ noarch/pciutils-ids-2008.11.26-2.4.noarch.rpm
+ noarch/suse-build-key-1.0-907.32.noarch.rpm
+END
+<metapackager zypper>
+ packages = <<END
+ i586/libzypp-5.24.5-1.1.i586.rpm
+ i586/zypper-1.0.2-1.5.i586.rpm
+ END
+</metapackager>
+<metapackager smart>
+ packages = <<END
+ i586/python-2.6.0-2.16.i586.rpm
+ i586/python-xml-2.6.0-2.12.i586.rpm
+ i586/rpm-python-4.4.2.3-20.1.i586.rpm
+ END
+</metapackager>
+<metapackager yum>
+ packages = <<END
+ i586/glib2-2.18.2-4.3.i586.rpm
+ i586/libxml2-2.7.1-8.3.i586.rpm
+ i586/libxml2-python-2.7.1-9.1.i586.rpm
+ i586/python-2.6.0-2.16.i586.rpm
+ i586/python-urlgrabber-3.1.0-178.8.i586.rpm
+ i586/python-xml-2.6.0-2.12.i586.rpm
+ i586/rpm-python-4.4.2.3-20.1.i586.rpm
+ i586/sqlite3-3.6.4-1.8.i586.rpm
+ i586/yum-metadata-parser-1.1.2-107.22.i586.rpm
+ END
+</metapackager>
+package-subdir = suse
+prereq-packages = <<END
+ i586/bzip2-1.0.5-34.5.i586.rpm
+ i586/glibc-2.9-2.8.i586.rpm
+ i586/libselinux1-2.0.71-3.38.i586.rpm
+ i586/libbz2-1-1.0.5-34.5.i586.rpm
+ i586/popt-1.7-20.1.i586.rpm
+ i586/rpm-4.4.2.3-20.1.i586.rpm
+ i586/zlib-1.2.3-104.137.i586.rpm
+END
+<repository base>
+ name = openSUSE 11.2
+ repo-subdir = suse
+ file-for-speedtest = suse/setup/descr/packages.en.gz
+</repository>
+<repository base_non-oss>
+ name = openSUSE 11.2 non-OSS
+ file-for-speedtest = suse/setup/descr/packages.en.gz
+</repository>
+<repository base_update>
+ name = openSUSE 11.2 updates
+ file-for-speedtest = repodata/primary.xml.gz
+</repository>
+<selection minimal>
+ packages = <<END
+ glibc-locale
+ END
+</selection>
+<selection textmode>
+ base = minimal
+ packages = <<END
+ acl
+ acpid
+ apparmor-docs
+ apparmor-parser
+ apparmor-profiles
+ apparmor-utils
+ ash
+ at
+ atk
+ attr
+ audit
+ autofs bc
+ bind-libs
+ bind-utils
+ binutils
+ blktrace
+ bundle-lang-common-en
+ cdrkit-cdrtools-compat
+ compat compat-openssl097g
+ cpufrequtils
+ cyrus-sasl-saslauthd
+ db-utils
+ deltarpm
+ dmraid
+ dos2unix
+ dosfstools
+ ed
+ eject
+ ethtool
+ fbset
+ fontconfig
+ freetype2
+ gdb
+ genisoimage
+ glibc-i18ndata
+ gnutls
+ gpm
+ groff
+ hfsutils
+ icedax
+ ifplugd
+ initviocons
+ inst-source-utils
+ iproute2
+ iputils
+ joe
+ kbd
+ klogd
+ kpartx
+ ksh
+ ksymoops
+ lcms
+ less
+ libaio
+ libapparmor1
+ libart_lgpl
+ libatk-1_0-0
+ libcap1
+ libcap2
+ libdrm
+ libevent-1_4-2
+ libgimpprint
+ libgmodule-2_0-0
+ libgnutls26
+ libgssglue1
+ libicu
+ libjpeg
+ liblazy1
+ liblcms1
+ libltdl3
+ libltdl7
+ liblzo2-2
+ libmng
+ libnet
+ libopencdk10
+ libopenct1
+ libopensc2
+ libpcap0
+ libpng12-0
+ libpython2_6-1_0
+ librpcsecgss
+ libsensors3
+ libsensors4
+ libsnmp15
+ libsqlite3-0
+ libtiff3
+ libtirpc1
+ licenses
+ lukemftp
+ lvm2
+ mailx
+ man
+ man-pages
+ microcode_ctl
+ multipath-tools
+ nbd
+ net-snmp
+ nfs-client
+ nfs-kernel-server
+ nfsidmap
+ nscd
+ ntfsprogs
+ ntp
+ openct
+ opensc
+ openssh
+ patch
+ pax
+ pcsc-lite
+ perl-Crypt-SmbHash
+ perl-DBD-SQLite
+ perl-DBI
+ perl-Digest-MD4
+ perl-File-Tail
+ perl-HTML-Parser
+ perl-HTML-Tagset
+ perl-Net-Daemon
+ perl-PlRPC
+ perl-RPC-XML
+ perl-SNMP
+ perl-TermReadKey
+ perl-TimeDate
+ perl-URI
+ perl-XML-Parser
+ perl-XML-Writer
+ perl-libapparmor
+ perl-libwww-perl
+ ppp
+ preload
+ procinfo
+ providers
+ qlogic-firmware
+ recode
+ rpcbind
+ rsync
+ sash
+ screen
+ sensors
+ sg3_utils
+ smartmontools
+ smpppd
+ snmp-mibs
+ sqlite3
+ strace
+ sudo
+ sysconfig
+ sysfsutils
+ syslog-ng
+ tcpdump
+ telnet
+ terminfo
+ timezone
+ ulimit
+ usbutils
+ utempter
+ vim
+ vim-base
+ vim-data
+ wdiff
+ wget
+ wireless-tools
+ wodim
+ wvstreams
+ xfsprogs
+ xinetd
+ yp-tools
+ ypbind
+ zip
+ zisofs-tools
+ zsh
+ END
+</selection>
+<selection kde>
+ base = textmode
+ packages = <<END
+ 3ddiag
+ a2ps
+ aalib
+ alsa
+ alsa-utils
+ amarok
+ amarok-libvisual
+ amarok-xine
+ arts
+ aspell
+ aspell-de
+ aspell-en
+ audiofile
+ autoyast2
+ autoyast2-installation
+ bluez
+ bootsplash
+ bootsplash-branding-openSUSE
+ branding-openSUSE
+ bundle-lang-gnome-en
+ bundle-lang-kde-en
+ cabextract
+ cairo
+ cdparanoia
+ cdrdao
+ check
+ checkmedia
+ chmlib
+ chromium
+ clucene-core
+ compiz
+ compiz-branding-openSUSE
+ compiz-kde4
+ cpp
+ cpp41
+ cpp43
+ cryptsetup
+ Crystalcursors
+ cups
+ cups-client
+ cups-drivers
+ cups-libs
+ curl
+ cyrus-sasl-crammd5
+ cyrus-sasl-digestmd5
+ cyrus-sasl-plain
+ dbus-1-mono
+ dbus-1-python
+ dbus-1-qt3
+ dbus-1-x11
+ dcraw
+ dejavu
+ desktop-data-openSUSE
+ desktop-data-openSUSE-extra-gnome
+ desktop-file-utils
+ dhcp
+ dhcp-client
+ dialog
+ digikam
+ digikamimageplugins
+ DirectFB
+ dnsmasq
+ dvd+rw-tools
+ eel
+ efont-unicode
+ enchant
+ enscript
+ evolution-data-server
+ exiftool
+ expat
+ fam
+ fftw3
+ fileshareset
+ FirmwareUpdateKit
+ flac
+ fonts-config
+ foomatic-filters
+ freealut
+ freeglut
+ freetype
+ fribidi
+ frozen-bubble
+ frozen-bubble-server
+ ft2demos
+ fvwm2
+ gcc-gij
+ gcc41-gij
+ gcc43-gij
+ gconf2
+ gconf2-branding-openSUSE
+ gettext-runtime
+ gfxboot
+ gfxboot-branding-openSUSE
+ ggz
+ ggz-client-libs
+ ghostscript-fonts-other
+ ghostscript-fonts-std
+ ghostscript-library
+ ghostscript-omni
+ ghostscript-x11
+ giflib
+ gimp
+ gimp-branding-openSUSE
+ gimp-help
+ gimp-plugins-python
+ gle
+ glib
+ glib-sharp2
+ glibc-locale
+ glitz
+ gltt
+ gmime
+ gmp
+ gnokii
+ gpart
+ gpgme
+ GraphicsMagick
+ grub
+ gsf-sharp
+ gstreamer-0_10
+ gstreamer-0_10-plugins-base
+ gtk
+ gtk-sharp2
+ gtk2
+ gtk2-branding-openSUSE
+ gtk2-engines
+ gtk2-theme-openSUSE
+ gtksourceview
+ gutenprint
+ gvfs
+ gwenview
+ gwenview-lang
+ hal-palm
+ hdparm
+ hicolor-icon-theme
+ hplip
+ hplip-hpijs
+ htdig
+ hunspell
+ hwinfo
+ icewm
+ icewm-default
+ id3lib
+ ifnteuro
+ IlmBase
+ ImageMagick
+ imlib
+ imlib2
+ imlib2-loaders
+ info2html
+ intlfnts
+ iptables
+ ispell
+ ispell-american
+ ispell-german
+ ispell-ngerman
+ jack
+ jfsutils
+ jpackage-utils
+ jpeg
+ k3b
+ kaffeine
+ kde-susetranslations
+ kde3-i18n-de
+ kde4-ark
+ kde4-filesystem
+ kde4-kdm
+ kde4-kdm-branding-openSUSE
+ kde4-kget
+ kde4-kgreeter-plugins
+ kde4-kmix
+ kde4-knewsticker
+ kde4-konqueror
+ kde4-konqueror-plugins
+ kde4-kopete
+ kde4-kpat
+ kde4-krdc
+ kde4-kscd
+ kde4-ksudoku
+ kde4-kwin
+ kde4-okular
+ kde4-plasma-addons
+ kdeaddons3-kicker
+ kdeartwork3-kscreensaver
+ kdeartwork3-xscreensaver
+ kdebase3
+ kdebase3-nsplugin
+ kdebase3-runtime
+ kdebase3-samba
+ kdebase3-session
+ kdebase3-SuSE
+ kdebase3-SuSE-branding-openSUSE
+ kdebase3-SuSE-lang
+ kdebase4-openSUSE
+ kdebase4-runtime
+ kdebase4-workspace
+ kdebase4-workspace-branding-openSUSE
+ kdebase4-workspace-ksysguardd
+ kdebluetooth
+ kdebluetooth-lang
+ kdegames4-carddecks-default
+ kdegraphics3
+ kdegraphics3-kamera
+ kdegraphics3-scan
+ kdelibs3
+ kdelibs3-default-style
+ kdelibs3-doc
+ kdelibs4
+ kdelibs4-core
+ kdemultimedia3
+ kdepim3
+ kdepim3-kpilot
+ kdepim3-notes
+ kdepimlibs4
+ kdetv
+ kdetv-lang
+ kio_ipodslave
+ kio_iso
+ kio_slp
+ kio_sysinfo
+ kipi-plugins
+ kitchensync
+ knights
+ koffice
+ koffice-i18n-de
+ koffice-i18n-de-doc
+ koffice-illustration
+ konversation
+ kpowersave
+ kpowersave-lang
+ krecord
+ krename
+ krusader
+ ktorrent
+ kwin-decor-suse2
+ lbreakout
+ libakode
+ libakonadi4
+ libakonadiprotocolinternals1
+ libao
+ libarchive2
+ libavahi-client3
+ libavahi-common3
+ libavahi-glib1
+ libbabl-0_0-0
+ libbeagle1
+ libbluetooth3
+ libbonobo
+ libbonoboui
+ libcanberra-gtk
+ libcanberra-gtk0
+ libcanberra0
+ libcroco
+ libcroco-0_6-3
+ libcryptsetup0
+ libdbus-1-qt3-0
+ libdjvulibre21
+ libdns_sd
+ libdvdread4
+ libeel-2-2
+ libenchant1
+ libesd0
+ libevoldap-2_4-2
+ libexempi3
+ libexif
+ libexiv2-4
+ libFLAC++6
+ libFLAC8
+ libflashsupport
+ libfuse2
+ libgcj41
+ libgcj43
+ libgegl-0_0-0
+ libggz2
+ libgio-2_0-0
+ libgio-fam
+ libglade2
+ libgmime-2_0-3
+ libgnome
+ libgnome-desktop-2-7
+ libgnome-menu2
+ libgnomecanvas
+ libgnomecups
+ libgnomekbd
+ libgnomeprint
+ libgnomeprintui
+ libgnomesu
+ libgnomesu0
+ libgnomeui
+ libgomp43
+ libgpgme11
+ libgphoto2
+ libgpod-tools
+ libgpod3
+ libGraphicsMagick2
+ libgsf
+ libgsf-1-114
+ libgsf-gnome
+ libgssglue-devel
+ libgstinterfaces-0_10-0
+ libgstreamer-0_10-0
+ libgtkhtml
+ libgtkimageview0
+ libgtksourceview-2_0-0
+ libgtop
+ libgtop-2_0-7
+ libgvfscommon0
+ libgweather
+ libgweather1
+ libical0
+ libidl
+ libieee1284
+ libjack0
+ libjasper
+ libkcal
+ libkcal2
+ libkcddb4
+ libkcompactdisc4
+ libkdcraw3
+ libkde4
+ libkdecore4
+ libkdegames4
+ libkdepimlibs4
+ libkexiv2-3
+ libkipi0
+ libkmime2
+ libkonq5
+ libktnef1
+ libldapcpp1
+ liblpsolve55
+ liblua5_1
+ libMagick++1
+ libMagickCore1
+ libMagickWand1
+ libmal
+ libmikmod
+ libmpcdec5
+ libmpfr1
+ libmtp8
+ libmusicbrainz4
+ libneon27
+ libnetpbm10
+ libnjb
+ libnjb5
+ libnl
+ libnsssharedhelper0
+ libofa0
+ libogg0
+ liboil
+ libopensync
+ libopensync-plugin-file
+ libopensync-plugin-gnokii
+ libopensync-plugin-gpe
+ libopensync-plugin-irmc
+ libopensync-plugin-kdepim
+ libopensync-plugin-opie
+ libopensync-plugin-palm
+ libopensync-plugin-sunbird
+ libopensync-plugin-syncml
+ libopensync-tools
+ libotr2
+ libphonon4
+ libpisock9
+ libpoppler-glib4
+ libpoppler-qt2
+ libpoppler-qt4-3
+ libpoppler4
+ libpulse0
+ libpulsecore4
+ libqca2
+ libqimageblitz4
+ libqscintilla2-4
+ libqt4
+ libqt4-qt3support
+ libqt4-sql
+ libqt4-sql-unixODBC
+ libqt4-x11
+ libqtpod0
+ libQtWebKit4
+ libraptor1
+ librasqal1
+ libredland0
+ librsvg
+ libsamplerate
+ libsmbclient0
+ libsndfile
+ libsoprano4
+ libsoup
+ libsoup-2_4-1
+ libspectre1
+ libspeex
+ libstrigi0
+ libstroke
+ libsyncml0
+ libtalloc1
+ libtasn1
+ libtasn1-3
+ libtdb1
+ libtheora0
+ libtunepimp
+ libtunepimp5
+ libvisual
+ libvisual-plugins
+ libVNCServer
+ libvorbis
+ libwbclient0
+ libwbxml2-0
+ libwebkit-1_0-1
+ libwmf
+ libwnck
+ libwnck-1-22
+ libwpd-0_8-8
+ libwpg-0_1-1
+ libwps-0_1-1
+ libx86
+ libxine1
+ libxine1-gnome-vfs
+ libxine1-pulse
+ libxklavier
+ libxklavier12
+ libxml2-python
+ libxslt
+ libzip1
+ libzvbi0
+ limal-ca-mgm
+ limal-ca-mgm-perl
+ limal-nfs-server
+ limal-nfs-server-perl
+ lsb
+ lsof
+ make
+ manufacturer-PPDs
+ master-boot-code
+ mdadm
+ mesa
+ metacity
+ misc-console-font
+ modemManager
+ mono-core
+ mono-data
+ mono-data-sqlite
+ mono-web
+ mono-winforms
+ mozilla-nspr
+ mozilla-nss
+ mozilla-xulrunner181
+ mozilla-xulrunner190
+ mozilla-xulrunner190-gnomevfs
+ mozilla-xulrunner190-translations
+ mozillaFirefox
+ mozillaFirefox-branding-openSUSE
+ mozillaFirefox-translations
+ mtools
+ myspell-american
+ myspell-german
+ nautilus
+ neon
+ netcat
+ netpbm
+ networkManager
+ networkManager-glib
+ networkManager-kde
+ numlockx
+ obexftp
+ ocrad
+ openal
+ OpenEXR
+ openobex
+ OpenOffice_org
+ OpenOffice_org-base
+ OpenOffice_org-branding-openSUSE
+ OpenOffice_org-calc
+ OpenOffice_org-components
+ OpenOffice_org-draw
+ OpenOffice_org-filters
+ OpenOffice_org-filters-optional
+ OpenOffice_org-help-de
+ OpenOffice_org-help-en-US
+ OpenOffice_org-icon-themes
+ OpenOffice_org-impress
+ OpenOffice_org-kde
+ OpenOffice_org-l10n-de
+ OpenOffice_org-l10n-extras
+ OpenOffice_org-libs-core
+ OpenOffice_org-libs-extern
+ OpenOffice_org-libs-gui
+ OpenOffice_org-mailmerge
+ OpenOffice_org-math
+ OpenOffice_org-pyuno
+ OpenOffice_org-Quickstarter
+ OpenOffice_org-templates-en
+ OpenOffice_org-templates-labels-a4
+ OpenOffice_org-templates-labels-letter
+ OpenOffice_org-templates-presentation-layouts
+ OpenOffice_org-thesaurus-en
+ OpenOffice_org-ure
+ OpenOffice_org-writer
+ openssh-askpass
+ opensuse-codecs-installer
+ opensuse-manual_de
+ opensuse-manual_en
+ opensuse-manual_en-pdf
+ opt_gnome-compat
+ orbit2
+ oxygen-icon-theme
+ pango
+ perl-Config-Crontab
+ perl-Crypt-SSLeay
+ perl-Digest-HMAC
+ perl-Digest-SHA1
+ perl-IO-Socket-SSL
+ perl-Net-DNS
+ perl-Net-IP
+ perl-Net-SSLeay
+ perl-NetxAP
+ perl-Parse-RecDescent
+ perl-spamassassin
+ perl-X500-DN
+ perl-XML-LibXML
+ perl-XML-LibXML-Common
+ perl-XML-NamespaceSupport
+ perl-XML-SAX
+ perl-XML-Simple
+ phalanx
+ phonon
+ phonon-backend-gstreamer-0_10
+ pilot-link
+ pinentry-qt
+ pkg-config
+ plasma-theme-aya
+ pm-profiler
+ PolicyKit-gnome-libs
+ powerdevil
+ pptp
+ pulseaudio
+ pulseaudio-esound-compat
+ python
+ python-base
+ python-cairo
+ python-gobject2
+ python-gtk
+ python-numeric
+ python-qt
+ python-qt4
+ python-ReportLab
+ python-sip
+ python-xml
+ pyxml
+ qca
+ qt3
+ qtcurve-gtk2
+ rdesktop
+ release-notes-openSUSE
+ rrdtool
+ ruby
+ sane-backends
+ sane-backends-autoconfig
+ sane-frontends
+ sax2
+ sax2-gui
+ sax2-ident
+ sax2-libsax
+ sax2-libsax-perl
+ sax2-tools
+ scpm
+ SDL_image
+ SDL_mixer
+ SDL_net
+ SDL_Pango
+ SDL_perl
+ SDL_ttf
+ sgml-skel
+ shared-mime-info
+ soprano
+ sound-theme-freedesktop
+ spamassassin
+ speex
+ splashy
+ splashy-branding-openSUSE
+ sqlite2
+ startup-notification
+ strigi
+ SuSEfirewall2
+ susehelp
+ susehelp_de
+ susehelp_en
+ suseRegister
+ syslinux
+ taglib
+ tango-icon-theme
+ tar
+ tcl
+ tightvnc
+ tk
+ ufraw
+ ufraw-gimp
+ unclutter
+ unixODBC
+ unzip
+ usb_modeswitch
+ v4l-conf
+ w3m
+ wbxml2
+ words
+ wpa_supplicant
+ wv
+ wvdial
+ x11-input-synaptics
+ x11-input-wacom
+ x11-tools
+ xalan-j2
+ xaw3d
+ xdg-menu
+ xdg-utils
+ xdmbgrd
+ xerces-j2
+ xerces-j2-xml-apis
+ xkeyboard-config
+ xli
+ xlockmore
+ xorg-x11
+ xorg-x11-driver-input
+ xorg-x11-driver-video
+ xorg-x11-driver-video-radeonhd
+ xorg-x11-driver-video-unichrome
+ xorg-x11-fonts
+ xorg-x11-fonts-core
+ xorg-x11-libfontenc
+ xorg-x11-libICE
+ xorg-x11-libs
+ xorg-x11-libSM
+ xorg-x11-libX11
+ xorg-x11-libX11-ccache
+ xorg-x11-libXau
+ xorg-x11-libxcb
+ xorg-x11-libXdmcp
+ xorg-x11-libXext
+ xorg-x11-libXfixes
+ xorg-x11-libxkbfile
+ xorg-x11-libXmu
+ xorg-x11-libXp
+ xorg-x11-libXpm
+ xorg-x11-libXprintUtil
+ xorg-x11-libXrender
+ xorg-x11-libXt
+ xorg-x11-libXv
+ xorg-x11-server
+ xorg-x11-xauth
+ xorg-x11-Xvnc
+ xpdf-tools
+ xscreensaver
+ xterm
+ xtermset
+ yakuake
+ yast2
+ yast2-apparmor
+ yast2-backup
+ yast2-bootloader
+ yast2-branding-openSUSE
+ yast2-control-center
+ yast2-control-center-gnome
+ yast2-control-center-qt
+ yast2-core
+ yast2-country
+ yast2-country-data
+ yast2-firewall
+ yast2-gtk
+ yast2-hardware-detection
+ yast2-inetd
+ yast2-installation
+ yast2-irda
+ yast2-iscsi-client
+ yast2-kerberos-client
+ yast2-ldap
+ yast2-ldap-client
+ yast2-libyui
+ yast2-mail
+ yast2-mouse
+ yast2-ncurses
+ yast2-network
+ yast2-nfs-client
+ yast2-nfs-common
+ yast2-nis-client
+ yast2-ntp-client
+ yast2-online-update
+ yast2-online-update-frontend
+ yast2-packager
+ yast2-pam
+ yast2-perl-bindings
+ yast2-pkg-bindings
+ yast2-power-management
+ yast2-printer
+ yast2-profile-manager
+ yast2-qt
+ yast2-registration
+ yast2-registration-branding-openSUSE
+ yast2-repair
+ yast2-restore
+ yast2-runlevel
+ yast2-samba-client
+ yast2-samba-server
+ yast2-scanner
+ yast2-schema
+ yast2-security
+ yast2-slp
+ yast2-sound
+ yast2-storage
+ yast2-storage-lib
+ yast2-sudo
+ yast2-support
+ yast2-sysconfig
+ yast2-theme-openSUSE
+ yast2-trans-de
+ yast2-trans-stats
+ yast2-transfer
+ yast2-tune
+ yast2-tv
+ yast2-update
+ yast2-users
+ yast2-x11
+ yast2-xml
+ yast2-ycp-ui-bindings
+ zvbi
+ END
+</selection>
+<selection kde-additional>
+ base = kde
+ packages = <<END
+ cm_gtk
+ flash-player
+ java-1_5_0-gcj-compat
+ java-1_5_0-sun
+ java-1_5_0-sun-plugin
+ suspend
+ END
+</selection>
+<selection gnome>
+ base = textmode
+ packages = <<END
+ END
+</selection>
+<selection default>
+ base = minimal
+</selection>
+
diff --git a/src/lib/distro-info/suse-11.3/settings.example b/src/lib/distro-info/suse-11.3/settings.example
new file mode 100644
index 00000000..a8db67df
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3/settings.example
@@ -0,0 +1,23 @@
+# rename this file to 'settings' and edit it as you please
+#
+# for a list of all options, have a look at the corresponding
+# settings.default in /opt/openslx/share/distro-info
+
+# use local installation source
+#<repository base>
+# local-url = /srv/ftp/pub/opensuse/distribution/11.2/repo/oss
+#</repository>
+#<repository base_non-oss>
+# local-url = /srv/ftp/pub/opensuse/distribution/11.2/repo/non-oss
+#</repository>
+#<repository base_update>
+# local-url = /srv/ftp/pub/suse/update/11.2
+#</repository>
+
+# add a new selection:
+#<selection my_kde>
+# base = kde
+# packages = <<END
+# kinternet
+# END
+#</selection>
diff --git a/src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc b/src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc
new file mode 100644
index 00000000..fcc4856d
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc
@@ -0,0 +1,17 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.15 (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/src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-307e3d54-4be01a65.asc b/src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-307e3d54-4be01a65.asc
new file mode 100644
index 00000000..95350435
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-307e3d54-4be01a65.asc
@@ -0,0 +1,13 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.15 (GNU/Linux)
+
+mIsERCAdXQEEAL7MrBTz+3SBWpCm2ae2yaDqV3ezQcs2JlvqidJVhsZqQe9/jkxi
+KTEQW5+TXF/+BlQSiebunRI7oo3+9U8GyRCgs1sf+yRQWMLzZqRaarzRhw9w+Ihl
+edtqYl6/U2JZCb8Adp6d7RzlRliJdJ/VtsfXj2ef7Dwu7elOVSsmaBdtAAYptChT
+dVNFIFBhY2thZ2UgU2lnbmluZyBLZXkgPGJ1aWxkQHN1c2UuZGU+iLgEEwECACIC
+GwMECwcDAgMVAgMDFgIBAh4BAheABQJL4BplBQkPRMsIAAoJEOOlw2Awfj1UhOsD
+/RkkEhOIC9NNad0F5O0rEJxvsI7Nm+6FnNJq8LjyR5+87epQCXgpaBXEGd4RcjjO
+TukLaHHrC1T/h4biIyf253VZHr4oJ46sUivNUFq60gl4gk56aTGTNeUWOsgrU4jm
+auFca3dbGcNfiJ7c7dF2CkOAR+CPMLPYTvuVIRQBAjeS
+=jKkp
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc b/src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc
new file mode 100644
index 00000000..0c4115ac
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc
@@ -0,0 +1,30 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.15 (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/src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-3dbdc284-4be1884d.asc b/src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-3dbdc284-4be1884d.asc
new file mode 100644
index 00000000..2433332e
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-3dbdc284-4be1884d.asc
@@ -0,0 +1,19 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.15 (GNU/Linux)
+
+mQENBEkUTD8BCADWLy5d5IpJedHQQSXkC1VK/oAZlJEeBVpSZjMCn8LiHaI9Wq3G
+3Vp6wvsP1b3kssJGzVFNctdXt5tjvOLxvrEfRJuGfqHTKILByqLzkeyWawbFNfSQ
+93/8OunfSTXC1Sx3hgsNXQuOrNVKrDAQUqT620/jj94xNIg09bLSxsjN6EeTvyiO
+mtE9H1J03o9tY6meNL/gcQhxBvwuo205np0JojYBP0pOfN8l9hnIOLkA0yu4ZXig
+oKOVmf4iTjX4NImIWldT+UaWTO18NWcCrujtgHueytwYLBNV5N0oJIP2VYuLZfSD
+VYuPllv7c6O2UEOXJsdbQaVuzU1HLocDyipnABEBAAG0NG9wZW5TVVNFIFByb2pl
+Y3QgU2lnbmluZyBLZXkgPG9wZW5zdXNlQG9wZW5zdXNlLm9yZz6JATwEEwECACYC
+GwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAUCS+GITQUJClIKDgAKCRC4iy/UPb3C
+hCtvCACELgrgzAbLw8p4PfsHzrEAvZbaWSLpSOCV4ZQdo0Q9vaHcsjENXfnZ7ctu
+hDnyVSmzy4HcVfBfLmK1xkI8ByXK9JGXt3RXuZWHBuaJQKM0hbAZZ/ScMUOs6Igu
+2gmyDaJyrf1vBPtNWpMSS8Jp10iJ9/5B5Hlq4UJxMwTGZwcddhRl/UQKErygdnVg
+o5zTdyB05BKF4KEIvdbl9xSfifLfOT8CGBpCmnUmD6YB7agXm3OAM9bZGa2v9ipm
+s/haLqxS+b4plYKDN8d8xc2whEfTQD158VW0giv38w6NAd6kCxq2pg5L5PmpF9DM
+BZl8K2SBMEtV7BYK9wfnxaRl6Wh/
+=uF5Q
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-56b4177a-4be18cab.asc b/src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-56b4177a-4be18cab.asc
new file mode 100644
index 00000000..9cbdae75
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-56b4177a-4be18cab.asc
@@ -0,0 +1,19 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.15 (GNU/Linux)
+
+mQGiBEeWWzMRBADU8l2IckSzgdUS1dn0WMM7wXK4seoFsHHQw/0unHCQCxpyDMnn
+TKV86p5KTbR1FDdeaZlY0yCV+IGsiIxLyuUdJn8vuA5gA5ZkUr89/HtWaeZVl77J
+HIQxvhDRBWCOO4QNtrZYWvGbvl83wl/zOfdLEs8IGElt0LgfohyTA1qfrwCg/Hac
+tDDscXsPlo5Jek/+3RHVeD0D/30riCpfpLJOmhraLg1EbWsE0mN9IQsl+WDPdoYo
+bB76z6eH3e38618WzP/LTG4WuVbwpSSqmXyfdVpXxWzESfT8q0B8CGpHf/Sa/T/L
+emohmRnLvkf/tAfxFmDMm1jOewJIE9S35jANGHVJcxmfRNpPWC7uHnqjopnsmDkL
+kMEdBAC6YcpDOcMJZ9sJbt/JNZBaoT5CltgMDlSN50t2v/J5em8qMLqCSNF5UJyd
+LFnePHTHy6gVjWbqcC0ncFzOqM1y644Up7BoKSAr1hRTl6Mw9S3UfZZZ0al3JtWt
+8y0eFIW3QP66w1AL0LO2bZMBuOvhb63DXv5iHorcxk0yIFbbybRCb3BlblNVU0U6
+RmFjdG9yeSBPQlMgUHJvamVjdCA8b3BlblNVU0U6RmFjdG9yeUBidWlsZC5vcGVu
+c3VzZS5vcmc+iGYEExECACYCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAUCS+GM
+qwUJC8//eAAKCRAcchwkVrQXenCfAKCiI/uNClNI32AaPU36o2mFIUKcHgCfby3/
+8UEqkeBRFM1zyjHBo2w/GYyIRgQQEQIABgUCS+GOAgAKCRA7MBG3a51lI2PoAJ9+
+OORElEjcmtUu0pOhatgoEx+DoACfcJMHcdT+8ckq17RsEgWuS/4dGVM=
+=uu+g
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-7e2e3b05-4be037ca.asc b/src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-7e2e3b05-4be037ca.asc
new file mode 100644
index 00000000..58ea0ead
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-7e2e3b05-4be037ca.asc
@@ -0,0 +1,18 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.15 (GNU/Linux)
+
+mQGiBER0iroRBADfqUeJmPCXqPJFnf3CVKy40dL1F+gfvP+JHN7/uu4c9+oCYjI1
+uAE8iGTm/Twb/Zzbs4dt0iWjhNFXbRi42rMww4d/8QcPYZ21WSehh+fv8nCjt2sw
+LeC87ar2SR8OTpJBK0fQlcd4e6H5GMntfI6SYEUOPd8m/eQ+4+1AxpUUpwCgswaF
+13fePZGI//pDn5tGjbvmaP8D/R3qum/I+oDS8lbFeeDS10GkEkwTYec13gdfsq6I
+yzIj7VBsC+rGfbipv+VGR61Q4d19pOHKLDekr9OG+3G4ZcYM4NQvQZR+QIlp3xWu
+nBmYD1LRkHLVj+Z4DGQhjjOffkPSuacKPymMaZ/aRiLgTIAo97W2YPhutscXrLSG
+2Y+BA/4jsyaDb7kbW4wc8RtPIcuFEheVqgBeRakP9Uj47kBMBEpPtI/mIdY5liKk
+ztKnuQG6ROYLNV/PW0ZbE1uT64C710weh4cB3PnZLV5P10deDLBjHk8MJQGCTSDD
+JYvhutUzQfshAU6j2kErGvKdZxWGezab34vFyMP2oLGqswPAJrRQTm92ZWxsIFBy
+b3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20pIDxub3ZlbGwt
+cHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6IZgQTEQIAJgIbAwYLCQgHAwIEFQIIAwQW
+AgMBAh4BAheABQJL4DfKBQkO9G+QAAoJEBTCi8l+LjsFWJ0AoIRm3ZLa4FoQ4/rD
+nWb0DlZZWJRmAJwPdtR6KhW3eZNEi0YJEJ09dlCBsA==
+=2leo
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-9c800aca-4be01999.asc b/src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-9c800aca-4be01999.asc
new file mode 100644
index 00000000..4d4d0b4c
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-9c800aca-4be01999.asc
@@ -0,0 +1,30 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.15 (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
+YWdlIFNpZ25pbmcgS2V5IDxidWlsZEBzdXNlLmRlPohiBBMRAgAiAhsDBAsHAwID
+FQIDAxYCAQIeAQIXgAUCS+AZmQUJGXXzGAAKCRCoTtronIAKyl9KAJ9KyC11XDiC
+lhuqOJ+Q0yPL5Ge/aQCePxBrVWcVaAjGq4vTkwMkiD9FVMK5Ag0EOe70khAIAISR
+0E3ozF/la+oNaRwxHLrCet30NgnxRROYhPaJB/Tu1FQokn2/Qld/HZnh3TwhBIw1
+FqrhWBJ7491iAjLR9uPbdWJrn+A7t8kSkPaF3Z/6kyc5a8fas44ht5h+6HMBzoFC
+MAq2aBHQRFRNp9Mz1ZvoXXcI1lk1l8OqcUM/ovXbDfPcXsUVeTPTtGzcAi2jVl9h
+l3iwJKkyv/RLmcusdsi8YunbvWGFAF5GaagYQo7YlF6UaBQnYJTM523AMgpPQtsK
+m9o/w9WdgXkgWhgkhZEeqUS3m5xNey1nLu9iMvq9M/iXnGz4sg6Q2Y+GqZ+yAvNW
+jRRou3zSE7Bzg28MI4sAAwYH/2D71Xc5HPDgu87WnBFgmp8MpSr8QnSs0wwPg3xE
+ullGEocolSb2c0ctuSyeVnCttJMzkukL9TqyF4s/6XRstWirSWawJxRLKH6Zjo/F
+aKsshYKf8gBkAaddvpl3pO0gmUYbqmpQ3xDEYlhCeieXS5MkockQ1sj2xYdB1xO0
+ExzfiCiscUKjUFy+mdzUsUutafuZ+gbHog1CN/ccZCkxcBa5IFCHORrNjq9pYWlr
+xsEn6ApsG7JJbM2besW1PkdEoxak74z1senh36m5jQvVjA3U4xq1wwylxadmmJaJ
+HzeiLfb7G1ZRjZTsB7fyYxqDzMVul6o9BSwO/1XsIAnV1uuITAQYEQIADAUCS+AZ
+vQUJGXXzKwAKCRCoTtronIAKysYeAJ4yNHu8lpjQiBL69k3VNr9hbQMmzwCfcrIB
+TnsG384Q1YOf9lIUSYEa9sk=
+=yIuV
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc b/src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc
new file mode 100644
index 00000000..086f8f8a
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc
@@ -0,0 +1,31 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.15 (GNU/Linux)
+
+mQILBERqCJkBEACdqhZWdAbUHLIumXMEgv+GFjr1ZzVHgynnFOzztU/8sxZNa9cm
+YV4HZpVfjMr7fos3ArzyiPPt/336cf7w9p79/ZS4rHSNPDMlPCtXYvFxUbvU0/GY
+q4jwcBsrJ0xaJ9CP5bWyAgVKOb7Y6k0ktaLjRR+tDfMsHA4H0ClMoRr6ATw8NL0e
+VCfAHuzqCKvX1If8ng+wTivtAhKvz/WwQiELNELmPfc5tZHOw8NgP/r0Pze18Hn2
+dlAHu0WpC7uoR00vscsMIJiJJPcsxbL1F1eADKnk+wEy8Go+EJeJ5i0WoFbqD52q
+Lv/C/oY6NVtVY0MBwtn+oQNSnQ4JBsB/Akdt53LAi0ZtNQxMyUW+76R8FCOmVCV8
+WGiF5CPRP0yvG80AMBjBjKjHb/v8ov5MnIyFimzAHS1gQcUNxTEYA/5eFwoYcGcK
+weGq9FUjPTzLQAgvp7XmOzHpSAfJ7qysxFTepNsSZZhgizJyInrdQldr+GYcUNqB
+krD9MWmFop975OxhCTEnNv/HcE79r8WD26HzDFYxTiTJbr0pU/ivBzo+rjq+YG2V
+stJk+udVYmZTnC4LmXus8JiNuqBXbxNscwCBpcJ8YcfCV6uh+7E0XfXZsgVUFLp1
+NF+ylYRGTycOlWoZODrnJevZW7N9O3bWRx/G2P4bJD07LsDLe4i5hymf5QAGKbRQ
+Tm92ZWxsIFByb3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20p
+IDxub3ZlbGwtcHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6JAjMEEwECAB0FAkRqCJkG
+CwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRBHijLooZEiCKSFD/93vZHCAMLEfksU
+KnvXl08bv1rfuamuyJnE3ANRE5RDyypriHMCnkVxazvQ2WI4W4UEjluL9+SzZwtV
+ZvKVoAr31614nSyWwv2YnJTHfjMG+xRlkolZMnuIiB9PcCBo9+GPU0ABuzo4pEJW
+NIRoSS1NFbAZBhtUnY0cN+trM5QObLl7xXTavLyGk//blkk57fov7GXsQJlZUig0
+l2yt5XNyGpLUnTMDumHh8b389quF+0+ZfdwOy7A768xjipAZiTvIujBrEv51wrxh
+0HBT0VGA0MhD9t0B+Ce4BM9P/iVMO00naaOp6PqMfPPKxQQqer8qy1i6UWBx95SY
+mKZBIvOm2d9PezDxkckCu61r6krx1iKnT1wdprCAkIYwALK118SpbxuyGW0bhRHc
+wsc/akzWH72fS0Xu49mvL4k4A2U9asdeQid3dMgbtm5mSWof0yiU/G4YNn0yeXoY
+oG1VbCAqQbFX1Rvd6GITJVqI+ekW/uMA9BP78dF8wBeG0+QmpQnSf+eOsxB/RT8o
+Kb4hHY+29MUlg+i9ceVt7hoKr03J/uIG5TXFXRYLaI0iAFVlKfWxpqDfS2XA4+dD
+VYt+5RDgBcnxDaTB4FE9GqcYScNfe7+NFtL0p0wOPftbmgZzGjucTmrD8mDUNdqA
+xGK7vlk4GATSfOQlq7G6LXW6RYnInohGBBMRAgAGBQJEazMlAAoJEKhO2uicgArK
+2vMAn0TbVDESEVKVuFZStrfIzOvJQrR9AJsH733Ju1kE99GFrdfCeGqpckmNhg==
+=E+qN
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.3/trusted-package-keys/pubring.gpg b/src/lib/distro-info/suse-11.3/trusted-package-keys/pubring.gpg
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3/trusted-package-keys/pubring.gpg
diff --git a/src/lib/distro-info/suse-11.3_x86_64/mirrors/base b/src/lib/distro-info/suse-11.3_x86_64/mirrors/base
new file mode 100644
index 00000000..8d55eac4
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3_x86_64/mirrors/base
@@ -0,0 +1,247 @@
+http://opensuse.mirror.ac.za/opensuse/distribution/11.1/repo/oss
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.1/repo/oss
+http://mirror.lupaworld.com/opensuse/distribution/11.1/repo/oss
+http://www.lizardsource.cn/distribution/11.1/repo/oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.1/repo/oss
+ftp://www.lizardsource.cn/distribution/11.1/repo/oss
+ftp://opensuse.mirror.ac.za/opensuse/distribution/11.1/repo/oss
+http://download.opensuse.or.id/distribution/11.1/repo/oss
+http://mirror.unej.ac.id/opensuse/distribution/11.1/repo/oss
+http://opensuse.cbn.net.id/distribution/11.1/repo/oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.1/repo/oss
+http://repo.ugm.ac.id/opensuse/distribution/11.1/repo/oss
+http://dl2.foss-id.web.id/opensuse/distribution/11.1/repo/oss
+http://mirror.isoc.org.il/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirror.isoc.org.il/opensuse/distribution/11.1/repo/oss
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.1/repo/oss
+ftp://opensuse.cbn.net.id/pub/opensuse/distribution/11.1/repo/oss
+ftp://dl2.foss-id.web.id/repo/opensuse/distribution/11.1/repo/oss
+http://ftp.kddilabs.jp/Linux/packages/opensuse/distribution/11.1/repo/oss
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.1/repo/oss
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.riken.jp/Linux/opensuse/distribution/11.1/repo/oss
+ftp://mirror.unej.ac.id/opensuse/distribution/11.1/repo/oss
+ftp://ftp.novell.co.jp/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.riken.jp/Linux/opensuse/distribution/11.1/repo/oss
+http://ftp.daum.net/opensuse/distribution/11.1/repo/oss
+ftp://repo.ugm.ac.id/opensuse/distribution/11.1/repo/oss
+http://77.88.19.68/opensuse/distribution/11.1/repo/oss
+http://77.88.19.73/opensuse/distribution/11.1/repo/oss
+http://mirror.suse.ru/distribution/11.1/repo/oss
+http://77.88.19.74/opensuse/distribution/11.1/repo/oss
+http://93.158.155.193/opensuse/distribution/11.1/repo/oss
+ftp://ftp.chg.ru/pub/opensuse/distribution/11.1/repo/oss
+ftp://dispenser.yandex.net/opensuse/distribution/11.1/repo/oss
+ftp://ftp.daum.net/opensuse/distribution/11.1/repo/oss
+http://mirror.nus.edu.sg/opensuse/distribution/11.1/repo/oss
+ftp://seeder.yandex.net/opensuse/distribution/11.1/repo/oss
+ftp://allotter.yandex.net/opensuse/distribution/11.1/repo/oss
+ftp://ftp.kaist.ac.kr/opensuse/distribution/11.1/repo/oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.metu.edu.tr/opensuse/distribution/11.1/repo/oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirror.in.th/opensuse/distribution/11.1/repo/oss
+http://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.1/repo/oss
+http://ftp.chg.ru/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.1/repo/oss
+ftp://ftp.isu.edu.tw/pub/Linux/OpenSuSE/distribution/11.1/repo/oss
+http://ftp.twaren.net/Linux/OpenSuSE/distribution/11.1/repo/oss
+http://mirror-fpt-telecom.fpt.net/opensuse/distribution/11.1/repo/oss
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.1/repo/oss
+http://ftp.isu.edu.tw/pub/Linux/opensuse/distribution/11.1/repo/oss
+http://suse.inode.at/opensuse/distribution/11.1/repo/oss
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.1/repo/oss
+ftp://ftp.twaren.net/Linux/OpenSuSE/distribution/11.1/repo/oss
+http://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.tugraz.at/mirror/opensuse/distribution/11.1/repo/oss
+ftp://ftp.tugraz.at/mirror/opensuse/distribution/11.1/repo/oss
+ftp://suse.inode.at/opensuse/distribution/11.1/repo/oss
+http://suse.lagis.at/opensuse/distribution/11.1/repo/oss
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+http://mirror.opensuse.com.ba/opensuse/distribution/11.1/repo/oss
+http://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.1/repo/oss
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.1/repo/oss
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+http://mirrors.netbg.com/opensuse/distribution/11.1/repo/oss
+http://mirror.switch.ch/ftp/mirror/opensuse/distribution/11.1/repo/oss
+ftp://mirror.switch.ch/mirror/opensuse/distribution/11.1/repo/oss
+ftp://suse.lagis.at/opensuse/distribution/11.1/repo/oss
+http://mirror.karneval.cz/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://mirror.karneval.cz/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.1/repo/oss
+ftp://mirrors.netbg.com/opensuse/distribution/11.1/repo/oss
+http://ftp.linux.cz/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.1/repo/oss
+http://ftp5.gwdg.de/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.1/repo/oss
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/distribution/11.1/repo/oss
+http://download.uni-hd.de/ftp/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.1/repo/oss
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/distribution/11.1/repo/oss
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://opensuse.intergenia.de/distribution/11.1/repo/oss
+ftp://ftp5.gwdg.de/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.1/repo/oss
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.1/repo/oss
+http://widehat.opensuse.org/distribution/11.1/repo/oss
+ftp://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.1/repo/oss
+http://ftp4.gwdg.de/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp3.gwdg.de/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.1/repo/oss
+http://ftp.uni-kassel.de/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+http://opensuse-linuxmigratio.at/distribution/11.1/repo/oss
+ftp://ftp3.gwdg.de/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.1/repo/oss
+ftp://ftp4.gwdg.de/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.uni-siegen.de/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uni-siegen.de/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uni-bayreuth.de/linux/opensuse/distribution/11.1/repo/oss
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+http://ftp.klid.dk/ftp/opensuse/distribution/11.1/repo/oss
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.1/repo/oss
+ftp://ftp.klid.dk/opensuse/distribution/11.1/repo/oss
+http://ftp.estpak.ee/pub/suse/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.gui.uva.es/sites/opensuse.org/distribution/11.1/repo/oss
+ftp://ftp.gui.uva.es/sites/opensuse.org/distribution/11.1/repo/oss
+http://ftp.rediris.es/pub/mirror/opensuse/distribution/11.1/repo/oss
+http://suse.bifi.unizar.es/opensuse/distribution/11.1/repo/oss
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.1/repo/oss
+http://opensuse.mirrors.proxad.net/opensuse/distribution/11.1/repo/oss
+http://mirror.ovh.net/opensuse/distribution/11.1/repo/oss
+ftp://ftp.rediris.es/pub/mirror/opensuse/distribution/11.1/repo/oss
+http://fr2.rpmfind.net/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.1/repo/oss
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+http://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.1/repo/oss
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/oss
+ftp://fr2.rpmfind.net/linux/opensuse/distribution/11.1/repo/oss
+http://opensuse.cict.fr/distribution/11.1/repo/oss
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/distribution/11.1/repo/oss
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://mirror.ovh.net/opensuse/distribution/11.1/repo/oss
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.ntua.gr/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.ntua.gr/pub/linux/opensusedistribution/11.1/repo/oss
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.1/repo/oss
+ftp://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.1/repo/oss
+http://roxen.integrity.hu/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirror.cict.fr/opensuse/distribution/11.1/repo/oss
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.1/repo/oss
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+http://rm.mirror.garr.it/mirrors/opensuse/distribution/11.1/repo/oss
+http://repo1.linux.edu.lv/distribution/11.1/repo/oss
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/oss
+ftp://repo1.linux.edu.lv/distribution/11.1/repo/oss
+http://mirror.leaseweb.com/opensuse/distribution/11.1/repo/oss
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+ftp://mirror.leaseweb.com/opensuse/distribution/11.1/repo/oss
+http://mirrors.nl.eu.kernel.org/opensuse/distribution/11.1/repo/oss
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/oss
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/distribution/11.1/repo/oss
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/distribution/11.1/repo/oss
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.1/repo/oss
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/distribution/11.1/repo/oss
+http://opensuse.hro.nl/opensuse/distribution/11.1/repo/oss
+http://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.1/repo/oss
+http://opensuse.uib.no/distribution/11.1/repo/oss
+ftp://rm.mirror.garr.it/mirrors/opensusedistribution/11.1/repo/oss
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/distribution/11.1/repo/oss
+http://ftp.uninett.no/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.1/repo/oss
+ftp://ftp.uninett.no/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://opensuse.hro.nl/opensuse/distribution/11.1/repo/oss
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.1/repo/oss
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.sileman.pl/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://mirrors.nl.eu.kernel.org/opensuse/distribution/11.1/repo/oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://ftp.sileman.pl/pub/opensuse/distribution/11.1/repo/oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.1/repo/oss
+http://cesium.di.uminho.pt/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.gts.lug.ro/opensuse/distribution/11.1/repo/oss
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.1/repo/oss
+ftp://ftp.gts.lug.ro/opensuse/distribution/11.1/repo/oss
+http://ftp.ines.lug.ro/opensuse/distribution/11.1/repo/oss
+http://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.1/repo/oss
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.1/repo/oss
+ftp://cesium.di.uminho.pt/pub/opensuse/distribution/11.1/repo/oss
+http://mirrors.se.eu.kernel.org/opensuse/distribution/11.1/repo/oss
+http://ftp.df.lth.se/pub/opensuse/distribution/11.1/repo/oss
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.1/repo/oss
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.1/repo/oss
+http://opensuse.ynet.sk/distribution/11.1/repo/oss
+ftp://mirrors.se.eu.kernel.org/opensuse/distribution/11.1/repo/oss
+ftp://ftp.ines.lug.ro/opensuse/distribution/11.1/repo/oss
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.1/repo/oss
+http://www.muug.mb.ca/pub/opensuse/distribution/11.1/repo/oss
+http://less.cogeco.net/ftp/openSUSE/distribution/11.1/repo/oss
+ftp://ftp.df.lth.se/pub/opensusedistribution/11.1/repo/oss
+http://linux.dell.com/repo/community/distribution/11.1/repo/oss
+http://ftp.osuosl.org/pub/opensuse/distribution/11.1/repo/oss
+ftp://less.cogeco.net/openSUSE/distribution/11.1/repo/oss
+http://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.1/repo/oss
+http://suse.mirrors.tds.net/pub/opensuse/distribution/11.1/repo/oss
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.osuosl.org/pub/opensuse/distribution/11.1/repo/oss
+http://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://www.muug.mb.ca/pub/opensuse/distribution/11.1/repo/oss
+http://mirror.umoss.org/opensuse/distribution/11.1/repo/oss
+ftp://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.1/repo/oss
+http://mirrors.med.harvard.edu/opensuse/distribution/11.1/repo/oss
+http://opensuse.cs.utah.edu/distribution/11.1/repo/oss
+ftp://suse.mirrors.tds.net/pub/opensuse/distribution/11.1/repo/oss
+http://mirrors.xmission.com/opensuse/distribution/11.1/repo/oss
+http://mirrors2.kernel.org/opensuse/distribution/11.1/repo/oss
+http://opensuse.ca.unixheads.org/distribution/11.1/repo/oss
+http://mirrors1.kernel.org/opensuse/distribution/11.1/repo/oss
+ftp://mirrors2.kernel.org/opensuse/distribution/11.1/repo/oss
+http://mirror.rackspace.com/openSUSE/distribution/11.1/repo/oss
+http://130.57.19.201/distribution/11.1/repo/oss
+ftp://mirrors.xmission.com/opensuse/distribution/11.1/repo/oss
+ftp://130.57.19.201/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirrors1.kernel.org/opensuse/distribution/11.1/repo/oss
+http://ftp.ussg.iu.edu/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.utexas.edu/opensuse/distribution/11.1/repo/oss
+ftp://opensuse.cs.utah.edu/pub/opensuse/distribution/11.1/repo/oss
+http://www.gtlib.gatech.edu/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.1/repo/oss
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/distribution/11.1/repo/oss
+ftp://ftp.utexas.edu/mirrors/opensuse/distribution/11.1/repo/oss
+http://mirror.nyi.net/opensuse/distribution/11.1/repo/oss
+http://mirror.cps.cmich.edu/opensuse/opensuse/distribution/11.1/repo/oss
+http://mirrors.rit.edu/opensuse/distribution/11.1/repo/oss
+ftp://ftp.ussg.iu.edu/linux/opensuse/distribution/11.1/repo/oss
+http://ftp.iinet.net.au/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirror.nyi.net/opensusedistribution/11.1/repo/oss
+ftp://mirror.rackspace.com/openSUSE/distribution/11.1/repo/oss
+http://mirror.internode.on.net/pub/opensuse/distribution/11.1/repo/oss
+http://mirror.pacific.net.au/linux/opensuse/distribution/11.1/repo/oss
+ftp://ftp.iinet.net.au/pub/opensuse/distribution/11.1/repo/oss
+ftp://mirror.internode.on.net/pub/opensuse/distribution/11.1/repo/oss
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.1/repo/oss
+ftp://mirror.pacific.net.au/linux/opensuse/distribution/11.1/repo/oss
+http://opensuse.patan.com.ar/distribution/11.1/repo/oss
+http://200.221.9.37/pub/opensuse/distribution/11.1/repo/oss
+http://opensuse.c3sl.ufpr.br/distribution/11.1/repo/oss
+ftp://opensuse.c3sl.ufpr.br/opensuse/distribution/11.1/repo/oss
+http://opensuse.pop.com.br/distribution/11.1/repo/oss
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.1/repo/oss
diff --git a/src/lib/distro-info/suse-11.3_x86_64/mirrors/base_non-oss b/src/lib/distro-info/suse-11.3_x86_64/mirrors/base_non-oss
new file mode 100644
index 00000000..bd887ed3
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3_x86_64/mirrors/base_non-oss
@@ -0,0 +1,246 @@
+http://opensuse.mirror.ac.za/opensuse/distribution/11.1/repo/non-oss
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.1/repo/non-oss
+ftp://opensuse.mirror.ac.za/opensuse/distribution/11.1/repo/non-oss
+http://mirror.lupaworld.com/opensuse/distribution/11.1/repo/non-oss
+http://www.lizardsource.cn/distribution/11.1/repo/non-oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.1/repo/non-oss
+http://mirror.alva.ge/pub/opensuse/distribution/11.1/repo/non-oss
+http://download.opensuse.or.id/distribution/11.1/repo/non-oss
+http://opensuse.cbn.net.id/distribution/11.1/repo/non-oss
+http://repo.ugm.ac.id/opensuse/distribution/11.1/repo/non-oss
+http://mirror.unej.ac.id/opensuse/distribution/11.1/repo/non-oss
+ftp://opensuse.cbn.net.id/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.unej.ac.id/opensuse/distribution/11.1/repo/non-oss
+http://dl2.foss-id.web.id/opensuse/distribution/11.1/repo/non-oss
+http://mirror.isoc.org.il/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.1/repo/non-oss
+ftp://dl2.foss-id.web.id/repo/opensuse/distribution/11.1/repo/non-oss
+ftp://www.lizardsource.cn/distribution/11.1/repo/non-oss
+http://ftp.kddilabs.jp/Linux/packages/opensuse/distribution/11.1/repo/non-oss
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.novell.co.jp/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.1/repo/non-oss
+ftp://repo.ugm.ac.id/opensuse/distribution/11.1/repo/non-oss
+http://ftp.riken.jp/Linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.riken.jp/Linux/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.isoc.org.il/opensuse/distribution/11.1/repo/non-oss
+http://ftp.daum.net/opensuse/distribution/11.1/repo/non-oss
+http://77.88.19.68/opensuse/distribution/11.1/repo/non-oss
+http://77.88.19.73/opensuse/distribution/11.1/repo/non-oss
+http://mirror.suse.ru/distribution/11.1/repo/non-oss
+http://77.88.19.74/opensuse/distribution/11.1/repo/non-oss
+http://93.158.155.193/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.chg.ru/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://seeder.yandex.net/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.kaist.ac.kr/opensuse/distribution/11.1/repo/non-oss
+http://mirror.nus.edu.sg/opensuse/distribution/11.1/repo/non-oss
+ftp://allotter.yandex.net/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.novell.co.jp/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.metu.edu.tr/opensuse/distribution/11.1/repo/non-oss
+ftp://dispenser.yandex.net/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.isu.edu.tw/pub/Linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.suntel.com.tr/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.chg.ru/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.1/repo/non-oss
+ftp://ftp.isu.edu.tw/pub/Linux/OpenSuSE/distribution/11.1/repo/non-oss
+http://ftp.twaren.net/Linux/OpenSuSE/distribution/11.1/repo/non-oss
+ftp://mirror.in.th/opensuse/distribution/11.1/repo/non-oss
+http://mirror-fpt-telecom.fpt.net/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/distribution/11.1/repo/non-oss
+http://suse.inode.at/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/distribution/11.1/repo/non-oss
+ftp://spreader.yandex.net/opensuse/distribution/11.1/repo/non-oss
+ftp://suse.inode.at/opensuse/distribution/11.1/repo/non-oss
+http://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.tugraz.at/mirror/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.twaren.net/Linux/OpenSuSE/distribution/11.1/repo/non-oss
+http://suse.lagis.at/opensuse/distribution/11.1/repo/non-oss
+ftp://suse.lagis.at/opensuse/distribution/11.1/repo/non-oss
+http://mirror.opensuse.com.ba/opensuse/distribution/11.1/repo/non-oss
+http://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.1/repo/non-oss
+ftp://ftp.tugraz.at/mirror/opensuse/distribution/11.1/repo/non-oss
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+http://mirrors.netbg.com/opensuse/distribution/11.1/repo/non-oss
+ftp://mirrors.netbg.com/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+http://mirror.switch.ch/ftp/mirror/opensuse/distribution/11.1/repo/non-oss
+http://mirror.karneval.cz/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.karneval.cz/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.switch.ch/mirror/opensuse/distribution/11.1/repo/non-oss
+http://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.1/repo/non-oss
+http://ftp5.gwdg.de/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp5.gwdg.de/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/distribution/11.1/repo/non-oss
+http://download.uni-hd.de/ftp/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.1/repo/non-oss
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.linux.cz/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/distribution/11.1/repo/non-oss
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.intergenia.de/distribution/11.1/repo/non-oss
+http://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.1/repo/non-oss
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.1/repo/non-oss
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp3.gwdg.de/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.1/repo/non-oss
+http://widehat.opensuse.org/distribution/11.1/repo/non-oss
+http://ftp4.gwdg.de/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp4.gwdg.de/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.uni-kassel.de/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+http://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://opensuse-linuxmigratio.at/distribution/11.1/repo/non-oss
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.uni-siegen.de/opensuse/distribution/11.1/repo/non-oss
+http://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp3.gwdg.de/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.klid.dk/ftp/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/distribution/11.1/repo/non-oss
+http://ftp.estpak.ee/pub/suse/opensuse/distribution/11.1/repo/non-oss
+http://ftp.gui.uva.es/sites/opensuse.org/distribution/11.1/repo/non-oss
+ftp://ftp.uni-siegen.de/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.uni-bayreuth.de/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.rediris.es/pub/mirror/opensuse/distribution/11.1/repo/non-oss
+http://mirror.ovh.net/opensuse/distribution/11.1/repo/non-oss
+http://suse.bifi.unizar.es/opensuse/distribution/11.1/repo/non-oss
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.mirrors.proxad.net/opensuse/distribution/11.1/repo/non-oss
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.klid.dk/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.rediris.es/pub/mirror/opensuse/distribution/11.1/repo/non-oss
+http://fr2.rpmfind.net/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.ovh.net/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.gui.uva.es/sites/opensuse.org/distribution/11.1/repo/non-oss
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://fr2.rpmfind.net/linux/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.cict.fr/distribution/11.1/repo/non-oss
+http://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.1/repo/non-oss
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/non-oss
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/distribution/11.1/repo/non-oss
+ftp://mirror.cict.fr/opensuse/distribution/11.1/repo/non-oss
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://ftp.ntua.gr/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/distribution/11.1/repo/non-oss
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.1/repo/non-oss
+http://roxen.integrity.hu/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.ntua.gr/pub/linux/opensusedistribution/11.1/repo/non-oss
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+ftp://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.1/repo/non-oss
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.1/repo/non-oss
+http://rm.mirror.garr.it/mirrors/opensuse/distribution/11.1/repo/non-oss
+ftp://rm.mirror.garr.it/mirrors/opensusedistribution/11.1/repo/non-oss
+http://repo1.linux.edu.lv/distribution/11.1/repo/non-oss
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://repo1.linux.edu.lv/distribution/11.1/repo/non-oss
+http://mirror.leaseweb.com/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.leaseweb.com/opensuse/distribution/11.1/repo/non-oss
+http://mirrors.nl.eu.kernel.org/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.1/repo/non-oss
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/distribution/11.1/repo/non-oss
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.hro.nl/opensuse/distribution/11.1/repo/non-oss
+ftp://mirrors.nl.eu.kernel.org/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.1/repo/non-oss
+http://ftp.uninett.no/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.uib.no/distribution/11.1/repo/non-oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.sileman.pl/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.uninett.no/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://opensuse.hro.nl/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.pbone.net/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/distribution/11.1/repo/non-oss
+http://cesium.di.uminho.pt/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://cesium.di.uminho.pt/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.sileman.pl/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.1/repo/non-oss
+http://ftp.gts.lug.ro/opensuse/distribution/11.1/repo/non-oss
+http://ftp.ines.lug.ro/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.ines.lug.ro/opensuse/distribution/11.1/repo/non-oss
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.1/repo/non-oss
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/distribution/11.1/repo/non-oss
+http://mirrors.se.eu.kernel.org/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.1/repo/non-oss
+http://ftp.df.lth.se/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.ynet.sk/distribution/11.1/repo/non-oss
+ftp://mirrors.se.eu.kernel.org/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.df.lth.se/pub/opensusedistribution/11.1/repo/non-oss
+http://less.cogeco.net/ftp/openSUSE/distribution/11.1/repo/non-oss
+ftp://ftp.gts.lug.ro/opensuse/distribution/11.1/repo/non-oss
+ftp://less.cogeco.net/openSUSE/distribution/11.1/repo/non-oss
+http://www.muug.mb.ca/pub/opensuse/distribution/11.1/repo/non-oss
+http://linux.dell.com/repo/community/distribution/11.1/repo/non-oss
+http://ftp.osuosl.org/pub/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.osuosl.org/pub/opensuse/distribution/11.1/repo/non-oss
+http://suse.mirrors.tds.net/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://www.muug.mb.ca/pub/opensuse/distribution/11.1/repo/non-oss
+http://mirrors.med.harvard.edu/opensuse/distribution/11.1/repo/non-oss
+http://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://mirror.umoss.org/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.cs.utah.edu/distribution/11.1/repo/non-oss
+http://opensuse.ca.unixheads.org/distribution/11.1/repo/non-oss
+ftp://opensuse.cs.utah.edu/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/distribution/11.1/repo/non-oss
+http://mirrors.xmission.com/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://mirrors2.kernel.org/opensuse/distribution/11.1/repo/non-oss
+ftp://mirrors.xmission.com/opensuse/distribution/11.1/repo/non-oss
+http://mirrors1.kernel.org/opensuse/distribution/11.1/repo/non-oss
+http://mirror.rackspace.com/openSUSE/distribution/11.1/repo/non-oss
+http://130.57.19.201/distribution/11.1/repo/non-oss
+ftp://130.57.19.201/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.rackspace.com/openSUSE/distribution/11.1/repo/non-oss
+http://ftp.utexas.edu/opensuse/distribution/11.1/repo/non-oss
+http://www.gtlib.gatech.edu/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://mirrors2.kernel.org/opensuse/distribution/11.1/repo/non-oss
+http://ftp.ussg.iu.edu/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://ftp.utexas.edu/mirrors/opensuse/distribution/11.1/repo/non-oss
+ftp://www.gtlib.gatech.edu/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://mirrors1.kernel.org/opensuse/distribution/11.1/repo/non-oss
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/distribution/11.1/repo/non-oss
+http://mirror.cps.cmich.edu/opensuse/opensuse/distribution/11.1/repo/non-oss
+http://mirror.nyi.net/opensuse/distribution/11.1/repo/non-oss
+http://mirrors.rit.edu/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.1/repo/non-oss
+http://ftp.iinet.net.au/pub/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.nyi.net/opensusedistribution/11.1/repo/non-oss
+ftp://mirror.colorado.edu/pub/opensuse/distribution/11.1/repo/non-oss
+http://mirror.pacific.net.au/linux/opensuse/distribution/11.1/repo/non-oss
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.pacific.net.au/linux/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.internode.on.net/pub/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.patan.com.ar/distribution/11.1/repo/non-oss
+http://200.221.9.37/pub/opensuse/distribution/11.1/repo/non-oss
+http://opensuse.c3sl.ufpr.br/distribution/11.1/repo/non-oss
+http://opensuse.pop.com.br/distribution/11.1/repo/non-oss
+ftp://opensuse.c3sl.ufpr.br/opensuse/distribution/11.1/repo/non-oss
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/distribution/11.1/repo/non-oss
diff --git a/src/lib/distro-info/suse-11.3_x86_64/mirrors/base_update b/src/lib/distro-info/suse-11.3_x86_64/mirrors/base_update
new file mode 100644
index 00000000..d0c666e0
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3_x86_64/mirrors/base_update
@@ -0,0 +1,246 @@
+http://opensuse.mirror.ac.za/opensuse/update/11.1
+http://ftp.up.ac.za/mirrors/opensuse/opensuse/update/11.1
+http://download.opensuse.or.id/update/11.1
+ftp://opensuse.mirror.ac.za/opensuse/update/11.1
+http://mirror.lupaworld.com/opensuse/update/11.1
+http://www.lizardsource.cn/update/11.1
+http://mirror.alva.ge/pub/opensuse/update/11.1
+http://mirror.alva.ge/pub/opensuse/update/11.1
+ftp://ftp.up.ac.za/mirrors/opensuse/opensuse/update/11.1
+http://mirror.unej.ac.id/opensuse/update/11.1
+http://opensuse.cbn.net.id/update/11.1
+http://repo.ugm.ac.id/opensuse/update/11.1
+ftp://mirror.unej.ac.id/opensuse/update/11.1
+http://dl2.foss-id.web.id/opensuse/update/11.1
+http://mirror.isoc.org.il/pub/opensuse/update/11.1
+http://ftp.jaist.ac.jp/pub/Linux/openSUSE/update/11.1
+ftp://dl2.foss-id.web.id/repo/opensuse/update/11.1
+http://ftp.kddilabs.jp/Linux/packages/opensuse/update/11.1
+ftp://mirror.isoc.org.il/opensuse/update/11.1
+ftp://ftp.jaist.ac.jp/pub/Linux/openSUSE/update/11.1
+ftp://opensuse.cbn.net.id/pub/opensuse/update/11.1
+ftp://repo.ugm.ac.id/opensuse/update/11.1
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/opensuse/update/11.1
+ftp://www.lizardsource.cn/update/11.1
+http://ftp.riken.jp/Linux/opensuse/update/11.1
+http://ftp.daum.net/opensuse/update/11.1
+http://77.88.19.68/opensuse/update/11.1
+ftp://ftp.novell.co.jp/pub/opensuse/update/11.1
+http://77.88.19.73/opensuse/update/11.1
+ftp://ftp.riken.jp/Linux/opensuse/update/11.1
+http://mirror.suse.ru/update/11.1
+http://77.88.19.74/opensuse/update/11.1
+http://93.158.155.193/opensuse/update/11.1
+ftp://dispenser.yandex.net/opensuse/update/11.1
+ftp://ftp.kaist.ac.kr/opensuse/update/11.1
+ftp://ftp.chg.ru/pub/opensuse/update/11.1
+ftp://spreader.yandex.net/opensuse/update/11.1
+ftp://allotter.yandex.net/opensuse/update/11.1
+http://mirror.nus.edu.sg/opensuse/update/11.1
+ftp://seeder.yandex.net/opensuse/update/11.1
+ftp://ftp.metu.edu.tr/opensuse/update/11.1
+ftp://ftp.suntel.com.tr/pub/opensuse/update/11.1
+http://ftp.isu.edu.tw/pub/Linux/opensuse/update/11.1
+ftp://mirror.in.th/opensuse/update/11.1
+ftp://ftp.suntel.com.tr/pub/opensuse/update/11.1
+http://ftp.chg.ru/pub/opensuse/update/11.1
+http://ftp.ncnu.edu.tw/Linux/opensuse/update/11.1
+ftp://ftp.ncnu.edu.tw/Linux/opensuse/update/11.1
+http://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/update/11.1
+http://ftp.twaren.net/Linux/OpenSuSE/update/11.1
+http://mirror-fpt-telecom.fpt.net/opensuse/update/11.1
+http://suse.inode.at/opensuse/update/11.1
+ftp://ftp.twaren.net/Linux/OpenSuSE/update/11.1
+http://gd.tuwien.ac.at/opsys/linux/opensuse/update/11.1
+ftp://ftp.cse.yzu.edu.tw/pub/Linux/openSUSE/update/11.1
+http://ftp.tugraz.at/mirror/opensuse/update/11.1
+ftp://suse.inode.at/opensuse/update/11.1
+http://suse.lagis.at/opensuse/update/11.1
+ftp://suse.lagis.at/opensuse/update/11.1
+http://mirror.opensuse.com.ba/opensuse/update/11.1
+http://ftp.belnet.be/mirror/ftp.opensuse.org/update/11.1
+ftp://ftp.tugraz.at/mirror/opensuse/update/11.1
+http://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/update/11.1
+ftp://opensuse.mirrors.skynet.be/pub/ftp.opensuse.org/opensuse/update/11.1
+http://mirrors.netbg.com/opensuse/update/11.1
+ftp://mirrors.netbg.com/opensuse/update/11.1
+http://mirror.switch.ch/ftp/mirror/opensuse/update/11.1
+ftp://ftp.belnet.be/mirror/ftp.opensuse.org/update/11.1
+http://mirror.karneval.cz/pub/linux/opensuse/update/11.1
+http://ftp.sh.cvut.cz/MIRRORS/opensuse/update/11.1
+http://ftp.linux.cz/pub/linux/opensuse/update/11.1
+ftp://mirror.switch.ch/mirror/opensuse/update/11.1
+http://ftp.halifax.rwth-aachen.de/opensuse/update/11.1
+ftp://mirror.karneval.cz/pub/linux/opensuse/update/11.1
+http://ftp5.gwdg.de/pub/opensuse/update/11.1
+ftp://ftp.sh.cvut.cz/MIRRORS/opensuse/update/11.1
+ftp://ftp5.gwdg.de/pub/opensuse/update/11.1
+http://download.uni-hd.de/ftp/pub/linux/opensuse/update/11.1
+ftp://ftp.halifax.rwth-aachen.de/opensuse/update/11.1
+http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/update/11.1
+http://ftp.uni-bremen.de/pub/mirrors/opensuse/update/11.1
+http://sunsite.rwth-aachen.de:3080/ftp/pub/Linux/opensuse/update/11.1
+http://opensuse.intergenia.de/update/11.1
+http://ftp.uni-ulm.de/mirrors/opensuse/update/11.1
+ftp://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/update/11.1
+http://ftp.hosteurope.de/mirror/ftp.opensuse.org/update/11.1
+ftp://ftp.uni-heidelberg.de/pub/linux/opensuse/update/11.1
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/opensuse/update/11.1
+ftp://ftp.hosteurope.de/mirror/ftp.opensuse.org/update/11.1
+http://ftp.tu-chemnitz.de/pub/linux/opensuse/update/11.1
+ftp://ftp.tu-chemnitz.de/pub/linux/opensuse/update/11.1
+ftp://ftp.uni-ulm.de/mirrors/opensuse/update/11.1
+http://ftp.uni-kl.de/pub/linux/opensuse/update/11.1
+http://ftp3.gwdg.de/pub/opensuse/update/11.1
+http://widehat.opensuse.org/update/11.1
+ftp://ftp4.gwdg.de/pub/opensuse/update/11.1
+http://ftp.uni-kassel.de/opensuse/update/11.1
+http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/update/11.1
+ftp://ftp3.gwdg.de/pub/opensuse/update/11.1
+http://ftp4.gwdg.de/pub/opensuse/update/11.1
+ftp://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/update/11.1
+ftp://ftp.uni-kl.de/pub/linux/opensuse/update/11.1
+http://ftp.uni-bayreuth.de/linux/opensuse/update/11.1
+http://opensuse-linuxmigratio.at/update/11.1
+ftp://ftp.uni-kassel.de/pub/linux/opensuse/update/11.1
+http://ftp.uni-siegen.de/opensuse/update/11.1
+http://ftp.tu-ilmenau.de/mirror/opensuse/update/11.1
+http://ftp.uni-paderborn.de/pub/linux/opensuse/update/11.1
+ftp://ftp.uni-paderborn.de/pub/linux/opensuse/update/11.1
+http://ftp.klid.dk/ftp/opensuse/update/11.1
+http://ftp.estpak.ee/pub/suse/opensuse/update/11.1
+ftp://ftp.uni-siegen.de/pub/opensuse/update/11.1
+ftp://ftp.uni-bayreuth.de/linux/opensuse/update/11.1
+ftp://ftp.gui.uva.es/sites/opensuse.org/update/11.1
+http://ftp.rediris.es/pub/mirror/opensuse/update/11.1
+ftp://ftp.klid.dk/opensuse/update/11.1
+http://ftp.gui.uva.es/sites/opensuse.org/update/11.1
+http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/update/11.1
+ftp://ftp.tu-ilmenau.de/mirror/opensuse/update/11.1
+http://opensuse.mirrors.proxad.net/opensuse/update/11.1
+ftp://opensuse.mirrors.proxad.net/mirrors/ftp.opensuse.org/opensuse/update/11.1
+http://mirror.ovh.net/opensuse/update/11.1
+http://suse.bifi.unizar.es/opensuse/update/11.1
+ftp://ftp.rediris.es/pub/mirror/opensuse/update/11.1
+http://fr2.rpmfind.net/linux/opensuse/update/11.1
+ftp://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/update/11.1
+http://opensuse.cict.fr/update/11.1
+ftp://mirror.cict.fr/opensuse/update/11.1
+http://www.mirrorservice.org/sites/download.opensuse.org/update/11.1
+http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/update/11.1
+ftp://fr2.rpmfind.net/linux/opensuse/update/11.1
+http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/update/11.1
+ftp://anorien.csc.warwick.ac.uk/download.opensuse.org/update/11.1
+ftp://mirror.ovh.net/opensuse/update/11.1
+ftp://www.mirrorservice.org/sites/download.opensuse.org/update/11.1
+http://ftp.ntua.gr/pub/linux/opensuse/update/11.1
+http://ftp.fsn.hu/pub/linux/distributions/opensuse/update/11.1
+http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/update/11.1
+ftp://ftp.fsn.hu/pub/linux/distributions/opensuse/update/11.1
+http://roxen.integrity.hu/pub/opensuse/update/11.1
+ftp://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/update/11.1
+ftp://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/update/11.1
+http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/update/11.1
+ftp://ftp.ntua.gr/pub/linux/opensuseupdate/11.1
+http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/update/11.1
+ftp://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/update/11.1
+http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/update/11.1
+ftp://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/update/11.1
+ftp://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/update/11.1
+http://rm.mirror.garr.it/mirrors/opensuse/update/11.1
+http://repo1.linux.edu.lv/update/11.1
+http://mirror.leaseweb.com/opensuse/update/11.1
+ftp://rm.mirror.garr.it/mirrors/opensuseupdate/11.1
+http://mirrors.nl.eu.kernel.org/opensuse/update/11.1
+http://ftp1.nluug.nl/os/Linux/distr/opensuse/update/11.1
+ftp://mirrors.nl.eu.kernel.org/opensuse/update/11.1
+http://ftp2.nluug.nl/os/Linux/distr/opensuse/update/11.1
+ftp://mirror.leaseweb.com/opensuse/update/11.1
+ftp://ftp1.nluug.nl/pub/os/Linux/distr/opensuse/update/11.1
+http://opensuse.hro.nl/opensuse/update/11.1
+ftp://repo1.linux.edu.lv/update/11.1
+http://opensuse.uib.no/update/11.1
+ftp://ftp2.nluug.nl/pub/os/Linux/distr/opensuse/update/11.1
+http://ftp.uninett.no/pub/linux/opensuse/update/11.1
+ftp://ftp.uninett.no/pub/linux/opensuse/update/11.1
+ftp://opensuse.hro.nl/opensuse/update/11.1
+http://ftp.icm.edu.pl/pub/Linux/opensuse/update/11.1
+ftp://ftp.icm.edu.pl/pub/Linux/opensuse/update/11.1
+http://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/update/11.1
+ftp://opensuse.uib.no/pub/Linux/Distributions/opensuse/opensuse/update/11.1
+ftp://ftp.man.poznan.pl/pub/linux/opensuse/opensuse/update/11.1
+http://ftp.sileman.pl/pub/opensuse/update/11.1
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/update/11.1
+ftp://ftp.pbone.net/pub/opensuse/update/11.1
+http://cesium.di.uminho.pt/pub/opensuse/update/11.1
+ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/update/11.1
+ftp://ftp.sileman.pl/pub/opensuse/update/11.1
+http://ftp.nux.ipb.pt/pub/dists/opensuse/update/11.1
+ftp://ftp.nux.ipb.pt/pub/dists/opensuse/update/11.1
+http://ftp.gts.lug.ro/opensuse/update/11.1
+ftp://cesium.di.uminho.pt/pub/opensuse/update/11.1
+http://ftp.ines.lug.ro/opensuse/update/11.1
+ftp://ftp.ines.lug.ro/opensuse/update/11.1
+http://ftp.iasi.roedu.net/mirrors/opensuse.org/update/11.1
+http://mirrors.se.eu.kernel.org/opensuse/update/11.1
+ftp://ftp.pbone.net/pub/opensuse/update/11.1
+http://ftp.df.lth.se/pub/opensuse/update/11.1
+ftp://ftp.df.lth.se/pub/opensuseupdate/11.1
+ftp://ftp.gts.lug.ro/opensuse/update/11.1
+http://ftp.sunet.se/pub/Linux/distributions/opensuse/update/11.1
+http://less.cogeco.net/ftp/openSUSE/update/11.1
+ftp://ftp.iasi.roedu.net/mirrors/opensuse.org/update/11.1
+http://opensuse.ynet.sk/update/11.1
+ftp://mirrors.se.eu.kernel.org/opensuse/update/11.1
+http://www.muug.mb.ca/pub/opensuse/update/11.1
+http://linux.dell.com/repo/community/update/11.1
+ftp://www.muug.mb.ca/pub/opensuse/update/11.1
+http://ftp.osuosl.org/pub/opensuse/update/11.1
+http://opensuse.fastsoft.net/pub/linux/opensuse/update/11.1
+http://suse.mirrors.tds.net/pub/opensuse/update/11.1
+http://mirrors.med.harvard.edu/opensuse/update/11.1
+ftp://ftp.osuosl.org/pub/opensuse/update/11.1
+http://mirror.anl.gov/pub/opensuse/opensuse/update/11.1
+http://mirror.umoss.org/opensuse/update/11.1
+ftp://ftp.sunet.se/pub/Linux/distributions/opensuse/update/11.1
+http://opensuse.cs.utah.edu/update/11.1
+http://opensuse.ca.unixheads.org/update/11.1
+ftp://opensuse.cs.utah.edu/pub/opensuse/update/11.1
+ftp://opensuse.fastsoft.net/pub/linux/opensuse/update/11.1
+http://mirrors.xmission.com/opensuse/update/11.1
+ftp://mirror.anl.gov/pub/opensuse/opensuse/update/11.1
+ftp://suse.mirrors.tds.net/pub/opensuse/update/11.1
+http://mirrors2.kernel.org/opensuse/update/11.1
+ftp://mirrors.xmission.com/opensuse/update/11.1
+http://mirrors1.kernel.org/opensuse/update/11.1
+ftp://mirrors2.kernel.org/opensuse/update/11.1
+http://130.57.19.201/update/11.1
+ftp://mirrors1.kernel.org/opensuse/update/11.1
+ftp://mirror.rackspace.com/openSUSE/update/11.1
+ftp://130.57.19.201/pub/opensuse/update/11.1
+http://ftp.utexas.edu/opensuse/update/11.1
+ftp://mirror.colorado.edu/pub/opensuse/update/11.1
+http://mirror.rackspace.com/openSUSE/update/11.1
+ftp://www.gtlib.gatech.edu/pub/opensuse/update/11.1
+http://www.gtlib.gatech.edu/pub/opensuse/update/11.1
+ftp://ftp.utexas.edu/mirrors/opensuse/update/11.1
+http://ftp.ussg.iu.edu/linux/opensuse/update/11.1
+http://distro.ibiblio.org/pub/linux/distributions/opensuse/update/11.1
+http://mirror.cps.cmich.edu/opensuse/opensuse/update/11.1
+http://mirror.nyi.net/opensuse/update/11.1
+ftp://mirror.colorado.edu/pub/opensuse/update/11.1
+http://mirrors.rit.edu/opensuse/update/11.1
+http://ftp.iinet.net.au/pub/opensuse/update/11.1
+ftp://mirror.nyi.net/opensuseupdate/11.1
+http://mirror.internode.on.net/pub/opensuse/update/11.1
+http://mirror.pacific.net.au/linux/opensuse/update/11.1
+ftp://ftp.iinet.net.au/pub/opensuse/update/11.1
+http://mirror.aarnet.edu.au/pub/opensuse/opensuse/update/11.1
+http://200.221.9.37/pub/opensuse/update/11.1
+http://opensuse.c3sl.ufpr.br/update/11.1
+http://opensuse.pop.com.br/update/11.1
+http://opensuse.patan.com.ar/update/11.1
+ftp://mirror.internode.on.net/pub/opensuse/update/11.1
+ftp://mirror.pacific.net.au/linux/opensuse/update/11.1
+ftp://mirror.aarnet.edu.au/pub/opensuse/opensuse/update/11.1
+ftp://opensuse.c3sl.ufpr.br/opensuse/update/11.1
diff --git a/src/lib/distro-info/suse-11.3_x86_64/prereqfiles/etc/group b/src/lib/distro-info/suse-11.3_x86_64/prereqfiles/etc/group
new file mode 100644
index 00000000..505cb221
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3_x86_64/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/src/lib/distro-info/suse-11.3_x86_64/prereqfiles/etc/hosts b/src/lib/distro-info/suse-11.3_x86_64/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3_x86_64/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/suse-11.3_x86_64/prereqfiles/etc/passwd b/src/lib/distro-info/suse-11.3_x86_64/prereqfiles/etc/passwd
new file mode 100644
index 00000000..9b8fc4fe
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3_x86_64/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/src/lib/distro-info/suse-11.3_x86_64/prereqfiles/etc/shadow b/src/lib/distro-info/suse-11.3_x86_64/prereqfiles/etc/shadow
new file mode 100644
index 00000000..cd100a5a
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3_x86_64/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/src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc b/src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc
new file mode 100644
index 00000000..ac75d62a
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-0dfb3188-41ed929b.asc
@@ -0,0 +1,17 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (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/src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc b/src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc
new file mode 100644
index 00000000..57a9078a
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-307e3d54-481f30aa.asc
@@ -0,0 +1,13 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+mIsERCAdXQEEAL7MrBTz+3SBWpCm2ae2yaDqV3ezQcs2JlvqidJVhsZqQe9/jkxi
+KTEQW5+TXF/+BlQSiebunRI7oo3+9U8GyRCgs1sf+yRQWMLzZqRaarzRhw9w+Ihl
+edtqYl6/U2JZCb8Adp6d7RzlRliJdJ/VtsfXj2ef7Dwu7elOVSsmaBdtAAYptChT
+dVNFIFBhY2thZ2UgU2lnbmluZyBLZXkgPGJ1aWxkQHN1c2UuZGU+iLgEEwECACIC
+GwMECwcDAgMVAgMDFgIBAh4BAheABQJIHzCqBQkHwXpNAAoJEOOlw2Awfj1UvWgE
+AIRoxE8S6jQB7S43SVcX06FHJeUJ/m+1ErIj9LwJTYrR/8qsDjTgrttgb+nBHkIj
+NhCCLAuR8sWj3CxsUMH2fayryNnwZEWGqnzo7Jtt4R1Ur3h5pHYonFjfoJyFUZjJ
+7Mhw7/TuOWx20FrzqBi8tbHx8pd7Fa5lCUgopVtMh6GR
+=R56j
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc b/src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc
new file mode 100644
index 00000000..80380d2f
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-3d25d3d9-36e12d04.asc
@@ -0,0 +1,30 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (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/src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-3dbdc284-49144c3f.asc b/src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-3dbdc284-49144c3f.asc
new file mode 100644
index 00000000..aaec909b
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-3dbdc284-49144c3f.asc
@@ -0,0 +1,19 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+mQENBEkUTD8BCADWLy5d5IpJedHQQSXkC1VK/oAZlJEeBVpSZjMCn8LiHaI9Wq3G
+3Vp6wvsP1b3kssJGzVFNctdXt5tjvOLxvrEfRJuGfqHTKILByqLzkeyWawbFNfSQ
+93/8OunfSTXC1Sx3hgsNXQuOrNVKrDAQUqT620/jj94xNIg09bLSxsjN6EeTvyiO
+mtE9H1J03o9tY6meNL/gcQhxBvwuo205np0JojYBP0pOfN8l9hnIOLkA0yu4ZXig
+oKOVmf4iTjX4NImIWldT+UaWTO18NWcCrujtgHueytwYLBNV5N0oJIP2VYuLZfSD
+VYuPllv7c6O2UEOXJsdbQaVuzU1HLocDyipnABEBAAG0NG9wZW5TVVNFIFByb2pl
+Y3QgU2lnbmluZyBLZXkgPG9wZW5zdXNlQG9wZW5zdXNlLm9yZz6JATwEEwECACYF
+AkkUTD8CGwMFCQPCZwAGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRC4iy/UPb3C
+hIE9B/9DUwwQ5c+8xW0x2Fli5Yn1P+4Wq3nmB+ZTpM5Q1a7A2l+HhpUBsnwx2e/4
+RuXlJ06uYby8UpXCli44jXFepJgiXp7ZRPX5A06aY9Pz0wawsMtYQS716+vSV3e3
+ynZmTGKxj8Z94TEVcEjMP1/XpjW22DcpItRJX2VCW7lUXDmRfQzBEolcfwlF7a1B
+VcSqGZX8JvuTocLX/+fYBhZYQvERw6PUVGoEskMXMoRg6PqWMesW9Bq3cm8oeBa2
+4YmGLkN2ztBIbqRMSv0binKcddHHvRlxVFRXrnnlXrEPKrx9Fbu4vkqrG+EKE6+v
+GO73ROyEcJuuoJTYsKPx6Uic5gRl
+=guZP
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-56b4177a-47965b33.asc b/src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-56b4177a-47965b33.asc
new file mode 100644
index 00000000..f0bb55a3
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-56b4177a-47965b33.asc
@@ -0,0 +1,19 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+mQGiBEeWWzMRBADU8l2IckSzgdUS1dn0WMM7wXK4seoFsHHQw/0unHCQCxpyDMnn
+TKV86p5KTbR1FDdeaZlY0yCV+IGsiIxLyuUdJn8vuA5gA5ZkUr89/HtWaeZVl77J
+HIQxvhDRBWCOO4QNtrZYWvGbvl83wl/zOfdLEs8IGElt0LgfohyTA1qfrwCg/Hac
+tDDscXsPlo5Jek/+3RHVeD0D/30riCpfpLJOmhraLg1EbWsE0mN9IQsl+WDPdoYo
+bB76z6eH3e38618WzP/LTG4WuVbwpSSqmXyfdVpXxWzESfT8q0B8CGpHf/Sa/T/L
+emohmRnLvkf/tAfxFmDMm1jOewJIE9S35jANGHVJcxmfRNpPWC7uHnqjopnsmDkL
+kMEdBAC6YcpDOcMJZ9sJbt/JNZBaoT5CltgMDlSN50t2v/J5em8qMLqCSNF5UJyd
+LFnePHTHy6gVjWbqcC0ncFzOqM1y644Up7BoKSAr1hRTl6Mw9S3UfZZZ0al3JtWt
+8y0eFIW3QP66w1AL0LO2bZMBuOvhb63DXv5iHorcxk0yIFbbybRCb3BlblNVU0U6
+RmFjdG9yeSBPQlMgUHJvamVjdCA8b3BlblNVU0U6RmFjdG9yeUBidWlsZC5vcGVu
+c3VzZS5vcmc+iGYEExECACYFAkeWWzMCGwMFCQQesAAGCwkIBwMCBBUCCAMEFgID
+AQIeAQIXgAAKCRAcchwkVrQXevBsAKCOeScnlH2fWVBJGHTOVJ3M4yBqDACbBeNk
+PuWo05AOQ3M1dLE1hkN36G+IRgQTEQIABgUCR5ZbMwAKCRA7MBG3a51lI7PfAKCc
+9ZtKfI5G/g66V7pSMXh9gi+ykgCgivPfGMDh9HIROwBIudo2qGImOqI=
+=htdw
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc b/src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc
new file mode 100644
index 00000000..74ff59e0
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-7e2e3b05-4816488f.asc
@@ -0,0 +1,20 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+mQGiBER0iroRBADfqUeJmPCXqPJFnf3CVKy40dL1F+gfvP+JHN7/uu4c9+oCYjI1
+uAE8iGTm/Twb/Zzbs4dt0iWjhNFXbRi42rMww4d/8QcPYZ21WSehh+fv8nCjt2sw
+LeC87ar2SR8OTpJBK0fQlcd4e6H5GMntfI6SYEUOPd8m/eQ+4+1AxpUUpwCgswaF
+13fePZGI//pDn5tGjbvmaP8D/R3qum/I+oDS8lbFeeDS10GkEkwTYec13gdfsq6I
+yzIj7VBsC+rGfbipv+VGR61Q4d19pOHKLDekr9OG+3G4ZcYM4NQvQZR+QIlp3xWu
+nBmYD1LRkHLVj+Z4DGQhjjOffkPSuacKPymMaZ/aRiLgTIAo97W2YPhutscXrLSG
+2Y+BA/4jsyaDb7kbW4wc8RtPIcuFEheVqgBeRakP9Uj47kBMBEpPtI/mIdY5liKk
+ztKnuQG6ROYLNV/PW0ZbE1uT64C710weh4cB3PnZLV5P10deDLBjHk8MJQGCTSDD
+JYvhutUzQfshAU6j2kErGvKdZxWGezab34vFyMP2oLGqswPAJrRQTm92ZWxsIFBy
+b3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20pIDxub3ZlbGwt
+cHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6IZgQTEQIAJgIbAwYLCQgHAwIEFQIIAwQW
+AgMBAh4BAheABQJIFkiPBQkHhmvVAAoJEBTCi8l+LjsFn4QAn2wgOHudNubNZvTz
+NdaYJKJ0m2qnAJ9hd0nQBhn28H4Ii4a4h7kpGWRxN4hGBBMRAgAGBQJEexD/AAoJ
+EKhO2uicgArKFLwAn0B+g2mJ5n8LrBziTQ5SjnSPyDBXAJwJoYTta5Sfw/3vVGpU
+fJAKVDoB9w==
+=MWDN
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc b/src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc
new file mode 100644
index 00000000..daeef8a5
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-9c800aca-481f343a.asc
@@ -0,0 +1,37 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (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
+YWdlIFNpZ25pbmcgS2V5IDxidWlsZEBzdXNlLmRlPohiBBMRAgAiAhsDBAsHAwID
+FQIDAxYCAQIeAQIXgAUCSB80OgUJEfKmuQAKCRCoTtronIAKyuJlAJ0cWZifmBO6
+Eh71jattipdMhUYBTwCfSXbJJtuF3c96JPmpmT8be2LDo86IRgQQEQIABgUCOnBe
+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
+1dbriEwEGBECAAwFAkgfNGYFCRHyptQACgkQqE7a6JyACsrv3ACbBLhafFXmTjH3
+JJWFJGWuIOaZUosAniPs4feEyN46gjXGgcZc2Ai8nkm6
+=mY6G
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc b/src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc
new file mode 100644
index 00000000..8467c19b
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/gpg-pubkey-a1912208-446a0899.asc
@@ -0,0 +1,31 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.9 (GNU/Linux)
+
+mQILBERqCJkBEACdqhZWdAbUHLIumXMEgv+GFjr1ZzVHgynnFOzztU/8sxZNa9cm
+YV4HZpVfjMr7fos3ArzyiPPt/336cf7w9p79/ZS4rHSNPDMlPCtXYvFxUbvU0/GY
+q4jwcBsrJ0xaJ9CP5bWyAgVKOb7Y6k0ktaLjRR+tDfMsHA4H0ClMoRr6ATw8NL0e
+VCfAHuzqCKvX1If8ng+wTivtAhKvz/WwQiELNELmPfc5tZHOw8NgP/r0Pze18Hn2
+dlAHu0WpC7uoR00vscsMIJiJJPcsxbL1F1eADKnk+wEy8Go+EJeJ5i0WoFbqD52q
+Lv/C/oY6NVtVY0MBwtn+oQNSnQ4JBsB/Akdt53LAi0ZtNQxMyUW+76R8FCOmVCV8
+WGiF5CPRP0yvG80AMBjBjKjHb/v8ov5MnIyFimzAHS1gQcUNxTEYA/5eFwoYcGcK
+weGq9FUjPTzLQAgvp7XmOzHpSAfJ7qysxFTepNsSZZhgizJyInrdQldr+GYcUNqB
+krD9MWmFop975OxhCTEnNv/HcE79r8WD26HzDFYxTiTJbr0pU/ivBzo+rjq+YG2V
+stJk+udVYmZTnC4LmXus8JiNuqBXbxNscwCBpcJ8YcfCV6uh+7E0XfXZsgVUFLp1
+NF+ylYRGTycOlWoZODrnJevZW7N9O3bWRx/G2P4bJD07LsDLe4i5hymf5QAGKbRQ
+Tm92ZWxsIFByb3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20p
+IDxub3ZlbGwtcHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6JAjMEEwECAB0FAkRqCJkG
+CwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRBHijLooZEiCKSFD/93vZHCAMLEfksU
+KnvXl08bv1rfuamuyJnE3ANRE5RDyypriHMCnkVxazvQ2WI4W4UEjluL9+SzZwtV
+ZvKVoAr31614nSyWwv2YnJTHfjMG+xRlkolZMnuIiB9PcCBo9+GPU0ABuzo4pEJW
+NIRoSS1NFbAZBhtUnY0cN+trM5QObLl7xXTavLyGk//blkk57fov7GXsQJlZUig0
+l2yt5XNyGpLUnTMDumHh8b389quF+0+ZfdwOy7A768xjipAZiTvIujBrEv51wrxh
+0HBT0VGA0MhD9t0B+Ce4BM9P/iVMO00naaOp6PqMfPPKxQQqer8qy1i6UWBx95SY
+mKZBIvOm2d9PezDxkckCu61r6krx1iKnT1wdprCAkIYwALK118SpbxuyGW0bhRHc
+wsc/akzWH72fS0Xu49mvL4k4A2U9asdeQid3dMgbtm5mSWof0yiU/G4YNn0yeXoY
+oG1VbCAqQbFX1Rvd6GITJVqI+ekW/uMA9BP78dF8wBeG0+QmpQnSf+eOsxB/RT8o
+Kb4hHY+29MUlg+i9ceVt7hoKr03J/uIG5TXFXRYLaI0iAFVlKfWxpqDfS2XA4+dD
+VYt+5RDgBcnxDaTB4FE9GqcYScNfe7+NFtL0p0wOPftbmgZzGjucTmrD8mDUNdqA
+xGK7vlk4GATSfOQlq7G6LXW6RYnInohGBBMRAgAGBQJEazMlAAoJEKhO2uicgArK
+2vMAn0TbVDESEVKVuFZStrfIzOvJQrR9AJsH733Ju1kE99GFrdfCeGqpckmNhg==
+=E+qN
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/pubring.gpg b/src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/pubring.gpg
new file mode 100644
index 00000000..5bd5a78e
--- /dev/null
+++ b/src/lib/distro-info/suse-11.3_x86_64/trusted-package-keys/pubring.gpg
Binary files differ
diff --git a/src/lib/distro-info/ubuntu-10.04/mirrors/base b/src/lib/distro-info/ubuntu-10.04/mirrors/base
new file mode 100644
index 00000000..cddbef70
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-10.04/mirrors/base
@@ -0,0 +1,162 @@
+http://archive.ubuntu.com.ba/ubuntu
+http://archive.ubuntu.com/ubuntu
+ftp://br.archive.ubuntu.com/ubuntu
+ftp://bw.archive.ubuntu.com/ubuntu
+http://cl.archive.ubuntu.com/ubuntu
+http://cudlug.cudenver.edu/ubuntu
+http://cz.archive.ubuntu.com/ubuntu
+ftp://darkstar.ist.utl.pt/pub/ubuntu/archive
+http://darkstar.ist.utl.pt/ubuntu/archive
+http://de.archive.ubuntu.com/ubuntu
+http://debian.charite.de/ubuntu
+http://debian.linux.org.tw/ubuntu
+http://dk.archive.ubuntu.com/ubuntu
+http://es.archive.ubuntu.com/ubuntu
+http://espelhos.edugraf.ufsc.br/ubuntu
+ftp://free.nchc.org.tw/ubuntu
+http://ftp-stud.fht-esslingen.de/Mirrors/ubuntu
+http://ftp-stud.hs-esslingen.de/ubuntu
+http://ftp.belnet.be/linux/ubuntu/ubuntu
+http://ftp.belnet.be/pub/mirror/ubuntu.com/ubuntu
+http://ftp.caliu.info/pub/distribucions/ubuntu/ubuntu
+http://ftp.chg.ru/pub/Linux/ubuntu/archive
+ftp://ftp.ciril.fr/pub/linux/ubuntu/archives
+http://ftp.citylink.co.nz/ubuntu
+http://ftp.crihan.fr/ubuntu
+ftp://ftp.cw.net/pub/linux/ftp.ubuntu.com/ubuntu
+http://ftp.cw.net/ubuntu
+http://ftp.dateleco.es/ubuntu
+http://ftp.dei.uc.pt/pub/linux/ubuntu/archive
+http://ftp.duth.gr/pub/ubuntu
+http://ftp.ecc.u-tokyo.ac.jp/ubuntu
+http://ftp.estpak.ee/ubuntu
+ftp://ftp.free.fr/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.freepark.org/ubuntu
+ftp://ftp.fu-berlin.de/linux/ubuntu
+ftp://ftp.funet.fi/pub/mirrors/archive.ubuntu.com
+http://ftp.gil.di.uminho.pt/ubuntu
+ftp://ftp.gtlib.gatech.edu/pub/ubuntu
+http://ftp.gui.uva.es/sites/ubuntu.com/ubuntu
+http://ftp.heanet.ie/pub/ubuntu
+http://ftp.hosteurope.de/mirror/archive.ubuntu.com
+ftp://ftp.iinet.net.au/pub/ubuntu
+ftp://ftp.iitm.ac.in/ubuntu
+http://ftp.kaist.ac.kr/pub/ubuntu
+http://ftp.kfki.hu/linux/ubuntu
+ftp://ftp.kfki.hu/pub/linux/ubuntu
+http://ftp.leg.uct.ac.za/pub/linux/ubuntu
+http://ftp.linux.edu.lv/ubuntu
+ftp://ftp.linux.org.tr/pub/ubuntu
+http://ftp.lug.ro/ubuntu
+ftp://ftp.man.szczecin.pl/pub/Linux/ubuntu
+ftp://ftp.mipt.ru/mirror/ubuntu
+ftp://ftp.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://ftp.netspace.net.au/pub/ubuntu
+http://ftp.ntua.gr/pub/linux/ubuntu
+ftp://ftp.oleane.net/ubuntu
+ftp://ftp.otenet.gr/ubuntu
+http://ftp.port80.se/ubuntu
+http://ftp.pwr.wroc.pl/ubuntu
+ftp://ftp.rrzn.uni-hannover.de/pub/mirror/linux/ubuntu
+ftp://ftp.science.nus.edu.sg/pub/ubuntu
+http://ftp.science.nus.edu.sg/ubuntu
+http://ftp.stw-bonn.de/ubuntu
+http://ftp.ticklers.org/archive.ubuntu.org/ubuntu
+ftp://ftp.tiscali.nl/pub/mirror/ubuntu
+http://ftp.tiscali.nl/ubuntu
+http://ftp.tu-chemnitz.de/pub/linux/ubuntu
+ftp://ftp.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://ftp.tuke.sk/ubuntu
+http://ftp.twaren.net/Linux/Ubuntu/ubuntu
+http://ftp.u-picardie.fr/mirror/ubuntu/ubuntu
+ftp://ftp.uasw.edu/linux/ubuntu/archive
+http://ftp.ucr.ac.cr/ubuntu
+http://ftp.udc.es/ubuntu
+http://ftp.uni-kl.de/pub/linux/ubuntu
+http://ftp.uni-muenster.de/pub/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.unina.it/pub/linux/distributions/ubuntu
+http://ftp.uninett.no/ubuntu
+http://ftp.usf.edu/pub/ubuntu
+http://ftp.ussg.iu.edu/linux/ubuntu
+ftp://ftp.vectranet.pl/ubuntu
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/archives
+ftp://ftpserv.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://gd.tuwien.ac.at/opsys/linux/ubuntu/archive
+http://godel.cs.bilgi.edu.tr/ubuntu
+http://gulus.USherbrooke.ca/ubuntu
+http://hr.archive.ubuntu.com/ubuntu
+http://ie.archive.ubuntu.com/ubuntu
+http://klid.dk/ftp/ubuntu
+ftp://klid.dk/ubuntu
+http://kr.archive.ubuntu.com/ubuntu
+http://lug.mtu.edu/ubuntu
+http://mir1.ovh.net/ubuntu
+http://mirror.anl.gov/pub/ubuntu
+http://mirror.cc.columbia.edu/pub/linux/ubuntu/archive
+http://mirror.cs.umn.edu/ubuntu
+http://mirror.hgkz.ch/ubuntu
+http://mirror.imbrandon.com/ubuntu
+http://mirror.lcsee.wvu.edu/ubuntu
+http://mirror.letsopen.com/os/ubuntu
+http://mirror.lupaworld.com/ubuntu/archive
+http://mirror.nttu.edu.tw/ubuntu
+http://mirror.optus.net/ubuntu
+http://mirror.ox.ac.uk/sites/archive.ubuntu.com/ubuntu
+http://mirror.pacific.net.au/linux/ubuntu
+http://mirror.rootguide.org/ubuntu
+http://mirror.switch.ch/ftp/mirror/ubuntu
+ftp://mirror.switch.ch/mirror/ubuntu
+http://mirror.uni-c.dk/ubuntu
+http://mirror.utdlug.org/linux/distributions/ubuntu/packages
+http://mirrors.cat.pdx.edu/ubuntu
+http://mirrors.ccs.neu.edu/archive.ubuntu.com
+ftp://mirrors.ccs.neu.edu/net/mirrors/archive.ubuntu.com
+http://mirrors.cs.wmich.edu/ubuntu
+ftp://mirrors.easynews.com/linux/ubuntu
+http://mirrors.kernel.org/ubuntu
+http://mirrors.nic.funet.fi/ubuntu
+http://mirrors.shlug.org/ubuntu
+ftp://mirrors.virginmedia.com/mirrors/ubuntu/archive
+http://mirrors.xmission.com/ubuntu
+http://mt.archive.ubuntu.com/ubuntu
+http://na.mirror.garr.it/mirrors/ubuntu-archive
+ftp://neacm.fe.up.pt/pub/ubuntu
+http://neacm.fe.up.pt/ubuntu
+http://nl.archive.ubuntu.com/ubuntu
+http://nl2.archive.ubuntu.com/ubuntu
+http://nz2.archive.ubuntu.com/ubuntu
+http://packages.midian.hu//pub/linux/distributions/ubuntu
+http://se.archive.ubuntu.com/ubuntu
+http://sft.if.usp.br/ubuntu
+http://snert.mi.hs-heilbronn.de/pub/ubuntu/ubuntu
+http://sunsite.informatik.rwth-aachen.de/ftp/pub/Linux/ubuntu/ubuntu
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/ubuntu/ubuntu
+http://tezcatl.fciencias.unam.mx/ubuntu
+http://th.archive.ubuntu.com/ubuntu
+ftp://tw.archive.ubuntu.com/ubuntu
+http://ubuntu-archive.datahop.it/ubuntu
+http://ubuntu.c3sl.ufpr.br/ubuntu
+http://ubuntu.cn99.com/ubuntu
+http://ubuntu.cs.utah.edu/ubuntu
+http://ubuntu.csie.nctu.edu.tw/ubuntu
+http://ubuntu.eriders.ge/ubuntu
+http://ubuntu.fastbull.org/ubuntu
+http://ubuntu.indika.net.id/ubuntu
+http://ubuntu.inode.at/ubuntu
+http://ubuntu.intergenia.de/ubuntu
+http://ubuntu.ipacct.com/ubuntu
+http://ubuntu.lhi.is/ubuntu
+http://ubuntu.linux-bg.org/ubuntu
+http://ubuntu.mirror.frontiernet.net/ubuntu
+http://ubuntu.mirror.rafal.ca/ubuntu
+http://ubuntu.mirrors.skynet.be/pub/ubuntu.com/ubuntu
+http://ubuntu.snet.uz/ubuntu
+http://ubuntu.supp.name/ubuntu
+http://ubuntu.task.gda.pl/ubuntu
+http://ubuntu.univ-nantes.fr/ubuntu
+http://ubuntu.uz/ubuntu
+http://ubuntu.ynet.sk/ubuntu
+http://www.gtlib.gatech.edu/pub/ubuntu
+http://www.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://www.nic.funet.fi/pub/mirrors/archive.ubuntu.com
+ftp://yu.archive.ubuntu.com/ubuntu
diff --git a/src/lib/distro-info/ubuntu-10.04/mirrors/base_security b/src/lib/distro-info/ubuntu-10.04/mirrors/base_security
new file mode 100644
index 00000000..3617b3dd
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-10.04/mirrors/base_security
@@ -0,0 +1,162 @@
+http://archive.ubuntu.com.ba/ubuntu
+http://archive.ubuntu.com/ubuntu
+http://br.archive.ubuntu.com/ubuntu
+http://bw.archive.ubuntu.com/ubuntu
+http://cl.archive.ubuntu.com/ubuntu
+http://cudlug.cudenver.edu/ubuntu
+ftp://cz.archive.ubuntu.com/MIRRORS/archive.ubuntu.com/mirror/ubuntu
+http://cz.archive.ubuntu.com/ubuntu
+ftp://darkstar.ist.utl.pt/pub/ubuntu/archive
+http://darkstar.ist.utl.pt/ubuntu/archive
+http://de.archive.ubuntu.com/ubuntu
+http://debian.charite.de/ubuntu
+http://debian.linux.org.tw/ubuntu
+http://dk.archive.ubuntu.com/ubuntu
+http://es.archive.ubuntu.com/ubuntu
+http://espelhos.edugraf.ufsc.br/ubuntu
+http://free.nchc.org.tw/ubuntu
+http://ftp-stud.fht-esslingen.de/Mirrors/ubuntu
+http://ftp-stud.hs-esslingen.de/ubuntu
+http://ftp.belnet.be/linux/ubuntu/ubuntu
+http://ftp.belnet.be/pub/mirror/ubuntu.com/ubuntu
+http://ftp.caliu.info/pub/distribucions/ubuntu/ubuntu
+http://ftp.chg.ru/pub/Linux/ubuntu/archive
+ftp://ftp.ciril.fr/pub/linux/ubuntu/archives
+http://ftp.citylink.co.nz/ubuntu
+http://ftp.crihan.fr/ubuntu
+ftp://ftp.cw.net/pub/linux/ftp.ubuntu.com/ubuntu
+http://ftp.cw.net/ubuntu
+http://ftp.dateleco.es/ubuntu
+http://ftp.dei.uc.pt/pub/linux/ubuntu/archive
+http://ftp.duth.gr/pub/ubuntu
+http://ftp.ecc.u-tokyo.ac.jp/ubuntu
+http://ftp.estpak.ee/ubuntu
+ftp://ftp.free.fr/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.freepark.org/ubuntu
+ftp://ftp.fu-berlin.de/linux/ubuntu
+ftp://ftp.funet.fi/pub/mirrors/archive.ubuntu.com
+http://ftp.gil.di.uminho.pt/ubuntu
+http://ftp.gui.uva.es/sites/ubuntu.com/ubuntu
+http://ftp.halifax.rwth-aachen.de/ubuntu
+http://ftp.heanet.ie/pub/ubuntu
+http://ftp.hosteurope.de/mirror/archive.ubuntu.com
+http://ftp.iinet.net.au/pub/ubuntu
+http://ftp.iitm.ac.in/ubuntu
+http://ftp.kaist.ac.kr/pub/ubuntu
+http://ftp.kfki.hu/linux/ubuntu
+ftp://ftp.kfki.hu/pub/linux/ubuntu
+http://ftp.leg.uct.ac.za/pub/linux/ubuntu
+http://ftp.linux.edu.lv/ubuntu
+http://ftp.lug.ro/ubuntu
+ftp://ftp.man.szczecin.pl/pub/Linux/ubuntu
+ftp://ftp.mipt.ru/mirror/ubuntu
+ftp://ftp.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://ftp.netspace.net.au/pub/ubuntu
+http://ftp.ntua.gr/pub/linux/ubuntu
+ftp://ftp.oleane.net/ubuntu
+ftp://ftp.otenet.gr/ubuntu
+http://ftp.pwr.wroc.pl/ubuntu
+ftp://ftp.rrzn.uni-hannover.de/pub/mirror/linux/ubuntu
+http://ftp.science.nus.edu.sg/ubuntu
+http://ftp.stw-bonn.de/ubuntu
+http://ftp.ticklers.org/archive.ubuntu.org/ubuntu
+ftp://ftp.tiscali.nl/pub/mirror/ubuntu
+http://ftp.tiscali.nl/ubuntu
+http://ftp.tu-chemnitz.de/pub/linux/ubuntu
+ftp://ftp.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://ftp.tuke.sk/ubuntu
+http://ftp.twaren.net/Linux/Ubuntu/ubuntu
+http://ftp.u-picardie.fr/mirror/ubuntu/ubuntu
+ftp://ftp.uasw.edu/linux/ubuntu/archive
+http://ftp.ucr.ac.cr/ubuntu
+http://ftp.udc.es/ubuntu
+http://ftp.uni-kl.de/pub/linux/ubuntu
+http://ftp.uni-muenster.de/pub/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.unina.it/pub/linux/distributions/ubuntu
+http://ftp.uninett.no/ubuntu
+http://ftp.usf.edu/pub/ubuntu
+http://ftp.ussg.iu.edu/linux/ubuntu
+ftp://ftp.vectranet.pl/ubuntu
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/archives
+ftp://ftpserv.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://gd.tuwien.ac.at/opsys/linux/ubuntu/archive
+http://godel.cs.bilgi.edu.tr/ubuntu
+http://gulus.USherbrooke.ca/ubuntu
+http://hr.archive.ubuntu.com/ubuntu
+http://ie.archive.ubuntu.com/ubuntu
+http://kr.archive.ubuntu.com/ubuntu
+http://lug.mtu.edu/ubuntu
+http://mir1.ovh.net/ubuntu
+http://mirror.anl.gov/pub/ubuntu
+http://mirror.cc.columbia.edu/pub/linux/ubuntu/archive
+http://mirror.cs.umn.edu/ubuntu
+http://mirror.hgkz.ch/ubuntu
+http://mirror.imbrandon.com/ubuntu
+http://mirror.lcsee.wvu.edu/ubuntu
+http://mirror.letsopen.com/os/ubuntu
+http://mirror.lupaworld.com/ubuntu/archive
+http://mirror.nttu.edu.tw/ubuntu
+http://mirror.optus.net/ubuntu
+http://mirror.ox.ac.uk/sites/archive.ubuntu.com/ubuntu
+http://mirror.pacific.net.au/linux/ubuntu
+http://mirror.rootguide.org/ubuntu
+http://mirror.switch.ch/ftp/mirror/ubuntu
+ftp://mirror.switch.ch/mirror/ubuntu
+http://mirror.uni-c.dk/ubuntu
+http://mirror.utdlug.org/linux/distributions/ubuntu/packages
+http://mirror2.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirrors.cat.pdx.edu/ubuntu
+http://mirrors.ccs.neu.edu/archive.ubuntu.com
+http://mirrors.cs.wmich.edu/ubuntu
+http://mirrors.easynews.com/linux/ubuntu
+http://mirrors.kernel.org/ubuntu
+http://mirrors.nic.funet.fi/ubuntu
+http://mirrors.shlug.org/ubuntu
+ftp://mirrors.virginmedia.com/mirrors/ubuntu/archive
+http://mirrors.xmission.com/ubuntu
+http://mt.archive.ubuntu.com/ubuntu
+http://na.mirror.garr.it/mirrors/ubuntu-archive
+ftp://neacm.fe.up.pt/pub/ubuntu
+http://neacm.fe.up.pt/ubuntu
+http://nl.archive.ubuntu.com/ubuntu
+http://nl2.archive.ubuntu.com/ubuntu
+http://nz2.archive.ubuntu.com/ubuntu
+http://packages.midian.hu//pub/linux/distributions/ubuntu
+http://se.archive.ubuntu.com/ubuntu
+http://sft.if.usp.br/ubuntu
+http://snert.mi.hs-heilbronn.de/pub/ubuntu/ubuntu
+http://sunsite.informatik.rwth-aachen.de/ftp/pub/Linux/ubuntu/ubuntu
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/ubuntu/ubuntu
+http://tezcatl.fciencias.unam.mx/ubuntu
+http://th.archive.ubuntu.com/ubuntu
+http://tw.archive.ubuntu.com/ubuntu
+http://ubuntu-archive.datahop.it/ubuntu
+http://ubuntu.c3sl.ufpr.br/ubuntu
+http://ubuntu.cn99.com/ubuntu
+http://ubuntu.cs.uaf.edu/ubuntu
+http://ubuntu.cs.utah.edu/ubuntu
+http://ubuntu.csie.nctu.edu.tw/ubuntu
+http://ubuntu.eriders.ge/ubuntu
+http://ubuntu.fastbull.org/ubuntu
+http://ubuntu.indika.net.id/ubuntu
+http://ubuntu.inode.at/ubuntu
+http://ubuntu.intergenia.de/ubuntu
+http://ubuntu.ipacct.com/ubuntu
+http://ubuntu.lhi.is/ubuntu
+http://ubuntu.linux-bg.org/ubuntu
+http://ubuntu.mirror.ac.za/ubuntu-archive
+http://ubuntu.mirror.frontiernet.net/ubuntu
+http://ubuntu.mirror.rafal.ca/ubuntu
+http://ubuntu.mirrors.skynet.be/pub/ubuntu.com/ubuntu
+http://ubuntu.org.ua/ubuntu
+http://ubuntu.snet.uz/ubuntu
+http://ubuntu.supp.name/ubuntu
+http://ubuntu.task.gda.pl/ubuntu
+http://ubuntu.univ-nantes.fr/ubuntu
+http://ubuntu.uz/ubuntu
+http://ubuntu.ynet.sk/ubuntu
+http://www.gtlib.gatech.edu/pub/ubuntu
+http://www.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://www.nic.funet.fi/pub/mirrors/archive.ubuntu.com
+http://wwwftp.ciril.fr/pub/linux/ubuntu/archives
+ftp://yu.archive.ubuntu.com/ubuntu
diff --git a/src/lib/distro-info/ubuntu-10.04/mirrors/base_updates b/src/lib/distro-info/ubuntu-10.04/mirrors/base_updates
new file mode 100644
index 00000000..3b936ecf
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-10.04/mirrors/base_updates
@@ -0,0 +1,171 @@
+http://archive.ubuntu.com.ba/ubuntu
+http://archive.ubuntu.com/ubuntu
+ftp://br.archive.ubuntu.com/ubuntu
+ftp://bw.archive.ubuntu.com/ubuntu
+http://cl.archive.ubuntu.com/ubuntu
+http://cudlug.cudenver.edu/ubuntu
+ftp://cz.archive.ubuntu.com/MIRRORS/archive.ubuntu.com/mirror/ubuntu
+http://cz.archive.ubuntu.com/ubuntu
+ftp://darkstar.ist.utl.pt/pub/ubuntu/archive
+http://darkstar.ist.utl.pt/ubuntu/archive
+http://de.archive.ubuntu.com/ubuntu
+http://debian.charite.de/ubuntu
+http://debian.linux.org.tw/ubuntu
+http://dk.archive.ubuntu.com/ubuntu
+http://es.archive.ubuntu.com/ubuntu
+http://espelhos.edugraf.ufsc.br/ubuntu
+ftp://free.nchc.org.tw/ubuntu
+http://ftp-stud.fht-esslingen.de/Mirrors/ubuntu
+http://ftp-stud.hs-esslingen.de/ubuntu
+http://ftp.belnet.be/linux/ubuntu/ubuntu
+http://ftp.belnet.be/pub/mirror/ubuntu.com/ubuntu
+http://ftp.caliu.info/pub/distribucions/ubuntu/ubuntu
+http://ftp.chg.ru/pub/Linux/ubuntu/archive
+ftp://ftp.ciril.fr/pub/linux/ubuntu/archives
+http://ftp.citylink.co.nz/ubuntu
+http://ftp.crihan.fr/ubuntu
+ftp://ftp.cw.net/pub/linux/ftp.ubuntu.com/ubuntu
+http://ftp.cw.net/ubuntu
+http://ftp.dateleco.es/ubuntu
+http://ftp.dei.uc.pt/pub/linux/ubuntu/archive
+http://ftp.duth.gr/pub/ubuntu
+http://ftp.ecc.u-tokyo.ac.jp/ubuntu
+http://ftp.estpak.ee/ubuntu
+ftp://ftp.free.fr/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.freepark.org/ubuntu
+ftp://ftp.fu-berlin.de/linux/ubuntu
+ftp://ftp.funet.fi/pub/mirrors/archive.ubuntu.com
+http://ftp.gil.di.uminho.pt/ubuntu
+ftp://ftp.gtlib.gatech.edu/pub/ubuntu
+http://ftp.gui.uva.es/sites/ubuntu.com/ubuntu
+http://ftp.halifax.rwth-aachen.de/ubuntu
+http://ftp.heanet.ie/pub/ubuntu
+http://ftp.hosteurope.de/mirror/archive.ubuntu.com
+ftp://ftp.iinet.net.au/pub/ubuntu
+ftp://ftp.iitm.ac.in/ubuntu
+http://ftp.kaist.ac.kr/pub/ubuntu
+http://ftp.kfki.hu/linux/ubuntu
+ftp://ftp.kfki.hu/pub/linux/ubuntu
+http://ftp.leg.uct.ac.za/pub/linux/ubuntu
+http://ftp.linux.edu.lv/ubuntu
+ftp://ftp.linux.org.tr/pub/ubuntu
+http://ftp.lug.ro/ubuntu
+ftp://ftp.man.szczecin.pl/pub/Linux/ubuntu
+ftp://ftp.mipt.ru/mirror/ubuntu
+ftp://ftp.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://ftp.netspace.net.au/pub/ubuntu
+http://ftp.ntua.gr/pub/linux/ubuntu
+ftp://ftp.oleane.net/ubuntu
+ftp://ftp.otenet.gr/ubuntu
+ftp://ftp.polytechnic.edu.na/pub/ubuntu
+http://ftp.port80.se/ubuntu
+http://ftp.pwr.wroc.pl/ubuntu
+ftp://ftp.rrzn.uni-hannover.de/pub/mirror/linux/ubuntu
+ftp://ftp.science.nus.edu.sg/pub/ubuntu
+http://ftp.science.nus.edu.sg/ubuntu
+http://ftp.stw-bonn.de/ubuntu
+http://ftp.ticklers.org/archive.ubuntu.org/ubuntu
+ftp://ftp.tiscali.nl/pub/mirror/ubuntu
+http://ftp.tiscali.nl/ubuntu
+http://ftp.tu-chemnitz.de/pub/linux/ubuntu
+ftp://ftp.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://ftp.tuke.sk/ubuntu
+http://ftp.twaren.net/Linux/Ubuntu/ubuntu
+http://ftp.u-picardie.fr/mirror/ubuntu/ubuntu
+ftp://ftp.uasw.edu/linux/ubuntu/archive
+http://ftp.ucr.ac.cr/ubuntu
+http://ftp.udc.es/ubuntu
+http://ftp.uni-kl.de/pub/linux/ubuntu
+http://ftp.uni-muenster.de/pub/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.unina.it/pub/linux/distributions/ubuntu
+http://ftp.uninett.no/ubuntu
+http://ftp.usf.edu/pub/ubuntu
+http://ftp.ussg.iu.edu/linux/ubuntu
+ftp://ftp.vectranet.pl/ubuntu
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/archives
+ftp://ftpserv.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://gd.tuwien.ac.at/opsys/linux/ubuntu/archive
+http://godel.cs.bilgi.edu.tr/ubuntu
+http://gulus.USherbrooke.ca/ubuntu
+http://hr.archive.ubuntu.com/ubuntu
+http://ie.archive.ubuntu.com/ubuntu
+http://klid.dk/ftp/ubuntu
+ftp://klid.dk/ubuntu
+http://kr.archive.ubuntu.com/ubuntu
+http://lug.mtu.edu/ubuntu
+http://mir1.ovh.net/ubuntu
+http://mirror.anl.gov/pub/ubuntu
+http://mirror.cc.columbia.edu/pub/linux/ubuntu/archive
+http://mirror.cs.umn.edu/ubuntu
+http://mirror.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirror.hgkz.ch/ubuntu
+http://mirror.imbrandon.com/ubuntu
+http://mirror.lcsee.wvu.edu/ubuntu
+http://mirror.letsopen.com/os/ubuntu
+http://mirror.lupaworld.com/ubuntu/archive
+http://mirror.nttu.edu.tw/ubuntu
+http://mirror.optus.net/ubuntu
+http://mirror.ox.ac.uk/sites/archive.ubuntu.com/ubuntu
+http://mirror.pacific.net.au/linux/ubuntu
+http://mirror.rootguide.org/ubuntu
+http://mirror.switch.ch/ftp/mirror/ubuntu
+ftp://mirror.switch.ch/mirror/ubuntu
+http://mirror.uni-c.dk/ubuntu
+http://mirror.utdlug.org/linux/distributions/ubuntu/packages
+http://mirror2.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirrors.cat.pdx.edu/ubuntu
+http://mirrors.ccs.neu.edu/archive.ubuntu.com
+ftp://mirrors.ccs.neu.edu/net/mirrors/archive.ubuntu.com
+http://mirrors.cs.wmich.edu/ubuntu
+ftp://mirrors.easynews.com/linux/ubuntu
+http://mirrors.kernel.org/ubuntu
+http://mirrors.nic.funet.fi/ubuntu
+http://mirrors.shlug.org/ubuntu
+ftp://mirrors.virginmedia.com/mirrors/ubuntu/archive
+http://mirrors.xmission.com/ubuntu
+http://mt.archive.ubuntu.com/ubuntu
+http://na.mirror.garr.it/mirrors/ubuntu-archive
+ftp://neacm.fe.up.pt/pub/ubuntu
+http://neacm.fe.up.pt/ubuntu
+http://nl.archive.ubuntu.com/ubuntu
+http://nl2.archive.ubuntu.com/ubuntu
+http://nz2.archive.ubuntu.com/ubuntu
+http://packages.midian.hu//pub/linux/distributions/ubuntu
+http://se.archive.ubuntu.com/ubuntu
+http://sft.if.usp.br/ubuntu
+http://snert.mi.hs-heilbronn.de/pub/ubuntu/ubuntu
+http://sunsite.informatik.rwth-aachen.de/ftp/pub/Linux/ubuntu/ubuntu
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/ubuntu/ubuntu
+http://tezcatl.fciencias.unam.mx/ubuntu
+http://th.archive.ubuntu.com/ubuntu
+ftp://tw.archive.ubuntu.com/ubuntu
+http://ubuntu-archive.datahop.it/ubuntu
+http://ubuntu.c3sl.ufpr.br/ubuntu
+http://ubuntu.cn99.com/ubuntu
+http://ubuntu.cs.uaf.edu/ubuntu
+http://ubuntu.cs.utah.edu/ubuntu
+http://ubuntu.csie.nctu.edu.tw/ubuntu
+http://ubuntu.eriders.ge/ubuntu
+http://ubuntu.fastbull.org/ubuntu
+http://ubuntu.indika.net.id/ubuntu
+http://ubuntu.inode.at/ubuntu
+http://ubuntu.intergenia.de/ubuntu
+http://ubuntu.ipacct.com/ubuntu
+http://ubuntu.lhi.is/ubuntu
+http://ubuntu.linux-bg.org/ubuntu
+ftp://ubuntu.mirror.ac.za/ubuntu-archive
+http://ubuntu.mirror.frontiernet.net/ubuntu
+http://ubuntu.mirror.rafal.ca/ubuntu
+http://ubuntu.mirrors.skynet.be/pub/ubuntu.com/ubuntu
+http://ubuntu.org.ua/ubuntu
+http://ubuntu.snet.uz/ubuntu
+http://ubuntu.supp.name/ubuntu
+http://ubuntu.task.gda.pl/ubuntu
+http://ubuntu.univ-nantes.fr/ubuntu
+http://ubuntu.uz/ubuntu
+http://ubuntu.ynet.sk/ubuntu
+http://www.gtlib.gatech.edu/pub/ubuntu
+http://www.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://www.nic.funet.fi/pub/mirrors/archive.ubuntu.com
+http://wwwftp.ciril.fr/pub/linux/ubuntu/archives
+ftp://yu.archive.ubuntu.com/ubuntu
diff --git a/src/lib/distro-info/ubuntu-10.04/prereqfiles/etc/hosts b/src/lib/distro-info/ubuntu-10.04/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-10.04/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/ubuntu-10.04/settings.default b/src/lib/distro-info/ubuntu-10.04/settings.default
new file mode 100644
index 00000000..acf37c4e
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-10.04/settings.default
@@ -0,0 +1,76 @@
+arch = i386
+package-subdir = pool
+prereq-packages = main/d/debootstrap/debootstrap_1.0.20_all.deb
+release-name = lucid
+<repository base>
+ components = main restricted
+ distribution = lucid
+ name = Ubuntu 10.04
+ repo-subdir = dists
+ file-for-speedtest = dists/lucid/main/binary-i386/Packages.bz2
+</repository>
+<repository base_security>
+ components = main restricted
+ distribution = lucid-security
+ name = Ubuntu 10.04 Security
+ repo-subdir = dists
+ file-for-speedtest = dists/lucid-security/main/binary-i386/Packages.bz2
+</repository>
+<repository base_updates>
+ components = main restricted
+ distribution = lucid-updates
+ name = Ubuntu 10.04 Updates
+ repo-subdir = dists
+ file-for-speedtest = dists/lucid-updates/main/binary-i386/Packages.bz2
+</repository>
+<selection minimal>
+ packages = <<END
+ language-pack-de
+ linux-image-generic
+ END
+</selection>
+<selection standard>
+ base = minimal
+ packages = <<END
+ ubuntu-standard
+ END
+</selection>
+<selection gnome>
+ base = minimal
+ packages = <<END
+ ubuntu-desktop
+ END
+</selection>
+<selection kde>
+ base = minimal
+ packages = <<END
+ kubuntu-desktop
+ END
+</selection>
+<selection xfce>
+ base = minimal
+ packages = <<END
+ xubuntu-desktop
+ END
+</selection>
+<selection edubuntu-server>
+ base = minimal
+ packages = <<END
+ edubuntu-server
+ END
+</selection>
+<selection edubuntu-gnome>
+ base = minimal
+ packages = <<END
+ edubuntu-desktop-gnome
+ END
+</selection>
+<selection edubuntu-kde>
+ base = minimal
+ packages = <<END
+ edubuntu-desktop-kde
+ END
+</selection>
+<selection default>
+ base = minimal
+</selection>
diff --git a/src/lib/distro-info/ubuntu-10.04/settings.example b/src/lib/distro-info/ubuntu-10.04/settings.example
new file mode 100644
index 00000000..31881c4c
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-10.04/settings.example
@@ -0,0 +1,23 @@
+# rename this file to 'settings' and edit it as you please
+#
+# for a list of all options, have a look at the corresponding
+# settings.default in /opt/openslx/share/distro-info
+
+# use local installation source
+#<repository base>
+# local-url = /srv/ftp/pub/ubuntu
+#</repository>
+#<repository base_updates>
+# local-url = /srv/ftp/pub/ubuntu
+#</repository>
+#<repository base_security>
+# local-url = /srv/ftp/pub/ubuntu
+#</repository>
+
+# add a new selection:
+#<selection my_kde>
+# base = kde
+# packages = <<END
+# kinternet
+# END
+#</selection>
diff --git a/src/lib/distro-info/ubuntu-8.04/mirrors/base b/src/lib/distro-info/ubuntu-8.04/mirrors/base
new file mode 100644
index 00000000..3b936ecf
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-8.04/mirrors/base
@@ -0,0 +1,171 @@
+http://archive.ubuntu.com.ba/ubuntu
+http://archive.ubuntu.com/ubuntu
+ftp://br.archive.ubuntu.com/ubuntu
+ftp://bw.archive.ubuntu.com/ubuntu
+http://cl.archive.ubuntu.com/ubuntu
+http://cudlug.cudenver.edu/ubuntu
+ftp://cz.archive.ubuntu.com/MIRRORS/archive.ubuntu.com/mirror/ubuntu
+http://cz.archive.ubuntu.com/ubuntu
+ftp://darkstar.ist.utl.pt/pub/ubuntu/archive
+http://darkstar.ist.utl.pt/ubuntu/archive
+http://de.archive.ubuntu.com/ubuntu
+http://debian.charite.de/ubuntu
+http://debian.linux.org.tw/ubuntu
+http://dk.archive.ubuntu.com/ubuntu
+http://es.archive.ubuntu.com/ubuntu
+http://espelhos.edugraf.ufsc.br/ubuntu
+ftp://free.nchc.org.tw/ubuntu
+http://ftp-stud.fht-esslingen.de/Mirrors/ubuntu
+http://ftp-stud.hs-esslingen.de/ubuntu
+http://ftp.belnet.be/linux/ubuntu/ubuntu
+http://ftp.belnet.be/pub/mirror/ubuntu.com/ubuntu
+http://ftp.caliu.info/pub/distribucions/ubuntu/ubuntu
+http://ftp.chg.ru/pub/Linux/ubuntu/archive
+ftp://ftp.ciril.fr/pub/linux/ubuntu/archives
+http://ftp.citylink.co.nz/ubuntu
+http://ftp.crihan.fr/ubuntu
+ftp://ftp.cw.net/pub/linux/ftp.ubuntu.com/ubuntu
+http://ftp.cw.net/ubuntu
+http://ftp.dateleco.es/ubuntu
+http://ftp.dei.uc.pt/pub/linux/ubuntu/archive
+http://ftp.duth.gr/pub/ubuntu
+http://ftp.ecc.u-tokyo.ac.jp/ubuntu
+http://ftp.estpak.ee/ubuntu
+ftp://ftp.free.fr/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.freepark.org/ubuntu
+ftp://ftp.fu-berlin.de/linux/ubuntu
+ftp://ftp.funet.fi/pub/mirrors/archive.ubuntu.com
+http://ftp.gil.di.uminho.pt/ubuntu
+ftp://ftp.gtlib.gatech.edu/pub/ubuntu
+http://ftp.gui.uva.es/sites/ubuntu.com/ubuntu
+http://ftp.halifax.rwth-aachen.de/ubuntu
+http://ftp.heanet.ie/pub/ubuntu
+http://ftp.hosteurope.de/mirror/archive.ubuntu.com
+ftp://ftp.iinet.net.au/pub/ubuntu
+ftp://ftp.iitm.ac.in/ubuntu
+http://ftp.kaist.ac.kr/pub/ubuntu
+http://ftp.kfki.hu/linux/ubuntu
+ftp://ftp.kfki.hu/pub/linux/ubuntu
+http://ftp.leg.uct.ac.za/pub/linux/ubuntu
+http://ftp.linux.edu.lv/ubuntu
+ftp://ftp.linux.org.tr/pub/ubuntu
+http://ftp.lug.ro/ubuntu
+ftp://ftp.man.szczecin.pl/pub/Linux/ubuntu
+ftp://ftp.mipt.ru/mirror/ubuntu
+ftp://ftp.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://ftp.netspace.net.au/pub/ubuntu
+http://ftp.ntua.gr/pub/linux/ubuntu
+ftp://ftp.oleane.net/ubuntu
+ftp://ftp.otenet.gr/ubuntu
+ftp://ftp.polytechnic.edu.na/pub/ubuntu
+http://ftp.port80.se/ubuntu
+http://ftp.pwr.wroc.pl/ubuntu
+ftp://ftp.rrzn.uni-hannover.de/pub/mirror/linux/ubuntu
+ftp://ftp.science.nus.edu.sg/pub/ubuntu
+http://ftp.science.nus.edu.sg/ubuntu
+http://ftp.stw-bonn.de/ubuntu
+http://ftp.ticklers.org/archive.ubuntu.org/ubuntu
+ftp://ftp.tiscali.nl/pub/mirror/ubuntu
+http://ftp.tiscali.nl/ubuntu
+http://ftp.tu-chemnitz.de/pub/linux/ubuntu
+ftp://ftp.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://ftp.tuke.sk/ubuntu
+http://ftp.twaren.net/Linux/Ubuntu/ubuntu
+http://ftp.u-picardie.fr/mirror/ubuntu/ubuntu
+ftp://ftp.uasw.edu/linux/ubuntu/archive
+http://ftp.ucr.ac.cr/ubuntu
+http://ftp.udc.es/ubuntu
+http://ftp.uni-kl.de/pub/linux/ubuntu
+http://ftp.uni-muenster.de/pub/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.unina.it/pub/linux/distributions/ubuntu
+http://ftp.uninett.no/ubuntu
+http://ftp.usf.edu/pub/ubuntu
+http://ftp.ussg.iu.edu/linux/ubuntu
+ftp://ftp.vectranet.pl/ubuntu
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/archives
+ftp://ftpserv.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://gd.tuwien.ac.at/opsys/linux/ubuntu/archive
+http://godel.cs.bilgi.edu.tr/ubuntu
+http://gulus.USherbrooke.ca/ubuntu
+http://hr.archive.ubuntu.com/ubuntu
+http://ie.archive.ubuntu.com/ubuntu
+http://klid.dk/ftp/ubuntu
+ftp://klid.dk/ubuntu
+http://kr.archive.ubuntu.com/ubuntu
+http://lug.mtu.edu/ubuntu
+http://mir1.ovh.net/ubuntu
+http://mirror.anl.gov/pub/ubuntu
+http://mirror.cc.columbia.edu/pub/linux/ubuntu/archive
+http://mirror.cs.umn.edu/ubuntu
+http://mirror.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirror.hgkz.ch/ubuntu
+http://mirror.imbrandon.com/ubuntu
+http://mirror.lcsee.wvu.edu/ubuntu
+http://mirror.letsopen.com/os/ubuntu
+http://mirror.lupaworld.com/ubuntu/archive
+http://mirror.nttu.edu.tw/ubuntu
+http://mirror.optus.net/ubuntu
+http://mirror.ox.ac.uk/sites/archive.ubuntu.com/ubuntu
+http://mirror.pacific.net.au/linux/ubuntu
+http://mirror.rootguide.org/ubuntu
+http://mirror.switch.ch/ftp/mirror/ubuntu
+ftp://mirror.switch.ch/mirror/ubuntu
+http://mirror.uni-c.dk/ubuntu
+http://mirror.utdlug.org/linux/distributions/ubuntu/packages
+http://mirror2.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirrors.cat.pdx.edu/ubuntu
+http://mirrors.ccs.neu.edu/archive.ubuntu.com
+ftp://mirrors.ccs.neu.edu/net/mirrors/archive.ubuntu.com
+http://mirrors.cs.wmich.edu/ubuntu
+ftp://mirrors.easynews.com/linux/ubuntu
+http://mirrors.kernel.org/ubuntu
+http://mirrors.nic.funet.fi/ubuntu
+http://mirrors.shlug.org/ubuntu
+ftp://mirrors.virginmedia.com/mirrors/ubuntu/archive
+http://mirrors.xmission.com/ubuntu
+http://mt.archive.ubuntu.com/ubuntu
+http://na.mirror.garr.it/mirrors/ubuntu-archive
+ftp://neacm.fe.up.pt/pub/ubuntu
+http://neacm.fe.up.pt/ubuntu
+http://nl.archive.ubuntu.com/ubuntu
+http://nl2.archive.ubuntu.com/ubuntu
+http://nz2.archive.ubuntu.com/ubuntu
+http://packages.midian.hu//pub/linux/distributions/ubuntu
+http://se.archive.ubuntu.com/ubuntu
+http://sft.if.usp.br/ubuntu
+http://snert.mi.hs-heilbronn.de/pub/ubuntu/ubuntu
+http://sunsite.informatik.rwth-aachen.de/ftp/pub/Linux/ubuntu/ubuntu
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/ubuntu/ubuntu
+http://tezcatl.fciencias.unam.mx/ubuntu
+http://th.archive.ubuntu.com/ubuntu
+ftp://tw.archive.ubuntu.com/ubuntu
+http://ubuntu-archive.datahop.it/ubuntu
+http://ubuntu.c3sl.ufpr.br/ubuntu
+http://ubuntu.cn99.com/ubuntu
+http://ubuntu.cs.uaf.edu/ubuntu
+http://ubuntu.cs.utah.edu/ubuntu
+http://ubuntu.csie.nctu.edu.tw/ubuntu
+http://ubuntu.eriders.ge/ubuntu
+http://ubuntu.fastbull.org/ubuntu
+http://ubuntu.indika.net.id/ubuntu
+http://ubuntu.inode.at/ubuntu
+http://ubuntu.intergenia.de/ubuntu
+http://ubuntu.ipacct.com/ubuntu
+http://ubuntu.lhi.is/ubuntu
+http://ubuntu.linux-bg.org/ubuntu
+ftp://ubuntu.mirror.ac.za/ubuntu-archive
+http://ubuntu.mirror.frontiernet.net/ubuntu
+http://ubuntu.mirror.rafal.ca/ubuntu
+http://ubuntu.mirrors.skynet.be/pub/ubuntu.com/ubuntu
+http://ubuntu.org.ua/ubuntu
+http://ubuntu.snet.uz/ubuntu
+http://ubuntu.supp.name/ubuntu
+http://ubuntu.task.gda.pl/ubuntu
+http://ubuntu.univ-nantes.fr/ubuntu
+http://ubuntu.uz/ubuntu
+http://ubuntu.ynet.sk/ubuntu
+http://www.gtlib.gatech.edu/pub/ubuntu
+http://www.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://www.nic.funet.fi/pub/mirrors/archive.ubuntu.com
+http://wwwftp.ciril.fr/pub/linux/ubuntu/archives
+ftp://yu.archive.ubuntu.com/ubuntu
diff --git a/src/lib/distro-info/ubuntu-8.04/mirrors/base_security b/src/lib/distro-info/ubuntu-8.04/mirrors/base_security
new file mode 100644
index 00000000..21789622
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-8.04/mirrors/base_security
@@ -0,0 +1,163 @@
+http://archive.ubuntu.com.ba/ubuntu
+http://archive.ubuntu.com/ubuntu
+http://br.archive.ubuntu.com/ubuntu
+http://bw.archive.ubuntu.com/ubuntu
+http://cl.archive.ubuntu.com/ubuntu
+http://cudlug.cudenver.edu/ubuntu
+ftp://cz.archive.ubuntu.com/MIRRORS/archive.ubuntu.com/mirror/ubuntu
+http://cz.archive.ubuntu.com/ubuntu
+ftp://darkstar.ist.utl.pt/pub/ubuntu/archive
+http://darkstar.ist.utl.pt/ubuntu/archive
+http://de.archive.ubuntu.com/ubuntu
+http://debian.charite.de/ubuntu
+http://debian.linux.org.tw/ubuntu
+http://dk.archive.ubuntu.com/ubuntu
+http://es.archive.ubuntu.com/ubuntu
+http://espelhos.edugraf.ufsc.br/ubuntu
+http://free.nchc.org.tw/ubuntu
+http://ftp-stud.fht-esslingen.de/Mirrors/ubuntu
+http://ftp-stud.hs-esslingen.de/ubuntu
+http://ftp.belnet.be/linux/ubuntu/ubuntu
+http://ftp.belnet.be/pub/mirror/ubuntu.com/ubuntu
+http://ftp.caliu.info/pub/distribucions/ubuntu/ubuntu
+http://ftp.chg.ru/pub/Linux/ubuntu/archive
+ftp://ftp.ciril.fr/pub/linux/ubuntu/archives
+http://ftp.citylink.co.nz/ubuntu
+http://ftp.crihan.fr/ubuntu
+ftp://ftp.cw.net/pub/linux/ftp.ubuntu.com/ubuntu
+http://ftp.cw.net/ubuntu
+http://ftp.dateleco.es/ubuntu
+http://ftp.dei.uc.pt/pub/linux/ubuntu/archive
+http://ftp.duth.gr/pub/ubuntu
+http://ftp.ecc.u-tokyo.ac.jp/ubuntu
+http://ftp.estpak.ee/ubuntu
+ftp://ftp.free.fr/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.freepark.org/ubuntu
+ftp://ftp.fu-berlin.de/linux/ubuntu
+ftp://ftp.funet.fi/pub/mirrors/archive.ubuntu.com
+http://ftp.gil.di.uminho.pt/ubuntu
+http://ftp.gui.uva.es/sites/ubuntu.com/ubuntu
+http://ftp.halifax.rwth-aachen.de/ubuntu
+http://ftp.heanet.ie/pub/ubuntu
+http://ftp.hosteurope.de/mirror/archive.ubuntu.com
+http://ftp.iinet.net.au/pub/ubuntu
+http://ftp.iitm.ac.in/ubuntu
+http://ftp.kaist.ac.kr/pub/ubuntu
+http://ftp.kfki.hu/linux/ubuntu
+ftp://ftp.kfki.hu/pub/linux/ubuntu
+http://ftp.leg.uct.ac.za/pub/linux/ubuntu
+http://ftp.linux.edu.lv/ubuntu
+http://ftp.lug.ro/ubuntu
+ftp://ftp.man.szczecin.pl/pub/Linux/ubuntu
+ftp://ftp.mipt.ru/mirror/ubuntu
+ftp://ftp.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://ftp.netspace.net.au/pub/ubuntu
+http://ftp.ntua.gr/pub/linux/ubuntu
+ftp://ftp.oleane.net/ubuntu
+ftp://ftp.otenet.gr/ubuntu
+http://ftp.pwr.wroc.pl/ubuntu
+ftp://ftp.rrzn.uni-hannover.de/pub/mirror/linux/ubuntu
+http://ftp.science.nus.edu.sg/ubuntu
+http://ftp.stw-bonn.de/ubuntu
+http://ftp.ticklers.org/archive.ubuntu.org/ubuntu
+ftp://ftp.tiscali.nl/pub/mirror/ubuntu
+http://ftp.tiscali.nl/ubuntu
+http://ftp.tu-chemnitz.de/pub/linux/ubuntu
+ftp://ftp.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://ftp.tuke.sk/ubuntu
+http://ftp.twaren.net/Linux/Ubuntu/ubuntu
+http://ftp.u-picardie.fr/mirror/ubuntu/ubuntu
+ftp://ftp.uasw.edu/linux/ubuntu/archive
+http://ftp.ucr.ac.cr/ubuntu
+http://ftp.udc.es/ubuntu
+http://ftp.uni-kl.de/pub/linux/ubuntu
+http://ftp.uni-muenster.de/pub/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.unina.it/pub/linux/distributions/ubuntu
+http://ftp.uninett.no/ubuntu
+http://ftp.usf.edu/pub/ubuntu
+http://ftp.ussg.iu.edu/linux/ubuntu
+ftp://ftp.vectranet.pl/ubuntu
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/archives
+ftp://ftpserv.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://gd.tuwien.ac.at/opsys/linux/ubuntu/archive
+http://godel.cs.bilgi.edu.tr/ubuntu
+http://gulus.USherbrooke.ca/ubuntu
+http://hr.archive.ubuntu.com/ubuntu
+http://ie.archive.ubuntu.com/ubuntu
+http://kr.archive.ubuntu.com/ubuntu
+http://lug.mtu.edu/ubuntu
+http://mir1.ovh.net/ubuntu
+http://mirror.anl.gov/pub/ubuntu
+http://mirror.cc.columbia.edu/pub/linux/ubuntu/archive
+http://mirror.cs.umn.edu/ubuntu
+http://mirror.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirror.hgkz.ch/ubuntu
+http://mirror.imbrandon.com/ubuntu
+http://mirror.lcsee.wvu.edu/ubuntu
+http://mirror.letsopen.com/os/ubuntu
+http://mirror.lupaworld.com/ubuntu/archive
+http://mirror.nttu.edu.tw/ubuntu
+http://mirror.optus.net/ubuntu
+http://mirror.ox.ac.uk/sites/archive.ubuntu.com/ubuntu
+http://mirror.pacific.net.au/linux/ubuntu
+http://mirror.rootguide.org/ubuntu
+http://mirror.switch.ch/ftp/mirror/ubuntu
+ftp://mirror.switch.ch/mirror/ubuntu
+http://mirror.uni-c.dk/ubuntu
+http://mirror.utdlug.org/linux/distributions/ubuntu/packages
+http://mirror2.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirrors.cat.pdx.edu/ubuntu
+http://mirrors.ccs.neu.edu/archive.ubuntu.com
+http://mirrors.cs.wmich.edu/ubuntu
+http://mirrors.easynews.com/linux/ubuntu
+http://mirrors.kernel.org/ubuntu
+http://mirrors.nic.funet.fi/ubuntu
+http://mirrors.shlug.org/ubuntu
+ftp://mirrors.virginmedia.com/mirrors/ubuntu/archive
+http://mirrors.xmission.com/ubuntu
+http://mt.archive.ubuntu.com/ubuntu
+http://na.mirror.garr.it/mirrors/ubuntu-archive
+ftp://neacm.fe.up.pt/pub/ubuntu
+http://neacm.fe.up.pt/ubuntu
+http://nl.archive.ubuntu.com/ubuntu
+http://nl2.archive.ubuntu.com/ubuntu
+http://nz2.archive.ubuntu.com/ubuntu
+http://packages.midian.hu//pub/linux/distributions/ubuntu
+http://se.archive.ubuntu.com/ubuntu
+http://sft.if.usp.br/ubuntu
+http://snert.mi.hs-heilbronn.de/pub/ubuntu/ubuntu
+http://sunsite.informatik.rwth-aachen.de/ftp/pub/Linux/ubuntu/ubuntu
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/ubuntu/ubuntu
+http://tezcatl.fciencias.unam.mx/ubuntu
+http://th.archive.ubuntu.com/ubuntu
+http://tw.archive.ubuntu.com/ubuntu
+http://ubuntu-archive.datahop.it/ubuntu
+http://ubuntu.c3sl.ufpr.br/ubuntu
+http://ubuntu.cn99.com/ubuntu
+http://ubuntu.cs.uaf.edu/ubuntu
+http://ubuntu.cs.utah.edu/ubuntu
+http://ubuntu.csie.nctu.edu.tw/ubuntu
+http://ubuntu.eriders.ge/ubuntu
+http://ubuntu.fastbull.org/ubuntu
+http://ubuntu.indika.net.id/ubuntu
+http://ubuntu.inode.at/ubuntu
+http://ubuntu.intergenia.de/ubuntu
+http://ubuntu.ipacct.com/ubuntu
+http://ubuntu.lhi.is/ubuntu
+http://ubuntu.linux-bg.org/ubuntu
+http://ubuntu.mirror.ac.za/ubuntu-archive
+http://ubuntu.mirror.frontiernet.net/ubuntu
+http://ubuntu.mirror.rafal.ca/ubuntu
+http://ubuntu.mirrors.skynet.be/pub/ubuntu.com/ubuntu
+http://ubuntu.org.ua/ubuntu
+http://ubuntu.snet.uz/ubuntu
+http://ubuntu.supp.name/ubuntu
+http://ubuntu.task.gda.pl/ubuntu
+http://ubuntu.univ-nantes.fr/ubuntu
+http://ubuntu.uz/ubuntu
+http://ubuntu.ynet.sk/ubuntu
+http://www.gtlib.gatech.edu/pub/ubuntu
+http://www.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://www.nic.funet.fi/pub/mirrors/archive.ubuntu.com
+http://wwwftp.ciril.fr/pub/linux/ubuntu/archives
+ftp://yu.archive.ubuntu.com/ubuntu
diff --git a/src/lib/distro-info/ubuntu-8.04/mirrors/base_updates b/src/lib/distro-info/ubuntu-8.04/mirrors/base_updates
new file mode 100644
index 00000000..3b936ecf
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-8.04/mirrors/base_updates
@@ -0,0 +1,171 @@
+http://archive.ubuntu.com.ba/ubuntu
+http://archive.ubuntu.com/ubuntu
+ftp://br.archive.ubuntu.com/ubuntu
+ftp://bw.archive.ubuntu.com/ubuntu
+http://cl.archive.ubuntu.com/ubuntu
+http://cudlug.cudenver.edu/ubuntu
+ftp://cz.archive.ubuntu.com/MIRRORS/archive.ubuntu.com/mirror/ubuntu
+http://cz.archive.ubuntu.com/ubuntu
+ftp://darkstar.ist.utl.pt/pub/ubuntu/archive
+http://darkstar.ist.utl.pt/ubuntu/archive
+http://de.archive.ubuntu.com/ubuntu
+http://debian.charite.de/ubuntu
+http://debian.linux.org.tw/ubuntu
+http://dk.archive.ubuntu.com/ubuntu
+http://es.archive.ubuntu.com/ubuntu
+http://espelhos.edugraf.ufsc.br/ubuntu
+ftp://free.nchc.org.tw/ubuntu
+http://ftp-stud.fht-esslingen.de/Mirrors/ubuntu
+http://ftp-stud.hs-esslingen.de/ubuntu
+http://ftp.belnet.be/linux/ubuntu/ubuntu
+http://ftp.belnet.be/pub/mirror/ubuntu.com/ubuntu
+http://ftp.caliu.info/pub/distribucions/ubuntu/ubuntu
+http://ftp.chg.ru/pub/Linux/ubuntu/archive
+ftp://ftp.ciril.fr/pub/linux/ubuntu/archives
+http://ftp.citylink.co.nz/ubuntu
+http://ftp.crihan.fr/ubuntu
+ftp://ftp.cw.net/pub/linux/ftp.ubuntu.com/ubuntu
+http://ftp.cw.net/ubuntu
+http://ftp.dateleco.es/ubuntu
+http://ftp.dei.uc.pt/pub/linux/ubuntu/archive
+http://ftp.duth.gr/pub/ubuntu
+http://ftp.ecc.u-tokyo.ac.jp/ubuntu
+http://ftp.estpak.ee/ubuntu
+ftp://ftp.free.fr/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.freepark.org/ubuntu
+ftp://ftp.fu-berlin.de/linux/ubuntu
+ftp://ftp.funet.fi/pub/mirrors/archive.ubuntu.com
+http://ftp.gil.di.uminho.pt/ubuntu
+ftp://ftp.gtlib.gatech.edu/pub/ubuntu
+http://ftp.gui.uva.es/sites/ubuntu.com/ubuntu
+http://ftp.halifax.rwth-aachen.de/ubuntu
+http://ftp.heanet.ie/pub/ubuntu
+http://ftp.hosteurope.de/mirror/archive.ubuntu.com
+ftp://ftp.iinet.net.au/pub/ubuntu
+ftp://ftp.iitm.ac.in/ubuntu
+http://ftp.kaist.ac.kr/pub/ubuntu
+http://ftp.kfki.hu/linux/ubuntu
+ftp://ftp.kfki.hu/pub/linux/ubuntu
+http://ftp.leg.uct.ac.za/pub/linux/ubuntu
+http://ftp.linux.edu.lv/ubuntu
+ftp://ftp.linux.org.tr/pub/ubuntu
+http://ftp.lug.ro/ubuntu
+ftp://ftp.man.szczecin.pl/pub/Linux/ubuntu
+ftp://ftp.mipt.ru/mirror/ubuntu
+ftp://ftp.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://ftp.netspace.net.au/pub/ubuntu
+http://ftp.ntua.gr/pub/linux/ubuntu
+ftp://ftp.oleane.net/ubuntu
+ftp://ftp.otenet.gr/ubuntu
+ftp://ftp.polytechnic.edu.na/pub/ubuntu
+http://ftp.port80.se/ubuntu
+http://ftp.pwr.wroc.pl/ubuntu
+ftp://ftp.rrzn.uni-hannover.de/pub/mirror/linux/ubuntu
+ftp://ftp.science.nus.edu.sg/pub/ubuntu
+http://ftp.science.nus.edu.sg/ubuntu
+http://ftp.stw-bonn.de/ubuntu
+http://ftp.ticklers.org/archive.ubuntu.org/ubuntu
+ftp://ftp.tiscali.nl/pub/mirror/ubuntu
+http://ftp.tiscali.nl/ubuntu
+http://ftp.tu-chemnitz.de/pub/linux/ubuntu
+ftp://ftp.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://ftp.tuke.sk/ubuntu
+http://ftp.twaren.net/Linux/Ubuntu/ubuntu
+http://ftp.u-picardie.fr/mirror/ubuntu/ubuntu
+ftp://ftp.uasw.edu/linux/ubuntu/archive
+http://ftp.ucr.ac.cr/ubuntu
+http://ftp.udc.es/ubuntu
+http://ftp.uni-kl.de/pub/linux/ubuntu
+http://ftp.uni-muenster.de/pub/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.unina.it/pub/linux/distributions/ubuntu
+http://ftp.uninett.no/ubuntu
+http://ftp.usf.edu/pub/ubuntu
+http://ftp.ussg.iu.edu/linux/ubuntu
+ftp://ftp.vectranet.pl/ubuntu
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/archives
+ftp://ftpserv.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://gd.tuwien.ac.at/opsys/linux/ubuntu/archive
+http://godel.cs.bilgi.edu.tr/ubuntu
+http://gulus.USherbrooke.ca/ubuntu
+http://hr.archive.ubuntu.com/ubuntu
+http://ie.archive.ubuntu.com/ubuntu
+http://klid.dk/ftp/ubuntu
+ftp://klid.dk/ubuntu
+http://kr.archive.ubuntu.com/ubuntu
+http://lug.mtu.edu/ubuntu
+http://mir1.ovh.net/ubuntu
+http://mirror.anl.gov/pub/ubuntu
+http://mirror.cc.columbia.edu/pub/linux/ubuntu/archive
+http://mirror.cs.umn.edu/ubuntu
+http://mirror.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirror.hgkz.ch/ubuntu
+http://mirror.imbrandon.com/ubuntu
+http://mirror.lcsee.wvu.edu/ubuntu
+http://mirror.letsopen.com/os/ubuntu
+http://mirror.lupaworld.com/ubuntu/archive
+http://mirror.nttu.edu.tw/ubuntu
+http://mirror.optus.net/ubuntu
+http://mirror.ox.ac.uk/sites/archive.ubuntu.com/ubuntu
+http://mirror.pacific.net.au/linux/ubuntu
+http://mirror.rootguide.org/ubuntu
+http://mirror.switch.ch/ftp/mirror/ubuntu
+ftp://mirror.switch.ch/mirror/ubuntu
+http://mirror.uni-c.dk/ubuntu
+http://mirror.utdlug.org/linux/distributions/ubuntu/packages
+http://mirror2.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirrors.cat.pdx.edu/ubuntu
+http://mirrors.ccs.neu.edu/archive.ubuntu.com
+ftp://mirrors.ccs.neu.edu/net/mirrors/archive.ubuntu.com
+http://mirrors.cs.wmich.edu/ubuntu
+ftp://mirrors.easynews.com/linux/ubuntu
+http://mirrors.kernel.org/ubuntu
+http://mirrors.nic.funet.fi/ubuntu
+http://mirrors.shlug.org/ubuntu
+ftp://mirrors.virginmedia.com/mirrors/ubuntu/archive
+http://mirrors.xmission.com/ubuntu
+http://mt.archive.ubuntu.com/ubuntu
+http://na.mirror.garr.it/mirrors/ubuntu-archive
+ftp://neacm.fe.up.pt/pub/ubuntu
+http://neacm.fe.up.pt/ubuntu
+http://nl.archive.ubuntu.com/ubuntu
+http://nl2.archive.ubuntu.com/ubuntu
+http://nz2.archive.ubuntu.com/ubuntu
+http://packages.midian.hu//pub/linux/distributions/ubuntu
+http://se.archive.ubuntu.com/ubuntu
+http://sft.if.usp.br/ubuntu
+http://snert.mi.hs-heilbronn.de/pub/ubuntu/ubuntu
+http://sunsite.informatik.rwth-aachen.de/ftp/pub/Linux/ubuntu/ubuntu
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/ubuntu/ubuntu
+http://tezcatl.fciencias.unam.mx/ubuntu
+http://th.archive.ubuntu.com/ubuntu
+ftp://tw.archive.ubuntu.com/ubuntu
+http://ubuntu-archive.datahop.it/ubuntu
+http://ubuntu.c3sl.ufpr.br/ubuntu
+http://ubuntu.cn99.com/ubuntu
+http://ubuntu.cs.uaf.edu/ubuntu
+http://ubuntu.cs.utah.edu/ubuntu
+http://ubuntu.csie.nctu.edu.tw/ubuntu
+http://ubuntu.eriders.ge/ubuntu
+http://ubuntu.fastbull.org/ubuntu
+http://ubuntu.indika.net.id/ubuntu
+http://ubuntu.inode.at/ubuntu
+http://ubuntu.intergenia.de/ubuntu
+http://ubuntu.ipacct.com/ubuntu
+http://ubuntu.lhi.is/ubuntu
+http://ubuntu.linux-bg.org/ubuntu
+ftp://ubuntu.mirror.ac.za/ubuntu-archive
+http://ubuntu.mirror.frontiernet.net/ubuntu
+http://ubuntu.mirror.rafal.ca/ubuntu
+http://ubuntu.mirrors.skynet.be/pub/ubuntu.com/ubuntu
+http://ubuntu.org.ua/ubuntu
+http://ubuntu.snet.uz/ubuntu
+http://ubuntu.supp.name/ubuntu
+http://ubuntu.task.gda.pl/ubuntu
+http://ubuntu.univ-nantes.fr/ubuntu
+http://ubuntu.uz/ubuntu
+http://ubuntu.ynet.sk/ubuntu
+http://www.gtlib.gatech.edu/pub/ubuntu
+http://www.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://www.nic.funet.fi/pub/mirrors/archive.ubuntu.com
+http://wwwftp.ciril.fr/pub/linux/ubuntu/archives
+ftp://yu.archive.ubuntu.com/ubuntu
diff --git a/src/lib/distro-info/ubuntu-8.04/prereqfiles/etc/hosts b/src/lib/distro-info/ubuntu-8.04/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-8.04/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/ubuntu-8.04/settings.default b/src/lib/distro-info/ubuntu-8.04/settings.default
new file mode 100644
index 00000000..8c51dc89
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-8.04/settings.default
@@ -0,0 +1,76 @@
+arch = i386
+package-subdir = pool
+prereq-packages = main/d/debootstrap/debootstrap_1.0.10ubuntu1~hardy1_all.deb
+release-name = hardy
+<repository base>
+ components = main restricted
+ distribution = hardy
+ name = Ubuntu 8.04
+ repo-subdir = dists
+ file-for-speedtest = dists/hardy/main/binary-i386/Packages.bz2
+</repository>
+<repository base_security>
+ components = main restricted
+ distribution = hardy-security
+ name = Ubuntu 8.04 Security
+ repo-subdir = dists
+ file-for-speedtest = dists/hardy-security/main/binary-i386/Packages.bz2
+</repository>
+<repository base_updates>
+ components = main restricted
+ distribution = hardy-updates
+ name = Ubuntu 8.04 Updates
+ repo-subdir = dists
+ file-for-speedtest = dists/hardy-updates/main/binary-i386/Packages.bz2
+</repository>
+<selection minimal>
+ packages = <<END
+ language-pack-de
+ linux-image-generic
+ END
+</selection>
+<selection standard>
+ base = minimal
+ packages = <<END
+ ubuntu-standard
+ END
+</selection>
+<selection gnome>
+ base = minimal
+ packages = <<END
+ ubuntu-desktop
+ END
+</selection>
+<selection kde>
+ base = minimal
+ packages = <<END
+ kubuntu-desktop
+ END
+</selection>
+<selection xfce>
+ base = minimal
+ packages = <<END
+ xubuntu-desktop
+ END
+</selection>
+<selection edubuntu-server>
+ base = minimal
+ packages = <<END
+ edubuntu-server
+ END
+</selection>
+<selection edubuntu-gnome>
+ base = minimal
+ packages = <<END
+ edubuntu-desktop-gnome
+ END
+</selection>
+<selection edubuntu-kde>
+ base = minimal
+ packages = <<END
+ edubuntu-desktop-kde
+ END
+</selection>
+<selection default>
+ base = minimal
+</selection>
diff --git a/src/lib/distro-info/ubuntu-8.04/settings.example b/src/lib/distro-info/ubuntu-8.04/settings.example
new file mode 100644
index 00000000..31881c4c
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-8.04/settings.example
@@ -0,0 +1,23 @@
+# rename this file to 'settings' and edit it as you please
+#
+# for a list of all options, have a look at the corresponding
+# settings.default in /opt/openslx/share/distro-info
+
+# use local installation source
+#<repository base>
+# local-url = /srv/ftp/pub/ubuntu
+#</repository>
+#<repository base_updates>
+# local-url = /srv/ftp/pub/ubuntu
+#</repository>
+#<repository base_security>
+# local-url = /srv/ftp/pub/ubuntu
+#</repository>
+
+# add a new selection:
+#<selection my_kde>
+# base = kde
+# packages = <<END
+# kinternet
+# END
+#</selection>
diff --git a/src/lib/distro-info/ubuntu-8.04_amd64/mirrors/base b/src/lib/distro-info/ubuntu-8.04_amd64/mirrors/base
new file mode 100644
index 00000000..3b936ecf
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-8.04_amd64/mirrors/base
@@ -0,0 +1,171 @@
+http://archive.ubuntu.com.ba/ubuntu
+http://archive.ubuntu.com/ubuntu
+ftp://br.archive.ubuntu.com/ubuntu
+ftp://bw.archive.ubuntu.com/ubuntu
+http://cl.archive.ubuntu.com/ubuntu
+http://cudlug.cudenver.edu/ubuntu
+ftp://cz.archive.ubuntu.com/MIRRORS/archive.ubuntu.com/mirror/ubuntu
+http://cz.archive.ubuntu.com/ubuntu
+ftp://darkstar.ist.utl.pt/pub/ubuntu/archive
+http://darkstar.ist.utl.pt/ubuntu/archive
+http://de.archive.ubuntu.com/ubuntu
+http://debian.charite.de/ubuntu
+http://debian.linux.org.tw/ubuntu
+http://dk.archive.ubuntu.com/ubuntu
+http://es.archive.ubuntu.com/ubuntu
+http://espelhos.edugraf.ufsc.br/ubuntu
+ftp://free.nchc.org.tw/ubuntu
+http://ftp-stud.fht-esslingen.de/Mirrors/ubuntu
+http://ftp-stud.hs-esslingen.de/ubuntu
+http://ftp.belnet.be/linux/ubuntu/ubuntu
+http://ftp.belnet.be/pub/mirror/ubuntu.com/ubuntu
+http://ftp.caliu.info/pub/distribucions/ubuntu/ubuntu
+http://ftp.chg.ru/pub/Linux/ubuntu/archive
+ftp://ftp.ciril.fr/pub/linux/ubuntu/archives
+http://ftp.citylink.co.nz/ubuntu
+http://ftp.crihan.fr/ubuntu
+ftp://ftp.cw.net/pub/linux/ftp.ubuntu.com/ubuntu
+http://ftp.cw.net/ubuntu
+http://ftp.dateleco.es/ubuntu
+http://ftp.dei.uc.pt/pub/linux/ubuntu/archive
+http://ftp.duth.gr/pub/ubuntu
+http://ftp.ecc.u-tokyo.ac.jp/ubuntu
+http://ftp.estpak.ee/ubuntu
+ftp://ftp.free.fr/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.freepark.org/ubuntu
+ftp://ftp.fu-berlin.de/linux/ubuntu
+ftp://ftp.funet.fi/pub/mirrors/archive.ubuntu.com
+http://ftp.gil.di.uminho.pt/ubuntu
+ftp://ftp.gtlib.gatech.edu/pub/ubuntu
+http://ftp.gui.uva.es/sites/ubuntu.com/ubuntu
+http://ftp.halifax.rwth-aachen.de/ubuntu
+http://ftp.heanet.ie/pub/ubuntu
+http://ftp.hosteurope.de/mirror/archive.ubuntu.com
+ftp://ftp.iinet.net.au/pub/ubuntu
+ftp://ftp.iitm.ac.in/ubuntu
+http://ftp.kaist.ac.kr/pub/ubuntu
+http://ftp.kfki.hu/linux/ubuntu
+ftp://ftp.kfki.hu/pub/linux/ubuntu
+http://ftp.leg.uct.ac.za/pub/linux/ubuntu
+http://ftp.linux.edu.lv/ubuntu
+ftp://ftp.linux.org.tr/pub/ubuntu
+http://ftp.lug.ro/ubuntu
+ftp://ftp.man.szczecin.pl/pub/Linux/ubuntu
+ftp://ftp.mipt.ru/mirror/ubuntu
+ftp://ftp.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://ftp.netspace.net.au/pub/ubuntu
+http://ftp.ntua.gr/pub/linux/ubuntu
+ftp://ftp.oleane.net/ubuntu
+ftp://ftp.otenet.gr/ubuntu
+ftp://ftp.polytechnic.edu.na/pub/ubuntu
+http://ftp.port80.se/ubuntu
+http://ftp.pwr.wroc.pl/ubuntu
+ftp://ftp.rrzn.uni-hannover.de/pub/mirror/linux/ubuntu
+ftp://ftp.science.nus.edu.sg/pub/ubuntu
+http://ftp.science.nus.edu.sg/ubuntu
+http://ftp.stw-bonn.de/ubuntu
+http://ftp.ticklers.org/archive.ubuntu.org/ubuntu
+ftp://ftp.tiscali.nl/pub/mirror/ubuntu
+http://ftp.tiscali.nl/ubuntu
+http://ftp.tu-chemnitz.de/pub/linux/ubuntu
+ftp://ftp.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://ftp.tuke.sk/ubuntu
+http://ftp.twaren.net/Linux/Ubuntu/ubuntu
+http://ftp.u-picardie.fr/mirror/ubuntu/ubuntu
+ftp://ftp.uasw.edu/linux/ubuntu/archive
+http://ftp.ucr.ac.cr/ubuntu
+http://ftp.udc.es/ubuntu
+http://ftp.uni-kl.de/pub/linux/ubuntu
+http://ftp.uni-muenster.de/pub/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.unina.it/pub/linux/distributions/ubuntu
+http://ftp.uninett.no/ubuntu
+http://ftp.usf.edu/pub/ubuntu
+http://ftp.ussg.iu.edu/linux/ubuntu
+ftp://ftp.vectranet.pl/ubuntu
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/archives
+ftp://ftpserv.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://gd.tuwien.ac.at/opsys/linux/ubuntu/archive
+http://godel.cs.bilgi.edu.tr/ubuntu
+http://gulus.USherbrooke.ca/ubuntu
+http://hr.archive.ubuntu.com/ubuntu
+http://ie.archive.ubuntu.com/ubuntu
+http://klid.dk/ftp/ubuntu
+ftp://klid.dk/ubuntu
+http://kr.archive.ubuntu.com/ubuntu
+http://lug.mtu.edu/ubuntu
+http://mir1.ovh.net/ubuntu
+http://mirror.anl.gov/pub/ubuntu
+http://mirror.cc.columbia.edu/pub/linux/ubuntu/archive
+http://mirror.cs.umn.edu/ubuntu
+http://mirror.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirror.hgkz.ch/ubuntu
+http://mirror.imbrandon.com/ubuntu
+http://mirror.lcsee.wvu.edu/ubuntu
+http://mirror.letsopen.com/os/ubuntu
+http://mirror.lupaworld.com/ubuntu/archive
+http://mirror.nttu.edu.tw/ubuntu
+http://mirror.optus.net/ubuntu
+http://mirror.ox.ac.uk/sites/archive.ubuntu.com/ubuntu
+http://mirror.pacific.net.au/linux/ubuntu
+http://mirror.rootguide.org/ubuntu
+http://mirror.switch.ch/ftp/mirror/ubuntu
+ftp://mirror.switch.ch/mirror/ubuntu
+http://mirror.uni-c.dk/ubuntu
+http://mirror.utdlug.org/linux/distributions/ubuntu/packages
+http://mirror2.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirrors.cat.pdx.edu/ubuntu
+http://mirrors.ccs.neu.edu/archive.ubuntu.com
+ftp://mirrors.ccs.neu.edu/net/mirrors/archive.ubuntu.com
+http://mirrors.cs.wmich.edu/ubuntu
+ftp://mirrors.easynews.com/linux/ubuntu
+http://mirrors.kernel.org/ubuntu
+http://mirrors.nic.funet.fi/ubuntu
+http://mirrors.shlug.org/ubuntu
+ftp://mirrors.virginmedia.com/mirrors/ubuntu/archive
+http://mirrors.xmission.com/ubuntu
+http://mt.archive.ubuntu.com/ubuntu
+http://na.mirror.garr.it/mirrors/ubuntu-archive
+ftp://neacm.fe.up.pt/pub/ubuntu
+http://neacm.fe.up.pt/ubuntu
+http://nl.archive.ubuntu.com/ubuntu
+http://nl2.archive.ubuntu.com/ubuntu
+http://nz2.archive.ubuntu.com/ubuntu
+http://packages.midian.hu//pub/linux/distributions/ubuntu
+http://se.archive.ubuntu.com/ubuntu
+http://sft.if.usp.br/ubuntu
+http://snert.mi.hs-heilbronn.de/pub/ubuntu/ubuntu
+http://sunsite.informatik.rwth-aachen.de/ftp/pub/Linux/ubuntu/ubuntu
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/ubuntu/ubuntu
+http://tezcatl.fciencias.unam.mx/ubuntu
+http://th.archive.ubuntu.com/ubuntu
+ftp://tw.archive.ubuntu.com/ubuntu
+http://ubuntu-archive.datahop.it/ubuntu
+http://ubuntu.c3sl.ufpr.br/ubuntu
+http://ubuntu.cn99.com/ubuntu
+http://ubuntu.cs.uaf.edu/ubuntu
+http://ubuntu.cs.utah.edu/ubuntu
+http://ubuntu.csie.nctu.edu.tw/ubuntu
+http://ubuntu.eriders.ge/ubuntu
+http://ubuntu.fastbull.org/ubuntu
+http://ubuntu.indika.net.id/ubuntu
+http://ubuntu.inode.at/ubuntu
+http://ubuntu.intergenia.de/ubuntu
+http://ubuntu.ipacct.com/ubuntu
+http://ubuntu.lhi.is/ubuntu
+http://ubuntu.linux-bg.org/ubuntu
+ftp://ubuntu.mirror.ac.za/ubuntu-archive
+http://ubuntu.mirror.frontiernet.net/ubuntu
+http://ubuntu.mirror.rafal.ca/ubuntu
+http://ubuntu.mirrors.skynet.be/pub/ubuntu.com/ubuntu
+http://ubuntu.org.ua/ubuntu
+http://ubuntu.snet.uz/ubuntu
+http://ubuntu.supp.name/ubuntu
+http://ubuntu.task.gda.pl/ubuntu
+http://ubuntu.univ-nantes.fr/ubuntu
+http://ubuntu.uz/ubuntu
+http://ubuntu.ynet.sk/ubuntu
+http://www.gtlib.gatech.edu/pub/ubuntu
+http://www.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://www.nic.funet.fi/pub/mirrors/archive.ubuntu.com
+http://wwwftp.ciril.fr/pub/linux/ubuntu/archives
+ftp://yu.archive.ubuntu.com/ubuntu
diff --git a/src/lib/distro-info/ubuntu-8.04_amd64/mirrors/base_security b/src/lib/distro-info/ubuntu-8.04_amd64/mirrors/base_security
new file mode 100644
index 00000000..21789622
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-8.04_amd64/mirrors/base_security
@@ -0,0 +1,163 @@
+http://archive.ubuntu.com.ba/ubuntu
+http://archive.ubuntu.com/ubuntu
+http://br.archive.ubuntu.com/ubuntu
+http://bw.archive.ubuntu.com/ubuntu
+http://cl.archive.ubuntu.com/ubuntu
+http://cudlug.cudenver.edu/ubuntu
+ftp://cz.archive.ubuntu.com/MIRRORS/archive.ubuntu.com/mirror/ubuntu
+http://cz.archive.ubuntu.com/ubuntu
+ftp://darkstar.ist.utl.pt/pub/ubuntu/archive
+http://darkstar.ist.utl.pt/ubuntu/archive
+http://de.archive.ubuntu.com/ubuntu
+http://debian.charite.de/ubuntu
+http://debian.linux.org.tw/ubuntu
+http://dk.archive.ubuntu.com/ubuntu
+http://es.archive.ubuntu.com/ubuntu
+http://espelhos.edugraf.ufsc.br/ubuntu
+http://free.nchc.org.tw/ubuntu
+http://ftp-stud.fht-esslingen.de/Mirrors/ubuntu
+http://ftp-stud.hs-esslingen.de/ubuntu
+http://ftp.belnet.be/linux/ubuntu/ubuntu
+http://ftp.belnet.be/pub/mirror/ubuntu.com/ubuntu
+http://ftp.caliu.info/pub/distribucions/ubuntu/ubuntu
+http://ftp.chg.ru/pub/Linux/ubuntu/archive
+ftp://ftp.ciril.fr/pub/linux/ubuntu/archives
+http://ftp.citylink.co.nz/ubuntu
+http://ftp.crihan.fr/ubuntu
+ftp://ftp.cw.net/pub/linux/ftp.ubuntu.com/ubuntu
+http://ftp.cw.net/ubuntu
+http://ftp.dateleco.es/ubuntu
+http://ftp.dei.uc.pt/pub/linux/ubuntu/archive
+http://ftp.duth.gr/pub/ubuntu
+http://ftp.ecc.u-tokyo.ac.jp/ubuntu
+http://ftp.estpak.ee/ubuntu
+ftp://ftp.free.fr/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.freepark.org/ubuntu
+ftp://ftp.fu-berlin.de/linux/ubuntu
+ftp://ftp.funet.fi/pub/mirrors/archive.ubuntu.com
+http://ftp.gil.di.uminho.pt/ubuntu
+http://ftp.gui.uva.es/sites/ubuntu.com/ubuntu
+http://ftp.halifax.rwth-aachen.de/ubuntu
+http://ftp.heanet.ie/pub/ubuntu
+http://ftp.hosteurope.de/mirror/archive.ubuntu.com
+http://ftp.iinet.net.au/pub/ubuntu
+http://ftp.iitm.ac.in/ubuntu
+http://ftp.kaist.ac.kr/pub/ubuntu
+http://ftp.kfki.hu/linux/ubuntu
+ftp://ftp.kfki.hu/pub/linux/ubuntu
+http://ftp.leg.uct.ac.za/pub/linux/ubuntu
+http://ftp.linux.edu.lv/ubuntu
+http://ftp.lug.ro/ubuntu
+ftp://ftp.man.szczecin.pl/pub/Linux/ubuntu
+ftp://ftp.mipt.ru/mirror/ubuntu
+ftp://ftp.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://ftp.netspace.net.au/pub/ubuntu
+http://ftp.ntua.gr/pub/linux/ubuntu
+ftp://ftp.oleane.net/ubuntu
+ftp://ftp.otenet.gr/ubuntu
+http://ftp.pwr.wroc.pl/ubuntu
+ftp://ftp.rrzn.uni-hannover.de/pub/mirror/linux/ubuntu
+http://ftp.science.nus.edu.sg/ubuntu
+http://ftp.stw-bonn.de/ubuntu
+http://ftp.ticklers.org/archive.ubuntu.org/ubuntu
+ftp://ftp.tiscali.nl/pub/mirror/ubuntu
+http://ftp.tiscali.nl/ubuntu
+http://ftp.tu-chemnitz.de/pub/linux/ubuntu
+ftp://ftp.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://ftp.tuke.sk/ubuntu
+http://ftp.twaren.net/Linux/Ubuntu/ubuntu
+http://ftp.u-picardie.fr/mirror/ubuntu/ubuntu
+ftp://ftp.uasw.edu/linux/ubuntu/archive
+http://ftp.ucr.ac.cr/ubuntu
+http://ftp.udc.es/ubuntu
+http://ftp.uni-kl.de/pub/linux/ubuntu
+http://ftp.uni-muenster.de/pub/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.unina.it/pub/linux/distributions/ubuntu
+http://ftp.uninett.no/ubuntu
+http://ftp.usf.edu/pub/ubuntu
+http://ftp.ussg.iu.edu/linux/ubuntu
+ftp://ftp.vectranet.pl/ubuntu
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/archives
+ftp://ftpserv.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://gd.tuwien.ac.at/opsys/linux/ubuntu/archive
+http://godel.cs.bilgi.edu.tr/ubuntu
+http://gulus.USherbrooke.ca/ubuntu
+http://hr.archive.ubuntu.com/ubuntu
+http://ie.archive.ubuntu.com/ubuntu
+http://kr.archive.ubuntu.com/ubuntu
+http://lug.mtu.edu/ubuntu
+http://mir1.ovh.net/ubuntu
+http://mirror.anl.gov/pub/ubuntu
+http://mirror.cc.columbia.edu/pub/linux/ubuntu/archive
+http://mirror.cs.umn.edu/ubuntu
+http://mirror.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirror.hgkz.ch/ubuntu
+http://mirror.imbrandon.com/ubuntu
+http://mirror.lcsee.wvu.edu/ubuntu
+http://mirror.letsopen.com/os/ubuntu
+http://mirror.lupaworld.com/ubuntu/archive
+http://mirror.nttu.edu.tw/ubuntu
+http://mirror.optus.net/ubuntu
+http://mirror.ox.ac.uk/sites/archive.ubuntu.com/ubuntu
+http://mirror.pacific.net.au/linux/ubuntu
+http://mirror.rootguide.org/ubuntu
+http://mirror.switch.ch/ftp/mirror/ubuntu
+ftp://mirror.switch.ch/mirror/ubuntu
+http://mirror.uni-c.dk/ubuntu
+http://mirror.utdlug.org/linux/distributions/ubuntu/packages
+http://mirror2.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirrors.cat.pdx.edu/ubuntu
+http://mirrors.ccs.neu.edu/archive.ubuntu.com
+http://mirrors.cs.wmich.edu/ubuntu
+http://mirrors.easynews.com/linux/ubuntu
+http://mirrors.kernel.org/ubuntu
+http://mirrors.nic.funet.fi/ubuntu
+http://mirrors.shlug.org/ubuntu
+ftp://mirrors.virginmedia.com/mirrors/ubuntu/archive
+http://mirrors.xmission.com/ubuntu
+http://mt.archive.ubuntu.com/ubuntu
+http://na.mirror.garr.it/mirrors/ubuntu-archive
+ftp://neacm.fe.up.pt/pub/ubuntu
+http://neacm.fe.up.pt/ubuntu
+http://nl.archive.ubuntu.com/ubuntu
+http://nl2.archive.ubuntu.com/ubuntu
+http://nz2.archive.ubuntu.com/ubuntu
+http://packages.midian.hu//pub/linux/distributions/ubuntu
+http://se.archive.ubuntu.com/ubuntu
+http://sft.if.usp.br/ubuntu
+http://snert.mi.hs-heilbronn.de/pub/ubuntu/ubuntu
+http://sunsite.informatik.rwth-aachen.de/ftp/pub/Linux/ubuntu/ubuntu
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/ubuntu/ubuntu
+http://tezcatl.fciencias.unam.mx/ubuntu
+http://th.archive.ubuntu.com/ubuntu
+http://tw.archive.ubuntu.com/ubuntu
+http://ubuntu-archive.datahop.it/ubuntu
+http://ubuntu.c3sl.ufpr.br/ubuntu
+http://ubuntu.cn99.com/ubuntu
+http://ubuntu.cs.uaf.edu/ubuntu
+http://ubuntu.cs.utah.edu/ubuntu
+http://ubuntu.csie.nctu.edu.tw/ubuntu
+http://ubuntu.eriders.ge/ubuntu
+http://ubuntu.fastbull.org/ubuntu
+http://ubuntu.indika.net.id/ubuntu
+http://ubuntu.inode.at/ubuntu
+http://ubuntu.intergenia.de/ubuntu
+http://ubuntu.ipacct.com/ubuntu
+http://ubuntu.lhi.is/ubuntu
+http://ubuntu.linux-bg.org/ubuntu
+http://ubuntu.mirror.ac.za/ubuntu-archive
+http://ubuntu.mirror.frontiernet.net/ubuntu
+http://ubuntu.mirror.rafal.ca/ubuntu
+http://ubuntu.mirrors.skynet.be/pub/ubuntu.com/ubuntu
+http://ubuntu.org.ua/ubuntu
+http://ubuntu.snet.uz/ubuntu
+http://ubuntu.supp.name/ubuntu
+http://ubuntu.task.gda.pl/ubuntu
+http://ubuntu.univ-nantes.fr/ubuntu
+http://ubuntu.uz/ubuntu
+http://ubuntu.ynet.sk/ubuntu
+http://www.gtlib.gatech.edu/pub/ubuntu
+http://www.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://www.nic.funet.fi/pub/mirrors/archive.ubuntu.com
+http://wwwftp.ciril.fr/pub/linux/ubuntu/archives
+ftp://yu.archive.ubuntu.com/ubuntu
diff --git a/src/lib/distro-info/ubuntu-8.04_amd64/mirrors/base_updates b/src/lib/distro-info/ubuntu-8.04_amd64/mirrors/base_updates
new file mode 100644
index 00000000..3b936ecf
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-8.04_amd64/mirrors/base_updates
@@ -0,0 +1,171 @@
+http://archive.ubuntu.com.ba/ubuntu
+http://archive.ubuntu.com/ubuntu
+ftp://br.archive.ubuntu.com/ubuntu
+ftp://bw.archive.ubuntu.com/ubuntu
+http://cl.archive.ubuntu.com/ubuntu
+http://cudlug.cudenver.edu/ubuntu
+ftp://cz.archive.ubuntu.com/MIRRORS/archive.ubuntu.com/mirror/ubuntu
+http://cz.archive.ubuntu.com/ubuntu
+ftp://darkstar.ist.utl.pt/pub/ubuntu/archive
+http://darkstar.ist.utl.pt/ubuntu/archive
+http://de.archive.ubuntu.com/ubuntu
+http://debian.charite.de/ubuntu
+http://debian.linux.org.tw/ubuntu
+http://dk.archive.ubuntu.com/ubuntu
+http://es.archive.ubuntu.com/ubuntu
+http://espelhos.edugraf.ufsc.br/ubuntu
+ftp://free.nchc.org.tw/ubuntu
+http://ftp-stud.fht-esslingen.de/Mirrors/ubuntu
+http://ftp-stud.hs-esslingen.de/ubuntu
+http://ftp.belnet.be/linux/ubuntu/ubuntu
+http://ftp.belnet.be/pub/mirror/ubuntu.com/ubuntu
+http://ftp.caliu.info/pub/distribucions/ubuntu/ubuntu
+http://ftp.chg.ru/pub/Linux/ubuntu/archive
+ftp://ftp.ciril.fr/pub/linux/ubuntu/archives
+http://ftp.citylink.co.nz/ubuntu
+http://ftp.crihan.fr/ubuntu
+ftp://ftp.cw.net/pub/linux/ftp.ubuntu.com/ubuntu
+http://ftp.cw.net/ubuntu
+http://ftp.dateleco.es/ubuntu
+http://ftp.dei.uc.pt/pub/linux/ubuntu/archive
+http://ftp.duth.gr/pub/ubuntu
+http://ftp.ecc.u-tokyo.ac.jp/ubuntu
+http://ftp.estpak.ee/ubuntu
+ftp://ftp.free.fr/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.freepark.org/ubuntu
+ftp://ftp.fu-berlin.de/linux/ubuntu
+ftp://ftp.funet.fi/pub/mirrors/archive.ubuntu.com
+http://ftp.gil.di.uminho.pt/ubuntu
+ftp://ftp.gtlib.gatech.edu/pub/ubuntu
+http://ftp.gui.uva.es/sites/ubuntu.com/ubuntu
+http://ftp.halifax.rwth-aachen.de/ubuntu
+http://ftp.heanet.ie/pub/ubuntu
+http://ftp.hosteurope.de/mirror/archive.ubuntu.com
+ftp://ftp.iinet.net.au/pub/ubuntu
+ftp://ftp.iitm.ac.in/ubuntu
+http://ftp.kaist.ac.kr/pub/ubuntu
+http://ftp.kfki.hu/linux/ubuntu
+ftp://ftp.kfki.hu/pub/linux/ubuntu
+http://ftp.leg.uct.ac.za/pub/linux/ubuntu
+http://ftp.linux.edu.lv/ubuntu
+ftp://ftp.linux.org.tr/pub/ubuntu
+http://ftp.lug.ro/ubuntu
+ftp://ftp.man.szczecin.pl/pub/Linux/ubuntu
+ftp://ftp.mipt.ru/mirror/ubuntu
+ftp://ftp.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://ftp.netspace.net.au/pub/ubuntu
+http://ftp.ntua.gr/pub/linux/ubuntu
+ftp://ftp.oleane.net/ubuntu
+ftp://ftp.otenet.gr/ubuntu
+ftp://ftp.polytechnic.edu.na/pub/ubuntu
+http://ftp.port80.se/ubuntu
+http://ftp.pwr.wroc.pl/ubuntu
+ftp://ftp.rrzn.uni-hannover.de/pub/mirror/linux/ubuntu
+ftp://ftp.science.nus.edu.sg/pub/ubuntu
+http://ftp.science.nus.edu.sg/ubuntu
+http://ftp.stw-bonn.de/ubuntu
+http://ftp.ticklers.org/archive.ubuntu.org/ubuntu
+ftp://ftp.tiscali.nl/pub/mirror/ubuntu
+http://ftp.tiscali.nl/ubuntu
+http://ftp.tu-chemnitz.de/pub/linux/ubuntu
+ftp://ftp.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://ftp.tuke.sk/ubuntu
+http://ftp.twaren.net/Linux/Ubuntu/ubuntu
+http://ftp.u-picardie.fr/mirror/ubuntu/ubuntu
+ftp://ftp.uasw.edu/linux/ubuntu/archive
+http://ftp.ucr.ac.cr/ubuntu
+http://ftp.udc.es/ubuntu
+http://ftp.uni-kl.de/pub/linux/ubuntu
+http://ftp.uni-muenster.de/pub/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.unina.it/pub/linux/distributions/ubuntu
+http://ftp.uninett.no/ubuntu
+http://ftp.usf.edu/pub/ubuntu
+http://ftp.ussg.iu.edu/linux/ubuntu
+ftp://ftp.vectranet.pl/ubuntu
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/archives
+ftp://ftpserv.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://gd.tuwien.ac.at/opsys/linux/ubuntu/archive
+http://godel.cs.bilgi.edu.tr/ubuntu
+http://gulus.USherbrooke.ca/ubuntu
+http://hr.archive.ubuntu.com/ubuntu
+http://ie.archive.ubuntu.com/ubuntu
+http://klid.dk/ftp/ubuntu
+ftp://klid.dk/ubuntu
+http://kr.archive.ubuntu.com/ubuntu
+http://lug.mtu.edu/ubuntu
+http://mir1.ovh.net/ubuntu
+http://mirror.anl.gov/pub/ubuntu
+http://mirror.cc.columbia.edu/pub/linux/ubuntu/archive
+http://mirror.cs.umn.edu/ubuntu
+http://mirror.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirror.hgkz.ch/ubuntu
+http://mirror.imbrandon.com/ubuntu
+http://mirror.lcsee.wvu.edu/ubuntu
+http://mirror.letsopen.com/os/ubuntu
+http://mirror.lupaworld.com/ubuntu/archive
+http://mirror.nttu.edu.tw/ubuntu
+http://mirror.optus.net/ubuntu
+http://mirror.ox.ac.uk/sites/archive.ubuntu.com/ubuntu
+http://mirror.pacific.net.au/linux/ubuntu
+http://mirror.rootguide.org/ubuntu
+http://mirror.switch.ch/ftp/mirror/ubuntu
+ftp://mirror.switch.ch/mirror/ubuntu
+http://mirror.uni-c.dk/ubuntu
+http://mirror.utdlug.org/linux/distributions/ubuntu/packages
+http://mirror2.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirrors.cat.pdx.edu/ubuntu
+http://mirrors.ccs.neu.edu/archive.ubuntu.com
+ftp://mirrors.ccs.neu.edu/net/mirrors/archive.ubuntu.com
+http://mirrors.cs.wmich.edu/ubuntu
+ftp://mirrors.easynews.com/linux/ubuntu
+http://mirrors.kernel.org/ubuntu
+http://mirrors.nic.funet.fi/ubuntu
+http://mirrors.shlug.org/ubuntu
+ftp://mirrors.virginmedia.com/mirrors/ubuntu/archive
+http://mirrors.xmission.com/ubuntu
+http://mt.archive.ubuntu.com/ubuntu
+http://na.mirror.garr.it/mirrors/ubuntu-archive
+ftp://neacm.fe.up.pt/pub/ubuntu
+http://neacm.fe.up.pt/ubuntu
+http://nl.archive.ubuntu.com/ubuntu
+http://nl2.archive.ubuntu.com/ubuntu
+http://nz2.archive.ubuntu.com/ubuntu
+http://packages.midian.hu//pub/linux/distributions/ubuntu
+http://se.archive.ubuntu.com/ubuntu
+http://sft.if.usp.br/ubuntu
+http://snert.mi.hs-heilbronn.de/pub/ubuntu/ubuntu
+http://sunsite.informatik.rwth-aachen.de/ftp/pub/Linux/ubuntu/ubuntu
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/ubuntu/ubuntu
+http://tezcatl.fciencias.unam.mx/ubuntu
+http://th.archive.ubuntu.com/ubuntu
+ftp://tw.archive.ubuntu.com/ubuntu
+http://ubuntu-archive.datahop.it/ubuntu
+http://ubuntu.c3sl.ufpr.br/ubuntu
+http://ubuntu.cn99.com/ubuntu
+http://ubuntu.cs.uaf.edu/ubuntu
+http://ubuntu.cs.utah.edu/ubuntu
+http://ubuntu.csie.nctu.edu.tw/ubuntu
+http://ubuntu.eriders.ge/ubuntu
+http://ubuntu.fastbull.org/ubuntu
+http://ubuntu.indika.net.id/ubuntu
+http://ubuntu.inode.at/ubuntu
+http://ubuntu.intergenia.de/ubuntu
+http://ubuntu.ipacct.com/ubuntu
+http://ubuntu.lhi.is/ubuntu
+http://ubuntu.linux-bg.org/ubuntu
+ftp://ubuntu.mirror.ac.za/ubuntu-archive
+http://ubuntu.mirror.frontiernet.net/ubuntu
+http://ubuntu.mirror.rafal.ca/ubuntu
+http://ubuntu.mirrors.skynet.be/pub/ubuntu.com/ubuntu
+http://ubuntu.org.ua/ubuntu
+http://ubuntu.snet.uz/ubuntu
+http://ubuntu.supp.name/ubuntu
+http://ubuntu.task.gda.pl/ubuntu
+http://ubuntu.univ-nantes.fr/ubuntu
+http://ubuntu.uz/ubuntu
+http://ubuntu.ynet.sk/ubuntu
+http://www.gtlib.gatech.edu/pub/ubuntu
+http://www.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://www.nic.funet.fi/pub/mirrors/archive.ubuntu.com
+http://wwwftp.ciril.fr/pub/linux/ubuntu/archives
+ftp://yu.archive.ubuntu.com/ubuntu
diff --git a/src/lib/distro-info/ubuntu-8.04_amd64/prereqfiles/etc/hosts b/src/lib/distro-info/ubuntu-8.04_amd64/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-8.04_amd64/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/ubuntu-8.04_amd64/settings.default b/src/lib/distro-info/ubuntu-8.04_amd64/settings.default
new file mode 100644
index 00000000..35efc3e8
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-8.04_amd64/settings.default
@@ -0,0 +1,76 @@
+arch = amd64
+package-subdir = pool
+prereq-packages = main/d/debootstrap/debootstrap_1.0.10ubuntu1~hardy1_all.deb
+release-name = hardy
+<repository base>
+ components = main restricted
+ distribution = hardy
+ name = Ubuntu 8.04
+ repo-subdir = dists
+ file-for-speedtest = dists/hardy/main/binary-amd64/Packages.bz2
+</repository>
+<repository base_security>
+ components = main restricted
+ distribution = hardy-security
+ name = Ubuntu 8.04 Security
+ repo-subdir = dists
+ file-for-speedtest = dists/hardy-security/main/binary-amd64/Packages.bz2
+</repository>
+<repository base_updates>
+ components = main restricted
+ distribution = hardy-updates
+ name = Ubuntu 8.04 Updates
+ repo-subdir = dists
+ file-for-speedtest = dists/hardy-updates/main/binary-amd64/Packages.bz2
+</repository>
+<selection minimal>
+ packages = <<END
+ language-pack-de
+ linux-image-generic
+ END
+</selection>
+<selection standard>
+ base = minimal
+ packages = <<END
+ ubuntu-standard
+ END
+</selection>
+<selection gnome>
+ base = minimal
+ packages = <<END
+ ubuntu-desktop
+ END
+</selection>
+<selection kde>
+ base = minimal
+ packages = <<END
+ kubuntu-desktop
+ END
+</selection>
+<selection xfce>
+ base = minimal
+ packages = <<END
+ xubuntu-desktop
+ END
+</selection>
+<selection edubuntu-server>
+ base = minimal
+ packages = <<END
+ edubuntu-server
+ END
+</selection>
+<selection edubuntu-gnome>
+ base = minimal
+ packages = <<END
+ edubuntu-desktop-gnome
+ END
+</selection>
+<selection edubuntu-kde>
+ base = minimal
+ packages = <<END
+ edubuntu-desktop-kde
+ END
+</selection>
+<selection default>
+ base = minimal
+</selection>
diff --git a/src/lib/distro-info/ubuntu-8.04_amd64/settings.example b/src/lib/distro-info/ubuntu-8.04_amd64/settings.example
new file mode 100644
index 00000000..31881c4c
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-8.04_amd64/settings.example
@@ -0,0 +1,23 @@
+# rename this file to 'settings' and edit it as you please
+#
+# for a list of all options, have a look at the corresponding
+# settings.default in /opt/openslx/share/distro-info
+
+# use local installation source
+#<repository base>
+# local-url = /srv/ftp/pub/ubuntu
+#</repository>
+#<repository base_updates>
+# local-url = /srv/ftp/pub/ubuntu
+#</repository>
+#<repository base_security>
+# local-url = /srv/ftp/pub/ubuntu
+#</repository>
+
+# add a new selection:
+#<selection my_kde>
+# base = kde
+# packages = <<END
+# kinternet
+# END
+#</selection>
diff --git a/src/lib/distro-info/ubuntu-8.10/mirrors/base b/src/lib/distro-info/ubuntu-8.10/mirrors/base
new file mode 100644
index 00000000..3b936ecf
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-8.10/mirrors/base
@@ -0,0 +1,171 @@
+http://archive.ubuntu.com.ba/ubuntu
+http://archive.ubuntu.com/ubuntu
+ftp://br.archive.ubuntu.com/ubuntu
+ftp://bw.archive.ubuntu.com/ubuntu
+http://cl.archive.ubuntu.com/ubuntu
+http://cudlug.cudenver.edu/ubuntu
+ftp://cz.archive.ubuntu.com/MIRRORS/archive.ubuntu.com/mirror/ubuntu
+http://cz.archive.ubuntu.com/ubuntu
+ftp://darkstar.ist.utl.pt/pub/ubuntu/archive
+http://darkstar.ist.utl.pt/ubuntu/archive
+http://de.archive.ubuntu.com/ubuntu
+http://debian.charite.de/ubuntu
+http://debian.linux.org.tw/ubuntu
+http://dk.archive.ubuntu.com/ubuntu
+http://es.archive.ubuntu.com/ubuntu
+http://espelhos.edugraf.ufsc.br/ubuntu
+ftp://free.nchc.org.tw/ubuntu
+http://ftp-stud.fht-esslingen.de/Mirrors/ubuntu
+http://ftp-stud.hs-esslingen.de/ubuntu
+http://ftp.belnet.be/linux/ubuntu/ubuntu
+http://ftp.belnet.be/pub/mirror/ubuntu.com/ubuntu
+http://ftp.caliu.info/pub/distribucions/ubuntu/ubuntu
+http://ftp.chg.ru/pub/Linux/ubuntu/archive
+ftp://ftp.ciril.fr/pub/linux/ubuntu/archives
+http://ftp.citylink.co.nz/ubuntu
+http://ftp.crihan.fr/ubuntu
+ftp://ftp.cw.net/pub/linux/ftp.ubuntu.com/ubuntu
+http://ftp.cw.net/ubuntu
+http://ftp.dateleco.es/ubuntu
+http://ftp.dei.uc.pt/pub/linux/ubuntu/archive
+http://ftp.duth.gr/pub/ubuntu
+http://ftp.ecc.u-tokyo.ac.jp/ubuntu
+http://ftp.estpak.ee/ubuntu
+ftp://ftp.free.fr/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.freepark.org/ubuntu
+ftp://ftp.fu-berlin.de/linux/ubuntu
+ftp://ftp.funet.fi/pub/mirrors/archive.ubuntu.com
+http://ftp.gil.di.uminho.pt/ubuntu
+ftp://ftp.gtlib.gatech.edu/pub/ubuntu
+http://ftp.gui.uva.es/sites/ubuntu.com/ubuntu
+http://ftp.halifax.rwth-aachen.de/ubuntu
+http://ftp.heanet.ie/pub/ubuntu
+http://ftp.hosteurope.de/mirror/archive.ubuntu.com
+ftp://ftp.iinet.net.au/pub/ubuntu
+ftp://ftp.iitm.ac.in/ubuntu
+http://ftp.kaist.ac.kr/pub/ubuntu
+http://ftp.kfki.hu/linux/ubuntu
+ftp://ftp.kfki.hu/pub/linux/ubuntu
+http://ftp.leg.uct.ac.za/pub/linux/ubuntu
+http://ftp.linux.edu.lv/ubuntu
+ftp://ftp.linux.org.tr/pub/ubuntu
+http://ftp.lug.ro/ubuntu
+ftp://ftp.man.szczecin.pl/pub/Linux/ubuntu
+ftp://ftp.mipt.ru/mirror/ubuntu
+ftp://ftp.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://ftp.netspace.net.au/pub/ubuntu
+http://ftp.ntua.gr/pub/linux/ubuntu
+ftp://ftp.oleane.net/ubuntu
+ftp://ftp.otenet.gr/ubuntu
+ftp://ftp.polytechnic.edu.na/pub/ubuntu
+http://ftp.port80.se/ubuntu
+http://ftp.pwr.wroc.pl/ubuntu
+ftp://ftp.rrzn.uni-hannover.de/pub/mirror/linux/ubuntu
+ftp://ftp.science.nus.edu.sg/pub/ubuntu
+http://ftp.science.nus.edu.sg/ubuntu
+http://ftp.stw-bonn.de/ubuntu
+http://ftp.ticklers.org/archive.ubuntu.org/ubuntu
+ftp://ftp.tiscali.nl/pub/mirror/ubuntu
+http://ftp.tiscali.nl/ubuntu
+http://ftp.tu-chemnitz.de/pub/linux/ubuntu
+ftp://ftp.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://ftp.tuke.sk/ubuntu
+http://ftp.twaren.net/Linux/Ubuntu/ubuntu
+http://ftp.u-picardie.fr/mirror/ubuntu/ubuntu
+ftp://ftp.uasw.edu/linux/ubuntu/archive
+http://ftp.ucr.ac.cr/ubuntu
+http://ftp.udc.es/ubuntu
+http://ftp.uni-kl.de/pub/linux/ubuntu
+http://ftp.uni-muenster.de/pub/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.unina.it/pub/linux/distributions/ubuntu
+http://ftp.uninett.no/ubuntu
+http://ftp.usf.edu/pub/ubuntu
+http://ftp.ussg.iu.edu/linux/ubuntu
+ftp://ftp.vectranet.pl/ubuntu
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/archives
+ftp://ftpserv.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://gd.tuwien.ac.at/opsys/linux/ubuntu/archive
+http://godel.cs.bilgi.edu.tr/ubuntu
+http://gulus.USherbrooke.ca/ubuntu
+http://hr.archive.ubuntu.com/ubuntu
+http://ie.archive.ubuntu.com/ubuntu
+http://klid.dk/ftp/ubuntu
+ftp://klid.dk/ubuntu
+http://kr.archive.ubuntu.com/ubuntu
+http://lug.mtu.edu/ubuntu
+http://mir1.ovh.net/ubuntu
+http://mirror.anl.gov/pub/ubuntu
+http://mirror.cc.columbia.edu/pub/linux/ubuntu/archive
+http://mirror.cs.umn.edu/ubuntu
+http://mirror.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirror.hgkz.ch/ubuntu
+http://mirror.imbrandon.com/ubuntu
+http://mirror.lcsee.wvu.edu/ubuntu
+http://mirror.letsopen.com/os/ubuntu
+http://mirror.lupaworld.com/ubuntu/archive
+http://mirror.nttu.edu.tw/ubuntu
+http://mirror.optus.net/ubuntu
+http://mirror.ox.ac.uk/sites/archive.ubuntu.com/ubuntu
+http://mirror.pacific.net.au/linux/ubuntu
+http://mirror.rootguide.org/ubuntu
+http://mirror.switch.ch/ftp/mirror/ubuntu
+ftp://mirror.switch.ch/mirror/ubuntu
+http://mirror.uni-c.dk/ubuntu
+http://mirror.utdlug.org/linux/distributions/ubuntu/packages
+http://mirror2.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirrors.cat.pdx.edu/ubuntu
+http://mirrors.ccs.neu.edu/archive.ubuntu.com
+ftp://mirrors.ccs.neu.edu/net/mirrors/archive.ubuntu.com
+http://mirrors.cs.wmich.edu/ubuntu
+ftp://mirrors.easynews.com/linux/ubuntu
+http://mirrors.kernel.org/ubuntu
+http://mirrors.nic.funet.fi/ubuntu
+http://mirrors.shlug.org/ubuntu
+ftp://mirrors.virginmedia.com/mirrors/ubuntu/archive
+http://mirrors.xmission.com/ubuntu
+http://mt.archive.ubuntu.com/ubuntu
+http://na.mirror.garr.it/mirrors/ubuntu-archive
+ftp://neacm.fe.up.pt/pub/ubuntu
+http://neacm.fe.up.pt/ubuntu
+http://nl.archive.ubuntu.com/ubuntu
+http://nl2.archive.ubuntu.com/ubuntu
+http://nz2.archive.ubuntu.com/ubuntu
+http://packages.midian.hu//pub/linux/distributions/ubuntu
+http://se.archive.ubuntu.com/ubuntu
+http://sft.if.usp.br/ubuntu
+http://snert.mi.hs-heilbronn.de/pub/ubuntu/ubuntu
+http://sunsite.informatik.rwth-aachen.de/ftp/pub/Linux/ubuntu/ubuntu
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/ubuntu/ubuntu
+http://tezcatl.fciencias.unam.mx/ubuntu
+http://th.archive.ubuntu.com/ubuntu
+ftp://tw.archive.ubuntu.com/ubuntu
+http://ubuntu-archive.datahop.it/ubuntu
+http://ubuntu.c3sl.ufpr.br/ubuntu
+http://ubuntu.cn99.com/ubuntu
+http://ubuntu.cs.uaf.edu/ubuntu
+http://ubuntu.cs.utah.edu/ubuntu
+http://ubuntu.csie.nctu.edu.tw/ubuntu
+http://ubuntu.eriders.ge/ubuntu
+http://ubuntu.fastbull.org/ubuntu
+http://ubuntu.indika.net.id/ubuntu
+http://ubuntu.inode.at/ubuntu
+http://ubuntu.intergenia.de/ubuntu
+http://ubuntu.ipacct.com/ubuntu
+http://ubuntu.lhi.is/ubuntu
+http://ubuntu.linux-bg.org/ubuntu
+ftp://ubuntu.mirror.ac.za/ubuntu-archive
+http://ubuntu.mirror.frontiernet.net/ubuntu
+http://ubuntu.mirror.rafal.ca/ubuntu
+http://ubuntu.mirrors.skynet.be/pub/ubuntu.com/ubuntu
+http://ubuntu.org.ua/ubuntu
+http://ubuntu.snet.uz/ubuntu
+http://ubuntu.supp.name/ubuntu
+http://ubuntu.task.gda.pl/ubuntu
+http://ubuntu.univ-nantes.fr/ubuntu
+http://ubuntu.uz/ubuntu
+http://ubuntu.ynet.sk/ubuntu
+http://www.gtlib.gatech.edu/pub/ubuntu
+http://www.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://www.nic.funet.fi/pub/mirrors/archive.ubuntu.com
+http://wwwftp.ciril.fr/pub/linux/ubuntu/archives
+ftp://yu.archive.ubuntu.com/ubuntu
diff --git a/src/lib/distro-info/ubuntu-8.10/mirrors/base_security b/src/lib/distro-info/ubuntu-8.10/mirrors/base_security
new file mode 100644
index 00000000..21789622
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-8.10/mirrors/base_security
@@ -0,0 +1,163 @@
+http://archive.ubuntu.com.ba/ubuntu
+http://archive.ubuntu.com/ubuntu
+http://br.archive.ubuntu.com/ubuntu
+http://bw.archive.ubuntu.com/ubuntu
+http://cl.archive.ubuntu.com/ubuntu
+http://cudlug.cudenver.edu/ubuntu
+ftp://cz.archive.ubuntu.com/MIRRORS/archive.ubuntu.com/mirror/ubuntu
+http://cz.archive.ubuntu.com/ubuntu
+ftp://darkstar.ist.utl.pt/pub/ubuntu/archive
+http://darkstar.ist.utl.pt/ubuntu/archive
+http://de.archive.ubuntu.com/ubuntu
+http://debian.charite.de/ubuntu
+http://debian.linux.org.tw/ubuntu
+http://dk.archive.ubuntu.com/ubuntu
+http://es.archive.ubuntu.com/ubuntu
+http://espelhos.edugraf.ufsc.br/ubuntu
+http://free.nchc.org.tw/ubuntu
+http://ftp-stud.fht-esslingen.de/Mirrors/ubuntu
+http://ftp-stud.hs-esslingen.de/ubuntu
+http://ftp.belnet.be/linux/ubuntu/ubuntu
+http://ftp.belnet.be/pub/mirror/ubuntu.com/ubuntu
+http://ftp.caliu.info/pub/distribucions/ubuntu/ubuntu
+http://ftp.chg.ru/pub/Linux/ubuntu/archive
+ftp://ftp.ciril.fr/pub/linux/ubuntu/archives
+http://ftp.citylink.co.nz/ubuntu
+http://ftp.crihan.fr/ubuntu
+ftp://ftp.cw.net/pub/linux/ftp.ubuntu.com/ubuntu
+http://ftp.cw.net/ubuntu
+http://ftp.dateleco.es/ubuntu
+http://ftp.dei.uc.pt/pub/linux/ubuntu/archive
+http://ftp.duth.gr/pub/ubuntu
+http://ftp.ecc.u-tokyo.ac.jp/ubuntu
+http://ftp.estpak.ee/ubuntu
+ftp://ftp.free.fr/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.freepark.org/ubuntu
+ftp://ftp.fu-berlin.de/linux/ubuntu
+ftp://ftp.funet.fi/pub/mirrors/archive.ubuntu.com
+http://ftp.gil.di.uminho.pt/ubuntu
+http://ftp.gui.uva.es/sites/ubuntu.com/ubuntu
+http://ftp.halifax.rwth-aachen.de/ubuntu
+http://ftp.heanet.ie/pub/ubuntu
+http://ftp.hosteurope.de/mirror/archive.ubuntu.com
+http://ftp.iinet.net.au/pub/ubuntu
+http://ftp.iitm.ac.in/ubuntu
+http://ftp.kaist.ac.kr/pub/ubuntu
+http://ftp.kfki.hu/linux/ubuntu
+ftp://ftp.kfki.hu/pub/linux/ubuntu
+http://ftp.leg.uct.ac.za/pub/linux/ubuntu
+http://ftp.linux.edu.lv/ubuntu
+http://ftp.lug.ro/ubuntu
+ftp://ftp.man.szczecin.pl/pub/Linux/ubuntu
+ftp://ftp.mipt.ru/mirror/ubuntu
+ftp://ftp.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://ftp.netspace.net.au/pub/ubuntu
+http://ftp.ntua.gr/pub/linux/ubuntu
+ftp://ftp.oleane.net/ubuntu
+ftp://ftp.otenet.gr/ubuntu
+http://ftp.pwr.wroc.pl/ubuntu
+ftp://ftp.rrzn.uni-hannover.de/pub/mirror/linux/ubuntu
+http://ftp.science.nus.edu.sg/ubuntu
+http://ftp.stw-bonn.de/ubuntu
+http://ftp.ticklers.org/archive.ubuntu.org/ubuntu
+ftp://ftp.tiscali.nl/pub/mirror/ubuntu
+http://ftp.tiscali.nl/ubuntu
+http://ftp.tu-chemnitz.de/pub/linux/ubuntu
+ftp://ftp.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://ftp.tuke.sk/ubuntu
+http://ftp.twaren.net/Linux/Ubuntu/ubuntu
+http://ftp.u-picardie.fr/mirror/ubuntu/ubuntu
+ftp://ftp.uasw.edu/linux/ubuntu/archive
+http://ftp.ucr.ac.cr/ubuntu
+http://ftp.udc.es/ubuntu
+http://ftp.uni-kl.de/pub/linux/ubuntu
+http://ftp.uni-muenster.de/pub/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.unina.it/pub/linux/distributions/ubuntu
+http://ftp.uninett.no/ubuntu
+http://ftp.usf.edu/pub/ubuntu
+http://ftp.ussg.iu.edu/linux/ubuntu
+ftp://ftp.vectranet.pl/ubuntu
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/archives
+ftp://ftpserv.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://gd.tuwien.ac.at/opsys/linux/ubuntu/archive
+http://godel.cs.bilgi.edu.tr/ubuntu
+http://gulus.USherbrooke.ca/ubuntu
+http://hr.archive.ubuntu.com/ubuntu
+http://ie.archive.ubuntu.com/ubuntu
+http://kr.archive.ubuntu.com/ubuntu
+http://lug.mtu.edu/ubuntu
+http://mir1.ovh.net/ubuntu
+http://mirror.anl.gov/pub/ubuntu
+http://mirror.cc.columbia.edu/pub/linux/ubuntu/archive
+http://mirror.cs.umn.edu/ubuntu
+http://mirror.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirror.hgkz.ch/ubuntu
+http://mirror.imbrandon.com/ubuntu
+http://mirror.lcsee.wvu.edu/ubuntu
+http://mirror.letsopen.com/os/ubuntu
+http://mirror.lupaworld.com/ubuntu/archive
+http://mirror.nttu.edu.tw/ubuntu
+http://mirror.optus.net/ubuntu
+http://mirror.ox.ac.uk/sites/archive.ubuntu.com/ubuntu
+http://mirror.pacific.net.au/linux/ubuntu
+http://mirror.rootguide.org/ubuntu
+http://mirror.switch.ch/ftp/mirror/ubuntu
+ftp://mirror.switch.ch/mirror/ubuntu
+http://mirror.uni-c.dk/ubuntu
+http://mirror.utdlug.org/linux/distributions/ubuntu/packages
+http://mirror2.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirrors.cat.pdx.edu/ubuntu
+http://mirrors.ccs.neu.edu/archive.ubuntu.com
+http://mirrors.cs.wmich.edu/ubuntu
+http://mirrors.easynews.com/linux/ubuntu
+http://mirrors.kernel.org/ubuntu
+http://mirrors.nic.funet.fi/ubuntu
+http://mirrors.shlug.org/ubuntu
+ftp://mirrors.virginmedia.com/mirrors/ubuntu/archive
+http://mirrors.xmission.com/ubuntu
+http://mt.archive.ubuntu.com/ubuntu
+http://na.mirror.garr.it/mirrors/ubuntu-archive
+ftp://neacm.fe.up.pt/pub/ubuntu
+http://neacm.fe.up.pt/ubuntu
+http://nl.archive.ubuntu.com/ubuntu
+http://nl2.archive.ubuntu.com/ubuntu
+http://nz2.archive.ubuntu.com/ubuntu
+http://packages.midian.hu//pub/linux/distributions/ubuntu
+http://se.archive.ubuntu.com/ubuntu
+http://sft.if.usp.br/ubuntu
+http://snert.mi.hs-heilbronn.de/pub/ubuntu/ubuntu
+http://sunsite.informatik.rwth-aachen.de/ftp/pub/Linux/ubuntu/ubuntu
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/ubuntu/ubuntu
+http://tezcatl.fciencias.unam.mx/ubuntu
+http://th.archive.ubuntu.com/ubuntu
+http://tw.archive.ubuntu.com/ubuntu
+http://ubuntu-archive.datahop.it/ubuntu
+http://ubuntu.c3sl.ufpr.br/ubuntu
+http://ubuntu.cn99.com/ubuntu
+http://ubuntu.cs.uaf.edu/ubuntu
+http://ubuntu.cs.utah.edu/ubuntu
+http://ubuntu.csie.nctu.edu.tw/ubuntu
+http://ubuntu.eriders.ge/ubuntu
+http://ubuntu.fastbull.org/ubuntu
+http://ubuntu.indika.net.id/ubuntu
+http://ubuntu.inode.at/ubuntu
+http://ubuntu.intergenia.de/ubuntu
+http://ubuntu.ipacct.com/ubuntu
+http://ubuntu.lhi.is/ubuntu
+http://ubuntu.linux-bg.org/ubuntu
+http://ubuntu.mirror.ac.za/ubuntu-archive
+http://ubuntu.mirror.frontiernet.net/ubuntu
+http://ubuntu.mirror.rafal.ca/ubuntu
+http://ubuntu.mirrors.skynet.be/pub/ubuntu.com/ubuntu
+http://ubuntu.org.ua/ubuntu
+http://ubuntu.snet.uz/ubuntu
+http://ubuntu.supp.name/ubuntu
+http://ubuntu.task.gda.pl/ubuntu
+http://ubuntu.univ-nantes.fr/ubuntu
+http://ubuntu.uz/ubuntu
+http://ubuntu.ynet.sk/ubuntu
+http://www.gtlib.gatech.edu/pub/ubuntu
+http://www.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://www.nic.funet.fi/pub/mirrors/archive.ubuntu.com
+http://wwwftp.ciril.fr/pub/linux/ubuntu/archives
+ftp://yu.archive.ubuntu.com/ubuntu
diff --git a/src/lib/distro-info/ubuntu-8.10/mirrors/base_updates b/src/lib/distro-info/ubuntu-8.10/mirrors/base_updates
new file mode 100644
index 00000000..3b936ecf
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-8.10/mirrors/base_updates
@@ -0,0 +1,171 @@
+http://archive.ubuntu.com.ba/ubuntu
+http://archive.ubuntu.com/ubuntu
+ftp://br.archive.ubuntu.com/ubuntu
+ftp://bw.archive.ubuntu.com/ubuntu
+http://cl.archive.ubuntu.com/ubuntu
+http://cudlug.cudenver.edu/ubuntu
+ftp://cz.archive.ubuntu.com/MIRRORS/archive.ubuntu.com/mirror/ubuntu
+http://cz.archive.ubuntu.com/ubuntu
+ftp://darkstar.ist.utl.pt/pub/ubuntu/archive
+http://darkstar.ist.utl.pt/ubuntu/archive
+http://de.archive.ubuntu.com/ubuntu
+http://debian.charite.de/ubuntu
+http://debian.linux.org.tw/ubuntu
+http://dk.archive.ubuntu.com/ubuntu
+http://es.archive.ubuntu.com/ubuntu
+http://espelhos.edugraf.ufsc.br/ubuntu
+ftp://free.nchc.org.tw/ubuntu
+http://ftp-stud.fht-esslingen.de/Mirrors/ubuntu
+http://ftp-stud.hs-esslingen.de/ubuntu
+http://ftp.belnet.be/linux/ubuntu/ubuntu
+http://ftp.belnet.be/pub/mirror/ubuntu.com/ubuntu
+http://ftp.caliu.info/pub/distribucions/ubuntu/ubuntu
+http://ftp.chg.ru/pub/Linux/ubuntu/archive
+ftp://ftp.ciril.fr/pub/linux/ubuntu/archives
+http://ftp.citylink.co.nz/ubuntu
+http://ftp.crihan.fr/ubuntu
+ftp://ftp.cw.net/pub/linux/ftp.ubuntu.com/ubuntu
+http://ftp.cw.net/ubuntu
+http://ftp.dateleco.es/ubuntu
+http://ftp.dei.uc.pt/pub/linux/ubuntu/archive
+http://ftp.duth.gr/pub/ubuntu
+http://ftp.ecc.u-tokyo.ac.jp/ubuntu
+http://ftp.estpak.ee/ubuntu
+ftp://ftp.free.fr/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.freepark.org/ubuntu
+ftp://ftp.fu-berlin.de/linux/ubuntu
+ftp://ftp.funet.fi/pub/mirrors/archive.ubuntu.com
+http://ftp.gil.di.uminho.pt/ubuntu
+ftp://ftp.gtlib.gatech.edu/pub/ubuntu
+http://ftp.gui.uva.es/sites/ubuntu.com/ubuntu
+http://ftp.halifax.rwth-aachen.de/ubuntu
+http://ftp.heanet.ie/pub/ubuntu
+http://ftp.hosteurope.de/mirror/archive.ubuntu.com
+ftp://ftp.iinet.net.au/pub/ubuntu
+ftp://ftp.iitm.ac.in/ubuntu
+http://ftp.kaist.ac.kr/pub/ubuntu
+http://ftp.kfki.hu/linux/ubuntu
+ftp://ftp.kfki.hu/pub/linux/ubuntu
+http://ftp.leg.uct.ac.za/pub/linux/ubuntu
+http://ftp.linux.edu.lv/ubuntu
+ftp://ftp.linux.org.tr/pub/ubuntu
+http://ftp.lug.ro/ubuntu
+ftp://ftp.man.szczecin.pl/pub/Linux/ubuntu
+ftp://ftp.mipt.ru/mirror/ubuntu
+ftp://ftp.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://ftp.netspace.net.au/pub/ubuntu
+http://ftp.ntua.gr/pub/linux/ubuntu
+ftp://ftp.oleane.net/ubuntu
+ftp://ftp.otenet.gr/ubuntu
+ftp://ftp.polytechnic.edu.na/pub/ubuntu
+http://ftp.port80.se/ubuntu
+http://ftp.pwr.wroc.pl/ubuntu
+ftp://ftp.rrzn.uni-hannover.de/pub/mirror/linux/ubuntu
+ftp://ftp.science.nus.edu.sg/pub/ubuntu
+http://ftp.science.nus.edu.sg/ubuntu
+http://ftp.stw-bonn.de/ubuntu
+http://ftp.ticklers.org/archive.ubuntu.org/ubuntu
+ftp://ftp.tiscali.nl/pub/mirror/ubuntu
+http://ftp.tiscali.nl/ubuntu
+http://ftp.tu-chemnitz.de/pub/linux/ubuntu
+ftp://ftp.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://ftp.tuke.sk/ubuntu
+http://ftp.twaren.net/Linux/Ubuntu/ubuntu
+http://ftp.u-picardie.fr/mirror/ubuntu/ubuntu
+ftp://ftp.uasw.edu/linux/ubuntu/archive
+http://ftp.ucr.ac.cr/ubuntu
+http://ftp.udc.es/ubuntu
+http://ftp.uni-kl.de/pub/linux/ubuntu
+http://ftp.uni-muenster.de/pub/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.unina.it/pub/linux/distributions/ubuntu
+http://ftp.uninett.no/ubuntu
+http://ftp.usf.edu/pub/ubuntu
+http://ftp.ussg.iu.edu/linux/ubuntu
+ftp://ftp.vectranet.pl/ubuntu
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/archives
+ftp://ftpserv.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://gd.tuwien.ac.at/opsys/linux/ubuntu/archive
+http://godel.cs.bilgi.edu.tr/ubuntu
+http://gulus.USherbrooke.ca/ubuntu
+http://hr.archive.ubuntu.com/ubuntu
+http://ie.archive.ubuntu.com/ubuntu
+http://klid.dk/ftp/ubuntu
+ftp://klid.dk/ubuntu
+http://kr.archive.ubuntu.com/ubuntu
+http://lug.mtu.edu/ubuntu
+http://mir1.ovh.net/ubuntu
+http://mirror.anl.gov/pub/ubuntu
+http://mirror.cc.columbia.edu/pub/linux/ubuntu/archive
+http://mirror.cs.umn.edu/ubuntu
+http://mirror.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirror.hgkz.ch/ubuntu
+http://mirror.imbrandon.com/ubuntu
+http://mirror.lcsee.wvu.edu/ubuntu
+http://mirror.letsopen.com/os/ubuntu
+http://mirror.lupaworld.com/ubuntu/archive
+http://mirror.nttu.edu.tw/ubuntu
+http://mirror.optus.net/ubuntu
+http://mirror.ox.ac.uk/sites/archive.ubuntu.com/ubuntu
+http://mirror.pacific.net.au/linux/ubuntu
+http://mirror.rootguide.org/ubuntu
+http://mirror.switch.ch/ftp/mirror/ubuntu
+ftp://mirror.switch.ch/mirror/ubuntu
+http://mirror.uni-c.dk/ubuntu
+http://mirror.utdlug.org/linux/distributions/ubuntu/packages
+http://mirror2.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirrors.cat.pdx.edu/ubuntu
+http://mirrors.ccs.neu.edu/archive.ubuntu.com
+ftp://mirrors.ccs.neu.edu/net/mirrors/archive.ubuntu.com
+http://mirrors.cs.wmich.edu/ubuntu
+ftp://mirrors.easynews.com/linux/ubuntu
+http://mirrors.kernel.org/ubuntu
+http://mirrors.nic.funet.fi/ubuntu
+http://mirrors.shlug.org/ubuntu
+ftp://mirrors.virginmedia.com/mirrors/ubuntu/archive
+http://mirrors.xmission.com/ubuntu
+http://mt.archive.ubuntu.com/ubuntu
+http://na.mirror.garr.it/mirrors/ubuntu-archive
+ftp://neacm.fe.up.pt/pub/ubuntu
+http://neacm.fe.up.pt/ubuntu
+http://nl.archive.ubuntu.com/ubuntu
+http://nl2.archive.ubuntu.com/ubuntu
+http://nz2.archive.ubuntu.com/ubuntu
+http://packages.midian.hu//pub/linux/distributions/ubuntu
+http://se.archive.ubuntu.com/ubuntu
+http://sft.if.usp.br/ubuntu
+http://snert.mi.hs-heilbronn.de/pub/ubuntu/ubuntu
+http://sunsite.informatik.rwth-aachen.de/ftp/pub/Linux/ubuntu/ubuntu
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/ubuntu/ubuntu
+http://tezcatl.fciencias.unam.mx/ubuntu
+http://th.archive.ubuntu.com/ubuntu
+ftp://tw.archive.ubuntu.com/ubuntu
+http://ubuntu-archive.datahop.it/ubuntu
+http://ubuntu.c3sl.ufpr.br/ubuntu
+http://ubuntu.cn99.com/ubuntu
+http://ubuntu.cs.uaf.edu/ubuntu
+http://ubuntu.cs.utah.edu/ubuntu
+http://ubuntu.csie.nctu.edu.tw/ubuntu
+http://ubuntu.eriders.ge/ubuntu
+http://ubuntu.fastbull.org/ubuntu
+http://ubuntu.indika.net.id/ubuntu
+http://ubuntu.inode.at/ubuntu
+http://ubuntu.intergenia.de/ubuntu
+http://ubuntu.ipacct.com/ubuntu
+http://ubuntu.lhi.is/ubuntu
+http://ubuntu.linux-bg.org/ubuntu
+ftp://ubuntu.mirror.ac.za/ubuntu-archive
+http://ubuntu.mirror.frontiernet.net/ubuntu
+http://ubuntu.mirror.rafal.ca/ubuntu
+http://ubuntu.mirrors.skynet.be/pub/ubuntu.com/ubuntu
+http://ubuntu.org.ua/ubuntu
+http://ubuntu.snet.uz/ubuntu
+http://ubuntu.supp.name/ubuntu
+http://ubuntu.task.gda.pl/ubuntu
+http://ubuntu.univ-nantes.fr/ubuntu
+http://ubuntu.uz/ubuntu
+http://ubuntu.ynet.sk/ubuntu
+http://www.gtlib.gatech.edu/pub/ubuntu
+http://www.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://www.nic.funet.fi/pub/mirrors/archive.ubuntu.com
+http://wwwftp.ciril.fr/pub/linux/ubuntu/archives
+ftp://yu.archive.ubuntu.com/ubuntu
diff --git a/src/lib/distro-info/ubuntu-8.10/prereqfiles/etc/hosts b/src/lib/distro-info/ubuntu-8.10/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-8.10/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/ubuntu-8.10/settings.default b/src/lib/distro-info/ubuntu-8.10/settings.default
new file mode 100644
index 00000000..4945b343
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-8.10/settings.default
@@ -0,0 +1,76 @@
+arch = i386
+package-subdir = pool
+prereq-packages = main/d/debootstrap/debootstrap_1.0.10ubuntu1~intrepid1_all.deb
+release-name = hardy
+<repository base>
+ components = main restricted
+ distribution = intrepid
+ name = Ubuntu 8.10
+ repo-subdir = dists
+ file-for-speedtest = dists/intrepid/main/binary-i386/Packages.bz2
+</repository>
+<repository base_security>
+ components = main restricted
+ distribution = intrepid-security
+ name = Ubuntu 8.10 Security
+ repo-subdir = dists
+ file-for-speedtest = dists/intrepid-security/main/binary-i386/Packages.bz2
+</repository>
+<repository base_updates>
+ components = main restricted
+ distribution = intrepid-updates
+ name = Ubuntu 8.10 Updates
+ repo-subdir = dists
+ file-for-speedtest = dists/intrepid-updates/main/binary-i386/Packages.bz2
+</repository>
+<selection minimal>
+ packages = <<END
+ language-pack-de
+ linux-image-generic
+ END
+</selection>
+<selection standard>
+ base = minimal
+ packages = <<END
+ ubuntu-standard
+ END
+</selection>
+<selection gnome>
+ base = minimal
+ packages = <<END
+ ubuntu-desktop
+ END
+</selection>
+<selection kde>
+ base = minimal
+ packages = <<END
+ kubuntu-desktop
+ END
+</selection>
+<selection xfce>
+ base = minimal
+ packages = <<END
+ xubuntu-desktop
+ END
+</selection>
+<selection edubuntu-server>
+ base = minimal
+ packages = <<END
+ edubuntu-server
+ END
+</selection>
+<selection edubuntu-gnome>
+ base = minimal
+ packages = <<END
+ edubuntu-desktop-gnome
+ END
+</selection>
+<selection edubuntu-kde>
+ base = minimal
+ packages = <<END
+ edubuntu-desktop-kde
+ END
+</selection>
+<selection default>
+ base = minimal
+</selection>
diff --git a/src/lib/distro-info/ubuntu-8.10/settings.example b/src/lib/distro-info/ubuntu-8.10/settings.example
new file mode 100644
index 00000000..31881c4c
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-8.10/settings.example
@@ -0,0 +1,23 @@
+# rename this file to 'settings' and edit it as you please
+#
+# for a list of all options, have a look at the corresponding
+# settings.default in /opt/openslx/share/distro-info
+
+# use local installation source
+#<repository base>
+# local-url = /srv/ftp/pub/ubuntu
+#</repository>
+#<repository base_updates>
+# local-url = /srv/ftp/pub/ubuntu
+#</repository>
+#<repository base_security>
+# local-url = /srv/ftp/pub/ubuntu
+#</repository>
+
+# add a new selection:
+#<selection my_kde>
+# base = kde
+# packages = <<END
+# kinternet
+# END
+#</selection>
diff --git a/src/lib/distro-info/ubuntu-9.04/mirrors/base b/src/lib/distro-info/ubuntu-9.04/mirrors/base
new file mode 100644
index 00000000..cddbef70
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-9.04/mirrors/base
@@ -0,0 +1,162 @@
+http://archive.ubuntu.com.ba/ubuntu
+http://archive.ubuntu.com/ubuntu
+ftp://br.archive.ubuntu.com/ubuntu
+ftp://bw.archive.ubuntu.com/ubuntu
+http://cl.archive.ubuntu.com/ubuntu
+http://cudlug.cudenver.edu/ubuntu
+http://cz.archive.ubuntu.com/ubuntu
+ftp://darkstar.ist.utl.pt/pub/ubuntu/archive
+http://darkstar.ist.utl.pt/ubuntu/archive
+http://de.archive.ubuntu.com/ubuntu
+http://debian.charite.de/ubuntu
+http://debian.linux.org.tw/ubuntu
+http://dk.archive.ubuntu.com/ubuntu
+http://es.archive.ubuntu.com/ubuntu
+http://espelhos.edugraf.ufsc.br/ubuntu
+ftp://free.nchc.org.tw/ubuntu
+http://ftp-stud.fht-esslingen.de/Mirrors/ubuntu
+http://ftp-stud.hs-esslingen.de/ubuntu
+http://ftp.belnet.be/linux/ubuntu/ubuntu
+http://ftp.belnet.be/pub/mirror/ubuntu.com/ubuntu
+http://ftp.caliu.info/pub/distribucions/ubuntu/ubuntu
+http://ftp.chg.ru/pub/Linux/ubuntu/archive
+ftp://ftp.ciril.fr/pub/linux/ubuntu/archives
+http://ftp.citylink.co.nz/ubuntu
+http://ftp.crihan.fr/ubuntu
+ftp://ftp.cw.net/pub/linux/ftp.ubuntu.com/ubuntu
+http://ftp.cw.net/ubuntu
+http://ftp.dateleco.es/ubuntu
+http://ftp.dei.uc.pt/pub/linux/ubuntu/archive
+http://ftp.duth.gr/pub/ubuntu
+http://ftp.ecc.u-tokyo.ac.jp/ubuntu
+http://ftp.estpak.ee/ubuntu
+ftp://ftp.free.fr/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.freepark.org/ubuntu
+ftp://ftp.fu-berlin.de/linux/ubuntu
+ftp://ftp.funet.fi/pub/mirrors/archive.ubuntu.com
+http://ftp.gil.di.uminho.pt/ubuntu
+ftp://ftp.gtlib.gatech.edu/pub/ubuntu
+http://ftp.gui.uva.es/sites/ubuntu.com/ubuntu
+http://ftp.heanet.ie/pub/ubuntu
+http://ftp.hosteurope.de/mirror/archive.ubuntu.com
+ftp://ftp.iinet.net.au/pub/ubuntu
+ftp://ftp.iitm.ac.in/ubuntu
+http://ftp.kaist.ac.kr/pub/ubuntu
+http://ftp.kfki.hu/linux/ubuntu
+ftp://ftp.kfki.hu/pub/linux/ubuntu
+http://ftp.leg.uct.ac.za/pub/linux/ubuntu
+http://ftp.linux.edu.lv/ubuntu
+ftp://ftp.linux.org.tr/pub/ubuntu
+http://ftp.lug.ro/ubuntu
+ftp://ftp.man.szczecin.pl/pub/Linux/ubuntu
+ftp://ftp.mipt.ru/mirror/ubuntu
+ftp://ftp.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://ftp.netspace.net.au/pub/ubuntu
+http://ftp.ntua.gr/pub/linux/ubuntu
+ftp://ftp.oleane.net/ubuntu
+ftp://ftp.otenet.gr/ubuntu
+http://ftp.port80.se/ubuntu
+http://ftp.pwr.wroc.pl/ubuntu
+ftp://ftp.rrzn.uni-hannover.de/pub/mirror/linux/ubuntu
+ftp://ftp.science.nus.edu.sg/pub/ubuntu
+http://ftp.science.nus.edu.sg/ubuntu
+http://ftp.stw-bonn.de/ubuntu
+http://ftp.ticklers.org/archive.ubuntu.org/ubuntu
+ftp://ftp.tiscali.nl/pub/mirror/ubuntu
+http://ftp.tiscali.nl/ubuntu
+http://ftp.tu-chemnitz.de/pub/linux/ubuntu
+ftp://ftp.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://ftp.tuke.sk/ubuntu
+http://ftp.twaren.net/Linux/Ubuntu/ubuntu
+http://ftp.u-picardie.fr/mirror/ubuntu/ubuntu
+ftp://ftp.uasw.edu/linux/ubuntu/archive
+http://ftp.ucr.ac.cr/ubuntu
+http://ftp.udc.es/ubuntu
+http://ftp.uni-kl.de/pub/linux/ubuntu
+http://ftp.uni-muenster.de/pub/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.unina.it/pub/linux/distributions/ubuntu
+http://ftp.uninett.no/ubuntu
+http://ftp.usf.edu/pub/ubuntu
+http://ftp.ussg.iu.edu/linux/ubuntu
+ftp://ftp.vectranet.pl/ubuntu
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/archives
+ftp://ftpserv.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://gd.tuwien.ac.at/opsys/linux/ubuntu/archive
+http://godel.cs.bilgi.edu.tr/ubuntu
+http://gulus.USherbrooke.ca/ubuntu
+http://hr.archive.ubuntu.com/ubuntu
+http://ie.archive.ubuntu.com/ubuntu
+http://klid.dk/ftp/ubuntu
+ftp://klid.dk/ubuntu
+http://kr.archive.ubuntu.com/ubuntu
+http://lug.mtu.edu/ubuntu
+http://mir1.ovh.net/ubuntu
+http://mirror.anl.gov/pub/ubuntu
+http://mirror.cc.columbia.edu/pub/linux/ubuntu/archive
+http://mirror.cs.umn.edu/ubuntu
+http://mirror.hgkz.ch/ubuntu
+http://mirror.imbrandon.com/ubuntu
+http://mirror.lcsee.wvu.edu/ubuntu
+http://mirror.letsopen.com/os/ubuntu
+http://mirror.lupaworld.com/ubuntu/archive
+http://mirror.nttu.edu.tw/ubuntu
+http://mirror.optus.net/ubuntu
+http://mirror.ox.ac.uk/sites/archive.ubuntu.com/ubuntu
+http://mirror.pacific.net.au/linux/ubuntu
+http://mirror.rootguide.org/ubuntu
+http://mirror.switch.ch/ftp/mirror/ubuntu
+ftp://mirror.switch.ch/mirror/ubuntu
+http://mirror.uni-c.dk/ubuntu
+http://mirror.utdlug.org/linux/distributions/ubuntu/packages
+http://mirrors.cat.pdx.edu/ubuntu
+http://mirrors.ccs.neu.edu/archive.ubuntu.com
+ftp://mirrors.ccs.neu.edu/net/mirrors/archive.ubuntu.com
+http://mirrors.cs.wmich.edu/ubuntu
+ftp://mirrors.easynews.com/linux/ubuntu
+http://mirrors.kernel.org/ubuntu
+http://mirrors.nic.funet.fi/ubuntu
+http://mirrors.shlug.org/ubuntu
+ftp://mirrors.virginmedia.com/mirrors/ubuntu/archive
+http://mirrors.xmission.com/ubuntu
+http://mt.archive.ubuntu.com/ubuntu
+http://na.mirror.garr.it/mirrors/ubuntu-archive
+ftp://neacm.fe.up.pt/pub/ubuntu
+http://neacm.fe.up.pt/ubuntu
+http://nl.archive.ubuntu.com/ubuntu
+http://nl2.archive.ubuntu.com/ubuntu
+http://nz2.archive.ubuntu.com/ubuntu
+http://packages.midian.hu//pub/linux/distributions/ubuntu
+http://se.archive.ubuntu.com/ubuntu
+http://sft.if.usp.br/ubuntu
+http://snert.mi.hs-heilbronn.de/pub/ubuntu/ubuntu
+http://sunsite.informatik.rwth-aachen.de/ftp/pub/Linux/ubuntu/ubuntu
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/ubuntu/ubuntu
+http://tezcatl.fciencias.unam.mx/ubuntu
+http://th.archive.ubuntu.com/ubuntu
+ftp://tw.archive.ubuntu.com/ubuntu
+http://ubuntu-archive.datahop.it/ubuntu
+http://ubuntu.c3sl.ufpr.br/ubuntu
+http://ubuntu.cn99.com/ubuntu
+http://ubuntu.cs.utah.edu/ubuntu
+http://ubuntu.csie.nctu.edu.tw/ubuntu
+http://ubuntu.eriders.ge/ubuntu
+http://ubuntu.fastbull.org/ubuntu
+http://ubuntu.indika.net.id/ubuntu
+http://ubuntu.inode.at/ubuntu
+http://ubuntu.intergenia.de/ubuntu
+http://ubuntu.ipacct.com/ubuntu
+http://ubuntu.lhi.is/ubuntu
+http://ubuntu.linux-bg.org/ubuntu
+http://ubuntu.mirror.frontiernet.net/ubuntu
+http://ubuntu.mirror.rafal.ca/ubuntu
+http://ubuntu.mirrors.skynet.be/pub/ubuntu.com/ubuntu
+http://ubuntu.snet.uz/ubuntu
+http://ubuntu.supp.name/ubuntu
+http://ubuntu.task.gda.pl/ubuntu
+http://ubuntu.univ-nantes.fr/ubuntu
+http://ubuntu.uz/ubuntu
+http://ubuntu.ynet.sk/ubuntu
+http://www.gtlib.gatech.edu/pub/ubuntu
+http://www.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://www.nic.funet.fi/pub/mirrors/archive.ubuntu.com
+ftp://yu.archive.ubuntu.com/ubuntu
diff --git a/src/lib/distro-info/ubuntu-9.04/mirrors/base_security b/src/lib/distro-info/ubuntu-9.04/mirrors/base_security
new file mode 100644
index 00000000..3617b3dd
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-9.04/mirrors/base_security
@@ -0,0 +1,162 @@
+http://archive.ubuntu.com.ba/ubuntu
+http://archive.ubuntu.com/ubuntu
+http://br.archive.ubuntu.com/ubuntu
+http://bw.archive.ubuntu.com/ubuntu
+http://cl.archive.ubuntu.com/ubuntu
+http://cudlug.cudenver.edu/ubuntu
+ftp://cz.archive.ubuntu.com/MIRRORS/archive.ubuntu.com/mirror/ubuntu
+http://cz.archive.ubuntu.com/ubuntu
+ftp://darkstar.ist.utl.pt/pub/ubuntu/archive
+http://darkstar.ist.utl.pt/ubuntu/archive
+http://de.archive.ubuntu.com/ubuntu
+http://debian.charite.de/ubuntu
+http://debian.linux.org.tw/ubuntu
+http://dk.archive.ubuntu.com/ubuntu
+http://es.archive.ubuntu.com/ubuntu
+http://espelhos.edugraf.ufsc.br/ubuntu
+http://free.nchc.org.tw/ubuntu
+http://ftp-stud.fht-esslingen.de/Mirrors/ubuntu
+http://ftp-stud.hs-esslingen.de/ubuntu
+http://ftp.belnet.be/linux/ubuntu/ubuntu
+http://ftp.belnet.be/pub/mirror/ubuntu.com/ubuntu
+http://ftp.caliu.info/pub/distribucions/ubuntu/ubuntu
+http://ftp.chg.ru/pub/Linux/ubuntu/archive
+ftp://ftp.ciril.fr/pub/linux/ubuntu/archives
+http://ftp.citylink.co.nz/ubuntu
+http://ftp.crihan.fr/ubuntu
+ftp://ftp.cw.net/pub/linux/ftp.ubuntu.com/ubuntu
+http://ftp.cw.net/ubuntu
+http://ftp.dateleco.es/ubuntu
+http://ftp.dei.uc.pt/pub/linux/ubuntu/archive
+http://ftp.duth.gr/pub/ubuntu
+http://ftp.ecc.u-tokyo.ac.jp/ubuntu
+http://ftp.estpak.ee/ubuntu
+ftp://ftp.free.fr/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.freepark.org/ubuntu
+ftp://ftp.fu-berlin.de/linux/ubuntu
+ftp://ftp.funet.fi/pub/mirrors/archive.ubuntu.com
+http://ftp.gil.di.uminho.pt/ubuntu
+http://ftp.gui.uva.es/sites/ubuntu.com/ubuntu
+http://ftp.halifax.rwth-aachen.de/ubuntu
+http://ftp.heanet.ie/pub/ubuntu
+http://ftp.hosteurope.de/mirror/archive.ubuntu.com
+http://ftp.iinet.net.au/pub/ubuntu
+http://ftp.iitm.ac.in/ubuntu
+http://ftp.kaist.ac.kr/pub/ubuntu
+http://ftp.kfki.hu/linux/ubuntu
+ftp://ftp.kfki.hu/pub/linux/ubuntu
+http://ftp.leg.uct.ac.za/pub/linux/ubuntu
+http://ftp.linux.edu.lv/ubuntu
+http://ftp.lug.ro/ubuntu
+ftp://ftp.man.szczecin.pl/pub/Linux/ubuntu
+ftp://ftp.mipt.ru/mirror/ubuntu
+ftp://ftp.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://ftp.netspace.net.au/pub/ubuntu
+http://ftp.ntua.gr/pub/linux/ubuntu
+ftp://ftp.oleane.net/ubuntu
+ftp://ftp.otenet.gr/ubuntu
+http://ftp.pwr.wroc.pl/ubuntu
+ftp://ftp.rrzn.uni-hannover.de/pub/mirror/linux/ubuntu
+http://ftp.science.nus.edu.sg/ubuntu
+http://ftp.stw-bonn.de/ubuntu
+http://ftp.ticklers.org/archive.ubuntu.org/ubuntu
+ftp://ftp.tiscali.nl/pub/mirror/ubuntu
+http://ftp.tiscali.nl/ubuntu
+http://ftp.tu-chemnitz.de/pub/linux/ubuntu
+ftp://ftp.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://ftp.tuke.sk/ubuntu
+http://ftp.twaren.net/Linux/Ubuntu/ubuntu
+http://ftp.u-picardie.fr/mirror/ubuntu/ubuntu
+ftp://ftp.uasw.edu/linux/ubuntu/archive
+http://ftp.ucr.ac.cr/ubuntu
+http://ftp.udc.es/ubuntu
+http://ftp.uni-kl.de/pub/linux/ubuntu
+http://ftp.uni-muenster.de/pub/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.unina.it/pub/linux/distributions/ubuntu
+http://ftp.uninett.no/ubuntu
+http://ftp.usf.edu/pub/ubuntu
+http://ftp.ussg.iu.edu/linux/ubuntu
+ftp://ftp.vectranet.pl/ubuntu
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/archives
+ftp://ftpserv.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://gd.tuwien.ac.at/opsys/linux/ubuntu/archive
+http://godel.cs.bilgi.edu.tr/ubuntu
+http://gulus.USherbrooke.ca/ubuntu
+http://hr.archive.ubuntu.com/ubuntu
+http://ie.archive.ubuntu.com/ubuntu
+http://kr.archive.ubuntu.com/ubuntu
+http://lug.mtu.edu/ubuntu
+http://mir1.ovh.net/ubuntu
+http://mirror.anl.gov/pub/ubuntu
+http://mirror.cc.columbia.edu/pub/linux/ubuntu/archive
+http://mirror.cs.umn.edu/ubuntu
+http://mirror.hgkz.ch/ubuntu
+http://mirror.imbrandon.com/ubuntu
+http://mirror.lcsee.wvu.edu/ubuntu
+http://mirror.letsopen.com/os/ubuntu
+http://mirror.lupaworld.com/ubuntu/archive
+http://mirror.nttu.edu.tw/ubuntu
+http://mirror.optus.net/ubuntu
+http://mirror.ox.ac.uk/sites/archive.ubuntu.com/ubuntu
+http://mirror.pacific.net.au/linux/ubuntu
+http://mirror.rootguide.org/ubuntu
+http://mirror.switch.ch/ftp/mirror/ubuntu
+ftp://mirror.switch.ch/mirror/ubuntu
+http://mirror.uni-c.dk/ubuntu
+http://mirror.utdlug.org/linux/distributions/ubuntu/packages
+http://mirror2.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirrors.cat.pdx.edu/ubuntu
+http://mirrors.ccs.neu.edu/archive.ubuntu.com
+http://mirrors.cs.wmich.edu/ubuntu
+http://mirrors.easynews.com/linux/ubuntu
+http://mirrors.kernel.org/ubuntu
+http://mirrors.nic.funet.fi/ubuntu
+http://mirrors.shlug.org/ubuntu
+ftp://mirrors.virginmedia.com/mirrors/ubuntu/archive
+http://mirrors.xmission.com/ubuntu
+http://mt.archive.ubuntu.com/ubuntu
+http://na.mirror.garr.it/mirrors/ubuntu-archive
+ftp://neacm.fe.up.pt/pub/ubuntu
+http://neacm.fe.up.pt/ubuntu
+http://nl.archive.ubuntu.com/ubuntu
+http://nl2.archive.ubuntu.com/ubuntu
+http://nz2.archive.ubuntu.com/ubuntu
+http://packages.midian.hu//pub/linux/distributions/ubuntu
+http://se.archive.ubuntu.com/ubuntu
+http://sft.if.usp.br/ubuntu
+http://snert.mi.hs-heilbronn.de/pub/ubuntu/ubuntu
+http://sunsite.informatik.rwth-aachen.de/ftp/pub/Linux/ubuntu/ubuntu
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/ubuntu/ubuntu
+http://tezcatl.fciencias.unam.mx/ubuntu
+http://th.archive.ubuntu.com/ubuntu
+http://tw.archive.ubuntu.com/ubuntu
+http://ubuntu-archive.datahop.it/ubuntu
+http://ubuntu.c3sl.ufpr.br/ubuntu
+http://ubuntu.cn99.com/ubuntu
+http://ubuntu.cs.uaf.edu/ubuntu
+http://ubuntu.cs.utah.edu/ubuntu
+http://ubuntu.csie.nctu.edu.tw/ubuntu
+http://ubuntu.eriders.ge/ubuntu
+http://ubuntu.fastbull.org/ubuntu
+http://ubuntu.indika.net.id/ubuntu
+http://ubuntu.inode.at/ubuntu
+http://ubuntu.intergenia.de/ubuntu
+http://ubuntu.ipacct.com/ubuntu
+http://ubuntu.lhi.is/ubuntu
+http://ubuntu.linux-bg.org/ubuntu
+http://ubuntu.mirror.ac.za/ubuntu-archive
+http://ubuntu.mirror.frontiernet.net/ubuntu
+http://ubuntu.mirror.rafal.ca/ubuntu
+http://ubuntu.mirrors.skynet.be/pub/ubuntu.com/ubuntu
+http://ubuntu.org.ua/ubuntu
+http://ubuntu.snet.uz/ubuntu
+http://ubuntu.supp.name/ubuntu
+http://ubuntu.task.gda.pl/ubuntu
+http://ubuntu.univ-nantes.fr/ubuntu
+http://ubuntu.uz/ubuntu
+http://ubuntu.ynet.sk/ubuntu
+http://www.gtlib.gatech.edu/pub/ubuntu
+http://www.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://www.nic.funet.fi/pub/mirrors/archive.ubuntu.com
+http://wwwftp.ciril.fr/pub/linux/ubuntu/archives
+ftp://yu.archive.ubuntu.com/ubuntu
diff --git a/src/lib/distro-info/ubuntu-9.04/mirrors/base_updates b/src/lib/distro-info/ubuntu-9.04/mirrors/base_updates
new file mode 100644
index 00000000..3b936ecf
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-9.04/mirrors/base_updates
@@ -0,0 +1,171 @@
+http://archive.ubuntu.com.ba/ubuntu
+http://archive.ubuntu.com/ubuntu
+ftp://br.archive.ubuntu.com/ubuntu
+ftp://bw.archive.ubuntu.com/ubuntu
+http://cl.archive.ubuntu.com/ubuntu
+http://cudlug.cudenver.edu/ubuntu
+ftp://cz.archive.ubuntu.com/MIRRORS/archive.ubuntu.com/mirror/ubuntu
+http://cz.archive.ubuntu.com/ubuntu
+ftp://darkstar.ist.utl.pt/pub/ubuntu/archive
+http://darkstar.ist.utl.pt/ubuntu/archive
+http://de.archive.ubuntu.com/ubuntu
+http://debian.charite.de/ubuntu
+http://debian.linux.org.tw/ubuntu
+http://dk.archive.ubuntu.com/ubuntu
+http://es.archive.ubuntu.com/ubuntu
+http://espelhos.edugraf.ufsc.br/ubuntu
+ftp://free.nchc.org.tw/ubuntu
+http://ftp-stud.fht-esslingen.de/Mirrors/ubuntu
+http://ftp-stud.hs-esslingen.de/ubuntu
+http://ftp.belnet.be/linux/ubuntu/ubuntu
+http://ftp.belnet.be/pub/mirror/ubuntu.com/ubuntu
+http://ftp.caliu.info/pub/distribucions/ubuntu/ubuntu
+http://ftp.chg.ru/pub/Linux/ubuntu/archive
+ftp://ftp.ciril.fr/pub/linux/ubuntu/archives
+http://ftp.citylink.co.nz/ubuntu
+http://ftp.crihan.fr/ubuntu
+ftp://ftp.cw.net/pub/linux/ftp.ubuntu.com/ubuntu
+http://ftp.cw.net/ubuntu
+http://ftp.dateleco.es/ubuntu
+http://ftp.dei.uc.pt/pub/linux/ubuntu/archive
+http://ftp.duth.gr/pub/ubuntu
+http://ftp.ecc.u-tokyo.ac.jp/ubuntu
+http://ftp.estpak.ee/ubuntu
+ftp://ftp.free.fr/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.freepark.org/ubuntu
+ftp://ftp.fu-berlin.de/linux/ubuntu
+ftp://ftp.funet.fi/pub/mirrors/archive.ubuntu.com
+http://ftp.gil.di.uminho.pt/ubuntu
+ftp://ftp.gtlib.gatech.edu/pub/ubuntu
+http://ftp.gui.uva.es/sites/ubuntu.com/ubuntu
+http://ftp.halifax.rwth-aachen.de/ubuntu
+http://ftp.heanet.ie/pub/ubuntu
+http://ftp.hosteurope.de/mirror/archive.ubuntu.com
+ftp://ftp.iinet.net.au/pub/ubuntu
+ftp://ftp.iitm.ac.in/ubuntu
+http://ftp.kaist.ac.kr/pub/ubuntu
+http://ftp.kfki.hu/linux/ubuntu
+ftp://ftp.kfki.hu/pub/linux/ubuntu
+http://ftp.leg.uct.ac.za/pub/linux/ubuntu
+http://ftp.linux.edu.lv/ubuntu
+ftp://ftp.linux.org.tr/pub/ubuntu
+http://ftp.lug.ro/ubuntu
+ftp://ftp.man.szczecin.pl/pub/Linux/ubuntu
+ftp://ftp.mipt.ru/mirror/ubuntu
+ftp://ftp.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://ftp.netspace.net.au/pub/ubuntu
+http://ftp.ntua.gr/pub/linux/ubuntu
+ftp://ftp.oleane.net/ubuntu
+ftp://ftp.otenet.gr/ubuntu
+ftp://ftp.polytechnic.edu.na/pub/ubuntu
+http://ftp.port80.se/ubuntu
+http://ftp.pwr.wroc.pl/ubuntu
+ftp://ftp.rrzn.uni-hannover.de/pub/mirror/linux/ubuntu
+ftp://ftp.science.nus.edu.sg/pub/ubuntu
+http://ftp.science.nus.edu.sg/ubuntu
+http://ftp.stw-bonn.de/ubuntu
+http://ftp.ticklers.org/archive.ubuntu.org/ubuntu
+ftp://ftp.tiscali.nl/pub/mirror/ubuntu
+http://ftp.tiscali.nl/ubuntu
+http://ftp.tu-chemnitz.de/pub/linux/ubuntu
+ftp://ftp.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://ftp.tuke.sk/ubuntu
+http://ftp.twaren.net/Linux/Ubuntu/ubuntu
+http://ftp.u-picardie.fr/mirror/ubuntu/ubuntu
+ftp://ftp.uasw.edu/linux/ubuntu/archive
+http://ftp.ucr.ac.cr/ubuntu
+http://ftp.udc.es/ubuntu
+http://ftp.uni-kl.de/pub/linux/ubuntu
+http://ftp.uni-muenster.de/pub/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.unina.it/pub/linux/distributions/ubuntu
+http://ftp.uninett.no/ubuntu
+http://ftp.usf.edu/pub/ubuntu
+http://ftp.ussg.iu.edu/linux/ubuntu
+ftp://ftp.vectranet.pl/ubuntu
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/archives
+ftp://ftpserv.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://gd.tuwien.ac.at/opsys/linux/ubuntu/archive
+http://godel.cs.bilgi.edu.tr/ubuntu
+http://gulus.USherbrooke.ca/ubuntu
+http://hr.archive.ubuntu.com/ubuntu
+http://ie.archive.ubuntu.com/ubuntu
+http://klid.dk/ftp/ubuntu
+ftp://klid.dk/ubuntu
+http://kr.archive.ubuntu.com/ubuntu
+http://lug.mtu.edu/ubuntu
+http://mir1.ovh.net/ubuntu
+http://mirror.anl.gov/pub/ubuntu
+http://mirror.cc.columbia.edu/pub/linux/ubuntu/archive
+http://mirror.cs.umn.edu/ubuntu
+http://mirror.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirror.hgkz.ch/ubuntu
+http://mirror.imbrandon.com/ubuntu
+http://mirror.lcsee.wvu.edu/ubuntu
+http://mirror.letsopen.com/os/ubuntu
+http://mirror.lupaworld.com/ubuntu/archive
+http://mirror.nttu.edu.tw/ubuntu
+http://mirror.optus.net/ubuntu
+http://mirror.ox.ac.uk/sites/archive.ubuntu.com/ubuntu
+http://mirror.pacific.net.au/linux/ubuntu
+http://mirror.rootguide.org/ubuntu
+http://mirror.switch.ch/ftp/mirror/ubuntu
+ftp://mirror.switch.ch/mirror/ubuntu
+http://mirror.uni-c.dk/ubuntu
+http://mirror.utdlug.org/linux/distributions/ubuntu/packages
+http://mirror2.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirrors.cat.pdx.edu/ubuntu
+http://mirrors.ccs.neu.edu/archive.ubuntu.com
+ftp://mirrors.ccs.neu.edu/net/mirrors/archive.ubuntu.com
+http://mirrors.cs.wmich.edu/ubuntu
+ftp://mirrors.easynews.com/linux/ubuntu
+http://mirrors.kernel.org/ubuntu
+http://mirrors.nic.funet.fi/ubuntu
+http://mirrors.shlug.org/ubuntu
+ftp://mirrors.virginmedia.com/mirrors/ubuntu/archive
+http://mirrors.xmission.com/ubuntu
+http://mt.archive.ubuntu.com/ubuntu
+http://na.mirror.garr.it/mirrors/ubuntu-archive
+ftp://neacm.fe.up.pt/pub/ubuntu
+http://neacm.fe.up.pt/ubuntu
+http://nl.archive.ubuntu.com/ubuntu
+http://nl2.archive.ubuntu.com/ubuntu
+http://nz2.archive.ubuntu.com/ubuntu
+http://packages.midian.hu//pub/linux/distributions/ubuntu
+http://se.archive.ubuntu.com/ubuntu
+http://sft.if.usp.br/ubuntu
+http://snert.mi.hs-heilbronn.de/pub/ubuntu/ubuntu
+http://sunsite.informatik.rwth-aachen.de/ftp/pub/Linux/ubuntu/ubuntu
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/ubuntu/ubuntu
+http://tezcatl.fciencias.unam.mx/ubuntu
+http://th.archive.ubuntu.com/ubuntu
+ftp://tw.archive.ubuntu.com/ubuntu
+http://ubuntu-archive.datahop.it/ubuntu
+http://ubuntu.c3sl.ufpr.br/ubuntu
+http://ubuntu.cn99.com/ubuntu
+http://ubuntu.cs.uaf.edu/ubuntu
+http://ubuntu.cs.utah.edu/ubuntu
+http://ubuntu.csie.nctu.edu.tw/ubuntu
+http://ubuntu.eriders.ge/ubuntu
+http://ubuntu.fastbull.org/ubuntu
+http://ubuntu.indika.net.id/ubuntu
+http://ubuntu.inode.at/ubuntu
+http://ubuntu.intergenia.de/ubuntu
+http://ubuntu.ipacct.com/ubuntu
+http://ubuntu.lhi.is/ubuntu
+http://ubuntu.linux-bg.org/ubuntu
+ftp://ubuntu.mirror.ac.za/ubuntu-archive
+http://ubuntu.mirror.frontiernet.net/ubuntu
+http://ubuntu.mirror.rafal.ca/ubuntu
+http://ubuntu.mirrors.skynet.be/pub/ubuntu.com/ubuntu
+http://ubuntu.org.ua/ubuntu
+http://ubuntu.snet.uz/ubuntu
+http://ubuntu.supp.name/ubuntu
+http://ubuntu.task.gda.pl/ubuntu
+http://ubuntu.univ-nantes.fr/ubuntu
+http://ubuntu.uz/ubuntu
+http://ubuntu.ynet.sk/ubuntu
+http://www.gtlib.gatech.edu/pub/ubuntu
+http://www.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://www.nic.funet.fi/pub/mirrors/archive.ubuntu.com
+http://wwwftp.ciril.fr/pub/linux/ubuntu/archives
+ftp://yu.archive.ubuntu.com/ubuntu
diff --git a/src/lib/distro-info/ubuntu-9.04/prereqfiles/etc/hosts b/src/lib/distro-info/ubuntu-9.04/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-9.04/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/ubuntu-9.04/settings.default b/src/lib/distro-info/ubuntu-9.04/settings.default
new file mode 100644
index 00000000..62abe07c
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-9.04/settings.default
@@ -0,0 +1,76 @@
+arch = i386
+package-subdir = pool
+prereq-packages = main/d/debootstrap/debootstrap_1.0.12_all.deb
+release-name = jaunty
+<repository base>
+ components = main restricted
+ distribution = jaunty
+ name = Ubuntu 9.04
+ repo-subdir = dists
+ file-for-speedtest = dists/jaunty/main/binary-i386/Packages.bz2
+</repository>
+<repository base_security>
+ components = main restricted
+ distribution = jaunty-security
+ name = Ubuntu 9.04 Security
+ repo-subdir = dists
+ file-for-speedtest = dists/jaunty-security/main/binary-i386/Packages.bz2
+</repository>
+<repository base_updates>
+ components = main restricted
+ distribution = jaunty-updates
+ name = Ubuntu 9.04 Updates
+ repo-subdir = dists
+ file-for-speedtest = dists/jaunty-updates/main/binary-i386/Packages.bz2
+</repository>
+<selection minimal>
+ packages = <<END
+ language-pack-de
+ linux-image-generic
+ END
+</selection>
+<selection standard>
+ base = minimal
+ packages = <<END
+ ubuntu-standard
+ END
+</selection>
+<selection gnome>
+ base = minimal
+ packages = <<END
+ ubuntu-desktop
+ END
+</selection>
+<selection kde>
+ base = minimal
+ packages = <<END
+ kubuntu-desktop
+ END
+</selection>
+<selection xfce>
+ base = minimal
+ packages = <<END
+ xubuntu-desktop
+ END
+</selection>
+<selection edubuntu-server>
+ base = minimal
+ packages = <<END
+ edubuntu-server
+ END
+</selection>
+<selection edubuntu-gnome>
+ base = minimal
+ packages = <<END
+ edubuntu-desktop-gnome
+ END
+</selection>
+<selection edubuntu-kde>
+ base = minimal
+ packages = <<END
+ edubuntu-desktop-kde
+ END
+</selection>
+<selection default>
+ base = minimal
+</selection>
diff --git a/src/lib/distro-info/ubuntu-9.04/settings.example b/src/lib/distro-info/ubuntu-9.04/settings.example
new file mode 100644
index 00000000..31881c4c
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-9.04/settings.example
@@ -0,0 +1,23 @@
+# rename this file to 'settings' and edit it as you please
+#
+# for a list of all options, have a look at the corresponding
+# settings.default in /opt/openslx/share/distro-info
+
+# use local installation source
+#<repository base>
+# local-url = /srv/ftp/pub/ubuntu
+#</repository>
+#<repository base_updates>
+# local-url = /srv/ftp/pub/ubuntu
+#</repository>
+#<repository base_security>
+# local-url = /srv/ftp/pub/ubuntu
+#</repository>
+
+# add a new selection:
+#<selection my_kde>
+# base = kde
+# packages = <<END
+# kinternet
+# END
+#</selection>
diff --git a/src/lib/distro-info/ubuntu-9.04_amd64/mirrors/base b/src/lib/distro-info/ubuntu-9.04_amd64/mirrors/base
new file mode 100644
index 00000000..3b936ecf
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-9.04_amd64/mirrors/base
@@ -0,0 +1,171 @@
+http://archive.ubuntu.com.ba/ubuntu
+http://archive.ubuntu.com/ubuntu
+ftp://br.archive.ubuntu.com/ubuntu
+ftp://bw.archive.ubuntu.com/ubuntu
+http://cl.archive.ubuntu.com/ubuntu
+http://cudlug.cudenver.edu/ubuntu
+ftp://cz.archive.ubuntu.com/MIRRORS/archive.ubuntu.com/mirror/ubuntu
+http://cz.archive.ubuntu.com/ubuntu
+ftp://darkstar.ist.utl.pt/pub/ubuntu/archive
+http://darkstar.ist.utl.pt/ubuntu/archive
+http://de.archive.ubuntu.com/ubuntu
+http://debian.charite.de/ubuntu
+http://debian.linux.org.tw/ubuntu
+http://dk.archive.ubuntu.com/ubuntu
+http://es.archive.ubuntu.com/ubuntu
+http://espelhos.edugraf.ufsc.br/ubuntu
+ftp://free.nchc.org.tw/ubuntu
+http://ftp-stud.fht-esslingen.de/Mirrors/ubuntu
+http://ftp-stud.hs-esslingen.de/ubuntu
+http://ftp.belnet.be/linux/ubuntu/ubuntu
+http://ftp.belnet.be/pub/mirror/ubuntu.com/ubuntu
+http://ftp.caliu.info/pub/distribucions/ubuntu/ubuntu
+http://ftp.chg.ru/pub/Linux/ubuntu/archive
+ftp://ftp.ciril.fr/pub/linux/ubuntu/archives
+http://ftp.citylink.co.nz/ubuntu
+http://ftp.crihan.fr/ubuntu
+ftp://ftp.cw.net/pub/linux/ftp.ubuntu.com/ubuntu
+http://ftp.cw.net/ubuntu
+http://ftp.dateleco.es/ubuntu
+http://ftp.dei.uc.pt/pub/linux/ubuntu/archive
+http://ftp.duth.gr/pub/ubuntu
+http://ftp.ecc.u-tokyo.ac.jp/ubuntu
+http://ftp.estpak.ee/ubuntu
+ftp://ftp.free.fr/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.freepark.org/ubuntu
+ftp://ftp.fu-berlin.de/linux/ubuntu
+ftp://ftp.funet.fi/pub/mirrors/archive.ubuntu.com
+http://ftp.gil.di.uminho.pt/ubuntu
+ftp://ftp.gtlib.gatech.edu/pub/ubuntu
+http://ftp.gui.uva.es/sites/ubuntu.com/ubuntu
+http://ftp.halifax.rwth-aachen.de/ubuntu
+http://ftp.heanet.ie/pub/ubuntu
+http://ftp.hosteurope.de/mirror/archive.ubuntu.com
+ftp://ftp.iinet.net.au/pub/ubuntu
+ftp://ftp.iitm.ac.in/ubuntu
+http://ftp.kaist.ac.kr/pub/ubuntu
+http://ftp.kfki.hu/linux/ubuntu
+ftp://ftp.kfki.hu/pub/linux/ubuntu
+http://ftp.leg.uct.ac.za/pub/linux/ubuntu
+http://ftp.linux.edu.lv/ubuntu
+ftp://ftp.linux.org.tr/pub/ubuntu
+http://ftp.lug.ro/ubuntu
+ftp://ftp.man.szczecin.pl/pub/Linux/ubuntu
+ftp://ftp.mipt.ru/mirror/ubuntu
+ftp://ftp.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://ftp.netspace.net.au/pub/ubuntu
+http://ftp.ntua.gr/pub/linux/ubuntu
+ftp://ftp.oleane.net/ubuntu
+ftp://ftp.otenet.gr/ubuntu
+ftp://ftp.polytechnic.edu.na/pub/ubuntu
+http://ftp.port80.se/ubuntu
+http://ftp.pwr.wroc.pl/ubuntu
+ftp://ftp.rrzn.uni-hannover.de/pub/mirror/linux/ubuntu
+ftp://ftp.science.nus.edu.sg/pub/ubuntu
+http://ftp.science.nus.edu.sg/ubuntu
+http://ftp.stw-bonn.de/ubuntu
+http://ftp.ticklers.org/archive.ubuntu.org/ubuntu
+ftp://ftp.tiscali.nl/pub/mirror/ubuntu
+http://ftp.tiscali.nl/ubuntu
+http://ftp.tu-chemnitz.de/pub/linux/ubuntu
+ftp://ftp.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://ftp.tuke.sk/ubuntu
+http://ftp.twaren.net/Linux/Ubuntu/ubuntu
+http://ftp.u-picardie.fr/mirror/ubuntu/ubuntu
+ftp://ftp.uasw.edu/linux/ubuntu/archive
+http://ftp.ucr.ac.cr/ubuntu
+http://ftp.udc.es/ubuntu
+http://ftp.uni-kl.de/pub/linux/ubuntu
+http://ftp.uni-muenster.de/pub/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.unina.it/pub/linux/distributions/ubuntu
+http://ftp.uninett.no/ubuntu
+http://ftp.usf.edu/pub/ubuntu
+http://ftp.ussg.iu.edu/linux/ubuntu
+ftp://ftp.vectranet.pl/ubuntu
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/archives
+ftp://ftpserv.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://gd.tuwien.ac.at/opsys/linux/ubuntu/archive
+http://godel.cs.bilgi.edu.tr/ubuntu
+http://gulus.USherbrooke.ca/ubuntu
+http://hr.archive.ubuntu.com/ubuntu
+http://ie.archive.ubuntu.com/ubuntu
+http://klid.dk/ftp/ubuntu
+ftp://klid.dk/ubuntu
+http://kr.archive.ubuntu.com/ubuntu
+http://lug.mtu.edu/ubuntu
+http://mir1.ovh.net/ubuntu
+http://mirror.anl.gov/pub/ubuntu
+http://mirror.cc.columbia.edu/pub/linux/ubuntu/archive
+http://mirror.cs.umn.edu/ubuntu
+http://mirror.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirror.hgkz.ch/ubuntu
+http://mirror.imbrandon.com/ubuntu
+http://mirror.lcsee.wvu.edu/ubuntu
+http://mirror.letsopen.com/os/ubuntu
+http://mirror.lupaworld.com/ubuntu/archive
+http://mirror.nttu.edu.tw/ubuntu
+http://mirror.optus.net/ubuntu
+http://mirror.ox.ac.uk/sites/archive.ubuntu.com/ubuntu
+http://mirror.pacific.net.au/linux/ubuntu
+http://mirror.rootguide.org/ubuntu
+http://mirror.switch.ch/ftp/mirror/ubuntu
+ftp://mirror.switch.ch/mirror/ubuntu
+http://mirror.uni-c.dk/ubuntu
+http://mirror.utdlug.org/linux/distributions/ubuntu/packages
+http://mirror2.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirrors.cat.pdx.edu/ubuntu
+http://mirrors.ccs.neu.edu/archive.ubuntu.com
+ftp://mirrors.ccs.neu.edu/net/mirrors/archive.ubuntu.com
+http://mirrors.cs.wmich.edu/ubuntu
+ftp://mirrors.easynews.com/linux/ubuntu
+http://mirrors.kernel.org/ubuntu
+http://mirrors.nic.funet.fi/ubuntu
+http://mirrors.shlug.org/ubuntu
+ftp://mirrors.virginmedia.com/mirrors/ubuntu/archive
+http://mirrors.xmission.com/ubuntu
+http://mt.archive.ubuntu.com/ubuntu
+http://na.mirror.garr.it/mirrors/ubuntu-archive
+ftp://neacm.fe.up.pt/pub/ubuntu
+http://neacm.fe.up.pt/ubuntu
+http://nl.archive.ubuntu.com/ubuntu
+http://nl2.archive.ubuntu.com/ubuntu
+http://nz2.archive.ubuntu.com/ubuntu
+http://packages.midian.hu//pub/linux/distributions/ubuntu
+http://se.archive.ubuntu.com/ubuntu
+http://sft.if.usp.br/ubuntu
+http://snert.mi.hs-heilbronn.de/pub/ubuntu/ubuntu
+http://sunsite.informatik.rwth-aachen.de/ftp/pub/Linux/ubuntu/ubuntu
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/ubuntu/ubuntu
+http://tezcatl.fciencias.unam.mx/ubuntu
+http://th.archive.ubuntu.com/ubuntu
+ftp://tw.archive.ubuntu.com/ubuntu
+http://ubuntu-archive.datahop.it/ubuntu
+http://ubuntu.c3sl.ufpr.br/ubuntu
+http://ubuntu.cn99.com/ubuntu
+http://ubuntu.cs.uaf.edu/ubuntu
+http://ubuntu.cs.utah.edu/ubuntu
+http://ubuntu.csie.nctu.edu.tw/ubuntu
+http://ubuntu.eriders.ge/ubuntu
+http://ubuntu.fastbull.org/ubuntu
+http://ubuntu.indika.net.id/ubuntu
+http://ubuntu.inode.at/ubuntu
+http://ubuntu.intergenia.de/ubuntu
+http://ubuntu.ipacct.com/ubuntu
+http://ubuntu.lhi.is/ubuntu
+http://ubuntu.linux-bg.org/ubuntu
+ftp://ubuntu.mirror.ac.za/ubuntu-archive
+http://ubuntu.mirror.frontiernet.net/ubuntu
+http://ubuntu.mirror.rafal.ca/ubuntu
+http://ubuntu.mirrors.skynet.be/pub/ubuntu.com/ubuntu
+http://ubuntu.org.ua/ubuntu
+http://ubuntu.snet.uz/ubuntu
+http://ubuntu.supp.name/ubuntu
+http://ubuntu.task.gda.pl/ubuntu
+http://ubuntu.univ-nantes.fr/ubuntu
+http://ubuntu.uz/ubuntu
+http://ubuntu.ynet.sk/ubuntu
+http://www.gtlib.gatech.edu/pub/ubuntu
+http://www.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://www.nic.funet.fi/pub/mirrors/archive.ubuntu.com
+http://wwwftp.ciril.fr/pub/linux/ubuntu/archives
+ftp://yu.archive.ubuntu.com/ubuntu
diff --git a/src/lib/distro-info/ubuntu-9.04_amd64/mirrors/base_security b/src/lib/distro-info/ubuntu-9.04_amd64/mirrors/base_security
new file mode 100644
index 00000000..21789622
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-9.04_amd64/mirrors/base_security
@@ -0,0 +1,163 @@
+http://archive.ubuntu.com.ba/ubuntu
+http://archive.ubuntu.com/ubuntu
+http://br.archive.ubuntu.com/ubuntu
+http://bw.archive.ubuntu.com/ubuntu
+http://cl.archive.ubuntu.com/ubuntu
+http://cudlug.cudenver.edu/ubuntu
+ftp://cz.archive.ubuntu.com/MIRRORS/archive.ubuntu.com/mirror/ubuntu
+http://cz.archive.ubuntu.com/ubuntu
+ftp://darkstar.ist.utl.pt/pub/ubuntu/archive
+http://darkstar.ist.utl.pt/ubuntu/archive
+http://de.archive.ubuntu.com/ubuntu
+http://debian.charite.de/ubuntu
+http://debian.linux.org.tw/ubuntu
+http://dk.archive.ubuntu.com/ubuntu
+http://es.archive.ubuntu.com/ubuntu
+http://espelhos.edugraf.ufsc.br/ubuntu
+http://free.nchc.org.tw/ubuntu
+http://ftp-stud.fht-esslingen.de/Mirrors/ubuntu
+http://ftp-stud.hs-esslingen.de/ubuntu
+http://ftp.belnet.be/linux/ubuntu/ubuntu
+http://ftp.belnet.be/pub/mirror/ubuntu.com/ubuntu
+http://ftp.caliu.info/pub/distribucions/ubuntu/ubuntu
+http://ftp.chg.ru/pub/Linux/ubuntu/archive
+ftp://ftp.ciril.fr/pub/linux/ubuntu/archives
+http://ftp.citylink.co.nz/ubuntu
+http://ftp.crihan.fr/ubuntu
+ftp://ftp.cw.net/pub/linux/ftp.ubuntu.com/ubuntu
+http://ftp.cw.net/ubuntu
+http://ftp.dateleco.es/ubuntu
+http://ftp.dei.uc.pt/pub/linux/ubuntu/archive
+http://ftp.duth.gr/pub/ubuntu
+http://ftp.ecc.u-tokyo.ac.jp/ubuntu
+http://ftp.estpak.ee/ubuntu
+ftp://ftp.free.fr/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.freepark.org/ubuntu
+ftp://ftp.fu-berlin.de/linux/ubuntu
+ftp://ftp.funet.fi/pub/mirrors/archive.ubuntu.com
+http://ftp.gil.di.uminho.pt/ubuntu
+http://ftp.gui.uva.es/sites/ubuntu.com/ubuntu
+http://ftp.halifax.rwth-aachen.de/ubuntu
+http://ftp.heanet.ie/pub/ubuntu
+http://ftp.hosteurope.de/mirror/archive.ubuntu.com
+http://ftp.iinet.net.au/pub/ubuntu
+http://ftp.iitm.ac.in/ubuntu
+http://ftp.kaist.ac.kr/pub/ubuntu
+http://ftp.kfki.hu/linux/ubuntu
+ftp://ftp.kfki.hu/pub/linux/ubuntu
+http://ftp.leg.uct.ac.za/pub/linux/ubuntu
+http://ftp.linux.edu.lv/ubuntu
+http://ftp.lug.ro/ubuntu
+ftp://ftp.man.szczecin.pl/pub/Linux/ubuntu
+ftp://ftp.mipt.ru/mirror/ubuntu
+ftp://ftp.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://ftp.netspace.net.au/pub/ubuntu
+http://ftp.ntua.gr/pub/linux/ubuntu
+ftp://ftp.oleane.net/ubuntu
+ftp://ftp.otenet.gr/ubuntu
+http://ftp.pwr.wroc.pl/ubuntu
+ftp://ftp.rrzn.uni-hannover.de/pub/mirror/linux/ubuntu
+http://ftp.science.nus.edu.sg/ubuntu
+http://ftp.stw-bonn.de/ubuntu
+http://ftp.ticklers.org/archive.ubuntu.org/ubuntu
+ftp://ftp.tiscali.nl/pub/mirror/ubuntu
+http://ftp.tiscali.nl/ubuntu
+http://ftp.tu-chemnitz.de/pub/linux/ubuntu
+ftp://ftp.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://ftp.tuke.sk/ubuntu
+http://ftp.twaren.net/Linux/Ubuntu/ubuntu
+http://ftp.u-picardie.fr/mirror/ubuntu/ubuntu
+ftp://ftp.uasw.edu/linux/ubuntu/archive
+http://ftp.ucr.ac.cr/ubuntu
+http://ftp.udc.es/ubuntu
+http://ftp.uni-kl.de/pub/linux/ubuntu
+http://ftp.uni-muenster.de/pub/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.unina.it/pub/linux/distributions/ubuntu
+http://ftp.uninett.no/ubuntu
+http://ftp.usf.edu/pub/ubuntu
+http://ftp.ussg.iu.edu/linux/ubuntu
+ftp://ftp.vectranet.pl/ubuntu
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/archives
+ftp://ftpserv.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://gd.tuwien.ac.at/opsys/linux/ubuntu/archive
+http://godel.cs.bilgi.edu.tr/ubuntu
+http://gulus.USherbrooke.ca/ubuntu
+http://hr.archive.ubuntu.com/ubuntu
+http://ie.archive.ubuntu.com/ubuntu
+http://kr.archive.ubuntu.com/ubuntu
+http://lug.mtu.edu/ubuntu
+http://mir1.ovh.net/ubuntu
+http://mirror.anl.gov/pub/ubuntu
+http://mirror.cc.columbia.edu/pub/linux/ubuntu/archive
+http://mirror.cs.umn.edu/ubuntu
+http://mirror.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirror.hgkz.ch/ubuntu
+http://mirror.imbrandon.com/ubuntu
+http://mirror.lcsee.wvu.edu/ubuntu
+http://mirror.letsopen.com/os/ubuntu
+http://mirror.lupaworld.com/ubuntu/archive
+http://mirror.nttu.edu.tw/ubuntu
+http://mirror.optus.net/ubuntu
+http://mirror.ox.ac.uk/sites/archive.ubuntu.com/ubuntu
+http://mirror.pacific.net.au/linux/ubuntu
+http://mirror.rootguide.org/ubuntu
+http://mirror.switch.ch/ftp/mirror/ubuntu
+ftp://mirror.switch.ch/mirror/ubuntu
+http://mirror.uni-c.dk/ubuntu
+http://mirror.utdlug.org/linux/distributions/ubuntu/packages
+http://mirror2.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirrors.cat.pdx.edu/ubuntu
+http://mirrors.ccs.neu.edu/archive.ubuntu.com
+http://mirrors.cs.wmich.edu/ubuntu
+http://mirrors.easynews.com/linux/ubuntu
+http://mirrors.kernel.org/ubuntu
+http://mirrors.nic.funet.fi/ubuntu
+http://mirrors.shlug.org/ubuntu
+ftp://mirrors.virginmedia.com/mirrors/ubuntu/archive
+http://mirrors.xmission.com/ubuntu
+http://mt.archive.ubuntu.com/ubuntu
+http://na.mirror.garr.it/mirrors/ubuntu-archive
+ftp://neacm.fe.up.pt/pub/ubuntu
+http://neacm.fe.up.pt/ubuntu
+http://nl.archive.ubuntu.com/ubuntu
+http://nl2.archive.ubuntu.com/ubuntu
+http://nz2.archive.ubuntu.com/ubuntu
+http://packages.midian.hu//pub/linux/distributions/ubuntu
+http://se.archive.ubuntu.com/ubuntu
+http://sft.if.usp.br/ubuntu
+http://snert.mi.hs-heilbronn.de/pub/ubuntu/ubuntu
+http://sunsite.informatik.rwth-aachen.de/ftp/pub/Linux/ubuntu/ubuntu
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/ubuntu/ubuntu
+http://tezcatl.fciencias.unam.mx/ubuntu
+http://th.archive.ubuntu.com/ubuntu
+http://tw.archive.ubuntu.com/ubuntu
+http://ubuntu-archive.datahop.it/ubuntu
+http://ubuntu.c3sl.ufpr.br/ubuntu
+http://ubuntu.cn99.com/ubuntu
+http://ubuntu.cs.uaf.edu/ubuntu
+http://ubuntu.cs.utah.edu/ubuntu
+http://ubuntu.csie.nctu.edu.tw/ubuntu
+http://ubuntu.eriders.ge/ubuntu
+http://ubuntu.fastbull.org/ubuntu
+http://ubuntu.indika.net.id/ubuntu
+http://ubuntu.inode.at/ubuntu
+http://ubuntu.intergenia.de/ubuntu
+http://ubuntu.ipacct.com/ubuntu
+http://ubuntu.lhi.is/ubuntu
+http://ubuntu.linux-bg.org/ubuntu
+http://ubuntu.mirror.ac.za/ubuntu-archive
+http://ubuntu.mirror.frontiernet.net/ubuntu
+http://ubuntu.mirror.rafal.ca/ubuntu
+http://ubuntu.mirrors.skynet.be/pub/ubuntu.com/ubuntu
+http://ubuntu.org.ua/ubuntu
+http://ubuntu.snet.uz/ubuntu
+http://ubuntu.supp.name/ubuntu
+http://ubuntu.task.gda.pl/ubuntu
+http://ubuntu.univ-nantes.fr/ubuntu
+http://ubuntu.uz/ubuntu
+http://ubuntu.ynet.sk/ubuntu
+http://www.gtlib.gatech.edu/pub/ubuntu
+http://www.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://www.nic.funet.fi/pub/mirrors/archive.ubuntu.com
+http://wwwftp.ciril.fr/pub/linux/ubuntu/archives
+ftp://yu.archive.ubuntu.com/ubuntu
diff --git a/src/lib/distro-info/ubuntu-9.04_amd64/mirrors/base_updates b/src/lib/distro-info/ubuntu-9.04_amd64/mirrors/base_updates
new file mode 100644
index 00000000..3b936ecf
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-9.04_amd64/mirrors/base_updates
@@ -0,0 +1,171 @@
+http://archive.ubuntu.com.ba/ubuntu
+http://archive.ubuntu.com/ubuntu
+ftp://br.archive.ubuntu.com/ubuntu
+ftp://bw.archive.ubuntu.com/ubuntu
+http://cl.archive.ubuntu.com/ubuntu
+http://cudlug.cudenver.edu/ubuntu
+ftp://cz.archive.ubuntu.com/MIRRORS/archive.ubuntu.com/mirror/ubuntu
+http://cz.archive.ubuntu.com/ubuntu
+ftp://darkstar.ist.utl.pt/pub/ubuntu/archive
+http://darkstar.ist.utl.pt/ubuntu/archive
+http://de.archive.ubuntu.com/ubuntu
+http://debian.charite.de/ubuntu
+http://debian.linux.org.tw/ubuntu
+http://dk.archive.ubuntu.com/ubuntu
+http://es.archive.ubuntu.com/ubuntu
+http://espelhos.edugraf.ufsc.br/ubuntu
+ftp://free.nchc.org.tw/ubuntu
+http://ftp-stud.fht-esslingen.de/Mirrors/ubuntu
+http://ftp-stud.hs-esslingen.de/ubuntu
+http://ftp.belnet.be/linux/ubuntu/ubuntu
+http://ftp.belnet.be/pub/mirror/ubuntu.com/ubuntu
+http://ftp.caliu.info/pub/distribucions/ubuntu/ubuntu
+http://ftp.chg.ru/pub/Linux/ubuntu/archive
+ftp://ftp.ciril.fr/pub/linux/ubuntu/archives
+http://ftp.citylink.co.nz/ubuntu
+http://ftp.crihan.fr/ubuntu
+ftp://ftp.cw.net/pub/linux/ftp.ubuntu.com/ubuntu
+http://ftp.cw.net/ubuntu
+http://ftp.dateleco.es/ubuntu
+http://ftp.dei.uc.pt/pub/linux/ubuntu/archive
+http://ftp.duth.gr/pub/ubuntu
+http://ftp.ecc.u-tokyo.ac.jp/ubuntu
+http://ftp.estpak.ee/ubuntu
+ftp://ftp.free.fr/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.freepark.org/ubuntu
+ftp://ftp.fu-berlin.de/linux/ubuntu
+ftp://ftp.funet.fi/pub/mirrors/archive.ubuntu.com
+http://ftp.gil.di.uminho.pt/ubuntu
+ftp://ftp.gtlib.gatech.edu/pub/ubuntu
+http://ftp.gui.uva.es/sites/ubuntu.com/ubuntu
+http://ftp.halifax.rwth-aachen.de/ubuntu
+http://ftp.heanet.ie/pub/ubuntu
+http://ftp.hosteurope.de/mirror/archive.ubuntu.com
+ftp://ftp.iinet.net.au/pub/ubuntu
+ftp://ftp.iitm.ac.in/ubuntu
+http://ftp.kaist.ac.kr/pub/ubuntu
+http://ftp.kfki.hu/linux/ubuntu
+ftp://ftp.kfki.hu/pub/linux/ubuntu
+http://ftp.leg.uct.ac.za/pub/linux/ubuntu
+http://ftp.linux.edu.lv/ubuntu
+ftp://ftp.linux.org.tr/pub/ubuntu
+http://ftp.lug.ro/ubuntu
+ftp://ftp.man.szczecin.pl/pub/Linux/ubuntu
+ftp://ftp.mipt.ru/mirror/ubuntu
+ftp://ftp.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://ftp.netspace.net.au/pub/ubuntu
+http://ftp.ntua.gr/pub/linux/ubuntu
+ftp://ftp.oleane.net/ubuntu
+ftp://ftp.otenet.gr/ubuntu
+ftp://ftp.polytechnic.edu.na/pub/ubuntu
+http://ftp.port80.se/ubuntu
+http://ftp.pwr.wroc.pl/ubuntu
+ftp://ftp.rrzn.uni-hannover.de/pub/mirror/linux/ubuntu
+ftp://ftp.science.nus.edu.sg/pub/ubuntu
+http://ftp.science.nus.edu.sg/ubuntu
+http://ftp.stw-bonn.de/ubuntu
+http://ftp.ticklers.org/archive.ubuntu.org/ubuntu
+ftp://ftp.tiscali.nl/pub/mirror/ubuntu
+http://ftp.tiscali.nl/ubuntu
+http://ftp.tu-chemnitz.de/pub/linux/ubuntu
+ftp://ftp.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://ftp.tuke.sk/ubuntu
+http://ftp.twaren.net/Linux/Ubuntu/ubuntu
+http://ftp.u-picardie.fr/mirror/ubuntu/ubuntu
+ftp://ftp.uasw.edu/linux/ubuntu/archive
+http://ftp.ucr.ac.cr/ubuntu
+http://ftp.udc.es/ubuntu
+http://ftp.uni-kl.de/pub/linux/ubuntu
+http://ftp.uni-muenster.de/pub/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.unina.it/pub/linux/distributions/ubuntu
+http://ftp.uninett.no/ubuntu
+http://ftp.usf.edu/pub/ubuntu
+http://ftp.ussg.iu.edu/linux/ubuntu
+ftp://ftp.vectranet.pl/ubuntu
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/archives
+ftp://ftpserv.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://gd.tuwien.ac.at/opsys/linux/ubuntu/archive
+http://godel.cs.bilgi.edu.tr/ubuntu
+http://gulus.USherbrooke.ca/ubuntu
+http://hr.archive.ubuntu.com/ubuntu
+http://ie.archive.ubuntu.com/ubuntu
+http://klid.dk/ftp/ubuntu
+ftp://klid.dk/ubuntu
+http://kr.archive.ubuntu.com/ubuntu
+http://lug.mtu.edu/ubuntu
+http://mir1.ovh.net/ubuntu
+http://mirror.anl.gov/pub/ubuntu
+http://mirror.cc.columbia.edu/pub/linux/ubuntu/archive
+http://mirror.cs.umn.edu/ubuntu
+http://mirror.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirror.hgkz.ch/ubuntu
+http://mirror.imbrandon.com/ubuntu
+http://mirror.lcsee.wvu.edu/ubuntu
+http://mirror.letsopen.com/os/ubuntu
+http://mirror.lupaworld.com/ubuntu/archive
+http://mirror.nttu.edu.tw/ubuntu
+http://mirror.optus.net/ubuntu
+http://mirror.ox.ac.uk/sites/archive.ubuntu.com/ubuntu
+http://mirror.pacific.net.au/linux/ubuntu
+http://mirror.rootguide.org/ubuntu
+http://mirror.switch.ch/ftp/mirror/ubuntu
+ftp://mirror.switch.ch/mirror/ubuntu
+http://mirror.uni-c.dk/ubuntu
+http://mirror.utdlug.org/linux/distributions/ubuntu/packages
+http://mirror2.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirrors.cat.pdx.edu/ubuntu
+http://mirrors.ccs.neu.edu/archive.ubuntu.com
+ftp://mirrors.ccs.neu.edu/net/mirrors/archive.ubuntu.com
+http://mirrors.cs.wmich.edu/ubuntu
+ftp://mirrors.easynews.com/linux/ubuntu
+http://mirrors.kernel.org/ubuntu
+http://mirrors.nic.funet.fi/ubuntu
+http://mirrors.shlug.org/ubuntu
+ftp://mirrors.virginmedia.com/mirrors/ubuntu/archive
+http://mirrors.xmission.com/ubuntu
+http://mt.archive.ubuntu.com/ubuntu
+http://na.mirror.garr.it/mirrors/ubuntu-archive
+ftp://neacm.fe.up.pt/pub/ubuntu
+http://neacm.fe.up.pt/ubuntu
+http://nl.archive.ubuntu.com/ubuntu
+http://nl2.archive.ubuntu.com/ubuntu
+http://nz2.archive.ubuntu.com/ubuntu
+http://packages.midian.hu//pub/linux/distributions/ubuntu
+http://se.archive.ubuntu.com/ubuntu
+http://sft.if.usp.br/ubuntu
+http://snert.mi.hs-heilbronn.de/pub/ubuntu/ubuntu
+http://sunsite.informatik.rwth-aachen.de/ftp/pub/Linux/ubuntu/ubuntu
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/ubuntu/ubuntu
+http://tezcatl.fciencias.unam.mx/ubuntu
+http://th.archive.ubuntu.com/ubuntu
+ftp://tw.archive.ubuntu.com/ubuntu
+http://ubuntu-archive.datahop.it/ubuntu
+http://ubuntu.c3sl.ufpr.br/ubuntu
+http://ubuntu.cn99.com/ubuntu
+http://ubuntu.cs.uaf.edu/ubuntu
+http://ubuntu.cs.utah.edu/ubuntu
+http://ubuntu.csie.nctu.edu.tw/ubuntu
+http://ubuntu.eriders.ge/ubuntu
+http://ubuntu.fastbull.org/ubuntu
+http://ubuntu.indika.net.id/ubuntu
+http://ubuntu.inode.at/ubuntu
+http://ubuntu.intergenia.de/ubuntu
+http://ubuntu.ipacct.com/ubuntu
+http://ubuntu.lhi.is/ubuntu
+http://ubuntu.linux-bg.org/ubuntu
+ftp://ubuntu.mirror.ac.za/ubuntu-archive
+http://ubuntu.mirror.frontiernet.net/ubuntu
+http://ubuntu.mirror.rafal.ca/ubuntu
+http://ubuntu.mirrors.skynet.be/pub/ubuntu.com/ubuntu
+http://ubuntu.org.ua/ubuntu
+http://ubuntu.snet.uz/ubuntu
+http://ubuntu.supp.name/ubuntu
+http://ubuntu.task.gda.pl/ubuntu
+http://ubuntu.univ-nantes.fr/ubuntu
+http://ubuntu.uz/ubuntu
+http://ubuntu.ynet.sk/ubuntu
+http://www.gtlib.gatech.edu/pub/ubuntu
+http://www.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://www.nic.funet.fi/pub/mirrors/archive.ubuntu.com
+http://wwwftp.ciril.fr/pub/linux/ubuntu/archives
+ftp://yu.archive.ubuntu.com/ubuntu
diff --git a/src/lib/distro-info/ubuntu-9.04_amd64/prereqfiles/etc/hosts b/src/lib/distro-info/ubuntu-9.04_amd64/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-9.04_amd64/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/ubuntu-9.04_amd64/settings.default b/src/lib/distro-info/ubuntu-9.04_amd64/settings.default
new file mode 100644
index 00000000..145a0c72
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-9.04_amd64/settings.default
@@ -0,0 +1,76 @@
+arch = amd64
+package-subdir = pool
+prereq-packages = main/d/debootstrap/debootstrap_1.0.12_all.deb
+release-name = jaunty
+<repository base>
+ components = main restricted
+ distribution = jaunty
+ name = Ubuntu 9.04
+ repo-subdir = dists
+ file-for-speedtest = dists/jaunty/main/binary-amd64/Packages.bz2
+</repository>
+<repository base_security>
+ components = main restricted
+ distribution = jaunty-security
+ name = Ubuntu 9.04 Security
+ repo-subdir = dists
+ file-for-speedtest = dists/jaunty-security/main/binary-amd64/Packages.bz2
+</repository>
+<repository base_updates>
+ components = main restricted
+ distribution = jaunty-updates
+ name = Ubuntu 9.04 Updates
+ repo-subdir = dists
+ file-for-speedtest = dists/jaunty-updates/main/binary-amd64/Packages.bz2
+</repository>
+<selection minimal>
+ packages = <<END
+ language-pack-de
+ linux-image-generic
+ END
+</selection>
+<selection standard>
+ base = minimal
+ packages = <<END
+ ubuntu-standard
+ END
+</selection>
+<selection gnome>
+ base = minimal
+ packages = <<END
+ ubuntu-desktop
+ END
+</selection>
+<selection kde>
+ base = minimal
+ packages = <<END
+ kubuntu-desktop
+ END
+</selection>
+<selection xfce>
+ base = minimal
+ packages = <<END
+ xubuntu-desktop
+ END
+</selection>
+<selection edubuntu-server>
+ base = minimal
+ packages = <<END
+ edubuntu-server
+ END
+</selection>
+<selection edubuntu-gnome>
+ base = minimal
+ packages = <<END
+ edubuntu-desktop-gnome
+ END
+</selection>
+<selection edubuntu-kde>
+ base = minimal
+ packages = <<END
+ edubuntu-desktop-kde
+ END
+</selection>
+<selection default>
+ base = minimal
+</selection>
diff --git a/src/lib/distro-info/ubuntu-9.04_amd64/settings.example b/src/lib/distro-info/ubuntu-9.04_amd64/settings.example
new file mode 100644
index 00000000..31881c4c
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-9.04_amd64/settings.example
@@ -0,0 +1,23 @@
+# rename this file to 'settings' and edit it as you please
+#
+# for a list of all options, have a look at the corresponding
+# settings.default in /opt/openslx/share/distro-info
+
+# use local installation source
+#<repository base>
+# local-url = /srv/ftp/pub/ubuntu
+#</repository>
+#<repository base_updates>
+# local-url = /srv/ftp/pub/ubuntu
+#</repository>
+#<repository base_security>
+# local-url = /srv/ftp/pub/ubuntu
+#</repository>
+
+# add a new selection:
+#<selection my_kde>
+# base = kde
+# packages = <<END
+# kinternet
+# END
+#</selection>
diff --git a/src/lib/distro-info/ubuntu-9.10/mirrors/base b/src/lib/distro-info/ubuntu-9.10/mirrors/base
new file mode 100644
index 00000000..cddbef70
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-9.10/mirrors/base
@@ -0,0 +1,162 @@
+http://archive.ubuntu.com.ba/ubuntu
+http://archive.ubuntu.com/ubuntu
+ftp://br.archive.ubuntu.com/ubuntu
+ftp://bw.archive.ubuntu.com/ubuntu
+http://cl.archive.ubuntu.com/ubuntu
+http://cudlug.cudenver.edu/ubuntu
+http://cz.archive.ubuntu.com/ubuntu
+ftp://darkstar.ist.utl.pt/pub/ubuntu/archive
+http://darkstar.ist.utl.pt/ubuntu/archive
+http://de.archive.ubuntu.com/ubuntu
+http://debian.charite.de/ubuntu
+http://debian.linux.org.tw/ubuntu
+http://dk.archive.ubuntu.com/ubuntu
+http://es.archive.ubuntu.com/ubuntu
+http://espelhos.edugraf.ufsc.br/ubuntu
+ftp://free.nchc.org.tw/ubuntu
+http://ftp-stud.fht-esslingen.de/Mirrors/ubuntu
+http://ftp-stud.hs-esslingen.de/ubuntu
+http://ftp.belnet.be/linux/ubuntu/ubuntu
+http://ftp.belnet.be/pub/mirror/ubuntu.com/ubuntu
+http://ftp.caliu.info/pub/distribucions/ubuntu/ubuntu
+http://ftp.chg.ru/pub/Linux/ubuntu/archive
+ftp://ftp.ciril.fr/pub/linux/ubuntu/archives
+http://ftp.citylink.co.nz/ubuntu
+http://ftp.crihan.fr/ubuntu
+ftp://ftp.cw.net/pub/linux/ftp.ubuntu.com/ubuntu
+http://ftp.cw.net/ubuntu
+http://ftp.dateleco.es/ubuntu
+http://ftp.dei.uc.pt/pub/linux/ubuntu/archive
+http://ftp.duth.gr/pub/ubuntu
+http://ftp.ecc.u-tokyo.ac.jp/ubuntu
+http://ftp.estpak.ee/ubuntu
+ftp://ftp.free.fr/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.freepark.org/ubuntu
+ftp://ftp.fu-berlin.de/linux/ubuntu
+ftp://ftp.funet.fi/pub/mirrors/archive.ubuntu.com
+http://ftp.gil.di.uminho.pt/ubuntu
+ftp://ftp.gtlib.gatech.edu/pub/ubuntu
+http://ftp.gui.uva.es/sites/ubuntu.com/ubuntu
+http://ftp.heanet.ie/pub/ubuntu
+http://ftp.hosteurope.de/mirror/archive.ubuntu.com
+ftp://ftp.iinet.net.au/pub/ubuntu
+ftp://ftp.iitm.ac.in/ubuntu
+http://ftp.kaist.ac.kr/pub/ubuntu
+http://ftp.kfki.hu/linux/ubuntu
+ftp://ftp.kfki.hu/pub/linux/ubuntu
+http://ftp.leg.uct.ac.za/pub/linux/ubuntu
+http://ftp.linux.edu.lv/ubuntu
+ftp://ftp.linux.org.tr/pub/ubuntu
+http://ftp.lug.ro/ubuntu
+ftp://ftp.man.szczecin.pl/pub/Linux/ubuntu
+ftp://ftp.mipt.ru/mirror/ubuntu
+ftp://ftp.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://ftp.netspace.net.au/pub/ubuntu
+http://ftp.ntua.gr/pub/linux/ubuntu
+ftp://ftp.oleane.net/ubuntu
+ftp://ftp.otenet.gr/ubuntu
+http://ftp.port80.se/ubuntu
+http://ftp.pwr.wroc.pl/ubuntu
+ftp://ftp.rrzn.uni-hannover.de/pub/mirror/linux/ubuntu
+ftp://ftp.science.nus.edu.sg/pub/ubuntu
+http://ftp.science.nus.edu.sg/ubuntu
+http://ftp.stw-bonn.de/ubuntu
+http://ftp.ticklers.org/archive.ubuntu.org/ubuntu
+ftp://ftp.tiscali.nl/pub/mirror/ubuntu
+http://ftp.tiscali.nl/ubuntu
+http://ftp.tu-chemnitz.de/pub/linux/ubuntu
+ftp://ftp.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://ftp.tuke.sk/ubuntu
+http://ftp.twaren.net/Linux/Ubuntu/ubuntu
+http://ftp.u-picardie.fr/mirror/ubuntu/ubuntu
+ftp://ftp.uasw.edu/linux/ubuntu/archive
+http://ftp.ucr.ac.cr/ubuntu
+http://ftp.udc.es/ubuntu
+http://ftp.uni-kl.de/pub/linux/ubuntu
+http://ftp.uni-muenster.de/pub/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.unina.it/pub/linux/distributions/ubuntu
+http://ftp.uninett.no/ubuntu
+http://ftp.usf.edu/pub/ubuntu
+http://ftp.ussg.iu.edu/linux/ubuntu
+ftp://ftp.vectranet.pl/ubuntu
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/archives
+ftp://ftpserv.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://gd.tuwien.ac.at/opsys/linux/ubuntu/archive
+http://godel.cs.bilgi.edu.tr/ubuntu
+http://gulus.USherbrooke.ca/ubuntu
+http://hr.archive.ubuntu.com/ubuntu
+http://ie.archive.ubuntu.com/ubuntu
+http://klid.dk/ftp/ubuntu
+ftp://klid.dk/ubuntu
+http://kr.archive.ubuntu.com/ubuntu
+http://lug.mtu.edu/ubuntu
+http://mir1.ovh.net/ubuntu
+http://mirror.anl.gov/pub/ubuntu
+http://mirror.cc.columbia.edu/pub/linux/ubuntu/archive
+http://mirror.cs.umn.edu/ubuntu
+http://mirror.hgkz.ch/ubuntu
+http://mirror.imbrandon.com/ubuntu
+http://mirror.lcsee.wvu.edu/ubuntu
+http://mirror.letsopen.com/os/ubuntu
+http://mirror.lupaworld.com/ubuntu/archive
+http://mirror.nttu.edu.tw/ubuntu
+http://mirror.optus.net/ubuntu
+http://mirror.ox.ac.uk/sites/archive.ubuntu.com/ubuntu
+http://mirror.pacific.net.au/linux/ubuntu
+http://mirror.rootguide.org/ubuntu
+http://mirror.switch.ch/ftp/mirror/ubuntu
+ftp://mirror.switch.ch/mirror/ubuntu
+http://mirror.uni-c.dk/ubuntu
+http://mirror.utdlug.org/linux/distributions/ubuntu/packages
+http://mirrors.cat.pdx.edu/ubuntu
+http://mirrors.ccs.neu.edu/archive.ubuntu.com
+ftp://mirrors.ccs.neu.edu/net/mirrors/archive.ubuntu.com
+http://mirrors.cs.wmich.edu/ubuntu
+ftp://mirrors.easynews.com/linux/ubuntu
+http://mirrors.kernel.org/ubuntu
+http://mirrors.nic.funet.fi/ubuntu
+http://mirrors.shlug.org/ubuntu
+ftp://mirrors.virginmedia.com/mirrors/ubuntu/archive
+http://mirrors.xmission.com/ubuntu
+http://mt.archive.ubuntu.com/ubuntu
+http://na.mirror.garr.it/mirrors/ubuntu-archive
+ftp://neacm.fe.up.pt/pub/ubuntu
+http://neacm.fe.up.pt/ubuntu
+http://nl.archive.ubuntu.com/ubuntu
+http://nl2.archive.ubuntu.com/ubuntu
+http://nz2.archive.ubuntu.com/ubuntu
+http://packages.midian.hu//pub/linux/distributions/ubuntu
+http://se.archive.ubuntu.com/ubuntu
+http://sft.if.usp.br/ubuntu
+http://snert.mi.hs-heilbronn.de/pub/ubuntu/ubuntu
+http://sunsite.informatik.rwth-aachen.de/ftp/pub/Linux/ubuntu/ubuntu
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/ubuntu/ubuntu
+http://tezcatl.fciencias.unam.mx/ubuntu
+http://th.archive.ubuntu.com/ubuntu
+ftp://tw.archive.ubuntu.com/ubuntu
+http://ubuntu-archive.datahop.it/ubuntu
+http://ubuntu.c3sl.ufpr.br/ubuntu
+http://ubuntu.cn99.com/ubuntu
+http://ubuntu.cs.utah.edu/ubuntu
+http://ubuntu.csie.nctu.edu.tw/ubuntu
+http://ubuntu.eriders.ge/ubuntu
+http://ubuntu.fastbull.org/ubuntu
+http://ubuntu.indika.net.id/ubuntu
+http://ubuntu.inode.at/ubuntu
+http://ubuntu.intergenia.de/ubuntu
+http://ubuntu.ipacct.com/ubuntu
+http://ubuntu.lhi.is/ubuntu
+http://ubuntu.linux-bg.org/ubuntu
+http://ubuntu.mirror.frontiernet.net/ubuntu
+http://ubuntu.mirror.rafal.ca/ubuntu
+http://ubuntu.mirrors.skynet.be/pub/ubuntu.com/ubuntu
+http://ubuntu.snet.uz/ubuntu
+http://ubuntu.supp.name/ubuntu
+http://ubuntu.task.gda.pl/ubuntu
+http://ubuntu.univ-nantes.fr/ubuntu
+http://ubuntu.uz/ubuntu
+http://ubuntu.ynet.sk/ubuntu
+http://www.gtlib.gatech.edu/pub/ubuntu
+http://www.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://www.nic.funet.fi/pub/mirrors/archive.ubuntu.com
+ftp://yu.archive.ubuntu.com/ubuntu
diff --git a/src/lib/distro-info/ubuntu-9.10/mirrors/base_security b/src/lib/distro-info/ubuntu-9.10/mirrors/base_security
new file mode 100644
index 00000000..3617b3dd
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-9.10/mirrors/base_security
@@ -0,0 +1,162 @@
+http://archive.ubuntu.com.ba/ubuntu
+http://archive.ubuntu.com/ubuntu
+http://br.archive.ubuntu.com/ubuntu
+http://bw.archive.ubuntu.com/ubuntu
+http://cl.archive.ubuntu.com/ubuntu
+http://cudlug.cudenver.edu/ubuntu
+ftp://cz.archive.ubuntu.com/MIRRORS/archive.ubuntu.com/mirror/ubuntu
+http://cz.archive.ubuntu.com/ubuntu
+ftp://darkstar.ist.utl.pt/pub/ubuntu/archive
+http://darkstar.ist.utl.pt/ubuntu/archive
+http://de.archive.ubuntu.com/ubuntu
+http://debian.charite.de/ubuntu
+http://debian.linux.org.tw/ubuntu
+http://dk.archive.ubuntu.com/ubuntu
+http://es.archive.ubuntu.com/ubuntu
+http://espelhos.edugraf.ufsc.br/ubuntu
+http://free.nchc.org.tw/ubuntu
+http://ftp-stud.fht-esslingen.de/Mirrors/ubuntu
+http://ftp-stud.hs-esslingen.de/ubuntu
+http://ftp.belnet.be/linux/ubuntu/ubuntu
+http://ftp.belnet.be/pub/mirror/ubuntu.com/ubuntu
+http://ftp.caliu.info/pub/distribucions/ubuntu/ubuntu
+http://ftp.chg.ru/pub/Linux/ubuntu/archive
+ftp://ftp.ciril.fr/pub/linux/ubuntu/archives
+http://ftp.citylink.co.nz/ubuntu
+http://ftp.crihan.fr/ubuntu
+ftp://ftp.cw.net/pub/linux/ftp.ubuntu.com/ubuntu
+http://ftp.cw.net/ubuntu
+http://ftp.dateleco.es/ubuntu
+http://ftp.dei.uc.pt/pub/linux/ubuntu/archive
+http://ftp.duth.gr/pub/ubuntu
+http://ftp.ecc.u-tokyo.ac.jp/ubuntu
+http://ftp.estpak.ee/ubuntu
+ftp://ftp.free.fr/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.freepark.org/ubuntu
+ftp://ftp.fu-berlin.de/linux/ubuntu
+ftp://ftp.funet.fi/pub/mirrors/archive.ubuntu.com
+http://ftp.gil.di.uminho.pt/ubuntu
+http://ftp.gui.uva.es/sites/ubuntu.com/ubuntu
+http://ftp.halifax.rwth-aachen.de/ubuntu
+http://ftp.heanet.ie/pub/ubuntu
+http://ftp.hosteurope.de/mirror/archive.ubuntu.com
+http://ftp.iinet.net.au/pub/ubuntu
+http://ftp.iitm.ac.in/ubuntu
+http://ftp.kaist.ac.kr/pub/ubuntu
+http://ftp.kfki.hu/linux/ubuntu
+ftp://ftp.kfki.hu/pub/linux/ubuntu
+http://ftp.leg.uct.ac.za/pub/linux/ubuntu
+http://ftp.linux.edu.lv/ubuntu
+http://ftp.lug.ro/ubuntu
+ftp://ftp.man.szczecin.pl/pub/Linux/ubuntu
+ftp://ftp.mipt.ru/mirror/ubuntu
+ftp://ftp.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://ftp.netspace.net.au/pub/ubuntu
+http://ftp.ntua.gr/pub/linux/ubuntu
+ftp://ftp.oleane.net/ubuntu
+ftp://ftp.otenet.gr/ubuntu
+http://ftp.pwr.wroc.pl/ubuntu
+ftp://ftp.rrzn.uni-hannover.de/pub/mirror/linux/ubuntu
+http://ftp.science.nus.edu.sg/ubuntu
+http://ftp.stw-bonn.de/ubuntu
+http://ftp.ticklers.org/archive.ubuntu.org/ubuntu
+ftp://ftp.tiscali.nl/pub/mirror/ubuntu
+http://ftp.tiscali.nl/ubuntu
+http://ftp.tu-chemnitz.de/pub/linux/ubuntu
+ftp://ftp.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://ftp.tuke.sk/ubuntu
+http://ftp.twaren.net/Linux/Ubuntu/ubuntu
+http://ftp.u-picardie.fr/mirror/ubuntu/ubuntu
+ftp://ftp.uasw.edu/linux/ubuntu/archive
+http://ftp.ucr.ac.cr/ubuntu
+http://ftp.udc.es/ubuntu
+http://ftp.uni-kl.de/pub/linux/ubuntu
+http://ftp.uni-muenster.de/pub/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.unina.it/pub/linux/distributions/ubuntu
+http://ftp.uninett.no/ubuntu
+http://ftp.usf.edu/pub/ubuntu
+http://ftp.ussg.iu.edu/linux/ubuntu
+ftp://ftp.vectranet.pl/ubuntu
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/archives
+ftp://ftpserv.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://gd.tuwien.ac.at/opsys/linux/ubuntu/archive
+http://godel.cs.bilgi.edu.tr/ubuntu
+http://gulus.USherbrooke.ca/ubuntu
+http://hr.archive.ubuntu.com/ubuntu
+http://ie.archive.ubuntu.com/ubuntu
+http://kr.archive.ubuntu.com/ubuntu
+http://lug.mtu.edu/ubuntu
+http://mir1.ovh.net/ubuntu
+http://mirror.anl.gov/pub/ubuntu
+http://mirror.cc.columbia.edu/pub/linux/ubuntu/archive
+http://mirror.cs.umn.edu/ubuntu
+http://mirror.hgkz.ch/ubuntu
+http://mirror.imbrandon.com/ubuntu
+http://mirror.lcsee.wvu.edu/ubuntu
+http://mirror.letsopen.com/os/ubuntu
+http://mirror.lupaworld.com/ubuntu/archive
+http://mirror.nttu.edu.tw/ubuntu
+http://mirror.optus.net/ubuntu
+http://mirror.ox.ac.uk/sites/archive.ubuntu.com/ubuntu
+http://mirror.pacific.net.au/linux/ubuntu
+http://mirror.rootguide.org/ubuntu
+http://mirror.switch.ch/ftp/mirror/ubuntu
+ftp://mirror.switch.ch/mirror/ubuntu
+http://mirror.uni-c.dk/ubuntu
+http://mirror.utdlug.org/linux/distributions/ubuntu/packages
+http://mirror2.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirrors.cat.pdx.edu/ubuntu
+http://mirrors.ccs.neu.edu/archive.ubuntu.com
+http://mirrors.cs.wmich.edu/ubuntu
+http://mirrors.easynews.com/linux/ubuntu
+http://mirrors.kernel.org/ubuntu
+http://mirrors.nic.funet.fi/ubuntu
+http://mirrors.shlug.org/ubuntu
+ftp://mirrors.virginmedia.com/mirrors/ubuntu/archive
+http://mirrors.xmission.com/ubuntu
+http://mt.archive.ubuntu.com/ubuntu
+http://na.mirror.garr.it/mirrors/ubuntu-archive
+ftp://neacm.fe.up.pt/pub/ubuntu
+http://neacm.fe.up.pt/ubuntu
+http://nl.archive.ubuntu.com/ubuntu
+http://nl2.archive.ubuntu.com/ubuntu
+http://nz2.archive.ubuntu.com/ubuntu
+http://packages.midian.hu//pub/linux/distributions/ubuntu
+http://se.archive.ubuntu.com/ubuntu
+http://sft.if.usp.br/ubuntu
+http://snert.mi.hs-heilbronn.de/pub/ubuntu/ubuntu
+http://sunsite.informatik.rwth-aachen.de/ftp/pub/Linux/ubuntu/ubuntu
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/ubuntu/ubuntu
+http://tezcatl.fciencias.unam.mx/ubuntu
+http://th.archive.ubuntu.com/ubuntu
+http://tw.archive.ubuntu.com/ubuntu
+http://ubuntu-archive.datahop.it/ubuntu
+http://ubuntu.c3sl.ufpr.br/ubuntu
+http://ubuntu.cn99.com/ubuntu
+http://ubuntu.cs.uaf.edu/ubuntu
+http://ubuntu.cs.utah.edu/ubuntu
+http://ubuntu.csie.nctu.edu.tw/ubuntu
+http://ubuntu.eriders.ge/ubuntu
+http://ubuntu.fastbull.org/ubuntu
+http://ubuntu.indika.net.id/ubuntu
+http://ubuntu.inode.at/ubuntu
+http://ubuntu.intergenia.de/ubuntu
+http://ubuntu.ipacct.com/ubuntu
+http://ubuntu.lhi.is/ubuntu
+http://ubuntu.linux-bg.org/ubuntu
+http://ubuntu.mirror.ac.za/ubuntu-archive
+http://ubuntu.mirror.frontiernet.net/ubuntu
+http://ubuntu.mirror.rafal.ca/ubuntu
+http://ubuntu.mirrors.skynet.be/pub/ubuntu.com/ubuntu
+http://ubuntu.org.ua/ubuntu
+http://ubuntu.snet.uz/ubuntu
+http://ubuntu.supp.name/ubuntu
+http://ubuntu.task.gda.pl/ubuntu
+http://ubuntu.univ-nantes.fr/ubuntu
+http://ubuntu.uz/ubuntu
+http://ubuntu.ynet.sk/ubuntu
+http://www.gtlib.gatech.edu/pub/ubuntu
+http://www.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://www.nic.funet.fi/pub/mirrors/archive.ubuntu.com
+http://wwwftp.ciril.fr/pub/linux/ubuntu/archives
+ftp://yu.archive.ubuntu.com/ubuntu
diff --git a/src/lib/distro-info/ubuntu-9.10/mirrors/base_updates b/src/lib/distro-info/ubuntu-9.10/mirrors/base_updates
new file mode 100644
index 00000000..3b936ecf
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-9.10/mirrors/base_updates
@@ -0,0 +1,171 @@
+http://archive.ubuntu.com.ba/ubuntu
+http://archive.ubuntu.com/ubuntu
+ftp://br.archive.ubuntu.com/ubuntu
+ftp://bw.archive.ubuntu.com/ubuntu
+http://cl.archive.ubuntu.com/ubuntu
+http://cudlug.cudenver.edu/ubuntu
+ftp://cz.archive.ubuntu.com/MIRRORS/archive.ubuntu.com/mirror/ubuntu
+http://cz.archive.ubuntu.com/ubuntu
+ftp://darkstar.ist.utl.pt/pub/ubuntu/archive
+http://darkstar.ist.utl.pt/ubuntu/archive
+http://de.archive.ubuntu.com/ubuntu
+http://debian.charite.de/ubuntu
+http://debian.linux.org.tw/ubuntu
+http://dk.archive.ubuntu.com/ubuntu
+http://es.archive.ubuntu.com/ubuntu
+http://espelhos.edugraf.ufsc.br/ubuntu
+ftp://free.nchc.org.tw/ubuntu
+http://ftp-stud.fht-esslingen.de/Mirrors/ubuntu
+http://ftp-stud.hs-esslingen.de/ubuntu
+http://ftp.belnet.be/linux/ubuntu/ubuntu
+http://ftp.belnet.be/pub/mirror/ubuntu.com/ubuntu
+http://ftp.caliu.info/pub/distribucions/ubuntu/ubuntu
+http://ftp.chg.ru/pub/Linux/ubuntu/archive
+ftp://ftp.ciril.fr/pub/linux/ubuntu/archives
+http://ftp.citylink.co.nz/ubuntu
+http://ftp.crihan.fr/ubuntu
+ftp://ftp.cw.net/pub/linux/ftp.ubuntu.com/ubuntu
+http://ftp.cw.net/ubuntu
+http://ftp.dateleco.es/ubuntu
+http://ftp.dei.uc.pt/pub/linux/ubuntu/archive
+http://ftp.duth.gr/pub/ubuntu
+http://ftp.ecc.u-tokyo.ac.jp/ubuntu
+http://ftp.estpak.ee/ubuntu
+ftp://ftp.free.fr/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.freepark.org/ubuntu
+ftp://ftp.fu-berlin.de/linux/ubuntu
+ftp://ftp.funet.fi/pub/mirrors/archive.ubuntu.com
+http://ftp.gil.di.uminho.pt/ubuntu
+ftp://ftp.gtlib.gatech.edu/pub/ubuntu
+http://ftp.gui.uva.es/sites/ubuntu.com/ubuntu
+http://ftp.halifax.rwth-aachen.de/ubuntu
+http://ftp.heanet.ie/pub/ubuntu
+http://ftp.hosteurope.de/mirror/archive.ubuntu.com
+ftp://ftp.iinet.net.au/pub/ubuntu
+ftp://ftp.iitm.ac.in/ubuntu
+http://ftp.kaist.ac.kr/pub/ubuntu
+http://ftp.kfki.hu/linux/ubuntu
+ftp://ftp.kfki.hu/pub/linux/ubuntu
+http://ftp.leg.uct.ac.za/pub/linux/ubuntu
+http://ftp.linux.edu.lv/ubuntu
+ftp://ftp.linux.org.tr/pub/ubuntu
+http://ftp.lug.ro/ubuntu
+ftp://ftp.man.szczecin.pl/pub/Linux/ubuntu
+ftp://ftp.mipt.ru/mirror/ubuntu
+ftp://ftp.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://ftp.netspace.net.au/pub/ubuntu
+http://ftp.ntua.gr/pub/linux/ubuntu
+ftp://ftp.oleane.net/ubuntu
+ftp://ftp.otenet.gr/ubuntu
+ftp://ftp.polytechnic.edu.na/pub/ubuntu
+http://ftp.port80.se/ubuntu
+http://ftp.pwr.wroc.pl/ubuntu
+ftp://ftp.rrzn.uni-hannover.de/pub/mirror/linux/ubuntu
+ftp://ftp.science.nus.edu.sg/pub/ubuntu
+http://ftp.science.nus.edu.sg/ubuntu
+http://ftp.stw-bonn.de/ubuntu
+http://ftp.ticklers.org/archive.ubuntu.org/ubuntu
+ftp://ftp.tiscali.nl/pub/mirror/ubuntu
+http://ftp.tiscali.nl/ubuntu
+http://ftp.tu-chemnitz.de/pub/linux/ubuntu
+ftp://ftp.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://ftp.tuke.sk/ubuntu
+http://ftp.twaren.net/Linux/Ubuntu/ubuntu
+http://ftp.u-picardie.fr/mirror/ubuntu/ubuntu
+ftp://ftp.uasw.edu/linux/ubuntu/archive
+http://ftp.ucr.ac.cr/ubuntu
+http://ftp.udc.es/ubuntu
+http://ftp.uni-kl.de/pub/linux/ubuntu
+http://ftp.uni-muenster.de/pub/mirrors/ftp.ubuntu.com/ubuntu
+http://ftp.unina.it/pub/linux/distributions/ubuntu
+http://ftp.uninett.no/ubuntu
+http://ftp.usf.edu/pub/ubuntu
+http://ftp.ussg.iu.edu/linux/ubuntu
+ftp://ftp.vectranet.pl/ubuntu
+http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/archives
+ftp://ftpserv.tudelft.nl/pub/Linux/archive.ubuntu.com
+http://gd.tuwien.ac.at/opsys/linux/ubuntu/archive
+http://godel.cs.bilgi.edu.tr/ubuntu
+http://gulus.USherbrooke.ca/ubuntu
+http://hr.archive.ubuntu.com/ubuntu
+http://ie.archive.ubuntu.com/ubuntu
+http://klid.dk/ftp/ubuntu
+ftp://klid.dk/ubuntu
+http://kr.archive.ubuntu.com/ubuntu
+http://lug.mtu.edu/ubuntu
+http://mir1.ovh.net/ubuntu
+http://mirror.anl.gov/pub/ubuntu
+http://mirror.cc.columbia.edu/pub/linux/ubuntu/archive
+http://mirror.cs.umn.edu/ubuntu
+http://mirror.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirror.hgkz.ch/ubuntu
+http://mirror.imbrandon.com/ubuntu
+http://mirror.lcsee.wvu.edu/ubuntu
+http://mirror.letsopen.com/os/ubuntu
+http://mirror.lupaworld.com/ubuntu/archive
+http://mirror.nttu.edu.tw/ubuntu
+http://mirror.optus.net/ubuntu
+http://mirror.ox.ac.uk/sites/archive.ubuntu.com/ubuntu
+http://mirror.pacific.net.au/linux/ubuntu
+http://mirror.rootguide.org/ubuntu
+http://mirror.switch.ch/ftp/mirror/ubuntu
+ftp://mirror.switch.ch/mirror/ubuntu
+http://mirror.uni-c.dk/ubuntu
+http://mirror.utdlug.org/linux/distributions/ubuntu/packages
+http://mirror2.etf.bg.ac.yu/distributions/ubuntu/ubuntu-archive
+http://mirrors.cat.pdx.edu/ubuntu
+http://mirrors.ccs.neu.edu/archive.ubuntu.com
+ftp://mirrors.ccs.neu.edu/net/mirrors/archive.ubuntu.com
+http://mirrors.cs.wmich.edu/ubuntu
+ftp://mirrors.easynews.com/linux/ubuntu
+http://mirrors.kernel.org/ubuntu
+http://mirrors.nic.funet.fi/ubuntu
+http://mirrors.shlug.org/ubuntu
+ftp://mirrors.virginmedia.com/mirrors/ubuntu/archive
+http://mirrors.xmission.com/ubuntu
+http://mt.archive.ubuntu.com/ubuntu
+http://na.mirror.garr.it/mirrors/ubuntu-archive
+ftp://neacm.fe.up.pt/pub/ubuntu
+http://neacm.fe.up.pt/ubuntu
+http://nl.archive.ubuntu.com/ubuntu
+http://nl2.archive.ubuntu.com/ubuntu
+http://nz2.archive.ubuntu.com/ubuntu
+http://packages.midian.hu//pub/linux/distributions/ubuntu
+http://se.archive.ubuntu.com/ubuntu
+http://sft.if.usp.br/ubuntu
+http://snert.mi.hs-heilbronn.de/pub/ubuntu/ubuntu
+http://sunsite.informatik.rwth-aachen.de/ftp/pub/Linux/ubuntu/ubuntu
+ftp://sunsite.informatik.rwth-aachen.de/pub/linux/ubuntu/ubuntu
+http://tezcatl.fciencias.unam.mx/ubuntu
+http://th.archive.ubuntu.com/ubuntu
+ftp://tw.archive.ubuntu.com/ubuntu
+http://ubuntu-archive.datahop.it/ubuntu
+http://ubuntu.c3sl.ufpr.br/ubuntu
+http://ubuntu.cn99.com/ubuntu
+http://ubuntu.cs.uaf.edu/ubuntu
+http://ubuntu.cs.utah.edu/ubuntu
+http://ubuntu.csie.nctu.edu.tw/ubuntu
+http://ubuntu.eriders.ge/ubuntu
+http://ubuntu.fastbull.org/ubuntu
+http://ubuntu.indika.net.id/ubuntu
+http://ubuntu.inode.at/ubuntu
+http://ubuntu.intergenia.de/ubuntu
+http://ubuntu.ipacct.com/ubuntu
+http://ubuntu.lhi.is/ubuntu
+http://ubuntu.linux-bg.org/ubuntu
+ftp://ubuntu.mirror.ac.za/ubuntu-archive
+http://ubuntu.mirror.frontiernet.net/ubuntu
+http://ubuntu.mirror.rafal.ca/ubuntu
+http://ubuntu.mirrors.skynet.be/pub/ubuntu.com/ubuntu
+http://ubuntu.org.ua/ubuntu
+http://ubuntu.snet.uz/ubuntu
+http://ubuntu.supp.name/ubuntu
+http://ubuntu.task.gda.pl/ubuntu
+http://ubuntu.univ-nantes.fr/ubuntu
+http://ubuntu.uz/ubuntu
+http://ubuntu.ynet.sk/ubuntu
+http://www.gtlib.gatech.edu/pub/ubuntu
+http://www.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
+http://www.nic.funet.fi/pub/mirrors/archive.ubuntu.com
+http://wwwftp.ciril.fr/pub/linux/ubuntu/archives
+ftp://yu.archive.ubuntu.com/ubuntu
diff --git a/src/lib/distro-info/ubuntu-9.10/prereqfiles/etc/hosts b/src/lib/distro-info/ubuntu-9.10/prereqfiles/etc/hosts
new file mode 100644
index 00000000..75721cd5
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-9.10/prereqfiles/etc/hosts
@@ -0,0 +1 @@
+127.0.0.1 localhost
diff --git a/src/lib/distro-info/ubuntu-9.10/settings.default b/src/lib/distro-info/ubuntu-9.10/settings.default
new file mode 100644
index 00000000..61e8ea63
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-9.10/settings.default
@@ -0,0 +1,76 @@
+arch = i386
+package-subdir = pool
+prereq-packages = main/d/debootstrap/debootstrap_1.0.20_all.deb
+release-name = karmic
+<repository base>
+ components = main restricted
+ distribution = karmic
+ name = Ubuntu 9.10
+ repo-subdir = dists
+ file-for-speedtest = dists/karmic/main/binary-i386/Packages.bz2
+</repository>
+<repository base_security>
+ components = main restricted
+ distribution = karmic-security
+ name = Ubuntu 9.10 Security
+ repo-subdir = dists
+ file-for-speedtest = dists/karmic-security/main/binary-i386/Packages.bz2
+</repository>
+<repository base_updates>
+ components = main restricted
+ distribution = karmic-updates
+ name = Ubuntu 9.10 Updates
+ repo-subdir = dists
+ file-for-speedtest = dists/karmic-updates/main/binary-i386/Packages.bz2
+</repository>
+<selection minimal>
+ packages = <<END
+ language-pack-de
+ linux-image-generic
+ END
+</selection>
+<selection standard>
+ base = minimal
+ packages = <<END
+ ubuntu-standard
+ END
+</selection>
+<selection gnome>
+ base = minimal
+ packages = <<END
+ ubuntu-desktop
+ END
+</selection>
+<selection kde>
+ base = minimal
+ packages = <<END
+ kubuntu-desktop
+ END
+</selection>
+<selection xfce>
+ base = minimal
+ packages = <<END
+ xubuntu-desktop
+ END
+</selection>
+<selection edubuntu-server>
+ base = minimal
+ packages = <<END
+ edubuntu-server
+ END
+</selection>
+<selection edubuntu-gnome>
+ base = minimal
+ packages = <<END
+ edubuntu-desktop-gnome
+ END
+</selection>
+<selection edubuntu-kde>
+ base = minimal
+ packages = <<END
+ edubuntu-desktop-kde
+ END
+</selection>
+<selection default>
+ base = minimal
+</selection>
diff --git a/src/lib/distro-info/ubuntu-9.10/settings.example b/src/lib/distro-info/ubuntu-9.10/settings.example
new file mode 100644
index 00000000..31881c4c
--- /dev/null
+++ b/src/lib/distro-info/ubuntu-9.10/settings.example
@@ -0,0 +1,23 @@
+# rename this file to 'settings' and edit it as you please
+#
+# for a list of all options, have a look at the corresponding
+# settings.default in /opt/openslx/share/distro-info
+
+# use local installation source
+#<repository base>
+# local-url = /srv/ftp/pub/ubuntu
+#</repository>
+#<repository base_updates>
+# local-url = /srv/ftp/pub/ubuntu
+#</repository>
+#<repository base_security>
+# local-url = /srv/ftp/pub/ubuntu
+#</repository>
+
+# add a new selection:
+#<selection my_kde>
+# base = kde
+# packages = <<END
+# kinternet
+# END
+#</selection>
diff --git a/src/os-plugins/OpenSLX/OSPlugin/Base.pm b/src/os-plugins/OpenSLX/OSPlugin/Base.pm
new file mode 100644
index 00000000..2af0f04c
--- /dev/null
+++ b/src/os-plugins/OpenSLX/OSPlugin/Base.pm
@@ -0,0 +1,631 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# Base.pm
+# - provides empty base of the OpenSLX OSPlugin API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSPlugin::Base;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+=head1 NAME
+
+OpenSLX::OSPlugin::Base - the base class for all OpenSLX OS-plugins.
+
+=head1 DESCRIPTION
+
+This class defines the OpenSLX API for OS-plugins.
+
+The general idea behind OS-plugins is to extend any installed vendor-OS with
+a specific features. Each feature is implemented as a separate, small software
+component in order to make them easy to understand and maintain.
+
+Since all of these software components are plugged into the OpenSLX system by
+means of a common API, we call them B<OS-plugin>s.
+
+This API can be separated into different parts:
+
+=over
+
+=item - L</Declarative Interface> (provide info about a plugin)
+
+=item - L</Vendor-OS Interface> (installing or removing a plugin into/from a
+vendor-OS)
+
+=item - L</Initramfs Interface> (integrating a plugin into an initramfs)
+
+=back
+
+=head1 MORE INFO
+
+Please read the user-level introduction on plugins in the OpenSLX-wiki:
+L<http://openslx.org/trac/de/openslx/wiki/PluginKonzept> (in German).
+
+If you'd like to know how a plugin is implemented, please have a look at the
+'example' plugin, which contains some explainations and useful hints.
+
+If you have any questions regarding the concept of OS-plugins and their
+implementation, please drop a mail to: ot@openslx.com, or join the IRC-channel
+'#openslx' (on freenode).
+
+=cut
+
+use Scalar::Util qw( weaken );
+
+use OpenSLX::Basics;
+use OpenSLX::OSPlugin::Roster;
+
+=head1 PLUGIN API
+
+=head2 Declarative Interface
+
+=over
+
+=item new()
+
+Every plugin should provide a new-method and provide it's own name in the
+'name' entry of $self.
+
+Please note that by convention, plugin names are all lowercase!
+
+=cut
+
+sub new
+{
+ confess "Creating OpenSLX::OSPlugin::Base-objects directly makes no sense!";
+}
+
+=item initialize()
+
+Initializes basic context for this plugin (esp. a reference to the OSPlugin
+engine that drives this plugin.
+
+=cut
+
+sub initialize
+{
+ my $self = shift;
+
+ $self->{'os-plugin-engine'} = shift;
+ $self->{'distro'} = shift;
+
+ weaken($self->{'os-plugin-engine'});
+ # avoid circular reference between plugin and its engine
+
+ return;
+}
+
+=item getInfo()
+
+Returns a hash-ref with administrative information about this plugin (what does
+it do and how does it relate to other plugins). Every plugin needs to provide
+this method and return the information about itself.
+
+The returned hash-ref must include at least the following entries:
+
+=over
+
+=item B<description>
+
+Explains the purpose of this plugins.
+
+=item B<precedence>
+
+Specifies the execution precedence of this plugin with respect to all other
+plugins (plugins with lower precedences will be started before the ones with
+a higher precedence).
+
+Valid values range from 0-99. If your plugin does not have any requirements
+in this context, just specify the default value '50'.
+
+=item B<required>
+
+Specifies the list of plugins that are required by this plugin.
+
+Before any plugin can be installed, all other plugins that are required by it
+must have been installed.
+
+=back
+
+=cut
+
+sub getInfo
+{
+ my $self = shift;
+
+ return {
+ # a short (one-liner) description of this plugin
+ description => '',
+ };
+}
+
+=item getAttrInfo()
+
+Returns a hash-ref with information about all attributes supported by this
+specific plugin.
+
+This default configuration will be added as attributes to the default system,
+such that it can be overruled for any specific system by means of B<slxconfig>.
+
+The returned hash-ref must include at least the following entries:
+
+=over
+
+=item B<I<plugin-name>::active>
+
+Indicates whether or not this plugin is active (1 for active, 0 for inactive).
+
+=back
+
+=cut
+
+sub getAttrInfo
+{
+ my $self = shift;
+
+ # This default configuration will be added as attributes to the default
+ # system, such that it can be overruled for any specific system by means
+ # of slxconfig.
+ return {
+ # attribute 'active' is mandatory for all plugins
+ };
+}
+
+=item getDefaultAttrsForVendorOS()
+
+Returns a hash-ref with the default attribute values for the given vendor-OS.
+
+=cut
+
+sub getDefaultAttrsForVendorOS
+{
+ my $self = shift;
+
+ # the default implementation does not change the default values at all:
+ return $self->getAttrInfo();
+}
+
+=item checkStage3AttrValues()
+
+Checks if the stage3 values given in B<$stage3Attrs> are allowed and make sense.
+
+This method returns an array-ref of problems found. If there were no problems,
+this methods returns undef.
+
+Plugins may override this implementation to do checks that for instance look
+at the stage1 vendor-OS-attributes given in B<$vendorOSAttrs>.
+
+N.B.: this method is called while being chrooted into the vendor-OS, so it
+ may invoke all distro methods that expect to be run in this environment,
+ too
+
+=cut
+
+sub checkStage3AttrValues
+{
+ my $self = shift;
+ my $stage3Attrs = shift;
+ my $vendorOSAttrs = shift;
+
+ # this default implementation does no further checks (thus relying on the
+ # attributte regex check that is done in the AttributeRoster)
+ return;
+}
+
+=item dependsOnPlugin()
+
+=cut
+
+sub dependsOnPlugin
+{
+ my $self = shift;
+ my $otherName = shift;
+
+ if (!defined $self->{dependsOn}) {
+ my @dependsOn = $self->_determineAllPluginsWeDependOn();
+ $self->{dependsOn} = \@dependsOn;
+ }
+
+ return grep { $_ eq $otherName } @{$self->{dependsOn}};
+}
+
+=back
+
+=head2 Vendor-OS Interface
+
+=over
+
+=item installationPhase()
+
+In this method, the plugin should install itself into the given vendor-OS.
+
+What "installation" means is up to the plugin. Some plugins may just copy
+a file from the OpenSLX host installation into the vendor-OS, while others may
+need to download files from the internet and/or install packages through the
+vendor-OS' meta packager.
+
+N.B.: This method is invoked while chrooted into the vendor-OS root.
+
+The hash-ref given in B<$info> contains vital information for the installation
+process:
+
+=over
+
+=item C<plugin-repo-path>
+
+The folder where the stage1-plugin should store all files required by the
+corresponding stage3 runlevel script.
+
+=item C<plugin-temp-path>
+
+A temporary playground that will be cleaned up automatically.
+
+=item C<openslx-base-path>
+
+In order to make the OpenSLX files from the host available, the OpenSLX base
+folder (normally /opt/openslx) will be mounted into the chroot.
+So if you have to copy any files from the host, fetch them from this path.
+
+=item C<openslx-config-path>
+
+In order to make the OpenSLX config files from the host available, the OpenSLX
+config folder (normally /etc/opt/openslx) will be mounted into the chroot.
+So if you have to copy any config files from the host, fetch them from this
+path.
+
+=item C<plugin-attrs>
+
+Contains the attributes in effect for the installation of this plugin.
+
+=back
+
+=cut
+
+sub installationPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ return;
+}
+
+=item removalPhase()
+
+In this method, the plugin should remove itself from the given vendor-OS.
+
+What "removal" means is up to the plugin. Some plugins may just delete
+a file from the vendor-OS, while others may need to uninstall packages through
+the vendor-OS' meta packager.
+
+N.B.: This method is invoked while chrooted into the vendor-OS root.
+
+The hash-ref given in B<$info> contains vital information for the installation
+process:
+
+=over
+
+=item C<plugin-repo-path>
+
+The folder where the stage1-plugin should store all files required by the
+corresponding stage3 runlevel script.
+
+=item C<plugin-temp-path>
+
+A temporary playground that will be cleaned up automatically.
+
+=item C<openslx-base-path>
+
+In order to make the OpenSLX files from the host available, the OpenSLX base
+folder (normally /opt/openslx) will be mounted into the chroot.
+So if you have to copy any files from the host, fetch them from this path.
+
+=item C<openslx-config-path>
+
+In order to make the OpenSLX config files from the host available, the OpenSLX
+config folder (normally /etc/opt/openslx) will be mounted into the chroot.
+So if you have to copy any config files from the host, fetch them from this
+path.
+
+=item C<plugin-attrs>
+
+Contains the attributes in effect for the installation of this plugin.
+
+=back
+
+=cut
+
+sub removalPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ return;
+}
+
+=item preInstallationPhase()
+
+In this method, any preparations for installation of the plugin into a vendor-OS
+should be executed. As this method is being called immediately before the chroot
+is entered, this is the last/only chance to copy any files into the chroot that
+are required from within (in installationPhase()).
+
+The given parameters are similar to the ones for installationPhase(), except
+that all paths are now relative to the root-fs instead of being relative to the
+chroot (i.e. the paths are ready to be used from outside the chroot):
+
+A "exit 1;" will result in a not installed plugin.
+
+=over
+
+=item C<plugin-repo-path>
+
+The folder where the stage1-plugin should store all files required by the
+corresponding stage3 runlevel script.
+
+=item C<plugin-temp-path>
+
+A temporary playground that will be cleaned up automatically.
+
+If a plugin needs to unpack any archives, these archives should be copied to
+this folder (as it will be cleaned automatically).
+
+=item C<openslx-base-path>
+
+In order to make the OpenSLX files from the host available, the OpenSLX base
+folder (normally /opt/openslx) will be mounted into the chroot.
+So if you have to copy any files from the host, fetch them from this path.
+
+=item C<openslx-config-path>
+
+In order to make the OpenSLX config files from the host available, the OpenSLX
+config folder (normally /etc/opt/openslx) will be mounted into the chroot.
+So if you have to copy any config files from the host, fetch them from this
+path.
+
+=item C<plugin-attrs>
+
+Contains the attributes in effect for the installation of this plugin.
+
+=item C<vendor-os-path>
+
+Contains the path to the vendor-OS into which the plugin will be installed.
+
+=back
+
+=cut
+
+sub preInstallationPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ return;
+}
+
+=item postRemovalPhase()
+
+In this method, any plugin has the chance to do any necessary cleanup that
+must be executed outside of the chroot.
+
+This method is invoked immediately after leaving the chroot into the vendor-OS
+root, but before the plugin-temp-path has been cleaned up. So if required, any
+files could be copied out of the temp-path somewhere into the root-fs.
+
+The given parameters are similar to the ones for removalPhase(), except that all
+paths are now relative to the root-fs instead of being relative to the chroot
+(i.e. the paths are ready to be used from outside the chroot):
+
+=over
+
+=item C<plugin-repo-path>
+
+The folder where the stage1-plugin should store all files required by the
+corresponding stage3 runlevel script.
+
+=item C<plugin-temp-path>
+
+A temporary playground that will be cleaned up automatically.
+
+=item C<openslx-base-path>
+
+In order to make the OpenSLX files from the host available, the OpenSLX base
+folder (normally /opt/openslx) will be mounted into the chroot.
+So if you have to copy any files from the host, fetch them from this path.
+
+=item C<openslx-config-path>
+
+In order to make the OpenSLX config files from the host available, the OpenSLX
+config folder (normally /etc/opt/openslx) will be mounted into the chroot.
+So if you have to copy any config files from the host, fetch them from this
+path.
+
+=item C<plugin-attrs>
+
+Contains the attributes in effect for the installation of this plugin.
+
+=item C<vendor-os-path>
+
+Contains the path to the vendor-OS from which the plugin has been removed.
+
+=back
+
+=cut
+
+sub postRemovalPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ return;
+}
+
+=back
+
+=head2 Initramfs Interface
+
+All of the following methods are invoked by the config demuxer when it makes an
+initramfs for a system that has this plugin activated. Through these methods,
+each plugin can integrate itself into that initramfs.
+
+=over
+
+=item suggestAdditionalKernelParams()
+
+Called in order to give the plugin a chance to add any kernel params it
+requires.
+
+In order to do so, the plugin should return a list of additional kernel params
+that it would like to see added.
+
+=cut
+
+sub suggestAdditionalKernelParams
+{
+ my $self = shift;
+ my $makeInitRamFSEngine = shift;
+
+ return;
+}
+
+=item suggestAdditionalKernelModules()
+
+Called in order to give the plugin a chance to add any kernel modules it
+requires.
+
+In order to do so, the plugin should return the names of additional kernel
+modules that it would like to see added.
+
+=cut
+
+sub suggestAdditionalKernelModules
+{
+ my $self = shift;
+ my $makeInitRamFSEngine = shift;
+ my $attrs = shift;
+
+ return;
+}
+
+=item copyRequiredFilesIntoInitramfs()
+
+Called in order to give the plugin a chance to copy all required files from the
+vendor-OS into the initramfs.
+
+N.B.: Only files that are indeed required by the initramfs should be copied
+here, i.e. files that are needed *before* the root-fs has been mounted.
+All other files should be taken from the root-fs instead!
+
+=cut
+
+sub copyRequiredFilesIntoInitramfs
+{
+ my $self = shift;
+ my $targetPath = shift;
+ my $attrs = shift;
+ my $makeInitRamFSEngine = shift;
+
+ return;
+}
+
+=item setupPluginInInitramfs()
+
+Called in order to let the plugin setup all the files it requires in the
+initramfs.
+
+Normally, you don't need to override this method in your own plugin,
+as it is usually enough to override suggestAdditionalKernelParams(),
+suggestAdditionalKernelModules() and maybe copyRequiredFilesIntoInitramfs().
+
+=cut
+
+sub setupPluginInInitramfs
+{
+ my $self = shift;
+ my $attrs = shift;
+ my $makeInitRamFSEngine = shift;
+
+ my $pluginName = $self->{name};
+ my $pluginSrcPath = "$openslxConfig{'base-path'}/lib/plugins";
+ my $buildPath = $makeInitRamFSEngine->{'build-path'};
+ my $pluginInitdPath = "$buildPath/etc/plugin-init.d";
+ my $initHooksPath = "$buildPath/etc/init-hooks";
+
+ # copy runlevel script
+ my $precedence = sprintf('%02d', $self->getInfo()->{precedence});
+ my $scriptName = "$pluginSrcPath/$pluginName/XX_${pluginName}.sh";
+ my $targetName = "$pluginInitdPath/${precedence}_${pluginName}.sh";
+ if (-e $scriptName) {
+ $makeInitRamFSEngine->addCMD("cp $scriptName $targetName");
+ $makeInitRamFSEngine->addCMD("chmod a+x $targetName");
+ }
+
+ # copy init hook scripts, if any
+ if (-d "$pluginSrcPath/$pluginName/init-hooks") {
+ my $hookSrcPath = "$pluginSrcPath/$pluginName/init-hooks";
+ $makeInitRamFSEngine->addCMD(
+ "cp -r $hookSrcPath/* $buildPath/etc/init-hooks/"
+ );
+ }
+
+ # invoke hook methods to suggest additional kernel params ...
+ my @suggestedParams
+ = $self->suggestAdditionalKernelParams($makeInitRamFSEngine);
+ if (@suggestedParams) {
+ my $params = join ' ', @suggestedParams;
+ vlog(1, "plugin $pluginName suggests these kernel params: $params");
+ $makeInitRamFSEngine->addKernelParams(@suggestedParams);
+ }
+
+ # ... and kernel modules
+ my @suggestedModules
+ = $self->suggestAdditionalKernelModules($makeInitRamFSEngine, $attrs);
+ if (@suggestedModules) {
+ my $modules = join(',', @suggestedModules);
+ vlog(1, "plugin $pluginName suggests these kernel modules: $modules");
+ $makeInitRamFSEngine->addKernelModules(@suggestedModules);
+ }
+
+ # invoke hook method to copy any further files that are required in stage3
+ # before the root-fs has been mounted
+ $self->copyRequiredFilesIntoInitramfs(
+ $buildPath, $attrs, $makeInitRamFSEngine
+ );
+
+ return 1;
+}
+
+sub _determineAllPluginsWeDependOn
+{
+ my $self = shift;
+ my $seen = shift || {};
+
+ return if $seen->{$self->{name}};
+ $seen->{$self->{name}} = 1;
+
+ my %dependsOn;
+ if ($self->getInfo()->{required}) {
+ @dependsOn{@{$self->getInfo()->{required}}} = ();
+ }
+
+ foreach my $depName (keys %dependsOn) {
+ my $depPlugin = OpenSLX::OSPlugin::Roster->getPlugin($depName);
+ my @subDeps = $depPlugin->_determineAllPluginsWeDependOn($seen);
+ @dependsOn{@subDeps} = ();
+ }
+
+ return keys %dependsOn;
+}
+
+=back
+
+1;
diff --git a/src/os-plugins/OpenSLX/OSPlugin/Engine.pm b/src/os-plugins/OpenSLX/OSPlugin/Engine.pm
new file mode 100644
index 00000000..25827205
--- /dev/null
+++ b/src/os-plugins/OpenSLX/OSPlugin/Engine.pm
@@ -0,0 +1,857 @@
+# Copyright (c) 2007, 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# Engine.pm
+# - provides driver engine for the OSPlugin API.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSPlugin::Engine;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+use Config;
+use File::Basename;
+use File::Path;
+use Storable;
+
+use OpenSLX::Basics;
+use OpenSLX::OSPlugin::Roster;
+use OpenSLX::OSSetup::Engine;
+use OpenSLX::ScopedResource;
+use OpenSLX::Utils;
+
+=head1 NAME
+
+OpenSLX::OSPlugin::Engine - driver class for plugin handling.
+
+=head1 DESCRIPTION
+
+This class works as a driver for the installation/removal of plugins
+into/from a vendor.
+
+Additionally, it provides the OS-Plugin support interface.
+
+=head1 PUBLIC METHODS
+
+=over
+
+=item new()
+
+Trivial constructor
+
+=cut
+
+sub new
+{
+ my $class = shift;
+
+ my $self = {};
+
+ return bless $self, $class;
+}
+
+=item initialize($pluginName, $vendorOSName )
+
+Sets up basic data (I<$pluginName> and I<$vendorOSName>) as well as paths and
+loads plugin.
+
+=cut
+
+sub initialize
+{
+ my $self = shift;
+ my $pluginName = shift;
+ my $vendorOSName = shift;
+ my $givenAttrs = shift || {};
+
+ $self->{'vendor-os-name'} = $vendorOSName;
+
+ $self->{'vendor-os-path'}
+ = "$openslxConfig{'private-path'}/stage1/$vendorOSName";
+ vlog(2, "vendor-OS path is '$self->{'vendor-os-path'}'");
+
+ if ($pluginName) {
+ $self->{'plugin-name'} = $pluginName;
+ $self->{'plugin-path'}
+ = "$openslxConfig{'base-path'}/lib/plugins/$pluginName";
+ vlog(1, "plugin path is '$self->{'plugin-path'}'");
+
+ $self->{'plugin'} = $self->_loadPlugin();
+ return if !$self->{'plugin'};
+
+ $self->{'chrooted-plugin-repo-path'}
+ = "$openslxConfig{'base-path'}/plugin-repo/$self->{'plugin-name'}";
+ $self->{'plugin-repo-path'}
+ = "$self->{'vendor-os-path'}/$self->{'chrooted-plugin-repo-path'}";
+ $self->{'chrooted-plugin-temp-path'}
+ = "/tmp/slx-plugin/$self->{'plugin-name'}";
+ $self->{'plugin-temp-path'}
+ = "$self->{'vendor-os-path'}/$self->{'chrooted-plugin-temp-path'}";
+ $self->{'chrooted-openslx-base-path'} = '/mnt/opt/openslx';
+ $self->{'chrooted-openslx-config-path'} = '/mnt/etc/opt/openslx';
+
+ # merge attributes that were given on cmdline with the ones that
+ # already exist in the DB and finally with the default values
+ $self->{'plugin-attrs'} = { %$givenAttrs };
+ my $defaultAttrs = $self->{plugin}->getDefaultAttrsForVendorOS(
+ $vendorOSName
+ );
+ my $dbAttrs = $self->_fetchInstalledPluginAttrs($vendorOSName);
+ for my $attrName (keys %$defaultAttrs) {
+ next if exists $givenAttrs->{$attrName};
+ $self->{'plugin-attrs'}->{$attrName}
+ = exists $dbAttrs->{$attrName}
+ ? $dbAttrs->{$attrName}
+ : $defaultAttrs->{$attrName}->{default};
+ }
+ $self->{'vendorOS-attrs'} = $dbAttrs;
+ }
+
+ return 1;
+}
+
+=back
+
+=head2 Driver Interface
+
+The following methods are invoked by the slxos-plugin script in order to
+install/remove a plugin into/from a vendor-OS:
+
+=over
+
+=item installPlugin()
+
+Invokes the plugin's installer method while chrooted into that vendor-OS.
+
+=cut
+
+sub installPlugin
+{
+ my $self = shift;
+
+ $self->_checkIfRequiredPluginsAreInstalled();
+
+ # look for unknown attributes
+ my $attrs = $self->{'plugin-attrs'};
+ my $attrInfos = $self->{plugin}->getAttrInfo();
+ my @unknownAttrs = grep { !exists $attrInfos->{$_} } keys %$attrs;
+ if (@unknownAttrs) {
+ die _tr(
+ "The plugin '%s' does not support these attributes:\n\t%s",
+ $self->{'plugin-name'}, join(',', @unknownAttrs)
+ );
+ }
+
+ # check all attr-values against the regex of the attribute (if any)
+ my @attrProblems;
+ foreach my $attr (keys %$attrs) {
+ my $value = $attrs->{$attr};
+ next if !defined $value;
+ my $attrInfo = $attrInfos->{$attr};
+ my $regex = $attrInfo->{content_regex};
+ if ($regex && $value !~ $regex) {
+ push @attrProblems, _tr(
+ "the value '%s' for attribute %s is not allowed.\nAllowed values are: %s",
+ $value, $attr, $attrInfo->{content_descr}
+ );
+ }
+ }
+
+ if (@attrProblems) {
+ my $complaint = join "\n", @attrProblems;
+ die $complaint;
+ }
+
+ if ($self->{'vendor-os-name'} ne '<<<default>>>') {
+
+ # as the attrs may be changed by the plugin during installation, we
+ # have to find a way to pass them back to this process (remember:
+ # installation takes place in a forked process in order to do a chroot).
+ # We simply serialize the attributes into a temp file and deserialize
+ # it in the calling process.
+ my $serializedAttrsFile
+ = "$self->{'plugin-temp-path'}/serialized-attrs";
+ my $chrootedSerializedAttrsFile
+ = "$self->{'chrooted-plugin-temp-path'}/serialized-attrs";
+
+ rmtree([ $self->{'plugin-repo-path'}, $self->{'plugin-temp-path'} ]);
+ mkpath([ $self->{'plugin-repo-path'}, $self->{'plugin-temp-path'} ]);
+
+ # invoke plugin and let it prepare the installation
+ $self->{plugin}->preInstallationPhase( {
+ 'plugin-repo-path' => $self->{'plugin-repo-path'},
+ 'plugin-temp-path' => $self->{'plugin-temp-path'},
+ 'openslx-base-path' => $openslxConfig{'base-path'},
+ 'openslx-config-path' => $openslxConfig{'config-path'},
+ 'plugin-attrs' => $self->{'plugin-attrs'},
+ 'vendor-os-path' => $self->{'vendor-os-path'},
+ } );
+
+ # HACK: do a dummy serialization here in order to get Storable
+ # completely loaded (otherwise it will complain in the chroot about
+ # missing modules).
+ store $self->{'plugin-attrs'}, $serializedAttrsFile;
+
+ $self->_callChrootedFunctionForPlugin(
+ sub {
+ # invoke plugin and let it install itself into vendor-OS
+ $self->{plugin}->installationPhase( {
+ 'plugin-repo-path'
+ => $self->{'chrooted-plugin-repo-path'},
+ 'plugin-temp-path'
+ => $self->{'chrooted-plugin-temp-path'},
+ 'openslx-base-path'
+ => $self->{'chrooted-openslx-base-path'},
+ 'openslx-config-path'
+ => $self->{'chrooted-openslx-config-path'},
+ 'plugin-attrs'
+ => $self->{'plugin-attrs'},
+ } );
+
+ # serialize possibly changed attributes (executed inside chroot)
+ store $self->{'plugin-attrs'}, $chrootedSerializedAttrsFile;
+ }
+ );
+
+ # now retrieve (deserialize) the current attributes and store them
+ $self->{'plugin-attrs'} = retrieve $serializedAttrsFile;
+
+ # cleanup temp path
+ rmtree([ $self->{'plugin-temp-path'} ]);
+
+ # now update the vendorOS-attrs and let the plugin itself check the
+ # stage3 attrs
+ $self->{'vendorOS-attrs'} = $self->{'plugin-attrs'};
+ $self->checkStage3AttrValues(
+ $self->{'plugin-attrs'}, \@attrProblems
+ );
+ if (@attrProblems) {
+ my $complaint = join "\n", @attrProblems;
+ die $complaint;
+ }
+ }
+
+ $self->_addInstalledPluginToDB();
+
+ return 1;
+}
+
+=item removePlugin()
+
+Invokes the plugin's removal method while chrooted into that vendor-OS.
+
+=cut
+
+sub removePlugin
+{
+ my $self = shift;
+
+ $self->_checkIfPluginIsRequiredByOthers();
+
+ if ($self->{'vendor-os-name'} ne '<<<default>>>') {
+
+ mkpath([ $self->{'plugin-repo-path'}, $self->{'plugin-temp-path'} ]);
+
+ $self->_callChrootedFunctionForPlugin(
+ sub {
+ $self->{plugin}->removalPhase( {
+ 'plugin-repo-path'
+ => $self->{'chrooted-plugin-repo-path'},
+ 'plugin-temp-path'
+ => $self->{'chrooted-plugin-temp-path'},
+ 'openslx-base-path'
+ => $self->{'chrooted-openslx-base-path'},
+ 'openslx-config-path'
+ => $self->{'chrooted-openslx-config-path'},
+ 'plugin-attrs'
+ => $self->{'plugin-attrs'},
+ } );
+ }
+ );
+
+ # invoke plugin and let it prepare the installation
+ $self->{plugin}->postRemovalPhase( {
+ 'plugin-repo-path' => $self->{'plugin-repo-path'},
+ 'plugin-temp-path' => $self->{'plugin-temp-path'},
+ 'openslx-base-path' => $openslxConfig{'base-path'},
+ 'openslx-config-path' => $openslxConfig{'config-path'},
+ 'plugin-attrs' => $self->{'plugin-attrs'},
+ 'vendor-os-path' => $self->{'vendor-os-path'},
+ } );
+
+ rmtree([ $self->{'plugin-repo-path'}, $self->{'plugin-temp-path'} ]);
+ }
+
+ $self->_removeInstalledPluginFromDB();
+
+ return 1;
+}
+
+=item getInstalledPlugins()
+
+Returns the list of names of the plugins that are installed into the current
+vendor-OS.
+
+=cut
+
+sub getInstalledPlugins
+{
+ my $self = shift;
+
+ my $openslxDB = instantiateClass("OpenSLX::ConfigDB");
+ $openslxDB->connect();
+ my $vendorOSID = $self->_fetchVendorOSID($openslxDB);
+ my @installedPlugins = $openslxDB->fetchInstalledPlugins($vendorOSID);
+ $openslxDB->disconnect();
+
+ return @installedPlugins;
+}
+
+=back
+
+=head2 Support Interface
+
+This is the plugin support interface for OS-plugins, which represents the
+connection between a plugin's implementation and the rest of the OpenSLX system.
+
+Plugin implementations are meant to use this interface in order to find
+out details about the current vendor-OS or download files or install packages.
+
+=over
+
+=item vendorOSName()
+
+Returns the name of the current vendor-OS.
+
+=cut
+
+sub vendorOSName
+{
+ my $self = shift;
+
+ return $self->{'vendor-os-name'};
+}
+
+=item distroName()
+
+Returns the name of the distro that the current vendor-OS is based on.
+
+Each distro name always consists of the distro type, a dash and the
+distro version, like 'suse-10.2' or 'ubuntu-7.04'.
+
+=cut
+
+sub distroName
+{
+ my $self = shift;
+
+ return $self->_osSetupEngine()->distroName();
+}
+
+=item downloadFile($fileURL, $targetPath, $wgetOptions)
+
+Invokes busybox's wget to download a file from the given URL.
+
+=over
+
+=item I<$fileURL>
+
+The URL of the file to download.
+
+=item I<$targetPath> [optional]
+
+The directory where the file should be downloaded into. The default is the
+current plugin's temp directory.
+
+=item I<$wgetOptions> [optional]
+
+Any other options you'd like to pass to wget.
+
+=item I<Return Value>
+
+If the downloaded was successful this method returns C<1>, otherwise it dies.
+
+=back
+
+=cut
+
+sub downloadFile
+{
+ my $self = shift;
+ my $fileURL = shift || return;
+ my $targetPath = shift || $self->{'chrooted-plugin-temp-path'};
+ my $wgetOptions = shift || '';
+
+ my $busybox = $self->_osSetupEngine()->busyboxBinary();
+
+ if (slxsystem("$busybox wget -P $targetPath $wgetOptions $fileURL")) {
+ die _tr('unable to download file "%s"! (%s)', $fileURL, $!);
+ }
+
+ return 1;
+}
+
+=item getInstalledPackages()
+
+Returns the list of names of the packages (as an array) that are already
+installed in the vendor-OS.
+Useful if a plugin wants to find out whether or not it has to
+install additional packages.
+
+=cut
+
+sub getInstalledPackages
+{
+ my $self = shift;
+
+ my $packager = $self->_osSetupEngine()->packager();
+ return if !$packager;
+
+ return $packager->getInstalledPackages();
+}
+
+=item getInstallablePackagesForSelection()
+
+Looks at the selection with the given name and returns the list of names of the
+packages (as one string separated by spaces) that need to be installed in order
+to complete the selection.
+
+=cut
+
+sub getInstallablePackagesForSelection
+{
+ my $self = shift;
+ my $selection = shift;
+
+ return $self->_osSetupEngine()->getInstallablePackagesForSelection(
+ $selection
+ );
+}
+
+=item installPackages($packages)
+
+Installs the given packages into the vendor-OS.
+
+N.B: Since this method uses the meta-packager of the vendor-OS, package
+dependencies will be determined and solved automatically.
+
+=over
+
+=item I<$packages>
+
+Contains a list of package names (separated by spaces) that shall be installed.
+
+=item I<Return Value>
+
+If the packages have been installed successfully this method return 1,
+otherwise it dies.
+
+=back
+
+=cut
+
+sub installPackages
+{
+ my $self = shift;
+ my $packages = shift;
+
+ return if !$packages;
+
+ my $metaPackager = $self->_osSetupEngine()->metaPackager();
+ return if !$metaPackager;
+
+ return $metaPackager->installPackages($packages, 1);
+}
+
+=item removePackages($packages)
+
+Removes the given packages from the vendor-OS.
+
+=over
+
+=item I<$packages> [ARRAY-ref]
+
+Contains a list of package names (separated by spaces) that shall be removed.
+
+=item I<Return Value>
+
+If the packages have been removed successfully this method return 1,
+otherwise it dies.
+
+=back
+
+=cut
+
+sub removePackages
+{
+ my $self = shift;
+ my $packages = shift;
+
+ return if !$packages;
+
+ my $metaPackager = $self->_osSetupEngine()->metaPackager();
+ return if !$metaPackager;
+
+ return $metaPackager->removePackages($packages);
+}
+
+=back
+
+=head2 Driver Interface
+
+The following methods are invoked by the slxos-plugin script in order to
+install/remove a plugin into/from a vendor-OS:
+
+=over
+
+=item checkStage3AttrValues()
+
+Checks if the stage3 values given in B<$stage3Attrs> are allowed and make sense.
+
+This method gets also invoked whenever changes by slxconfig were made (passing
+in only the stage3 attributes the user tried to change) and by the config
+demuxer (passing in all stage3 attributes for the system currently being
+demuxed).
+
+If all values are ok, this method returns 1 - if not, it extends the given
+problems array-ref with the problems that were found (and returns undef).
+
+This method chroots into the vendor-OS and then asks the plugin itself to check
+the attributes.
+
+=cut
+
+sub checkStage3AttrValues
+{
+ my $self = shift;
+ my $stage3Attrs = shift;
+ my $problemsOut = shift;
+
+ # we have to pass any problems back to this process (remember:
+ # installation takes place in a forked process in order to do a chroot).
+ # We simply serialize the problems into a temp file and deserialize
+ # it in the calling process.
+ my $serializedProblemsFile
+ = "$self->{'plugin-temp-path'}/serialized-problems";
+ my $chrootedSerializedProblemsFile
+ = "$self->{'chrooted-plugin-temp-path'}/serialized-problems";
+
+ mkpath([ $self->{'plugin-repo-path'}, $self->{'plugin-temp-path'} ]);
+
+ # HACK: do a dummy serialization here in order to get Storable
+ # completely loaded (otherwise it will complain in the chroot about
+ # missing modules).
+ store [], $serializedProblemsFile;
+
+ $self->_callChrootedFunctionForPlugin(
+ sub {
+ # let plugin check by itself
+ my $problems = $self->{plugin}->checkStage3AttrValues(
+ $stage3Attrs, $self->{'vendorOS-attrs'}
+ );
+
+ # serialize list of problems (executed inside chroot)
+ store($problems, $chrootedSerializedProblemsFile) if $problems;
+ }
+ );
+
+ # now retrieve (deserialize) the found problems and pass them on
+ my $problems = retrieve $serializedProblemsFile;
+ rmtree([ $self->{'plugin-temp-path'} ]);
+ if ($problems && ref($problems) eq 'ARRAY' && @$problems) {
+ push @$problemsOut, @$problems;
+ return;
+ }
+
+ return 1;
+}
+
+=back
+
+=cut
+
+sub _loadPlugin
+{
+ my $self = shift;
+
+ my $pluginModule = "OpenSLX::OSPlugin::$self->{'plugin-name'}";
+ my $plugin = instantiateClass(
+ $pluginModule, {
+ acceptMissing => 1,
+ pathToClass => $self->{'plugin-path'},
+ }
+ );
+ return if !$plugin;
+
+ # if there's a distro folder, instantiate the most appropriate distro class
+ my $distro;
+ if ($self->{'vendor-os-name'} ne '<<<default>>>'
+ && -d "$self->{'plugin-path'}/OpenSLX/Distro") {
+ my $pluginBasePath = "$openslxConfig{'base-path'}/lib/plugins";
+ my $distroScope = $plugin->{name} . '::OpenSLX::Distro';
+ $distro = loadDistroModule({
+ distroName => $self->distroName(),
+ distroScope => $distroScope,
+ pathToClass => $pluginBasePath,
+ });
+ if (!$distro) {
+ die _tr(
+ 'unable to load any distro module for vendor-OS %s in plugin %s',
+ $self->{'vendor-os-name'}, $plugin->{name}
+ );
+ }
+ $distro->initialize($self);
+ }
+
+ $plugin->initialize($self, $distro);
+
+ return $plugin;
+}
+
+sub _callChrootedFunctionForPlugin
+{
+ my $self = shift;
+ my $function = shift;
+
+ # create os-setup engine here in order to block access to the vendor-OS
+ # via other processes (which could cause problems)
+ my $osSetupEngine = $self->_osSetupEngine();
+
+ my @bindmounts;
+ my @chrootPerlIncludes;
+
+ # setup list of perl modules we want to bind into chroot
+ push @chrootPerlIncludes, "/mnt/opt/openslx/lib";
+
+ push @bindmounts, {
+ 'source' => $Config{privlibexp},
+ 'target' => "$self->{'vendor-os-path'}/mnt/perl/privlibexp"
+ };
+ push @chrootPerlIncludes, "/mnt/perl/privlibexp";
+ push @bindmounts, {
+ 'source' => $Config{archlibexp},
+ 'target' => "$self->{'vendor-os-path'}/mnt/perl/archlibexp"
+ };
+ push @chrootPerlIncludes, "/mnt/perl/archlibexp";
+ push @bindmounts, {
+ 'source' => $Config{vendorlibexp},
+ 'target' => "$self->{'vendor-os-path'}/mnt/perl/vendorlibexp"
+ };
+ push @chrootPerlIncludes, "/mnt/perl/vendorlibexp";
+ push @bindmounts, {
+ 'source' => $Config{vendorarchexp},
+ 'target' => "$self->{'vendor-os-path'}/mnt/perl/vendorarchexp"
+ };
+ push @chrootPerlIncludes, "/mnt/perl/vendorarchexp";
+
+ # prepare openslx bind mounts
+ push @bindmounts, {
+ 'source' => $openslxConfig{'base-path'},
+ 'target' => "$self->{'vendor-os-path'}/mnt/opt/openslx"
+ };
+ push @bindmounts, {
+ 'source' => $openslxConfig{'config-path'},
+ 'target' => "$self->{'vendor-os-path'}/mnt/etc/opt/openslx"
+ };
+
+ # create mountpoints
+ foreach (@bindmounts) {
+ mkpath($_->{'target'});
+ }
+
+ my $pluginSession = OpenSLX::ScopedResource->new({
+ name => 'osplugin::session',
+ acquire => sub {
+ # bind mount perl includes, openslx base and config paths into vendor-OS
+ foreach (@bindmounts) {
+ slxsystem("mount -o bind $_->{'source'} $_->{'target'}") == 0
+ or die _tr(
+ "unable to bind mount '%s' to '%s'! (%s)",
+ $_->{'source'}, $_->{'target'}, $!
+ );
+ }
+
+ # add mounted perl includes to @INC
+ foreach (@chrootPerlIncludes) {
+ unshift @INC, $_;
+ }
+ 1
+ },
+ release => sub {
+ # cleanup @INC again
+ while (my $perlinc = pop(@chrootPerlIncludes)) {
+ if ($INC[0] eq $perlinc) {
+ shift @INC;
+ }
+ }
+
+ # unmount bindmounts
+ foreach (@bindmounts) {
+ slxsystem("umount $_->{'target'}") == 0
+ or die _tr(
+ "unable to umount '%s'! (%s)",
+ $_->{'target'}, $!
+ );
+ }
+ 1
+ },
+ });
+
+ # now let plugin install itself into vendor-OS
+ $osSetupEngine->callChrootedFunctionForVendorOS($function);
+
+ return;
+}
+
+sub _addInstalledPluginToDB
+{
+ my $self = shift;
+
+ my $openslxDB = instantiateClass("OpenSLX::ConfigDB");
+ $openslxDB->connect();
+ my $vendorOSID = $self->_fetchVendorOSID($openslxDB);
+ $openslxDB->addInstalledPlugin(
+ $vendorOSID, $self->{'plugin-name'}, $self->{'plugin-attrs'}
+ );
+ $openslxDB->disconnect();
+
+ return 1;
+}
+
+sub _checkIfRequiredPluginsAreInstalled
+{
+ my $self = shift;
+
+ my $requiredPlugins = $self->{plugin}->getInfo()->{required} || [];
+ return 1 if !@$requiredPlugins;
+
+ my $openslxDB = instantiateClass("OpenSLX::ConfigDB");
+ $openslxDB->connect();
+ my $vendorOSID = $self->_fetchVendorOSID($openslxDB);
+ my @installedPlugins = $openslxDB->fetchInstalledPlugins($vendorOSID);
+ $openslxDB->disconnect();
+
+ my @missingPlugins
+ = grep {
+ my $required = $_;
+ ! grep { $_->{plugin_name} eq $required } @installedPlugins;
+ }
+ @$requiredPlugins;
+
+ if (@missingPlugins) {
+ die _tr(
+ 'the plugin "%s" requires the following plugins to be installed first: "%s"!',
+ $self->{'plugin-name'}, join(',', @missingPlugins)
+ );
+ }
+
+ return 1;
+}
+
+sub _checkIfPluginIsRequiredByOthers
+{
+ my $self = shift;
+
+ my $openslxDB = instantiateClass("OpenSLX::ConfigDB");
+ $openslxDB->connect();
+ my $vendorOSID = $self->_fetchVendorOSID($openslxDB);
+ my @installedPlugins = $openslxDB->fetchInstalledPlugins($vendorOSID);
+ $openslxDB->disconnect();
+
+ my @lockingPlugins
+ = grep {
+ my $installed
+ = OpenSLX::OSPlugin::Roster->getPlugin($_->{plugin_name});
+ my $requiredByInstalled
+ = $installed
+ ? ($installed->getInfo()->{required} || [])
+ : [];
+ grep { $_ eq $self->{'plugin-name'} } @$requiredByInstalled;
+ }
+ @installedPlugins;
+
+ if (@lockingPlugins) {
+ die _tr(
+ 'the plugin "%s" is required by the following plugins: "%s"!',
+ $self->{'plugin-name'},
+ join(',', map { $_->{plugin_name} } @lockingPlugins)
+ );
+ }
+
+ return 1;
+}
+
+sub _fetchInstalledPluginAttrs
+{
+ my $self = shift;
+
+ my $openslxDB = instantiateClass("OpenSLX::ConfigDB");
+ $openslxDB->connect();
+ my $vendorOSID = $self->_fetchVendorOSID($openslxDB);
+ my $installedPlugin = $openslxDB->fetchInstalledPlugins(
+ $vendorOSID, $self->{'plugin-name'}
+ );
+ $openslxDB->disconnect();
+
+ return {} if !$installedPlugin;
+ return $installedPlugin->{attrs};
+}
+
+sub _removeInstalledPluginFromDB
+{
+ my $self = shift;
+
+ my $openslxDB = instantiateClass("OpenSLX::ConfigDB");
+ $openslxDB->connect();
+ my $vendorOSID = $self->_fetchVendorOSID($openslxDB);
+ $openslxDB->removeInstalledPlugin($vendorOSID, $self->{'plugin-name'});
+ $openslxDB->disconnect();
+
+ return 1;
+}
+
+sub _fetchVendorOSID
+{
+ my $self = shift;
+ my $openslxDB = shift;
+
+ if ($self->{'vendor-os-name'} eq '<<<default>>>') {
+ return 0;
+ }
+
+ my $vendorOS = $openslxDB->fetchVendorOSByFilter( {
+ name => $self->{'vendor-os-name'},
+ } );
+ if (!$vendorOS) {
+ die _tr(
+ 'unable to find vendor-OS "%s" in DB!', $self->{'vendor-os-name'}
+ );
+ }
+
+ return $vendorOS->{id};
+}
+
+sub _osSetupEngine
+{
+ my $self = shift;
+
+ if (!$self->{'ossetup-engine'}) {
+ # create ossetup-engine for given vendor-OS:
+ my $osSetupEngine = OpenSLX::OSSetup::Engine->new;
+ $osSetupEngine->initialize($self->{'vendor-os-name'}, 'plugin');
+ $self->{'ossetup-engine'} = $osSetupEngine;
+ }
+
+ return $self->{'ossetup-engine'};
+}
+
+1;
diff --git a/src/os-plugins/OpenSLX/OSPlugin/Roster.pm b/src/os-plugins/OpenSLX/OSPlugin/Roster.pm
new file mode 100644
index 00000000..7bfed044
--- /dev/null
+++ b/src/os-plugins/OpenSLX/OSPlugin/Roster.pm
@@ -0,0 +1,213 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# OSPlugin::Roster.pm
+# - provides information about all available plugins
+# -----------------------------------------------------------------------------
+package OpenSLX::OSPlugin::Roster;
+
+use strict;
+use warnings;
+
+use OpenSLX::Basics;
+use Clone qw(clone);
+
+my %plugins;
+
+=item C<getAvailablePlugins()>
+
+Returns a hash that keys the names of available plugins to their info hash.
+
+=cut
+
+sub getAvailablePlugins
+{
+ my $class = shift;
+
+ $class->_init() if !%plugins;
+
+ my %pluginInfo;
+ foreach my $pluginName (keys %plugins) {
+ $pluginInfo{$pluginName} = $plugins{$pluginName}->getInfo();
+ }
+ return \%pluginInfo;
+}
+
+=item C<getPlugin()>
+
+Returns an instance of the plugin with the given name
+
+=cut
+
+sub getPlugin
+{
+ my $class = shift;
+ my $pluginName = shift;
+
+ $class->_init() if !%plugins;
+
+ my $plugin = $plugins{$pluginName};
+ return if !$plugin;
+
+ return clone($plugin);
+}
+
+=item C<getPluginAttrInfo()>
+
+Returns a hash that contains info about the attributes support by the
+given plugin
+
+=cut
+
+sub getPluginAttrInfo
+{
+ my $class = shift;
+ my $pluginName = shift;
+
+ $class->_init() if !%plugins;
+
+ return if !$plugins{$pluginName};
+
+ return $plugins{$pluginName}->getAttrInfo();
+}
+
+=item C<addAllAttributesToHash()>
+
+Fetches attribute info from all available plugins and adds it to the given
+hash-ref.
+
+If a plugin name has been given, only the attributes of that plugin will be
+added.
+
+=over
+
+=item Return Value
+
+1
+
+=back
+
+=cut
+
+sub addAllAttributesToHash
+{
+ my $class = shift;
+ my $attrInfo = shift;
+ my $pluginName = shift;
+
+ return $class->_addAttributesToHash($attrInfo, $pluginName, sub { 1 } );
+}
+
+=item C<addAllStage1AttributesToHash()>
+
+Fetches attribute info relevant for stage1 (i.e. vendor-OS-attributes)
+from all available plugins and adds it to the given hash-ref.
+
+If a plugin name has been given, only the attributes of that plugin will be
+added.
+
+=over
+
+=item Return Value
+
+1
+
+=back
+
+=cut
+
+sub addAllStage1AttributesToHash
+{
+ my $class = shift;
+ my $attrInfo = shift;
+ my $pluginName = shift;
+
+ return $class->_addAttributesToHash($attrInfo, $pluginName, sub {
+ my $attr = shift;
+ return $attr->{applies_to_vendor_os};
+ } );
+}
+
+=item C<addAllStage3AttributesToHash()>
+
+Fetches attribute info relevant for stage3 (i.e. system- or client-attributes)
+from all available plugins and adds it to the given hash-ref.
+
+If a plugin name has been given, only the attributes of that plugin will be
+added.
+
+=over
+
+=item Return Value
+
+1
+
+=back
+
+=cut
+
+sub addAllStage3AttributesToHash
+{
+ my $class = shift;
+ my $attrInfo = shift;
+ my $pluginName = shift;
+
+ return $class->_addAttributesToHash($attrInfo, $pluginName, sub {
+ my $attr = shift;
+ return $attr->{applies_to_systems} || $attr->{applies_to_clients};
+ } );
+}
+
+sub _addAttributesToHash
+{
+ my $class = shift;
+ my $attrInfo = shift;
+ my $pluginName = shift;
+ my $testFunc = shift;
+
+ $class->_init() if !%plugins;
+
+ foreach my $plugin (values %plugins) {
+ next if $pluginName && $plugin->{name} ne $pluginName;
+ my $pluginAttrInfo = $plugin->getAttrInfo();
+ foreach my $attr (keys %$pluginAttrInfo) {
+ next if !$testFunc->($pluginAttrInfo->{$attr});
+ $attrInfo->{$attr} = clone($pluginAttrInfo->{$attr});
+ }
+ }
+ return 1;
+}
+
+sub _init
+{
+ my $class = shift;
+
+ %plugins = ();
+ my $pluginPath = "$openslxConfig{'base-path'}/lib/plugins";
+ foreach my $modulePath (glob("$pluginPath/*")) {
+ next if $modulePath !~ m{/([^/]+)$};
+ my $pluginName = $1;
+ if (!-e "$modulePath/OpenSLX/OSPlugin/$pluginName.pm") {
+ vlog(
+ 1,
+ "skipped plugin-folder $modulePath as no corresponding perl "
+ . "module could be found."
+ );
+ next;
+ }
+ my $class = "OpenSLX::OSPlugin::$pluginName";
+ vlog(2, "loading plugin $class from path '$modulePath'");
+ my $plugin = instantiateClass($class, { pathToClass => $modulePath });
+ $plugins{$pluginName} = $plugin;
+ }
+ return;
+}
+
+1;
diff --git a/src/os-plugins/plugins/bootsplash/OpenSLX/OSPlugin/bootsplash.pm b/src/os-plugins/plugins/bootsplash/OpenSLX/OSPlugin/bootsplash.pm
new file mode 100644
index 00000000..ef1db778
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/OpenSLX/OSPlugin/bootsplash.pm
@@ -0,0 +1,253 @@
+# Copyright (c) 2007..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# bootsplash.pm
+# - implementation of the 'bootsplash' plugin, which installs splashy
+# into the ramfs, including changeing theme
+# -----------------------------------------------------------------------------
+package OpenSLX::OSPlugin::bootsplash;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSPlugin::Base);
+
+use File::Path;
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+use OpenSLX::DistroUtils;
+
+sub new
+{
+ my $class = shift;
+
+ my $self = {
+ name => 'bootsplash',
+ };
+
+ mkpath("$openslxConfig{'config-path'}/plugins/bootsplash/themes");
+
+ return bless $self, $class;
+}
+
+sub getInfo
+{
+ my $self = shift;
+
+ return {
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Installs Splashy as bootsplash into ramfs and sets a Theme.
+ End-of-Here
+ precedence => 30,
+ };
+}
+
+sub getAttrInfo
+{
+ my $self = shift;
+
+ return {
+ 'bootsplash::active' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should the 'bootsplash'-plugin be executed during boot?
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '1 means active - 0 means inactive',
+ default => '1',
+ },
+
+ 'bootsplash::theme' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ name of the theme to apply to bootsplash (unset for no theme)
+ End-of-Here
+ content_regex => undef,
+ content_descr => undef,
+ default => 'openslx',
+ },
+ };
+}
+
+sub suggestAdditionalKernelParams
+{
+ my $self = shift;
+ my $makeInitRamFSEngine = shift;
+
+ my @suggestedParams;
+
+ # add vga=0x317 unless explicit vga-mode is already set
+ if (!$makeInitRamFSEngine->haveKernelParam(qr{\bvga=})) {
+ push @suggestedParams, 'vga=0x317';
+ }
+
+ # add quiet, if not already set
+ if (!$makeInitRamFSEngine->haveKernelParam('quiet')) {
+ push @suggestedParams, 'quiet';
+ }
+
+ return @suggestedParams;
+}
+
+sub suggestAdditionalKernelModules
+{
+ my $self = shift;
+ my $makeInitRamFSEngine = shift;
+
+ my @suggestedModules;
+
+ # Ubuntu needs vesafb and fbcon (which drags along some others)
+ #if ($makeInitRamFSEngine->{'distro-name'} =~ m{^ubuntu}i) {
+ push @suggestedModules, qw( i810 i830 i915 mga nouveau r128 radeon savage sis tdfx ttm via drm fbcon vesafb );
+ #}
+
+ return @suggestedModules;
+}
+
+sub installationPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ $self->{pluginRepositoryPath} = $info->{'plugin-repo-path'};
+ $self->{openslxBasePath} = $info->{'openslx-base-path'};
+
+ my $splashyPath =
+ "$self->{openslxBasePath}/lib/plugins/bootsplash/files";
+ my $pluginRepoPath = "$self->{pluginRepositoryPath}";
+
+ my $initFile = newInitFile();
+ my $do_stop = unshiftHereDoc(<<' End-of-Here');
+ /opt/openslx/plugin-repo/bootsplash/bin/splashy shutdown
+ sleep 1
+ /opt/openslx/plugin-repo/bootsplash/bin/splashy_update \
+ "progress 100" 2>/dev/null
+ End-of-Here
+
+ # add helper functions to initfile
+ # first parameter name of the function
+ # second parameter content of the function
+ $initFile->addFunction('do_start', " : # do nothing here");
+ $initFile->addFunction('do_stop', $do_stop);
+ $initFile->addFunction('do_restart', " : # do nothing here");
+
+ # place a call of the helper function in the stop block
+ # of the init file
+ # first parameter name of the function
+ # second parameter name of the block
+ $initFile->addFunctionCall('do_start', 'start');
+ $initFile->addFunctionCall('do_stop', 'stop');
+ $initFile->addFunctionCall('do_restart', 'restart');
+
+ my $distro = (split('-',$self->{'os-plugin-engine'}->distroName()))[0];
+
+ # write initfile to filesystem
+ spitFile(
+ "$pluginRepoPath/bootsplash.halt",
+ getInitFileForDistro($initFile, ucfirst($distro))
+ );
+
+ # copy splashy(_update) into plugin-repo folder
+ mkpath("$pluginRepoPath/sbin");
+ mkpath("$pluginRepoPath/lib");
+ mkpath("$pluginRepoPath/usr/lib");
+ slxsystem("cp -a $splashyPath/sbin/* $pluginRepoPath/sbin/;
+ cp -p $splashyPath/lib/* $pluginRepoPath/lib/;
+ cp -p $splashyPath/usr/lib/* $pluginRepoPath/usr/lib/") == 0
+ or die _tr(
+ "unable to copy splashy to $pluginRepoPath"
+ );
+ # create a proper (distro specific) runlevel script for halt
+ #my $initfile = newInitFile();
+ #$initfile->addDaemon("");
+ #
+ #my $runlevelscript = getInitFileForDistro($initfile, "ubuntu");
+
+ return;
+}
+
+sub removalPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ return;
+}
+
+
+sub copyRequiredFilesIntoInitramfs
+{
+ my $self = shift;
+ my $targetPath = shift;
+ my $attrs = shift;
+ my $makeInitRamFSEngine = shift;
+
+ my $bootsplashDir = "$openslxConfig{'base-path'}/lib/plugins/bootsplash";
+ my $bootsplashConfigDir
+ = "$openslxConfig{'config-path'}/plugins/bootsplash";
+ my $bootsplashTheme = $attrs->{'bootsplash::theme'} || '';
+ my $splashyThemeDir = '';
+
+ if ($bootsplashTheme) {
+ my $bootsplashThemeDir = "$bootsplashDir/files/themes/$bootsplashTheme";
+ my $altThemeDir = "$bootsplashConfigDir/themes/$bootsplashTheme";
+ if (-d $bootsplashThemeDir) {
+ $splashyThemeDir = "$bootsplashThemeDir";
+ }
+ elsif (-d $altThemeDir) {
+ $splashyThemeDir = "$altThemeDir";
+ }
+ if (-d $splashyThemeDir) {
+ my $splashyPath = "$bootsplashDir/files";
+ $makeInitRamFSEngine->addCMD(
+ "cp -p $splashyPath/sbin/splashy* $targetPath/sbin/;
+ cp -p $splashyPath/lib/lib* $targetPath/lib/;
+ cp -p $splashyPath/usr/lib/lib* $targetPath/usr/lib/"
+ );
+ $makeInitRamFSEngine->addCMD(
+ "mkdir -p $targetPath/etc/splashy/themes"
+ );
+ $makeInitRamFSEngine->addCMD(
+ "cp -a $splashyThemeDir $targetPath/etc/splashy/themes/"
+ );
+ my $defSplashyTheme = "/etc/splashy/themes/$bootsplashTheme";
+ my $splashyConfig = unshiftHereDoc(<<" End-of-Here");
+ <?xml version="1.0" encoding="UTF-8"?>
+ <!-- Autogenerated by OpenSLX-plugin 'bootsplash' -->
+ <splashy>
+ <!-- themes directory: -->
+ <themes>/etc/splashy/themes</themes>
+ <!-- current theme (relative path) -->
+ <current_theme>$bootsplashTheme</current_theme>
+ <!-- full path to theme, fall back in case of problems -->
+ <default_theme>$defSplashyTheme</default_theme>
+ <pid>/etc/splashy/splashy.pid</pid>
+ <fifo>/dev/.initramfs/splashy.fifo</fifo>
+ </splashy>
+ End-of-Here
+ $makeInitRamFSEngine->addCMD( {
+ file => "$targetPath/etc/splashy/config.xml",
+ content => $splashyConfig,
+ } );
+ }
+ }
+ else {
+ $bootsplashTheme = '<none>';
+ }
+
+ vlog(1, _tr("bootsplash-plugin: bootsplash=%s", $bootsplashTheme));
+
+ return;
+}
+
+1;
diff --git a/src/os-plugins/plugins/bootsplash/XX_bootsplash.sh b/src/os-plugins/plugins/bootsplash/XX_bootsplash.sh
new file mode 100644
index 00000000..372e025d
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/XX_bootsplash.sh
@@ -0,0 +1,56 @@
+# Copyright (c) 2007..2008 - RZ Uni Freiburg
+# Copyright (c) 2008 - 2009 OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# stage3 part of 'bootsplash' plugin - the runlevel script
+#
+# script is included from init via the "." load function - thus it has all
+# variables and functions available
+
+if [ -e /initramfs/plugin-conf/bootsplash.conf ]; then
+ . /initramfs/plugin-conf/bootsplash.conf
+ if [ $bootsplash_active -ne 0 ]; then
+ if [ ${no_bootsplash} -eq 0 ]; then
+ # create a runlevelscript that will stop splashy before the start of KDM
+ d_mkrlscript init splashy.boot ""
+ echo -e "\tLD_LIBRARY_PATH=/opt/openslx/uclib-rootfs/lib/ \
+ /opt/openslx/plugin-repo/bootsplash/sbin/splashy_update \
+ exit 2>/dev/null \
+ \n\ttype killall >/dev/null 2>&1 && killall -9 splashy" \
+ >>/mnt/etc/init.d/splashy.boot
+ d_mkrlscript close splashy.boot ""
+
+ cp /mnt/opt/openslx/plugin-repo/bootsplash/bootsplash.halt \
+ /mnt/etc/init.d/bootsplash.halt
+ chmod 744 /mnt/etc/init.d/bootsplash.halt
+ cp -a /etc/splashy /mnt/etc/
+ rllinker "bootsplash.halt" 1 1
+
+ # fix for ubuntu 1004+
+ for i in init init.inactive; do
+ for j in kdm gdm xdm lxdm; do
+ dmfile=/mnt/etc/${i}/${j}.conf
+ if [ -f $dmfile ]; then
+ sed -e "s,^script.*,script\n\t#0x42#," \
+ -e "s,#0x42#,# shutdown splashy - added by splashy plugin\n\t#0x42#," \
+ -e "s,#0x42#,if [ ! \"x$(ps aux |grep splashy |grep -v grep | wc -l)\" -eq \"x0\" ]; then\n\t#0x42#, " \
+ -e "s,#0x42#, LD_LIBRARY_PATH=/opt/openslx/uclib-rootfs/lib/ \\\\\n\t#0x42#," \
+ -e "s,#0x42#, /opt/openslx/plugin-repo/bootsplash/sbin/splashy_update exit \\\\\n\t#0x42#," \
+ -e "s,#0x42#, 2>/dev/null \n\t#0x42#," \
+ -e "s,#0x42#,fi \n\t#0x42#," \
+ -e "s,#0x42#,#splashy-stop-done#," \
+ -i $dmfile 2>/dev/null &
+ fi
+ done
+ done
+ fi
+ fi
+fi
+
diff --git a/src/os-plugins/plugins/bootsplash/files/lib/libglib-2.0.so.0 b/src/os-plugins/plugins/bootsplash/files/lib/libglib-2.0.so.0
new file mode 100644
index 00000000..e96b345b
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/files/lib/libglib-2.0.so.0
Binary files differ
diff --git a/src/os-plugins/plugins/bootsplash/files/lib/libsplashy.so.1 b/src/os-plugins/plugins/bootsplash/files/lib/libsplashy.so.1
new file mode 100644
index 00000000..817c6d2d
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/files/lib/libsplashy.so.1
Binary files differ
diff --git a/src/os-plugins/plugins/bootsplash/files/lib/libsplashycnf.so.1 b/src/os-plugins/plugins/bootsplash/files/lib/libsplashycnf.so.1
new file mode 100644
index 00000000..71c251d1
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/files/lib/libsplashycnf.so.1
Binary files differ
diff --git a/src/os-plugins/plugins/bootsplash/files/sbin/splashy b/src/os-plugins/plugins/bootsplash/files/sbin/splashy
new file mode 100755
index 00000000..fee26325
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/files/sbin/splashy
Binary files differ
diff --git a/src/os-plugins/plugins/bootsplash/files/sbin/splashy_config b/src/os-plugins/plugins/bootsplash/files/sbin/splashy_config
new file mode 100755
index 00000000..1e048366
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/files/sbin/splashy_config
Binary files differ
diff --git a/src/os-plugins/plugins/bootsplash/files/sbin/splashy_update b/src/os-plugins/plugins/bootsplash/files/sbin/splashy_update
new file mode 100755
index 00000000..cb624fde
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/files/sbin/splashy_update
Binary files differ
diff --git a/src/os-plugins/plugins/bootsplash/files/themes/openslx/blank.ttf b/src/os-plugins/plugins/bootsplash/files/themes/openslx/blank.ttf
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/files/themes/openslx/blank.ttf
diff --git a/src/os-plugins/plugins/bootsplash/files/themes/openslx/openslx.png b/src/os-plugins/plugins/bootsplash/files/themes/openslx/openslx.png
new file mode 100644
index 00000000..e7f996c6
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/files/themes/openslx/openslx.png
Binary files differ
diff --git a/src/os-plugins/plugins/bootsplash/files/themes/openslx/theme.xml b/src/os-plugins/plugins/bootsplash/files/themes/openslx/theme.xml
new file mode 100644
index 00000000..48854551
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/files/themes/openslx/theme.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Automatically generated by splashy_config. Do not edit -->
+<splashy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://splashy.alioth.debian.org/schemas/1.1/themes.xsd">
+ <info>
+ <!-- theme name is case sensitive. use directory name -->
+ <name>openslx</name>
+ <version>0.2</version>
+ <description>OpenSLX Splashy Theme</description>
+ <urls>http://openslx.com</urls>
+ <author>mj0@uni-freiburg.de</author>
+ </info>
+ <progressbar>
+ <!-- here are tags to set the bar... x coordinate,
+ y coordinate, width and height are for the progress bar.
+ Remember that x, y, width and height are expressed in percentage -->
+ <dimension>
+ <x>0</x>
+ <y>42</y>
+ <width>100</width>
+ <height>16</height>
+ </dimension>
+ <!-- here you can set the color of the progressbar...
+ set the amount of red, green, blue and alpha channel.
+ Remember that the max value is 255 and the minumun value is 0-->
+ <color>
+ <red>128</red>
+ <green>147</green>
+ <blue>161</blue>
+ <alpha>255</alpha>
+ </color>
+ <!-- whether or not you want a border around the progressbar. default: no -->
+ <border>
+ <enable>no</enable>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ <alpha>0</alpha>
+ </color>
+ </border>
+ <!-- here you can set the color of the progressbar background
+ set the amount of red, green, blue and alpha channel.
+ Remember that the max value is 255 and the minumun value is 0-->
+ <background>
+ <color>
+ <red>240</red>
+ <green>240</green>
+ <blue>240</blue>
+ <alpha>255</alpha>
+ </color>
+ </background>
+ <direction>
+ <boot>forward</boot>
+ <shutdown>backward</shutdown>
+ <resume>forward</resume>
+ <suspend>backward</suspend>
+ </direction>
+ <visibility>
+ <boot>yes</boot>
+ <shutdown>yes</shutdown>
+ <resume>yes</resume>
+ <suspend>yes</suspend>
+ </visibility>
+ </progressbar>
+ <!-- conventional path: /etc/splashy/themes + theme-name -->
+ <background>
+ <boot>openslx.png</boot>
+ <shutdown>openslx.png</shutdown>
+ <resume>openslx.png</resume>
+ <suspend>openslx.png</suspend>
+ <errorimg>openslx.png</errorimg>
+ <!-- resolution of the images. this value affects where
+ the progressbar will be drawn. If VALUE <= 0, then percentages
+ of the screen width and hight will be assumed -->
+ <dimension>
+ <!-- NOTE: x and y are not used by splashy -->
+ <x>0</x>
+ <y>0</y>
+ <width>0</width>
+ <height>0</height>
+ </dimension>
+ </background>
+ <textbox>
+ <!-- whether you want the textbox always
+ shown or no. If no, it will be shown only on error,
+ see autoverboseonerror -->
+ <enable>no</enable>
+ <!-- here are tags to set the text area... x coordinate,
+ y coordinate, width and height are for the text area.
+ Remember that x, y, width and height are expressed in percentage
+ or pixel units -->
+ <dimension>
+ <x>1</x>
+ <y>61</y>
+ <width>98</width>
+ <height>38</height>
+ </dimension>
+ <!-- here you can set the color of the text area...
+ set the amount of red, green, blue and alpha channel.
+ Remember that the max value is 255 and the minumun value is 0-->
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ <alpha>0</alpha>
+ </color>
+ <!-- whether or not you want a border around the progressbar. default: no -->
+ <border>
+ <enable>no</enable>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ <alpha>0</alpha>
+ </color>
+ </border>
+ <text>
+ <!-- font file to use, path relative to theme -->
+ <font>
+ <file>blank.ttf</file>
+ <height>2</height>
+ </font>
+ <!-- here you can set the color of the text/font...
+ set the amount of red, green, blue and alpha channel.
+ Remember that the max value is 255 and the minumun value is 0-->
+ <color>
+ <red>62</red>
+ <green>93</green>
+ <blue>114</blue>
+ <alpha>0</alpha>
+ </color>
+ </text>
+ </textbox>
+ <autoverboseonerror>no</autoverboseonerror>
+ <fadein>no</fadein>
+ <fadeout>no</fadeout>
+</splashy>
diff --git a/src/os-plugins/plugins/bootsplash/files/usr/lib/libdirect-1.2.so.9 b/src/os-plugins/plugins/bootsplash/files/usr/lib/libdirect-1.2.so.9
new file mode 100644
index 00000000..fbe2d611
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/files/usr/lib/libdirect-1.2.so.9
Binary files differ
diff --git a/src/os-plugins/plugins/bootsplash/files/usr/lib/libdirectfb-1.2.so.9 b/src/os-plugins/plugins/bootsplash/files/usr/lib/libdirectfb-1.2.so.9
new file mode 100644
index 00000000..76b77716
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/files/usr/lib/libdirectfb-1.2.so.9
Binary files differ
diff --git a/src/os-plugins/plugins/bootsplash/files/usr/lib/libmagic.so.1 b/src/os-plugins/plugins/bootsplash/files/usr/lib/libmagic.so.1
new file mode 100644
index 00000000..513b3508
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/files/usr/lib/libmagic.so.1
Binary files differ
diff --git a/src/os-plugins/plugins/bootsplash/init-hooks/05-have-kernelvars/bootsplash.sh b/src/os-plugins/plugins/bootsplash/init-hooks/05-have-kernelvars/bootsplash.sh
new file mode 100644
index 00000000..a54fde96
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/init-hooks/05-have-kernelvars/bootsplash.sh
@@ -0,0 +1,18 @@
+# splashy depends on /proc/fb with VESA
+# only activate with kernel option quiet and no debuglevel
+if grep -q ".*" /proc/fb > /dev/null 2>&1 \
+ && grep -qie " quiet " -qie "^quiet " -qie " quiet$" /proc/cmdline \
+ > /dev/null 2>&1 \
+ && [ $DEBUGLEVEL -eq 0 ] \
+ && [ -e /bin/splashy ] ; then
+ export no_bootsplash=0
+else
+ export no_bootsplash=1
+fi
+
+if [ ${no_bootsplash} -eq 0 ]; then
+ /bin/splashy boot 2>/dev/null
+ # add splashy.boot runlevel script
+ export D_SPLASHY=splashy.boot
+fi
+
diff --git a/src/os-plugins/plugins/bootsplash/init-hooks/10-nw-if-config/bootsplash.sh b/src/os-plugins/plugins/bootsplash/init-hooks/10-nw-if-config/bootsplash.sh
new file mode 100644
index 00000000..7f3d563e
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/init-hooks/10-nw-if-config/bootsplash.sh
@@ -0,0 +1 @@
+[ ${no_bootsplash} -eq 0 ] && /bin/splashy_update "progress 10" >/dev/null 2>&1
diff --git a/src/os-plugins/plugins/bootsplash/init-hooks/20-nw-bridge-config/bootsplash.sh b/src/os-plugins/plugins/bootsplash/init-hooks/20-nw-bridge-config/bootsplash.sh
new file mode 100644
index 00000000..d8155ff0
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/init-hooks/20-nw-bridge-config/bootsplash.sh
@@ -0,0 +1 @@
+[ ${no_bootsplash} -eq 0 ] && /bin/splashy_update "progress 20" >/dev/null 2>&1
diff --git a/src/os-plugins/plugins/bootsplash/init-hooks/25-have-ip-config/bootsplash.sh b/src/os-plugins/plugins/bootsplash/init-hooks/25-have-ip-config/bootsplash.sh
new file mode 100644
index 00000000..be6ac567
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/init-hooks/25-have-ip-config/bootsplash.sh
@@ -0,0 +1 @@
+[ ${no_bootsplash} -eq 0 ] && /bin/splashy_update "progress 25" >/dev/null 2>&1
diff --git a/src/os-plugins/plugins/bootsplash/init-hooks/35-have-network-root/bootsplash.sh b/src/os-plugins/plugins/bootsplash/init-hooks/35-have-network-root/bootsplash.sh
new file mode 100644
index 00000000..606eb694
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/init-hooks/35-have-network-root/bootsplash.sh
@@ -0,0 +1 @@
+[ ${no_bootsplash} -eq 0 ] && /bin/splashy_update "progress 35" >/dev/null 2>&1
diff --git a/src/os-plugins/plugins/bootsplash/init-hooks/40-started-hw-config/bootsplash.sh b/src/os-plugins/plugins/bootsplash/init-hooks/40-started-hw-config/bootsplash.sh
new file mode 100644
index 00000000..d5fc62ec
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/init-hooks/40-started-hw-config/bootsplash.sh
@@ -0,0 +1 @@
+[ ${no_bootsplash} -eq 0 ] && /bin/splashy_update "progress 40" >/dev/null 2>&1
diff --git a/src/os-plugins/plugins/bootsplash/init-hooks/50-have-layered-fs/bootsplash.sh b/src/os-plugins/plugins/bootsplash/init-hooks/50-have-layered-fs/bootsplash.sh
new file mode 100644
index 00000000..4b7e9c78
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/init-hooks/50-have-layered-fs/bootsplash.sh
@@ -0,0 +1 @@
+[ ${no_bootsplash} -eq 0 ] && /bin/splashy_update "progress 50" >/dev/null 2>&1
diff --git a/src/os-plugins/plugins/bootsplash/init-hooks/60-have-servconfig/bootsplash.sh b/src/os-plugins/plugins/bootsplash/init-hooks/60-have-servconfig/bootsplash.sh
new file mode 100644
index 00000000..9c3bd20f
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/init-hooks/60-have-servconfig/bootsplash.sh
@@ -0,0 +1 @@
+[ ${no_bootsplash} -eq 0 ] && /bin/splashy_update "progress 60" >/dev/null 2>&1
diff --git a/src/os-plugins/plugins/bootsplash/init-hooks/70-before-plugins/bootsplash.sh b/src/os-plugins/plugins/bootsplash/init-hooks/70-before-plugins/bootsplash.sh
new file mode 100644
index 00000000..fcd0c410
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/init-hooks/70-before-plugins/bootsplash.sh
@@ -0,0 +1 @@
+[ ${no_bootsplash} -eq 0 ] && /bin/splashy_update "progress 70" >/dev/null 2>&1
diff --git a/src/os-plugins/plugins/bootsplash/init-hooks/80-after-plugins/bootsplash.sh b/src/os-plugins/plugins/bootsplash/init-hooks/80-after-plugins/bootsplash.sh
new file mode 100644
index 00000000..0abfa5b2
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/init-hooks/80-after-plugins/bootsplash.sh
@@ -0,0 +1 @@
+[ ${no_bootsplash} -eq 0 ] && /bin/splashy_update "progress 80" >/dev/null 2>&1
diff --git a/src/os-plugins/plugins/bootsplash/init-hooks/85-have-initial-boot/bootsplash.sh b/src/os-plugins/plugins/bootsplash/init-hooks/85-have-initial-boot/bootsplash.sh
new file mode 100644
index 00000000..8738e454
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/init-hooks/85-have-initial-boot/bootsplash.sh
@@ -0,0 +1 @@
+[ ${no_bootsplash} -eq 0 ] && /bin/splashy_update "progress 85" >/dev/null 2>&1
diff --git a/src/os-plugins/plugins/bootsplash/init-hooks/90-postinit-done/bootsplash.sh b/src/os-plugins/plugins/bootsplash/init-hooks/90-postinit-done/bootsplash.sh
new file mode 100644
index 00000000..2546d298
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/init-hooks/90-postinit-done/bootsplash.sh
@@ -0,0 +1 @@
+[ ${no_bootsplash} -eq 0 ] && /bin/splashy_update "progress 90" >/dev/null 2>&1
diff --git a/src/os-plugins/plugins/bootsplash/init-hooks/95-cleanup/bootsplash.sh b/src/os-plugins/plugins/bootsplash/init-hooks/95-cleanup/bootsplash.sh
new file mode 100644
index 00000000..5ff86715
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/init-hooks/95-cleanup/bootsplash.sh
@@ -0,0 +1 @@
+[ ${no_bootsplash} -eq 0 ] && /bin/splashy_update "progress 95" >/dev/null 2>&1
diff --git a/src/os-plugins/plugins/bootsplash/init-hooks/99-handing-over/bootsplash.sh b/src/os-plugins/plugins/bootsplash/init-hooks/99-handing-over/bootsplash.sh
new file mode 100644
index 00000000..93673915
--- /dev/null
+++ b/src/os-plugins/plugins/bootsplash/init-hooks/99-handing-over/bootsplash.sh
@@ -0,0 +1 @@
+[ ${no_bootsplash} -eq 0 ] && /bin/splashy_update "progress 100" >/dev/null 2>&1
diff --git a/src/os-plugins/plugins/desktop/OpenSLX/Distro/Base.pm b/src/os-plugins/plugins/desktop/OpenSLX/Distro/Base.pm
new file mode 100644
index 00000000..316448bb
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/OpenSLX/Distro/Base.pm
@@ -0,0 +1,432 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# desktop/OpenSLX/Distro/Base.pm
+# - provides base implementation of the Distro API for the desktop plugin.
+# -----------------------------------------------------------------------------
+package desktop::OpenSLX::Distro::Base;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+use File::Basename;
+use Scalar::Util qw( weaken );
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {};
+ return bless $self, $class;
+}
+
+sub initialize
+{
+ my $self = shift;
+ $self->{engine} = shift;
+ weaken($self->{'engine'});
+ # avoid circular reference between distro and its engine
+
+ return 1;
+}
+
+sub getDefaultDesktopManager
+{
+ my $self = shift;
+
+ # the default implementation prefers KDM over GDM over XDM
+ return $self->isKDMInstalled() ? 'kdm'
+ : $self->isGDMInstalled() ? 'gdm'
+ : $self->isXDMInstalled() ? 'xdm' : undef;
+}
+
+sub getDefaultDesktopKind
+{
+ my $self = shift;
+
+ # the default implementation prefers GNOME over KDE over XFCE
+ return $self->isGNOMEInstalled() ? 'gnome'
+ : $self->isKDEInstalled() ? 'kde'
+ : $self->isXFCEInstalled() ? 'xfce' : undef;
+}
+
+sub isGNOMEInstalled
+{
+ my $self = shift;
+
+ return isInPath('gnome-session');
+}
+
+sub installGNOME
+{
+ my $self = shift;
+
+ $self->{engine}->installPackages(
+ $self->{engine}->getInstallablePackagesForSelection('gnome')
+ );
+
+ return 1;
+}
+
+sub isGDMInstalled
+{
+ my $self = shift;
+
+ return isInPath('gdm');
+}
+
+sub installGDM
+{
+ my $self = shift;
+
+ $self->{engine}->installPackages('gdm');
+
+ return 1;
+}
+
+sub GDMPathInfo
+{
+ my $self = shift;
+
+ my $pathInfo = {
+ config => '/etc/gdm/gdm.conf',
+ paths => [
+ '/var/lib/gdm',
+ '/var/log/gdm',
+ ],
+ };
+
+ return $pathInfo;
+}
+
+sub setupGDMScript
+{
+ my $self = shift;
+ my $repoPath = shift;
+
+ my $pathInfo = $self->GDMPathInfo();
+ my $configFile = $pathInfo->{config};
+
+ my $paths
+ = join(
+ ' ',
+ map { '/mnt' . $_ } ( dirname($configFile), @{$pathInfo->{paths}} )
+ );
+ my $script = unshiftHereDoc(<<" End-of-Here");
+ # written by OpenSLX-plugin 'desktop'
+
+ for i in $paths; do
+ testmkd \$i
+ done
+
+ cp /mnt$repoPath/gdm/\$desktop_mode/gdm.conf /mnt$configFile
+
+ # activate theme only if the corresponding xml file is found
+ # (otherwise fall back to default theme of vendor-OS)
+ if [ -n "\$desktop_theme" ]; then
+ thdir=/opt/openslx/plugin-repo/desktop/themes/gdm
+ theme=\$desktop_theme
+ if [ -e /mnt\$thdir/\$theme/*.xml ]; then
+ sed -i "s,\\[greeter\\],[greeter]\\nGraphicalThemedColor=," \\
+ /mnt$configFile
+ sed -i "s,\\[greeter\\],[greeter]\\nGraphicalThemeDir=\$thdir," \\
+ /mnt$configFile
+ sed -i "s,\\[greeter\\],[greeter]\\nGraphicalTheme=\$theme," \\
+ /mnt$configFile
+ fi
+ fi
+ case "\${desktop_allowshutdown}" in
+ none)
+ ;;
+ root)
+ sed "s|AllowShutdown.*|AllowShutdown=true|;\\
+ s|SecureShutdown.*|SecureShutdown=true|" \\
+ -i /mnt$configFile
+ ;;
+ users)
+ sed "s|AllowShutdown.*|AllowShutdown=true|;\\
+ s|SecureShutdown.*|SecureShutdown=false|" \\
+ -i /mnt$configFile
+ ;;
+ esac
+ [ "\${desktop_rootlogin}" -ne 0 ] && \\
+ sed "s|AllowRoot.*|AllowRoot=true|" -i /mnt$configFile
+ End-of-Here
+
+ return $script;
+}
+
+sub GDMConfigHashForWorkstation
+{
+ my $self = shift;
+
+ return {
+ 'chooser' => {
+ },
+ 'daemon' => {
+ AutomaticLoginEnable => 'false',
+ Group => 'gdm',
+ User => 'gdm',
+ DefaultSession => 'default.desktop',
+ },
+ 'debug' => {
+ Enable => 'false',
+ },
+ 'greeter' => {
+ AllowShutdown => 'false',
+ Browser => 'false',
+ MinimalUID => '500',
+ SecureShutdown => 'false',
+ ShowDomain => 'false',
+ DefaultWelcome => 'false',
+ Welcome => 'OpenSLX Workstation (%n)',
+ },
+ 'gui' => {
+ },
+ 'security' => {
+ AllowRoot => 'false',
+ AllowRemoteRoot => 'false',
+ DisallowTCP => 'true',
+ SupportAutomount => 'true',
+ },
+ 'server' => {
+ },
+ 'xdmcp' => {
+ Enable => 'false',
+ },
+ };
+}
+
+sub GDMConfigHashForKiosk
+{
+ my $self = shift;
+
+ my $configHash = $self->GDMConfigHashForWorkstation();
+ $configHash->{daemon}->{AutomaticLoginEnable} = 'true';
+ $configHash->{daemon}->{AutomaticLogin} = 'nobody';
+
+ return $configHash;
+}
+
+sub GDMConfigHashForChooser
+{
+ my $self = shift;
+
+ my $configHash = $self->GDMConfigHashForWorkstation();
+ $configHash->{xdmcp}->{Enable} = 'true';
+
+ return $configHash;
+}
+
+sub isKDEInstalled
+{
+ my $self = shift;
+
+ return isInPath('startkde');
+}
+
+sub installKDE
+{
+ my $self = shift;
+
+ $self->{engine}->installPackages(
+ $self->{engine}->getInstallablePackagesForSelection('kde')
+ );
+
+ return 1;
+}
+
+sub isKDMInstalled
+{
+ my $self = shift;
+
+ return isInPath('kdm');
+}
+
+sub installKDM
+{
+ my $self = shift;
+
+ $self->{engine}->installPackages('kdm');
+
+ return 1;
+}
+
+sub KDMPathInfo
+{
+ my $self = shift;
+
+ my $pathInfo = {
+ config => '/etc/opt/kdm/kdmrc',
+ paths => [
+ '/var/lib/kdm',
+ ],
+ };
+
+ return $pathInfo;
+}
+
+sub setupKDMScript
+{
+ my $self = shift;
+ my $repoPath = shift;
+
+ my $pathInfo = $self->KDMPathInfo();
+ my $configFile = $pathInfo->{config};
+
+ my $paths
+ = join(
+ ' ',
+ map { '/mnt' . $_ } ( dirname($configFile), @{$pathInfo->{paths}} )
+ );
+ my $script = unshiftHereDoc(<<" End-of-Here");
+ #!/bin/sh
+ # written by OpenSLX-plugin 'desktop'
+
+ for i in $paths; do
+ testmkd \$i
+ done
+
+ cp /mnt$repoPath/kdm/\$desktop_mode/kdmrc /mnt$configFile
+
+ # activate theme only if the corresponding xml file is found
+ # (otherwise fall back to default theme of vendor-OS)
+ if [ -n "\$desktop_theme" ]; then
+ theme=\$desktop_theme
+ thdir=/opt/openslx/plugin-repo/desktop/themes/kdm/\$theme
+ if [ -e /mnt\$thdir/*.xml ]; then
+ sed -i "s,\\[X-\\*-Greeter\\],[X-*-Greeter]\\nUseBackground=false," \\
+ /mnt$configFile
+ sed -i "s,\\[X-\\*-Greeter\\],[X-*-Greeter]\\nTheme=\$thdir," \\
+ /mnt$configFile
+ sed -i "s,\\[X-\\*-Greeter\\],[X-*-Greeter]\\nUseTheme=true," \\
+ /mnt$configFile
+ fi
+ fi
+ case "\${desktop_allowshutdown}" in
+ none)
+ sed "s|AllowShutdown.*|AllowShutdown=None|" \\
+ -i /mnt$configFile
+ ;;
+ root)
+ sed "s|AllowShutdown.*|AllowShutdown=Root|" \\
+ -i /mnt$configFile
+ ;;
+ users)
+ sed "s|AllowShutdown.*|AllowShutdown=All|" \\
+ -i /mnt$configFile
+ ;;
+ esac
+ [ "\${desktop_rootlogin}" -ne 0 ] && \\
+ sed "s|AllowRootLogin.*|AllowRootLogin=true|" -i /mnt$configFile
+ End-of-Here
+
+ return $script;
+}
+
+sub KDMConfigHashForWorkstation
+{
+ my $self = shift;
+
+ return {
+# 'General' => {
+# StaticServers => ':0',
+# ReserveServers => ':1,:2,:3',
+# ServerVTs => '-7',
+# ConsoleTTYs => 'tty1,tty2,tty3,tty4,tty5,tty6',
+# },
+ 'X-:0-Core' => {
+ AutoLoginEnable => 'false',
+ AllowRootLogin => 'false',
+ AllowShutdown => 'All',
+ },
+ 'X-*-Greeter' => {
+ GreetString => 'OpenSLX Workstation (%h)',
+ SelectedUsers => '',
+ UserList => 'false',
+ },
+ 'X-:*-Greeter' => {
+ AllowClose => 'false',
+ UseAdminSession => 'true',
+ },
+ 'X-:0-Greeter' => {
+ LogSource => '/dev/xconsole',
+ UseAdminSession => 'false',
+ PreselectUser => 'None',
+ },
+ 'xdmcp' => {
+ Enable => 'false',
+ },
+ };
+}
+
+sub KDMConfigHashForKiosk
+{
+ my $self = shift;
+
+ my $configHash = $self->KDMConfigHashForWorkstation();
+ $configHash->{'X-:0-Core'}->{AutoLoginEnable} = 'true';
+ $configHash->{'X-:0-Core'}->{AutoLoginUser} = 'nobody';
+
+ return $configHash;
+}
+
+sub KDMConfigHashForChooser
+{
+ my $self = shift;
+
+ my $configHash = $self->KDMConfigHashForWorkstation();
+ $configHash->{xdmcp}->{Enable} = 'true';
+
+ return $configHash;
+}
+
+sub isXFCEInstalled
+{
+ my $self = shift;
+
+ return isInPath('startxfce4');
+}
+
+sub installXFCE
+{
+ my $self = shift;
+
+ $self->{engine}->installPackages(
+ $self->{engine}->getInstallablePackagesForSelection('xfce')
+ );
+
+ return 1;
+}
+
+sub isXDMInstalled
+{
+ my $self = shift;
+
+ return isInPath('xdm');
+}
+
+sub installXDM
+{
+ my $self = shift;
+
+ $self->{engine}->installPackages('xdm');
+
+ return 1;
+}
+
+1;
diff --git a/src/os-plugins/plugins/desktop/OpenSLX/Distro/Debian.pm b/src/os-plugins/plugins/desktop/OpenSLX/Distro/Debian.pm
new file mode 100644
index 00000000..c212b3ef
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/OpenSLX/Distro/Debian.pm
@@ -0,0 +1,63 @@
+# Copyright (c) 2006..2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# desktop/OpenSLX/Distro/Debian.pm
+# - provides Debian-specific overrides of the Distro API for the desktop
+# plugin.
+# -----------------------------------------------------------------------------
+package desktop::OpenSLX::Distro::Debian;
+
+use strict;
+use warnings;
+
+use base qw(desktop::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub setupGDMScript
+{
+ my $self = shift;
+ my $repoPath = shift;
+
+ my $script = $self->SUPER::setupGDMScript($repoPath);
+
+ $script .= unshiftHereDoc(<<' End-of-Here');
+ rllinker gdm 1 1
+ echo '/usr/bin/gdm' > /mnt/etc/X11/default-display-manager
+ # gdm does not like AUFS/UnionFS on its var directory
+ rm -rf /mnt/var/lib/gdm
+ mkdir -m 1770 /mnt/var/lib/gdm
+ chown root:gdm /mnt/var/lib/gdm
+ End-of-Here
+
+ return $script;
+}
+
+sub setupKDMScript
+{
+ my $self = shift;
+ my $repoPath = shift;
+
+ my $script = $self->SUPER::setupKDMScript($repoPath);
+
+ $script .= unshiftHereDoc(<<' End-of-Here');
+ rllinker kdm 1 1
+ echo '/usr/bin/kdm' > /mnt/etc/X11/default-display-manager
+ End-of-Here
+
+ return $script;
+}
+
+1;
diff --git a/src/os-plugins/plugins/desktop/OpenSLX/Distro/Fedora.pm b/src/os-plugins/plugins/desktop/OpenSLX/Distro/Fedora.pm
new file mode 100644
index 00000000..f9428aab
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/OpenSLX/Distro/Fedora.pm
@@ -0,0 +1,30 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# desktop/OpenSLX/Distro/Fedora.pm
+# - provides Fedora-specific overrides of the Distro API for the desktop
+# plugin.
+# -----------------------------------------------------------------------------
+package desktop::OpenSLX::Distro::Fedora;
+
+use strict;
+use warnings;
+
+use base qw(desktop::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+
+################################################################################
+### interface methods
+################################################################################
+
+# TODO: implement!
+
+1; \ No newline at end of file
diff --git a/src/os-plugins/plugins/desktop/OpenSLX/Distro/Gentoo.pm b/src/os-plugins/plugins/desktop/OpenSLX/Distro/Gentoo.pm
new file mode 100644
index 00000000..129f4d08
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/OpenSLX/Distro/Gentoo.pm
@@ -0,0 +1,30 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# desktop/OpenSLX/Distro/Gentoo.pm
+# - provides Gentoo-specific overrides of the Distro API for the desktop
+# plugin.
+# -----------------------------------------------------------------------------
+package desktop::OpenSLX::Distro::Gentoo;
+
+use strict;
+use warnings;
+
+use base qw(desktop::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+
+################################################################################
+### interface methods
+################################################################################
+
+# TODO: implement!
+
+1;
diff --git a/src/os-plugins/plugins/desktop/OpenSLX/Distro/Scilin.pm b/src/os-plugins/plugins/desktop/OpenSLX/Distro/Scilin.pm
new file mode 100644
index 00000000..1dc0482c
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/OpenSLX/Distro/Scilin.pm
@@ -0,0 +1,132 @@
+# Copyright (c) 2006..2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# desktop/OpenSLX/Distro/Scilin.pm
+# - provides Scilin-specific overrides of the Distro API for the desktop
+# plugin.
+# -----------------------------------------------------------------------------
+package desktop::OpenSLX::Distro::Scilin;
+
+use strict;
+use warnings;
+
+use base qw(desktop::OpenSLX::Distro::Base);
+
+use File::Path;
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub GDMPathInfo
+{
+ my $self = shift;
+
+ my $pathInfo = $self->SUPER::GDMPathInfo();
+
+ # create gdm.conf-custom instead of gdm.conf
+ $pathInfo->{config} = '/etc/gdm/custom.conf';
+
+ return $pathInfo;
+}
+
+sub setupGDMScript
+{
+ my $self = shift;
+ my $repoPath = shift;
+
+ my $script = $self->SUPER::setupGDMScript($repoPath);
+
+ my $configFile = $self->GDMPathInfo->{config};
+
+ # include common stuff (independent of display manager used)
+ $script = _setupCommonDmScript($script);
+
+ $script .= unshiftHereDoc(<<' End-of-Here');
+ echo "DISPLAYMANAGER=GNOME" \
+ >/mnt/etc/sysconfig/desktop
+ # gdm does not like AUFS/UnionFS on its var directory
+ mkdir -m 1770 /mnt/var/lib/gdm
+ chown root:gdm /mnt/var/lib/gdm
+ End-of-Here
+
+ return $script;
+}
+
+sub GDMConfigHashForWorkstation
+{
+ my $self = shift;
+
+ my $configHash = $self->SUPER::GDMConfigHashForWorkstation();
+ $configHash->{'daemon'}->{SessionDesktopDir} =
+ '/etc/X11/session/:/usr/share/xsessions/:/usr/share/gdm/BuiltInSessions';
+ $configHash->{'daemon'}->{Greeter} =
+ '/usr/libexec/gdmgreeter';
+
+ return $configHash;
+}
+
+sub setupKDMScript
+{
+ my $self = shift;
+ my $repoPath = shift;
+
+ # SUSE reads /var/adm/kdm/kdmrc.sysconfig, so we link that to
+ # our config file
+ my $pathInfo = $self->KDMPathInfo();
+ my $configFile = $pathInfo->{config};
+ mkpath("/etc/opt/kdm");
+ mkpath("/var/adm/kdm");
+ # maybe backup kdmrc.sysconfig sometimes
+ unlink("/var/adm/kdm/kdmrc.sysconfig");
+ # the config file gets overwritten if this script is present
+ unlink("/opt/kde3/share/apps/kdm/read_sysconfig.sh");
+ symlink("/etc/opt/kdm/kdmrc", "/var/adm/kdm/kdmrc.sysconfig");
+
+ my $script = $self->SUPER::setupKDMScript($repoPath);
+
+ # include common stuff (independent of display manager used)
+ $script = _setupCommonDmScript($script);
+
+ $script .= unshiftHereDoc(<<' End-of-Here');
+ echo "DISPLAYMANAGER=KDE" \
+ >/mnt/etc/sysconfig/desktop
+ End-of-Here
+
+ return $script;
+}
+
+sub _setupCommonDmScript
+{
+ my $script = shift;
+
+ $script .= unshiftHereDoc(<<' End-of-Here');
+ # cleanup after users Xorg session
+ sed 's,^#!.*,,' /mnt/etc/X11/xdm/Xreset \
+ > /mnt/etc/X11/xdm/Xreset.system
+ echo -e '#!/bin/sh\n#\n# modified by desktop plugin in Stage3\n#\n
+ # remove safely any remaining files of the leaving user in /tmp
+ ( su -c "rm -rf /tmp/*" - $USER
+ echo "$USER files removed by $0" >/tmp/files.removed 2>/dev/null ) &
+ . /etc/X11/xdm/Xreset.system' >/mnt/etc/X11/xdm/Xreset
+ chmod a+x /mnt/etc/X11/xdm/Xreset*
+
+ # enable the inittab entry again (incomplete)
+ # sed -e "s,# line deleted.*,x:5:respawn:/etc/X11/prefdm -nodaemon," \
+ # -i /mnt/etc/inittab
+ End-of-Here
+
+ return $script;
+}
+
+1;
diff --git a/src/os-plugins/plugins/desktop/OpenSLX/Distro/Suse.pm b/src/os-plugins/plugins/desktop/OpenSLX/Distro/Suse.pm
new file mode 100644
index 00000000..433ed7e1
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/OpenSLX/Distro/Suse.pm
@@ -0,0 +1,162 @@
+# Copyright (c) 2006..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# desktop/OpenSLX/Distro/Suse.pm
+# - provides SUSE-specific overrides of the Distro API for the desktop
+# plugin.
+# -----------------------------------------------------------------------------
+package desktop::OpenSLX::Distro::Suse;
+
+use strict;
+use warnings;
+
+use base qw(desktop::OpenSLX::Distro::Base);
+
+use File::Path;
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub GDMPathInfo
+{
+ my $self = shift;
+
+ my $pathInfo = $self->SUPER::GDMPathInfo();
+
+ # create gdm.conf-custom instead of gdm.conf
+ $pathInfo->{config} = '/etc/gdm/custom.conf';
+
+ return $pathInfo;
+}
+
+sub setupGDMScript
+{
+ my $self = shift;
+ my $repoPath = shift;
+
+ my $script = $self->SUPER::setupGDMScript($repoPath);
+
+ my $configFile = $self->GDMPathInfo->{config};
+
+ # include common stuff (independent of display manager used)
+ $script = _setupCommonDmScript($script);
+
+ $script .= unshiftHereDoc(<<' End-of-Here');
+ echo -e '# changed by $0 during stage3 setup\nDISPLAYMANAGER="gdm"' \
+ >/mnt/etc/sysconfig/displaymanager
+ sed -i "s/DEFAULT_WM=.*/DEFAULT_WM=\"$desktop_kind\"/" \
+ /mnt/etc/sysconfig/windowmanager
+ #sed "s|XSESSION|/etc/xdm/Xsession|" -i /mnt$configFile
+ # gdm does not like AUFS/UnionFS on its var directory
+ rm -rf /mnt/var/lib/gdm
+ mkdir -m 1770 /mnt/var/lib/gdm
+ chown root:gdm /mnt/var/lib/gdm
+ # no use for this configuration info file
+ rm /mnt/etc/gdm/gdm_sysconfig.* 2>/dev/null
+ End-of-Here
+
+ return $script;
+}
+
+sub GDMConfigHashForWorkstation
+{
+ my $self = shift;
+
+ my $configHash = $self->SUPER::GDMConfigHashForWorkstation();
+ $configHash->{'daemon'}->{SessionDesktopDir} =
+ '/etc/X11/session/:/usr/share/xsessions/';
+ $configHash->{'daemon'}->{DefaultSession} = 'default.desktop';
+ $configHash->{'daemon'}->{Greeter} =
+ '/usr/lib/gdm/gdmgreeter';
+
+ return $configHash;
+}
+
+sub setupKDMScript
+{
+ my $self = shift;
+ my $repoPath = shift;
+
+ # check for kdm version
+ my $kdmVer;
+ my $kdmPath;
+ if (-e "/usr/bin/kdm") {
+ $kdmVer = "4";
+ $kdmPath = "/usr/share/kde4";
+ }
+ else {
+ $kdmVer = "";
+ $kdmPath = "/opt/kde3/share";
+ # change default theme to openslx-legacy if kdm3
+ print " * Please change to openslx-legacy theme when using kdm3\n";
+ }
+
+ # SUSE reads /var/adm/kdm/kdmrc.sysconfig, so we link that to
+ # our config file
+ my $pathInfo = $self->KDMPathInfo();
+ my $configFile = $pathInfo->{config};
+ mkpath("/etc/opt/kdm");
+ mkpath("/var/adm/kdm");
+ # maybe backup kdmrc.sysconfig sometimes
+ unlink("/var/adm/kdm/kdmrc.sysconfig");
+ # the config file gets overwritten if this script is present
+ unlink("$kdmPath/apps/kdm/read_sysconfig.sh");
+ symlink("/etc/opt/kdm/kdmrc", "/var/adm/kdm/kdmrc.sysconfig");
+
+ my $script = $self->SUPER::setupKDMScript($repoPath);
+
+ # include common stuff (independent of display manager used)
+ $script = _setupCommonDmScript($script);
+
+ $script .= "kdmver=$kdmVer\n";
+ $script .= unshiftHereDoc(<<' End-of-Here');
+ sed -i "s/DISPLAYMANAGER=.*/DISPLAYMANAGER=\"kdm$kdmver\"/" \
+ /mnt/etc/sysconfig/displaymanager
+ [ $(grep -q DISPLAYMANAGER /mnt/etc/sysconfig/displaymanager) ] && \
+ echo "DISPLAYMANAGER=\"kdm$kdmver\"" >>/mnt/etc/sysconfig/displaymanager
+ sed -i "s/DEFAULT_WM=.*/DEFAULT_WM=\"$desktop_kind\"/" \
+ /mnt/etc/sysconfig/windowmanager
+ # needed for compatibility X11/session(s)
+ ln -s /etc/X11/session /mnt/etc/X11/sessions
+ End-of-Here
+
+ return $script;
+}
+
+sub _setupCommonDmScript
+{
+ my $script = shift;
+
+ $script .= unshiftHereDoc(<<' End-of-Here');
+ rllinker xdm 1 10
+ # cleanup after users Xorg session
+ sed 's,^#!.*,,' /mnt/etc/X11/xdm/Xreset \
+ > /mnt/etc/X11/xdm/Xreset.system
+ echo -e '#!/bin/sh\n#\n# modified by desktop plugin in Stage3\n#\n
+ # avoid annoying messages on removed sound devices
+ ( su -c "rm ~/.kde4/share/config/phonondevicesrc" - $USER ) &
+
+ # remove safely any remaining files of the leaving user in /tmp
+ ( su -c "rm -rf /tmp/*" - $USER
+ echo "$USER files removed by $0" >/tmp/files.removed 2>/dev/null
+ chmod 0400 /tmp/files.removed ) &
+ . /etc/X11/xdm/Xreset.system' >/mnt/etc/X11/xdm/Xreset
+ chmod a+x /mnt/etc/X11/xdm/Xreset*
+
+ End-of-Here
+
+ return $script;
+}
+
+1;
diff --git a/src/os-plugins/plugins/desktop/OpenSLX/Distro/Suse_10_2.pm b/src/os-plugins/plugins/desktop/OpenSLX/Distro/Suse_10_2.pm
new file mode 100644
index 00000000..ac14b2a5
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/OpenSLX/Distro/Suse_10_2.pm
@@ -0,0 +1,54 @@
+# Copyright (c) 2006..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# desktop/OpenSLX/Distro/Suse_10_2.pm
+# - provides SUSE-10.2-specific overrides of the Distro API for the desktop
+# plugin.
+# -----------------------------------------------------------------------------
+package desktop::OpenSLX::Distro::Suse_10_2;
+
+use strict;
+use warnings;
+
+use base qw(desktop::OpenSLX::Distro::Suse);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub GDMPathInfo
+{
+ my $self = shift;
+
+ my $pathInfo = $self->SUPER::GDMPathInfo();
+
+ # link gdm.conf-custom instead of gdm.conf
+ $pathInfo->{config} = '/etc/opt/gnome/gdm/custom.conf';
+
+ return $pathInfo;
+}
+
+sub GDMConfigHashForWorkstation
+{
+ my $self = shift;
+
+ my $configHash = $self->SUPER::GDMConfigHashForWorkstation();
+ $configHash->{'daemon'}->{SessionDesktopDir} =
+ '/etc/X11/session/:/usr/share/xsessions/';
+ $configHash->{'daemon'}->{Greeter} =
+ '/opt/gnome/lib/gdm/gdmgreeter';
+
+ return $configHash;
+}
+
+1;
diff --git a/src/os-plugins/plugins/desktop/OpenSLX/Distro/Ubuntu.pm b/src/os-plugins/plugins/desktop/OpenSLX/Distro/Ubuntu.pm
new file mode 100644
index 00000000..d222c102
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/OpenSLX/Distro/Ubuntu.pm
@@ -0,0 +1,169 @@
+# Copyright (c) 2006..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# desktop/OpenSLX/Distro/Ubuntu.pm
+# - provides Ubuntu-specific overrides of the distro API for the desktop
+# plugin.
+# -----------------------------------------------------------------------------
+package desktop::OpenSLX::Distro::Ubuntu;
+
+use strict;
+use warnings;
+
+use base qw(desktop::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub GDMPathInfo
+{
+ my $self = shift;
+
+ my $pathInfo = $self->SUPER::GDMPathInfo();
+
+ # link gdm.conf-custom instead of gdm.conf
+ $pathInfo->{config} = '/etc/gdm/custom.conf';
+
+ return $pathInfo;
+}
+
+sub setupGDMScript
+{
+ my $self = shift;
+ my $repoPath = shift;
+
+ my $script = $self->SUPER::setupGDMScript($repoPath);
+
+ my $configFile = $self->GDMPathInfo->{config};
+
+ $script .= unshiftHereDoc(<<' End-of-Here');
+ # cleanup after users Xorg session
+ sed 's,^#!.*,,' /mnt/etc/gdm/PostSession/Default \
+ >/mnt/etc/gdm/PostSession/Default.system
+ echo -e '#! /bin/sh\n#\n# modified by desktop plugin in Stage3\n#\n
+ # remove safely any remaining files of the leaving user in /tmp
+ ( su -c "rm -rf /tmp/*"
+ echo "$USER files removed by $0" >/tmp/files.removed 2>/dev/null ) &
+ . /etc/gdm/PostSession/Default.system' >/mnt/etc/gdm/PostSession/Default
+ chmod a+x /mnt/etc/gdm/PostSession/Default*
+ # gdm should be started via upstart mechanism
+ mv /mnt/etc/init.inactive/gdm.conf /mnt/etc/init
+ echo '/usr/sbin/gdm' >/mnt/etc/X11/default-display-manager
+ # possible to do this directly?
+ chroot /mnt update-alternatives --set x-window-manager /usr/bin/metacity
+ chroot /mnt update-alternatives --set x-session-manager \
+ /usr/bin/gnome-session
+ # gdm does not like AUFS/UnionFS on its var directory
+ rm -rf /mnt/var/lib/gdm
+ mkdir -m 1770 /mnt/var/lib/gdm
+ chown root:gdm /mnt/var/lib/gdm
+ #sed '/^\\[daemon\\]/ a\\BaseXsession=/etc/gdm/Xsession' \
+ # -i /mnt$configFile
+ End-of-Here
+
+ return $script;
+}
+
+sub KDMPathInfo
+{
+ my $self = shift;
+
+ my $pathInfo = $self->SUPER::KDMPathInfo();
+
+ $pathInfo = {
+ config => "/etc/kde4/kdm/kdmrc",
+ paths => [
+ '/var/lib/kdm',
+ '/var/run/kdm',
+ ],
+ };
+
+ return $pathInfo;
+}
+
+sub GDMConfigHashForWorkstation
+{
+ my $self = shift;
+
+ return {
+ 'chooser' => {
+ Multicast => 'false',
+ },
+ 'daemon' => {
+ AutomaticLoginEnable => 'false',
+ Group => 'gdm',
+ User => 'gdm',
+ DefaultSession => 'default.desktop',
+ },
+ 'security' => {
+ DisallowTCP => 'true',
+ },
+ 'xdmcp' => {
+ Enable => 'false',
+ },
+ };
+}
+
+sub KDMConfigHashForWorkstation
+{
+ my $self = shift;
+
+ my $kdmVer = "4";
+ my $configHash = $self->SUPER::KDMConfigHashForWorkstation();
+ $configHash->{'General'}->{PidFile} = "/var/run/kdm.pid";
+ $configHash->{'General'}->{ServerVTs} = "-7";
+ $configHash->{'X-:0-Core'}->{Setup} = "/etc/kde$kdmVer/kdm/Xsetup";
+ $configHash->{'X-:0-Core'}->{Startup} = "/etc/kde$kdmVer/kdm/Xstartup";
+ $configHash->{'X-:0-Core'}->{Session} = "/etc/kde$kdmVer/kdm/Xsession";
+ $configHash->{'X-:0-Core'}->{Reset} = "/etc/kde$kdmVer/kdm/Xreset";
+ $configHash->{'X-:0-Core'}->{SessionsDirs} =
+ '/etc/X11/session,/usr/share/xsessions,/usr/share/apps/kdm/sessions';
+ $configHash->{'X-:0-Core'}->{ServerAttempts} = "2";
+
+ return $configHash;
+}
+
+sub setupKDMScript
+{
+ my $self = shift;
+ my $repoPath = shift;
+
+ my $kdmVer = "4";
+ my $script = $self->SUPER::setupKDMScript($repoPath);
+
+ $script .= "kdmver=$kdmVer\n";
+ $script .= unshiftHereDoc(<<' End-of-Here');
+
+ # cleanup after users Xorg session
+ sed 's,^#!.*,,' /mnt/etc/kde$kdmver/kdm/Xreset \
+ >/mnt/etc/kde$kdmver/kdm/Xreset.system
+ echo -e '#! /bin/sh\n#\n# modified by desktop plugin in Stage3\n#\n
+ # remove safely any remaining files of the leaving user in /tmp
+ ( su -c "rm -rf /tmp/*" - $USER
+ echo "$USER files removed by $0" >/tmp/files.removed 2>/dev/null
+ chmod 0400 /tmp/files.removed ) &
+ . /etc/kde$kdmver/kdm/Xreset.system' >/mnt/etc/kde$kdmver/kdm/Xreset
+ chmod a+x /mnt/etc/kde$kdmver/kdm/Xreset*
+
+ mv /mnt/etc/init.inactive/kdm.conf /mnt/etc/init
+ echo '/usr/bin/kdm' > /mnt/etc/X11/default-display-manager
+ chroot /mnt update-alternatives --set x-window-manager /usr/bin/kwin
+ chroot /mnt update-alternatives --set x-session-manager \
+ /usr/bin/startkde
+ End-of-Here
+
+ return $script;
+}
+
+1;
diff --git a/src/os-plugins/plugins/desktop/OpenSLX/Distro/Ubuntu_8.pm b/src/os-plugins/plugins/desktop/OpenSLX/Distro/Ubuntu_8.pm
new file mode 100644
index 00000000..6f00f181
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/OpenSLX/Distro/Ubuntu_8.pm
@@ -0,0 +1,161 @@
+# Copyright (c) 2006..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# desktop/OpenSLX/Distro/Ubuntu_8.pm
+# - provides Ubuntu-specific overrides of the distro API for the desktop
+# plugin.
+# -----------------------------------------------------------------------------
+package desktop::OpenSLX::Distro::Ubuntu_8;
+
+use strict;
+use warnings;
+
+use base qw(desktop::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub GDMPathInfo
+{
+ my $self = shift;
+
+ my $pathInfo = $self->SUPER::GDMPathInfo();
+
+ # link gdm.conf-custom instead of gdm.conf
+ $pathInfo->{config} = '/etc/gdm/gdm.conf-custom';
+
+ return $pathInfo;
+}
+
+sub setupGDMScript
+{
+ my $self = shift;
+ my $repoPath = shift;
+
+ my $script = $self->SUPER::setupGDMScript($repoPath);
+
+ my $configFile = $self->GDMPathInfo->{config};
+
+ $script .= unshiftHereDoc(<<' End-of-Here');
+ # cleanup after users Xorg session
+ sed 's,^#!.*,,' /mnt/etc/gdm/PostSession/Default \
+ >/mnt/etc/gdm/PostSession/Default.system
+ echo -e '#! /bin/sh\n#\n# modified by desktop plugin in Stage3\n#\n
+ # remove safely any remaining files of the leaving user in /tmp
+ ( su -c "rm -rf /tmp/*"
+ echo "$USER files removed by $0" >/tmp/files.removed 2>/dev/null ) &
+ . /etc/gdm/PostSession/Default.system' >/mnt/etc/gdm/PostSession/Default
+ chmod a+x /mnt/etc/gdm/PostSession/Default*
+ # gdm should be started after dbus/hal
+ rllinker gdm 5 10
+ echo '/usr/sbin/gdm' >/mnt/etc/X11/default-display-manager
+ chroot /mnt update-alternatives --set x-window-manager /usr/bin/metacity
+ chroot /mnt update-alternatives --set x-session-manager \
+ /usr/bin/gnome-session
+ # gdm does not like AUFS/UnionFS on its var directory
+ rm -rf /mnt/var/lib/gdm
+ mkdir -m 1770 /mnt/var/lib/gdm
+ chown root:gdm /mnt/var/lib/gdm
+ sed '/^\\[daemon\\]/ a\\BaseXsession=/etc/gdm/Xsession' \
+ -i /mnt$configFile
+ End-of-Here
+
+ return $script;
+}
+
+sub KDMPathInfo
+{
+ my $self = shift;
+
+ my $pathInfo = $self->SUPER::KDMPathInfo();
+ my $kdmVer = "3";
+
+ $pathInfo = {
+ config => "/etc/kde$kdmVer/kdm/kdmrc",
+ paths => [
+ '/var/lib/kdm',
+ '/var/run/kdm',
+ ],
+ };
+
+ return $pathInfo;
+}
+
+sub GDMConfigHashForWorkstation
+{
+ my $self = shift;
+
+ my $configHash = $self->SUPER::GDMConfigHashForWorkstation();
+ $configHash->{'daemon'}->{SessionDesktopDir} =
+ '/etc/X11/session/:/usr/share/xsessions/:/usr/share/gdm/BuiltInSessions/';
+
+ return $configHash;
+}
+
+sub KDMConfigHashForWorkstation
+{
+ my $self = shift;
+
+ my $kdmVer = "4";
+ my $configHash = $self->SUPER::KDMConfigHashForWorkstation();
+ $configHash->{'General'}->{PidFile} = "/var/run/kdm.pid";
+ $configHash->{'X-:0-Core'}->{Setup} = "/etc/kde$kdmVer/kdm/Xsetup";
+ $configHash->{'X-:0-Core'}->{Startup} = "/etc/kde$kdmVer/kdm/Xstartup";
+ $configHash->{'X-:0-Core'}->{Session} = "/etc/kde$kdmVer/kdm/Xsession";
+ $configHash->{'X-:0-Core'}->{Reset} = "/etc/kde$kdmVer/kdm/Xreset";
+ $configHash->{'X-:0-Core'}->{SessionsDirs} =
+ '/etc/X11/session,/usr/share/xsessions,/usr/share/apps/kdm/sessions';
+ $configHash->{'X-:0-Core'}->{ServerAttempts} = "2";
+
+ return $configHash;
+}
+
+sub setupKDMScript
+{
+ my $self = shift;
+ my $repoPath = shift;
+
+ my $kdmVer = "4";
+ my $script = $self->SUPER::setupKDMScript($repoPath);
+
+ # change default theme to openslx-legacy if kdm3
+ if ( $kdmVer == "3" ) {
+ print " * Please change to openslx-legacy theme when using kdm3\n";
+ }
+
+ $script .= "kdmver=$kdmVer\n";
+ $script .= unshiftHereDoc(<<' End-of-Here');
+
+ # cleanup after users Xorg session
+ sed 's,^#!.*,,' /mnt/etc/kde$kdmver/kdm/Xreset \
+ >/mnt/etc/kde$kdmver/kdm/Xreset.system
+ echo -e '#! /bin/sh\n#\n# modified by desktop plugin in Stage3\n#\n
+ # remove safely any remaining files of the leaving user in /tmp
+ ( su -c "rm -rf /tmp/*" - $USER
+ echo "$USER files removed by $0" >/tmp/files.removed 2>/dev/null
+ chmod 0400 /tmp/files.removed ) &
+ . /etc/kde$kdmver/kdm/Xreset.system' >/mnt/etc/kde$kdmver/kdm/Xreset
+ chmod a+x /mnt/etc/kde$kdmver/kdm/Xreset*
+
+ rllinker kdm 1 10
+ echo '/usr/bin/kdm' > /mnt/etc/X11/default-display-manager
+ chroot /mnt update-alternatives --set x-window-manager /usr/bin/kwin
+ chroot /mnt update-alternatives --set x-session-manager \
+ /usr/bin/startkde
+ End-of-Here
+
+ return $script;
+}
+
+1;
diff --git a/src/os-plugins/plugins/desktop/OpenSLX/Distro/Ubuntu_9_04.pm b/src/os-plugins/plugins/desktop/OpenSLX/Distro/Ubuntu_9_04.pm
new file mode 100644
index 00000000..1022d6e8
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/OpenSLX/Distro/Ubuntu_9_04.pm
@@ -0,0 +1,161 @@
+# Copyright (c) 2006..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# desktop/OpenSLX/Distro/Ubuntu_9_04.pm
+# - provides Ubuntu-specific overrides of the distro API for the desktop
+# plugin.
+# -----------------------------------------------------------------------------
+package desktop::OpenSLX::Distro::Ubuntu_9_04;
+
+use strict;
+use warnings;
+
+use base qw(desktop::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub GDMPathInfo
+{
+ my $self = shift;
+
+ my $pathInfo = $self->SUPER::GDMPathInfo();
+
+ # link gdm.conf-custom instead of gdm.conf
+ $pathInfo->{config} = '/etc/gdm/gdm.conf-custom';
+
+ return $pathInfo;
+}
+
+sub setupGDMScript
+{
+ my $self = shift;
+ my $repoPath = shift;
+
+ my $script = $self->SUPER::setupGDMScript($repoPath);
+
+ my $configFile = $self->GDMPathInfo->{config};
+
+ $script .= unshiftHereDoc(<<' End-of-Here');
+ # cleanup after users Xorg session
+ sed 's,^#!.*,,' /mnt/etc/gdm/PostSession/Default \
+ >/mnt/etc/gdm/PostSession/Default.system
+ echo -e '#! /bin/sh\n#\n# modified by desktop plugin in Stage3\n#\n
+ # remove safely any remaining files of the leaving user in /tmp
+ ( su -c "rm -rf /tmp/*"
+ echo "$USER files removed by $0" >/tmp/files.removed 2>/dev/null ) &
+ . /etc/gdm/PostSession/Default.system' >/mnt/etc/gdm/PostSession/Default
+ chmod a+x /mnt/etc/gdm/PostSession/Default*
+ # gdm should be started after dbus/hal
+ rllinker gdm 5 10
+ echo '/usr/sbin/gdm' >/mnt/etc/X11/default-display-manager
+ chroot /mnt update-alternatives --set x-window-manager /usr/bin/metacity
+ chroot /mnt update-alternatives --set x-session-manager \
+ /usr/bin/gnome-session
+ # gdm does not like AUFS/UnionFS on its var directory
+ rm -rf /mnt/var/lib/gdm
+ mkdir -m 1770 /mnt/var/lib/gdm
+ chown root:gdm /mnt/var/lib/gdm
+ sed '/^\\[daemon\\]/ a\\BaseXsession=/etc/gdm/Xsession' \
+ -i /mnt$configFile
+ End-of-Here
+
+ return $script;
+}
+
+sub KDMPathInfo
+{
+ my $self = shift;
+
+ my $pathInfo = $self->SUPER::KDMPathInfo();
+ my $kdmVer = "4";
+
+ $pathInfo = {
+ config => "/etc/kde$kdmVer/kdm/kdmrc",
+ paths => [
+ '/var/lib/kdm',
+ '/var/run/kdm',
+ ],
+ };
+
+ return $pathInfo;
+}
+
+sub GDMConfigHashForWorkstation
+{
+ my $self = shift;
+
+ my $configHash = $self->SUPER::GDMConfigHashForWorkstation();
+ $configHash->{'daemon'}->{SessionDesktopDir} =
+ '/etc/X11/session/:/usr/share/xsessions/:/usr/share/gdm/BuiltInSessions/';
+
+ return $configHash;
+}
+
+sub KDMConfigHashForWorkstation
+{
+ my $self = shift;
+
+ my $kdmVer = "4";
+ my $configHash = $self->SUPER::KDMConfigHashForWorkstation();
+ $configHash->{'General'}->{PidFile} = "/var/run/kdm.pid";
+ $configHash->{'X-:0-Core'}->{Setup} = "/etc/kde$kdmVer/kdm/Xsetup";
+ $configHash->{'X-:0-Core'}->{Startup} = "/etc/kde$kdmVer/kdm/Xstartup";
+ $configHash->{'X-:0-Core'}->{Session} = "/etc/kde$kdmVer/kdm/Xsession";
+ $configHash->{'X-:0-Core'}->{Reset} = "/etc/kde$kdmVer/kdm/Xreset";
+ $configHash->{'X-:0-Core'}->{SessionsDirs} =
+ '/etc/X11/session,/usr/share/xsessions,/usr/share/apps/kdm/sessions';
+ $configHash->{'X-:0-Core'}->{ServerAttempts} = "2";
+
+ return $configHash;
+}
+
+sub setupKDMScript
+{
+ my $self = shift;
+ my $repoPath = shift;
+
+ my $kdmVer = "4";
+ my $script = $self->SUPER::setupKDMScript($repoPath);
+
+ # change default theme to openslx-legacy if kdm3
+ if ( $kdmVer == "3" ) {
+ print " * Please change to openslx-legacy theme when using kdm3\n";
+ }
+
+ $script .= "kdmver=$kdmVer\n";
+ $script .= unshiftHereDoc(<<' End-of-Here');
+
+ # cleanup after users Xorg session
+ sed 's,^#!.*,,' /mnt/etc/kde$kdmver/kdm/Xreset \
+ >/mnt/etc/kde$kdmver/kdm/Xreset.system
+ echo -e '#! /bin/sh\n#\n# modified by desktop plugin in Stage3\n#\n
+ # remove safely any remaining files of the leaving user in /tmp
+ ( su -c "rm -rf /tmp/*" - $USER
+ echo "$USER files removed by $0" >/tmp/files.removed 2>/dev/null
+ chmod 0400 /tmp/files.removed ) &
+ . /etc/kde$kdmver/kdm/Xreset.system' >/mnt/etc/kde$kdmver/kdm/Xreset
+ chmod a+x /mnt/etc/kde$kdmver/kdm/Xreset*
+
+ rllinker kdm 1 10
+ echo '/usr/bin/kdm' > /mnt/etc/X11/default-display-manager
+ chroot /mnt update-alternatives --set x-window-manager /usr/bin/kwin
+ chroot /mnt update-alternatives --set x-session-manager \
+ /usr/bin/startkde
+ End-of-Here
+
+ return $script;
+}
+
+1;
diff --git a/src/os-plugins/plugins/desktop/OpenSLX/OSPlugin/desktop.pm b/src/os-plugins/plugins/desktop/OpenSLX/OSPlugin/desktop.pm
new file mode 100644
index 00000000..7d496483
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/OpenSLX/OSPlugin/desktop.pm
@@ -0,0 +1,712 @@
+# Copyright (c) 2008..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# desktop.pm
+# - implementation of the 'desktop' plugin, which installs
+# all needed information for a displaymanager and for the desktop.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSPlugin::desktop;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSPlugin::Base);
+
+use File::Basename;
+use File::Path;
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+sub new
+{
+ my $class = shift;
+
+ my $self = {
+ name => 'desktop',
+ };
+
+ my $localGDMThemesDir
+ = "$openslxConfig{'config-path'}/plugins/desktop/themes/gdm";
+ mkpath($localGDMThemesDir) unless -e $localGDMThemesDir;
+ my $localKDMThemesDir
+ = "$openslxConfig{'config-path'}/plugins/desktop/themes/kdm";
+ mkpath($localKDMThemesDir) unless -e $localKDMThemesDir;
+
+ return bless $self, $class;
+}
+
+sub getInfo
+{
+ my $self = shift;
+
+ return {
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Sets a desktop and creates needed configs, theme can be set as well.
+ End-of-Here
+ precedence => 40,
+ # not really required e.g. for modern autoconfiguring systems like Ubuntu
+ # 10.04
+ # required => [ qw( xserver ) ],
+ };
+}
+
+sub getAttrInfo
+{
+ my $self = shift;
+
+ return {
+ # stage3
+ 'desktop::active' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should the 'desktop'-plugin be executed during boot?
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '1 means active - 0 means inactive',
+ default => '1',
+ },
+ 'desktop::kind' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ which desktop environment shall be used: gnome, kde, or xfce?
+ End-of-Here
+ content_regex => qr{^(gnome|kde|xfce)$},
+ content_descr => '"gnome", "kde" or "xfce"',
+ default => undef,
+ },
+ 'desktop::manager' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ which display manager to start: gdm, kdm or xdm?
+ End-of-Here
+ content_regex => qr{^(gdm|kdm|xdm)$},
+ content_descr => '"gdm", "kdm" or "xdm"',
+ default => undef,
+ },
+ 'desktop::mode' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ which type of operation mode shall be activated:
+ workstattion, kiosk or chooser?
+ End-of-Here
+ content_regex => qr{^(workstation|kiosk|chooser)$},
+ content_descr => '"workstation", "kiosk" or "chooser"',
+ default => 'workstation',
+ },
+ 'desktop::theme' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ name of the theme to apply to the desktop (unset for no theme)
+ End-of-Here
+ content_descr => 'one of the entries in "supported_themes"',
+ default => 'openslx',
+ },
+ 'desktop::allowshutdown' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ allow shutdown of the SLX client via gdm/kdm. "none" disables
+ this functionality, "root" allows only the sysadmin and
+ "users" means free4all.
+ End-of-Here
+ content_regex => qr{^(none|root|users)$},
+ content_descr => 'possible entries "none", "root" or "users"',
+ default => 'users',
+ },
+ 'desktop::rootlogin' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ allow the system administrator to logon to the graphical
+ user interface (1 allow, 0 disallow).
+ End-of-Here
+ content_descr => '1 means allowed - 0 means forbidden',
+ content_regex => qr{^(0|1)$},
+ default => '1',
+ },
+ # kiosk mode just has the option to logon user nobody
+ #'desktop::auto-login' => {
+ # applies_to_systems => 1,
+ # applies_to_clients => 1,
+ # description => unshiftHereDoc(<<' End-of-Here'),
+ # set an arbitrary user which is logged in automatically into
+ # the graphical user interface (none disables, default).
+ # End-of-Here
+ # content_descr => 'none disables - <user> logins in that userid',
+ # default => 'none',
+ #},
+
+ # stage1
+ 'desktop::gdm' => {
+ applies_to_vendor_os => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should gdm be available (installed in vendor-OS)?
+ End-of-Here
+ content_regex => qr{^0|1$},
+ content_descr => '"0", "1" or "-" (for unset)',
+ default => undef,
+ },
+ 'desktop::gnome' => {
+ applies_to_vendor_os => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should gnome be available (installed in vendor-OS)?
+ End-of-Here
+ content_regex => qr{^0|1$},
+ content_descr => '"0", "1" or "-" (for unset)',
+ default => undef,
+ },
+ 'desktop::kde' => {
+ applies_to_vendor_os => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should kde be available (installed in vendor-OS)?
+ End-of-Here
+ content_regex => qr{^0|1$},
+ content_descr => '"0", "1" or "-" (for unset)',
+ default => undef,
+ },
+ 'desktop::kdm' => {
+ applies_to_vendor_os => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should kdm be available (installed in vendor-OS)?
+ End-of-Here
+ content_regex => qr{^0|1$},
+ content_descr => '"0", "1" or "-" (for unset)',
+ default => undef,
+ },
+ 'desktop::supported_themes' => {
+ applies_to_vendor_os => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ name of all themes that shall be installed in vendor-OS (such
+ that they can be selected via 'desktop::theme' in stage 3).
+ End-of-Here
+ content_descr => 'a comma-separated list of theme names',
+ default => undef,
+ },
+ 'desktop::xdm' => {
+ applies_to_vendor_os => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should xdm be available (installed in vendor-OS)?
+ End-of-Here
+ content_regex => qr{^0|1$},
+ content_descr => '"0", "1" or "-" (for unset)',
+ default => undef,
+ },
+ 'desktop::xfce' => {
+ applies_to_vendor_os => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should xfce be available (installed in vendor-OS)?
+ End-of-Here
+ content_regex => qr{^0|1$},
+ content_descr => '"0", "1" or "-" (for unset)',
+ default => undef,
+ },
+ };
+}
+
+sub getDefaultAttrsForVendorOS
+{
+ my $self = shift;
+ my $vendorOSName = shift;
+
+ my $attrs = $self->getAttrInfo();
+
+ if ($vendorOSName =~ m{kde}) {
+ $attrs->{'desktop::manager'}->{default} = 'kdm';
+ $attrs->{'desktop::kind'}->{default} = 'kde';
+ }
+ elsif ($vendorOSName =~ m{gnome}) {
+ $attrs->{'desktop::manager'}->{default} = 'gdm';
+ $attrs->{'desktop::kind'}->{default} = 'gnome';
+ }
+ elsif ($vendorOSName =~ m{xfce}) {
+ $attrs->{'desktop::manager'}->{default} = 'xdm';
+ $attrs->{'desktop::kind'}->{default} = 'xcfe';
+ }
+ else {
+ $attrs->{'desktop::manager'}->{default}
+ = $self->{distro}->getDefaultDesktopManager();
+ $attrs->{'desktop::kind'}->{default}
+ = $self->{distro}->getDefaultDesktopKind();
+ }
+ return $attrs;
+}
+
+sub checkStage3AttrValues
+{
+ my $self = shift;
+ my $stage3Attrs = shift;
+ my $vendorOSAttrs = shift;
+
+ my @problems;
+
+ my $manager = $stage3Attrs->{'desktop::manager'} || '';
+ if ($manager eq 'kdm') {
+ if (!defined $vendorOSAttrs->{'desktop::kdm'}
+ || $vendorOSAttrs->{'desktop::kdm'} == 1) {
+ if (!$self->{distro}->isKDMInstalled()) {
+ push @problems, _tr(
+ "KDM is not installed in vendor-OS, so using it as desktop manager wouldn't work!"
+ );
+ }
+ }
+ elsif ($vendorOSAttrs->{'desktop::kdm'} == 0) {
+ push @problems, _tr(
+ "desktop::kdm is 0, so using KDM as desktop manager is not allowed for this vendor-OS!"
+ );
+ }
+ }
+ elsif ($manager eq 'gdm') {
+ if (!defined $vendorOSAttrs->{'desktop::gdm'}
+ || $vendorOSAttrs->{'desktop::gdm'} == 1) {
+ if (!$self->{distro}->isGDMInstalled()) {
+ push @problems, _tr(
+ "GDM is not installed in vendor-OS, so using it as desktop manager wouldn't work!"
+ );
+ }
+ }
+ elsif ($vendorOSAttrs->{'desktop::gdm'} == 0) {
+ push @problems, _tr(
+ "desktop::gdm is 0, so using GDM as desktop manager is not allowed for this vendor-OS!"
+ );
+ }
+ }
+ elsif ($manager eq 'xdm') {
+ if (!defined $vendorOSAttrs->{'desktop::xdm'}
+ || $vendorOSAttrs->{'desktop::xdm'} == 1) {
+ if (!$self->{distro}->isXDMInstalled()) {
+ push @problems, _tr(
+ "XDM is not installed in vendor-OS, so using it as desktop manager wouldn't work!"
+ );
+ }
+ }
+ elsif ($vendorOSAttrs->{'desktop::xdm'} == 0) {
+ push @problems, _tr(
+ "desktop::xdm is 0, so using XDM as desktop manager is not allowed for this vendor-OS!"
+ );
+ }
+ }
+
+ my $kind = $stage3Attrs->{'desktop::kind'} || '';
+ if ($kind eq 'kde') {
+ if (!defined $vendorOSAttrs->{'desktop::kde'}
+ || $vendorOSAttrs->{'desktop::kde'} == 1) {
+ if (!$self->{distro}->isKDEInstalled()) {
+ push @problems, _tr(
+ "KDE is not installed in vendor-OS, so using it as desktop kind wouldn't work!"
+ );
+ }
+ }
+ elsif ($vendorOSAttrs->{'desktop::kde'} == 0) {
+ push @problems, _tr(
+ "desktop::kde is 0, so using KDE as desktop kind is not allowed for this vendor-OS!"
+ );
+ }
+ }
+ elsif ($kind eq 'gnome') {
+ if (!defined $vendorOSAttrs->{'desktop::gnome'}
+ || $vendorOSAttrs->{'desktop::gnome'} == 1) {
+ if (!$self->{distro}->isGNOMEInstalled()) {
+ push @problems, _tr(
+ "GNOME is not installed in vendor-OS, so using it as desktop kind wouldn't work!"
+ );
+ }
+ }
+ elsif ($vendorOSAttrs->{'desktop::gnome'} == 0) {
+ push @problems, _tr(
+ "desktop::gnome is 0, so using GNOME as desktop kind is not allowed for this vendor-OS!"
+ );
+ }
+ }
+ elsif ($kind eq 'xfce') {
+ if (!defined $vendorOSAttrs->{'desktop::xfce'}
+ || $vendorOSAttrs->{'desktop::xfce'} == 1) {
+ if (!$self->{distro}->isXFCEInstalled()) {
+ push @problems, _tr(
+ "XFCE is not installed in vendor-OS, so using it as desktop kind wouldn't work!"
+ );
+ }
+ }
+ elsif ($vendorOSAttrs->{'desktop::xfce'} == 0) {
+ push @problems, _tr(
+ "desktop::xfce is 0, so using XFCE as desktop kind is not allowed for this vendor-OS!"
+ );
+ }
+ }
+
+ my @supportedThemes
+ = split ',', $vendorOSAttrs->{'desktop::supported_themes'} || '';
+ my $theme = $stage3Attrs->{'desktop::theme'};
+ if (defined $theme && !grep { $_ eq $theme } @supportedThemes) {
+ push @problems, _tr(
+ "desktop::theme '%s' does not refer to a supported theme!\nSupported themes are: %s",
+ $theme, $vendorOSAttrs->{'desktop::supported_themes'} || ''
+ );
+ }
+
+ return if !@problems;
+
+ return \@problems;
+}
+
+sub installationPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ $self->{pluginRepositoryPath} = $info->{'plugin-repo-path'};
+ $self->{pluginTempPath} = $info->{'plugin-temp-path'};
+ $self->{openslxBasePath} = $info->{'openslx-base-path'};
+ $self->{openslxConfigPath} = $info->{'openslx-config-path'};
+ $self->{attrs} = $info->{'plugin-attrs'};
+
+ # We are going to change some of the stage1 attributes during installation
+ # (basically we are filling the ones that are not defined). Since the result
+ # of these changes might change between invocations, we do not want to store
+ # the resulting values, but we want to store the original (undef).
+ # In order to do so, we copy all stage1 attributes directly into the
+ # object hash and change them there.
+ $self->{gdm} = $self->{attrs}->{'desktop::gdm'};
+ $self->{kdm} = $self->{attrs}->{'desktop::kdm'};
+ $self->{xdm} = $self->{attrs}->{'desktop::xdm'};
+ $self->{gnome} = $self->{attrs}->{'desktop::gnome'};
+ $self->{kde} = $self->{attrs}->{'desktop::kde'};
+ $self->{xcfe} = $self->{attrs}->{'desktop::xfce'};
+ $self->{supported_themes} = $self->{attrs}->{'desktop::supported_themes'};
+
+ $self->_installRequiredPackages();
+ $self->_fillUnsetStage1Attrs();
+ $self->_ensureSensibleStage3Attrs();
+
+ # start to actually do something - according to current stage1 attributes
+ if ($self->{gdm}) {
+ $self->_setupGDM();
+ }
+ if ($self->{kdm}) {
+ $self->_setupKDM();
+ }
+ if ($self->{xdm}) {
+ $self->_setupXDM();
+ }
+ $self->_setupSupportedThemes();
+
+ return;
+}
+
+sub removalPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ return;
+}
+
+sub copyRequiredFilesIntoInitramfs
+{
+ my $self = shift;
+ my $targetPath = shift;
+ my $attrs = shift;
+ my $makeInitRamFSEngine = shift;
+
+ my $desktopTheme = $attrs->{'desktop::theme'} || '<none>';
+
+ vlog(1, _tr("desktop-plugin: desktop=%s", $desktopTheme));
+
+ return;
+}
+
+sub _installRequiredPackages
+{
+ my $self = shift;
+
+ my $engine = $self->{'os-plugin-engine'};
+
+ if ($self->{'gnome'} && !$self->{distro}->isGNOMEInstalled()) {
+ $self->{distro}->installGNOME();
+ }
+ if ($self->{'gdm'} && !$self->{distro}->isGDMInstalled()) {
+ $self->{distro}->installGDM();
+ }
+ if ($self->{'kde'} && !$self->{distro}->isKDEInstalled()) {
+ $self->{distro}->installKDE();
+ }
+ if ($self->{'kdm'} && !$self->{distro}->isKDMInstalled()) {
+ $self->{distro}->installKDM();
+ }
+ if ($self->{'xfce'} && !$self->{distro}->isXFCEInstalled()) {
+ $self->{distro}->installXFCE();
+ }
+ if ($self->{'xdm'} && !$self->{distro}->isXDMInstalled()) {
+ $self->{distro}->installXDM();
+ }
+
+ return 1;
+}
+
+sub _fillUnsetStage1Attrs
+{
+ my $self = shift;
+
+ if (!defined $self->{'gnome'}) {
+ $self->{'gnome'} = $self->{distro}->isGNOMEInstalled();
+ }
+ if (!defined $self->{'gdm'}) {
+ $self->{'gdm'} = $self->{distro}->isGDMInstalled();
+ }
+ if (!defined $self->{'kde'}) {
+ $self->{'kde'} = $self->{distro}->isKDEInstalled();
+ }
+ if (!defined $self->{'kdm'}) {
+ $self->{'kdm'} = $self->{distro}->isKDMInstalled();
+ }
+ if (!defined $self->{'xfce'}) {
+ $self->{'xfce'} = $self->{distro}->isXFCEInstalled();
+ }
+ if (!defined $self->{'xdm'}) {
+ $self->{'xdm'} = $self->{distro}->isXDMInstalled();
+ }
+ if (!defined $self->{'supported_themes'}) {
+ $self->{attrs}->{'desktop::supported_themes'}
+ = $self->{'supported_themes'}
+ = join ",", $self->_getAvailableThemes();
+ }
+
+ return 1;
+}
+
+sub _ensureSensibleStage3Attrs
+{
+ my $self = shift;
+
+ # check if current desktop kind is enabled at all and select another
+ # one, if it isn't
+ my $kind = $self->{attrs}->{'desktop::kind'} || '';
+ if (!$self->{$kind}) {
+ my @desktops = map { $self->{$_} ? $_ : () } qw( gnome kde xfce );
+ if (!@desktops) {
+ die _tr(
+ "no desktop kind is possible, plugin 'desktop' wouldn't work!"
+ );
+ }
+ vlog(0, _tr("selecting %s as desktop kind\n", $desktops[0]));
+ $self->{attrs}->{'desktop::kind'} = $desktops[0];
+ }
+
+ # check if current desktop manager is enabled at all and select another
+ # one, if it isn't
+ my $manager = $self->{attrs}->{'desktop::manager'} || '';
+ if (!$self->{$manager}) {
+ my @managers = map { $self->{$_} ? $_ : () } qw( kdm gdm xdm );
+ if (!@managers) {
+ die _tr(
+ "no desktop manager is possible, plugin 'desktop' wouldn't work!"
+ );
+ }
+ vlog(0, _tr("selecting %s as desktop manager\n", $managers[0]));
+ $self->{attrs}->{'desktop::manager'} = $managers[0];
+ }
+
+ # check if current theme is supported at all and select another one, if it
+ # isn't
+ my $theme = $self->{attrs}->{'desktop::theme'} || '';
+ my @supportedThemes = split ",", $self->{'supported_themes'} || '';
+ if (!grep { $_ eq $theme } @supportedThemes) {
+ if (!@supportedThemes) {
+ vlog( 0, _tr("no themes are supported, using no theme!"));
+ $self->{attrs}->{'desktop::theme'} = undef;
+ }
+ else {
+ vlog(0, _tr("selecting %s as theme\n", $supportedThemes[0]));
+ $self->{attrs}->{'desktop::theme'} = $supportedThemes[0];
+ }
+ }
+
+ return 1;
+}
+
+sub _setupGDM
+{
+ my $self = shift;
+
+ my $repoPath = $self->{pluginRepositoryPath};
+ mkpath([
+ "$repoPath/gdm/workstation",
+ "$repoPath/gdm/kiosk",
+ "$repoPath/gdm/chooser",
+ ]);
+
+ $self->_setupGDMScript();
+
+ my $configHash = $self->{distro}->GDMConfigHashForWorkstation();
+ $self->_writeConfigHash($configHash, "$repoPath/gdm/workstation/gdm.conf");
+
+ $configHash = $self->{distro}->GDMConfigHashForKiosk();
+ $self->_writeConfigHash($configHash, "$repoPath/gdm/kiosk/gdm.conf");
+
+ $configHash = $self->{distro}->GDMConfigHashForChooser();
+ $self->_writeConfigHash($configHash, "$repoPath/gdm/chooser/gdm.conf");
+
+ return;
+}
+
+sub _setupGDMScript
+{
+ my $self = shift;
+
+ my $repoPath = $self->{pluginRepositoryPath};
+ my $script = $self->{distro}->setupGDMScript($repoPath);
+
+ spitFile("$repoPath/gdm/desktop.sh", $script);
+
+ return;
+}
+
+sub _setupKDM
+{
+ my $self = shift;
+
+ my $repoPath = $self->{pluginRepositoryPath};
+ mkpath([
+ "$repoPath/kdm/workstation",
+ "$repoPath/kdm/kiosk",
+ "$repoPath/kdm/chooser",
+ ]);
+
+ $self->_setupKDMScript();
+
+ my $configHash = $self->{distro}->KDMConfigHashForWorkstation();
+ $self->_writeConfigHash($configHash, "$repoPath/kdm/workstation/kdmrc");
+
+ $configHash = $self->{distro}->KDMConfigHashForKiosk();
+ $self->_writeConfigHash($configHash, "$repoPath/kdm/kiosk/kdmrc");
+
+ $configHash = $self->{distro}->KDMConfigHashForChooser();
+ $self->_writeConfigHash($configHash, "$repoPath/kdm/chooser/kdmrc");
+
+ return;
+}
+
+sub _setupKDMScript
+{
+ my $self = shift;
+
+ my $repoPath = $self->{pluginRepositoryPath};
+ my $script = $self->{distro}->setupKDMScript($repoPath);
+
+ spitFile("$repoPath/kdm/desktop.sh", $script);
+
+ return;
+}
+
+sub _setupXDM
+{
+ my $self = shift;
+}
+
+sub _writeConfigHash
+{
+ my $self = shift;
+ my $hash = shift || {};
+ my $file = shift;
+
+ my $content = '';
+ for my $domain (sort keys %$hash) {
+ $content .= "[$domain]\n";
+ for my $key (sort keys %{$hash->{$domain}}) {
+ my $value
+ = defined $hash->{$domain}->{$key}
+ ? $hash->{$domain}->{$key}
+ : '';
+ $content .= "$key=$value\n";
+ }
+ $content .= "\n";
+ }
+ spitFile($file, $content);
+
+ return;
+}
+
+sub _setupSupportedThemes
+{
+ my $self = shift;
+
+ my $supportedThemes = $self->{attrs}->{'desktop::supported_themes'} || '';
+ my @supportedThemes = split m{\s*,\s*}, $supportedThemes;
+ return if !@supportedThemes;
+
+ # Every theme is copied from the folder where it is found first, such that
+ # themes in the config folder will be preferred to a theme with the same
+ # name living in the base folder
+ my @themeBaseDirs = (
+ "$self->{openslxConfigPath}/plugins/desktop/themes",
+ "$self->{openslxBasePath}/lib/plugins/desktop/themes",
+ );
+ THEME:
+ for my $theme (@supportedThemes) {
+ THEME_DIR:
+ foreach my $themeBaseDir (@themeBaseDirs) {
+ my $gdmThemeDir = "$themeBaseDir/gdm/$theme";
+ my $kdmThemeDir = "$themeBaseDir/kdm/$theme";
+ next THEME_DIR if !-d $gdmThemeDir && !-d $kdmThemeDir;
+ # any of both dirs is enough
+
+ # copy theme into plugin-repo folder
+ vlog(1, "installing theme '$theme'...");
+ my $gdmThemeTargetPath = "$self->{pluginRepositoryPath}/themes/gdm";
+ mkpath($gdmThemeTargetPath);
+ slxsystem(
+ "cp -a $gdmThemeDir $gdmThemeTargetPath/$theme 2>/dev/null"
+ ) == 0
+ or die _tr('unable to copy GDM-theme %s (%s)', $theme, $!);
+ my $kdmThemeTargetPath = "$self->{pluginRepositoryPath}/themes/kdm";
+ mkpath($kdmThemeTargetPath);
+ slxsystem(
+ "cp -a $kdmThemeDir $kdmThemeTargetPath/$theme 2>/dev/null"
+ ) == 0
+ or die _tr('unable to copy KDM-theme %s (%s)', $theme, $!);
+ next THEME;
+ }
+ warn _tr('theme "%s" not found - skipped!', $theme);
+ }
+
+ return;
+}
+
+sub _getAvailableThemes
+{
+ my $self = shift;
+
+ my %availableThemes;
+
+ # return all themes found in any of these two folders
+ my @themeBaseDirs = (
+ "$self->{openslxConfigPath}/plugins/desktop/themes",
+ "$self->{openslxBasePath}/lib/plugins/desktop/themes",
+ );
+ for my $themeBaseDir (@themeBaseDirs) {
+ my @foundGDMThemes
+ = map { basename $_ } grep { -d $_ } glob("$themeBaseDir/gdm/*");
+ @availableThemes{@foundGDMThemes} = ();
+ my @foundKDMThemes
+ = map { basename $_ } grep { -d $_ } glob("$themeBaseDir/kdm/*");
+ @availableThemes{@foundKDMThemes} = ();
+ }
+
+ vlog(1, _tr("available themes: %s", join ",", keys %availableThemes));
+
+ return keys %availableThemes;
+}
+
+1;
diff --git a/src/os-plugins/plugins/desktop/XX_desktop.sh b/src/os-plugins/plugins/desktop/XX_desktop.sh
new file mode 100644
index 00000000..a8cc71fc
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/XX_desktop.sh
@@ -0,0 +1,33 @@
+# Copyright (c) 2007..2008 - RZ Uni Freiburg
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# stage3 part of 'desktop' plugin - the runlevel script
+#
+# script is included from init via the "." load function - thus it has all
+# variables and functions available
+
+if [ -e /initramfs/plugin-conf/desktop.conf ]; then
+ . /initramfs/plugin-conf/desktop.conf
+ if [ $desktop_active -ne 0 ]; then
+ [ $DEBUGLEVEL -gt 0 ] && echo "executing the 'desktop' os-plugin ...";
+
+ # problem which occurs if exporting was forgotten (quick fix code)
+ if [ -e /mnt/opt/openslx/plugin-repo/desktop/${desktop_manager}/desktop.sh ]
+ then . /mnt/opt/openslx/plugin-repo/desktop/${desktop_manager}/desktop.sh
+ else
+ error "This shouldn't fail - you might have forgotten to export \
+your system." fatal
+ fi
+
+ [ $DEBUGLEVEL -gt 0 ] && echo "done with 'desktop' os-plugin ...";
+
+ fi
+fi
diff --git a/src/os-plugins/plugins/desktop/themes/gdm/openslx-legacy b/src/os-plugins/plugins/desktop/themes/gdm/openslx-legacy
new file mode 120000
index 00000000..d97839a5
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/gdm/openslx-legacy
@@ -0,0 +1 @@
+openslx \ No newline at end of file
diff --git a/src/os-plugins/plugins/desktop/themes/gdm/openslx/GdmGreeterTheme.desktop b/src/os-plugins/plugins/desktop/themes/gdm/openslx/GdmGreeterTheme.desktop
new file mode 100755
index 00000000..08e5efce
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/gdm/openslx/GdmGreeterTheme.desktop
@@ -0,0 +1,8 @@
+[GdmGreeterTheme]
+Encoding=UTF-8
+Greeter=theme.xml
+Name=OpenSLX GDM theme
+Description=GDM Port of Daemonic KDM theme for FreeBSD
+Author=MJanc / KDM by aceph <aceph@ventcore.net>
+Copyright=Creative Commons
+Screenshot=screenshot.png \ No newline at end of file
diff --git a/src/os-plugins/plugins/desktop/themes/gdm/openslx/color.png b/src/os-plugins/plugins/desktop/themes/gdm/openslx/color.png
new file mode 100644
index 00000000..7a0feb03
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/gdm/openslx/color.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/gdm/openslx/environment.png b/src/os-plugins/plugins/desktop/themes/gdm/openslx/environment.png
new file mode 100644
index 00000000..7ad6783a
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/gdm/openslx/environment.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/gdm/openslx/language-selector.png b/src/os-plugins/plugins/desktop/themes/gdm/openslx/language-selector.png
new file mode 100644
index 00000000..da016473
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/gdm/openslx/language-selector.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/gdm/openslx/language-selector_inactive.png b/src/os-plugins/plugins/desktop/themes/gdm/openslx/language-selector_inactive.png
new file mode 100644
index 00000000..bb2c8f69
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/gdm/openslx/language-selector_inactive.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/gdm/openslx/main-runner.png b/src/os-plugins/plugins/desktop/themes/gdm/openslx/main-runner.png
new file mode 100644
index 00000000..dde10cc8
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/gdm/openslx/main-runner.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/gdm/openslx/openslx-logo-main.png b/src/os-plugins/plugins/desktop/themes/gdm/openslx/openslx-logo-main.png
new file mode 100644
index 00000000..f98e6517
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/gdm/openslx/openslx-logo-main.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/gdm/openslx/openslx-logo.png b/src/os-plugins/plugins/desktop/themes/gdm/openslx/openslx-logo.png
new file mode 100644
index 00000000..8cfaaf94
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/gdm/openslx/openslx-logo.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/gdm/openslx/sessions.png b/src/os-plugins/plugins/desktop/themes/gdm/openslx/sessions.png
new file mode 100644
index 00000000..00d05f29
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/gdm/openslx/sessions.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/gdm/openslx/sessions_inactive.png b/src/os-plugins/plugins/desktop/themes/gdm/openslx/sessions_inactive.png
new file mode 100644
index 00000000..86bbe642
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/gdm/openslx/sessions_inactive.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/gdm/openslx/system.png b/src/os-plugins/plugins/desktop/themes/gdm/openslx/system.png
new file mode 100644
index 00000000..f7b9e71f
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/gdm/openslx/system.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/gdm/openslx/system_inactive.png b/src/os-plugins/plugins/desktop/themes/gdm/openslx/system_inactive.png
new file mode 100644
index 00000000..c3e1719b
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/gdm/openslx/system_inactive.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/gdm/openslx/theme.xml b/src/os-plugins/plugins/desktop/themes/gdm/openslx/theme.xml
new file mode 100644
index 00000000..46ef334e
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/gdm/openslx/theme.xml
@@ -0,0 +1,224 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE greeter SYSTEM "greeter.dtd">
+<!--
+GDM-OpenSLX-Theme
+-->
+<greeter id="theme">
+
+ <!-- background -->
+ <item type="pixmap" id="background" background="true">
+ <normal file="color.png"/>
+ <pos x="0" y="0" width="100%" height="100%"/>
+ </item>
+
+ <!-- top / welcome, clock and big logo -->
+ <item type="rect" id="top" background="true">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="n" x="50%" y="0" width="100%" height="40%"/>
+ <box orientation="vertical" homogeneous="true">
+
+ <item type="pixmap" background="true">
+ <normal file="welcome-time-shadowed.png"/>
+ <pos anchor="n" x="50%" y="0" width="80%" height="44"/>
+ <box orientation="horizontal" homogeneous="true">
+ <!-- Welcome on ... -->
+ <item type="label" background="true">
+ <pos anchor="w" x="10%" y="30%"/>
+ <normal color="#f0f0f0" font="Sans 11"/>
+ <stock type="welcome-label"/>
+ </item>
+ <!-- clock -->
+ <item type="label" id="clock">
+ <pos anchor="e" x="90%" y="30%"/>
+ <normal color="#f0f0f0" font="Sans 11"/>
+ <text>%c</text>
+ </item>
+ </box>
+ </item>
+
+ <item type="rect" id="logo">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="c" x="50%" y="10%" width="100%" height="100%"/>
+ <box orientation="vertical" homogeneous="true">
+ <item type="pixmap">
+ <normal file="openslx-logo-main.png"/>
+ <pos anchor="c" x="50%" y="50%"/>
+ </item>
+ </box>
+ </item>
+
+ </box>
+ </item>
+
+ <!-- main part / login, session, menu, ... -->
+ <item type="pixmap" id="main-runner" background="true">
+ <normal file="main-runner.png"/>
+ <pos anchor="c" x="50%" y="50%" width="100%" height="160"/>
+ <box orientation="horizontal" homogeneous="true">
+
+ <item type="rect" background="true">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="w" x="0%" y="50%" width="100%" height="100%"/>
+ <box orientation="horizontal" homogeneous="true">
+
+ <!-- left part / login -->
+ <item type="rect" background="true">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="w" x="0" y="50%" width="100%" height="100%"/>
+ <box orientation="horizontal">
+
+ <!-- small logo -->
+ <item type="pixmap" background="true">
+ <normal file="openslx-logo.png"/>
+ <pos anchor="w" x="30" y="50%"/>
+ </item>
+
+ <item type="rect">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="w" x="70" y="50%" width="box" height="box"/>
+ <box homogeneous="true" spacing="5">
+ <!-- username-label -->
+ <item type="label" id="pam-prompt">
+ <pos anchor="nw" x="0" y="0"/>
+ <normal color="#f0f0f0" font="Sans 11"/>
+ <stock type="username-label"/>
+ </item>
+ <!-- username-entry -->
+ <item type="entry" id="user-pw-entry">
+ <normal color="#0f0f0f" font="Sans 11"/>
+ <pos anchor="sw" x="0" y="100%" height="20" width="120"/>
+ </item>
+ </box>
+ </item>
+
+ </box>
+ </item>
+
+ <!-- middle part / errors, caps info, gdm logo -->
+ <item type="rect">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="c" x="50%" y="50%" width="90%" height="100%"/>
+ <box orientation="vertical">
+
+ <!-- Login-Error -->
+ <item type="rect">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="n" x="50%" y="10" width="100%" height="30"/>
+ <box>
+ <item type="label" id="pam-error">
+ <normal color="#ff8b00" font="Sans 11"/>
+ <pos anchor="c" x="50%" y="15"/>
+ <text/>
+ </item>
+ </box>
+ </item>
+
+ <item type="pixmap">
+ <normal file="environment.png"/>
+ <pos anchor="c" x="50%" y="50%"/>
+ </item>
+
+ <!-- capslock-warning -->
+ <item type="rect" id="caps-lock-warning">
+ <normal color="#000000" alpha="0.4"/>
+ <pos anchor="s" x="50%" y="-10" width="100%" height="30"/>
+ <box>
+ <item type="label">
+ <normal color="#ff8b00" font="Sans 11"/>
+ <pos anchor="c" x="50%" y="15"/>
+ <stock type="caps-lock-warning"/>
+ </item>
+ </box>
+ </item>
+
+ </box>
+ </item>
+
+ <!-- right part / sessions, menu -->
+ <item type="rect">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="e" x="100%" y="50%" width="100%" height="100%"/>
+ <box orientation="vertical" homogeneous="true" spacing="10">
+
+ <!-- session-button -->
+ <item type="rect" id="session_button" button="true">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="se" x="-50" y="100%" width="box" height="box"/>
+ <box orientation="horizontal">
+ <item type="label">
+ <normal color="#bbbbbb" font="Sans 11"/>
+ <prelight color="#f0f0f0" font="Sans 11"/>
+ <active color="#ff8b00" font="Sans 11"/>
+ <pos anchor="e" x="100%" y="-24"/>
+ <stock type="session"/>
+ </item>
+ <item type="rect" id="session_button" button="true">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="c" x="50%" y="50%" width="10"/>
+ </item>
+ <item type="pixmap" id="session_button" button="true">
+ <normal file="sessions_inactive.png"/>
+ <prelight file="sessions.png"/>
+ <pos anchor="se" x="100%" y="100%"/>
+ </item>
+ </box>
+ </item>
+
+ <!-- menu-button -->
+ <item type="rect" id="system_button" button="true">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="ne" x="-50" y="0" width="box" height="box"/>
+ <box orientation="horizontal">
+ <item type="label">
+ <normal color="#bbbbbb" font="Sans 11"/>
+ <prelight color="#f0f0f0" font="Sans 11"/>
+ <active color="#ff8b00" font="Sans 11"/>
+ <pos anchor="e" x="100%" y="24"/>
+ <stock type="system"/>
+ </item>
+ <item type="rect" id="system_button" button="true">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="c" x="50%" y="50%" width="10"/>
+ </item>
+ <item type="pixmap" id="system_button" button="true">
+ <normal file="system_inactive.png"/>
+ <prelight file="system.png"/>
+ <pos anchor="ne" x="100%" y="0%"/>
+ </item>
+ </box>
+ </item>
+
+ </box>
+ </item>
+
+ </box>
+ </item>
+
+ </box>
+ </item>
+
+ <!-- language-button -->
+ <item type="rect" id="language_button" button="true">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="se" x="-10" y="-10" width="box" height="box"/>
+ <box orientation="horizontal">
+ <item type="label">
+ <normal color="#3e5d72" font="Sans 11"/>
+ <prelight color="#557f9c" font="Sans 11"/>
+ <active color="#ff8b00" font="Sans 11"/>
+ <pos anchor="e" x="100%" y="16"/>
+ <stock type="language"/>
+ </item>
+ <item type="rect" id="language_button" button="true">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="c" x="50%" y="50%" width="10"/>
+ </item>
+ <item type="pixmap" id="language_button" button="true">
+ <normal file="language-selector_inactive.png"/>
+ <prelight file="language-selector.png"/>
+ <pos anchor="ne" x="100%" y="0%"/>
+ </item>
+ </box>
+ </item>
+
+</greeter>
diff --git a/src/os-plugins/plugins/desktop/themes/gdm/openslx/welcome-time-shadowed.png b/src/os-plugins/plugins/desktop/themes/gdm/openslx/welcome-time-shadowed.png
new file mode 100644
index 00000000..79e872c3
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/gdm/openslx/welcome-time-shadowed.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/GdmGreeterTheme.desktop b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/GdmGreeterTheme.desktop
new file mode 100755
index 00000000..da63ec08
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/GdmGreeterTheme.desktop
@@ -0,0 +1,8 @@
+[GdmGreeterTheme]
+Encoding=UTF-8
+Greeter=theme.xml
+Name=OpenSLX KDM theme
+Description=KDM Port of Daemonic KDM theme for FreeBSD
+Author=MJanc / KDM by aceph <aceph@ventcore.net>
+Copyright=Creative Commons
+Screenshot=screenshot.png
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/KdmGreeterTheme.desktop b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/KdmGreeterTheme.desktop
new file mode 100755
index 00000000..3cb9069d
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/KdmGreeterTheme.desktop
@@ -0,0 +1,8 @@
+[KdmGreeterTheme]
+Encoding=UTF-8
+Greeter=theme.xml
+Name=OpenSLX KDM theme
+Description=KDM Port of Daemonic KDM theme for FreeBSD
+Author=MJanc / KDM by aceph <aceph@ventcore.net>
+Copyright=Creative Commons
+Screenshot=screenshot.png
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/color.png b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/color.png
new file mode 100644
index 00000000..7a0feb03
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/color.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/enter.png b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/enter.png
new file mode 100644
index 00000000..b646e851
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/enter.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/enter_inactive.png b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/enter_inactive.png
new file mode 100644
index 00000000..e12cfb8e
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/enter_inactive.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/environment.png b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/environment.png
new file mode 100644
index 00000000..b9682822
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/environment.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/main-runner.png b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/main-runner.png
new file mode 100644
index 00000000..5b3cf656
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/main-runner.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/openslx-logo-main.png b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/openslx-logo-main.png
new file mode 100644
index 00000000..f98e6517
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/openslx-logo-main.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/openslx-logo.png b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/openslx-logo.png
new file mode 100644
index 00000000..8cfaaf94
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/openslx-logo.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/sessions.png b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/sessions.png
new file mode 100644
index 00000000..00d05f29
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/sessions.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/sessions_inactive.png b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/sessions_inactive.png
new file mode 100644
index 00000000..86bbe642
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/sessions_inactive.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/system.png b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/system.png
new file mode 100644
index 00000000..f7b9e71f
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/system.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/system_inactive.png b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/system_inactive.png
new file mode 100644
index 00000000..c3e1719b
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/system_inactive.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/theme.xml b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/theme.xml
new file mode 100644
index 00000000..61ae6644
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/theme.xml
@@ -0,0 +1,204 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE greeter SYSTEM "greeter.dtd">
+<!--
+KDM3-OpenSLX-Theme
+-->
+<greeter>
+ <!-- main pic, login pic -->
+ <item type="pixmap">
+ <normal file="color.png"/>
+ <pos x="0" y="0" width="100%" height="100%"/>
+ <item type="rect">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="n" x="50%" y="0" width="100%" height="40%"/>
+
+ <item type="pixmap">
+ <normal file="welcome-time-shadowed.png"/>
+ <pos anchor="n" x="50%" y="0" width="80%" height="44"/>
+
+ <!-- Welcome on ... -->
+ <item type="label">
+ <pos anchor="w" x="5%" y="33%"/>
+ <normal color="#f0f0f0" font="Sans 12"/>
+ <!-- <stock type="welcome-label"/> -->
+ <text>OpenSLX Workstation (%h)</text>
+ </item>
+
+ <!-- clock -->
+ <item type="label" id="clock">
+ <normal color="#f0f0f0" font="Sans 12"/>
+ <pos anchor="e" x="95%" y="33%"/>
+ <text>%c</text>
+ </item>
+
+ </item>
+
+ <item type="pixmap">
+ <normal file="openslx-logo-main.png"/>
+ <pos anchor="n" x="50%" y="20%" height="70%"/>
+ </item>
+
+ </item>
+
+ <item type="pixmap">
+ <normal file="main-runner.png"/>
+ <pos anchor="c" x="50%" y="50%" width="100%" height="160"/>
+
+ <item type="rect">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="w" x="0" y="50%" width="35%" height="100%"/>
+
+ <item type="rect">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="w" x="0" y="50%" width="120" height="100%"/>
+ <item type="pixmap">
+ <normal file="openslx-logo.png"/>
+ <pos anchor="e" x="100%" y="50%"/>
+ </item>
+ </item>
+
+ <item type="rect">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="e" x="-140" y="50%" width="100%" height="100%"/>
+
+ <!-- username-label -->
+ <item type="label">
+ <pos anchor="e" x="-5" y="40%"/>
+ <normal color="#f0f0f0" font="Sans 11"/>
+ <stock type="username-label"/>
+ </item>
+
+ <!-- password-label -->
+ <item type="label">
+ <pos anchor="e" x="-5" y="60%"/>
+ <normal color="#f0f0f0" font="Sans 11"/>
+ <stock type="password-label"/>
+ </item>
+
+ </item>
+
+ <item type="rect">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="e" x="100%" y="50%" width="140" height="100%"/>
+
+ <!-- username-entry -->
+ <item type="entry" id="user-entry">
+ <pos anchor="w" x="0" y="40%" height="22" width="114"/>
+ </item>
+
+ <!-- password-entry -->
+ <item type="entry" id="pw-entry">
+ <pos anchor="w" x="0" y="60%" height="22" width="114"/>
+ </item>
+
+ <item type="pixmap" button="true" id="login_button">
+ <pos anchor="e" x="100%" y="60%" height="22" width="22"/>
+ <normal file="enter_inactive.png"/>
+ <prelight file="enter.png"/>
+ </item>
+
+ </item>
+
+ </item>
+
+ <item type="rect">
+ <normal color="#ff0000" alpha="0.0"/>
+ <pos anchor="c" x="50%" y="50%" width="30%" height="160"/>
+
+ <!-- capslock-warning -->
+ <item type="pixmap" id="caps-lock-warning">
+ <normal file="error.png"/>
+ <pos anchor="c" x="50%" y="22" width="100%" height="70"/>
+ <item type="rect" id="caps-lock-warning">
+ <normal color="#000000" alpha="0.4"/>
+ <pos anchor="c" x="50%" y="50%" width="100%" height="box"/>
+ <box orientation="vertical" xpadding="10" ypadding="5" spacing="0">
+ <item type="label">
+ <normal color="#ff8b00" font="Sans 11"/>
+ <pos x="50%" anchor="n"/>
+ <stock type="caps-lock-warning"/>
+ </item>
+ </box>
+ </item>
+ </item>
+
+ <item type="pixmap">
+ <normal file="environment.png"/>
+ <pos anchor="c" x="50%" y="50%" width="186" height="100"/>
+ </item>
+
+ <!-- Login-Error -->
+ <item type="pixmap" id="pam-error">
+ <normal file="error.png"/>
+ <pos anchor="c" x="50%" y="-22" width="100%" height="70"/>
+ <item type="rect">
+ <normal color="#000000" alpha="0.4"/>
+ <pos anchor="c" x="50%" y="50%" width="100%" height="box"/>
+ <box orientation="vertical" xpadding="10" ypadding="5" spacing="0">
+ <item type="label">
+ <normal color="#ff8b00" font="Sans 11"/>
+ <pos anchor="n" x="50%"/>
+ <text>Login failed!</text>
+ <text xml:lang="en">Login failed!</text>
+ <text xml:lang="de">Login fehlgeschlagen!</text>
+ </item>
+ </box>
+ </item>
+ </item>
+
+ </item>
+
+ <!-- icons and text on the left -->
+ <item type="rect">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="e" x="100%" y="50%" width="35%" height="100%"/>
+
+ <!-- session-button -->
+ <item type="rect" id="session_button" button="true">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="se" x="80%" y="50%" width="160" height="50%"/>
+
+ <item type="pixmap" id="session_button" button="true">
+ <normal file="sessions_inactive.png"/>
+ <prelight file="sessions.png"/>
+ <pos anchor="se" x="94%" y="-8" width="48" height="48"/>
+ </item>
+
+ <item type="label">
+ <normal color="#bbbbbb" font="Sans 11"/>
+ <prelight color="#f0f0f0" font="Sans 11"/>
+ <active color="#ff8b00" font="Sans 11"/>
+ <pos anchor="e" x="-70" y="-32"/>
+ <text>Session</text>
+ <text xml:lang="en">Session</text>
+ <text xml:lang="de">Sitzung</text>
+ </item>
+
+ </item>
+
+ <!-- menu-button -->
+ <item type="rect" id="system_button" button="true">
+ <show modes="console" type="system"/>
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="ne" x="80%" y="50%" width="160" height="50%"/>
+ <item type="pixmap" id="system_button" button="true">
+ <normal file="system_inactive.png"/>
+ <prelight file="system.png"/>
+ <pos anchor="ne" x="94%" y="8" width="48" height="48"/>
+ </item>
+ <item type="label">
+ <normal color="#bbbbbb" font="Sans 11"/>
+ <prelight color="#f0f0f0" font="Sans 11"/>
+ <active color="#ff8b00" font="Sans 11"/>
+ <pos anchor="e" x="-70" y="32"/>
+ <text>System Menu</text>
+ <text xml:lang="en">System Menu</text>
+ <text xml:lang="de">System Menü</text>
+ </item>
+ </item>
+
+ </item>
+
+ </item>
+ </item>
+</greeter>
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/welcome-time-shadowed.png b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/welcome-time-shadowed.png
new file mode 100644
index 00000000..79e872c3
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx-legacy/welcome-time-shadowed.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx/KdmGreeterTheme.desktop b/src/os-plugins/plugins/desktop/themes/kdm/openslx/KdmGreeterTheme.desktop
new file mode 100755
index 00000000..3cb9069d
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx/KdmGreeterTheme.desktop
@@ -0,0 +1,8 @@
+[KdmGreeterTheme]
+Encoding=UTF-8
+Greeter=theme.xml
+Name=OpenSLX KDM theme
+Description=KDM Port of Daemonic KDM theme for FreeBSD
+Author=MJanc / KDM by aceph <aceph@ventcore.net>
+Copyright=Creative Commons
+Screenshot=screenshot.png
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx/color.png b/src/os-plugins/plugins/desktop/themes/kdm/openslx/color.png
new file mode 100644
index 00000000..7a0feb03
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx/color.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx/enter.png b/src/os-plugins/plugins/desktop/themes/kdm/openslx/enter.png
new file mode 100644
index 00000000..b646e851
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx/enter.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx/enter_inactive.png b/src/os-plugins/plugins/desktop/themes/kdm/openslx/enter_inactive.png
new file mode 100644
index 00000000..e12cfb8e
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx/enter_inactive.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx/environment.png b/src/os-plugins/plugins/desktop/themes/kdm/openslx/environment.png
new file mode 100644
index 00000000..b9682822
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx/environment.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx/main-runner.png b/src/os-plugins/plugins/desktop/themes/kdm/openslx/main-runner.png
new file mode 100644
index 00000000..dde10cc8
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx/main-runner.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx/openslx-logo-main.png b/src/os-plugins/plugins/desktop/themes/kdm/openslx/openslx-logo-main.png
new file mode 100644
index 00000000..f98e6517
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx/openslx-logo-main.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx/openslx-logo.png b/src/os-plugins/plugins/desktop/themes/kdm/openslx/openslx-logo.png
new file mode 100644
index 00000000..8cfaaf94
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx/openslx-logo.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx/sessions.png b/src/os-plugins/plugins/desktop/themes/kdm/openslx/sessions.png
new file mode 100644
index 00000000..00d05f29
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx/sessions.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx/sessions_inactive.png b/src/os-plugins/plugins/desktop/themes/kdm/openslx/sessions_inactive.png
new file mode 100644
index 00000000..86bbe642
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx/sessions_inactive.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx/system.png b/src/os-plugins/plugins/desktop/themes/kdm/openslx/system.png
new file mode 100644
index 00000000..f7b9e71f
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx/system.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx/system_inactive.png b/src/os-plugins/plugins/desktop/themes/kdm/openslx/system_inactive.png
new file mode 100644
index 00000000..c3e1719b
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx/system_inactive.png
Binary files differ
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx/theme.xml b/src/os-plugins/plugins/desktop/themes/kdm/openslx/theme.xml
new file mode 100644
index 00000000..d748c776
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx/theme.xml
@@ -0,0 +1,232 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE greeter SYSTEM "greeter.dtd">
+<!--
+KDM-OpenSLX-Theme
+-->
+<greeter id="theme">
+ <style font="Sans 11" window-text-color="#f0f0f0" base-color="#f0f0f0" text-color="#000000"/>
+
+ <!-- background -->
+ <item type="pixmap" id="background" background="true">
+ <normal file="color.png"/>
+ <pos x="0" y="0" width="100%" height="100%"/>
+ </item>
+
+ <!-- top / welcome, clock and big logo -->
+ <item type="rect" id="top" background="true">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="n" x="50%" y="0" width="100%" height="40%"/>
+ <box orientation="vertical" homogeneous="true">
+
+ <item type="pixmap" background="true">
+ <normal file="welcome-time-shadowed.png"/>
+ <pos anchor="n" x="50%" y="0" width="80%" height="44"/>
+ <box orientation="horizontal" homogeneous="true">
+ <!-- Welcome on ... -->
+ <item type="label" background="true">
+ <pos anchor="w" x="10%" y="30%"/>
+ <normal color="#f0f0f0" font="Sans 11"/>
+ <stock type="welcome-label"/>
+ </item>
+ <!-- clock -->
+ <item type="label" id="clock">
+ <pos anchor="e" x="90%" y="30%"/>
+ <normal color="#f0f0f0" font="Sans 11"/>
+ <text>%c</text>
+ </item>
+ </box>
+ </item>
+
+ <item type="rect" id="logo">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="c" x="50%" y="10%" width="100%" height="100%"/>
+ <box orientation="vertical" homogeneous="true">
+ <item type="pixmap">
+ <normal file="openslx-logo-main.png"/>
+ <pos anchor="c" x="50%" y="50%"/>
+ </item>
+ </box>
+ </item>
+
+ </box>
+ </item>
+
+ <!-- main part / login, session, menu, ... -->
+ <item type="pixmap" id="main-runner" background="true">
+ <normal file="main-runner.png"/>
+ <pos anchor="c" x="50%" y="50%" width="100%" height="160"/>
+ <box orientation="horizontal" homogeneous="true">
+
+ <item type="rect" background="true">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="w" x="0%" y="50%" width="100%" height="100%"/>
+ <box orientation="horizontal" homogeneous="true">
+
+ <!-- left part / login -->
+ <item type="rect" background="true">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="w" x="0" y="50%" width="100%" height="100%"/>
+ <box orientation="horizontal">
+
+ <!-- small logo -->
+ <item type="pixmap" background="true">
+ <normal file="openslx-logo.png"/>
+ <pos anchor="w" x="30" y="50%"/>
+ </item>
+
+ <!-- login -->
+ <item type="rect">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="w" x="70" y="50%" width="box" height="box"/>
+ <box orientation="horizontal" spacing="10">
+
+ <item type="rect">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="sw" x="0" y="100%" width="box" height="100%"/>
+ <box homogeneous="true" spacing="10">
+ <!-- username-label -->
+ <item type="label">
+ <pos anchor="nw" x="0" y="0"/>
+ <normal color="#f0f0f0" font="Sans 11"/>
+ <stock type="username-label"/>
+ </item>
+ <!-- password-label -->
+ <item type="label">
+ <pos anchor="sw" x="0" y="-0"/>
+ <normal color="#f0f0f0" font="Sans 11"/>
+ <stock type="password-label"/>
+ </item>
+ </box>
+ </item>
+
+ <item type="rect">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="nw" x="0" y="0" width="box" height="box"/>
+ <box homogeneous="true" spacing="10">
+ <!-- username-entry -->
+ <item type="entry" id="user-entry">
+ <pos anchor="w" x="0" y="50%" height="20" width="100"/>
+ </item>
+ <!-- password-entry -->
+ <item type="entry" id="pw-entry">
+ <pos anchor="w" x="0" y="50%" height="20" width="100"/>
+ </item>
+ </box>
+ </item>
+
+ <item type="pixmap" button="true" id="login_button">
+ <pos anchor="sw" x="0" y="-0" height="20" width="20"/>
+ <normal file="enter_inactive.png"/>
+ <prelight file="enter.png"/>
+ </item>
+
+ </box>
+ </item>
+
+ </box>
+ </item>
+
+ <!-- middle part / errors, caps info, kdm logo -->
+ <item type="rect">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="c" x="50%" y="50%" width="90%" height="100%"/>
+ <box orientation="vertical">
+
+ <!-- Login-Error -->
+ <item type="rect">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="n" x="50%" y="10" width="100%" height="30"/>
+ <box>
+ <item type="label" id="pam-error">
+ <normal color="#ff8b00" font="Sans 11"/>
+ <pos anchor="c" x="50%" y="15"/>
+ <text/>
+ </item>
+ </box>
+ </item>
+
+ <item type="pixmap">
+ <normal file="environment.png"/>
+ <pos anchor="c" x="50%" y="50%"/>
+ </item>
+
+ <!-- capslock-warning -->
+ <item type="rect" id="caps-lock-warning">
+ <normal color="#000000" alpha="0.4"/>
+ <pos anchor="s" x="50%" y="-10" width="100%" height="30"/>
+ <box>
+ <item type="label">
+ <normal color="#ff8b00" font="Sans 11"/>
+ <pos anchor="c" x="50%" y="15"/>
+ <stock type="caps-lock-warning"/>
+ </item>
+ </box>
+ </item>
+
+ </box>
+ </item>
+
+ <!-- right part / sessions, menu -->
+ <item type="rect">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="e" x="100%" y="50%" width="100%" height="100%"/>
+ <box orientation="vertical" homogeneous="true" spacing="10">
+
+ <!-- session-button -->
+ <item type="rect" id="session_button" button="true">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="se" x="-50" y="100%" width="box" height="box"/>
+ <box orientation="horizontal">
+ <item type="label">
+ <normal color="#bbbbbb" font="Sans 11"/>
+ <prelight color="#f0f0f0" font="Sans 11"/>
+ <active color="#ff8b00" font="Sans 11"/>
+ <pos anchor="e" x="100%" y="-24"/>
+ <stock type="session"/>
+ </item>
+ <item type="rect" id="session_button" button="true">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="c" x="50%" y="50%" width="10"/>
+ </item>
+ <item type="pixmap" id="session_button" button="true">
+ <normal file="sessions_inactive.png"/>
+ <prelight file="sessions.png"/>
+ <pos anchor="se" x="100%" y="100%"/>
+ </item>
+ </box>
+ </item>
+
+ <!-- menu-button -->
+ <item type="rect" id="system_button" button="true">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="ne" x="-50" y="0" width="box" height="box"/>
+ <box orientation="horizontal">
+ <item type="label">
+ <normal color="#bbbbbb" font="Sans 11"/>
+ <prelight color="#f0f0f0" font="Sans 11"/>
+ <active color="#ff8b00" font="Sans 11"/>
+ <pos anchor="e" x="100%" y="24"/>
+ <stock type="system"/>
+ </item>
+ <item type="rect" id="system_button" button="true">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="c" x="50%" y="50%" width="10"/>
+ </item>
+ <item type="pixmap" id="system_button" button="true">
+ <normal file="system_inactive.png"/>
+ <prelight file="system.png"/>
+ <pos anchor="ne" x="100%" y="0%"/>
+ </item>
+ </box>
+ </item>
+
+ </box>
+ </item>
+
+ </box>
+ </item>
+
+ </box>
+ </item>
+
+</greeter>
diff --git a/src/os-plugins/plugins/desktop/themes/kdm/openslx/welcome-time-shadowed.png b/src/os-plugins/plugins/desktop/themes/kdm/openslx/welcome-time-shadowed.png
new file mode 100644
index 00000000..79e872c3
--- /dev/null
+++ b/src/os-plugins/plugins/desktop/themes/kdm/openslx/welcome-time-shadowed.png
Binary files differ
diff --git a/src/os-plugins/plugins/dropbear/OpenSLX/OSPlugin/dropbear.pm b/src/os-plugins/plugins/dropbear/OpenSLX/OSPlugin/dropbear.pm
new file mode 100644
index 00000000..fc1b96f8
--- /dev/null
+++ b/src/os-plugins/plugins/dropbear/OpenSLX/OSPlugin/dropbear.pm
@@ -0,0 +1,104 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# dropbear.pm
+# - an dropbear implementation of the OSPlugin API (i.e. an os-plugin)
+# -----------------------------------------------------------------------------
+package OpenSLX::OSPlugin::dropbear;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSPlugin::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+# if you have any questions regarding the concept of OS-plugins and their
+# implementation, please drop a mail to: ot@openslx.com, or join the IRC-channel
+# '#openslx' (on freenode).
+################################################################################
+sub new
+{
+ my $class = shift;
+
+ my $self = {
+ name => 'dropbear',
+ };
+
+ return bless $self, $class;
+}
+
+sub getInfo
+{
+ my $self = shift;
+
+ return {
+ description => unshiftHereDoc(<<' End-of-Here'),
+ dropbear is a simple/small ssh daemon (for stage 3)
+ End-of-Here
+ precedence => 50,
+ };
+}
+
+sub getAttrInfo
+{ # returns a hash-ref with information about all attributes supported
+ # by this specific plugin
+ my $self = shift;
+
+ # This default configuration will be added as attributes to the default
+ # system, such that it can be overruled for any specific system by means
+ # of slxconfig.
+ return {
+ # attribute 'active' is mandatory for all plugins
+ 'dropbear::active' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should the 'dropbear'-plugin be executed during boot?
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '1 means active - 0 means inactive',
+ default => '1',
+ },
+ };
+}
+
+sub installationPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ my $pluginRepoPath = $info->{'plugin-repo-path'};
+ my $pluginTempPath = $info->{'plugin-temp-path'};
+ my $openslxBasePath = $info->{'openslx-base-path'};
+ my $openslxConfigPath = $info->{'openslx-config-path'};
+ my $attrs = $info->{'plugin-attrs'};
+
+ my $filesDir = "$openslxBasePath/lib/plugins/dropbear/files";
+
+ copyFile("$filesDir/dropbearmulti","$pluginRepoPath");
+
+ return;
+}
+
+sub removalPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ my $pluginRepoPath = $info->{'plugin-repo-path'};
+ my $pluginTempPath = $info->{'plugin-temp-path'};
+
+ return;
+}
+
+1;
diff --git a/src/os-plugins/plugins/dropbear/XX_dropbear.sh b/src/os-plugins/plugins/dropbear/XX_dropbear.sh
new file mode 100644
index 00000000..cb4321ff
--- /dev/null
+++ b/src/os-plugins/plugins/dropbear/XX_dropbear.sh
@@ -0,0 +1,58 @@
+
+# Copyright (c) 2007..2008 - RZ Uni Freiburg
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# stage3 part of 'dropbear' plugin - the runlevel script
+#
+# script is included from init via the "." load function - thus it has all
+# variables and functions available
+
+if [ -e /initramfs/plugin-conf/dropbear.conf ]; then
+ . /initramfs/plugin-conf/dropbear.conf
+ if [ $dropbear_active -ne 0 ]; then
+ [ $DEBUGLEVEL -gt 0 ] && echo "executing the 'dropbear' os-plugin ...";
+
+ # setup links to multibinary
+ ln -sf /mnt/opt/openslx/plugin-repo/dropbear/dropbearmulti /sbin/dropbear
+ ln -sf /mnt/opt/openslx/plugin-repo/dropbear/dropbearmulti /sbin/dropbearkey
+ ln -sf /mnt/opt/openslx/plugin-repo/dropbear/dropbearmulti /sbin/dropbearconvert
+ ln -sf /mnt/opt/openslx/plugin-repo/dropbear/dropbearmulti /bin/dbclient
+ ln -sf /mnt/opt/openslx/plugin-repo/dropbear/dropbearmulti /bin/scp
+
+ # create dropbear config dir
+ mkdir -p /etc/dropbear
+
+ # touch some files to get rid of error msgs
+ touch /var/log/lastlog
+ touch /var/log/wtmp
+
+ # copy ssh auth keys from stage1
+ cp -r /mnt/root/.ssh /root
+
+ # give root a valid shell
+ sed -i /etc/passwd -e "s/bash/sh/"
+
+ # convert openssh rsa key to dropbear key - if available
+ if [ -e /mnt/etc/ssh/ssh_host_rsa_key ]; then
+ dropbearconvert openssh dropbear /mnt/etc/ssh/ssh_host_rsa_key \
+ /etc/dropbear/dropbear_rsa_host_key
+ else
+ dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key
+ fi
+
+ echo "OpenSLX Debugshell (stage3)" >> /etc/motd
+
+ /sbin/dropbear
+
+ [ $DEBUGLEVEL -gt 0 ] && echo "done with 'dropbear' os-plugin ...";
+
+ fi
+fi
diff --git a/src/os-plugins/plugins/dropbear/files/dropbearmulti b/src/os-plugins/plugins/dropbear/files/dropbearmulti
new file mode 100755
index 00000000..357e644f
--- /dev/null
+++ b/src/os-plugins/plugins/dropbear/files/dropbearmulti
Binary files differ
diff --git a/src/os-plugins/plugins/dropbear/init-hooks/95-cleanup/dropbear.sh b/src/os-plugins/plugins/dropbear/init-hooks/95-cleanup/dropbear.sh
new file mode 100755
index 00000000..c0c9cffe
--- /dev/null
+++ b/src/os-plugins/plugins/dropbear/init-hooks/95-cleanup/dropbear.sh
@@ -0,0 +1 @@
+killall -9 dropbear >/dev/null 2>&1
diff --git a/src/os-plugins/plugins/example/OpenSLX/OSPlugin/example.pm b/src/os-plugins/plugins/example/OpenSLX/OSPlugin/example.pm
new file mode 100644
index 00000000..79f0ba48
--- /dev/null
+++ b/src/os-plugins/plugins/example/OpenSLX/OSPlugin/example.pm
@@ -0,0 +1,154 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# example.pm
+# - an example implementation of the OSPlugin API (i.e. an os-plugin)
+# -----------------------------------------------------------------------------
+package OpenSLX::OSPlugin::example;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSPlugin::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+# if you have any questions regarding the concept of OS-plugins and their
+# implementation, please drop a mail to: ot@openslx.com, or join the IRC-channel
+# '#openslx' (on freenode).
+################################################################################
+sub new
+{
+ my $class = shift;
+
+ my $self = {
+ name => 'example',
+ };
+
+ return bless $self, $class;
+}
+
+sub getInfo
+{
+ my $self = shift;
+
+ return {
+ description => unshiftHereDoc(<<' End-of-Here'),
+ just an exemplary plugin that prints a smiley when the client boots
+ End-of-Here
+ precedence => 50,
+ };
+}
+
+sub getAttrInfo
+{ # returns a hash-ref with information about all attributes supported
+ # by this specific plugin
+ my $self = shift;
+
+ # This default configuration will be added as attributes to the default
+ # system, such that it can be overruled for any specific system by means
+ # of slxconfig.
+ return {
+ # attribute 'active' is mandatory for all plugins
+ 'example::active' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should the 'example'-plugin be executed during boot?
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '1 means active - 0 means inactive',
+ default => '1',
+ },
+
+ # plugin specific attributes start here ...
+ 'example::preferred_side' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ determines to which side you have to tilt your head in order
+ to read the smiley
+ End-of-Here
+ content_regex => qr{^(left|right)$},
+ content_descr => q{'left' will print ';-)' - 'right' will print '(-;'},
+ default => 'left',
+ },
+ };
+}
+
+sub installationPhase
+{ # called while chrooted to the vendor-OS root in order to give the plugin
+ # a chance to install required files into the vendor-OS.
+ my $self = shift;
+ my $info = shift;
+
+ my $pluginRepoPath = $info->{'plugin-repo-path'};
+ # The folder where the stage1-plugin should store all files
+ # required by the corresponding stage3 runlevel script.
+ # As this method is being executed while chrooted into the vendor-OS,
+ # this path is relative to that root (i.e. directly usable).
+ my $pluginTempPath = $info->{'plugin-temp-path'};
+ # A temporary playground that will be cleaned up automatically.
+ # As this method is being executed while chrooted into the vendor-OS,
+ # this path is relative to that root (i.e. directly usable).
+ my $openslxBasePath = $info->{'openslx-base-path'};
+ # the openslx base path (/opt/openslx) bind-mounted into the chroot
+ my $openslxConfigPath = $info->{'openslx-config-path'};
+ # the openslx config path (/etc/opt/openlsx) bind-mounted into the
+ # chroot
+ my $attrs = $info->{'plugin-attrs'};
+ # attributes in effect for this installation
+
+ # for this example plugin, we simply create two files:
+ spitFile("$pluginRepoPath/right", "(-;\n");
+ spitFile("$pluginRepoPath/left", ";-)\n");
+
+ # Some plugins have to copy files from their plugin folder into the
+ # vendor-OS. Here's an example for how to do that:
+ #
+ # # get our own name:
+ # my $pluginName = $self->{'name'};
+ #
+ # # get our own base path:
+ # my $pluginBasePath = "$openslxBasePath/lib/plugins/$pluginName";
+ #
+ # # copy all needed files now:
+ # foreach my $file ( qw( file1, file2 ) ) {
+ # copyFile("$pluginBasePath/$file", "$pluginRepoPath/");
+ # }
+
+ # name of current os
+ # my $vendorOSName = $self->{'os-plugin-engine'}->{'vendor-os-name'}
+
+ return;
+}
+
+sub removalPhase
+{ # called while chrooted to the vendor-OS root in order to give the plugin
+ # a chance to uninstall no longer required files from the vendor-OS.
+ my $self = shift;
+ my $info = shift;
+
+ my $pluginRepoPath = $info->{'plugin-repo-path'};
+ # The folder where the stage1-plugin should store all files
+ # required by the corresponding stage3 runlevel script.
+ # As this method is being executed while chrooted into the vendor-OS,
+ # this path is relative to that root (i.e. directly usable).
+ my $pluginTempPath = $info->{'plugin-temp-path'};
+ # A temporary playground that will be cleaned up automatically.
+ # As this method is being executed while chrooted into the vendor-OS,
+ # this path is relative to that root (i.e. directly usable).
+
+ return;
+}
+
+1;
diff --git a/src/os-plugins/plugins/example/XX_example.sh b/src/os-plugins/plugins/example/XX_example.sh
new file mode 100644
index 00000000..18f2e47d
--- /dev/null
+++ b/src/os-plugins/plugins/example/XX_example.sh
@@ -0,0 +1,47 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# stage3 part of 'example' plugin - the runlevel script
+#
+# This basically is a runlevel script (just like you know them from 'init'),
+# whose purpose is to activate the plugin in stage3. The 'XX' at the beginning
+# of the filename will be replaced with a runlevel precedence number taken
+# from the configuration of the respective plugin. All plugin runlevel scripts
+# will be executed in the order of those precedence numbers.
+#
+# In order to activate the corresponding plugin, each runlevel script should:
+#
+# a) read the corresponding configuration file (in this case:
+# /initramfs/plugin-conf/example.conf)
+#
+# b) analyse the client (look at the available hardware) and decide what
+# needs to be done, taking into account the settings given in the config
+# file
+#
+# c) activate the plugin by copying/linking appropriate plugin-specific files
+# (in this case: from /mnt/opt/openslx/plugins/example/), load required kernel
+# modules and whatever else might be necessary.
+#
+# if you have any questions regarding the use of this file, please drop a mail
+# to: ot@openslx.com, or join the IRC-channel '#openslx' (on freenode).
+#
+# script is included from init via the "." load function - thus it has all
+# variables and functions available
+
+if [ -e /initramfs/plugin-conf/example.conf ]; then
+ . /initramfs/plugin-conf/example.conf
+ if [ $example_active -ne 0 ]; then
+ [ $DEBUGLEVEL -gt 0 ] && echo "executing the 'example' os-plugin ...";
+
+ # for this example plugin, we simply take a filename from the
+ # configuration and cat that file (output the smiley):
+ cat /mnt/opt/openslx/plugin-repo/example/$preferred_side
+
+ [ $DEBUGLEVEL -gt 0 ] && echo "done with 'example' os-plugin ...";
+ fi
+fi
diff --git a/src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Base.pm b/src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Base.pm
new file mode 100644
index 00000000..83570d7d
--- /dev/null
+++ b/src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Base.pm
@@ -0,0 +1,60 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# infoscreen/OpenSLX/Distro/Base.pm
+# - provides base implementation of the Distro API for the infoscreen plugin.
+# -----------------------------------------------------------------------------
+package infoscreen::OpenSLX::Distro::Base;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+use Scalar::Util qw( weaken );
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {};
+ return bless $self, $class;
+}
+
+sub initialize
+{
+ my $self = shift;
+ $self->{engine} = shift;
+ weaken($self->{engine});
+ # avoid circular reference between plugin and its engine
+
+ return 1;
+}
+
+sub getRequirements
+{
+ my $self = shift;
+
+ return ('libxml2', 'libcurl', 'libimlib2', 'libx11');
+}
+
+sub getPackagemanagerCommand
+{
+ my $self = shift;
+
+ return "yum install";
+}
+
+1;
diff --git a/src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Debian.pm b/src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Debian.pm
new file mode 100644
index 00000000..6ac025f5
--- /dev/null
+++ b/src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Debian.pm
@@ -0,0 +1,32 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# infoscreen/OpenSLX/Distro/Debian.pm
+# - provides Debian-specific overrides of the Distro API for the infoscreen
+# plugin.
+# -----------------------------------------------------------------------------
+package infoscreen::OpenSLX::Distro::Debian;
+
+use strict;
+use warnings;
+
+use base qw(infoscreen::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+
+
+
+1;
diff --git a/src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Fedora.pm b/src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Fedora.pm
new file mode 100644
index 00000000..a4252b62
--- /dev/null
+++ b/src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Fedora.pm
@@ -0,0 +1,32 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# infoscreen/OpenSLX/Distro/Fedora.pm
+# - provides Fedora-specific overrides of the Distro API for the infoscreen
+# plugin.
+# -----------------------------------------------------------------------------
+package infoscreen::OpenSLX::Distro::Fedora;
+
+use strict;
+use warnings;
+
+use base qw(infoscreen::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+
+
+
+1;
diff --git a/src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Gentoo.pm b/src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Gentoo.pm
new file mode 100644
index 00000000..c2730674
--- /dev/null
+++ b/src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Gentoo.pm
@@ -0,0 +1,32 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# infoscreen/OpenSLX/Distro/Gentoo.pm
+# - provides Gentoo-specific overrides of the Distro API for the infoscreen
+# plugin.
+# -----------------------------------------------------------------------------
+package infoscreen::OpenSLX::Distro::Gentoo;
+
+use strict;
+use warnings;
+
+use base qw(infoscreen::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+
+
+
+1;
diff --git a/src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Scilin.pm b/src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Scilin.pm
new file mode 100644
index 00000000..e89d6d88
--- /dev/null
+++ b/src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Scilin.pm
@@ -0,0 +1,32 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# infoscreen/OpenSLX/Distro/Scilin.pm
+# - provides Scilin-specific overrides of the Distro API for the infoscreen
+# plugin.
+# -----------------------------------------------------------------------------
+package infoscreen::OpenSLX::Distro::Scilin;
+
+use strict;
+use warnings;
+
+use base qw(infoscreen::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+
+
+
+1;
diff --git a/src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Suse.pm b/src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Suse.pm
new file mode 100644
index 00000000..21d02fbb
--- /dev/null
+++ b/src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Suse.pm
@@ -0,0 +1,32 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# infoscreen/OpenSLX/Distro/Suse.pm
+# - provides Suse-specific overrides of the Distro API for the infoscreen
+# plugin.
+# -----------------------------------------------------------------------------
+package infoscreen::OpenSLX::Distro::Suse;
+
+use strict;
+use warnings;
+
+use base qw(infoscreen::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+
+
+
+1;
diff --git a/src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Ubuntu.pm b/src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Ubuntu.pm
new file mode 100644
index 00000000..10360825
--- /dev/null
+++ b/src/os-plugins/plugins/infoscreen/OpenSLX/Distro/Ubuntu.pm
@@ -0,0 +1,44 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# infoscreen/OpenSLX/Distro/Ubuntu.pm
+# - provides Debian-specific overrides of the Distro API for the infoscreen
+# plugin.
+# -----------------------------------------------------------------------------
+package infoscreen::OpenSLX::Distro::Ubuntu;
+
+use strict;
+use warnings;
+
+use base qw(infoscreen::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub getRequirements
+{
+ my $self = shift;
+
+ return ('libxml2', 'libcurl3', 'libimlib2', 'libx11-6');
+}
+
+sub getPackagemanagerCommand
+{
+ my $self = shift;
+
+ return "aptitude install";
+}
+
+
+1;
diff --git a/src/os-plugins/plugins/infoscreen/OpenSLX/OSPlugin/infoscreen.pm b/src/os-plugins/plugins/infoscreen/OpenSLX/OSPlugin/infoscreen.pm
new file mode 100644
index 00000000..dadd8fe0
--- /dev/null
+++ b/src/os-plugins/plugins/infoscreen/OpenSLX/OSPlugin/infoscreen.pm
@@ -0,0 +1,112 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# infoscreen.pm
+# -----------------------------------------------------------------------------
+package OpenSLX::OSPlugin::infoscreen;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSPlugin::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+# if you have any questions regarding the concept of OS-plugins and their
+# implementation, please drop a mail to: ot@openslx.com, or join the IRC-channel
+# '#openslx' (on freenode).
+################################################################################
+sub new
+{
+ my $class = shift;
+
+ my $self = {
+ name => 'infoscreen',
+ };
+
+ return bless $self, $class;
+}
+
+sub getInfo
+{
+ my $self = shift;
+
+ return {
+ description => unshiftHereDoc(<<' End-of-Here'),
+ infoscreen plugin ..
+ End-of-Here
+ precedence => 82,
+ };
+}
+
+sub getAttrInfo
+{
+ my $self = shift;
+
+ return {
+ # attribute 'active' is mandatory for all plugins
+ 'infoscreen::active' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should the 'infoscreen'-plugin be executed during boot?
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '1 means active - 0 means inactive',
+ default => '1',
+ },
+ };
+}
+
+sub installationPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ my $pluginRepoPath = $info->{'plugin-repo-path'};
+ my $pluginTempPath = $info->{'plugin-temp-path'};
+ my $openslxBasePath = $info->{'openslx-base-path'};
+ my $openslxConfigPath = $info->{'openslx-config-path'};
+ my $attrs = $info->{'plugin-attrs'};
+
+ my $filesDir = "$openslxBasePath/lib/plugins/infoscreen/files";
+
+ copyFile("$filesDir/empty.xbm","$pluginRepoPath");
+ copyFile("$filesDir/kiosk.dpms","$pluginRepoPath");
+
+
+ my @requirements = $self->{distro}->getRequirements();
+
+ my $pcmd = $self->{distro}->getPackagemanagerCommand();
+ my $req = join(' ', @requirements);
+
+ slxsystem("$pcmd $req") or _tr(
+ "failed to install requirements"
+ );
+
+ slxsystem("tar -xzf $filesDir/infoscreenClient.tgz -C / ");
+
+ return;
+}
+
+sub removalPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ my $pluginRepoPath = $info->{'plugin-repo-path'};
+ my $pluginTempPath = $info->{'plugin-temp-path'};
+
+ return;
+}
+
+1;
diff --git a/src/os-plugins/plugins/infoscreen/XX_infoscreen.sh b/src/os-plugins/plugins/infoscreen/XX_infoscreen.sh
new file mode 100644
index 00000000..e2176387
--- /dev/null
+++ b/src/os-plugins/plugins/infoscreen/XX_infoscreen.sh
@@ -0,0 +1,58 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# script is included from init via the "." load function - thus it has all
+# variables and functions available
+
+# check if the plugin config directory is generally available or if the client
+# configuration failed somehow
+[ -d /initramfs/plugin-conf ] || error "${init_picfg}" nonfatal
+
+# main script
+if [ -e /initramfs/plugin-conf/infoscreen.conf ]; then
+ . /initramfs/plugin-conf/infoscreen.conf
+
+ if [ $infoscreen_active -ne 0 ]; then
+ [ $DEBUGLEVEL -gt 0 ] && echo "executing the 'infoscreen' os-plugin ...";
+
+ ln -sf /opt/openslx/plugin-repo/infoscreen/kiosk.dpms \
+ /mnt/bin/kiosk.dpms
+
+ # prepare xsession
+ echo "#!/bin/bash" \
+ > /mnt/home/kiosk/.xinitrc
+ echo "xhost +local:" \
+ >> /mnt/home/kiosk/.xinitrc
+ echo "xsetroot -cursor /opt/openslx/plugin-repo/infoscreen/empty.xbm \\" \
+ >> /mnt/home/kiosk/.xinitrc
+ echo "/opt/openslx/plugin-repo/infoscreen/empty.xbm" \
+ >> /mnt/home/kiosk/.xinitrc
+ echo "/usr/bin/dpclient" \
+ >> /mnt/home/kiosk/.xinitrc
+
+ # remove Standby
+ sed -r "s,(Option.*\"(Blank|Standby|Suspend|Off)Time\"[^\"]*)(.*),\1 \"0\" # disabled by infoscreen \3," \
+ -i /mnt/etc/X11/xorg.conf
+ sed -r "s,(Option.*\"(blank|standby|suspend|off) time\"[^\"]*)(.*),\1 \"0\" # disabled by infoscreen \3," \
+ -i /mnt/etc/X11/xorg.conf
+
+ # energy safe
+ # (requires "xhost +local:")
+ sed -r "s,(Section \"Module\"),\1\n Load \"dpms\"," -i /mnt/etc/X11/xorg.conf
+ echo "0 22 * * * root /bin/kiosk.dpms sleep" >> /mnt/etc/crontab
+ echo "0 7 * * * root /bin/kiosk.dpms wakeup" >> /mnt/etc/crontab
+
+
+
+ [ $DEBUGLEVEL -gt 0 ] && echo "done with 'infoscreen' os-plugin ...";
+
+ fi
+
+fi
diff --git a/src/os-plugins/plugins/infoscreen/files/empty.xbm b/src/os-plugins/plugins/infoscreen/files/empty.xbm
new file mode 100644
index 00000000..73b5f706
--- /dev/null
+++ b/src/os-plugins/plugins/infoscreen/files/empty.xbm
@@ -0,0 +1,6 @@
+#define empty_width 16
+#define empty_height 16
+static unsigned char empty_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/src/os-plugins/plugins/infoscreen/files/infoscreenClient.tgz b/src/os-plugins/plugins/infoscreen/files/infoscreenClient.tgz
new file mode 100644
index 00000000..d1a932c0
--- /dev/null
+++ b/src/os-plugins/plugins/infoscreen/files/infoscreenClient.tgz
Binary files differ
diff --git a/src/os-plugins/plugins/infoscreen/files/kiosk.dpms b/src/os-plugins/plugins/infoscreen/files/kiosk.dpms
new file mode 100755
index 00000000..d8fd57c5
--- /dev/null
+++ b/src/os-plugins/plugins/infoscreen/files/kiosk.dpms
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+case "$1" in
+ "sleep")
+ xset -display :0 dpms force off
+ xset -display :0 dpms 0 0 0
+ exit 0
+ ;;
+ "wakeup")
+ xset -display :0 dpms force on
+ xset -display :0 dpms 0 0 0
+ xset -display :0 s reset
+ xset -display :0 s noblank
+ xset -display :0 s noexpose
+ xset -display :0 s 0 0
+ xset -display :0 s off
+ xset -display :0 -dpms
+ exit 0
+ ;;
+ *)
+ echo "Usage: kiosk.dpms <command>"
+ echo "Commands"
+ echo " sleep : shut monitor down"
+ echo " wakeup : wake monitor up"
+ exit 0
+ ;;
+esac
diff --git a/src/os-plugins/plugins/kiosk/OpenSLX/Distro/Base.pm b/src/os-plugins/plugins/kiosk/OpenSLX/Distro/Base.pm
new file mode 100644
index 00000000..8f7e506d
--- /dev/null
+++ b/src/os-plugins/plugins/kiosk/OpenSLX/Distro/Base.pm
@@ -0,0 +1,65 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# kiosk/OpenSLX/Distro/Base.pm
+# - provides base implementation of the Distro API for the kiosk plugin.
+# -----------------------------------------------------------------------------
+package kiosk::OpenSLX::Distro::Base;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+use Scalar::Util qw( weaken );
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {};
+ return bless $self, $class;
+}
+
+sub initialize
+{
+ my $self = shift;
+ $self->{engine} = shift;
+ weaken($self->{engine});
+ # avoid circular reference between plugin and its engine
+
+ return 1;
+}
+
+sub getKgettySetupScript
+{
+ my $self = shift;
+
+ my $script = unshiftHereDoc(<<" End-of-Here");
+ #!/bin/sh
+ # written by OpenSLX-plugin 'kiosk'
+
+ kgettyCmd=\$1
+ sed -i /mnt/etc/inittab \\
+ -e "s,^\(1:[^:]*:respawn\):.*tty1,\\1:\$kgettyCmd,"
+
+ End-of-Here
+
+ return $script;
+
+}
+
+
+1;
diff --git a/src/os-plugins/plugins/kiosk/OpenSLX/Distro/Debian.pm b/src/os-plugins/plugins/kiosk/OpenSLX/Distro/Debian.pm
new file mode 100644
index 00000000..08bb18e7
--- /dev/null
+++ b/src/os-plugins/plugins/kiosk/OpenSLX/Distro/Debian.pm
@@ -0,0 +1,32 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# kiosk/OpenSLX/Distro/Debian.pm
+# - provides Debian-specific overrides of the Distro API for the kiosk
+# plugin.
+# -----------------------------------------------------------------------------
+package kiosk::OpenSLX::Distro::Debian;
+
+use strict;
+use warnings;
+
+use base qw(kiosk::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+
+
+
+1;
diff --git a/src/os-plugins/plugins/kiosk/OpenSLX/Distro/Fedora.pm b/src/os-plugins/plugins/kiosk/OpenSLX/Distro/Fedora.pm
new file mode 100644
index 00000000..2b9f8ff5
--- /dev/null
+++ b/src/os-plugins/plugins/kiosk/OpenSLX/Distro/Fedora.pm
@@ -0,0 +1,32 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# kiosk/OpenSLX/Distro/Fedora.pm
+# - provides Fedora-specific overrides of the Distro API for the kiosk
+# plugin.
+# -----------------------------------------------------------------------------
+package kiosk::OpenSLX::Distro::Fedora;
+
+use strict;
+use warnings;
+
+use base qw(kiosk::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+
+
+
+1;
diff --git a/src/os-plugins/plugins/kiosk/OpenSLX/Distro/Gentoo.pm b/src/os-plugins/plugins/kiosk/OpenSLX/Distro/Gentoo.pm
new file mode 100644
index 00000000..c3133f07
--- /dev/null
+++ b/src/os-plugins/plugins/kiosk/OpenSLX/Distro/Gentoo.pm
@@ -0,0 +1,32 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# kiosk/OpenSLX/Distro/Gentoo.pm
+# - provides Gentoo-specific overrides of the Distro API for the kiosk
+# plugin.
+# -----------------------------------------------------------------------------
+package kiosk::OpenSLX::Distro::Gentoo;
+
+use strict;
+use warnings;
+
+use base qw(kiosk::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+
+
+
+1;
diff --git a/src/os-plugins/plugins/kiosk/OpenSLX/Distro/Scilin.pm b/src/os-plugins/plugins/kiosk/OpenSLX/Distro/Scilin.pm
new file mode 100644
index 00000000..7423a3b8
--- /dev/null
+++ b/src/os-plugins/plugins/kiosk/OpenSLX/Distro/Scilin.pm
@@ -0,0 +1,32 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# kiosk/OpenSLX/Distro/Scilin.pm
+# - provides Scilin-specific overrides of the Distro API for the kiosk
+# plugin.
+# -----------------------------------------------------------------------------
+package kiosk::OpenSLX::Distro::Scilin;
+
+use strict;
+use warnings;
+
+use base qw(kiosk::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+
+
+
+1;
diff --git a/src/os-plugins/plugins/kiosk/OpenSLX/Distro/Suse.pm b/src/os-plugins/plugins/kiosk/OpenSLX/Distro/Suse.pm
new file mode 100644
index 00000000..587d6db3
--- /dev/null
+++ b/src/os-plugins/plugins/kiosk/OpenSLX/Distro/Suse.pm
@@ -0,0 +1,32 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# kiosk/OpenSLX/Distro/Suse.pm
+# - provides Suse-specific overrides of the Distro API for the kiosk
+# plugin.
+# -----------------------------------------------------------------------------
+package kiosk::OpenSLX::Distro::Suse;
+
+use strict;
+use warnings;
+
+use base qw(kiosk::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+
+
+
+1;
diff --git a/src/os-plugins/plugins/kiosk/OpenSLX/Distro/Ubuntu.pm b/src/os-plugins/plugins/kiosk/OpenSLX/Distro/Ubuntu.pm
new file mode 100644
index 00000000..b8fcb25b
--- /dev/null
+++ b/src/os-plugins/plugins/kiosk/OpenSLX/Distro/Ubuntu.pm
@@ -0,0 +1,47 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# kiosk/OpenSLX/Distro/Ubuntu.pm
+# - provides Debian-specific overrides of the Distro API for the kiosk
+# plugin.
+# -----------------------------------------------------------------------------
+package kiosk::OpenSLX::Distro::Ubuntu;
+
+use strict;
+use warnings;
+
+use base qw(kiosk::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub getKgettySetupScript
+{
+ my $self = shift;
+
+ my $script = unshiftHereDoc(<<" End-of-Here");
+ #!/bin/sh
+ # written by OpenSLX-plugin 'kiosk'
+
+ kgettyCmd=\$1
+ sed -i /mnt/etc/event.d/tty1 \\
+ -e "s,exec.*,exec \$kgettyCmd,"
+
+ End-of-Here
+
+ return $script;
+
+}
+
+1;
diff --git a/src/os-plugins/plugins/kiosk/OpenSLX/OSPlugin/kiosk.pm b/src/os-plugins/plugins/kiosk/OpenSLX/OSPlugin/kiosk.pm
new file mode 100644
index 00000000..bfeeae0a
--- /dev/null
+++ b/src/os-plugins/plugins/kiosk/OpenSLX/OSPlugin/kiosk.pm
@@ -0,0 +1,123 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# kiosk.pm
+# -----------------------------------------------------------------------------
+package OpenSLX::OSPlugin::kiosk;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSPlugin::Base);
+
+use File::Path;
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+# if you have any questions regarding the concept of OS-plugins and their
+# implementation, please drop a mail to: ot@openslx.com, or join the IRC-channel
+# '#openslx' (on freenode).
+################################################################################
+sub new
+{
+ my $class = shift;
+
+ my $self = {
+ name => 'kiosk',
+ };
+
+ mkpath("$openslxConfig{'config-path'}/plugins/kiosk/profiles");
+
+ return bless $self, $class;
+}
+
+sub getInfo
+{
+ my $self = shift;
+
+ return {
+ description => unshiftHereDoc(<<' End-of-Here'),
+ kiosk plugin ..
+ End-of-Here
+ precedence => 50,
+ };
+}
+
+sub getAttrInfo
+{
+ my $self = shift;
+
+ return {
+ # attribute 'active' is mandatory for all plugins
+ 'kiosk::active' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should the 'kiosk'-plugin be executed during boot?
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '1 means active - 0 means inactive',
+ default => '1',
+ },
+ 'kiosk::profile' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should the 'kiosk'-plugin setup a specific profile for the
+ kiosk user? (profile data should be placed in
+ /etc/opt/openslx/plugins/kiosk/profiles/<profilename>/)
+ End-of-Here
+ #content_regex => qr{^(0|1)$},
+ content_descr => 'name of profile',
+ default => 'plain',
+ },
+ };
+}
+
+sub installationPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ my $pluginRepoPath = $info->{'plugin-repo-path'};
+ my $pluginTempPath = $info->{'plugin-temp-path'};
+ my $openslxBasePath = $info->{'openslx-base-path'};
+ my $openslxConfigPath = $info->{'openslx-config-path'};
+ my $attrs = $info->{'plugin-attrs'};
+
+ my $filesDir = "$openslxBasePath/lib/plugins/kiosk/files";
+
+ copyFile("$filesDir/kgetty","$pluginRepoPath");
+
+ system(qq{cp -r $filesDir/profiles/* $openslxConfig{'config-path'}/plugins/kiosk/profiles/});
+
+ my $scriptpath = "$pluginRepoPath/setup.kgetty";
+ my $script = $self->{distro}->getKgettySetupScript();
+
+ spitFile($scriptpath, $script);
+ chmod (0744, "$scriptpath");
+
+ return;
+}
+
+sub removalPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ my $pluginRepoPath = $info->{'plugin-repo-path'};
+ my $pluginTempPath = $info->{'plugin-temp-path'};
+
+ return;
+}
+
+1;
diff --git a/src/os-plugins/plugins/kiosk/XX_kiosk.sh b/src/os-plugins/plugins/kiosk/XX_kiosk.sh
new file mode 100644
index 00000000..c7e275ad
--- /dev/null
+++ b/src/os-plugins/plugins/kiosk/XX_kiosk.sh
@@ -0,0 +1,60 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# script is included from init via the "." load function - thus it has all
+# variables and functions available
+
+# check if the plugin config directory is generally available or if the client
+# configuration failed somehow
+[ -d /initramfs/plugin-conf ] || error "${init_picfg}" nonfatal
+
+# main script
+if [ -e /initramfs/plugin-conf/kiosk.conf ]; then
+ . /initramfs/plugin-conf/kiosk.conf
+
+ if [ $kiosk_active -ne 0 ]; then
+ [ $DEBUGLEVEL -gt 0 ] && echo "executing the 'kiosk' os-plugin ...";
+
+
+ profile_path="/etc/opt/openslx/plugins/kiosk/profiles/"
+
+ # avoid ldap conflicts - part I
+ # hide nsswitch.conf
+ if [ -e /mnt/etc/nsswitch.conf ]; then
+ mv /mnt/etc/nsswitch.conf /mnt/etc/nsswitch.conf.bak
+ fi
+
+ if [ -e /mnt/$profile_path/$kiosk_profile/ ]; then
+ # create new user
+ chroot /mnt useradd -s /bin/bash -k $profile_path/$kiosk_profile/ -m kiosk
+ chroot /mnt chown kiosk /home/kiosk/ -R
+ else
+ chroot /mnt useradd -s /bin/bash -k $profile_path/plain/ -m kiosk
+ fi
+
+ # avoid ldap conflicts - part II
+ # restore old nsswitch setup
+ if [ -e /mnt/etc/nsswitch.conf.bak ]; then
+ mv /mnt/etc/nsswitch.conf.bak /mnt/etc/nsswitch.conf
+ fi
+
+ # setup custom rungetty
+ mkdir -p /mnt/root/bin
+ ln -sf /opt/openslx/plugin-repo/kiosk/kgetty /mnt/root/bin/kgetty
+
+ kgettycmd="/root/bin/kgetty --autologin kiosk tty1"
+
+ /mnt/opt/openslx/plugin-repo/kiosk/setup.kgetty "$kgettycmd"
+
+ [ $DEBUGLEVEL -gt 0 ] && echo "done with 'kiosk' os-plugin ...";
+
+ fi
+
+fi
diff --git a/src/os-plugins/plugins/kiosk/files/kgetty b/src/os-plugins/plugins/kiosk/files/kgetty
new file mode 100755
index 00000000..a65d96de
--- /dev/null
+++ b/src/os-plugins/plugins/kiosk/files/kgetty
Binary files differ
diff --git a/src/os-plugins/plugins/kiosk/files/profiles/plain/.bashrc b/src/os-plugins/plugins/kiosk/files/profiles/plain/.bashrc
new file mode 120000
index 00000000..cee304e6
--- /dev/null
+++ b/src/os-plugins/plugins/kiosk/files/profiles/plain/.bashrc
@@ -0,0 +1 @@
+bashrc \ No newline at end of file
diff --git a/src/os-plugins/plugins/kiosk/files/profiles/plain/bashrc b/src/os-plugins/plugins/kiosk/files/profiles/plain/bashrc
new file mode 100644
index 00000000..28694f85
--- /dev/null
+++ b/src/os-plugins/plugins/kiosk/files/profiles/plain/bashrc
@@ -0,0 +1,4 @@
+if [ "x$(tty)" == "x/dev/tty1" ]; then
+ startx
+ exit
+fi
diff --git a/src/os-plugins/plugins/kiosk/files/profiles/vmchooser/.bash_profile b/src/os-plugins/plugins/kiosk/files/profiles/vmchooser/.bash_profile
new file mode 100644
index 00000000..099cd106
--- /dev/null
+++ b/src/os-plugins/plugins/kiosk/files/profiles/vmchooser/.bash_profile
@@ -0,0 +1,2 @@
+# fix for some systems which don't source .bashrc automatically
+. ~/.bashrc \ No newline at end of file
diff --git a/src/os-plugins/plugins/kiosk/files/profiles/vmchooser/.bashrc b/src/os-plugins/plugins/kiosk/files/profiles/vmchooser/.bashrc
new file mode 120000
index 00000000..cee304e6
--- /dev/null
+++ b/src/os-plugins/plugins/kiosk/files/profiles/vmchooser/.bashrc
@@ -0,0 +1 @@
+bashrc \ No newline at end of file
diff --git a/src/os-plugins/plugins/kiosk/files/profiles/vmchooser/.xinitrc b/src/os-plugins/plugins/kiosk/files/profiles/vmchooser/.xinitrc
new file mode 120000
index 00000000..5539532c
--- /dev/null
+++ b/src/os-plugins/plugins/kiosk/files/profiles/vmchooser/.xinitrc
@@ -0,0 +1 @@
+xinitrc \ No newline at end of file
diff --git a/src/os-plugins/plugins/kiosk/files/profiles/vmchooser/bashrc b/src/os-plugins/plugins/kiosk/files/profiles/vmchooser/bashrc
new file mode 100644
index 00000000..28694f85
--- /dev/null
+++ b/src/os-plugins/plugins/kiosk/files/profiles/vmchooser/bashrc
@@ -0,0 +1,4 @@
+if [ "x$(tty)" == "x/dev/tty1" ]; then
+ startx
+ exit
+fi
diff --git a/src/os-plugins/plugins/kiosk/files/profiles/vmchooser/xinitrc b/src/os-plugins/plugins/kiosk/files/profiles/vmchooser/xinitrc
new file mode 100644
index 00000000..7774f4d2
--- /dev/null
+++ b/src/os-plugins/plugins/kiosk/files/profiles/vmchooser/xinitrc
@@ -0,0 +1,7 @@
+# check if we need to include Xsession script generated by out profile
+# plugin
+[ -e /etc/X11/Xsession.d/10slx-home_env ] && \
+ . /etc/X11/Xsession.d/10slx-home_env
+
+/usr/bin/xsetroot -solid navy
+/opt/openslx/plugin-repo/vmchooser/vmchooser -p /dev/null \ No newline at end of file
diff --git a/src/os-plugins/plugins/openvz/OpenSLX/OSPlugin/openvz.pm b/src/os-plugins/plugins/openvz/OpenSLX/OSPlugin/openvz.pm
new file mode 100644
index 00000000..35e12bb2
--- /dev/null
+++ b/src/os-plugins/plugins/openvz/OpenSLX/OSPlugin/openvz.pm
@@ -0,0 +1,110 @@
+# Copyright (c) 2010 - RZ Uni Freiburg
+# Copyright (c) 2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# openvz.pm
+# - implementation of the 'openvz' plugin
+# -----------------------------------------------------------------------------
+package OpenSLX::OSPlugin::openvz;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSPlugin::Base);
+
+use File::Path;
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+sub new
+{
+ my $class = shift;
+
+ my $self = {
+ name => 'openvz',
+ };
+
+ return bless $self, $class;
+}
+
+sub getInfo
+{
+ my $self = shift;
+
+ return {
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Configures openVZ diskless boot, no installation yet.
+ End-of-Here
+ precedence => 20,
+ };
+}
+
+sub getAttrInfo
+{
+ my $self = shift;
+
+ return {
+ 'openvz::active' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should the 'openvz'-plugin be executed during boot?
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '1 means active - 0 means inactive',
+ # set active to 0, later set specially created openVZ system to 1
+ default => '0',
+ },
+ # attribute 'imagesrc' defines where we can find openvz images
+ 'openvz::imagesrc' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Where do we store our openvz images? NFS? Filesystem?
+ End-of-Here
+ content_regex => qr{^(/|nfs://)},
+ content_descr => 'local path or URI or "-" (unset)',
+ default => undef,
+ },
+ };
+}
+
+sub installationPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ $self->{pluginRepositoryPath} = $info->{'plugin-repo-path'};
+ $self->{openslxBasePath} = $info->{'openslx-base-path'};
+
+ # Copy run-virt.include and template files to the appropriate place for
+ # inclusion in stage4
+ my $pluginName = $self->{'name'};
+ my $pluginBasePath =
+ "$self->{openslxBasePath}/lib/plugins/$pluginName/files";
+
+ foreach my $file ( qw( run-virt.include machine.include ) ) {
+ copyFile("$pluginBasePath/$file", "$self->{pluginRepositoryPath}/");
+ chmod 0644, "$self->{pluginRepositoryPath}/$file";
+ }
+
+ return;
+}
+
+sub removalPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ return;
+}
+
+1;
diff --git a/src/os-plugins/plugins/openvz/XX_openvz.sh b/src/os-plugins/plugins/openvz/XX_openvz.sh
new file mode 100644
index 00000000..721c76a4
--- /dev/null
+++ b/src/os-plugins/plugins/openvz/XX_openvz.sh
@@ -0,0 +1,66 @@
+# Copyright (c) 2010 - RZ Uni Freiburg
+# Copyright (c) 2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# stage3 part of 'openvz' plugin - the runlevel script
+#
+# script is included from init via the "." load function - thus it has all
+# variables and functions available
+
+# include default directories
+. /etc/openslx.conf
+
+CONFFILE=/initramfs/plugin-conf/openvz.conf
+PLUGINCONFDIR=/mnt/${OPENSLX_DEFAULT_CONFDIR}/plugins/openvz
+PLUGINDIR=/mnt/${OPENSLX_DEFAULT_DIR}/plugin-repo/openvz
+VIRTDIR=/mnt/${OPENSLX_DEFAULT_VIRTDIR}/openvz
+
+# check if the configuration file is available
+if [ -e ${CONFFILE} ]; then
+
+ # load needed variables
+ . ${CONFFILE}
+
+ # Test if this plugin is activated... more or less useless with the
+ # new plugin system
+ if [ $openvz_active -ne 0 2>/dev/null ]; then
+
+ [ $DEBUGLEVEL -gt 0 ] && echo "executing the 'openvz' os-plugin ...";
+
+ # load general configuration
+ . /etc/initramfs-setup
+
+ # get source of openvz image server (get type, server and path)
+ if strinstr "/" "${openvz_imagesrc}" ; then
+ vbimgprot=$(uri_token ${openvz_imagesrc} prot)
+ vbimgserv=$(uri_token ${openvz_imagesrc} server)
+ vbimgpath="$(uri_token ${openvz_imagesrc} path)"
+ fi
+ if [ -n "${vbimgserv}" ] ; then
+ # directory where qemu images are expected in
+ mnttarget=${VIRTDIR}
+ # mount the openvz image source readonly (ro)
+ fsmount ${vbimgprot} ${vbimgserv} ${vbimgpath} ${mnttarget} ro
+ else
+ [ $DEBUGLEVEL -gt 1 ] && \
+ error " * Incomplete information in variable ${openvz_imagesrc}." \
+ nonfatal
+ fi
+
+ # copy virtualization include files to config dir
+ testmkd ${PLUGINCONFDIR}
+ cp ${PLUGINDIR}/*.include ${PLUGINCONFDIR}
+ # copy ${CONFFILE} to ${PLUGINCONFDIR} just in case
+ cp ${CONFFILE} ${PLUGINCONFDIR}
+
+ # activate init files
+
+ fi
+fi
diff --git a/src/os-plugins/plugins/openvz/files/machine.include b/src/os-plugins/plugins/openvz/files/machine.include
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/src/os-plugins/plugins/openvz/files/machine.include
diff --git a/src/os-plugins/plugins/openvz/files/run-virt.include b/src/os-plugins/plugins/openvz/files/run-virt.include
new file mode 100644
index 00000000..53c982c8
--- /dev/null
+++ b/src/os-plugins/plugins/openvz/files/run-virt.include
@@ -0,0 +1,37 @@
+# run-virt.include
+# -----------------------------------------------------------------------------
+# Copyright (c) 2010 - RZ Uni Freiburg
+# Copyright (c) 2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+# -----------------------------------------------------------------------------
+# run-virt.include
+# - Include script for running openVZ on an OpenSLX client via run-virt.sh or
+# run-vmgrid.sh
+################################################################################
+
+################################################################################
+### Include general configuration
+################################################################################
+if [ -f ${OPENSLX_DEFAULT_CONFDIR}/plugins/${self}/${self}.conf ]; then
+ . ${OPENSLX_DEFAULT_CONFDIR}/plugins/${self}/${self}.conf
+else
+ writelog "Problems reading config file of ${self} plugin"
+ exit 1
+fi
+
+################################################################################
+### Declaration of default variables
+################################################################################
+
+PLUGINCONFXEN="${PLUGINCONFROOT}/${self}"
+# create TMPDIR for all users
+mkdir -m 1777 /tmp/${self} 2>/dev/null
+# dir for configs
+confdir="/tmp/${self}/${USER}/${VM_ID}"
diff --git a/src/os-plugins/plugins/openvz/init-hooks/20-nw-bridge-config/bridge.sh b/src/os-plugins/plugins/openvz/init-hooks/20-nw-bridge-config/bridge.sh
new file mode 100755
index 00000000..d5245234
--- /dev/null
+++ b/src/os-plugins/plugins/openvz/init-hooks/20-nw-bridge-config/bridge.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# Init hook to create a bridge on the active network interface
+# (should be kept identical to the files of virtualbox and qemukvm plugins)
+#############################################################################
+
+local bridge=br0
+local brnwif=${nwif}
+local nwifmac=${macaddr}
+
+# bridge 0 already defined or some other problem
+brctl addbr ${bridge} || exit 0
+brctl stp ${bridge} 0
+brctl setfd ${bridge} 0.000000000001
+ip link set addr ${nwifmac} ${bridge}
+ip link set dev ${nwif} up
+brctl addif ${bridge} ${nwif}
+
+# fixme: sending back the variable to init does not work properly at the
+# moment
+nwif=${bridge}
diff --git a/src/os-plugins/plugins/profile/OpenSLX/Distro/Base.pm b/src/os-plugins/plugins/profile/OpenSLX/Distro/Base.pm
new file mode 100644
index 00000000..5588a177
--- /dev/null
+++ b/src/os-plugins/plugins/profile/OpenSLX/Distro/Base.pm
@@ -0,0 +1,84 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# profile/OpenSLX/Distro/Base.pm
+# - provides base implementation of the Distro API for the profile plugin.
+# -----------------------------------------------------------------------------
+package profile::OpenSLX::Distro::Base;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+use Scalar::Util qw( weaken );
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {};
+ return bless $self, $class;
+}
+
+sub initialize
+{
+ my $self = shift;
+ $self->{engine} = shift;
+ weaken($self->{engine});
+ # avoid circular reference between plugin and its engine
+
+ return 1;
+}
+
+sub getXsessionDPath
+{
+ my $self = shift;
+
+ return "/etc/X11/Xsession.d/10slx-home_env";
+}
+
+
+sub getProfileDPAth
+{
+ my $self = shift;
+
+ return "/etc/profile.d/slx-kdehome.sh";
+}
+
+sub getKdeHome
+{
+ my $self = shift;
+
+ return ".openslx/unknown/kde";
+}
+
+sub getGconfPathConfig
+{
+ my $self = shift;
+
+ return "/etc/gconf/2/path";
+}
+
+
+sub getGconfHome
+{
+ my $self = shift;
+
+ return ".openslx/unknown/gconf";
+}
+
+
+1;
diff --git a/src/os-plugins/plugins/profile/OpenSLX/Distro/Debian.pm b/src/os-plugins/plugins/profile/OpenSLX/Distro/Debian.pm
new file mode 100644
index 00000000..31ca1e8e
--- /dev/null
+++ b/src/os-plugins/plugins/profile/OpenSLX/Distro/Debian.pm
@@ -0,0 +1,32 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# profile/OpenSLX/Distro/Debian.pm
+# - provides Debian-specific overrides of the Distro API for the profile
+# plugin.
+# -----------------------------------------------------------------------------
+package profile::OpenSLX::Distro::Debian;
+
+use strict;
+use warnings;
+
+use base qw(profile::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+
+
+
+1;
diff --git a/src/os-plugins/plugins/profile/OpenSLX/Distro/Fedora.pm b/src/os-plugins/plugins/profile/OpenSLX/Distro/Fedora.pm
new file mode 100644
index 00000000..433f6f7f
--- /dev/null
+++ b/src/os-plugins/plugins/profile/OpenSLX/Distro/Fedora.pm
@@ -0,0 +1,32 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# profile/OpenSLX/Distro/Fedora.pm
+# - provides Fedora-specific overrides of the Distro API for the profile
+# plugin.
+# -----------------------------------------------------------------------------
+package profile::OpenSLX::Distro::Fedora;
+
+use strict;
+use warnings;
+
+use base qw(profile::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+
+
+
+1;
diff --git a/src/os-plugins/plugins/profile/OpenSLX/Distro/Gentoo.pm b/src/os-plugins/plugins/profile/OpenSLX/Distro/Gentoo.pm
new file mode 100644
index 00000000..240811df
--- /dev/null
+++ b/src/os-plugins/plugins/profile/OpenSLX/Distro/Gentoo.pm
@@ -0,0 +1,32 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# profile/OpenSLX/Distro/Gentoo.pm
+# - provides Gentoo-specific overrides of the Distro API for the profile
+# plugin.
+# -----------------------------------------------------------------------------
+package profile::OpenSLX::Distro::Gentoo;
+
+use strict;
+use warnings;
+
+use base qw(profile::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+
+
+
+1;
diff --git a/src/os-plugins/plugins/profile/OpenSLX/Distro/Scilin.pm b/src/os-plugins/plugins/profile/OpenSLX/Distro/Scilin.pm
new file mode 100644
index 00000000..de66f02a
--- /dev/null
+++ b/src/os-plugins/plugins/profile/OpenSLX/Distro/Scilin.pm
@@ -0,0 +1,32 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# profile/OpenSLX/Distro/Scilin.pm
+# - provides Scilin-specific overrides of the Distro API for the profile
+# plugin.
+# -----------------------------------------------------------------------------
+package profile::OpenSLX::Distro::Scilin;
+
+use strict;
+use warnings;
+
+use base qw(profile::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+
+
+
+1;
diff --git a/src/os-plugins/plugins/profile/OpenSLX/Distro/Suse.pm b/src/os-plugins/plugins/profile/OpenSLX/Distro/Suse.pm
new file mode 100644
index 00000000..e90e8211
--- /dev/null
+++ b/src/os-plugins/plugins/profile/OpenSLX/Distro/Suse.pm
@@ -0,0 +1,68 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# profile/OpenSLX/Distro/Suse.pm
+# - provides Suse-specific overrides of the Distro API for the profile
+# plugin.
+# -----------------------------------------------------------------------------
+package profile::OpenSLX::Distro::Suse;
+
+use strict;
+use warnings;
+
+use base qw(profile::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub _getKdeHomeMap
+{
+ my $self = shift;
+
+ return;
+}
+
+sub getProfileDPAth
+{
+ my $self = shift;
+
+
+ return "/etc/profile.d/slx-kdehome.sh";
+}
+
+sub getKdeHome
+{
+ my $self = shift;
+
+ return ".openslx/suse/kde";
+}
+
+sub getGconfPathConfig
+{
+ my $self = shift;
+
+ return "/etc/gconf/2/path";
+}
+
+
+sub getGconfHome
+{
+ my $self = shift;
+
+ return ".openslx/suse/gconf";
+}
+
+
+
+1;
diff --git a/src/os-plugins/plugins/profile/OpenSLX/Distro/Ubuntu.pm b/src/os-plugins/plugins/profile/OpenSLX/Distro/Ubuntu.pm
new file mode 100644
index 00000000..26cd9426
--- /dev/null
+++ b/src/os-plugins/plugins/profile/OpenSLX/Distro/Ubuntu.pm
@@ -0,0 +1,66 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# profile/OpenSLX/Distro/Ubuntu.pm
+# - provides Debian-specific overrides of the Distro API for the profile
+# plugin.
+# -----------------------------------------------------------------------------
+package profile::OpenSLX::Distro::Ubuntu;
+
+use strict;
+use warnings;
+
+use base qw(profile::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub _getKdeHomeMap
+{
+ my $self = shift;
+
+ return;
+}
+
+sub getProfileDPAth
+{
+ my $self = shift;
+
+
+ return "/etc/profile.d/slx-kdehome.sh";
+}
+
+sub getKdeHome
+{
+ my $self = shift;
+
+ return ".openslx/ubuntu/kde";
+}
+
+sub getGconfPathConfig
+{
+ my $self = shift;
+
+ return "/etc/gconf/2/path";
+}
+
+
+sub getGconfHome
+{
+ my $self = shift;
+
+ return ".openslx/ubuntu/gconf";
+}
+
+1;
diff --git a/src/os-plugins/plugins/profile/OpenSLX/Distro/Ubuntu_10.pm b/src/os-plugins/plugins/profile/OpenSLX/Distro/Ubuntu_10.pm
new file mode 100644
index 00000000..3b288e97
--- /dev/null
+++ b/src/os-plugins/plugins/profile/OpenSLX/Distro/Ubuntu_10.pm
@@ -0,0 +1,66 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# profile/OpenSLX/Distro/Ubuntu.pm
+# - provides Debian-specific overrides of the Distro API for the profile
+# plugin.
+# -----------------------------------------------------------------------------
+package profile::OpenSLX::Distro::Ubuntu_10;
+
+use strict;
+use warnings;
+
+use base qw(profile::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub _getKdeHomeMap
+{
+ my $self = shift;
+
+ return;
+}
+
+sub getProfileDPAth
+{
+ my $self = shift;
+
+
+ return "/etc/profile.d/slx-kdehome.sh";
+}
+
+sub getKdeHome
+{
+ my $self = shift;
+
+ return ".openslx/ubuntu-lucid.kde";
+}
+
+sub getGconfPathConfig
+{
+ my $self = shift;
+
+ return "/etc/gconf/2/path";
+}
+
+
+sub getGconfHome
+{
+ my $self = shift;
+
+ return ".openslx.ubuntu-lucid.gconf";
+}
+
+1;
diff --git a/src/os-plugins/plugins/profile/OpenSLX/OSPlugin/profile.pm b/src/os-plugins/plugins/profile/OpenSLX/OSPlugin/profile.pm
new file mode 100644
index 00000000..b9538374
--- /dev/null
+++ b/src/os-plugins/plugins/profile/OpenSLX/OSPlugin/profile.pm
@@ -0,0 +1,174 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# profile.pm
+# -----------------------------------------------------------------------------
+package OpenSLX::OSPlugin::profile;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSPlugin::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+# if you have any questions regarding the concept of OS-plugins and their
+# implementation, please drop a mail to: ot@openslx.com, or join the IRC-channel
+# '#openslx' (on freenode).
+################################################################################
+sub new
+{
+ my $class = shift;
+
+ my $self = {
+ name => 'profile',
+ };
+
+ return bless $self, $class;
+}
+
+sub getInfo
+{
+ my $self = shift;
+
+ return {
+ description => unshiftHereDoc(<<' End-of-Here'),
+ profile plugin ..
+ End-of-Here
+ precedence => 82,
+ };
+}
+
+sub getAttrInfo
+{
+ my $self = shift;
+
+ return {
+ # attribute 'active' is mandatory for all plugins
+ 'profile::active' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should the 'profile'-plugin be executed during boot?
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '1 means active - 0 means inactive',
+ default => '1',
+ },
+ };
+}
+
+sub _writeKdehomeEnv
+{
+ my $self = shift;
+
+ my $profileFile = unshiftHereDoc(<<' End-of-Here');
+ # Do not modify this file.
+ # File generated by profile plugin.
+ # For more information have a look at
+ # http://lab.openslx.org/wiki/openslx/profile
+
+ export KDEHOME=${HOME}/%s
+ End-of-Here
+
+ $profileFile = sprintf(
+ $profileFile,
+ $self->{distro}->getKdeHome()
+ );
+
+ spitFile($self->{distro}->getProfileDPAth(), $profileFile);
+
+ return $self->{distro}->getKdeHome();
+}
+
+sub _modifyGconfPaths
+{
+ my $self = shift;
+
+ my $cmd = "sed -i \"s,readwrite:\\\$(HOME)/.gconf,readwrite:\\\$(HOME)/%s,\" %s";
+ $cmd = sprintf (
+ $cmd,
+ $self->{distro}->getGconfHome(),
+ $self->{distro}->getGconfPathConfig()
+ );
+
+ slxsystem($cmd);
+
+ return $self->{distro}->getGconfHome();
+}
+
+sub _writeXsessionScript
+{
+ my $self = shift;
+ my @paths = @_;
+
+ my $xsessionFile= unshiftHereDoc(<<' End-of-Here');
+ # Do not modify this file.
+ # File generated by profile plugin.
+ # For more information have a look at
+ # http://lab.openslx.org/wiki/openslx/profile
+
+ %s
+ End-of-Here
+
+ my $cmd = "mkdir -p ";
+
+ while (@paths) {
+ my $path = shift(@paths);
+ $cmd .= "\${HOME}/$path \\\n";
+ }
+
+ $cmd .= "> /dev/null 2>&1 \n";
+
+ $xsessionFile = sprintf(
+ $xsessionFile,
+ $cmd
+ );
+
+ spitFile($self->{distro}->getXsessionDPath(), $xsessionFile);
+
+ return;
+}
+
+sub installationPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ my $pluginRepoPath = $info->{'plugin-repo-path'};
+ my $pluginTempPath = $info->{'plugin-temp-path'};
+ my $openslxBasePath = $info->{'openslx-base-path'};
+ my $openslxConfigPath = $info->{'openslx-config-path'};
+ my $attrs = $info->{'plugin-attrs'};
+
+ my @slxHomeEnv;
+
+ push (@slxHomeEnv, $self->_writeKdehomeEnv());
+ push (@slxHomeEnv, $self->_modifyGconfPaths());
+
+ $self->_writeXsessionScript(@slxHomeEnv);
+
+ return;
+}
+
+sub removalPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ my $pluginRepoPath = $info->{'plugin-repo-path'};
+ my $pluginTempPath = $info->{'plugin-temp-path'};
+
+ return;
+}
+
+1;
diff --git a/src/os-plugins/plugins/profile/XX_profile.sh b/src/os-plugins/plugins/profile/XX_profile.sh
new file mode 100644
index 00000000..1589bd61
--- /dev/null
+++ b/src/os-plugins/plugins/profile/XX_profile.sh
@@ -0,0 +1,31 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# script is included from init via the "." load function - thus it has all
+# variables and functions available
+
+# check if the plugin config directory is generally available or if the client
+# configuration failed somehow
+[ -d /initramfs/plugin-conf ] || error "${init_picfg}" nonfatal
+
+# main script
+if [ -e /initramfs/plugin-conf/profile.conf ]; then
+ . /initramfs/plugin-conf/profile.conf
+
+ if [ $profile_active -ne 0 ]; then
+ [ $DEBUGLEVEL -gt 0 ] && echo "executing the 'profile' os-plugin ...";
+
+
+
+ [ $DEBUGLEVEL -gt 0 ] && echo "done with 'profile' os-plugin ...";
+
+ fi
+
+fi
diff --git a/src/os-plugins/plugins/pvs/OpenSLX/Distro/Base.pm b/src/os-plugins/plugins/pvs/OpenSLX/Distro/Base.pm
new file mode 100644
index 00000000..3425f2ab
--- /dev/null
+++ b/src/os-plugins/plugins/pvs/OpenSLX/Distro/Base.pm
@@ -0,0 +1,46 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# pvs/OpenSLX/Distro/Base.pm
+# - provides base implementation of the Distro API for the pvs plugin.
+# -----------------------------------------------------------------------------
+package pvs::OpenSLX::Distro::Base;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+use Scalar::Util qw( weaken );
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {};
+ return bless $self, $class;
+}
+
+sub initialize
+{
+ my $self = shift;
+ $self->{engine} = shift;
+ weaken($self->{engine});
+ # avoid circular reference between plugin and its engine
+
+ return 1;
+}
+
+1;
diff --git a/src/os-plugins/plugins/pvs/OpenSLX/Distro/Debian.pm b/src/os-plugins/plugins/pvs/OpenSLX/Distro/Debian.pm
new file mode 100644
index 00000000..0382d3b9
--- /dev/null
+++ b/src/os-plugins/plugins/pvs/OpenSLX/Distro/Debian.pm
@@ -0,0 +1,29 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# pvs/OpenSLX/Distro/debian.pm
+# - provides Debian-specific overrides of the Distro API for the pvs
+# plugin.
+# -----------------------------------------------------------------------------
+package pvs::OpenSLX::Distro::Debian;
+
+use strict;
+use warnings;
+
+use base qw(pvs::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+1;
diff --git a/src/os-plugins/plugins/pvs/OpenSLX/Distro/Fedora.pm b/src/os-plugins/plugins/pvs/OpenSLX/Distro/Fedora.pm
new file mode 100644
index 00000000..76b8ffa1
--- /dev/null
+++ b/src/os-plugins/plugins/pvs/OpenSLX/Distro/Fedora.pm
@@ -0,0 +1,28 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# pvs/OpenSLX/Distro/Fedora.pm
+# - provides Fedora-specific overrides of the Distro API for the pvs
+# plugin.
+# -----------------------------------------------------------------------------
+package pvs::OpenSLX::Distro::Fedora;
+
+use strict;
+use warnings;
+
+use base qw(pvs::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+
+################################################################################
+### interface methods
+################################################################################
+
+1;
diff --git a/src/os-plugins/plugins/pvs/OpenSLX/Distro/Gentoo.pm b/src/os-plugins/plugins/pvs/OpenSLX/Distro/Gentoo.pm
new file mode 100644
index 00000000..b943a63b
--- /dev/null
+++ b/src/os-plugins/plugins/pvs/OpenSLX/Distro/Gentoo.pm
@@ -0,0 +1,28 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# pvs/OpenSLX/Distro/Gentoo.pm
+# - provides Gentoo-specific overrides of the Distro API for the pvs
+# plugin.
+# -----------------------------------------------------------------------------
+package pvs::OpenSLX::Distro::Gentoo;
+
+use strict;
+use warnings;
+
+use base qw(pvs::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+
+################################################################################
+### interface methods
+################################################################################
+
+1;
diff --git a/src/os-plugins/plugins/pvs/OpenSLX/Distro/Suse.pm b/src/os-plugins/plugins/pvs/OpenSLX/Distro/Suse.pm
new file mode 100644
index 00000000..411fa1c9
--- /dev/null
+++ b/src/os-plugins/plugins/pvs/OpenSLX/Distro/Suse.pm
@@ -0,0 +1,28 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# pvs/OpenSLX/Distro/Suse.pm
+# - provides SUSE-specific overrides of the Distro API for the pvs plugin.
+# -----------------------------------------------------------------------------
+package pvs::OpenSLX::Distro::Suse;
+
+use strict;
+use warnings;
+
+use base qw(pvs::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+1;
diff --git a/src/os-plugins/plugins/pvs/OpenSLX/Distro/Ubuntu.pm b/src/os-plugins/plugins/pvs/OpenSLX/Distro/Ubuntu.pm
new file mode 100644
index 00000000..c7496ac0
--- /dev/null
+++ b/src/os-plugins/plugins/pvs/OpenSLX/Distro/Ubuntu.pm
@@ -0,0 +1,23 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# pvs/OpenSLX/Distro/Ubuntu.pm
+# - provides Ubuntu-specific overrides of the Distro API for the pvs
+# plugin.
+# -----------------------------------------------------------------------------
+package pvs::OpenSLX::Distro::Ubuntu;
+
+use strict;
+use warnings;
+
+# inherit everything from Debian (as Ubuntu is based on it anyway)
+use base qw(pvs::OpenSLX::Distro::Debian);
+
+1;
diff --git a/src/os-plugins/plugins/pvs/OpenSLX/OSPlugin/pvs.pm b/src/os-plugins/plugins/pvs/OpenSLX/OSPlugin/pvs.pm
new file mode 100644
index 00000000..d0a629e4
--- /dev/null
+++ b/src/os-plugins/plugins/pvs/OpenSLX/OSPlugin/pvs.pm
@@ -0,0 +1,127 @@
+# Copyright (c) 2009..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# pvs.pm - plugin to use the pool video switch tools within OpenSLX environment
+# -----------------------------------------------------------------------------
+package OpenSLX::OSPlugin::pvs;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSPlugin::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+sub new
+{
+ my $class = shift;
+ my $self = {
+ name => 'pvs',
+ };
+
+ return bless $self, $class;
+}
+
+sub getInfo
+{
+ my $self = shift;
+ return {
+ description => unshiftHereDoc(<<' End-of-Here'),
+ enables pvs server (user or xorg)
+ End-of-Here
+ # waits for xorg to add configuration if needed
+ precedence => 70,
+ };
+}
+
+sub getAttrInfo
+{
+ my $self = shift;
+
+ return {
+ 'pvs::active' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should the 'pvs' plugin be executed during boot?
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '1 means active - 0 means inactive',
+ default => '1',
+ },
+
+ 'pvs::mode' => {
+ applies_to_systems => 1,
+ applies_to_clients => 0,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ set pvs to listen on Xorg user sessions (default), general
+ access to the Xorg server (including displaymanager login) and
+ console framebuffer.
+ End-of-Here
+ content_regex => qr{^(x11user|x11mod|fb)$},
+ content_descr => 'x11user for user, x11mod for access via Xorg module or fb',
+ default => 'x11user',
+ },
+
+ 'pvs::scale' => {
+ applies_to_systems => 1,
+ applies_to_clients => 0,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ scale screen size (e.g. as fraction 2/3 or as decimal 0.5)
+ End-of-Here
+ content_regex => undef,
+ content_descr => undef,
+ default => '',
+ },
+
+ };
+}
+
+sub installationPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ my $pluginRepositoryPath = $info->{'plugin-repo-path'};
+ my $pluginTempPath = $info->{'plugin-temp-path'};
+ my $openslxBasePath = $info->{'openslx-base-path'};
+
+ # should we distinguish between the two different packages!?
+ # libvnc should be part of the xorg package!? (so no check needed)
+ #my $engine = $self->{'os-plugin-engine'};
+ #if (!isInPath('pvs')) {
+ # $engine->installPackages(
+ # $engine->getInstallablePackagesForSelection('pvs')
+ # );
+ #} else {
+ # vlog(3, "pvs is already installed");
+ #}
+
+ # get path of files we need to install
+ my $pluginFilesPath = "$openslxBasePath/lib/plugins/$self->{'name'}/files";
+ my $script = $self->{distro}->fillRunlevelScript();
+
+ # copy all needed files now
+ copyFile("$pluginFilesPath/*", "$pluginRepositoryPath");
+
+ # link these files
+
+ #chmod 0755, "/etc/init.d/pvs";
+
+}
+
+sub removalPhase
+{
+ my $self = shift;
+ my $info = shift;
+}
+
+1;
diff --git a/src/os-plugins/plugins/pvs/XX_pvs.sh b/src/os-plugins/plugins/pvs/XX_pvs.sh
new file mode 100644
index 00000000..9a86574f
--- /dev/null
+++ b/src/os-plugins/plugins/pvs/XX_pvs.sh
@@ -0,0 +1,46 @@
+# Copyright (c) 2009..2010 - RZ Uni Freiburg
+# Copyright (c) 2009..2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# Script is included from init via the "." load function - thus it has all
+# variables and functions available
+
+# Check if the plugin config directory is generally available or if the client
+# configuration failed somehow
+[ -d /initramfs/plugin-conf ] || error "${init_picfg}" nonfatal
+
+# main script
+if [ -e /initramfs/plugin-conf/pvs.conf ]; then
+ . /initramfs/plugin-conf/pvs.conf
+ if [ $pvs_active -ne 0 ]; then
+ [ $DEBUGLEVEL -gt 0 ] && echo "executing the 'pvs' os-plugin ...";
+ # location of central pvs configuration files
+ testmkdi /mnt/etc/openslx/pvs
+
+ # add it to the Xserver script (?)
+
+ # link the executables
+ #for tool in poolVS poolVSClient VNCwrapper ; do
+ # ln -s /opt/openslx/plugin-repo/pvs/${tool} /mnt/var/X11R6/bin/${tool}
+ #done
+
+ # write config file
+ #echo "# parameters generated by $0" > /mnt/etc/pvs/pvs.conf
+ #echo "pvs_PARAMS=\"$PARAMS\"" >> /mnt/etc/pvs/pvs.conf
+ #echo "pvs_X11=\"$pvs_X11\"" >> /mnt/etc/pvs/pvs.conf
+
+ [ $DEBUGLEVEL -gt 0 ] && echo "done with 'pvs' os-plugin ...";
+
+ fi
+ fi
+else
+ [ $DEBUGLEVEL -gt 2 ] && \
+ echo "No configuration file found for pvs plugin."
+fi
diff --git a/src/os-plugins/plugins/pvs/files/pvs-vncsrv b/src/os-plugins/plugins/pvs/files/pvs-vncsrv
new file mode 100755
index 00000000..966bf1df
--- /dev/null
+++ b/src/os-plugins/plugins/pvs/files/pvs-vncsrv
@@ -0,0 +1,105 @@
+#!/bin/bash
+# -----------------------------------------------------------------------------
+# Copyright (c) 2009 - RZ Uni FR
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# pvs-vncsrv
+# - This is a generic wrapper script for starting any userspace VNC server
+# to offer connectivity from the pvs contol console. The script expects
+# start/stop in $1, the port to start on in $2 and the password in $3. The
+# latter one should be changed to piping for security reasons ...
+# -----------------------------------------------------------------------------
+
+# parameters for x11vnc
+X11VNC_PARAMS="-bg -forever -display :0 -passwdfile rm:$HOME/.pvs/vncpasswd -o $HOME/.pvs/log.vncsrv -shared"
+X11VNC_X11="0"
+
+# at the moment the poolVSClient is expected to use the ~/.pvs directory
+[ -d ~/.pvs ] || mkdir ~/.pvs
+
+# write the password file
+echo -e "$3\n__BEGIN_VIEWONLY__\n$3" > ~/.pvs/vncpasswd
+
+# find xauthority file
+find_xauth () {
+ FOUND=0
+ RETRIES=4
+ [ -z "$1" ] || RETRIES="$1"
+
+ [ -e "/var/lib/kdm/" ] &&
+ XAUTHFILE_KDM=`find /var/lib/kdm/ -iname "A\:0-*"`
+ [ -e "/var/run/xauth/" ] &&
+ XAUTHFILE_KDM2=$(find /var/run/xauth/ -iname "A\:0-*")
+ [ -e "/var/lib/xdm/authdir/authfiles/" ] &&
+ XAUTHFILE_XDM=$(find /var/lib/xdm/authdir/authfiles/ -iname "A\:0-*")
+ [ -e "/var/lib/gdm/" ] &&
+ XAUTHFILE_GDM=$(find /var/lib/gdm/ -iname *Xauth*)
+
+ [ -f "$XAUTHFILE_KDM" ] && FOUND=1 && XAUTHORITY="$XAUTHFILE_KDM"
+ [ -f "$XAUTHFILE_KDM2" ] && FOUND=1 && XAUTHORITY="$XAUTHFILE_KDM2"
+ [ -f "$XAUTHFILE_XDM" ] && FOUND=1 && XAUTHORITY="$XAUTHFILE_XDM"
+ [ -f "$XAUTHFILE_GDM" ] && FOUND=1 && XAUTHORITY="$XAUTHFILE_GDM"
+
+ if [ "$FOUND" -eq "0" ]; then
+ if [ "$RETRIES" -gt "0" ]; then
+ let "RETRIES-=1"
+ find_xauth "$RETRIES"
+ else
+ echo "start FAILED (can't find way to authenticate myself against X)" \
+ >>~/.pvs/log.vncsrv
+ exit -1
+ fi
+ else
+ echo "found authfile ($XAUTHORITY)" >>~/.pvs/log.vncsrv
+ fi
+}
+
+START_COMMAND="x11vnc"
+
+case "$1" in
+ start)
+ [ -z "$2" -o -z "$3" ] && echo " Port and/or Password not set" \
+ >>~/.pvs/log.vncsrv
+ echo "$2 $3" >>~/.pvs/log.test
+ if [ ! -f ~/.pvs/vncpasswd ]; then
+ echo " Start FAILED (~/.pvs/vncpasswd not found)" >>~/.pvs/log.vncsrv
+ echo " Create it manualy and retry starting x11vnc" >>~/.pvs/log.vncsrv
+ exit -1;
+ fi
+
+ if [ $X11VNC_X11 = 1 ]; then
+ # find_xauth
+ START_COMMAND="$START_COMMAND -auth $XAUTHORITY $X11VNC_PARAMS"
+ else
+ START_COMMAND="$START_COMMAND $X11VNC_PARAMS"
+ fi
+ OUTPUT=$($START_COMMAND -rfbport $2)
+ echo "$START_COMMAND" >>~/.pvs/log.vncsrv
+ echo "$OUTPUT" >>~/.pvs/log.vncsrv
+ ;;
+ stop)
+ pid=$(pidof x11vnc)
+ if [ -z "$pid" ]
+ then
+ echo "x11vnc not running" >>~/.pvs/log.vncsrv
+ exit -1;
+ else
+ kill -9 $pid 2>/dev/null
+ echo "x11vnc stopped" >>~/.pvs/log.vncsrv
+ fi
+ ;;
+ *)
+ echo "x11vnc startscript"
+ echo "Usage: $0 (start|stop)"
+ ;;
+esac
+exit 0
+
diff --git a/src/os-plugins/plugins/qemukvm/OpenSLX/Distro/Base.pm b/src/os-plugins/plugins/qemukvm/OpenSLX/Distro/Base.pm
new file mode 100644
index 00000000..1e3a9bfe
--- /dev/null
+++ b/src/os-plugins/plugins/qemukvm/OpenSLX/Distro/Base.pm
@@ -0,0 +1,63 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# qemukvm/OpenSLX/Distro/Base.pm
+# - provides base implementation of the Distro API for the qemukvm plugin.
+# -----------------------------------------------------------------------------
+package qemukvm::OpenSLX::Distro::Base;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+use Scalar::Util qw( weaken );
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {};
+ return bless $self, $class;
+
+}
+
+sub initialize
+{
+ my $self = shift;
+ my $engine = shift;
+ weaken($self->{engine});
+ # avoid circular reference between plugin and its engine
+
+ return 1;
+}
+
+sub fillRunlevelScript
+{
+ my $self = shift;
+ my $location = shift;
+ my $kind = shift;
+
+ my $script = unshiftHereDoc(<<' End-of-Here');
+
+ # cpuvirt=$(grep -e "vmx|svm" /proc/cpuinfo)
+ # modprobe $cpuvirt
+
+ End-of-Here
+
+ return $script;
+}
+
+1;
diff --git a/src/os-plugins/plugins/qemukvm/OpenSLX/Distro/Debian.pm b/src/os-plugins/plugins/qemukvm/OpenSLX/Distro/Debian.pm
new file mode 100644
index 00000000..6e2cab9b
--- /dev/null
+++ b/src/os-plugins/plugins/qemukvm/OpenSLX/Distro/Debian.pm
@@ -0,0 +1,43 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# qemukvm/OpenSLX/Distro/debian.pm
+# - provides Debian-specific overrides of the Distro API for the qemukvm
+# plugin.
+# -----------------------------------------------------------------------------
+package qemukvm::OpenSLX::Distro::Debian;
+
+use strict;
+use warnings;
+
+use base qw(qemukvm::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub fillRunlevelScript
+{
+ my $self = shift;
+ my $location = shift;
+ my $kind = shift;
+
+ my $script = unshiftHereDoc(<<' End-of-Here');
+
+ # something into here ...
+
+ End-of-Here
+ return $script;
+}
+
+1;
diff --git a/src/os-plugins/plugins/qemukvm/OpenSLX/Distro/Suse.pm b/src/os-plugins/plugins/qemukvm/OpenSLX/Distro/Suse.pm
new file mode 100644
index 00000000..719dae2b
--- /dev/null
+++ b/src/os-plugins/plugins/qemukvm/OpenSLX/Distro/Suse.pm
@@ -0,0 +1,42 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# qemukvm/OpenSLX/Distro/Suse.pm
+# - provides SUSE specific overrides of the distro API for the qemukvm
+# plugin.
+# -----------------------------------------------------------------------------
+package qemukvm::OpenSLX::Distro::Suse;
+
+use strict;
+use warnings;
+
+use base qw(qemukvm::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub fillRunlevelScript
+{
+ my $self = shift;
+ my $location = shift;
+ my $kind = shift;
+
+ my $script = unshiftHereDoc(<<' End-of-Here');
+
+ End-of-Here
+
+ return $script;
+}
+
+1;
diff --git a/src/os-plugins/plugins/qemukvm/OpenSLX/Distro/Ubuntu.pm b/src/os-plugins/plugins/qemukvm/OpenSLX/Distro/Ubuntu.pm
new file mode 100644
index 00000000..ac764d31
--- /dev/null
+++ b/src/os-plugins/plugins/qemukvm/OpenSLX/Distro/Ubuntu.pm
@@ -0,0 +1,24 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# qemukvm/OpenSLX/Distro/Ubuntu.pm
+# - provides Ubuntu-specific overrides of the Distro API for the qemukvm
+# plugin.
+# -----------------------------------------------------------------------------
+package qemukvm::OpenSLX::Distro::Ubuntu;
+
+use strict;
+use warnings;
+
+# inherit everything from Debian (as Ubuntu is based on it anyway)
+use base qw(qemukvm::OpenSLX::Distro::Debian);
+
+
+1;
diff --git a/src/os-plugins/plugins/qemukvm/OpenSLX/OSPlugin/qemukvm.pm b/src/os-plugins/plugins/qemukvm/OpenSLX/OSPlugin/qemukvm.pm
new file mode 100644
index 00000000..14e5917f
--- /dev/null
+++ b/src/os-plugins/plugins/qemukvm/OpenSLX/OSPlugin/qemukvm.pm
@@ -0,0 +1,256 @@
+# Copyright (c) 2009..2010 - RZ Uni Freiburg
+# Copyright (c) 2009..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# qemukvm.pm
+# - Declares necessary information for the qemukvm plugin
+# -----------------------------------------------------------------------------
+package OpenSLX::OSPlugin::qemukvm;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSPlugin::Base);
+
+use File::Basename;
+use File::Path;
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+use OpenSLX::DistroUtils;
+
+sub new
+{
+ my $class = shift;
+ my $self = {
+ name => 'qemukvm',
+ };
+
+ return bless $self, $class;
+}
+
+sub getInfo
+{
+ my $self = shift;
+
+ return {
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Module for enabling services for the Linux kvm using qemu for
+ IO on an OpenSLX stateless client.
+ End-of-Here
+ precedence => 70,
+ required => [ qw( desktop ) ],
+ };
+}
+
+sub getAttrInfo
+{
+ # Returns a hash-ref with information about all attributes supported
+ # by this specific plugin
+ my $self = shift;
+
+ # This default configuration will be added as attributes to the default
+ # system, such that it can be overruled for any specific system by means
+ # of slxconfig.
+ return {
+ # attribute 'active' is mandatory for all plugins
+ 'qemukvm::active' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should the 'qemukvm'-plugin be executed during boot?
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '1 means active - 0 means inactive',
+ default => '1',
+ },
+ # attribute 'imagesrc' defines where we can find qemukvm images
+ 'qemukvm::imagesrc' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Where do we store our qemukvm images? NFS? Filesystem?
+ End-of-Here
+ #TODO: check if the input is valid
+ #content_regex => qr{^(0|1)$},
+ content_descr => 'Allowed values: local path or URI',
+ default => '',
+ },
+ # attribute 'bridge' defines if bridged network mode should be
+ # switched on
+ 'qemukvm::bridge' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Should the bridging (direct access of the qemukvm clients
+ to the ethernet the host is connected to) be enabled
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => 'Allowed values: 0 or 1',
+ default => '1',
+ },
+
+ };
+}
+
+sub installationPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ $self->{pluginRepositoryPath} = $info->{'plugin-repo-path'};
+ $self->{pluginTempPath} = $info->{'plugin-temp-path'};
+ $self->{openslxBasePath} = $info->{'openslx-base-path'};
+ $self->{openslxConfigPath} = $info->{'openslx-config-path'};
+ $self->{attrs} = $info->{'plugin-attrs'};
+
+ my $engine = $self->{'os-plugin-engine'};
+ my $pluginRepoPath = $info->{'plugin-repo-path'};
+ my $openslxBasePath = $info->{'openslx-base-path'};
+
+ # Different names of the tool (should be unified somehow!?)
+ if (!isInPath('qemu-kvm') || !isInPath('kvm')) {
+ $engine->installPackages(
+ $engine->getInstallablePackagesForSelection('qemu-kvm')
+ );
+ }
+ # Sudo is needed to get access to certain system network commands
+ if (!isInPath('sudo')) {
+ $engine->installPackages($self->{distro}->getPackageName('sudo'));
+ }
+
+ # Copy run-virt.include and template files to the appropriate place for
+ # inclusion in stage4
+ my $pluginName = $self->{'name'};
+ my $pluginBasePath = "$openslxBasePath/lib/plugins/$pluginName/files";
+ foreach my $file ( qw( run-virt.include ifup ifdown ) ) {
+ copyFile("$pluginBasePath/$file", "$pluginRepoPath/");
+ }
+ chmod 0755, "$pluginRepoPath/ifup", "$pluginRepoPath/ifdown";
+
+ my $initFile = newInitFile();
+ $initFile->setName("qemukvm");
+ $initFile->setDesc("Setup environment for QEMU/KVM");
+
+ # TODO: default dirs als globale funktion anbieten
+ $initFile->
+ addToBlock('head','. /etc/opt/openslx/plugins/qemukvm/network.conf');
+
+ # TODO: remove all runlevel links for qemu-kvm or kvm
+ my $kvm_module = unshiftHereDoc(<<' End-of-Here');
+ # Figure out which module we need.
+ if grep -q ^flags.*\\\<vmx\\\> /proc/cpuinfo; then
+ module=kvm_intel
+ elif grep -q ^flags.*\\\<svm\\\> /proc/cpuinfo; then
+ module=kvm_amd
+ else
+ module=kqemu
+ fi
+ End-of-Here
+
+ my $do_start = unshiftHereDoc(<<' End-of-Here');
+ # loading kvm module
+ kvm_module
+ [ -n "${module}" ] && modprobe -q ${module}
+ # load the tunnel device module
+ modprobe -q tun
+ # TODO: maybe in the ifup-script better solution?
+ # configuring the tap0 interface to the existing bridge configured in stage3
+ #for i in 0 1 2; do
+ # /opt/openslx/uclib-rootfs/sbin/tunctl -t tap${i} >/dev/null 2>&1
+ # ip link set dev tap${i} up
+ #done
+ #/opt/openslx/uclib-rootfs/usr/sbin/brctl addif br0 tap0
+ #ip addr add ${nataddress} dev tap1
+ #ip addr add ${hoaddress} dev tap2
+ #echo "1" >/proc/sys/net/ipv4/conf/br0/forwarding
+ #echo "1" >/proc/sys/net/ipv4/conf/tap0/forwarding
+ # make /dev/fb0 writable for all
+ # TODO: maybe solve via group or udev, etc...
+ chmod 766 /dev/fb*
+ End-of-Here
+
+ my $do_stop = unshiftHereDoc(<<' End-of-Here');
+ kvm_module
+ [ -n "${module}" ] && modprobe -q -r ${module}
+ modprobe -q -r tun
+ # TODO: tun removed, so this is not necessary
+ #/opt/openslx/uclib-rootfs/usr/sbin/brctl delif br0 tap0
+ #ip addr del ${nataddress} dev tap1
+ #ip addr del ${hoaddress} dev tap2
+ #echo "0" >/proc/sys/net/ipv4/conf/br0/forwarding
+ #echo "0" >/proc/sys/net/ipv4/conf/tap0/forwarding
+ chmod 760 /dev/fb*
+ End-of-Here
+
+ my $do_restart = unshiftHereDoc(<<' End-of-Here');
+ do_stop && do_start
+ End-of-Here
+
+ # add helper functions to initfile
+ # first parameter name of the function
+ # second parameter content of the function
+ $initFile->addFunction('kvm_module', $kvm_module);
+ $initFile->addFunction('do_start', $do_start);
+ $initFile->addFunction('do_stop', $do_stop);
+ $initFile->addFunction('do_restart', $do_restart);
+
+ # place a call of the helper function in the stop block of the init file
+ # first parameter name of the function
+ # second parameter name of the block
+ $initFile->addFunctionCall('do_start', 'start');
+ $initFile->addFunctionCall('do_stop', 'stop');
+ $initFile->addFunctionCall('do_restart', 'restart');
+
+ my $distro = (split('-',$self->{'os-plugin-engine'}->distroName()))[0];
+
+ # write qemukvm initfile to plugin path
+ spitFile(
+ "$pluginRepoPath/qemukvm",
+ getInitFileForDistro($initFile, ucfirst($distro))
+ );
+ return;
+}
+
+sub removalPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ return;
+}
+
+sub checkStage3AttrValues
+{
+ my $self = shift;
+ my $stage3Attrs = shift;
+ my $vendorOSAttrs = shift;
+ #my @problems;
+
+ #my $vmimg = $stage3Attrs->{'qemukvm::imagesrc'} || '';
+
+ return;
+}
+
+# The bridge configuration needs the bridge module to be present in early
+# stage3
+sub suggestAdditionalKernelModules
+{
+ my $self = shift;
+ my $makeInitRamFSEngine = shift;
+
+ my @suggestedModules;
+
+ push @suggestedModules, qw( bridge );
+
+ return @suggestedModules;
+}
+
+1;
diff --git a/src/os-plugins/plugins/qemukvm/XX_qemukvm.sh b/src/os-plugins/plugins/qemukvm/XX_qemukvm.sh
new file mode 100644
index 00000000..8a41ff3b
--- /dev/null
+++ b/src/os-plugins/plugins/qemukvm/XX_qemukvm.sh
@@ -0,0 +1,112 @@
+# Copyright (c) 2009..2010 - RZ Uni Freiburg
+# Copyright (c) 2008..2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# Script is included from init via the "." load function - thus it has all
+# variables and functions available
+
+# include default directories
+. /etc/openslx.conf
+
+CONFFILE=/initramfs/plugin-conf/qemukvm.conf
+PLUGINCONFDIR=/mnt/${OPENSLX_DEFAULT_CONFDIR}/plugins/qemukvm
+PLUGINDIR=${OPENSLX_DEFAULT_DIR}/plugin-repo/qemukvm
+VIRTDIR=/mnt/${OPENSLX_DEFAULT_VIRTDIR}/qemukvm
+LOGDIR=/mnt/${OPENSLX_DEFAULT_LOGDIR}
+
+# check if the configuration file is available
+if [ -e ${CONFFILE} ]; then
+
+ # load needed variables
+ . ${CONFFILE}
+
+ # Test if this plugin is activated... more or less useless with the
+ # new plugin system
+ if [ ${qemukvm_active} -ne 0 2>/dev/null ]; then
+ [ $DEBUGLEVEL -gt 0 ] && echo "executing the 'qemukvm' os-plugin ...";
+
+ # load general configuration
+ . /initramfs/machine-setup
+
+ # copy virtualization include files and qemukvm.conf to config dir
+ testmkd ${PLUGINCONFDIR}
+ cp /mnt/${PLUGINDIR}/run-virt.include ${PLUGINCONFDIR}
+ cp ${CONFFILE} ${PLUGINCONFDIR}
+
+# # check for the virtualization CPU features
+# if grep -q "vmx" /proc/cpuinfo && modprobe ${MODPRV} kvm_intel ; then
+# [ $DEBUGLEVEL -gt 0 ] && echo " * Loaded kvm_intel module"
+# echo "kvm=intel" >> ${PLUGINCONFDIR}/qemukvm.conf
+# elif grep -q "svm" /proc/cpuinfo && modprobe ${MODPRV} kvm_amd ; then
+# [ $DEBUGLEVEL -gt 0 ] && echo " * Loaded kvm_amd module"
+# echo "kvm=amd" >> ${PLUGINCONFDIR}/qemukvm.conf
+# elif modprobe ${MODPRV} kqemu ; then
+# [ $DEBUGLEVEL -gt 0 ] && \
+# error " * Successfully loaded the kqemu module, but loading of kvm_amd \
+#or kvm_intel\n failed, because no virtualization extenstion found in this \
+#CPU. Please\n enable the extension within your machines BIOS or get another \
+#CPU." nonfatal
+# else
+# error " * All module loading failed including the kqemu module, which \
+#was either\n not found or couldn't be loaded for other reasons. Thus using \
+#qemu(-kvm)\n makes not much sense." nonfatal
+# fi
+
+# # load the tunnel device module
+# modprobe tun 2>/dev/null
+
+ # get source of qemukvm image server (get type, server and path)
+ if strinstr "/" "${qemukvm_imagesrc}" ; then
+ qkimgprot=$(uri_token ${qemukvm_imagesrc} prot)
+ qkimgserv=$(uri_token ${qemukvm_imagesrc} server)
+ qkimgpath="$(uri_token ${qemukvm_imagesrc} path)"
+ fi
+ if [ -n "${qkimgserv}" ] ; then
+ # directory where qemu images are expected in
+ mnttarget=/mnt/var/lib/virt/qemukvm
+ # mount the qemukvm image source readonly (ro)
+ fsmount ${qkimgprot} ${qkimgserv} ${qkimgpath} ${mnttarget} ro
+ else
+ [ $DEBUGLEVEL -gt 1 ] && error " * Incomplete information in variable \
+${qemukvm_imagesrc}." nonfatal
+ fi
+
+ # create a network configuration template (variables should be setable in
+ # the future, see vmware plugin)
+ natnetwork="192.168.101"
+ honetwork="192.168.102"
+ echo -e "nataddress=${natnetwork}.254/24\nhoaddress=${honetwork}.254/24" \
+ >${PLUGINCONFDIR}/network.conf
+
+ # copy the runlevel script (proper place for all distros??)
+ cp /mnt/${PLUGINDIR}/qemukvm /mnt/etc/init.d
+ chmod 0755 /mnt/etc/init.d/qemukvm
+ rllinker "qemukvm" 22 2
+
+ # copy the /etc/qemu-ifup script and enable extended rights for running
+ # the emulator and certain network commands via sudo
+ ln -sf ${PLUGINDIR}/ifup ${PLUGINCONFDIR}/ifup
+ ln -sf ${PLUGINDIR}/ifdown ${PLUGINCONFDIR}/ifdown
+
+ cat >> /mnt/etc/sudoers << EOF
+# allow to start and stop kvm services / load-/unload kvm modules
+#ALL ALL=NOPASSWD: /etc/init.d/qemukvm
+ALL ALL=NOPASSWD: /opt/openslx/uclib-rootfs/sbin/tunctl -t tap*
+ALL ALL=NOPASSWD: /opt/openslx/uclib-rootfs/usr/sbin/brctl addif br0 tap*
+ALL ALL=NOPASSWD: /opt/openslx/uclib-rootfs/bin/ip link set dev tap* up
+ALL ALL=NOPASSWD: /opt/openslx/uclib-rootfs/bin/ip addr add * dev tap*
+ALL ALL=NOPASSWD: /opt/openslx/uclib-rootfs/usr/sbin/udhcpd -S /tmp/qemukvm/*/udhcpd.conf
+ALL ALL=NOPASSWD: /opt/openslx/uclib-rootfs/bin/cp /tmp/qemukvm/*/forwarding /proc/sys/net/ipv4/conf/tap*/forwarding
+#ALL ALL=NOPASSWD: ${killall} udhcpd
+EOF
+ fi
+else
+ [ $DEBUGLEVEL -gt 0 ] && echo " * Configuration of 'qemukvm' plugin failed"
+fi
diff --git a/src/os-plugins/plugins/qemukvm/files/ifdown b/src/os-plugins/plugins/qemukvm/files/ifdown
new file mode 100644
index 00000000..e741d9ca
--- /dev/null
+++ b/src/os-plugins/plugins/qemukvm/files/ifdown
@@ -0,0 +1,34 @@
+#!/bin/sh
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# ifdown
+# - Script used for network cleanup of qemukvm in stage4
+# -----------------------------------------------------------------------------
+
+# get VM_ID through tap name
+VM_ID=$(echo $1 | grep -oE "0[0-4]$")
+QKTMPDIR=/tmp/qemukvm/${USER}/${VM_ID}
+touch /tmp/qemukvm/udhcpd.pids
+chmod 666 tmp/qemukvm/udhcpd.pids
+
+case "$1" in
+ tapnat0*)
+ # kill udhcpd
+ cat ${QKTMPDIR}/udhcpd.pid >> /tmp/qemukvm/udhcpd-unused.pid
+ ;;
+ taphost0*)
+ # kill udhcpd
+ cat ${QKTMPDIR}/udhcpd.pid >> /tmp/qemukvm/udhcpd-unused.pid
+ ;;
+esac
+
+# Produce a clean exit status
+exit 0
diff --git a/src/os-plugins/plugins/qemukvm/files/ifup b/src/os-plugins/plugins/qemukvm/files/ifup
new file mode 100644
index 00000000..b3218798
--- /dev/null
+++ b/src/os-plugins/plugins/qemukvm/files/ifup
@@ -0,0 +1,75 @@
+#!/bin/sh
+# Copyright (c) 2009..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# ifup
+# - Script used for network setup of qemukvm in stage4
+# -----------------------------------------------------------------------------
+
+. /etc/opt/openslx/openslx.conf
+
+PLUGINCONFDIR=${OPENSLX_DEFAULT_CONFDIR}/plugins/qemukvm
+
+# get VM_ID through tap name
+VM_ID=$(echo $1 | grep -oE "0[0-4]$")
+QKTMPDIR=/tmp/qemukvm/${USER}/${VM_ID}
+
+# Use the udhcpcd as DHCP server and brctl as provided by default in OpenSLX
+# environments via uclibc-wrapper.
+. ${PLUGINCONFDIR}/network.conf
+
+# Just decide by the virtual network device used which kind of connection
+# should be set up (passed in $1): tap0 = bridge, tap1 = nat, tap2 = hostonly.
+case "$1" in
+ tapbridge0*)
+ sudo ip link set dev $1 up
+ # TODO: forwarding?, where needed
+ echo "1" >${QKTMPDIR}/forwarding
+ sudo cp ${QKTMPDIR}/forwarding /proc/sys/net/ipv4/conf/br0/forwarding
+ sudo cp ${QKTMPDIR}/forwarding /proc/sys/net/ipv4/conf/$1/forwarding
+ ;;
+ tapnat0*)
+ # Configuring DHCP on host tapnat interface and enable IP masquerading
+ sudo ip addr add ${nataddress} dev $1
+ sudo ip link set dev $1 up
+ # TODO: forwarding?, where needed
+ echo "1" >${QKTMPDIR}/forwarding
+ sudo cp ${QKTMPDIR}/forwarding /proc/sys/net/ipv4/conf/br0/forwarding
+ sudo cp ${QKTMPDIR}/forwarding /proc/sys/net/ipv4/conf/$1/forwarding
+ # TODO: we use here atatic address, maybe change later
+ sed -e "s,NWIF,$1,;s,CNETWORK,192.168.1${VM_ID}," \
+ -e "s,PIDFILE,${QKTMPDIR}/udhcpd.pid," \
+ -e "s,LEASEFILE,${QKTMPDIR}/udhcpd.leases," \
+ ${OPENSLX_DEFAULT_CONFDIR}/udhcpd.conf \
+ >${QKTMPDIR}/udhcpd.conf
+ touch ${QKTMPDIR}/udhcpd.leases
+ sudo /opt/openslx/uclib-rootfs/usr/sbin/udhcpd \
+ -S ${QKTMPDIR}/udhcpd.conf
+ # iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE
+ ;;
+ taphost0*)
+ # Configuring DHCP on host taphost interface
+ sudo ip addr add ${hoaddress} dev $1
+ sudo ip link set dev $1 up
+ # TODO: forwarding?, where needed
+ echo "1" >${QKTMPDIR}/forwarding
+ sudo cp ${QKTMPDIR}/forwarding /proc/sys/net/ipv4/conf/br0/forwarding
+ sudo cp ${QKTMPDIR}/forwarding /proc/sys/net/ipv4/conf/$1/forwarding
+ sed -e "s,NWIF,$1,;s,USER,${USER},;s,CNETWORK,192.168.1${VM_ID}," \
+ -e "s,PIDFILE,${QKTMPDIR}/udhcpd.pid," \
+ -e "s,LEASEFILE,${QKTMPDIR}/udhcpd.leases," \
+ ${OPENSLX_DEFAULT_CONFDIR}/udhcpd.conf >${QKTMPDIR}/udhcpd.conf
+ touch ${QKTMPDIR}/udhcpd.leases
+ sudo /opt/openslx/uclib-rootfs/usr/sbin/udhcpd \
+ -S ${QKTMPDIR}/udhcpd.conf
+ ;;
+esac
+
+exit 0
diff --git a/src/os-plugins/plugins/qemukvm/files/run-virt.include b/src/os-plugins/plugins/qemukvm/files/run-virt.include
new file mode 100644
index 00000000..02c70469
--- /dev/null
+++ b/src/os-plugins/plugins/qemukvm/files/run-virt.include
@@ -0,0 +1,306 @@
+# run-virt.include
+# -----------------------------------------------------------------------------
+# Copyright (c) 2009..2010 - RZ Uni Freiburg
+# Copyright (c) 2009..2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+# -----------------------------------------------------------------------------
+# run-virt.include
+# - Include script for running the QEMU/Linux KVM virtual machine on an
+# OpenSLX client via the run-virt.sh or run-vmgrid.sh
+################################################################################
+
+################################################################################
+### Include general configuration
+################################################################################
+if [ -f ${OPENSLX_DEFAULT_CONFDIR}/plugins/${self}/${self}.conf ]; then
+ . ${OPENSLX_DEFAULT_CONFDIR}/plugins/${self}/${self}.conf
+else
+ writelog "Problems reading config file of ${self} plugin"
+ # TODO: exit wenn conf wichtig
+ #exit 1
+fi
+
+################################################################################
+### Declaration of default variables
+################################################################################
+
+PLUGINCONFQK="${PLUGINCONFROOT}/${self}"
+PLUGINDIRQK=${OPENSLX_DEFAULT_DIR}/plugin-repo/${self}
+# create TMPDIR for all users
+mkdir -m 1777 /tmp/${self} 2>/dev/null
+# TMPDIR
+QKTMPDIR="/tmp/${self}/${USER}/${VM_ID}"
+# define dirs and files which can be removed after exit, be carefull!
+RMDIRS="${QKTMPDIR}"
+rm -rf ${RMDIRS} 2>/dev/null
+mkdir -m 1777 -p ${QKTMPDIR} 2>/dev/null
+# vmpath is the path to the vm, here an image (img|qcow*|vmdk)
+diskfile=${vmpath}
+
+# check the file type
+if echo ${imgname} | grep -iE "img|qcow|vmdk" >/dev/null 2>&1; then
+ imgtype=$(echo ${imgname##*.} | tr [a-z] [A-Z])
+else
+ writelog "${imgname} is not a valid image type (img|qcow*|vmdk), exiting!"
+ exit 1
+fi
+
+# hot keys ALT+CTRL+SHIFT
+VIRTCMDOPTS="${VIRTCMDOPTS} -alt-grab"
+
+# display name, remove blanks because of cmdline problems
+displayname=$(echo ${displayname} | sed -e "s, ,-,g")
+VIRTCMDOPTS="${VIRTCMDOPTS} -name ${displayname}"
+
+writelog "Directories:"
+writelog "\tTMPDIR:\t\t\t$QKTMPDIR"
+writelog "Diskimage:"
+writelog "\tDisk type:\t\t$imgtype"
+writelog "\tDisk file:\t\t$diskfile"
+
+################################################################################
+### Hardware checks
+################################################################################
+
+# memory part equal to vmware plugin
+# percentage of memory to use for virtualbox in standard case
+if [ -n "${forcemem}" ]; then
+ mem="${forcemem}"
+else
+ permem=30
+ if [ "${totalmem}" -ge "1600" ]; then
+ permem=40
+ fi
+# # check if /tmp is on harddisk
+# if grep -qe "/dev/.* /tmp " /proc/mounts ; then
+# permem=60
+# id44="1"
+# # Hack, if more than 2,5G RAM use 40% of Ram and write vmem into Ram as well
+# # (40% vmware | 40% confdir(vmem...) | 20% host
+# # VMplayer 2+ issue
+# # TODO: makes this sense for vbox?
+# #if [ "${totalmem}" -ge "2500" ]; then
+# #permem=40
+# #rmdir ${snapshotdir}
+# #snapshotdirold=${snapshotdir}
+# #snapshotdir=/dev/shm/${self}/${USER}/${VM_ID}
+# #mkdir -p ${snapshotdir}
+# #ln -sf ${snapshotdir} ${snapshotdirold}
+# #fi
+# fi
+ mem=$(expr ${totalmem} / 100 \* ${permem})
+ if [ "${id44}" = "1" ]; then
+ memhost=$(expr ${totalmem} - ${mem})
+ else
+ memhost=$(expr ${totalmem} - ${mem} - ${mem})
+ fi
+ # static first
+ permem=50
+ mem=$(expr ${totalmem} / 100 \* ${permem})
+ if [ "${mem}" -lt "256" ] || [ "${memhost}" -lt "256" ]; then
+ writelog "Memory out of range: ${mem} MB (guest) / ${memhost} MB (host)!"
+ writelog "Min. 256 MB for host and guest!"
+ exit 1
+ fi
+fi
+
+VIRTCMDOPTS="${VIRTCMDOPTS} -m ${mem}"
+
+# network adaptor alternatives: rtl8139, pcnet, e1000
+network_card=${network_card:=pcnet}
+VIRTCMDOPTS="${VIRTCMDOPTS} -net nic,macaddr=${macaddr},model=${network_card}"
+
+# define net kind and apply script
+qemu_ifscr="script=${PLUGINCONFQK}/ifup,downscript=${PLUGINCONFQK}/ifdown"
+case "${network_kind}" in
+ bridge*)
+ VIRTCMDOPTS="${VIRTCMDOPTS} -net tap,ifname=tapbridge${VM_ID},${qemu_ifscr}"
+ sudo /opt/openslx/uclib-rootfs/sbin/tunctl -t tapbridge${VM_ID} -u ${USER} \
+ >/dev/null 2>&1
+ sudo /opt/openslx/uclib-rootfs/usr/sbin/brctl addif br0 tapbridge${VM_ID}
+ POSTRUN="/opt/openslx/uclib-rootfs/sbin/tunctl -d tapbridge${VM_ID}"
+ ;;
+ nat)
+ VIRTCMDOPTS="${VIRTCMDOPTS} -net tap,ifname=tapnat${VM_ID},${qemu_ifscr}"
+ sudo /opt/openslx/uclib-rootfs/sbin/tunctl -t tapnat${VM_ID} -u ${USER} \
+ >/dev/null 2>&1
+ sudo /opt/openslx/uclib-rootfs/usr/sbin/brctl addif br0 tapnat${VM_ID}
+ POSTRUN="/opt/openslx/uclib-rootfs/sbin/tunctl -d tapnat${VM_ID}"
+ ;;
+ host*)
+ VIRTCMDOPTS="${VIRTCMDOPTS} -net tap,ifname=taphost${VM_ID},${qemu_ifscr}"
+ sudo /opt/openslx/uclib-rootfs/sbin/tunctl -t taphost${VM_ID} -u ${USER} \
+ >/dev/null 2>&1
+ sudo /opt/openslx/uclib-rootfs/usr/sbin/brctl addif br0 taphost${VM_ID}
+ POSTRUN="/opt/openslx/uclib-rootfs/sbin/tunctl -d taphost${VM_ID}"
+ ;;
+ *)
+ network_kind="user"
+ VIRTCMDOPTS="${VIRTCMDOPTS} -net user"
+ ;;
+esac
+
+# translate boot, use if set else set to HardDisk
+if [ -n "${boot}" ]; then
+ case ${boot} in
+ n*) # usually support for a,c,d,n, stands for Floppy, HD, CD-ROM, Network
+ boot="n"
+ # TODO: does not work yet, can be removed if tap1 solution better
+ if [ "${network_kind}" = "user" ] && [ -n "${virtualbox_tftpdir}" ]; then
+ VIRTCMDOPTS="${VIRTCMDOPTS},tftp=${virtualbox_tftpdir}"
+ fi
+ ;;
+ # later maybe c|disk|hd*|sd*) for HD and d|cd*) for CD-ROM
+ *)
+ boot="c"
+ ;;
+ esac
+else
+ boot="c"
+fi
+
+# external GUI port
+vncport="590${VM_ID}"
+
+# TODO: most of the following does not make much sense yet ...
+# virtual fd/cd/dvd and drive devices, floppy b: for configuration
+# if $floppy_0 from run-virt.include set then fdtest="TRUE"
+fdtest=
+fdtest=${floppy_0:+"TRUE"}
+# if $fdtest not set floppy0="FALSE", else "TRUE"
+floppy0=${fdtest:-"FALSE"}
+floppy1="TRUE"
+floppy1name="/var/lib/virt/vmchooser/loopimg/fd.img"
+# if $cdrom_0 from run-virt.include set then cdtest="TRUE"
+cdtest=
+cdtest=${cdrom_0:+"TRUE"}
+# if $cdtest not set cdrom0="FALSE", else "TRUE"
+cdrom0=${cdtest:-"FALSE"}
+# if $cdrom_1 from run-virt.include set then cdtest="TRUE"
+cdtest=
+cdtest=${cdrom_1:+"TRUE"}
+# if $cdtest not set cdrom1="FALSE", else "TRUE"
+cdrom1=${cdtest:-"FALSE"}
+# ide is expected default, test for the virtual disk image type should
+# be done while creating the runscripts ...
+ide="TRUE"
+hddrv="ide"
+
+# TODO: nur bei vmchooser
+#VIRTCMDOPTS="${VIRTCMDOPTS} -fda /dev/fd0"
+#VIRTCMDOPTS="${VIRTCMDOPTS} -fdb ${floppy1name}"
+
+# audio
+VIRTCMDOPTS="${VIRTCMDOPTS} -soundhw all"
+
+# serial
+#VIRTCMDOPTS="${VIRTCMDOPTS} -serial /dev/ttyS0"
+
+writelog "Virtual Hardware:"
+writelog "\tGuest RAM:\t\t${mem} MB"
+# echo nur wenn memhost gesetzt
+[ -n "${memhost}" ] && writelog "\tHost RAM:\t\t${memhost} MB"
+writelog "\tMAC address:\t\t$macaddr"
+writelog "\tNetwork card:\t\t${network_card}"
+writelog "\tNetwork kind:\t\t${network_kind}"
+#writelog "\tCD-ROM1:\t${cdrom0}"
+#writelog "\tCD-ROM2:\t${cdrom1}"
+#writelog "\tFloppy_A:\t${floppy0}"
+#writelog "\tFloppy_B:\t${floppy1}"
+#writelog "\tShared Folders 'home':\t/home/${USER}"
+
+################################################################################
+### finally set env for run-virt.sh
+################################################################################
+
+# TODO: besser drive statt hda?
+#-drive [file=file][,if=type][,bus=n][,unit=m][,media=d][,index=i]
+# [,cyls=c,heads=h,secs=s[,trans=t]][,snapshot=on|off]
+# [,cache=writethrough|writeback|none][,format=f][,serial=s]
+# [,boot=on|off]
+#-snapshot write to temporary files instead of disk image files
+#-usb enable the USB driver (will be the default soon)
+#-usbdevice name add the host or guest USB device 'name'
+#-nographic disable graphical output and redirect serial I/Os to console
+#-vga [std|cirrus|vmware|none] select video card type
+#-vnc display start a VNC server on display
+#-tftp dir allow tftp access to files in dir [-net user]
+#-bootp file advertise file in BOOTP replies
+#-no-fd-bootchk disable boot signature checking for floppy disks
+#-no-acpi disable ACPI
+#-kernel bzImage use 'bzImage' as kernel image
+#-append cmdline use 'cmdline' as kernel command line
+#-initrd file use 'file' as initial ram disk
+#-serial dev redirect the serial port to char device 'dev'
+#-parallel dev redirect the parallel port to char device 'dev'
+#-monitor dev redirect the monitor to char device 'dev'
+#-pidfile file write PID to 'file'
+#-d item1,... output log to /tmp/qemu.log (use -d ? for a list of log items)
+#-L path set the directory for the BIOS, VGA BIOS and keymaps
+#-bios file set the filename for the BIOS
+#-no-kvm disable KVM hardware virtualization
+#-enable-nesting enable support for running a VM inside the VM (AMD only)
+#-no-reboot exit instead of rebooting
+#-no-shutdown stop before shutdown
+#-loadvm [tag|id]
+# start right away with a saved state (loadvm in monitor)
+#-daemonize daemonize QEMU after initializing
+#-kvm-shadow-memory megs set the amount of shadow pages to be allocated
+#-mem-path set the path to hugetlbfs/tmpfs mounted directory, also
+# enables allocation of guest memory with huge pages
+#-mem-prealloc toggles preallocation of -mem-path backed physical memory
+# at startup. Default is enabled.
+#-option-rom rom load a file, rom, into the option ROM space
+#-localtime set the real time clock to local time [default=utc]
+#-startdate select initial date of the clock
+#-icount [N|auto]
+# enable virtual instruction counter with 2^N clock ticks per instruction
+#-echr chr set terminal escape character instead of ctrl-a
+#-virtioconsole c
+# set virtio console
+#-show-cursor show cursor
+
+# check for kvm modules
+if [ -c /dev/kvm ]; then
+ for tool in kvm qemu-kvm; do
+ VIRTCMD=$(which ${tool} 2>/dev/null)
+ [ -n "$VIRTCMD" ] && break
+ done
+else
+ VIRTCMD=$(which qemu 2>/dev/null)
+ writelog "KVM available but /dev/kvm not found!"
+ writelog "Trying fallback to QEMU emulation."
+fi
+
+if [ -z "${VIRTCMD}" ]; then
+ writelog "No QEMU/KVM found, exiting!"
+ rm -rf ${RMDIRS}
+ exit 1
+elif [ "${VIRTCMD##*/}" = "qemu" ]; then
+ writelog "User space emulation:\t\t${VIRTCMD}"
+else
+ writelog "User space virtualization:\t${VIRTCMD}"
+fi
+
+# using snapshots
+VIRTCMDOPTS="${VIRTCMDOPTS} -snapshot"
+
+# TODO: boot als var, -boot n, tftp...
+VIRTCMDOPTS="${VIRTCMDOPTS} -boot c"
+
+# set headless mode
+# define first, you do not want VIRTCMDOPTS from graphical start
+VIRTCMDHL=${VIRTCMD}
+VIRTCMDOPTSHL="${VIRTCMDOPTS} -nographic ${diskfile}"
+
+# graphical start
+# vga std/cirrus/vmware?
+#VIRTCMDOPTS="${VIRTCMDOPTS} -vga std -full-screen ${diskfile}"
+VIRTCMDOPTS="${VIRTCMDOPTS} ${diskfile}"
diff --git a/src/os-plugins/plugins/qemukvm/init-hooks/20-nw-bridge-config/bridge.sh b/src/os-plugins/plugins/qemukvm/init-hooks/20-nw-bridge-config/bridge.sh
new file mode 100644
index 00000000..ccae3381
--- /dev/null
+++ b/src/os-plugins/plugins/qemukvm/init-hooks/20-nw-bridge-config/bridge.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# Init hook to create a bridge on the active network interface
+# (should be kept identical to the files of virtualbox and vmware plugins)
+#############################################################################
+
+local bridge=br0
+local brnwif=${nwif}
+local nwifmac=${macaddr}
+
+# bridge 0 already defined or some other problem
+brctl addbr ${bridge} || exit 0
+brctl stp ${bridge} 0
+brctl setfd ${bridge} 0.000000000001
+ip link set addr ${nwifmac} ${bridge}
+ip link set dev ${nwif} up
+brctl addif ${bridge} ${nwif}
+
+# fixme: sending back the variable to init does not work properly at the
+# moment
+nwif=${bridge}
diff --git a/src/os-plugins/plugins/qemukvm/init-hooks/60-have-servconfig/vm-dhcpd.sh b/src/os-plugins/plugins/qemukvm/init-hooks/60-have-servconfig/vm-dhcpd.sh
new file mode 100755
index 00000000..b4f02389
--- /dev/null
+++ b/src/os-plugins/plugins/qemukvm/init-hooks/60-have-servconfig/vm-dhcpd.sh
@@ -0,0 +1,60 @@
+#!/bin/sh
+# Copyright (c) 2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# Init hook to create a bridge on the active network interface
+# (should be kept identical in vmware, virtualbox and qemukvm plugins)
+#############################################################################
+
+. /etc/openslx.conf
+
+CONFDIR=/mnt/${OPENSLX_DEFAULT_CONFDIR}
+testmkd ${CONFDIR}
+
+# configuring dhcpd stub for virtual networks
+cat > ${CONFDIR}/udhcpd.conf << EOF
+# general udhcpd configuration file for virtual machines written by
+# $0 during OpenSLX stage3 configuration
+
+# start and end of the IP lease block
+start CNETWORK.20
+end CNETWORK.100
+
+# interface that udhcpd will use
+interface NWIF
+
+# how long an offered address is reserved (leased) in seconds
+offer_time 6000
+
+# location of the leases file
+lease_file LEASEFILE
+
+# location of the pid file
+pidfile PIDFILE
+
+option dns ${domain_name_servers}
+option subnet 255.255.255.0
+option router CNETWORK.1
+option wins CNETWORK.10
+option domain virtual.site ${domain_name}
+
+# additional options known to udhcpd
+#subnet #timezone
+#router #timesvr
+#namesvr #dns
+#logsvr #cookiesvr
+#lprsvr #bootsize
+#domain #swapsvr
+#rootpath #ipttl
+#mtu #broadcast
+#wins #lease
+#ntpsrv #tftp
+#bootfile
+EOF
diff --git a/src/os-plugins/plugins/syslog/OpenSLX/Distro/Base.pm b/src/os-plugins/plugins/syslog/OpenSLX/Distro/Base.pm
new file mode 100644
index 00000000..ed08c5f3
--- /dev/null
+++ b/src/os-plugins/plugins/syslog/OpenSLX/Distro/Base.pm
@@ -0,0 +1,93 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# syslog/OpenSLX/Distro/Base.pm
+# - provides base implementation of the Distro API for the syslog plugin.
+# -----------------------------------------------------------------------------
+package syslog::OpenSLX::Distro::Base;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+use Scalar::Util qw( weaken );
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {};
+ return bless $self, $class;
+}
+
+sub initialize
+{
+ my $self = shift;
+ $self->{engine} = shift;
+ weaken($self->{engine});
+ # avoid circular reference between plugin and its engine
+
+ return 1;
+}
+
+sub runlevelInfo
+{
+ my $self = shift;
+ my $kind = shift;
+
+ # most distros (well: Debian & Ubuntu) use a different initscript depending
+ # on which version of syslog is installed ('syslogd', 'syslog-ng' or 'rsyslog')
+ my %nameMap = (
+ 'syslogd' => 'sysklogd',
+ 'syslog-ng' => 'syslog-ng',
+ 'rsyslog' => 'rsyslog',
+ );
+ my $rlInfo = {
+ scriptName => $nameMap{$kind},
+ startAt => 2,
+ stopAt => 15,
+ };
+
+ return $rlInfo;
+}
+
+sub getPackageName
+{
+ my $self = shift;
+ my $name = shift;
+
+ my %nameMap = (
+ 'syslogd' => 'sysklogd',
+ 'syslog-ng' => 'syslog-ng',
+ 'rsyslog' => 'rsyslog',
+ );
+ return $nameMap{$name};
+}
+
+sub getBinaryName
+{
+ my $self = shift;
+ my $name = shift;
+
+ my %nameMap = (
+ 'syslogd' => 'sysklogd',
+ 'syslog-ng' => 'syslog-ng',
+ 'rsyslog' => 'rsyslogd',
+ );
+ return $nameMap{$name};
+}
+
+1;
diff --git a/src/os-plugins/plugins/syslog/OpenSLX/Distro/Suse.pm b/src/os-plugins/plugins/syslog/OpenSLX/Distro/Suse.pm
new file mode 100644
index 00000000..7255d6f5
--- /dev/null
+++ b/src/os-plugins/plugins/syslog/OpenSLX/Distro/Suse.pm
@@ -0,0 +1,41 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# syslog/OpenSLX/Distro/Suse.pm
+# - provides SUSE-specific overrides of the Distro API for the syslog plugin.
+# -----------------------------------------------------------------------------
+package syslog::OpenSLX::Distro::Suse;
+
+use strict;
+use warnings;
+
+use base qw(syslog::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub runlevelInfo
+{
+ my $self = shift;
+ my $attrs = shift;
+
+ my $rlInfo = $self->SUPER::runlevelInfo($attrs);
+
+ # SUSE uses a script named 'syslog', no matter if syslogd or syslog-ng
+ # is installed
+ $rlInfo->{scriptName} = 'syslog';
+
+ return $rlInfo;
+}
+
+1;
diff --git a/src/os-plugins/plugins/syslog/OpenSLX/OSPlugin/syslog.pm b/src/os-plugins/plugins/syslog/OpenSLX/OSPlugin/syslog.pm
new file mode 100644
index 00000000..c011bf66
--- /dev/null
+++ b/src/os-plugins/plugins/syslog/OpenSLX/OSPlugin/syslog.pm
@@ -0,0 +1,322 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# syslog.pm
+# - implementation of the 'syslog' plugin, which installs
+# all needed information for a displaymanager and for the syslog.
+# -----------------------------------------------------------------------------
+package OpenSLX::OSPlugin::syslog;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSPlugin::Base);
+
+use File::Basename;
+use File::Path;
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+sub new
+{
+ my $class = shift;
+
+ my $self = {
+ name => 'syslog',
+ };
+
+ return bless $self, $class;
+}
+
+sub getInfo
+{
+ my $self = shift;
+
+ return {
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Sets up system log service for SLX-clients.
+ End-of-Here
+ precedence => 50,
+ };
+}
+
+sub getAttrInfo
+{
+ my $self = shift;
+
+ return {
+ 'syslog::active' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should the 'syslog'-plugin be executed during boot?
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '1 means active - 0 means inactive',
+ default => '1',
+ },
+ 'syslog::kind' => {
+ applies_to_vendor_os => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ kind of syslog to use \(syslogd-ng or old-style syslog\)
+ End-of-Here
+ content_regex => qr{^(syslog-ng|syslogd|rsyslog)$},
+ content_descr => 'allowed: syslog-ng, syslogd, rsyslog',
+ default => 'rsyslog',
+ },
+ 'syslog::host' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ name or IP-address of host where syslog shall be sent to
+ End-of-Here
+ content_regex => undef,
+ content_descr => 'a hostname or an IP address',
+ default => undef,
+ },
+ 'syslog::port' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ port number (UDP) where syslog shall be sent to
+ End-of-Here
+ content_regex => undef,
+ content_descr => 'a port number',
+ default => 514,
+ },
+ 'syslog::file' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ name of file where all log messages shall be written
+ End-of-Here
+ content_regex => undef,
+ content_descr => 'a complete file path',
+ default => '/var/log/messages',
+ },
+ };
+}
+
+sub installationPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ $self->{pluginRepositoryPath} = $info->{'plugin-repo-path'};
+ $self->{pluginTempPath} = $info->{'plugin-temp-path'};
+ $self->{openslxBasePath} = $info->{'openslx-base-path'};
+ $self->{openslxConfigPath} = $info->{'openslx-config-path'};
+ $self->{attrs} = $info->{'plugin-attrs'};
+
+ # We are going to change some of the stage1 attributes during installation
+ # (basically we are filling the ones that are not defined). Since the result
+ # of these changes might change between invocations, we do not want to store
+ # the resulting values, but we want to store the original (undef).
+ # In order to do so, we copy all stage1 attributes directly into the
+ # object hash and change them there.
+ $self->{kind} = lc($self->{attrs}->{'syslog::kind'});
+
+ my $engine = $self->{'os-plugin-engine'};
+
+ if ($self->{kind} eq 'rsyslog' && !isInPath($self->{distro}->getBinaryName('rsyslog'))) {
+ $engine->installPackages($self->{distro}->getPackageName('rsyslog'));
+ }
+
+ if ($self->{kind} eq 'syslog-ng' && !isInPath('syslog-ng')) {
+ $engine->installPackages($self->{distro}->getPackageName($self->{distro}->getBinaryName('syslog-ng')));
+ }
+
+ # not sure if we ever should setup this service
+ if ($self->{kind} eq 'syslogd' && !isInPath($self->{distro}->getBinaryName('syslogd'))) {
+ $engine->installPackages($self->{distro}->getPackageName('syslogd'));
+ }
+
+ if (!$self->{kind}) {
+ if (qx{which $self->{distro}->getBinaryName('rsyslog')}) {
+ $self->{kind} = 'rsyslog';
+ }
+ elsif (qx{which $self->{distro}->getBinaryName('syslog-ng')}) {
+ $self->{kind} = 'syslog-ng';
+ }
+ elsif (qx{which $self->{distro}->getBinaryName('syslogd')}) {
+ $self->{kind} = 'syslogd';
+ }
+ else {
+ die _tr(
+ "no syslog daemon available, plugin 'syslog' wouldn't work!"
+ );
+ }
+ print _tr("selecting %s as syslog kind\n", $self->{kind});
+ }
+
+ # start to actually do something - according to current stage1 attributes
+ if ($self->{kind} eq 'rsyslog') {
+ $self->_setupRsyslog($self->{attrs});
+ }
+ elsif ($self->{kind} eq 'syslog-ng') {
+ $self->_setupSyslogNG($self->{attrs});
+ }
+ elsif ($self->{kind} eq 'syslogd') {
+ $self->_setupSyslogd($self->{attrs});
+ }
+ else {
+ die _tr(
+ 'unknown kind "%s" given, only "rsyslog", "syslog-ng" and "syslogd" are supported!',
+ $self->{kind}
+ );
+ }
+
+ return;
+}
+
+sub removalPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ return;
+}
+
+sub _setupRsyslog
+{
+ my $self = shift;
+ my $attrs = shift;
+
+ my $repoPath = $self->{pluginRepositoryPath};
+
+ my $kind = lc($attrs->{'syslog::kind'});
+ my $rlInfo = $self->{distro}->runlevelInfo($kind);
+
+ my $conf = unshiftHereDoc(<<" End-of-Here");
+ #!/bin/sh
+ # written by OpenSLX-plugin 'syslog'
+
+ testmkd /mnt/var/run/rsyslog
+ rllinker $rlInfo->{scriptName} $rlInfo->{startAt} $rlInfo->{stopAt}
+
+ End-of-Here
+ spitFile("$repoPath/syslog.sh", $conf);
+
+ return;
+}
+
+sub _setupSyslogNG
+{
+ my $self = shift;
+ my $attrs = shift;
+
+ my $repoPath = $self->{pluginRepositoryPath};
+
+ my $kind = lc($attrs->{'syslog::kind'});
+ my $rlInfo = $self->{distro}->runlevelInfo($kind);
+
+ my $conf = unshiftHereDoc(<<" End-of-Here");
+ #!/bin/sh
+ # written by OpenSLX-plugin 'syslog'
+
+ cat >/mnt/etc/syslog-ng/syslog-ng.conf <<END
+ # written by OpenSLX-plugin 'syslog'
+ source all {
+ file("/proc/kmsg");
+ unix-dgram("/dev/log");
+ internal();
+ };
+ destination console_all {
+ file("/dev/tty10");
+ };
+ log {
+ source(all);
+ destination(console_all);
+ };
+ END
+
+ if [ -n "\${syslog_host}" ]; then
+ [ -z \${syslog_port} ] && syslog_port=514
+ cat >>/mnt/etc/syslog-ng/syslog-ng.conf <<END
+ destination loghost {
+ udp( "\${syslog_host}" port(\${syslog_port}) );
+ };
+ log {
+ source(all);
+ destination(loghost);
+ };
+ END
+ fi
+
+ if [ -n "\${syslog_file}" ]; then
+ cat >>/mnt/etc/syslog-ng/syslog-ng.conf <<END
+ destination allmessages {
+ file("\${syslog_file}");
+ };
+ log {
+ source(all);
+ destination(allmessages);
+ };
+ END
+ fi
+
+ rllinker $rlInfo->{scriptName} $rlInfo->{startAt} $rlInfo->{stopAt}
+
+ End-of-Here
+ spitFile("$repoPath/syslog.sh", $conf);
+
+ return;
+}
+
+sub _setupSyslogd
+{
+ my $self = shift;
+ my $attrs = shift;
+
+ my $repoPath = $self->{pluginRepositoryPath};
+
+ my $kind = lc($attrs->{'syslog::kind'});
+ my $rlInfo = $self->{distro}->runlevelInfo($kind);
+
+ my $conf = unshiftHereDoc(<<' End-of-Here');
+ #!/bin/sh
+ # written by OpenSLX-plugin 'syslog'
+
+ cat >/mnt/etc/syslog.conf <<END
+ # written by OpenSLX-plugin 'syslog'
+ *.=debug;\
+ auth,authpriv.none;\
+ news.none;mail.none -/var/log/debug
+ *.=info;*.=notice;*.=warn;\
+ auth,authpriv.none;\
+ cron,daemon.none;\
+ mail,news.none -/var/log/messages
+
+ END
+
+ if [ -n "\${syslog_host}" ]; then
+ [ -z \${syslog_port} ] && syslog_port=514
+ cat >/mnt/etc/syslog.conf <<END
+ *.* @${syslog_host}
+ END
+ fi
+
+ if [ -n "\${syslog_file}" ]; then
+ cat >/mnt/etc/syslog.conf <<END
+ *.* ${syslog_file}
+ };
+ END
+ fi
+
+ rllinker $rlInfo->{scriptName} $rlInfo->{startAt} $rlInfo->{stopAt}
+
+ End-of-Here
+ spitFile("$repoPath/syslog.sh", $conf);
+
+ return;
+}
+
+1;
diff --git a/src/os-plugins/plugins/syslog/XX_syslog.sh b/src/os-plugins/plugins/syslog/XX_syslog.sh
new file mode 100644
index 00000000..0a96814f
--- /dev/null
+++ b/src/os-plugins/plugins/syslog/XX_syslog.sh
@@ -0,0 +1,31 @@
+# Copyright (c) 2007..2008 - RZ Uni Freiburg
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# stage3 part of 'syslog' plugin - the runlevel script
+#
+# script is included from init via the "." load function - thus it has all
+# variables and functions available
+
+# check if the plugin config directory is generally available or if the client
+# configuration failed somehow
+[ -d /initramfs/plugin-conf ] || error "${init_picfg}" nonfatal
+
+if [ -e /initramfs/plugin-conf/syslog.conf ]; then
+ . /initramfs/plugin-conf/syslog.conf
+ if [ $syslog_active -ne 0 ]; then
+ [ $DEBUGLEVEL -gt 0 ] && echo "executing the 'syslog' os-plugin ..."
+
+ . /mnt/opt/openslx/plugin-repo/syslog/syslog.sh
+
+ [ $DEBUGLEVEL -gt 0 ] && echo "done with 'syslog' os-plugin ..."
+
+ fi
+fi
diff --git a/src/os-plugins/plugins/syslog/init-hooks/15-have-ip-config/syslog.sh b/src/os-plugins/plugins/syslog/init-hooks/15-have-ip-config/syslog.sh
new file mode 100644
index 00000000..f0ca370f
--- /dev/null
+++ b/src/os-plugins/plugins/syslog/init-hooks/15-have-ip-config/syslog.sh
@@ -0,0 +1,18 @@
+if [ -e /initramfs/plugin-conf/syslog.conf ]; then
+ . /initramfs/plugin-conf/syslog.conf
+ if [ $syslog_active -ne 0 ]; then
+ # TODO: maybe limit the maximum log file size via rotation?
+ params="-s 0"
+ if [ -n "$syslog_host" ]; then
+ if [ -n "${syslog_port}" ]; then
+ host="${syslog_host}:${syslog_port}"
+ else
+ host="${syslog_host}"
+ fi
+ params="$params -R ${host}"
+ fi
+ echo "syslogd $params ..."
+ syslogd $params >/dev/null 2>&1
+ klogd >/dev/null 2>&1
+ fi
+fi
diff --git a/src/os-plugins/plugins/syslog/init-hooks/95-cleanup/syslog.sh b/src/os-plugins/plugins/syslog/init-hooks/95-cleanup/syslog.sh
new file mode 100644
index 00000000..08076c34
--- /dev/null
+++ b/src/os-plugins/plugins/syslog/init-hooks/95-cleanup/syslog.sh
@@ -0,0 +1,12 @@
+if [ -e /initramfs/plugin-conf/syslog.conf ]; then
+ . /initramfs/plugin-conf/syslog.conf
+ if [ $syslog_active -ne 0 ] && [ -n "$syslog_host" ]; then
+ # kill syslogd, as it is going to be replaced by system's syslog soon
+ killall syslogd
+ # remove links to boot.klog, as that will hang (I suppose that is
+ # because we already emptied /dev/kmsg)
+ if [ -e /mnt/etc/init.d/boot.klog ]; then
+ rm /mnt/etc/init.d/boot.d/*.klog
+ fi
+ fi
+fi
diff --git a/src/os-plugins/plugins/sysrqshutdown/OpenSLX/OSPlugin/sysrqshutdown.pm b/src/os-plugins/plugins/sysrqshutdown/OpenSLX/OSPlugin/sysrqshutdown.pm
new file mode 100644
index 00000000..9800c203
--- /dev/null
+++ b/src/os-plugins/plugins/sysrqshutdown/OpenSLX/OSPlugin/sysrqshutdown.pm
@@ -0,0 +1,101 @@
+# Copyright (c) 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# sysrqshutdown.pm
+# - implementation of the 'sysrqshutdow' plugin, which replaces the shutdown
+# binary through a SYSRQ shutdown script
+# -----------------------------------------------------------------------------
+package OpenSLX::OSPlugin::sysrqshutdown;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSPlugin::Base);
+
+use File::Path;
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+sub new
+{
+ my $class = shift;
+
+ my $self = {
+ name => 'sysrqshutdown',
+ };
+
+ return bless $self, $class;
+}
+
+sub getInfo
+{
+ my $self = shift;
+
+ return {
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Replaces the shutdown binary through a SYSRQ shutdown script
+ End-of-Here
+ precedence => 10,
+ };
+}
+
+sub getAttrInfo
+{
+ my $self = shift;
+
+ return {
+ 'sysrqshutdown::active' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should the 'sysrqshutdown'-plugin be activated?
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '1 means active - 0 means inactive',
+ default => '1',
+ },
+
+ };
+}
+
+sub installationPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ if (! -e "/sbin/shutdown.slxorig") {
+ # copy files
+ my $openslxBasePath = $info->{'openslx-base-path'};
+ my $pluginName = $self->{'name'};
+ my $pluginBasePath
+ = "$openslxBasePath/lib/plugins/$pluginName/files";
+
+ system("mv /sbin/shutdown /sbin/shutdown.slxorig");
+ system("cp -p $pluginBasePath/shutdown /sbin/");
+ chmod 0755, "/sbin/shutdown";
+ }
+
+ return;
+}
+
+sub removalPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ if (-e "/sbin/shutdown.slxorig") {
+ system("mv /sbin/shutdown.slxorig /sbin/shutdown");
+ }
+
+ return;
+}
+
+1;
diff --git a/src/os-plugins/plugins/sysrqshutdown/XX_sysrqshutdown.sh b/src/os-plugins/plugins/sysrqshutdown/XX_sysrqshutdown.sh
new file mode 100644
index 00000000..66a728da
--- /dev/null
+++ b/src/os-plugins/plugins/sysrqshutdown/XX_sysrqshutdown.sh
@@ -0,0 +1,38 @@
+# Copyright (c) 2010 - RZ Uni Freiburg
+# Copyright (c) 2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# script is included from init via the "." load function - thus it has all
+# variables and functions available
+
+# include default directories
+. /etc/openslx.conf
+
+CONFFILE="/initramfs/plugin-conf/sysrqshutdown.conf"
+PLUGINCONFDIR=/mnt/${OPENSLX_DEFAULT_CONFDIR}/plugins/sysrqshutdown
+
+if [ -f $CONFFILE ]; then
+
+ # load needed variables
+ . $CONFFILE
+
+ if [ ${sysrqshutdown_active} -ne 0 ] ; then
+ [ ${DEBUGLEVEL} -gt 0 ] && echo "executing the 'sysrqshutdown' plugin ..."
+
+ testmkd ${PLUGINCONFDIR}
+ cp $CONFFILE ${PLUGINCONFDIR}/sysrqshutdown.conf
+
+ # finished ...
+ [ $DEBUGLEVEL -gt 0 ] && echo "done with 'sysrqshutdown' plugin ..."
+ fi
+else
+ [ $DEBUGLEVEL -gt 0 ] && echo " * config of 'sysrqshutdown' plugin failed"
+fi
+
diff --git a/src/os-plugins/plugins/sysrqshutdown/files/shutdown b/src/os-plugins/plugins/sysrqshutdown/files/shutdown
new file mode 100644
index 00000000..7f4e9a1f
--- /dev/null
+++ b/src/os-plugins/plugins/sysrqshutdown/files/shutdown
@@ -0,0 +1,54 @@
+#!/bin/bash
+# -----------------------------------------------------------------------------
+# Copyright (c) 2010 - RZ Uni FR
+# Copyright (c) 2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# shutdown
+# - Script for SYSRQ shutdown
+################################################################################
+
+. /etc/opt/openslx/openslx.conf
+
+################################################################################
+### Define default dirs / get configs
+################################################################################
+
+PLUGINCONFROOT=${OPENSLX_DEFAULT_CONFDIR}/plugins
+PLUGINCONFVMGRID=${PLUGINCONFROOT}/sysrqshutdown
+# include general configuration from vmgrid
+if [ -f ${PLUGINCONFVMGRID}/sysrqshutdown.conf ]; then
+ . ${PLUGINCONFVMGRID}/sysrqshutdown.conf
+else
+ sysrqshutdown_active=0
+fi
+
+if [ ${sysrqshutdown_active} -eq 1 ]; then
+ # check if reboot or halt
+ case "$@" in
+ '-r now')
+ for i in $(echo s u b); do
+ echo $i > /proc/sysrq-trigger &
+ done
+ exit 0
+ ;;
+ '-h now')
+ for i in $(echo s u o); do
+ echo $i > /proc/sysrq-trigger &
+ done
+ exit 0
+ ;;
+ esac
+fi
+# else use orig shutdown
+shutdown.slxorig $@
+
+exit 0
+
diff --git a/src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Base.pm b/src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Base.pm
new file mode 100644
index 00000000..d26cdfcc
--- /dev/null
+++ b/src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Base.pm
@@ -0,0 +1,59 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# virtualbox/OpenSLX/Distro/Base.pm
+# - provides base implementation of the Distro API for the VirtualBox plugin.
+# -----------------------------------------------------------------------------
+package virtualbox::OpenSLX::Distro::Base;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+use Scalar::Util qw( weaken );
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {};
+ return bless $self, $class;
+
+}
+
+sub initialize
+{
+ my $self = shift;
+ $self->{engine} = shift;
+ weaken($self->{engine});
+ # avoid circular reference between plugin and its engine
+
+ return 1;
+}
+
+sub installVbox
+{
+ my $self = shift;
+
+ my $engine = $self->{'engine'};
+
+ # lets try it... we can't loose anything :)
+ $engine->installPackages('virtualbox-ose');
+
+ return;
+}
+
+1;
diff --git a/src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Debian.pm b/src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Debian.pm
new file mode 100644
index 00000000..edd117ca
--- /dev/null
+++ b/src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Debian.pm
@@ -0,0 +1,52 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# virtualbox/OpenSLX/Distro/debian.pm
+# - provides Debian-specific overrides of the Distro API for the VirtualBox
+# plugin.
+# -----------------------------------------------------------------------------
+package virtualbox::OpenSLX::Distro::Debian;
+
+use strict;
+use warnings;
+
+use base qw(virtualbox::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub installVbox
+{
+ my $self = shift;
+
+ my $engine = $self->{'engine'};
+ my $release = `lsb_release -rs`;
+ chomp($release);
+
+ # lenny(5.0) has v1.6
+ # testing is ok. but no clue which lsb_release -rs it has...
+ if ( $release eq "999999.0") {
+ #the usual "in stage1 chroot we get another kernel vers. problem"
+ # kernel modules need to be installed from the cloned system
+ #$engine->installPackages('virtualbox-ose');
+ #system('/etc/init.d/virtualbox-ose setup');
+ } else {
+ print "Couldn't install VirtualBox, no package from distribution\n";
+ exit;
+ }
+
+ return;
+}
+
+1;
diff --git a/src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Suse.pm b/src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Suse.pm
new file mode 100644
index 00000000..9af3191e
--- /dev/null
+++ b/src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Suse.pm
@@ -0,0 +1,48 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# virtualbox/OpenSLX/Distro/Suse.pm
+# - provides SUSE specific overrides of the distro API for the VirtualBox
+# plugin.
+# -----------------------------------------------------------------------------
+package virtualbox::OpenSLX::Distro::Suse;
+
+use strict;
+use warnings;
+
+use base qw(virtualbox::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub installVbox
+{
+ my $self = shift;
+
+ my $engine = $self->{'engine'};
+ # should be replaced by proper function
+ my $release = `lsb_release -rs`;
+ chomp($release);
+
+ if ( $release eq "11.1" || $release eq "11.0" || $release eq "10.3") {
+ $engine->installPackages('virtualbox-ose');
+ } else {
+ print "Couldn't install VirtualBox, no package from distribution\n";
+ exit;
+ }
+
+ return;
+}
+
+1;
diff --git a/src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Ubuntu.pm b/src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Ubuntu.pm
new file mode 100644
index 00000000..44695680
--- /dev/null
+++ b/src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Ubuntu.pm
@@ -0,0 +1,54 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# virtualbox/OpenSLX/Distro/Ubuntu.pm
+# - provides Ubuntu-specific overrides of the Distro API for the virtualbox
+# plugin.
+# -----------------------------------------------------------------------------
+package virtualbox::OpenSLX::Distro::Ubuntu;
+
+use strict;
+use warnings;
+
+# inherit everything from Debian (as Ubuntu is based on it anyway)
+use base qw(virtualbox::OpenSLX::Distro::Debian);
+use base qw(virtualbox::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+
+################################################################################
+#### interface methods
+################################################################################
+sub installVbox
+{
+ my $self = shift;
+
+ my $engine = $self->{'engine'};
+ my $release = `lsb_release -rs`;
+ chomp($release);
+
+ # hardy (8.04LTS): only version VBox v1.5
+ if ( $release eq "8.10" || $release eq "9.04") {
+ #the usual "in stage1 chroot we get another kernel vers. problem"
+ # kernel modules need to be installed from the cloned system
+ #$engine->installPackages("virtualbox-ose");
+ #system('/etc/init.d/virtualbox-ose setup');
+ } else {
+ print "Couldn't install VirtualBox, no package from distribution!\n";
+ exit;
+ }
+
+
+ return;
+}
+
+1;
diff --git a/src/os-plugins/plugins/virtualbox/OpenSLX/OSPlugin/virtualbox.pm b/src/os-plugins/plugins/virtualbox/OpenSLX/OSPlugin/virtualbox.pm
new file mode 100644
index 00000000..07ec9dc0
--- /dev/null
+++ b/src/os-plugins/plugins/virtualbox/OpenSLX/OSPlugin/virtualbox.pm
@@ -0,0 +1,284 @@
+# Copyright (c) 2009..2010 - RZ Uni Freiburg
+# Copyright (c) 2009..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# virtualbox.pm
+# - declares necessary information for the virtualbox plugin
+# -----------------------------------------------------------------------------
+package OpenSLX::OSPlugin::virtualbox;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSPlugin::Base);
+
+use File::Basename;
+use File::Path;
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+use OpenSLX::DistroUtils;
+
+sub new
+{
+ my $class = shift;
+ my $self = {
+ name => 'virtualbox',
+ };
+
+ return bless $self, $class;
+}
+
+sub getInfo
+{
+ my $self = shift;
+
+ return {
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Module for enabling services for the VirtualBox on an OpenSLX
+ stateless client.
+ End-of-Here
+ precedence => 70,
+ # headless mode does not require a desktop!
+ #required => [ qw( desktop ) ],
+ };
+}
+
+sub getAttrInfo
+{
+ # Returns a hash-ref with information about all attributes supported
+ # by this specific plugin
+ my $self = shift;
+
+ # This default configuration will be added as attributes to the default
+ # system, such that it can be overruled for any specific system by means
+ # of slxconfig.
+ return {
+ # attribute 'active' is mandatory for all plugins
+ 'virtualbox::active' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should the 'virtualbox'-plugin be executed during boot?
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '1 for active, 0 for inactive',
+ default => '1',
+ },
+ # attribute 'imagesrc' defines where we can find virtualbox images
+ 'virtualbox::imagesrc' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Where do we store our virtualbox images? NFS? Filesystem?
+ End-of-Here
+ content_regex => qr{^(/|nfs://)},
+ content_descr => 'local path or URI or "-" (unset)',
+ default => undef,
+ },
+ # attribute 'bridge' defines if bridged network mode should be
+ # switched on
+ # TODO: change to net -> nat, bridge, hostonly?
+ # TODO: since we use def in XML maybe use to override
+ 'virtualbox::bridge' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Should the bridging (direct access of the virtualbox clients
+ to the ethernet the host is connected to) be enabled
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '0 or 1',
+ default => '1',
+ },
+ # attribute 'mem' defines if memory should be forced
+ 'virtualbox::mem' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Do you want to force a ralative amount of RAM?
+ (Not implemented right now!)
+ End-of-Here
+ content_regex => qr{^(\d\d??)$},
+ content_descr => 'Between 0 - 99',
+ default => undef,
+ },
+ # attribute 'kvm' defines if KVM modules should be forced
+ 'virtualbox::kvm' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Do you want to force the usage of KVM modules where applicable?
+ (Not implemented right now!)
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '0 or 1',
+ default => undef,
+ },
+ # attribute 'tftpdir' defines TFTP dir for network boots /w NAT
+ 'virtualbox::tftpdir' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Do you want to define a stage 4 TFTP dir for netwoork boots when
+ using NAT?
+ Hint: Mount your TFTP ro via NFS to a local dir
+ End-of-Here
+ content_regex => qr{^(/)},
+ content_descr => 'local path or "-" (unset)',
+ default => '/var/lib/virt/virtualbox',
+ },
+ };
+}
+
+sub installationPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ $self->{pluginRepositoryPath} = $info->{'plugin-repo-path'};
+ $self->{pluginTempPath} = $info->{'plugin-temp-path'};
+ $self->{openslxBasePath} = $info->{'openslx-base-path'};
+ $self->{openslxConfigPath} = $info->{'openslx-config-path'};
+ $self->{attrs} = $info->{'plugin-attrs'};
+
+ my $engine = $self->{'os-plugin-engine'};
+
+ # Different names of the tool (should be unified somehow!?)
+ if (!isInPath('VirtualBox')) {
+ # todo: fix this
+ $self->{distro}->installVbox();
+ }
+ if (!isInPath('VirtualBox')) {
+ print
+ "VirtualBox is not installed. VirtualBox Plugin won't be installed!\n"
+ ;
+ #exit
+ }
+
+ $self->_writeRunlevelScript();
+
+ # Copy run-virt.include and template files to the appropriate place for
+ # inclusion in stage4
+ my $pluginName = $self->{'name'};
+ my $pluginBasePath =
+ "$self->{openslxBasePath}/lib/plugins/$pluginName/files";
+ foreach my $file ( qw( run-virt.include virtualbox.include machine.include
+ empty-diff.vdi.gz rwimg.vdi.gz ) ) {
+ copyFile("$pluginBasePath/$file", "$self->{pluginRepositoryPath}/");
+ chmod 0644, "$self->{pluginRepositoryPath}/$file";
+ }
+
+ return;
+}
+
+sub removalPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ return;
+}
+
+sub checkStage3AttrValues
+{
+ my $self = shift;
+ my $stage3Attrs = shift;
+ my $vendorOSAttrs = shift;
+ #my @problems;
+
+ #my $vmimg = $stage3Attrs->{'virtualbox::imagesrc'} || '';
+
+ return;
+}
+
+# Write the runlevelscript
+sub _writeRunlevelScript
+{
+ my $self = shift;
+ my $initfile = newInitFile();
+ my $script = "";
+
+ $initfile->setName("vbox-slx");
+ $initfile->setDesc("Setup environment for virtualbox. Part of OpenSLX virtualbox plugin.");
+
+ # todo: Function need to be formated proper... not important right now
+ $initfile->addFunction(
+ 'running',
+ 'lsmod | grep -q "$1[^_-]"'
+ );
+ #
+ $script = unshiftHereDoc(<<' End-of-Here');
+ if running vboxdrv; then
+ if running vboxnetflt; then
+ echo "VirtualBox kernel modules (vboxdrv and vboxnetflt) are loaded."
+ else
+ echo "VirtualBox kernel module is loaded."
+ fi
+ #TODO: check it: ignore user check. handling our own way:
+ for i in /tmp/.vbox-*-ipc; do
+ echo "Running: "
+ $(VBoxManage -q list runningvms | sed -e 's/^".*"//' 2>/dev/null)
+ done
+ else
+ echo "VirtualBox kernel module(s) are not loaded."
+ fi
+ End-of-Here
+ $initfile->addFunction(
+ "vmstatus",
+ "$script"
+ );
+ $initfile->addFunction(
+ 'start',
+ ' modprobe -qa vboxdrv vboxnetflt vboxnetadp',
+ );
+ $initfile->addFunction(
+ 'stop',
+ ' rmmod vboxnetadp vboxnetflt vboxdrv',
+ );
+ $initfile->addToCase(
+ 'start',
+ 'start'
+ );
+ $initfile->addToCase(
+ 'stop',
+ 'stop'
+ );
+ $initfile->addToCase(
+ 'status',
+ 'vmstatus'
+ );
+ $initfile->addToCase(
+ 'restart',
+ 'stop && start'
+ );
+
+ # get distro version
+ my $distro = (split('-',$self->{'os-plugin-engine'}->distroName()))[0];
+ my $runlevelscript = getInitFileForDistro($initfile, $distro);
+
+ spitFile("$self->{'pluginRepositoryPath'}/vbox-slx", $runlevelscript);
+}
+
+# The bridge configuration needs the bridge module to be present in early
+# stage3
+sub suggestAdditionalKernelModules
+{
+ my $self = shift;
+ my $makeInitRamFSEngine = shift;
+
+ my @suggestedModules;
+
+ push @suggestedModules, qw( bridge );
+
+ return @suggestedModules;
+}
+
+1;
diff --git a/src/os-plugins/plugins/virtualbox/XX_virtualbox.sh b/src/os-plugins/plugins/virtualbox/XX_virtualbox.sh
new file mode 100644
index 00000000..b54b4bec
--- /dev/null
+++ b/src/os-plugins/plugins/virtualbox/XX_virtualbox.sh
@@ -0,0 +1,98 @@
+# Copyright (c) 2009..2010 - RZ Uni Freiburg
+# Copyright (c) 2009..2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# script is included from init via the "." load function - thus it has all
+# variables and functions available
+
+# include default directories
+. /etc/openslx.conf
+
+CONFFILE=/initramfs/plugin-conf/virtualbox.conf
+PLUGINCONFDIR=/mnt/${OPENSLX_DEFAULT_CONFDIR}/plugins/virtualbox
+PLUGINDIR=/mnt/${OPENSLX_DEFAULT_DIR}/plugin-repo/virtualbox
+VIRTDIR=/mnt/${OPENSLX_DEFAULT_VIRTDIR}/virtualbox
+
+# check if the configuration file is available
+if [ -e ${CONFFILE} ]; then
+
+ # load needed variables
+ . ${CONFFILE}
+
+ # Test if this plugin is activated... more or less useless with the
+ # new plugin system
+ if [ $virtualbox_active -ne 0 2>/dev/null ]; then
+
+ [ $DEBUGLEVEL -gt 0 ] && echo "executing the 'virtualbox' os-plugin ...";
+
+ # load general configuration
+ . /etc/initramfs-setup
+
+ # get source of virtualbox image server (get type, server and path)
+ if strinstr "/" "${virtualbox_imagesrc}" ; then
+ vbimgprot=$(uri_token ${virtualbox_imagesrc} prot)
+ vbimgserv=$(uri_token ${virtualbox_imagesrc} server)
+ vbimgpath="$(uri_token ${virtualbox_imagesrc} path)"
+ fi
+ if [ -n "${vbimgserv}" ] ; then
+ # directory where qemu images are expected in
+ mnttarget=${VIRTDIR}
+ # mount the virtualbox image source readonly (ro)
+ fsmount ${vbimgprot} ${vbimgserv} ${vbimgpath} ${mnttarget} ro
+ else
+ [ $DEBUGLEVEL -gt 1 ] && \
+ error " * Incomplete information in variable ${virtualbox_imagesrc}." \
+ nonfatal
+ fi
+
+ # copy virtualization include files to config dir
+ testmkd ${PLUGINCONFDIR}
+ cp ${PLUGINDIR}/*.include ${PLUGINCONFDIR}
+ # copy ${CONFFILE} to ${PLUGINCONFDIR} just in case
+ cp ${CONFFILE} ${PLUGINCONFDIR}
+
+# # TODO: create rawdisk if requested
+# # create raw disk
+# for part in $(grep -qE " 44 | 45 " /etc/disk.partition); do
+# case "${part}" in
+# * 45 *)
+# id4x=$(grep " 45 " /etc/disk.partition | grep -E " 44 | 45 " \
+# | awk '{print $1}' | cut -c -8)
+# break
+# ;;
+# * 44 *)
+# id4x=$(grep " 44 " /etc/disk.partition | grep -E " 44 | 45 " \
+# | awk '{print $1}' | cut -c -8)
+# break
+# ;;
+# esac
+# if [ -n "${id4x}" ]; then
+# mount --bind /dev /mnt/dev
+# chroot /mnt VBoxManage -q internalcommands createrawvmdk -filename \
+# ${OPENSLX_DEFAULT_CONFDIR}/plugins/virtualbox/raw.vmdk -rawdisk ${id4x}
+# chmod 777 ${OPENSLX_DEFAULT_CONFDIR}/plugins/virtualbox/raw.vmdk
+# umount -f /mnt/dev 2>/dev/null
+# fi
+
+ # copy and activate init file
+ cp ${PLUGINDIR}/vbox-slx /mnt/etc/init.d/
+ chmod 755 /mnt/etc/init.d/vbox-slx
+ rllinker "vbox-slx" 20 2
+
+ mknod -m 0660 /dev/vboxdrv c 10 59
+ chown root:vboxusers /dev/vboxdrv
+
+ # finished ...
+ [ $DEBUGLEVEL -gt 0 ] && echo "done with 'virtualbox' os-plugin ..."
+ fi
+else
+ [ $DEBUGLEVEL -gt 0 ] \
+ && echo " * Configuration of 'virtualbox' plugin failed"
+fi
diff --git a/src/os-plugins/plugins/virtualbox/files/empty-diff.vdi.gz b/src/os-plugins/plugins/virtualbox/files/empty-diff.vdi.gz
new file mode 100644
index 00000000..24697b58
--- /dev/null
+++ b/src/os-plugins/plugins/virtualbox/files/empty-diff.vdi.gz
Binary files differ
diff --git a/src/os-plugins/plugins/virtualbox/files/machine.include b/src/os-plugins/plugins/virtualbox/files/machine.include
new file mode 100644
index 00000000..96acd7a2
--- /dev/null
+++ b/src/os-plugins/plugins/virtualbox/files/machine.include
@@ -0,0 +1,132 @@
+# Include file (machine template) for run-virt.include of the virtualbox plugin
+cat << EOF > "${machconfig}"
+<?xml version="1.0"?>
+<VirtualBox xmlns="http://www.innotek.de/VirtualBox-settings" version="1.9-linux">
+ <Machine uuid="{${machineuuid}}" name="${vm_name}" OSType="${vmostype}">
+ <ExtraData>
+ <ExtraDataItem name="GUI/AutoresizeGuest" value="on"/>
+ <ExtraDataItem name="GUI/Fullscreen" value="on"/>
+ <ExtraDataItem name="GUI/LastCloseAction" value="powerOff"/>
+ <ExtraDataItem name="GUI/MiniToolBarAlignment" value="top"/>
+ <ExtraDataItem name="GUI/MiniToolBarAutoHide" value="on"/>
+ <ExtraDataItem name="GUI/SaveMountedAtRuntime" value="yes"/>
+ <ExtraDataItem name="GUI/Seamless" value="off"/>
+ <ExtraDataItem name="GUI/ShowMiniToolBar" value="yes"/>
+ </ExtraData>
+ <Hardware version="2">
+ <CPU count="${cpu_cores}">
+ <HardwareVirtEx enabled="${enablevt}" exclusive="true"/>
+ <HardwareVirtExNestedPaging enabled="${npaging}"/>
+ <HardwareVirtExVPID enabled="false"/>
+ <PAE enabled="true"/>
+ </CPU>
+ <Memory RAMSize="${mem}"/>
+ <Boot>
+ <Order position="1" device="${boot}"/> <!-- HardDisk, DVD, Network, Floppy -->
+ <Order position="2" device="None"/>
+ <Order position="3" device="None"/>
+ <Order position="4" device="None"/>
+ </Boot>
+ <Display VRAMSize="24" monitorCount="1" accelerate3D="false" accelerate2DVideo="false"/>
+ <!-- authType="External", "Guest", "Null" -->
+ <RemoteDisplay enabled="false" port="${vrdpport}" authType="Null" authTimeout="5000"/>
+ <BIOS>
+ <ACPI enabled="true"/>
+ <IOAPIC enabled="true"/>
+ <Logo fadeIn="false" fadeOut="false" displayTime="0"/>
+ <BootMenu mode="MessageAndMenu"/>
+ <TimeOffset value="0"/>
+ <PXEDebug enabled="false"/>
+ </BIOS>
+ <USBController enabled="true" enabledEhci="true"/>
+ <Network>
+ <Adapter slot="0" enabled="true" MACAddress="${macaddr}" cable="true" speed="0" type="${vb_network_card}">
+ <${network_kind}/>
+ </Adapter>
+ <Adapter slot="1" enabled="false" MACAddress="0800279312FB" cable="true" speed="0" type="Am79C973"/>
+ <Adapter slot="2" enabled="false" MACAddress="080027A3A3CA" cable="true" speed="0" type="Am79C973"/>
+ <Adapter slot="3" enabled="false" MACAddress="0800277356F6" cable="true" speed="0" type="Am79C973"/>
+ <Adapter slot="4" enabled="false" MACAddress="080027CEA83A" cable="true" speed="0" type="Am79C973"/>
+ <Adapter slot="5" enabled="false" MACAddress="0800271B8D7A" cable="true" speed="0" type="Am79C973"/>
+ <Adapter slot="6" enabled="false" MACAddress="08002771BBD7" cable="true" speed="0" type="Am79C973"/>
+ <Adapter slot="7" enabled="false" MACAddress="080027EB6A12" cable="true" speed="0" type="Am79C973"/>
+ </Network>
+ <UART>
+ <Port slot="0" enabled="false" IOBase="0x3f8" IRQ="4" hostMode="Disconnected"/>
+ <Port slot="1" enabled="false" IOBase="0x3f8" IRQ="4" hostMode="Disconnected"/>
+ </UART>
+ <LPT>
+ <Port slot="0" enabled="false" IOBase="0x378" IRQ="4"/>
+ <Port slot="1" enabled="false" IOBase="0x378" IRQ="4"/>
+ </LPT>
+ <AudioAdapter controller="AC97" driver="Alsa" enabled="${audio}"/> <!-- OSS, Alsa, Pulse (HANGS!) -->
+ <SharedFolders>
+ <SharedFolder name="${sharename}" hostPath="${sharepath}" writable="true"/>
+ </SharedFolders>
+ <Clipboard mode="Bidirectional"/>
+ <Guest memoryBalloonSize="0" statisticsUpdateInterval="0"/>
+ <!--
+ <GuestProperties>
+ <GuestProperty name="/VirtualBox/HostGuest/SysprepExec" value="" timestamp="1268140071072779000" flags="TRANSIENT, RDONLYGUEST"/>
+ <GuestProperty name="/VirtualBox/HostGuest/SysprepArgs" value="" timestamp="1268140071072939000" flags="TRANSIENT, RDONLYGUEST"/>
+ <GuestProperty name="/VirtualBox/GuestInfo/OS/Product" value="Linux" timestamp="1268140265864540000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/OS/Release" value="2.6.27.21" timestamp="1268140265894019000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/OS/Version" value="#3 SMP Fri Feb 26 16:38:21 CET 2010" timestamp="1268140265898448000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/OS/ServicePack" value="" timestamp="1268140265899571000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Revision" value="57640" timestamp="1268140265900144000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Version" value="3.1.4" timestamp="1268140265899937000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/OS/LoggedInUsers" value="1" timestamp="1268164075148440000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/Count" value="4" timestamp="1268164075148790000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/0/V4/IP" value="132.230.4.224" timestamp="1268164075149053000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/0/V4/Broadcast" value="132.230.4.255" timestamp="1268164075149297000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/0/V4/Netmask" value="255.255.255.0" timestamp="1268164075149596000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/0/Status" value="Up" timestamp="1268164075149829000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/1/V4/IP" value="192.168.112.1" timestamp="1268164075150037000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/1/V4/Broadcast" value="192.168.112.255" timestamp="1268164075150238000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/1/V4/Netmask" value="255.255.255.0" timestamp="1268164075150439000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/1/Status" value="Up" timestamp="1268164075150635000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/2/V4/IP" value="192.168.54.1" timestamp="1268164075150835000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/2/V4/Broadcast" value="192.168.54.255" timestamp="1268164075151072000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/2/V4/Netmask" value="255.255.255.0" timestamp="1268164075151282000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/2/Status" value="Up" timestamp="1268164075151479000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/OS/NoLoggedInUsers" value="false" timestamp="1268140276063587000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Vbgl/Video/SavedMode" value="1024x768x32" timestamp="1268140287190297000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/HostVerLastChecked" value="3.1.4" timestamp="1268140310962236000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/3/V4/IP" value="192.168.122.1" timestamp="1268164075152293000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/3/V4/Broadcast" value="192.168.122.255" timestamp="1268164075152615000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/3/V4/Netmask" value="255.255.255.0" timestamp="1268164075152828000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/3/Status" value="Up" timestamp="1268164075153029000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/4/V4/IP" value="169.254.4.104" timestamp="1265728007966805000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/4/V4/Broadcast" value="169.254.255.255" timestamp="1265728007967184000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/4/V4/Netmask" value="255.255.0.0" timestamp="1265728007967487000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/4/Status" value="Up" timestamp="1265728007967829000" flags=""/>
+ <GuestProperty name="/VirtualBox/HostInfo/GUI/LanguageID" value="de_DE" timestamp="1268140070610343000" flags=""/>
+ <GuestProperty name="/VirtualBox/HostInfo/VBoxVer" value="3.1.4" timestamp="1268154582522485000" flags="TRANSIENT, RDONLYGUEST"/>
+ <GuestProperty name="/VirtualBox/HostInfo/VBoxRev" value="57640" timestamp="1268154582522507000" flags="TRANSIENT, RDONLYGUEST"/>
+ <GuestProperty name="/VirtualBox/GuestInfo/OS/LoggedInUsersList" value="vmuser" timestamp="1268164075147867000" flags=""/>
+ </GuestProperties>
+ -->
+ </Hardware>
+ <StorageControllers>
+ <StorageController name="IDE-Controller" type="PIIX4" PortCount="2">
+ <AttachedDevice type="HardDisk" port="0" device="0">
+ <Image uuid="{${imageuuid}}"/>
+ </AttachedDevice> <!-- PLEASE DO NOT REMOVE THIS COMMENT (HD)!!! -->
+ <AttachedDevice passthrough="false" type="DVD" port="0" device="1">
+ <HostDrive src="${cdrom_0}"/>
+ </AttachedDevice> <!-- PLEASE DO NOT REMOVE THIS COMMENT (CD)!!! -->
+ </StorageController>
+ <!--
+ <StorageController name="Disketten-Controller" type="I82078" PortCount="1">
+ <AttachedDevice type="Floppy" port="0" device="0"/>
+ </StorageController>
+ <StorageController name="SCSI-Controller" type="LsiLogic" PortCount="16">
+ <AttachedDevice type="HardDisk" port="0" device="0">
+ <Image uuid="{812c82bf-bd1a-4f59-a5b6-b54ae2f6c669}"/>
+ </AttachedDevice>
+ </StorageController>
+ -->
+ </StorageControllers>
+ </Machine>
+</VirtualBox>
+EOF
diff --git a/src/os-plugins/plugins/virtualbox/files/run-virt.include b/src/os-plugins/plugins/virtualbox/files/run-virt.include
new file mode 100644
index 00000000..53120f2c
--- /dev/null
+++ b/src/os-plugins/plugins/virtualbox/files/run-virt.include
@@ -0,0 +1,372 @@
+# run-virt.include
+# -----------------------------------------------------------------------------
+# Copyright (c) 2009..2010 - RZ Uni Freiburg
+# Copyright (c) 2009..2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+# -----------------------------------------------------------------------------
+# run-virt.include
+# - Include script for running the VirtualBox on an OpenSLX client via the
+# run-virt.sh or run-vmgrid.sh
+################################################################################
+
+################################################################################
+### Include general configuration
+################################################################################
+if [ -f ${OPENSLX_DEFAULT_CONFDIR}/plugins/${self}/${self}.conf ]; then
+ . ${OPENSLX_DEFAULT_CONFDIR}/plugins/${self}/${self}.conf
+else
+ writelog "Problems reading config file of ${self} plugin"
+ exit 1
+fi
+
+################################################################################
+### Declaration of default variables
+################################################################################
+
+PLUGINCONFVIRTUALBOX="${PLUGINCONFROOT}/${self}"
+PLUGINDIRVIRTUALBOX="${OPENSLX_DEFAULT_DIR}/plugin-repo/${self}"
+# create TMPDIR for all users
+TMPDIR=/tmp/${self}
+mkdir -m 1777 ${TMPDIR} 2>/dev/null
+# dir for configs
+confdir="/tmp/${self}/${USER}/${VM_ID}"
+# use alternate configuration directory instead of $HOME/.VirtualBox
+export VBOX_USER_HOME=${confdir}
+# define dirs and files which can be removed after exit, be carefull!
+RMDIRS="${snapshotdir} ${confdir} /tmp/.vbox-${USER}-ipc"
+rm -rf ${RMDIRS} 2>/dev/null
+machfolder="${confdir}/Machines"
+# use vm_shortname for dir and config names since vm_name can be very long
+machconfig="${machfolder}/${vm_shortname}/${vm_shortname}.xml"
+diskfolder="${confdir}/HardDisks"
+snapshotdir=${machfolder}/${vm_shortname}/Snapshots
+mkdir -p ${diskfolder} ${snapshotdir} 2>/dev/null
+# check if diskless var empty?
+[ -z "${diskless}" ] && diskless=0
+
+# configure our own rwimg, empty image which we support
+if [ "${imgmode}" = "rwimg" ]; then
+ # what is our rwimg called?
+ imgname="${vm_shortname}.vdi"
+ vmpath=${imgpath}/${imgname}
+ if ! [ -e "${vmpath}" ]; then
+ cat ${PLUGINDIRVIRTUALBOX}/rwimg.vdi.gz | gunzip > "${vmpath}"
+ fi
+fi
+
+# link to image
+diskfile="${diskfolder}/${imgname}"
+[ ${diskless} -eq 0 ] && ln -sf ${vmpath} ${diskfile}
+
+# check the file type
+if echo ${imgname} | grep -qiE "vdi|vmdk|vhd" && [ ${diskless} -eq 0 ]; then
+ imgfmt=$(echo ${imgname##*.} | tr [a-z] [A-Z])
+elif [ ${diskless} -eq 0 ]; then
+ writelog "${imgname} is not a valid image format (vdi|vmdk|vhd), exiting!"
+ cleanexit 1
+fi
+
+# TODO: maybe rewrite, to reduce checks, merge it with network option,
+# so we can have a "compatibility to vmware config" section
+case "${vmostype}" in
+ winxp*|windowsxp*)
+ vmostype="WindowsXP"
+ ;;
+ winvista*|windowsvista*)
+ vmostype="WindowsVista"
+ ;;
+ windows7*)
+ vmostype="Windows7"
+ ;;
+ linux*|*ubuntu*|*suse*|debian*|*sci*)
+ if echo "${vmostype}" | grep -q "64"; then
+ vmostype="Linux26_64"
+ # check for vtflag
+ if [ ${vtflag} -ne 1 ]; then
+ writelog "You are trying to boot a 64 bit OS without a VT enabled CPU"
+ writelog "This is not supported, exiting!"
+ cleanexit 1
+ fi
+ # check if host is only 32 bit, then use only 1 cpu (only 1 supported)
+ if echo "${host_arch}" | grep -qE "i.86"; then
+ cpu_cores=1
+ fi
+ else
+ vmostype="Linux26"
+ fi
+ ;;
+esac
+
+writelog "Directories:"
+writelog "\tConfig dir:\t\t$confdir"
+writelog "\tMachines dir:\t\t$machfolder"
+writelog "\tMachine config:\t\t$machconfig"
+[ ${diskless} -eq 0 ] && writelog "\tHardDisks dir:\t\t$diskfolder"
+
+################################################################################
+### Hardware checks
+################################################################################
+
+# remove ':' from MAC addr for vbox
+macaddr=$(echo ${macaddr} | sed 's/://g')
+
+# machine UUID, MAC addr part of it
+machineuuid="00000000-0000-0000-0000-${macaddr}"
+# cosmetical, since UUID in lower case
+machineuuid=$(echo ${machineuuid} | tr [A-Z] [a-z])
+# get UUID of VBox image, if not diskless
+[ ${diskless} -eq 0 ] && diskuuid=$(VBoxManage -q showvdiinfo ${diskfile} \
+ | grep UUID | awk '{print $2}')
+# make disk immutable
+imgtype="Immutable"
+# snapshot UUID is static
+snapshotuuid="88bc8b6d-f248-468a-95fe-318084904f8b"
+# imageuuid in machine.include, dafault snapshotuuid
+imageuuid=${snapshotuuid}
+
+# check if rw image
+# remove disk and add rwimg if set
+if echo "${imgmode}" | grep -q rw; then
+ # lock existing?
+ if [ -e "${vmpath}.lock" ]; then
+ writelog "This rw image is already in use."
+ writelog "Found lock: ${vmpath}.lock, exiting!"
+ writelog "Remove lock if you are sure that this is not the case"
+ cleanexit 1
+ # image rw?
+ elif ! [ -w ${vmpath} ]; then
+ writelog "You defined mode rw, but image ${vmpath} is not rw! \c"
+ writelog "Please correct, exiting!"
+ cleanexit 1
+ fi
+ # add lock
+ touch "${vmpath}.lock"
+ # remove lock after VM stopped
+ RMDIRS="${RMDIRS} ${vmpath}.lock"
+ imgtype="Normal"
+ # replace image uuid in machine config
+ imageuuid=${diskuuid}
+elif [ ${diskless} -eq 0 ]; then
+ # use temp disk as snapshot
+ cat ${PLUGINDIRVIRTUALBOX}/empty-diff.vdi.gz \
+ | gunzip > "${snapshotdir}/{${snapshotuuid}}.vdi"
+fi
+
+# TODO: MEM muss noch angepasst werden. Maschine crasht wenn nehr als 50% MEM
+# memory part equal to vmware plugin
+# percentage of memory to use for virtualbox in standard case
+#if [ -n "${forcemem}" ]; then
+# mem="${forcemem}"
+#else
+# permem=30
+# if [ "${totalmem}" -ge "1600" ]; then
+# permem=40
+# fi
+# # check if /tmp is on harddisk
+# if grep -qe "/dev/.* /tmp " /proc/mounts ; then
+# permem=60
+# id44="1"
+# # Hack, if more than 2,5G RAM use 40% of Ram and write vmem into Ram as well
+# # (40% vmware | 40% confdir(vmem...) | 20% host
+# # VMplayer 2+ issue
+# # TODO: makes this sense for vbox?
+# #if [ "${totalmem}" -ge "2500" ]; then
+# #permem=40
+# #rmdir ${snapshotdir}
+# #snapshotdirold=${snapshotdir}
+# #snapshotdir=/dev/shm/${self}/${USER}/${VM_ID}
+# #mkdir -p ${snapshotdir}
+# #ln -sf ${snapshotdir} ${snapshotdirold}
+# #fi
+# fi
+# mem=$(expr ${totalmem} / 100 \* ${permem})
+# if [ "${id44}" = "1" ]; then
+# hostmem=$(expr ${totalmem} - ${mem})
+# else
+# hostmem=$(expr ${totalmem} - ${mem} - ${mem})
+# fi
+# #permem=40
+# #mem=$(expr ${totalmem} * ${permem})
+# if [ "${mem}" -lt "256" ] || [ "${hostmem}" -lt "256" ]; then
+# writelog "Memory out of range: ${mem} MB (guest) / ${hostmem} MB (host)!"
+# writelog "Min. 256 MB for host and guest!"
+# cleanexit 1
+# fi
+#fi
+
+# translate network cards
+case "${network_card}" in
+ e1000)
+ vb_network_card="82540EM"
+ ;;
+ virtio)
+ vb_network_card="virtio"
+ ;;
+ *)
+ network_card="pcnet"
+ vb_network_card="Am79C973"
+esac
+
+# translate network kinds (nat, bridged, host-only)
+case "${network_kind}" in
+ bridge*)
+ network_kind='BridgedInterface name="br0"'
+ ;;
+ host*)
+ network_kind='HostOnlyInterface name="vboxnet0"'
+ ;;
+ *)
+ network_kind="NAT"
+esac
+
+# translate boot, use if set else set to HardDisk
+# usually support for a,c,d,n, stands for Floppy, HD, CD-ROM, Network
+# support nfs and tftp as well
+case ${boot} in
+ n*|tftp)
+ boot="Network"
+ if [ "${network_kind}" = "NAT" ] && [ -n "${virtualbox_tftpdir}" ]; then
+ # use vm_shortname to avoid Problems /w TFTP in NAT
+ vm_name=${vm_shortname}
+ # link TFTP dir for NAT TFTP boots
+ mkdir -p ${confdir}/TFTP
+ if [ -e ${virtualbox_tftpdir}/pxelinux.0 ]; then
+ cp ${virtualbox_tftpdir}/pxelinux.0 ${confdir}/TFTP/${vm_name}.pxe
+ else
+ writelog "${virtualbox_tftpdir}/pxelinux.0 not found!"
+ writelog "Network boot won't work, exiting!"
+ cleanexit 1
+ fi
+ for i in $(ls ${virtualbox_tftpdir}); do
+ ln -sf ${virtualbox_tftpdir}/${i} ${confdir}/TFTP/${i}
+ done
+ fi
+ ;;
+ # later maybe c|disk|hd*|sd*) for HD and d|cd*) for CD-ROM
+ *)
+ boot="HardDisk"
+ ;;
+esac
+
+# nested paging
+npaging="false"
+# enable VT
+enablevt="false"
+# check for VT, if not available use only 1 cpu (only 1 supported)
+[ ${vtflag} -eq 0 ] && cpu_cores=1
+[ ${vtflag} -eq 1 ] && enablevt="true"
+
+# external GUI
+vrdpport=${remotedesktopport}
+
+[ ${diskless} -eq 0 ] && writelog "\tSnapshots dir:\t\t$snapshotdir"
+writelog "Diskimage:"
+[ ${diskless} -eq 0 ] && writelog "\tDisk file:\t\t$diskfile"
+[ ${diskless} -eq 0 ] && writelog "\tDisk format:\t\t$imgfmt"
+[ ${diskless} -eq 0 ] && writelog "\tDisk type:\t\t$imgtype"
+ writelog "\tVMostype:\t\t$vmostype"
+ writelog "\tMachine UUID:\t\t$machineuuid"
+[ ${diskless} -eq 0 ] && writelog "\tDisk UUID:\t\t$diskuuid"
+writelog "Virtual Hardware:"
+writelog "\tCPU cores:\t\t${cpu_cores}\c"
+[ ${vtflag} -eq 0 ] && writelog ""
+[ ${vtflag} -eq 1 ] && writelog " (VT enabled CPU)"
+writelog "\tGuest RAM:\t\t${mem} MB"
+# echo nur wenn hostmem gesetzt
+[ -n "${hostmem}" ] && writelog "\tHost RAM:\t\t${hostmem} MB"
+writelog "\tMAC address:\t\t$macaddr"
+writelog "\tNetwork card:\t\t${vb_network_card}"
+writelog "\tNetwork kind:\t\t${network_kind}"
+writelog "\tBooting from:\t\t${boot}\c"
+[ ${diskless} -eq 0 ] && writelog ""
+[ ${diskless} -eq 1 ] && writelog " 'diskless'"
+# TODO: server start activate via xml, etc...
+#writelog "\tGuest VRDP port:\t${vrdpport}"
+writelog "\tCD-ROM1:\t\t${cdrom0}"
+#writelog "\tCD-ROM2:\t\t${cdrom1}"
+#writelog "\tFloppy_A:\t\t${floppy0}"
+#writelog "\tFloppy_B:\t\t${floppy1}"
+# defined in run-virt.sh and run-vmgrid.sh
+writelog "\tShared Folders '${sharename}':\t${sharepath}"
+
+################################################################################
+### Pepare and configure virtual machine and disk image
+################################################################################
+
+# create Virtualbox.xml
+. ${PLUGINCONFVIRTUALBOX}/virtualbox.include
+
+# remove snapshot disk when using rw images
+if [ "${imgtype}" != "Immutable" ]; then
+ sed -i "/${snapshotuuid}/d" "${confdir}/VirtualBox.xml"
+fi
+
+# TODO: add rawdisk if requested
+#"raw.vmdk" format="VMDK" type="Writethrough"/>
+
+# create machine.xml
+. ${PLUGINCONFVIRTUALBOX}/machine.include
+
+# remove CD-ROM
+if [ "${cdrom0}" != "TRUE" ]; then
+ sed -i "/HostDrive/d" ${machconfig}
+ sed -i '/AttachedDevice.*type="DVD"/d' ${machconfig}
+ sed -i "/<!-- PLEASE DO NOT REMOVE THIS COMMENT (CD)!!! -->/d" ${machconfig}
+fi
+
+# if diskless remove all disks
+if [ ${diskless} -eq 1 ]; then
+ sed -i "/<HardDisk/d;/<\/HardDisk/d" "${confdir}/VirtualBox.xml"
+ sed -i "/${imageuuid}/d" ${machconfig}
+ sed -i '/AttachedDevice type="HardDisk"/d' ${machconfig}
+ sed -i "/<!-- PLEASE DO NOT REMOVE THIS COMMENT (HD)!!! -->/d" ${machconfig}
+fi
+
+# define redirects
+if [ ${redirects} -ge 1 ]; then
+ (( i=1 ))
+ writelog "\tGuest redirects:\t\c"
+ while [ ${i} -le ${redirects} ]; do
+ extradataitem='<ExtraDataItem name="VBoxInternal/Devices'
+ extradataitem="${extradataitem}/${network_card}/0/LUN#0/Config"
+ extradataitem="${extradataitem}/${redirect_name[$i]}/"
+ extradataprotocol="Protocol\" value=\"${redirect_proto[$i]}\"/>"
+ extradatahostport="HostPort\" value=\"${redirect_hport[$i]}\"/>"
+ extradataguestport="GuestPort\" value=\"${redirect_gport[$i]}\"/>"
+ sed -i "s,</ExtraData>, ${extradataitem}${extradataguestport}\n\
+ ${extradataitem}${extradatahostport}\n\
+ ${extradataitem}${extradataprotocol}\n\
+ </ExtraData>," "${machconfig}"
+ writelog "${tabspace}${redirect_name[$i]} port: ${redirect_hport[$i]}"
+ tabspace='\t\t\t\t'
+ (( i=$i+1 ))
+ done
+fi
+
+################################################################################
+### finally set env for run-virt.sh
+################################################################################
+
+# wait for a certain command to settle
+# get the PID of the right process
+# kill PID, seems to work
+VBMANPID=$(pstree -p | grep VBoxXPCOMIPCD | grep -ivE "VirtualBox|VBoxHeadless"\
+ | sed -e "s/.*VBoxXPCOMIPCD(\(.*\)).*/\1/")
+for i in $(echo ${VBMANPID}); do
+ kill -9 ${VBMANPID} >/dev/null 2>&1
+done
+
+# set the variables appropriately (several interfaces with different names)
+VIRTCMD=$(which VirtualBox 2>/dev/null)
+VIRTCMDOPTS="--startvm ${machineuuid} --start-running"
+
+# set headless mode (-v off to disable vrdp)
+VIRTCMDHL=$(which VBoxHeadless 2>/dev/null)
+VIRTCMDOPTSHL="-s ${machineuuid}"
diff --git a/src/os-plugins/plugins/virtualbox/files/rwimg.vdi.gz b/src/os-plugins/plugins/virtualbox/files/rwimg.vdi.gz
new file mode 100644
index 00000000..e2133d6d
--- /dev/null
+++ b/src/os-plugins/plugins/virtualbox/files/rwimg.vdi.gz
Binary files differ
diff --git a/src/os-plugins/plugins/virtualbox/files/virtualbox.include b/src/os-plugins/plugins/virtualbox/files/virtualbox.include
new file mode 100644
index 00000000..9576fc9c
--- /dev/null
+++ b/src/os-plugins/plugins/virtualbox/files/virtualbox.include
@@ -0,0 +1,47 @@
+# Include file (general template) for run-virt.include of the virtualbox plugin
+cat << EOF > "${confdir}/VirtualBox.xml"
+<?xml version="1.0"?>
+<VirtualBox xmlns="http://www.innotek.de/VirtualBox-settings" version="1.9-linux"> <!-- 1.7-linux -->
+ <Global>
+ <ExtraData>
+ <ExtraDataItem name="GUI/Input/AutoCapture" value="true"/>
+ <ExtraDataItem name="GUI/Input/HostKey" value="65300"/> <!-- scroll lock / Rollen -->
+ <ExtraDataItem name="GUI/LastVMSelected" value="${machineuuid}"/>
+ <ExtraDataItem name="GUI/LicenseAgreed" value="1,2,3,4,5,6,7,8,9"/>
+ <ExtraDataItem name="GUI/MaxGuestResolution" value="any"/> <!-- auto, width,height -->
+ <ExtraDataItem name="GUI/SUNOnlineData" value="triesLeft=0"/>
+ <ExtraDataItem name="GUI/SuppressMessages" value=",remindAboutAutoCapture,confirmInputCapture,remindAboutWrongColorDepth,confirmGoingFullscreen,remindAboutMouseIntegrationOn,remindAboutMouseIntegrationOff,showRuntimeError.warning.DevATA_DISKFULL,remindAboutPausedVMInput,confirmVMReset,showRuntimeError.warning.HostAudioNotResponding"/>
+ <ExtraDataItem name="GUI/TrayIcon/Enabled" value="false"/>
+ <ExtraDataItem name="GUI/UpdateCheckCount" value="2"/>
+ <ExtraDataItem name="GUI/UpdateDate" value="never"/>
+ </ExtraData>
+ <MachineRegistry>
+ <MachineEntry uuid="{${machineuuid}}" src="Machines/${vm_shortname}/${vm_shortname}.xml"/>
+ </MachineRegistry>
+ <MediaRegistry>
+ <HardDisks>
+ <HardDisk uuid="{${diskuuid}}" location="${diskfile}" format="${imgfmt}" type="${imgtype}">
+ <HardDisk uuid="{${snapshotuuid}}" location="${snapshotdir}/{${snapshotuuid}}.vdi" format="VDI" autoReset="true"/>
+ </HardDisk>
+ </HardDisks>
+ <!--
+ <DVDImages>
+ <Image uuid="{dcd1e32a-729f-4faa-b319-67adca15e4a4}" location="/.../gpxe-1.0.0+-virtio-net.iso"/>
+ <Image uuid="{b71450c6-b8ff-43c1-a290-2a793b3023d8}" location="/.../gpxe-1.0.0+-e1000.iso"/>
+ </DVDImages>
+ -->
+ <FloppyImages/>
+ </MediaRegistry>
+ <NetserviceRegistry>
+ <DHCPServers>
+ <DHCPServer networkName="HostInterfaceNetworking-vboxnet0" IPAddress="192.168.56.100" networkMask="255.255.255.0" lowerIP="192.168.56.101" upperIP="192.168.56.254" enabled="1"/>
+ <!--
+ <DHCPServer networkName="HostInterfaceNetworking-vboxnet1" IPAddress="0.0.0.0" networkMask="0.0.0.0" lowerIP="0.0.0.0" upperIP="0.0.0.0" enabled="0"/>
+ -->
+ </DHCPServers>
+ </NetserviceRegistry>
+ <SystemProperties defaultMachineFolder="${machfolder}" defaultHardDiskFolder="${diskfolder}" defaultHardDiskFormat="VDI" remoteDisplayAuthLibrary="VRDPAuth" webServiceAuthLibrary="VRDPAuth" LogHistoryCount="3"/>
+ <USBDeviceFilters/>
+ </Global>
+</VirtualBox>
+EOF
diff --git a/src/os-plugins/plugins/virtualbox/init-hooks/20-nw-bridge-config/bridge.sh b/src/os-plugins/plugins/virtualbox/init-hooks/20-nw-bridge-config/bridge.sh
new file mode 100644
index 00000000..a6d335c5
--- /dev/null
+++ b/src/os-plugins/plugins/virtualbox/init-hooks/20-nw-bridge-config/bridge.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+# Copyright (c) 2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# Init hook to create a bridge on the active network interface
+# (should be kept identical to the files of virtualbox and qemukvm plugins)
+#############################################################################
+
+local bridge=br0
+local brnwif=${nwif}
+local nwifmac=${macaddr}
+
+# bridge 0 already defined or some other problem
+brctl addbr ${bridge} || exit 0
+brctl stp ${bridge} 0
+brctl setfd ${bridge} 0.000000000001
+ip link set addr ${nwifmac} ${bridge}
+ip link set dev ${nwif} up
+brctl addif ${bridge} ${nwif}
+
+# fixme: sending back the variable to init does not work properly at the
+# moment
+nwif=${bridge}
diff --git a/src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Base.pm b/src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Base.pm
new file mode 100644
index 00000000..43e4ea1f
--- /dev/null
+++ b/src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Base.pm
@@ -0,0 +1,64 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# vmchooser/OpenSLX/Distro/Base.pm
+# - provides base implementation of the Distro API for the vmchooser plugin.
+# -----------------------------------------------------------------------------
+package vmchooser::OpenSLX::Distro::Base;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+use File::Basename;
+use File::Path;
+use Scalar::Util qw( weaken );
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {};
+ return bless $self, $class;
+}
+
+sub initialize
+{
+ my $self = shift;
+ $self->{engine} = shift;
+ weaken($self->{engine});
+ # avoid circular reference between plugin and its engine
+
+ return 1;
+}
+
+
+sub copyDefaultSession
+{
+ my $self = shift;
+ my $pluginroot = shift;
+
+
+ # Take the default path of SuSE
+ # (as we have the most experience with it)
+ if( -f "/etc/X11/session/default.desktop") {
+ rename("/etc/X11/session/default.desktop",
+ "/etc/X11/session/default.desktop.back")
+ }
+ copyFile("$pluginroot/default.desktop","/etc/X11/session");
+
+ return 1;
+} \ No newline at end of file
diff --git a/src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Debian.pm b/src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Debian.pm
new file mode 100644
index 00000000..173f249e
--- /dev/null
+++ b/src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Debian.pm
@@ -0,0 +1,49 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# vmchooser/OpenSLX/Distro/Debian.pm
+# - provides Debian implementation of the Distro API for the vmchooser plugin.
+# -----------------------------------------------------------------------------
+package vmchooser::OpenSLX::Distro::Debian;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+use base qw(vmchooser::OpenSLX::Distro::Base);
+
+use File::Basename;
+use File::Path;
+use Scalar::Util qw( weaken );
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub copyDefaultSession
+{
+ my $self = shift;
+ my $pluginroot = shift;
+
+
+ # Take the default path of SuSE
+ # (as we have the most experience with it)
+ if( -f "/usr/share/xsessions/default.desktop") {
+ rename("/usr/share/xsessions/default.desktop",
+ "/usr/share/xsessions/default.desktop.back")
+ }
+ copyFile("$pluginroot/default.desktop","/usr/share/xsessions");
+
+ return 1;
+} \ No newline at end of file
diff --git a/src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Suse.pm b/src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Suse.pm
new file mode 100644
index 00000000..c93a066b
--- /dev/null
+++ b/src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Suse.pm
@@ -0,0 +1,47 @@
+# Copyright (c) 2008..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# vmchooser/OpenSLX/Distro/Suse.pm
+# - provides Suse implementation of the Distro API for the vmchooser plugin.
+# -----------------------------------------------------------------------------
+package vmchooser::OpenSLX::Distro::Suse;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+use base qw(vmchooser::OpenSLX::Distro::Base);
+
+use File::Basename;
+use File::Path;
+use Scalar::Util qw( weaken );
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub copyDefaultSession
+{
+ my $self = shift;
+ my $pluginroot = shift;
+
+ # Take the default path of SuSE
+ # (as we have the most experience with it)
+ if( -f "/etc/X11/session/default.desktop") {
+ rename("/etc/X11/session/default.desktop",
+ "/etc/X11/session/default.desktop.back")
+ }
+ copyFile("$pluginroot/default.desktop","/etc/X11/session");
+ return 1;
+} \ No newline at end of file
diff --git a/src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Ubuntu.pm b/src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Ubuntu.pm
new file mode 100644
index 00000000..1677321f
--- /dev/null
+++ b/src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Ubuntu.pm
@@ -0,0 +1,50 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# vmchooser/OpenSLX/Distro/Ubuntu.pm
+# - provides Ubuntu implementation of the Distro API for the vmchooser plugin.
+# -----------------------------------------------------------------------------
+package vmchooser::OpenSLX::Distro::Ubuntu;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+use base qw(vmchooser::OpenSLX::Distro::Base);
+
+use File::Basename;
+use File::Path;
+use Scalar::Util qw( weaken );
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+
+sub copyDefaultSession
+{
+ my $self = shift;
+ my $pluginroot = shift;
+
+
+ # Take the default path of SuSE
+ # (as we have the most experience with it)
+ if( -f "/usr/share/xsessions/default.desktop") {
+ rename("/usr/share/xsessions/default.desktop",
+ "/usr/share/xsessions/default.desktop.back")
+ }
+ copyFile("$pluginroot/default.desktop","/usr/share/xsessions");
+
+ return 1;
+} \ No newline at end of file
diff --git a/src/os-plugins/plugins/vmchooser/OpenSLX/OSPlugin/vmchooser.pm b/src/os-plugins/plugins/vmchooser/OpenSLX/OSPlugin/vmchooser.pm
new file mode 100644
index 00000000..71ce3637
--- /dev/null
+++ b/src/os-plugins/plugins/vmchooser/OpenSLX/OSPlugin/vmchooser.pm
@@ -0,0 +1,143 @@
+# Copyright (c) 2008, 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# vmchooser.pm
+# - allows user to pick from a list of virtual machine images
+#
+# - serves as base for virtualizer plugins / and requires one of these
+# -----------------------------------------------------------------------------
+package OpenSLX::OSPlugin::vmchooser;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSPlugin::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+sub new
+{
+ my $class = shift;
+
+ my $self = {
+ name => 'vmchooser',
+ };
+
+ return bless $self, $class;
+}
+
+sub getInfo
+{
+ my $self = shift;
+
+ return {
+ description => unshiftHereDoc(<<' End-of-Here'),
+ allows user to pick from a list of different virtual machine images
+ based on xml-files, which tell about available images. One of the
+ virtualization tools like vmware*, virtualbox or qemu/kvm is
+ required.
+ End-of-Here
+ precedence => 50,
+ required => [ qw( desktop ) ],
+ };
+}
+
+sub getAttrInfo
+{
+ my $self = shift;
+
+ return {
+ 'vmchooser::active' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should the 'vmchooser'-plugin be executed during boot?
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '1 means active - 0 means inactive',
+ default => '1',
+ },
+ 'vmchooser::env' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ environment, seperates pools based on XML configuration
+ End-of-Here
+ #TODO:
+ #content_regex => qr{^(0|1)$},
+ content_descr => 'name of environment',
+ default => 'default',
+ },
+ 'vmchooser::xmlpath' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ location of XML configuration for virtual images
+ End-of-Here
+ #TODO:
+ #content_regex => qr{^(0|1)$},
+ content_descr => 'path to xml files',
+ default => '/var/lib/virt',
+ },
+
+ };
+}
+
+sub installationPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ my $pluginRepoPath = $info->{'plugin-repo-path'};
+ my $openslxBasePath = $info->{'openslx-base-path'};
+
+ # copy all needed files now:
+ my $pluginName = $self->{'name'};
+ my $pluginBasePath = "$openslxBasePath/lib/plugins/$pluginName/files";
+ foreach my $file ( qw( vmchooser printer.sh scanner.sh xmlfilter.sh
+ default.desktop mesgdisp run-virt.sh ) ) {
+ copyFile("$pluginBasePath/$file", "$pluginRepoPath/");
+ chmod 0755, "$pluginRepoPath/$file";
+ }
+
+ # set ditro-specific default session
+ $self->{distro}->copyDefaultSession($pluginRepoPath);
+
+ return;
+}
+
+sub removalPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ return;
+}
+
+sub copyRequiredFilesIntoInitramfs
+{
+ my $self = shift;
+ my $targetPath = shift;
+ my $attrs = shift;
+ my $makeInitRamFSEngine = shift;
+ my $pluginRepoPath = "$openslxConfig{'base-path'}/lib/plugins/vmchooser";
+
+ $makeInitRamFSEngine->addCMD(
+ "cp -a $pluginRepoPath/files/mkdosfs $targetPath/bin"
+ );
+
+ vlog(1, _tr("vmchooser-plugin: ..."));
+
+ return;
+}
+
+1;
+
diff --git a/src/os-plugins/plugins/vmchooser/README b/src/os-plugins/plugins/vmchooser/README
new file mode 100644
index 00000000..29434bcc
--- /dev/null
+++ b/src/os-plugins/plugins/vmchooser/README
@@ -0,0 +1,21 @@
+
+VirtualMachine Chooser - plugin
+===============================
+
+This Plugin uses an additionally provided program to display a list of virtual
+machine sessions (vm's provided by other plugins), from which a user can choose.
+
+This Programm is included in binary format. You can look into the sources at
+svn://svn.openslx.org/srv/svn/openslx/openslx-src-tools/os-plugins/plugins/vmchooser/
+
+There you can change the program to your needs and compile it with the included
+Makefile.
+
+Additionally the plugin provides a script to start a specific virtual machine
+preconfigured. Parts of the configuration are taken from an xml file which
+should be provided with each container file. You will find additional infor-
+mation online at: http://lab.openslx.org/wiki/openslx/Vmchooser
+
+Use at your own risk! No warranty is given by the author of this software for
+any purposes!
+
diff --git a/src/os-plugins/plugins/vmchooser/XX_vmchooser.sh b/src/os-plugins/plugins/vmchooser/XX_vmchooser.sh
new file mode 100644
index 00000000..168bcda1
--- /dev/null
+++ b/src/os-plugins/plugins/vmchooser/XX_vmchooser.sh
@@ -0,0 +1,57 @@
+# Copyright (c) 2008, 2009 - RZ Uni Freiburg
+# Copyright (c) 2008..2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# script is included from init via the "." load function - thus it has all
+# variables and functions available
+
+# include default directories
+. /etc/openslx.conf
+
+CONFFILE="/initramfs/plugin-conf/vmchooser.conf"
+PLUGINCONFDIR=/mnt/${OPENSLX_DEFAULT_CONFDIR}/plugins/vmchooser
+BINDIR=/mnt/${OPENSLX_DEFAULT_BINDIR}
+PLUGINDIR=${OPENSLX_DEFAULT_DIR}/plugin-repo/vmchooser
+VIRTDIR=/mnt/${OPENSLX_DEFAULT_VIRTDIR}
+
+if [ -e $CONFFILE ]; then
+ . $CONFFILE
+ if [ $vmchooser_active -ne 0 ] ; then
+ [ $DEBUGLEVEL -gt 0 ] \
+ && echo "vmchooser: copying stage3 configuration file ..."
+ testmkd ${PLUGINCONFDIR}/loopimg
+ testmkd ${PLUGINCONFDIR}/fd-loop 1777
+ cp $CONFFILE ${PLUGINCONFDIR}/vmchooser.conf
+ ln -s ${PLUGINDIR}/run-virt.sh ${BINDIR}/run-virt.sh
+ ln -s ${PLUGINDIR}/vmchooser ${BINDIR}/vmchooser
+
+ # setup all generic virtualization / starting stuff like the floppy image
+ # loop file for exchanging information between linux and vm guest
+ if modprobe ${MODPRV} loop; then
+ mdev -s
+ else
+ : #|| error "" nonfatal
+ fi
+ # mount a clean tempfs (bug in UnionFS prevents loopmount to work)
+ grep -qE "unionfs |aufs " /proc/mounts && \
+ mount -n -o size=1500k -t tmpfs vm-loopimg ${PLUGINCONFDIR}/loopimg
+ # create an empty floppy image of 1.4MByte size
+ dd if=/dev/zero of=${PLUGINCONFDIR}/loopimg/fd.img count=2880 bs=512 \
+ 2>/dev/null
+ chmod 0777 ${PLUGINCONFDIR}/loopimg/fd.img
+ # use dos formatter copied into stage3
+ mkdosfs ${PLUGINCONFDIR}/loopimg/fd.img >/dev/null 2>&1 #|| error
+ mount -n -t msdos -o loop,umask=000 ${PLUGINCONFDIR}/loopimg/fd.img \
+ ${PLUGINCONFDIR}/fd-loop
+
+ # finished ...
+ [ $DEBUGLEVEL -gt 0 ] && echo "done with 'vmchooser' os-plugin ..."
+ fi
+fi
diff --git a/src/os-plugins/plugins/vmchooser/files/default.desktop b/src/os-plugins/plugins/vmchooser/files/default.desktop
new file mode 100644
index 00000000..91540228
--- /dev/null
+++ b/src/os-plugins/plugins/vmchooser/files/default.desktop
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=virtual machine chooser (default)
+Name[de]=Virtuelle Maschine auswählen
+Comment=This session starts the vm session chooser
+Comment[de]=Diese Sitzung startet das Auswahlmenü für die vorhandenen Sitzungen
+Exec=/opt/openslx/plugin-repo/vmchooser/vmchooser
+TryExec=/opt/openslx/plugin-repo/vmchooser/vmchooser
+Icon=
+Type=Application
diff --git a/src/os-plugins/plugins/vmchooser/files/mesgdisp b/src/os-plugins/plugins/vmchooser/files/mesgdisp
new file mode 100755
index 00000000..41e3721c
--- /dev/null
+++ b/src/os-plugins/plugins/vmchooser/files/mesgdisp
Binary files differ
diff --git a/src/os-plugins/plugins/vmchooser/files/mkdosfs b/src/os-plugins/plugins/vmchooser/files/mkdosfs
new file mode 120000
index 00000000..c3fa8102
--- /dev/null
+++ b/src/os-plugins/plugins/vmchooser/files/mkdosfs
@@ -0,0 +1 @@
+busybox \ No newline at end of file
diff --git a/src/os-plugins/plugins/vmchooser/files/printer.sh b/src/os-plugins/plugins/vmchooser/files/printer.sh
new file mode 100755
index 00000000..8f1d5ffa
--- /dev/null
+++ b/src/os-plugins/plugins/vmchooser/files/printer.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+#echo "<printer name=\"info\" path=\"//printserver/info\"> some pseudo printer </printer>"
+
+for(( i=0; $i<10; i=$i+1)); do
+ echo -e "printserver$i\tprinter$i\tPrinter Description $i"
+done
+
+echo -e "printserver.ruf.uni-freiburg.de\treal-printer-name\tSome really long printer Description"
+
diff --git a/src/os-plugins/plugins/vmchooser/files/run-virt.sh b/src/os-plugins/plugins/vmchooser/files/run-virt.sh
new file mode 100644
index 00000000..23f026c7
--- /dev/null
+++ b/src/os-plugins/plugins/vmchooser/files/run-virt.sh
@@ -0,0 +1,402 @@
+#!/bin/bash
+# -----------------------------------------------------------------------------
+# Copyright (c) 2007..2010 - RZ Uni FR
+# Copyright (c) 2007..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# run-virt.sh
+# - This is the generic wrapper for the several virtualization solutions.
+# The idea is to setup a set of variables used by at least two different
+# tools and then include the specific plugin which configures the speci-
+# fied virtualization tool.
+################################################################################
+
+. /etc/opt/openslx/openslx.conf
+
+################################################################################
+### Define default dirs / get configs
+################################################################################
+
+PLUGINCONFROOT=${OPENSLX_DEFAULT_CONFDIR}/plugins
+PLUGINCONFDIR=${PLUGINCONFROOT}/vmchooser
+# include general configuration from vmchooser
+[ -f ${PLUGINCONFROOT}/vmchooser/vmchooser.conf ] && \
+ . ${PLUGINCONFROOT}/vmchooser/vmchooser.conf
+# load general virtualization information
+[ -f ${PLUGINCONFROOT}/virtualization/virtualization.conf ] && \
+ . ${PLUGINCONFROOT}/virtualization/virtualization.conf
+
+################################################################################
+### Functions used throughout the script
+################################################################################
+
+# function to write to stdout and logfile
+LOGFILE=${OPENSLX_DEFAULT_LOGDIR}/run-virt.${USER}.$$.log
+writelog () {
+ # write to stdout
+ echo -e "$1"
+ # log into file
+ echo -e "$1" >> ${LOGFILE}
+}
+
+# remove config dirs when exit
+cleanexit () {
+ if echo "${RMDIRS}" 2>/dev/null | grep -q ${xmlvirt}; then
+ writelog "${xmlvirt} exited. Cleanning up... \c"
+ rm -rf ${RMDIRS} >/dev/null 2>&1
+ writelog "done"
+ fi
+
+ exit "$1"
+}
+
+# Check for important files used
+filecheck ()
+{
+ filecheck=$(LANG=us ls -lh ${diskfile} 2>&1)
+ writelog "Filecheck:\n${filecheck}\n"
+ noimage=$(echo ${filecheck} | grep -i "no such file or directory" | wc -l)
+ rightsfile=${diskfile}
+
+ # Check if link
+ if [ -L "${diskfile}" ]; then
+ # take link target
+ rightsfile=$(ls -lh ${diskfile} 2>&1 | awk -F '-> *' '{print $2}')
+ rightsfile=${vmdir}/${rightsfile}
+ filecheck=$(LANG=us ls -lh ${rightsfile} 2>&1)
+ fi
+
+ # Does file exist
+ if [ "${noimage}" -ge "1" ]; then
+ writelog "Virtual Machine Image Problem:\c "
+ writelog "\tThe image you've specified doesn't exist."
+ writelog "Filecheck says:\c "
+ writelog "\t\t${diskfile}:\n\t\t\tNo such file or directory"
+ writelog "Hint:\c "
+ writelog "\t\t\tCompare spelling of the image with your options.\n"
+ exit 1
+ fi
+
+ # Readable by calling user
+ if ! [ -r "${diskfile}" >/dev/null 2>&1 \
+ -o -r "${diskfile}" >/dev/null 2>&1 ]; then
+ writelog "Vmware Image Problem:\c "
+ writelog "\tThe image you've specified has wrong rights."
+ writelog "Filecheck says:\t\t$(echo ${filecheck} \
+ | awk '{print $1" "$3" "$4}') ${rightsfile}"
+ writelog "Hint:\t\t\tChange rights with: chmod a+r ${rightsfile}\n"
+ exit 1
+ fi
+
+ # Writable (for persistent-mode)?
+ if ! [ -w "${diskfile}" >/dev/null 2>&1 \
+ -o -w "${diskfile}" >/dev/null 2>&1 ] \
+ && [ "${np}" = "independent-persistent" ]; then
+ writelog "Vmware Image Problem:\c "
+ writelog "\tThe image you have specified has wrong rights."
+ writelog "Filecheck says:\t\t$(echo ${filecheck} \
+ | awk '{print $1" "$3" "$4}') ${rightsfile}"
+ writelog "Hint:\t\t\tUse nonpersistent-mode or change rights to rw\n"
+ exit 1
+ fi
+}
+
+################################################################################
+### Get XML file and dir
+################################################################################
+
+# absolute or relative path?
+xmlfile=$1
+if ls ${xmlfile} 2>/dev/null | grep '/' >/dev/null 2>&1; then
+ xmlpath=$(dirname ${xmlfile})
+ xmlfile=$(basename ${xmlfile})
+else
+ xmlpath=${vmchooser_xmlpath}
+fi
+# full path
+xmlfile="${xmlpath}/${xmlfile%.xml}.xml"
+
+################################################################################
+### Sanity checks
+################################################################################
+
+# test if the xml file is valid
+if ! [ -r "${xmlfile}" ]; then
+ writelog "${xmlfile} not a readable XML file!"
+ exit 1
+fi
+
+# test if XML file
+if ! grep '<?xml' "${xmlfile}" >/dev/null 2>&1; then
+ writelog \
+ "Submitted configuration file ${xmlfile} seems to have wrong XML format"
+ exit 1
+fi
+
+# Theck for running in graphical environment otherwise no much use here
+[ -z "$DISPLAY" ] && echo -e "\n\tStart only within a graphical desktop!\n" \
+ && exit 1
+
+################################################################################
+### Logo for console
+################################################################################
+
+cat <<EOL
+ __ __
+ .----.--.--.-----.___.--.--.|__|.----.| |_
+ | _| | | |___| | || || _|| _|
+ |__| |_____|__|__| \___/ |__||__| |____|
+ OpenSLX virtual machine environment preparation script ...
+
+EOL
+
+################################################################################
+### Read needed variables from XML file
+################################################################################
+
+writelog "Starting configuration..."
+writelog "\tLogfile:\t\t${LOGFILE}"
+writelog "\t/tmp info:\t\t$(df -h | grep " /tmp$" | awk '{print $2}') \c"
+writelog "$(grep "/tmp " /proc/mounts | awk '{print $1" "$2" "$3" "$4}')"
+writelog "\tVM XML dir:\t\t$(dirname ${xmlfile})"
+writelog "\tXML file:\t\t${xmlfile}"
+writelog "VM config:"
+
+# name of the virt image
+imgname=$(grep -io '<image_name param=.*"' ${xmlfile} \
+ | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')
+
+# imagename /w full path
+if echo ${imgname} 2>/dev/null | grep -q '^/' >/dev/null 2>&1; then
+ imgpath=$(dirname ${imgname})
+ imgname=$(basename ${imgname})
+ vmpath=${imgpath}/${imgname}
+# if old vmchooser binary stuff
+# we do not need folder name as it is already included by vmchooser
+elif echo ${xmlfile} 2>/dev/null | grep -q '^/tmp/' >/dev/null 2>&1; then
+ vmpath=$imgname
+ imgname=$(basename ${imgname})
+# else use same path as xml
+else
+ imgpath=${xmlpath}
+ vmpath=${imgpath}/${imgname}
+fi
+
+# check if virtual machine container file exists
+if ! [ -e "${vmpath}" ]; then
+ writelog "Virtual machine image ${vmpath} not found!"
+ exit 1
+fi
+
+# name of the virt machine, sed because of Windows formatting
+vm_name=$(grep -o 'short_description param=.*"' ${xmlfile} \
+ | sed -e "s/&.*;/; /g" | awk -F '"' '{print $2}')
+# if ${vm_name} not defined use ${xmlfile}
+vm_name=${vm_name:-${xmlfile%.xml}}
+
+# define vm_shortname since vm_name can be very long
+vm_shortname=$(basename ${xmlfile%.xml} | sed -e "s, ,-,g")
+
+# vm_name = displayname, define for old scripts
+displayname=${vm_name}
+
+# image is for the following virtual machine
+xmlvirt=$(grep -o 'virtualmachine param=.*"' ${xmlfile} \
+ | sed -e "s/&.*;/; /g" | awk -F '"' '{print $2}')
+
+# make a guess from the filename extension if ${xmlvirt} is empty
+# (not set within the XML file)
+# TODO: implement possibility to submit own configuration files
+if [ -z "${xmlvirt}" ] && [ -n "${additional_config}" ]; then
+ writelog "No virtual machine parameter defined in ${xmlfile}"
+ writelog "Trying to guess VM...\c"
+ case "$(cat ${additional_config} | tr [A-Z] [a-z])" in
+ *config.version*|*virtualhw.version*|*independent-nonpersistent*|*vmdk*)
+ xmlvirt="vmware"
+ ;;
+ *innotek*|*virtualbox*)
+ xmlvirt="virtualbox"
+ ;;
+ *qemu*|*kvm*)
+ xmlvirt="qemukvm"
+ ;;
+ *)
+ xmlvirt="none"
+ ;;
+ esac
+elif [ -z "${xmlvirt}" ]; then
+ case "$(echo ${imgname##*.} | tr [A-Z] [a-z])" in
+ vmdk)
+ xmlvirt="vmware"
+ ;;
+ vbox)
+ xmlvirt="virtualbox"
+ ;;
+ img|qcow*)
+ xmlvirt="qemukvm"
+ ;;
+ *)
+ xmlvirt="none"
+ ;;
+ esac
+ writelog "result:\t${xmlvirt}"
+fi
+
+# definition of the client system
+vmostype=$(grep -io '<os param=.*"' ${xmlfile} | awk -F '"' '{ print $2 }' \
+ | tr [A-Z] [a-z])
+
+# definition of the networking the client system is connected to
+network_kind=$(grep -io '<network param=.*"' ${xmlfile} \
+ | awk -F '"' '{ print $2 }' | tr [A-Z] [a-z])
+network_card=$(grep -io '<netcard param=.*"' ${xmlfile} \
+ | awk -F '"' '{ print $2 }'| tr [A-Z] [a-z])
+
+# set redirects to 0, see vmgrid if you want to define some
+redirects=0
+
+# Serial/parallel ports defined (e.g. "ttyS0" or "autodetect")
+serial=$(grep -io '<serialport param=.*"' ${xmlfile} \
+ | awk -F '"' '{ print $2 }')
+parallel=$(grep -io '<parport param=.*"' ${xmlfile} \
+ | awk -F '"' '{ print $2 }')
+
+writelog "\tVirtualization:\t\t$xmlvirt"
+writelog "\tVM name:\t\t$vm_name"
+writelog "\tVM short name:\t\t$vm_shortname"
+
+###############################################################################
+### Declaration of default variables
+###############################################################################
+
+# VM-ID static (00)
+VM_ID="00"
+
+# make sure cpu_cores is not empty
+cpu_cores=${cpu_cores:-"1"}
+
+# total amount of memory defined in stage 3
+permem=50
+# get a result which can be divided through 4
+mem=$(expr ${totalmem} / 100 \* ${permem} / 4 \* 4)
+if [ -n "${mainvirtmem}" ]; then
+ forcemem=$(expr ${mainvirtmem} / 4 \* 4)
+ mem=${forcemem}
+fi
+hostmem=$(expr ${totalmem} - ${mem})
+
+# configuring ethernet mac address: first 3 bytes are fixed (00:50:56)
+# 4th byte is the VM-ID (0D)
+# last two bytes are taken from the bridge of the host
+# define one MAC per guest
+macguestpart="00:50:56:${VM_ID}"
+machostpart=$(echo ${hostmacaddr} | awk -F ":" '{print $(NF-1)":"$NF}')
+macaddr=$(echo "${macguestpart}:${machostpart}" | tr [a-z] [A-Z])
+
+# virtual fd/cd/dvd and drive devices, floppy b: for configuration
+# if $floppy_0 from run-virt.include set then fdtest="TRUE"
+fdtest=
+fdtest=${floppy_0:+"TRUE"}
+# if $fdtest not set floppy0="FALSE", else "TRUE"
+floppy0=${fdtest:-"FALSE"}
+floppy1="TRUE"
+floppy1name="${PLUGINCONFDIR}/loopimg/fd.img"
+# if $cdrom_0 from run-virt.include set then cdtest="TRUE"
+cdtest=
+cdtest=${cdrom_0:+"TRUE"}
+# if $cdtest not set cdrom0="FALSE", else "TRUE"
+cdrom0=${cdtest:-"FALSE"}
+# if $cdrom_1 from run-virt.include set then cdtest="TRUE"
+cdtest=
+cdtest=${cdrom_1:+"TRUE"}
+# if $cdtest not set cdrom1="FALSE", else "TRUE"
+cdrom1=${cdtest:-"FALSE"}
+# ide is expected default, test for the virtual disk image type should
+# be done while creating the runscripts ...
+ide="TRUE"
+scsi="FALSE"
+hddrv="ide"
+audio="true"
+remotedesktopport="590${VM_ID}"
+
+# Display resolution within the host system
+hostres=$(xvidtune -show 2>/dev/null| grep -ve "^$")
+xres=$(echo "${hostres}" | awk '{print $3}')
+yres=$(echo "${hostres}" | awk '{print $7}')
+
+# enable 3D
+enable3d=$(grep -i "<enable3d param=.*" ${xmlfile} 2>/dev/null | \
+ awk -F '=' {'print $2'})
+
+# add rw share
+sharepath="${HOME}"
+sharename="home"
+
+# set hostname: using original hostname and adding string
+hostname="virt-$(hostname)"
+
+writelog "\tVM Hostname:\t\t$hostname"
+
+################################################################################
+### Setup the rest of the environment and run the configured vm
+################################################################################
+
+# Adjust sound volume
+writelog "Unmuting sound...\c "
+amixer -q sset Master 80% unmute 2>/dev/null
+amixer -q sset PCM 80% unmute 2>/dev/null
+amixer -q sset CD 80% unmute 2>/dev/null
+amixer -q sset Headphone 80% unmute 2>/dev/null
+amixer -q sset Front 80% umute 2>/dev/null # in SUSE 11.0 it's headphone
+amixer -q sset Speaker 0 mute 2>/dev/null # annoying built-in speaker
+writelog "finished\n"
+
+# Copy guest configuration (with added information) config.xml to be accessed
+# via virtual floppy
+# fixme -> to be changed (vmchooser adapts the file content!?)
+#TODO: wozu echo?
+#echo "Please fix the config.xml generation"
+cp ${xmlfile} ${PLUGINCONFDIR}/fd-loop/config.xml
+
+# Check if virtual machine container file exists
+#filecheck
+
+# Get all virtual machine specific stuff from the respective include file
+if [ -e ${PLUGINCONFROOT}/${xmlvirt}/run-virt.include ] ; then
+ self=${xmlvirt}
+ . ${PLUGINCONFROOT}/${xmlvirt}/run-virt.include
+ # start a windowmanager for easier handling
+ # (expect problems /w windows opening in background /w vmware without wm)
+ for dm in xfwm4 metacity openbox blackbox kwin fvwm2 ; do
+ if which $dm >/dev/null 2>&1 ; then
+ if [ "$dm" = "fvwm2" ] ; then
+ echo "EdgeScroll 0 0" > ${redodir}/fvwm
+ fvwm2 -f ${redodir}/fvwm >/dev/null 2>&1 &
+ else
+ $dm >/dev/null 2>&1 &
+ fi
+ break
+ fi
+ done
+ ${VIRTCMD} ${VIRTCMDOPTS}
+ writelog "Bye."
+ cleanexit 0
+else
+ writelog "Failed because of missing ${xmlvirt} plugin."
+ cleanexit 1
+fi
+
+# postrun for scripts after virtualization finishes
+if [ -n "${POSTRUN}" ]; then
+ eval ${POSTRUN} >/dev/null 2>&1
+fi
+
+cleanexit 0
+exit 0
diff --git a/src/os-plugins/plugins/vmchooser/files/scanner.sh b/src/os-plugins/plugins/vmchooser/files/scanner.sh
new file mode 100755
index 00000000..dcb94c68
--- /dev/null
+++ b/src/os-plugins/plugins/vmchooser/files/scanner.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+
+echo -e "scanserver\tscanner1hp\tThis is a test Scanner"
diff --git a/src/os-plugins/plugins/vmchooser/files/vm-template.xml b/src/os-plugins/plugins/vmchooser/files/vm-template.xml
new file mode 100755
index 00000000..f6b59fea
--- /dev/null
+++ b/src/os-plugins/plugins/vmchooser/files/vm-template.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<settings>
+ <entry>
+ <!-- "vmware", "virtualbox", "qemu" -->
+ <virtualmachine param="vmware"/>
+ <!-- VM-name with ending .vmdk, .img, .vdi, .qcow2 -->
+ <image_name param="vm-image.vmdk"/>
+ <!-- sort after parameters then alphabet, values 0(top) - 9(bottom) -->
+ <priority param="5"/>
+ <!-- title shown in the menu -->
+ <title param="My VM Image"/>
+ <!-- description shown when image is chosen -->
+ <description>Image for lectures with a lot of software: office, ...
+ </description>
+ <!-- if active="true" the image is selectable via vmchooser -->
+ <active param="true"/>
+ <!-- in which environment this image will be selectable via vmchooser -->
+ <environment param="default"/>
+ <!-- image locked with a password? -->
+ <locked param="false"/>
+ <creator param="Your Name"/>
+ <email param="your@e-mail.add"/>
+ <phone param="0123-12345678"/>
+ <!-- when should this image be deactivated automatically -->
+ <valid_until param="DD-MM-YY"/>
+ <!-- type of the OS: if you do not know use "other" -->
+ <!-- vmware refer to: http://sanbarrow.com/vmx/vmx-guestos.html -->
+ <os param="winxppro"/>
+ <!-- "nat", "bridge", "hostonly" -->
+ <network param="nat"/>
+ <!-- use a different virtual network card than default -->
+ <netcard param="e1000"/>
+ <!-- activate serial port: "ttyS0", "auto" (recommended) -->
+ <serialport param="false"/>
+ <!-- activate parallel port: "parport0" (recommended) -->
+ <parport param="false"/>
+ <!-- enable 3D support -->
+ <enable3d param="true"/>
+ <!-- which shared folders should be connected -->
+ <shared_folders param="true">
+ <!-- name="Home" path="/home/$USER" for internal VMware sf -->
+ <shared_folder name="" path="" pass=""></shared_folder>
+ </shared_folders>
+ <!-- which printers should be connected -->
+ <printers>
+ <printer name="" path="">Human readable description</printer>
+ </printers>
+ <!-- which scanners should be connected -->
+ <scanners>
+ <scanner name="" path="">Description</scanner>
+ </scanners>
+ <!-- added automatically through vmchooser when started
+ <username param="user-id"/>
+ -->
+ <!-- obsolete, maybe for future implementations
+ <xdm param="false">
+ </xdm>
+ -->
+ </entry>
+</settings>
diff --git a/src/os-plugins/plugins/vmchooser/files/vmchooser b/src/os-plugins/plugins/vmchooser/files/vmchooser
new file mode 100644
index 00000000..fc12e0fe
--- /dev/null
+++ b/src/os-plugins/plugins/vmchooser/files/vmchooser
Binary files differ
diff --git a/src/os-plugins/plugins/vmchooser/files/xmlfilter.sh b/src/os-plugins/plugins/vmchooser/files/xmlfilter.sh
new file mode 100755
index 00000000..5196992c
--- /dev/null
+++ b/src/os-plugins/plugins/vmchooser/files/xmlfilter.sh
@@ -0,0 +1,50 @@
+#!/bin/bash
+# -----------------------------------------------------------------------------
+# Copyright (c) 2007..2009 - RZ Uni FR
+# Copyright (c) 2007..2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# xmlfilter.sh
+# - This script is invoked by the vmchooser tool. It simply filters xml-
+# files (taking the path to these files in $1). You might modify it in any
+# way to match your needs, e.g. ask some database instead. You can re-
+# implement it in any other programming language too. You simply have to
+# return a list of proper xml files to be interpreted by the vmchooser
+# binary). Please check for vmchooser.sh too ...
+# -----------------------------------------------------------------------------
+
+# This script .
+#
+# currently:
+# - filter for slxgrp (which comes from /etc/machine-setup)
+#
+
+# include default directories
+. /etc/opt/openslx/openslx.conf
+
+if [ -f ${OPENSLX_DEFAULT_CONFDIR}/plugins/vmchooser/vmchooser.conf ]; then
+ . ${OPENSLX_DEFAULT_CONFDIR}/plugins/vmchooser/vmchooser.conf
+fi
+
+for FILE in $1/*.xml; do
+ # filter all xmls which aren't set active
+ if [ $(grep "<active param=.*true.*" ${FILE} | wc -l) -eq 1 ]; then
+ if [ -n ${vmchooser_env} ]; then
+ # filter all xmls with pool-param not equal to vmchooser::env
+ if [ $(grep "<pools param=\"${vmchooser_env}\"" ${FILE} | wc -l) -eq 1 ];\
+ then
+ echo ${FILE};
+ fi
+ else
+ # if there is no pool set, just take all available xmls
+ echo -e ${active}
+ fi
+ fi
+done
diff --git a/src/os-plugins/plugins/vmchooser/init-hooks/40-started-hw-config/run-virt.sh b/src/os-plugins/plugins/vmchooser/init-hooks/40-started-hw-config/run-virt.sh
new file mode 100644
index 00000000..7f1ae20d
--- /dev/null
+++ b/src/os-plugins/plugins/vmchooser/init-hooks/40-started-hw-config/run-virt.sh
@@ -0,0 +1,21 @@
+# Copyright (c) 2009 - RZ Uni Freiburg
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# Stage3 part of 'vmchooser' plugin - this script detects additionally to the
+# the standard hardware configuration the availability of optical and floppy
+# drives for virtual machines.
+#
+# The script is included from init via the "." load function - thus it has all
+# variables and functions available.
+
+waitfor /tmp/hwcfg
+( hwinfo --cdrom | grep -i "Device File:" | awk {'print $3'} >/etc/hwinfo.cdrom ) &
+( hwinfo --floppy | grep -i "Device File:" | awk {'print $3'} >/etc/hwinfo.floppy ) &
diff --git a/src/os-plugins/plugins/vmchooser/init-hooks/80-after-plugins/virtualization.sh b/src/os-plugins/plugins/vmchooser/init-hooks/80-after-plugins/virtualization.sh
new file mode 100644
index 00000000..73a65ac5
--- /dev/null
+++ b/src/os-plugins/plugins/vmchooser/init-hooks/80-after-plugins/virtualization.sh
@@ -0,0 +1,144 @@
+# Copyright (c) 2010 - RZ Uni Freiburg
+# Copyright (c) 2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# script is included from init via the "." load function - thus it has all
+# variables and functions available
+
+# virtual virtualization plugin
+# make sure that this file is the same in vmgrid and vmchooser plugin!
+
+# include default directories
+. /etc/openslx.conf
+
+CONFFILEVMCHOOSER="/initramfs/plugin-conf/vmchooser.conf"
+CONFFILEVMGRID="/initramfs/plugin-conf/vmgrid.conf"
+PLUGINCONFDIR=/mnt/${OPENSLX_DEFAULT_CONFDIR}/plugins/virtualization
+
+# check if plugins available
+active=0
+[ -f ${CONFFILEVMCHOOSER} ] && . ${CONFFILEVMCHOOSER}
+[ "x${vmchooser_active}" = "x1" ] && active=1
+[ -f ${CONFFILEVMGRID} ] && . ${CONFFILEVMGRID}
+[ "x${vmgrid_active}" = "x1" ] && active=1
+
+[ $DEBUGLEVEL -gt 0 ] \
+ && echo -e "Executing the 'virtualization' plugin ... \c"
+
+if [ ${active} -ne 0 ] ; then
+
+ # load general configuration
+ . /etc/initramfs-setup
+ # include functions
+ . /etc/functions
+
+ testmkd ${PLUGINCONFDIR}
+
+ # check if vmgrid active and change free mem
+ totalmem=$(expr $(grep -i "memtotal" /proc/meminfo \
+ | awk '{print $2}') / 1024)
+ echo "totalmem=${totalmem}" >> ${PLUGINCONFDIR}/virtualization.conf
+
+ if [ "x${vmgrid_active}" = "x1" ]; then
+
+ totalmemtest=$(expr $(echo ${vmgrid_memratio} \
+ | awk -F ',' '{print $1" + "$2" + "$3" + "$4" + "$5" + "$6}'))
+
+ # not more than 100% memory assigned
+ if [ ${totalmemtest} -le 100 2>/dev/null ]; then
+
+ # host mem
+ hostratio=$(echo ${vmgrid_memratio} | awk -F ',' '{print $6}')
+ hostmem=$(expr ${totalmem} \* ${hostratio} / 100 2>/dev/null)
+ if [ ${hostmem} -lt 256 2>/dev/null ]; then
+ # min. 256 MB for host
+ hostmem=256
+ fi
+
+ # main vm mem (vmchooser)
+ if [ "x${vmchooser_active}" = "x1" ]; then
+ mainvirtratio=$(echo ${vmgrid_memratio} | awk -F ',' '{print $5}')
+ mainvirtmem=$(expr ${totalmem} \* ${mainvirtratio} / 100 2>/dev/null)
+ if [ ${mainvirtmem} -lt 512 2>/dev/null ]; then
+ # min. 512 for vmchooser
+ mainvirtmem=512
+ fi
+ else
+ mainvirtratio=0
+ mainvirtmem=0
+ fi
+
+ cat << EOF >> ${PLUGINCONFDIR}/virtualization.conf
+hostratio=${hostratio}
+hostmem=${hostmem}
+mainvirtratio=${mainvirtratio}
+mainvirtmem=${mainvirtmem}
+EOF
+
+ fi
+ fi
+
+ # cpu cores
+ CPU_CORES=$(grep 'processor.*:' /proc/cpuinfo | wc -l)
+ if [ "${CPU_CORES}" -gt "1" 2>/dev/null ]; then
+ echo "cpu_cores=${CPU_CORES}" \
+ >> ${PLUGINCONFDIR}/virtualization.conf
+ else
+ echo 'cpu_cores=1' >> ${PLUGINCONFDIR}/virtualization.conf
+ fi
+
+ # arch
+ echo "host_arch=$(uname -m)" >> ${PLUGINCONFDIR}/virtualization.conf
+
+ # VT enabled cpu?
+ if grep -q ^flags.*\\\<vmx\\\> /proc/cpuinfo; then
+ echo "vtflag=1" >> ${PLUGINCONFDIR}/virtualization.conf
+ echo 'kvm_module="kvm_intel"' >> ${PLUGINCONFDIR}/virtualization.conf
+ elif grep -q ^flags.*\\\<svm\\\> /proc/cpuinfo; then
+ echo "vtflag=1" >> ${PLUGINCONFDIR}/virtualization.conf
+ echo 'kvm_module="kvm_amd"' >> ${PLUGINCONFDIR}/virtualization.conf
+ else
+ echo "vtflag=0" >> ${PLUGINCONFDIR}/virtualization.conf
+ fi
+
+ # write mac
+ echo "hostmacaddr=${macaddr}" >> ${PLUGINCONFDIR}/virtualization.conf
+ # ip addr
+ echo "hostip=${clientip}" >> ${PLUGINCONFDIR}/virtualization.conf
+ # hostname
+ echo "hostname=${host_name}" >> ${PLUGINCONFDIR}/virtualization.conf
+
+ # get further hw information
+ waitfor /etc/hwinfo.cdrom
+ j=0
+ for i in $(cat /etc/hwinfo.cdrom); do
+ echo "cdrom_$j=$i" >> ${PLUGINCONFDIR}/virtualization.conf
+ j=$(expr $j + 1)
+ done
+
+ waitfor /etc/hwinfo.floppy
+ j=0
+ for i in $(cat /etc/hwinfo.floppy); do
+ echo "floppy_$j=$i" >> ${PLUGINCONFDIR}/virtualization.conf
+ j=$(expr $j + 1)
+ done
+
+ # copy host information to rwshare of vmgrid plugin
+ if [ "x${vmgrid_active}" = "x1" ]; then
+ cp ${PLUGINCONFDIR}/virtualization.conf ${vmgrid_rwmnt}/host.conf
+ fi
+
+ # finished ...
+ [ $DEBUGLEVEL -gt 0 ] \
+ && echo "ok"
+else
+ [ $DEBUGLEVEL -gt 0 ] \
+ && echo "failed"
+fi
diff --git a/src/os-plugins/plugins/vmgrid/OpenSLX/OSPlugin/vmgrid.pm b/src/os-plugins/plugins/vmgrid/OpenSLX/OSPlugin/vmgrid.pm
new file mode 100644
index 00000000..0965b482
--- /dev/null
+++ b/src/os-plugins/plugins/vmgrid/OpenSLX/OSPlugin/vmgrid.pm
@@ -0,0 +1,319 @@
+# Copyright (c) 2010 - RZ Uni Freiburg
+# Copyright (c) 2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+# -----------------------------------------------------------------------------
+# vmgrid.pm
+# - ...
+# -----------------------------------------------------------------------------
+package OpenSLX::OSPlugin::vmgrid;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSPlugin::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+use OpenSLX::DistroUtils;
+
+sub new
+{
+ my $class = shift;
+
+ my $self = {
+ name => 'vmgrid',
+ };
+
+ return bless $self, $class;
+}
+
+# TODO: desc
+sub getInfo
+{
+ my $self = shift;
+
+ return {
+ description => unshiftHereDoc(<<' End-of-Here'),
+ ...
+ End-of-Here
+ precedence => 80,
+ #required => [ qr{^(vmware|virtualbox|qemukvm|xen)$} ],
+ #openvz|vserver
+ # TODO: virtaul plugin (requires, provides?)
+ #required => [ qw( virtualization ) ],
+ #provided => [ qw( virtualization ) ],
+ };
+}
+
+sub getAttrInfo
+{
+ my $self = shift;
+
+ return {
+ 'vmgrid::active' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should the 'vmgrid'-plugin be executed during boot?
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '1 means active - 0 means inactive',
+ default => '1',
+ },
+ 'vmgrid::virt' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ which virtualization technique schould be used?
+ End-of-Here
+ content_regex => qr{^(virtualbox|qemukvm|xen)$},
+ #openvz|vserver
+ content_descr => 'virtualbox, qemukvm, xen',
+ #openvz, vserver
+ default => undef,
+ },
+ 'vmgrid::roshare' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ do you want to mount external resources?
+ e.g. NFS share /w virt images ...
+ will be mounted to /var/lib/virt/vmgrid
+ End-of-Here
+ content_regex => qr{^nfs://},
+ content_descr => 'NFS share as URI (nfs://...)',
+ default => undef,
+ },
+ 'vmgrid::rwshare' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ do you want a persistent storage device?
+ use local hard drive (ID45) or NFS share.
+ will be mounted to /var/opt/openslx/plugins/vmgrid/share
+ End-of-Here
+ content_regex => qr{^(id45|nfs://)},
+ content_descr => 'NFS share as URI (nfs://...) or "id45"',
+ default => undef,
+ },
+ 'vmgrid::imgpath' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ location of virtual images
+ for starts /w relative path
+ End-of-Here
+ content_descr => 'absolute path to vm image files',
+ default => '/var/lib/virt/vmgrid/images',
+ },
+ 'vmgrid::xmlpath' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ location of XML configuration for virtual images
+ for starts /w relative path
+ End-of-Here
+ content_descr => 'absolute path to vm xml files',
+ default => '/var/lib/virt/vmgrid/xml',
+ },
+ 'vmgrid::startvms' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ which virtaul machines should be started per default
+ comma separated list. first will be started first,
+ second second, and so on, max. 4 VMs
+ End-of-Here
+ content_descr => 'name of xml file e.g. scilin-5.4-wn(.xml)',
+ default => undef,
+ },
+ 'vmgrid::vt' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ use hardware virtualization, if applicable
+ override the settings of the corresponding virt plugin
+ (only if supported by plugin)
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '"0", "1" or "-" (for unset)',
+ default => undef,
+ },
+ 'vmgrid::maxvcpus' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ use this number of vcpus as maximum for one vm
+ (only if supported by plugin)
+ End-of-Here
+ content_regex => qr{^(1|2|4|8|16)$},
+ content_descr => '1, 2, 4, 8, 16',
+ default => undef,
+ },
+ 'vmgrid::minvcpus' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ use this number of vcpus as minimum for one vm
+ (only if supported by plugin)
+ End-of-Here
+ content_regex => qr{^(1|2|4|8|16)$},
+ content_descr => '1, 2, 4, 8, 16',
+ default => undef,
+ },
+ 'vmgrid::memratio' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ define memory ratio in nn%
+ order: grid client 1, 2, 3, 4, other VMs, host
+ if desktop virtualization defined the free memory will be
+ distributed between the remaining grid clients,
+ according to their ratio
+ if less than 4 VMs defined in startvms the memory is being
+ reserved for a later manual start
+ set to 0 if you do not intend to start them manually
+ (only if supported by plugin)
+ End-of-Here
+ content_regex => qr{^(\d\d??,\d\d??,\d\d??,\d\d??,\d\d??,\d\d??)$},
+ content_descr => '\d\d??,\d\d??,\d\d??,\d\d??,\d\d??,\d\d??',
+ default => '40,0,0,0,40,20',
+ },
+ 'vmgrid::maxmem' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ maximum RAM used by one vm
+ (only if supported by plugin)
+ End-of-Here
+ content_regex => qr{^(\d\d\d\d??\d??)$},
+ content_descr => 'absolute amount: \d\d\d\d??\d??',
+ default => undef,
+ },
+ 'vmgrid::minmem' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ minimum RAM used by one vm
+ (only if supported by plugin)
+ End-of-Here
+ content_regex => qr{^(\d\d\d\d??\d??)$},
+ content_descr => 'absolute amount: \d\d\d\d??\d??',
+ default => undef,
+ },
+ };
+}
+
+sub installationPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ my $pluginRepoPath = $info->{'plugin-repo-path'};
+ my $openslxBasePath = $info->{'openslx-base-path'};
+
+ $self->_writeRunlevelScript();
+
+ # copy all needed files now:
+ my $pluginName = $self->{'name'};
+ my $pluginBasePath = "$openslxBasePath/lib/plugins/$pluginName/files";
+ foreach my $file ( qw( vmgrid run-vmgrid.sh ) ) {
+ copyFile("$pluginBasePath/$file", "$pluginRepoPath/");
+ chmod 0755, "$pluginRepoPath/$file";
+ }
+
+ return;
+}
+
+sub removalPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ return;
+}
+
+# Write the runlevelscript
+sub _writeRunlevelScript
+{
+ my $self = shift;
+ my $initfile = newInitFile();
+
+ $initfile->setName("vmgrid");
+ $initfile->setDesc("Setup environment for vmgrid. Part of OpenSLX vmgrid plugin.");
+
+ # todo: Function need to be formated proper... not important right now
+ #$initfile->addFunction(
+ # 'running',
+ # 'lsmod | grep -q "$1[^_-]"'
+ #);
+
+# # Is a VM running?
+# my $runningvms = unshiftHereDoc(<<' End-of-Here');
+# if [ -e /tmp/vmgrid/vmgrid.pids ]; then
+# for pid in $(cat /tmp/vmgrid/vmgrid.pids); do
+# if ps aux | grep " ${pid} " | grep vmgrid; then
+# echo "Running: ${pid}"
+# fi
+# done
+# fi
+# End-of-Here
+
+ # Kill all VMS!
+ my $killvms = unshiftHereDoc(<<' End-of-Here');
+ if [ -e /tmp/vmgrid/vmgrid.pids ]; then
+ for pid in $(cat /tmp/vmgrid/vmgrid.pids); do
+ if ps aux | grep " ${pid} " | grep vmgrid; then
+ kill ${pid}
+ fi
+ done
+ fi
+ End-of-Here
+
+ # FORCE: Kill all VMS!
+ my $fkillvms = unshiftHereDoc(<<' End-of-Here');
+ if [ -e /tmp/vmgrid/vmgrid.pids ]; then
+ for pid in $(cat /tmp/vmgrid/vmgrid.pids); do
+ if ps aux | grep " ${pid} " | grep vmgrid; then
+ kill -9 ${pid}
+ fi
+ done
+ fi
+ End-of-Here
+
+ $initfile->addFunction(
+ 'start',
+ ' vmgrid',
+ );
+ $initfile->addToCase(
+ 'kill',
+ 'killvms'
+ );
+ $initfile->addToCase(
+ 'force-kill',
+ 'fkillvms'
+ );
+ $initfile->addToCase(
+ 'status',
+ 'runningvms'
+ );
+ $initfile->addToCase(
+ 'restart',
+ 'stop && start'
+ );
+
+# # get distro version
+# my $distro = (split('-',$self->{'os-plugin-engine'}->distroName()))[0];
+# my $runlevelscript = getInitFileForDistro($initfile, $distro);
+#
+# spitFile("$self->{'pluginRepositoryPath'}/vmgrid-slx", $runlevelscript);
+}
+
+1;
diff --git a/src/os-plugins/plugins/vmgrid/XX_vmgrid.sh b/src/os-plugins/plugins/vmgrid/XX_vmgrid.sh
new file mode 100644
index 00000000..16f5fbd1
--- /dev/null
+++ b/src/os-plugins/plugins/vmgrid/XX_vmgrid.sh
@@ -0,0 +1,104 @@
+# Copyright (c) 2010 - RZ Uni Freiburg
+# Copyright (c) 2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# script is included from init via the "." load function - thus it has all
+# variables and functions available
+
+# include default directories
+. /etc/openslx.conf
+
+CONFFILE="/initramfs/plugin-conf/vmgrid.conf"
+PLUGINCONFDIR=/mnt/${OPENSLX_DEFAULT_CONFDIR}/plugins/vmgrid
+VIRTUALIZATIONPLUGIN=/mnt/${OPENSLX_DEFAULT_CONFDIR}/plugins/virtualization
+#RWSHARE=/mnt/${OPENSLX_DEFAULT_VARDIR}/plugins/vmgrid/share
+RWSHARE=/mnt/var/opt/openslx/plugins/vmgrid/share
+RWSHAREMNT=/mnt/var/opt/openslx/mnt/vmgrid
+BINDIR=/mnt/${OPENSLX_DEFAULT_BINDIR}
+PLUGINDIR=${OPENSLX_DEFAULT_DIR}/plugin-repo/vmgrid
+VIRTDIR=/mnt/${OPENSLX_DEFAULT_VIRTDIR}/vmgrid
+
+if [ -f $CONFFILE ]; then
+
+ # load needed variables
+ . $CONFFILE
+
+ if [ ${vmgrid_active} -ne 0 ] ; then
+ [ ${DEBUGLEVEL} -gt 0 ] && echo "executing the 'vmgrid' os-plugin ..."
+
+ # load general configuration
+ . /etc/initramfs-setup
+ # include functions
+ . /etc/functions
+
+ testmkd ${PLUGINCONFDIR}
+ testmkd ${VIRTDIR}
+ cp $CONFFILE ${PLUGINCONFDIR}/vmgrid.conf
+ # create link to binpath
+ ln -fs ${PLUGINDIR}/vmgrid ${BINDIR}/vmgrid
+ ln -fs ${PLUGINDIR}/run-vmgrid.sh ${BINDIR}/run-vmgrid.sh
+
+ # mount nfs virt ro share
+ if strinstr "nfs://" "${vmgrid_roshare}"; then
+ virtsrcprot=$(uri_token ${vmgrid_roshare} prot)
+ virtsrcserv=$(uri_token ${vmgrid_roshare} server)
+ virtsrcpath="$(uri_token ${vmgrid_roshare} path)"
+ if [ -n "${virtsrcprot}" -a -n "${virtsrcserv}" -a -n "${virtsrcpath}" ];
+ then
+ virtsrctarget=${VIRTDIR}
+ # mount the vmgrid source ro
+ fsmount ${virtsrcprot} ${virtsrcserv} ${virtsrcpath} ${virtsrctarget} \
+ ro
+ fi
+ fi
+
+ # create rw share
+ testmkd ${RWSHARE}
+ # bind mount id 45 to ${RWSHARE}
+ if strinstr "id45" "${vmgrid_rwshare}" ; then
+ id45part=$(grep " 45 " /etc/disk.partition | awk '{print $1}' | \
+ cut -f 3,3 -d /)
+ if [ -n "${id45part}" ]; then
+ testmkd /mnt/media/${id45part}/vmgrid
+ mount --bind -n /mnt/media/${id45part}/vmgrid ${RWSHARE} \
+ >>/tmp/vmgrid.log 2>&1
+ fi
+ # mount nfs rw share
+ elif strinstr "nfs://" "${vmgrid_rwshare}" ; then
+ rwshareprot=$(uri_token ${vmgrid_rwshare} prot)
+ rwshareserv=$(uri_token ${vmgrid_rwshare} server)
+ rwsharepath="$(uri_token ${vmgrid_rwshare} path)"
+ if [ -n "${rwshareprot}" -a -n "${rwshareserv}" -a -n "${rwsharepath}" ];
+ then
+ # mount to a dir fist to create spec host dir, then bind mount
+ testmkd ${RWSHAREMNT}
+ rwtarget=${RWSHAREMNT}
+ # mount the vmgrid source rw
+ fsmount ${rwshareprot} ${rwshareserv} ${rwsharepath} ${rwtarget} rw
+ # hostname?
+ host_name=${host_name:=$clientip}
+ testmkd ${RWSHAREMNT}/${host_name}
+ mount --bind ${RWSHAREMNT}/${host_name} ${RWSHARE} \
+ >>/tmp/vmgrid.log 2>&1
+ fi
+ else
+ testmkd /mnt/tmp/vmgrid
+ mount --bind -n /mnt/tmp/vmgrid ${RWSHARE} >>/tmp/vmgrid.log 2>&1
+ fi
+ # chmod so that everybody can write
+ chmod 1777 ${RWSHARE}
+ echo "vmgrid_rwmnt=${RWSHARE#/mnt}" >> ${PLUGINCONFDIR}/vmgrid.conf
+
+ # finished ...
+ [ $DEBUGLEVEL -gt 0 ] && echo "done with 'vmgrid' os-plugin ..."
+ fi
+else
+ [ $DEBUGLEVEL -gt 0 ] && echo " * configuration of 'vmgrid' os-plugin failed"
+fi
diff --git a/src/os-plugins/plugins/vmgrid/files/run-vmgrid.sh b/src/os-plugins/plugins/vmgrid/files/run-vmgrid.sh
new file mode 100644
index 00000000..51cb5dbc
--- /dev/null
+++ b/src/os-plugins/plugins/vmgrid/files/run-vmgrid.sh
@@ -0,0 +1,430 @@
+#!/bin/bash
+# -----------------------------------------------------------------------------
+# Copyright (c) 2010 - RZ Uni FR
+# Copyright (c) 2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# vmgrid
+# - This is the generic wrapper for the several virtualization solutions...
+################################################################################
+
+. /etc/opt/openslx/openslx.conf
+
+################################################################################
+### Define default dirs / get configs
+################################################################################
+
+PLUGINCONFROOT=${OPENSLX_DEFAULT_CONFDIR}/plugins
+PLUGINCONFVMGRID=${PLUGINCONFROOT}/vmgrid
+RWSHARE=/var/opt/openslx/plugins/vmgrid/share
+# include general configuration from vmgrid
+[ -f ${PLUGINCONFVMGRID}/vmgrid.conf ] && \
+ . ${PLUGINCONFVMGRID}/vmgrid.conf
+# load general virtualization information
+[ -f ${PLUGINCONFROOT}/virtualization/virtualization.conf ] && \
+ . ${PLUGINCONFROOT}/virtualization/virtualization.conf
+# get the vmchooser_active var
+[ -f ${PLUGINCONFROOT}/vmchooser/vmchooser.conf ] && \
+ . ${PLUGINCONFROOT}/vmchooser/vmchooser.conf
+
+################################################################################
+### Functions used throughout the script
+################################################################################
+
+# function to write to stdout and logfile
+LOGFILE=${OPENSLX_DEFAULT_LOGDIR}/run-vmgrid.${USER}.$$.log
+writelog () {
+ # write to stdout
+ echo -e "$1"
+ # log into file
+ echo -e "$1" >> ${LOGFILE}
+ # log into share dir, so that log is available in vm as well
+ echo -e "$1" >> ${vmgrid_rwmnt}/logs/run-vmgrid.${USER}.$$.log
+}
+
+# remove config dirs when exit
+cleanexit () {
+ if echo "${RMDIRS}" 2>/dev/null | grep -q ${vmgrid_virt}; then
+ writelog "${vmgrid_virt} exited. Cleanning up... \c"
+ rm -rf ${RMDIRS} >/dev/null 2>&1
+ writelog "done"
+ fi
+
+ exit "$1"
+}
+
+################################################################################
+### Get XML file and dir
+################################################################################
+
+# check if mem, nice or graphical mode set
+headless=1
+unice=19
+while [ $# -gt 0 ]; do
+ case "$1" in
+ -h|--help)
+ echo -e "Usage: run-vmgrid.sh [-g] [--mem <memory size in MB>] \c"
+ echo -e "[--nice <nice level>] [/path/]filename[.xml]"
+ exit
+ ;;
+ -g)
+ headless=0
+ ;;
+ --mem)
+ # get a result which can be divided through 4
+ if echo $2 | grep -qE \
+ '^[2-9][0-9][0-9]$|^[1-9][0-9][0-9][0-9]$|^1[0-9][0-9][0-9][0-9]$';
+ then
+ forcemem=$(expr $2 / 4 \* 4)
+ else
+ echo "memory $2 not supported (200-19999)!"
+ exit 1
+ fi
+ shift
+ ;;
+ --nice)
+ # set nice level
+ if echo $2 | grep -qE '^-[1-9]$|-1[0-9]$|^-20$|^[0-9]$|^1[0-9]$'; then
+ unice=$2
+ else
+ echo "nice level $2 does not exist!"
+ exit 1
+ fi
+ shift
+ ;;
+ *)
+ xmlfile=$@
+ break
+ ;;
+ esac
+ shift
+done
+
+# absolute or relative path?
+if ls ${xmlfile} 2>/dev/null | grep '/' >/dev/null 2>&1; then
+ xmlpath=$(dirname ${xmlfile})
+ xmlfile=$(basename ${xmlfile})
+else
+ xmlpath=${vmgrid_xmlpath}
+fi
+# full path
+xmlfile="${xmlpath}/${xmlfile%.xml}.xml"
+
+################################################################################
+### Sanity checks
+################################################################################
+
+# test if the xml file is valid
+if ! [ -r "${xmlfile}" ]; then
+ writelog "${xmlfile} not a readable XML file!"
+ run-vmgrid.sh -h &
+ exit 1
+fi
+
+# start to log, create shrare log dir
+mkdir -m 1777 -p ${vmgrid_rwmnt}/logs
+echo "Starting to log at $(date)" \
+ >${vmgrid_rwmnt}/logs/run-vmgrid.${USER}.$$.log
+
+# test how many instances running
+runningvms=$(ps aux | grep "run-vmgrid.sh " | grep -v grep | wc -l)
+# 2 steps, /w only one is seems not to work
+runningvms=$(expr ${runningvms} - 1)
+# if Xen use different method
+if [ "${vmgrid_virt}" = "xen" ]; then
+ runningvms=$(xm list 2>/dev/null | grep -vE "Domain-0|Name.*ID" | wc -l)
+ runningvms=$(expr ${runningvms} + 1)
+fi
+# check value
+if [ ${runningvms} -le 0 ]; then
+ writelog "Error in value: Running VMs: ${runningvms}. Exit!"
+ exit 1
+fi
+# check if vmchooser plugin installed
+if [ -n "${vmchooser_active}" ] && [ ${runningvms} -gt 1 ]; then
+ # only allow one instance of vmgrid
+ writelog "Already 1 VMs running and vmchooser plugin is active."
+ writelog "Can't start ${xmlfile}, exiting!"
+ exit 1
+# else allow max. 4 instances
+elif [ ${runningvms} -gt 4 ]; then
+ writelog "Already 4 VMs running, exiting!"
+ exit 1
+fi
+VM_ID="0${runningvms}"
+
+# test if XML file
+if ! grep '<?xml' "${xmlfile}" >/dev/null 2>&1; then
+ writelog \
+ "Submitted configuration file ${xmlfile} seems to have wrong XML format"
+ exit 1
+fi
+
+################################################################################
+### Logo for console
+################################################################################
+
+cat <<EOL
+ __ __
+ .----.--.--.-----.___.--.--.--------.-----.----.|__|.--| |
+ | _| | | |___| | | | _ | _|| || _ |
+ |__| |_____|__|__| \___/|__|__|__|___ |__| |__||_____|
+ |_____|
+ OpenSLX virtual machine environment preparation script ...
+
+EOL
+
+################################################################################
+### Read needed variables from XML file
+################################################################################
+
+writelog "Starting configuration..."
+writelog "\tVM-ID:\t\t\t${VM_ID}"
+writelog "\tLogfile:\t\t${OPENSLX_DEFAULT_LOGDIR}/run-vmgrid.${USER}.$$.log"
+writelog "\t/tmp info:\t\t$(df -h | grep " /tmp$" | awk '{print $2}') \c"
+writelog "$(grep "/tmp " /proc/mounts | awk '{print $1" "$2" "$3" "$4}')"
+writelog "\tVM XML dir:\t\t$(dirname ${xmlfile})"
+writelog "\tXML file:\t\t${xmlfile}"
+writelog "VM config:"
+
+# name of the virt image or dir
+imgname=$(grep -io '<image_name param=.*"' ${xmlfile} \
+ | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')
+
+# image mode
+imgmode=$(grep -io '<image_mode param=.*"' ${xmlfile} \
+ | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')
+
+# get boot attr
+boot=$(grep -io 'boot param=.*"' ${xmlfile} | awk -F '"' '{ print $2 }')
+diskless=0
+
+# special rw image
+if [ "${imgmode}" = "rwimg" ]; then
+ # maybe you want to use an empty rw imgae?
+ # define only for writelog, will be set in the plugin include again!
+ vmpath="{special rw image}"
+ # add new path for rwimg
+ imgpath=${vmgrid_rwmnt}/specialrwimages
+ unset $imgname
+ mkdir -m 1777 -p ${imgpath}
+# diskless boot
+elif [ "${boot}" = "n" ] && [ -z "${imgname}" ]; then
+ diskless=1
+ vmpath="{diskless boot}"
+# imagename /w full path
+elif echo ${imgname} 2>/dev/null | grep -q '^/' >/dev/null 2>&1; then
+ imgpath=$(dirname ${imgname})
+ imgname=$(basename ${imgname})
+ vmpath=${imgpath}/${imgname}
+# get path from var
+else
+ imgpath=${vmgrid_imgpath}
+ vmpath=${imgpath}/${imgname}
+fi
+
+# check if virtual machine container file exists, only if not rwimg
+if ! [ -e "${vmpath}" ] && [ "${imgmode}" != "rwimg" ] && [ ${diskless} -eq 0 ];
+then
+ writelog "Virtual machine image or directory ${vmpath} not found!"
+ exit 1
+fi
+
+# name of the virt machine, sed because of Windows formatting
+vm_name=$(grep -o 'short_description param=.*"' ${xmlfile} \
+ | sed -e "s/&.*;/; /g" | awk -F '"' '{print $2}')
+# if ${vm_name} not defined use ${xmlfile}
+vm_name=${vm_name:-${xmlfile%.xml}}
+
+# define vm_shortname since vm_name can be very long
+vm_shortname=$(basename ${xmlfile%.xml} | sed -e "s, ,-,g")
+
+# vm_name = displayname, define for old scripts
+displayname=${vm_name}
+
+[ "${imgmode}" != "rwimg" ] && [ ${diskless} -eq 0 ] \
+ && writelog "\tVM Image dir:\t\t${imgpath}"
+writelog "\tVM file/dir:\t\t$vmpath"
+
+# is there an additional configuration provided?
+additional_config=$(grep -o 'additional_config param=.*"' ${xmlfile} \
+ | sed -e "s/&.*;/; /g" | awk -F '"' '{print $2}')
+
+# image is for the following virtual machine
+xmlvirt=$(grep -o 'virtualmachine param=.*"' ${xmlfile} \
+ | sed -e "s/&.*;/; /g" | awk -F '"' '{print $2}')
+
+# make a guess from the filename extension if ${xmlvirt} is empty
+# (not set within the XML file)
+# TODO: implement possibility to submit own configuration files
+if [ -z "${xmlvirt}" ] && [ -n "${additional_config}" ]; then
+ writelog "No virtual machine parameter defined in ${xmlfile}"
+ writelog "Trying to guess VM...\c"
+ case "$(cat ${additional_config} | tr [A-Z] [a-z])" in
+ *config.version*|*virtualhw.version*|*independent-nonpersistent*|*vmdk*)
+ xmlvirt="vmware"
+ ;;
+ *innotek*|*virtualbox*)
+ xmlvirt="virtualbox"
+ ;;
+ *qemu*|*kvm*)
+ xmlvirt="qemukvm"
+ ;;
+ *)
+ xmlvirt="none"
+ ;;
+ esac
+elif [ -z "${xmlvirt}" ]; then
+ case "$(echo ${imgname##*.} | tr [A-Z] [a-z])" in
+ vmdk)
+ xmlvirt="vmware"
+ ;;
+ vbox)
+ xmlvirt="virtualbox"
+ ;;
+ img|qcow*)
+ xmlvirt="qemukvm"
+ ;;
+ *)
+ xmlvirt="none"
+ ;;
+ esac
+ writelog "result:\t${xmlvirt}"
+fi
+
+# check for virt
+if [ "${vmgrid_virt}" != "${xmlvirt}" ]; then
+ writelog "The virtual machine specified in ${xmlfile}"
+ writelog "does not match the virtualization used here (${vmgrid_virt})"
+ exit 1
+fi
+
+# definition of the client system
+vmostype=$(grep -io '<os param=.*"' ${xmlfile} | awk -F '"' '{ print $2 }' \
+ | tr [A-Z] [a-z])
+
+# definition of the networking the client system is connected to
+network_kind=$(grep -io '<network param=.*"' ${xmlfile} \
+ | awk -F '"' '{ print $2 }' | tr [A-Z] [a-z])
+network_card=$(grep -io '<netcard param=.*"' ${xmlfile} \
+ | awk -F '"' '{ print $2 }'| tr [A-Z] [a-z])
+
+# define redirects
+redirects=$(grep -ic '<redirect name=.*"' ${xmlfile})
+[ -z "${redirects}" ] && redirects=0
+(( i=1 ))
+while [ ${i} -le ${redirects} ]; do
+ # get only the $i-th line
+ redirect_name[$i]=$(grep -m ${i} -io '<redirect.*' ${xmlfile} | tail -n 1 \
+ | grep -o "name=\".*" | awk -F '"' '{ print $2 }')
+ redirect_proto[$i]=$(grep -m ${i} -io '<redirect.*' ${xmlfile} | tail -n 1 \
+ | grep -o "proto=\".*" | awk -F '"' '{ print $2 }')
+ redirect_hport[$i]=$(grep -m ${i} -io '<redirect.*' ${xmlfile} | tail -n 1 \
+ | grep -o "hostport=\".*" | awk -F '"' '{ print $2 }')
+ redirect_gport[$i]=$(grep -m ${i} -io '<redirect.*' ${xmlfile} | tail -n 1 \
+ | grep -o "guestport=\".*" | awk -F '"' '{ print $2 }')
+ (( i=$i+1 ))
+done
+
+writelog "\tVirtualization:\t\t$xmlvirt"
+writelog "\tVM name:\t\t$vm_name"
+writelog "\tVM short name:\t\t$vm_shortname"
+
+###############################################################################
+### Declaration of default variables
+###############################################################################
+
+# make sure cpu_cores is not empty
+cpu_cores=${cpu_cores:-"1"}
+#vmgrid::maxvcpus
+#vmgrid::minvcpus
+# check for CPU virtualization flags
+#vmgrid::vt
+
+# total amount of memory defined in stage 3
+permem=60
+# get a result which can be divided through 4
+mem=$(expr ${totalmem} / 100 \* ${permem} / 4 \* 4)
+#vmgrid::maxmem
+#vmgrid::minmem
+
+# configuring ethernet mac address: first 3 bytes are fixed (00:50:56)
+# 4th byte is the VM-ID
+# last two bytes are taken from the bridge of the host
+# define one MAC per guest
+macguestpart="00:50:56:${VM_ID}"
+machostpart=$(echo ${hostmacaddr} | awk -F ":" '{print $(NF-1)":"$NF}')
+macaddr=$(echo "${macguestpart}:${machostpart}" | tr [a-z] [A-Z])
+
+# ide is expected default, test for the virtual disk image type should
+# be done while creating the runscripts ...
+# TODO: cdrom / floppy?
+ide="TRUE"
+scsi="FALSE"
+hddrv="ide"
+cdrom0="FALSE"
+audio="false"
+remotedesktopport="590${VM_ID}"
+
+# add rw share
+sharepath="${vmgrid_rwmnt}/folders/${vm_shortname}"
+mkdir -p ${sharepath}
+chmod -f 1777 "${vmgrid_rwmnt}/folders"
+sharename="share"
+
+# set hostname: using original hostname and adding string
+hostname="vmgrid${VM_ID}-$(hostname)"
+
+writelog "\tVM Hostname:\t\t$hostname"
+
+################################################################################
+### Setup the rest of the environment and run the configured vm
+################################################################################
+
+# Copy guest configuration (with added information) config.xml to be accessed
+# via virtual floppy
+# TODO: virt-floppy needed?
+
+# Get all virtual machine specific stuff from the respective include file
+if [ -e ${PLUGINCONFROOT}/${vmgrid_virt}/run-virt.include ] ; then
+ writelog "Starting ${vmgrid_virt} specific part ..."
+ self=${vmgrid_virt}
+ . ${PLUGINCONFROOT}/${vmgrid_virt}/run-virt.include
+else
+ writelog "Failed because of missing ${vmgrid_virt} plugin"
+ exit 1
+fi
+
+# start graphical mode
+if [ ${headless} -eq 0 ]; then
+ if [ -z "${VIRTCMD}" ]; then
+ writelog "Grapical mode not available, exiting!"
+ cleanexit 1
+ fi
+ writelog "Starting ${vmgrid_virt} in graphical mode /w nice level ${unice}..."
+ # start /w low nice level
+ nice -n ${unice} ${VIRTCMD} ${VIRTCMDOPTS} 2>/dev/null
+# start headless
+elif [ -n "${VIRTCMDHL}" ]; then
+ writelog "Starting ${vmgrid_virt} in headless mode /w nice level ${unice}..."
+ # start /w low nice level
+ nice -n ${unice} ${VIRTCMDHL} ${VIRTCMDOPTSHL} 2>/dev/null
+else
+ writelog "${vmgrid_virt}: No headless mode defined, exiting!"
+ cleanexit 1
+fi
+
+# postrun for scripts after virtualization finishes
+if [ -n "${POSTRUN}" ]; then
+ eval ${POSTRUN} >/dev/null 2>&1
+fi
+
+cleanexit 0
+exit 0
diff --git a/src/os-plugins/plugins/vmgrid/files/vmgrid b/src/os-plugins/plugins/vmgrid/files/vmgrid
new file mode 100644
index 00000000..2bb91481
--- /dev/null
+++ b/src/os-plugins/plugins/vmgrid/files/vmgrid
@@ -0,0 +1,154 @@
+#!/bin/bash
+# -----------------------------------------------------------------------------
+# Copyright (c) 2010 - RZ Uni FR
+# Copyright (c) 2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# vmgrid
+# - Script for autostarts defined in vmgrid::startvms
+################################################################################
+
+# include default directories
+. /etc/opt/openslx/openslx.conf
+
+################################################################################
+### Manual Start
+################################################################################
+
+if [ -n "$1" ]; then
+ if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
+ echo -e "Usage: vmgrid [[-g] [--mem <memory size in MB>] \c"
+ echo -e "[--nice <nice level>] [/path/]filename[.xml]]"
+ exit 0
+ else
+ echo "Starting run-vmgrid.sh with options '$@'"
+ run-vmgrid.sh $@ 2>/dev/null
+ exit
+ fi
+fi
+
+################################################################################
+### Define default dirs / get configs
+################################################################################
+
+PLUGINCONFROOT=${OPENSLX_DEFAULT_CONFDIR}/plugins
+PLUGINCONFDIR=${PLUGINCONFROOT}/vmgrid
+RWSHARE=/var/opt/openslx/plugins/vmgrid/share
+# include general configuration from vmgrid
+[ -f ${PLUGINCONFDIR}/vmgrid.conf ] && \
+ . ${PLUGINCONFDIR}/vmgrid.conf
+# load general virtualization information
+[ -f ${PLUGINCONFROOT}/virtualization/virtualization.conf ] && \
+ . ${PLUGINCONFROOT}/virtualization/virtualization.conf
+
+################################################################################
+### Functions used throughout the script
+################################################################################
+
+# function to write to stdout and logfile
+writelog () {
+ # write to stdout
+ echo -e "$1"
+ # log into file
+ echo -e "$1" >> ${OPENSLX_DEFAULT_LOGDIR}/vmgrid.${USER}.$$.log
+ # log into share dir, so that log is available in vm as well
+ echo -e "$1" >> ${vmgrid_rwmnt}/logs/vmgrid.${USER}.$$.log
+}
+
+################################################################################
+### Configure VMs for autostart and set RAM
+################################################################################
+
+# start to log, create share log dir
+mkdir -m 1777 -p ${vmgrid_rwmnt}/logs
+mkdir -m 1777 -p /tmp/vmgrid
+mkdir -p /tmp/vmgrid/${USER}
+echo "Starting to log at $(date)" \
+ >${vmgrid_rwmnt}/logs/vmgrid.${USER}.$$.log
+
+if [ -z "${hostratio}" ]; then
+ writelog "There has been an error in the memory configuration in stage 3"
+ writelog "Please check your memory ratio settings, exiting!"
+ exit 1
+fi
+
+if [ -z "${hostratio}" ]; then
+ writelog "There has been an error in the memory configuration in stage 3"
+ writelog "Please check your memory ratio settings, exiting!"
+ exit 1
+fi
+
+# remove blanks
+vmgrid_startvms=$(echo ${vmgrid_startvms} | sed -e "s, *,,g")
+vmgrid_memratio=$(echo ${vmgrid_memratio} | sed -e "s, *,,g")
+
+# hostmem, mainvirt from virtualization plugin
+# ratio minus other vms and host
+restratio=$(expr 100 - ${hostratio} - ${mainvirtratio})
+
+# hostmem, totalmem, mainvirtmem from virtualization plugin
+# calculate freemem
+freemem=$(expr ${totalmem} - ${hostmem} - ${mainvirtmem} 2>/dev/null)
+if [ ${freemem} -lt 512 2>/dev/null ]; then
+ writelog "Not enough free RAM for this plugin, free: ${freemem} MB"
+ exit 1
+fi
+
+# get clients mem ratio
+vmsumratios=0
+for i in {1..4}; do
+ vm[$i]=$(echo ${vmgrid_startvms} | awk -F ',' '{print $1}')
+ # remove ${vm[$i]} from list because of '{print $1}'
+ vmgrid_startvms=$(echo ${vmgrid_startvms} | sed -e "s,${vm[$i]}\,*,,")
+ vmratio[$i]=$(echo ${vmgrid_memratio} | awk -F ',' '{print $1}')
+ # remove ${vmratio[$i]} from list because of '{print $1}'
+ vmgrid_memratio=$(echo ${vmgrid_memratio} | sed -e "s/${vmratio[$i]},*//")
+ vmsumratios=$(expr ${vmsumratios} + ${vmratio[$i]} 2>/dev/null)
+done
+
+for i in {1..4}; do
+ # calculate VMs mem: mem = $freemem * $vmratio/100 * 100/$restratio
+ # multiple of 4
+ vmmem[$i]=$(expr ${freemem} \* ${vmratio[$i]} / ${restratio} / 4 \* 4 \
+ 2>/dev/null)
+ if [ -n "${vm[$i]}" ] && [ ${vmmem[$i]} -lt 512 2>/dev/null ]; then
+ writelog "Not enough free RAM for ${vm[$i]} (min. 512 MB), \c"
+ writelog "free: ${vmmem[$i]} MB"
+ unset vm[$i]
+ fi
+done
+
+################################################################################
+### Start the VMs
+################################################################################
+
+# start vms
+for i in {1..4}; do
+ if [ -n "${vm[$i]}" ]; then
+ alreadyrunning=$(ps aux | grep run-vmgrid.sh | grep -v grep \
+ | grep "${vm[$i]}" | wc -l)
+ # if Xen use different method
+ if [ "${vmgrid_virt}" = "xen" ]; then
+ alreadyrunning=$(xm list 2>/dev/null | grep -vE "Domain-0|Name.*ID" \
+ | grep "${vm[$i]}-0.$" | wc -l)
+ fi
+ if [ ${alreadyrunning} -gt 0 2>/dev/null ]; then
+ writelog "${vm[$i]} already running, skipping!"
+ else
+ writelog "Starting ${vm[$i]} via run-vmgrid.sh with ${vmmem[$i]} MB RAM"
+ run-vmgrid.sh --mem ${vmmem[$i]} ${vm[$i]} 2>/dev/null &
+ echo $! > /tmp/vmgrid/${USER}/vmgrid.pids
+ # wait 10 secs for the next vm to start
+ sleep 10
+ fi
+ fi
+done
+
+exit 0
diff --git a/src/os-plugins/plugins/vmgrid/init-hooks/80-after-plugins/virtualization.sh b/src/os-plugins/plugins/vmgrid/init-hooks/80-after-plugins/virtualization.sh
new file mode 100644
index 00000000..73a65ac5
--- /dev/null
+++ b/src/os-plugins/plugins/vmgrid/init-hooks/80-after-plugins/virtualization.sh
@@ -0,0 +1,144 @@
+# Copyright (c) 2010 - RZ Uni Freiburg
+# Copyright (c) 2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# script is included from init via the "." load function - thus it has all
+# variables and functions available
+
+# virtual virtualization plugin
+# make sure that this file is the same in vmgrid and vmchooser plugin!
+
+# include default directories
+. /etc/openslx.conf
+
+CONFFILEVMCHOOSER="/initramfs/plugin-conf/vmchooser.conf"
+CONFFILEVMGRID="/initramfs/plugin-conf/vmgrid.conf"
+PLUGINCONFDIR=/mnt/${OPENSLX_DEFAULT_CONFDIR}/plugins/virtualization
+
+# check if plugins available
+active=0
+[ -f ${CONFFILEVMCHOOSER} ] && . ${CONFFILEVMCHOOSER}
+[ "x${vmchooser_active}" = "x1" ] && active=1
+[ -f ${CONFFILEVMGRID} ] && . ${CONFFILEVMGRID}
+[ "x${vmgrid_active}" = "x1" ] && active=1
+
+[ $DEBUGLEVEL -gt 0 ] \
+ && echo -e "Executing the 'virtualization' plugin ... \c"
+
+if [ ${active} -ne 0 ] ; then
+
+ # load general configuration
+ . /etc/initramfs-setup
+ # include functions
+ . /etc/functions
+
+ testmkd ${PLUGINCONFDIR}
+
+ # check if vmgrid active and change free mem
+ totalmem=$(expr $(grep -i "memtotal" /proc/meminfo \
+ | awk '{print $2}') / 1024)
+ echo "totalmem=${totalmem}" >> ${PLUGINCONFDIR}/virtualization.conf
+
+ if [ "x${vmgrid_active}" = "x1" ]; then
+
+ totalmemtest=$(expr $(echo ${vmgrid_memratio} \
+ | awk -F ',' '{print $1" + "$2" + "$3" + "$4" + "$5" + "$6}'))
+
+ # not more than 100% memory assigned
+ if [ ${totalmemtest} -le 100 2>/dev/null ]; then
+
+ # host mem
+ hostratio=$(echo ${vmgrid_memratio} | awk -F ',' '{print $6}')
+ hostmem=$(expr ${totalmem} \* ${hostratio} / 100 2>/dev/null)
+ if [ ${hostmem} -lt 256 2>/dev/null ]; then
+ # min. 256 MB for host
+ hostmem=256
+ fi
+
+ # main vm mem (vmchooser)
+ if [ "x${vmchooser_active}" = "x1" ]; then
+ mainvirtratio=$(echo ${vmgrid_memratio} | awk -F ',' '{print $5}')
+ mainvirtmem=$(expr ${totalmem} \* ${mainvirtratio} / 100 2>/dev/null)
+ if [ ${mainvirtmem} -lt 512 2>/dev/null ]; then
+ # min. 512 for vmchooser
+ mainvirtmem=512
+ fi
+ else
+ mainvirtratio=0
+ mainvirtmem=0
+ fi
+
+ cat << EOF >> ${PLUGINCONFDIR}/virtualization.conf
+hostratio=${hostratio}
+hostmem=${hostmem}
+mainvirtratio=${mainvirtratio}
+mainvirtmem=${mainvirtmem}
+EOF
+
+ fi
+ fi
+
+ # cpu cores
+ CPU_CORES=$(grep 'processor.*:' /proc/cpuinfo | wc -l)
+ if [ "${CPU_CORES}" -gt "1" 2>/dev/null ]; then
+ echo "cpu_cores=${CPU_CORES}" \
+ >> ${PLUGINCONFDIR}/virtualization.conf
+ else
+ echo 'cpu_cores=1' >> ${PLUGINCONFDIR}/virtualization.conf
+ fi
+
+ # arch
+ echo "host_arch=$(uname -m)" >> ${PLUGINCONFDIR}/virtualization.conf
+
+ # VT enabled cpu?
+ if grep -q ^flags.*\\\<vmx\\\> /proc/cpuinfo; then
+ echo "vtflag=1" >> ${PLUGINCONFDIR}/virtualization.conf
+ echo 'kvm_module="kvm_intel"' >> ${PLUGINCONFDIR}/virtualization.conf
+ elif grep -q ^flags.*\\\<svm\\\> /proc/cpuinfo; then
+ echo "vtflag=1" >> ${PLUGINCONFDIR}/virtualization.conf
+ echo 'kvm_module="kvm_amd"' >> ${PLUGINCONFDIR}/virtualization.conf
+ else
+ echo "vtflag=0" >> ${PLUGINCONFDIR}/virtualization.conf
+ fi
+
+ # write mac
+ echo "hostmacaddr=${macaddr}" >> ${PLUGINCONFDIR}/virtualization.conf
+ # ip addr
+ echo "hostip=${clientip}" >> ${PLUGINCONFDIR}/virtualization.conf
+ # hostname
+ echo "hostname=${host_name}" >> ${PLUGINCONFDIR}/virtualization.conf
+
+ # get further hw information
+ waitfor /etc/hwinfo.cdrom
+ j=0
+ for i in $(cat /etc/hwinfo.cdrom); do
+ echo "cdrom_$j=$i" >> ${PLUGINCONFDIR}/virtualization.conf
+ j=$(expr $j + 1)
+ done
+
+ waitfor /etc/hwinfo.floppy
+ j=0
+ for i in $(cat /etc/hwinfo.floppy); do
+ echo "floppy_$j=$i" >> ${PLUGINCONFDIR}/virtualization.conf
+ j=$(expr $j + 1)
+ done
+
+ # copy host information to rwshare of vmgrid plugin
+ if [ "x${vmgrid_active}" = "x1" ]; then
+ cp ${PLUGINCONFDIR}/virtualization.conf ${vmgrid_rwmnt}/host.conf
+ fi
+
+ # finished ...
+ [ $DEBUGLEVEL -gt 0 ] \
+ && echo "ok"
+else
+ [ $DEBUGLEVEL -gt 0 ] \
+ && echo "failed"
+fi
diff --git a/src/os-plugins/plugins/vmware/OpenSLX/Distro/Base.pm b/src/os-plugins/plugins/vmware/OpenSLX/Distro/Base.pm
new file mode 100644
index 00000000..d59227ad
--- /dev/null
+++ b/src/os-plugins/plugins/vmware/OpenSLX/Distro/Base.pm
@@ -0,0 +1,47 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# vmware/OpenSLX/Distro/Base.pm
+# - provides base implementation of the Distro API for the vmware plugin.
+# -----------------------------------------------------------------------------
+package vmware::OpenSLX::Distro::Base;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+use Scalar::Util qw( weaken );
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {};
+ return bless $self, $class;
+
+}
+
+sub initialize
+{
+ my $self = shift;
+ my $engine = shift;
+ weaken($self->{engine});
+ # avoid circular reference between plugin and its engine
+
+ return 1;
+}
+
+1;
diff --git a/src/os-plugins/plugins/vmware/OpenSLX/Distro/Debian.pm b/src/os-plugins/plugins/vmware/OpenSLX/Distro/Debian.pm
new file mode 100644
index 00000000..fb7b4998
--- /dev/null
+++ b/src/os-plugins/plugins/vmware/OpenSLX/Distro/Debian.pm
@@ -0,0 +1,227 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# vmware/OpenSLX/Distro/debian.pm
+# - provides Debian-specific overrides of the Distro API for the vmware
+# plugin.
+# -----------------------------------------------------------------------------
+package vmware::OpenSLX::Distro::Debian;
+
+use strict;
+use warnings;
+
+use base qw(vmware::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub fillRunlevelScript
+{
+ my $self = shift;
+ my $location = shift;
+ my $kind = shift;
+
+ my $script = unshiftHereDoc(<<" End-of-Here");
+ #!/bin/sh
+ # Ubuntu/Debian specific start/stop script, generated via stage1 'vmware'
+ # plugin install
+ # inspiration taken from vmware start script:
+ # Copyright 1998-2007 VMware, Inc. All rights reserved.
+ #
+ # This script manages the services needed to run VMware software
+
+ # Basic support for the Linux Standard Base Specification 1.3
+ ### BEGIN INIT INFO
+ # Provides: VMware
+ # Required-Start: \$syslog
+ # Required-Stop:
+ # Default-Start: 2 3 5
+ # Default-Stop: 0 6
+ # Short-Description: Manages the services needed to run VMware software
+ # Description: Manages the services needed to run VMware software
+ ### END INIT INFO
+
+ load_modules() {
+ End-of-Here
+
+ # Load modules
+ if ($kind eq 'local' || $kind eq 'local25' || $kind eq 'local30') {
+ if ($kind eq 'local30') {
+ $script .= unshiftHereDoc(<<" End-of-Here");
+ # vmplayer 3.0 specific stuff
+ insmod /lib/modules/\$(uname -r)/misc/vsock.ko || return 1
+ insmod /lib/modules/\$(uname -r)/misc/vmci.ko || return 1
+ End-of-Here
+ }
+ $script .= unshiftHereDoc(<<" End-of-Here");
+ # to be filled in via the stage1 configuration script
+ insmod /lib/modules/\$(uname -r)/misc/vmmon.ko || return 1
+ insmod /lib/modules/\$(uname -r)/misc/vmnet.ko || return 1
+ insmod /lib/modules/\$(uname -r)/misc/vmblock.o 2>/dev/null || return 0
+ End-of-Here
+ } elsif ($kind eq 'vmpl1.0') {
+ $script .= unshiftHereDoc(<<" End-of-Here");
+ vmware_kind_path=/opt/openslx/plugin-repo/vmware/${kind}/
+ module_src_path=\${vmware_kind_path}/vmroot/modules
+ insmod \${module_src_path}/vmmon.ko
+ insmod \${module_src_path}/vmnet.ko
+ End-of-Here
+ } elsif ($kind eq "vmpl2.0") {
+ $script .= unshiftHereDoc(<<" End-of-Here");
+ vmware_kind_path=/opt/openslx/plugin-repo/vmware/${kind}/
+ module_src_path=\${vmware_kind_path}/vmroot/modules
+ insmod \${module_src_path}/vmmon.ko
+ insmod \${module_src_path}/vmnet.ko
+ insmod \${module_src_path}/vmblock.ko
+ End-of-Here
+ } elsif ($kind eq 'vmpl2.5') {
+ $script .= unshiftHereDoc(<<" End-of-Here");
+ vmware_kind_path=/opt/openslx/plugin-repo/vmware/${kind}/
+ module_src_path=\${vmware_kind_path}/vmroot/modules
+ insmod \${module_src_path}/vmmon.ko
+ insmod \${module_src_path}/vmnet.ko
+ insmod \${module_src_path}/vmblock.ko
+ End-of-Here
+ } elsif ($kind eq 'vmpl3.0') {
+ $script .= unshiftHereDoc(<<" End-of-Here");
+ vmware_kind_path=/opt/openslx/plugin-repo/vmware/${kind}/
+ module_src_path=\${vmware_kind_path}/vmroot/modules
+ insmod \${module_src_path}/vmmon.ko
+ insmod \${module_src_path}/vmnet.ko
+ insmod \${module_src_path}/vmblock.ko
+ insmod \${module_src_path}/vsock.ko
+ insmod \${module_src_path}/vmci.ko
+ End-of-Here
+ }
+
+ # unload modules
+ $script .= unshiftHereDoc(<<" End-of-Here");
+ }
+
+ unload_modules() {
+ # to be filled with the proper list within via the stage1
+ # configuration script
+ rmmod vmmon vmblock vmnet vmmon vmci vsock 2>/dev/null
+ }
+ End-of-Here
+
+ # setup vmnet0 and vmnet8
+ # depends on specific stage3 setting. I let this if in the code
+ # because else this whole if-reducing process will become more
+ # complicated and the code will get less understandable
+ $script .= unshiftHereDoc(<<" End-of-Here");
+ # the bridged interface
+ setup_vmnet0() {
+ if [ -n "\$vmnet0" ] ; then
+ # the path might be directly point to the plugin dir
+ End-of-Here
+ if ($kind eq 'vmpl2.5' || $kind eq 'vmpl3.0' || $kind eq 'local25' || $kind eq 'local30') {
+ $script .= " $location/vmnet-bridge -d /var/run/vmnet-bridge-0.pid -n 0\n";
+ } else {
+ $script .= " $location/vmnet-bridge -d /var/run/vmnet-bridge-0.pid /dev/vmnet0 eth0\n";
+ }
+ $script .= unshiftHereDoc(<<" End-of-Here");
+ fi
+ }
+ # we definately prefer the hostonly interface for NATed operation too
+ # distinction is made via enabled forwarding
+ setup_vmnet1() {
+ if [ -n "\$vmnet1" ] ; then
+ # the path might be directly point to the plugin dir
+ $location/vmnet-netifup -d /var/run/vmnet-netifup-vmnet1.pid \\
+ /dev/vmnet1 vmnet1
+ dhcpif="\$dhcpif vmnet1"
+ ip addr add \$vmnet1 dev vmnet1
+ ip link set vmnet1 up
+ if [ -n "\$vmnet1nat" ] ; then
+ # needs refinement interface name for eth0 is known in stage3 already
+ echo "1" > /proc/sys/net/ipv4/conf/vmnet1/forwarding 2>/dev/null
+ echo "1" > /proc/sys/net/ipv4/conf/eth0/forwarding 2>/dev/null
+ #iptables -A -s vmnet1 -d eth0
+ fi
+ $location/vmnet-dhcpd -cf /etc/vmware/dhcpd-vmnet1.conf -lf \\
+ /var/run/vmware/dhcpd-vmnet1.leases \\
+ -pf /var/run/vmnet-dhcpd-vmnet1.pid vmnet1 2>/dev/null # or logfile
+ fi
+ }
+ # incomplete ...
+ setup_vmnet8() {
+ if [ -n "\$vmnet8" ] ; then
+ # we don't need the following test. It's handled by
+ # XX_vmware.sh
+ #test -c /dev/vmnet8 || mknod c 119 8 /dev/vmnet8
+ $location/vmnet-netifup -d /var/run/vmnet-netifup-vmnet8.pid \\
+ /dev/vmnet8 vmnet8
+ ip addr add \$vmnet8 dev vmnet8
+ ip link set vmnet8 up
+ # /etc/vmware/vmnet-natd-8.mac simply contains a mac like 00:50:56:F1:30:50
+ $location/vmnet-natd -d /var/run/vmnet-natd-8.pid \\
+ -m /etc/vmware/vmnet-natd-8.mac -c /etc/vmware/nat.conf 2>/dev/null # or logfile
+ $location/vmnet-dhcpd -cf /etc/vmware/dhcpd-vmnet8.conf \\
+ -lf /var/run/vmware/dhcpd-vmnet8.leases \\
+ -pf /var/run/vmnet-dhcpd-vmnet8.pid vmnet8 2>/dev/null # or logfile
+ fi
+ }
+ # initialize the lsb status messages
+ . /lib/lsb/init-functions
+
+ case \$1 in
+ start)
+ log_daemon_msg "Starting vmware background services ..." "vmware"
+ # include default directories
+ . /etc/opt/openslx/openslx.conf
+ # load the configuration file
+ . \${OPENSLX_DEFAULT_CONFDIR}/plugins/vmware/vmware.conf
+ mkdir -p /var/run/vmware
+ touch /var/run/vmware/dhcpd-vmnet1.leases
+ touch /var/run/vmware/dhcpd-vmnet8.leases
+ load_modules || log_warning_msg "The loading of vmware modules failed"
+ setup_vmnet0 || log_warning_msg "Problems setting up vmnet0 interface"
+ setup_vmnet1 || log_warning_msg "Problems setting up vmnet1 interface"
+ setup_vmnet8 || log_warning_msg "Problems setting up vmnet8 interface"
+ log_end_msg $?
+ ;;
+ stop)
+ # message output should match the given vendor-os
+ log_daemon_msg "Stopping vmware background services ..." "vmware"
+ killall vmnet-netifup vmnet-natd vmnet-bridge vmware vmplayer \\
+ vmware-tray vmnet-dhcpd 2>/dev/null
+ # wait for shutting down of interfaces. vmnet needs kinda
+ # long
+ sleep 1
+ unload_modules
+ log_end_msg $?
+ ;;
+ # we don't need a status yet... at least as long as it is
+ # unclear in which path the corresponding binary (see original
+ # /etc/init.d/vmware) is in our case
+ #status)
+ # log_daemon_msg "Say something useful here ..."
+ #;;
+ restart)
+ \$0 stop
+ \$0 start
+ exit $?
+ ;;
+ *)
+ log_success_msg "Usage: \$0 {start|stop|restart}"
+ exit 2
+ ;;
+ esac
+ exit 0
+ End-of-Here
+ return $script;
+}
+
+1;
diff --git a/src/os-plugins/plugins/vmware/OpenSLX/Distro/Fedora.pm b/src/os-plugins/plugins/vmware/OpenSLX/Distro/Fedora.pm
new file mode 100644
index 00000000..912bdfa0
--- /dev/null
+++ b/src/os-plugins/plugins/vmware/OpenSLX/Distro/Fedora.pm
@@ -0,0 +1,29 @@
+# Copyright (c) 2007..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# vmware/OpenSLX/Distro/Fedora.pm
+# - provides Fedora-specific overrides of the Distro API for the vmware
+# plugin.
+# -----------------------------------------------------------------------------
+package vmware::OpenSLX::Distro::Fedora;
+
+use strict;
+use warnings;
+
+use base qw(vmware::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+
+################################################################################
+### interface methods
+################################################################################
+
+
+1;
diff --git a/src/os-plugins/plugins/vmware/OpenSLX/Distro/Gentoo.pm b/src/os-plugins/plugins/vmware/OpenSLX/Distro/Gentoo.pm
new file mode 100644
index 00000000..2e1197d8
--- /dev/null
+++ b/src/os-plugins/plugins/vmware/OpenSLX/Distro/Gentoo.pm
@@ -0,0 +1,28 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# vmware/OpenSLX/Distro/Gentoo.pm
+# - provides Gentoo-specific overrides of the Distro API for the vmware
+# plugin.
+# -----------------------------------------------------------------------------
+package vmware::OpenSLX::Distro::Gentoo;
+
+use strict;
+use warnings;
+
+use base qw(vmware::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+
+################################################################################
+### interface methods
+################################################################################
+
+1;
diff --git a/src/os-plugins/plugins/vmware/OpenSLX/Distro/Suse.pm b/src/os-plugins/plugins/vmware/OpenSLX/Distro/Suse.pm
new file mode 100644
index 00000000..c1b2ecf4
--- /dev/null
+++ b/src/os-plugins/plugins/vmware/OpenSLX/Distro/Suse.pm
@@ -0,0 +1,28 @@
+# Copyright (c) 2008..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# vmware/OpenSLX/Distro/Suse.pm
+# - provides SUSE-specific overrides of the Distro API for the vmware plugin.
+# -----------------------------------------------------------------------------
+package vmware::OpenSLX::Distro::Suse;
+
+use strict;
+use warnings;
+
+use base qw(vmware::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+1;
diff --git a/src/os-plugins/plugins/vmware/OpenSLX/Distro/Ubuntu.pm b/src/os-plugins/plugins/vmware/OpenSLX/Distro/Ubuntu.pm
new file mode 100644
index 00000000..922fb34f
--- /dev/null
+++ b/src/os-plugins/plugins/vmware/OpenSLX/Distro/Ubuntu.pm
@@ -0,0 +1,23 @@
+# Copyright (c) 2007..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# vmware/OpenSLX/Distro/Ubuntu.pm
+# - provides Ubuntu-specific overrides of the Distro API for the vmware
+# plugin.
+# -----------------------------------------------------------------------------
+package vmware::OpenSLX::Distro::Ubuntu;
+
+use strict;
+use warnings;
+
+# inherit everything from Debian (as Ubuntu is based on it anyway)
+use base qw(vmware::OpenSLX::Distro::Debian);
+
+1;
diff --git a/src/os-plugins/plugins/vmware/OpenSLX/OSPlugin/vmware.pm b/src/os-plugins/plugins/vmware/OpenSLX/OSPlugin/vmware.pm
new file mode 100644
index 00000000..7e55019c
--- /dev/null
+++ b/src/os-plugins/plugins/vmware/OpenSLX/OSPlugin/vmware.pm
@@ -0,0 +1,836 @@
+# Copyright (c) 2008..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# vmware.pm
+# - declares necessary information for the vmware plugin
+# -----------------------------------------------------------------------------
+package OpenSLX::OSPlugin::vmware;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSPlugin::Base);
+
+use File::Basename;
+use File::Path;
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+use OpenSLX::DistroUtils;
+
+sub new
+{
+ my $class = shift;
+
+ my $self = {
+ name => 'vmware',
+ };
+
+ return bless $self, $class;
+}
+
+sub getInfo
+{
+ my $self = shift;
+
+ return {
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Module for enabling services of VMware Inc. on an OpenSLX stateless
+ client. This plugin might use pre-existing installations of VMware
+ tools or install addional variants and versions.
+ End-of-Here
+ precedence => 70,
+ required => [ qw( desktop ) ],
+ };
+}
+
+sub getAttrInfo
+{
+ # returns a hash-ref with information about all attributes supported
+ # by this specific plugin
+ my $self = shift;
+
+ # This default configuration will be added as attributes to the default
+ # system, such that it can be overruled for any specific system by means
+ # of slxconfig.
+ return {
+ # attribute 'active' is mandatory for all plugins
+ 'vmware::active' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should the 'vmware'-plugin be executed during boot?
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '1 means active - 0 means inactive',
+ default => '1',
+ },
+ # attribute 'imagesrc' defines where we can find vmware images
+ 'vmware::imagesrc' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Where do we store our vmware images? NFS? Filesystem?
+ End-of-Here
+ #TODO: check if the input is valid
+ #content_regex => qr{^(0|1)$},
+ content_descr => 'Allowed values: path or URI',
+ default => '',
+ },
+ # attribute 'bridge' defines if bridged network mode should be
+ # switched on
+ 'vmware::bridge' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Should the bridging (direct access of the vmware clients
+ to the ethernet the host is connected to) be enabled
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => 'Allowed values: 0 or 1',
+ default => '1',
+ },
+ # attribute 'vmnet1' defines if the host connection network mode
+ # should be switched on and NAT should be enabled
+ 'vmware::vmnet1' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Format ServerIP/Netprefix without NAT
+ Format ServerIP/Netprefix,NAT enables NAT/Masquerading
+ End-of-Here
+ #TODO: check if the input is valid
+ #content_regex => qr{^(0|1)$},
+ content_descr => 'Allowed value: IP/Prefix[,NAT]',
+ default => '192.168.101.1/24,NAT',
+ },
+ # attribute 'vmnet8' defines if vmware specific NATed network mode
+ # should be switched on
+ 'vmware::vmnet8' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Format ServerIP/Netprefix. Last octet will be omitted
+ End-of-Here
+ #TODO: check if the input is valid
+ #content_regex => qr{^(0|1)$},
+ content_descr => 'Allowed value: IP/Prefix. Last octet will be omitted',
+ default => '192.168.102.x/24',
+ },
+ # attribute 'kind' defines which set of VMware binaries should be
+ # activated ('local' provided with the main installation set).
+ 'vmware::kind' => {
+ applies_to_vendor_os => 0,
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Which set of VMware binaries to use: installed (local) or provided by the
+ plugin itself (vmpl1.0, vmpl2.0, vmpl2.5, vmpl3.X)?
+ End-of-Here
+ # only allow the supported once...
+ # TODO: modify if we know which of them work
+ #content_regex => qr{^(local|vmws(5\.5|6.0)|vmpl(1\.0|2\.0))$},
+ content_regex => qr{^(local|vmpl3\.0||vmpl2\.0|vmpl1\.0|vmpl2\.5)$},
+ content_descr => 'Allowed values: local, vmpl2.0',
+ #TODO: what if we don't have a local installation. default
+ # is still local. Someone has a clue how to test
+ # it and change the default value?
+ default => 'local',
+ },
+ ##
+ ## only stage1 setup options: different kinds to setup
+ 'vmware::local' => {
+ applies_to_vendor_os => 1,
+ applies_to_system => 0,
+ applies_to_clients => 0,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Set's up stage1 configuration for a local installed
+ vmplayer or vmware workstation
+ End-of-Here
+ content_regex => qr{^(1|0)$},
+ content_descr => '1 means active - 0 means inactive',
+ default => '1',
+ },
+ 'vmware::vmpl2.0' => {
+ applies_to_vendor_os => 1,
+ applies_to_system => 0,
+ applies_to_clients => 0,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Install and configure vmplayer v2
+ End-of-Here
+ content_regex => qr{^(1|0)$},
+ content_descr => '1 means active - 0 means inactive',
+ default => '0',
+ },
+ 'vmware::vmpl2.5' => {
+ applies_to_vendor_os => 1,
+ applies_to_system => 0,
+ applies_to_clients => 0,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Install and configure vmplayer v2
+ End-of-Here
+ content_regex => qr{^(1|0)$},
+ content_descr => '1 means active - 0 means inactive',
+ default => '0',
+ },
+ 'vmware::vmpl1.0' => {
+ applies_to_vendor_os => 1,
+ applies_to_system => 0,
+ applies_to_clients => 0,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Install and configure vmplayer v1
+ End-of-Here
+ content_regex => qr{^(1|0)$},
+ content_descr => '1 means active - 0 means inactive',
+ default => '0',
+ },
+ 'vmware::pkgpath' => {
+ applies_to_vendor_os => 1,
+ applies_to_system => 0,
+ applies_to_clients => 0,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Path to VMware packages
+ End-of-Here
+ #TODO
+ #content_regex => qr{^(1|0)$},
+ content_descr => '1 means active - 0 means inactive',
+ default => '/root/vmware-pkgs',
+ },
+ # ** set of attributes for the installation of VM Workstation/Player
+ # versions. More than one package could be installed in parallel.
+ # To be matched to/triggerd by 'vmware::kind'
+ };
+}
+
+
+sub preInstallationPhase()
+{
+ my $self = shift;
+ my $info = shift;
+
+ $self->{pluginRepositoryPath} = $info->{'plugin-repo-path'};
+ $self->{pluginTempPath} = $info->{'plugin-temp-path'};
+ $self->{openslxBasePath} = $info->{'openslx-base-path'};
+ $self->{openslxConfigPath} = $info->{'openslx-config-path'};
+ $self->{attrs} = $info->{'plugin-attrs'};
+ $self->{vendorOsPath} = $info->{'vendor-os-path'};
+
+ my $pkgpath = $self->{attrs}->{'vmware::pkgpath'};
+ my $vmpl10 = $self->{attrs}->{'vmware::vmpl1.0'};
+ my $vmpl20 = $self->{attrs}->{'vmware::vmpl2.0'};
+ my $vmpl25 = $self->{attrs}->{'vmware::vmpl2.5'};
+ my $local = $self->{attrs}->{'vmware::local'};
+
+ if ($local == 0 && $vmpl10 == 0 && $vmpl20 == 0 && $vmpl25 == 0) {
+ print "\n\n * At least one kind needs to get installed/activated:\n";
+ print " vmware::local=1 or\n";
+ print " vmware::vmpl1.0=1 or\n";
+ print " vmware::vmpl2.0=1\n";
+ print " vmware::vmpl2.5=1\n";
+ print " * vmware plugin was not installed!\n\n";
+ exit 1;
+ }
+
+ if (! -d $pkgpath && ($vmpl10 == 1 || $vmpl20 == 1 || $vmpl25 == 1)) {
+ print "\n\n * vmware::pkgpath: no such directory $pkgpath!\n";
+ print " See wiki about vmware Plugin\n";
+ print " * vmware plugin was not installed!\n\n";
+ exit 1;
+ }
+
+ # test just for the case we only set up local vmware
+ if (-d $pkgpath && ($vmpl10 == 1 || $vmpl20 == 1 || $vmpl25 == 1)) {
+ # todo: ask oliver about a similiar function
+ # like copyFile() just for directorys
+ # or fix the manual after checked the source of
+ # copyFile() function. check if copyFile etc. perldoc
+ # is somewhere in the wiki documented else do it!
+ system("cp -r $pkgpath $self->{pluginRepositoryPath}/packages");
+ }
+}
+
+sub installationPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ $self->{pluginRepositoryPath} = $info->{'plugin-repo-path'};
+ $self->{pluginTempPath} = $info->{'plugin-temp-path'};
+ $self->{openslxBasePath} = $info->{'openslx-base-path'};
+ $self->{openslxConfigPath} = $info->{'openslx-config-path'};
+ $self->{attrs} = $info->{'plugin-attrs'};
+
+ # copy common part of run-virt.include to the appropriate place for
+ # inclusion in stage4
+ copyFile("$self->{openslxBasePath}/lib/plugins/vmware/files/run-virt.include",
+ "$self->{pluginRepositoryPath}/");
+
+ # kinds we will configure and install
+ # TODO: write a list of installed/setted up and check it in stage3
+ # this will avoid conflict of configured vmware version in
+ # stage3 which are not setted up or installed in stage1
+ if ($self->{attrs}->{'vmware::local'} == 1) {
+ $self->_localInstallation();
+ }
+ if ($self->{attrs}->{'vmware::vmpl2.0'} == 1) {
+ $self->_vmpl2Installation();
+ }
+ if ($self->{attrs}->{'vmware::vmpl1.0'} == 1) {
+ $self->_vmpl1Installation();
+ }
+ if ($self->{attrs}->{'vmware::vmpl2.5'} == 1) {
+ $self->_vmpl25Installation();
+ }
+
+ ## prepration for our faster wrapper script
+ # rename the default vmplayer script and create a link.
+ # uninstall routine takes care about plugin remove.
+ # stage3 copys our own wrapper script
+ if (-e "/usr/bin/vmplayer" && ! -e "/usr/bin/vmplayer.slx-back") {
+ rename("/usr/bin/vmplayer", "/usr/bin/vmplayer.slx-bak");
+ }
+ # the same with vmware, if ws is installed
+ if (-e "/usr/bin/vmware" && ! -e "/usr/bin/vmware.slx-bak") {
+ rename("/usr/bin/vmware", "/usr/bin/vmware.slx-bak");
+ }
+
+}
+
+sub removalPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ # restore old start scripts - to be discussed
+ my @files = qw( vmware vmplayer );
+ foreach my $file (@files) {
+ if (-e "/usr/bin/$file.slx-bak") {
+ unlink("/usr/bin/$file");
+ rename("/usr/bin/$file.slx-bak", "/usr/bin/$file");
+ }
+ }
+ return;
+}
+
+sub checkStage3AttrValues
+{
+ my $self = shift;
+ my $stage3Attrs = shift;
+ my $vendorOSAttrs = shift;
+ my @problems;
+
+ my $vm_kind = $stage3Attrs->{'vmware::kind'} || '';
+ my $vmimg = $stage3Attrs->{'vmware::imagesrc'} || '';
+
+ if ($vm_kind eq 'local' && ! -x "/usr/lib/vmware/bin/vmplayer") {
+ push @problems, _tr(
+ "No local executeable installation of vmware found! Using it as virtual machine wouldn't work!"
+ );
+ }
+
+ if ($vm_kind eq 'local' &&
+ ! -d "/opt/openslx/plugin-repo/vmware/local") {
+ push @problems, _tr(
+ "local vmware installation not configured by slxos-plugin!"
+ );
+ }
+
+ if ($vm_kind eq 'vmpl1.0' &&
+ ! -d "/opt/openslx/plugin-repo/vmware/vmpl1.0/vmroot") {
+ push @problems, _tr(
+ "No OpenSLX installation of VMware Player 1 found or installation failed. Using it as virtual machine wouldn't work!"
+ );
+ }
+
+ if ($vm_kind eq 'vmpl2.0' &&
+ ! -d "/opt/openslx/plugin-repo/vmware/vmpl2.0/vmroot") {
+ push @problems, _tr(
+ "No OpenSLX installation of VMware Player 2.0 found or installation failed. Using it as virtual machine wouldn't work!"
+ );
+ }
+
+ if ($vm_kind eq 'vmpl2.5' &&
+ ! -d "/opt/openslx/plugin-repo/vmware/vmpl2.5/vmroot") {
+ push @problems, _tr(
+ "No OpenSLX installation of VMware Player 2.5 found or installation failed. Using it as virtual machine wouldn't work!"
+ );
+ }
+
+ if ($vm_kind eq 'vmpl3.X' &&
+ ! -d "/opt/openslx/plugin-repo/vmware/vmpl3.X/vmroot") {
+ push @problems, _tr(
+ "No OpenSLX installation of VMware Player 3.X found or installation failed. Using it as virtual machine wouldn't work!"
+ );
+ }
+
+ return if !@problems;
+
+ return \@problems;
+}
+
+
+#######################################
+## local, non-general OpenSLX functions
+#######################################
+
+# Write the runlevelscript
+# usage: _writeRunlevelScript("$vmpath", "$kind")
+sub _writeRunlevelScript
+{
+ my $self = shift;
+ my $vmpath = shift;
+ my $kind = shift;
+ my $initfile = newInitFile();
+
+ my $script = "";
+ my $modpath = "";
+ my $modlist = "";
+ # vmpath is to be redefined here ...
+ if ($kind =~ /local*/) {
+ $vmpath = "";
+ $modpath = "/lib/modules/\$(uname -r)/misc";
+ } elsif ($kind =~ /vmpl*/) {
+ $vmpath = "/opt/openslx/plugin-repo/vmware/${kind}";
+ $modpath = "${vmpath}/vmroot/modules";
+ }
+
+ $initfile->setName("vmware-slx");
+ $initfile->setDesc("Setup environment for VMware Workstation or Player ($kind).");
+
+ # functions ...
+ $modlist = "vmnet vmmon";
+ $script = unshiftHereDoc(<<" End-of-Here");
+ # VMplayer common stuff
+ insmod ${modpath}/vmmon.ko || return 1
+ insmod ${modpath}/vmnet.ko || return 1
+ End-of-Here
+ if ($kind eq 'local3X' || $kind eq 'vmpl3.X') {
+ $script .= unshiftHereDoc(<<" End-of-Here");
+ # VMplayer 3.X specific stuff
+ insmod ${modpath}/vmci.ko
+ insmod ${modpath}/vmblock.ko
+ insmod ${modpath}/vsock.ko
+ End-of-Here
+ $modlist .= "vsock vmci vmblock";
+ } elsif ($kind eq 'local20' || $kind eq 'local25' || $kind eq 'vmpl2.0' || $kind eq 'vmpl2.5') {
+ $script .= unshiftHereDoc(<<" End-of-Here");
+ # VMplayer 2.X specific stuff
+ insmod ${modpath}/vmblock.ko
+ End-of-Here
+ $modlist .= "vmblock";
+ }
+ $initfile->addFunction(
+ "load_modules",
+ "$script"
+ );
+ $initfile->addFunction(
+ "unload_modules",
+ "rmmod $modlist 2>/dev/null"
+ );
+ # vmnet0,1,8 (bridge, nat, host-only) interface definition
+ $script = unshiftHereDoc(<<" End-of-Here");
+ # let point the path directly to the directory where the binary lives
+ location="$vmpath/usr/bin"
+ if [ -n "\$vmnet0" ] ; then
+ # the path might be directly point to the plugin dir
+ End-of-Here
+ if ($kind eq 'vmpl1.0' || $kind eq 'vmpl2.0' || $kind eq 'local10' || $kind eq 'local20') {
+ $script .= " \$location/vmnet-bridge -d /var/run/vmnet-bridge-0.pid /dev/vmnet0 eth0\n";
+ } else {
+ $script .= " \$location/vmnet-bridge -d /var/run/vmnet-bridge-0.pid -n 0\n";
+ }
+ $script .= unshiftHereDoc(<<" End-of-Here");
+ fi
+ if [ -n "\$vmnet1" ] ; then
+ \$location/vmnet-netifup -d /var/run/vmnet-netifup-vmnet1.pid \\
+ /dev/vmnet1 vmnet1
+ ip addr add \$vmnet1 dev vmnet1
+ ip link set vmnet1 up
+ if [ -n "\$vmnet1nat" ] ; then
+ echo "1" >/proc/sys/net/ipv4/conf/vmnet1/forwarding 2>/dev/null
+ echo "1" >/proc/sys/net/ipv4/conf/br0/forwarding 2>/dev/null
+ #iptables -A -s vmnet1 -d br0
+ fi
+ /opt/openslx/uclib-rootfs/usr/sbin/udhcpd \\
+ -S /etc/vmware/udhcpd/udhcpd-vmnet1.conf
+ fi
+ if [ -n "\$vmnet8" ] ; then
+ \$location/vmnet-netifup -d /var/run/vmnet-netifup-vmnet8.pid \\
+ /dev/vmnet8 vmnet8
+ ip addr add \$vmnet8 dev vmnet8
+ ip link set vmnet8 up
+ echo "1" >/proc/sys/net/ipv4/conf/vmnet8/forwarding 2>/dev/null
+ echo "1" >/proc/sys/net/ipv4/conf/br0/forwarding 2>/dev/null
+ iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE
+ /opt/openslx/uclib-rootfs/usr/sbin/udhcpd \\
+ -S /etc/vmware/udhcpd/udhcpd-vmnet8.conf
+ fi
+ End-of-Here
+ $initfile->addFunction(
+ "vmnetif",
+ "$script"
+ );
+ # vmblock for handling e.g. removable USB devices
+ $script = unshiftHereDoc(<<" End-of-Here");
+ # let point the path directly to the directory where the binary lives
+ $vmpath/usr/bin/vmware-usbarbitrator
+ End-of-Here
+ $initfile->addFunction(
+ "vmblock",
+ "$script"
+ );
+ $script = unshiftHereDoc(<<" End-of-Here");
+ # include default directories
+ . /etc/opt/openslx/openslx.conf
+ # load the configuration file
+ . \${OPENSLX_DEFAULT_CONFDIR}/plugins/vmware/vmware.conf
+ # hack to access the first serial/parallel port
+ chmod a+rw /dev/ttyS0
+ chmod a+rw /dev/parport0
+ load_modules
+ vmnetif
+ End-of-Here
+ # start the USB arbitrator on higher VMware/player versions (3.0+)
+ if ($kind eq 'vmpl3.X' || $kind eq 'local3X') {
+ $script .= unshiftHereDoc(<<" End-of-Here");
+ vmblock
+ End-of-Here
+ }
+ $initfile->addToCase(
+ "start",
+ "$script"
+ );
+ $script = unshiftHereDoc(<<" End-of-Here");
+ killall vmnet-netifup vmnet-natd vmnet-bridge vmware vmplayer \\
+ vmware-tray vmnet-dhcpd 2>/dev/null
+ # might take a while until all services are shut down
+ sleep 1
+ unload_modules
+ End-of-Here
+ $initfile->addToCase(
+ "stop",
+ "$script"
+ );
+ $initfile->addToCase(
+ "status",
+ "vmstatus"
+ );
+ $initfile->addToCase(
+ "restart",
+ "\$0 stop && \$0 start"
+ );
+
+ my $distro = (split('-',$self->{'os-plugin-engine'}->distroName()))[0];
+ my $runlevelscript = getInitFileForDistro($initfile, $distro);
+ # todo: because we dont have distribution or version dependend
+ # init scripts we could put it directly into /etc/init.d...
+ spitFile("$self->{'pluginRepositoryPath'}/vmware-slx", $runlevelscript);
+}
+
+
+# writes the wrapper script for vmware workstation and player, depending
+# on the flag. If player: just player wrapper, if ws: ws+player wrapper
+# usage: _writeWrapperScript("$vmpath", "$kind", "player")
+# _writeWrapperScript("$vmpath", "$kind", "ws")
+sub _writeWrapperScript
+{
+ my $self = shift;
+ my $vmpath = shift;
+ my $kind = shift;
+ my $type = shift;
+ my @files;
+
+ if ("$type" eq "ws") {
+ @files = qw(vmware vmplayer);
+ } else {
+ @files = qw(vmplayer);
+ }
+
+ foreach my $file (@files) {
+ # create our own simplified version of the vmware and player wrapper
+ # Depending on the configured kind it will be copied in stage3
+ # because of tempfs of /var but not /usr we link the file
+ # to /var/..., where we can write in stage3
+ my $script = unshiftHereDoc(<<" End-of-Here");
+ #!/bin/sh
+ # written by OpenSLX-plugin 'vmware' in Stage1
+ # radically simplified version of the original script $file by VMware Inc.
+ End-of-Here
+
+ # kinda ugly and we only need it for local. Preserves errors
+ if ($kind ne "local") {
+ $script .= unshiftHereDoc(<<" End-of-Here");
+ export LD_LIBRARY_PATH=$vmpath/lib
+ export GDK_PIXBUF_MODULE_FILE=$vmpath/libconf/etc/gtk-2.0/gdk-pixbuf.loaders
+ export GTK_IM_MODULE_FILE=$vmpath/libconf/etc/gtk-2.0/gtk.immodules
+ export FONTCONFIG_PATH=$vmpath/libconf/etc/fonts
+ export PANGO_RC_FILE=$vmpath/libconf/etc/pango/pangorc
+ # possible needed... but what are they good for?
+ #export GTK_DATA_PREFIX=
+ #export GTK_EXE_PREFIX=
+ #export GTK_PATH=
+ End-of-Here
+ }
+
+ $script .= unshiftHereDoc(<<" End-of-Here");
+ PREFIX=$vmpath # depends on the vmware location
+ exec "\$PREFIX"'/lib/wrapper-gtk24.sh' \\
+ "\$PREFIX"'/lib' \\
+ "\$PREFIX"'/bin/$file' \\
+ "\$PREFIX"'/libconf' "\$@"
+ End-of-Here
+
+ # TODO: check if these will be overwritten if we have more as
+ # local defined (add the version/type like vmpl1.0, vmws5.5, ...)
+ # then we have a lot of files easily distinguishable by there suffix
+ spitFile("$self->{'pluginRepositoryPath'}/$kind/$file", $script);
+ chmod 0755, "$self->{'pluginRepositoryPath'}/$kind/$file";
+ }
+}
+
+sub _writeVmwareConfigs {
+ my $self = shift;
+ my $kind = shift;
+ my $vmpath = shift;
+ my %versionhash = (vmversion => "", vmbuildversion => "");
+ my $vmversion = "";
+ my $vmbuildversion = "";
+ my $config = "";
+
+ %versionhash = _getVersion($vmpath);
+
+ $config .= "version=\"".$versionhash{vmversion}."\"\n";
+ $config .= "buildversion=\"".$versionhash{vmbuildversion}."\"\n";
+ spitFile("$self->{'pluginRepositoryPath'}/$kind/vmware.conf", $config);
+ chmod 0755, "$self->{'pluginRepositoryPath'}/$kind/vmware.conf";
+
+ $config = "libdir = \"$vmpath\"\n";
+ spitFile("$self->{'pluginRepositoryPath'}/$kind/config", $config);
+ chmod 0755, "$self->{'pluginRepositoryPath'}/$kind/config";
+}
+
+sub _getVersion {
+
+ my $vmpath = shift;
+ my $vmversion = "";
+ my $vmbuildversion = "";
+ my %versioninfo = (vmversion => "", vmbuildversion => "");
+
+ # get version information about installed vmplayer
+ if (open(FH, "$vmpath/bin/vmplayer")) {
+ $/ = undef;
+ my $data = <FH>;
+ close FH;
+ # depending on the installation it could differ and has multiple build
+ # strings
+ if ($data =~ m{[^\d\.](\d\.\d) build-(\d+)}) {
+ $vmversion = $1;
+ $vmbuildversion = $2;
+ }
+ if ($data =~ m{\0(2\.[05])\.[0-9]}) {
+ $vmversion = $1;
+ }
+ # else { TODO: errorhandling if file or string doesn't exist }
+ chomp($vmversion);
+ chomp($vmbuildversion);
+
+
+ $versioninfo{vmversion} = $vmversion;
+ $versioninfo{vmbuildversion} = $vmbuildversion;
+ }
+ return %versioninfo;
+}
+
+########################################################################
+## Functions, which setup the different environments (local, ws-v(5.5|6),
+## player-v(1|2)
+## Seperation makes this file more readable. Has a bigger benefit as
+## one big copy function. Makes integration of new versions easier.
+########################################################################
+
+# local installation
+sub _localInstallation
+{
+ my $self = shift;
+
+ my $kind = "local";
+ my $vmpath = "/usr/lib/vmware";
+ my $vmbin = "/usr/bin";
+ my %versionhash = (vmversion => "", vmbuildversion => "");
+ my $vmversion = "";
+ my $vmbuildversion = "";
+
+ # if vmware ws is installed, vmplayer is installed, too.
+ # we will only use vmplayer
+ if (-e "/usr/lib/vmware/bin/vmplayer") {
+
+ ## Get and write version information
+ %versionhash = _getVersion($vmpath);
+ $vmversion = $versionhash{vmversion};
+ $vmbuildversion = $versionhash{vmbuildversion};
+
+ # set version information
+ # VMplayer 2.0
+ if ($vmversion eq "2.0" || $vmversion eq "6.0") {
+ $kind="local20";
+ # VMplayer 2.5
+ } elsif ($vmversion eq "2.5" || $vmversion eq "6.5") {
+ $kind="local25";
+ # VMplayer 3.0, 3.1, Workstation 7.0, 7.1
+ } elsif ($vmversion eq "3.0" || $vmversion eq "7.0" ||
+ $vmversion eq "3.1" || $vmversion eq "7.1") { $kind="local3X";
+ }
+ # Create runlevel script depending on detected version
+ $self->_writeRunlevelScript("$vmpath", "$kind");
+
+ # Create wrapper scripts, kind of localNN is set to local
+ if ( $kind =~ /local*/ ) { $kind = "local"; }
+ if (-e "/usr/lib/vmware/bin/vmware") {
+ $self->_writeWrapperScript("$vmpath", "$kind", "ws");
+ }
+ if (-e "/usr/lib/vmware/bin/vmplayer") {
+ $self->_writeWrapperScript("$vmpath", "$kind", "player");
+ }
+
+ # copy nvram file
+ my $pluginFilesPath
+ = "$self->{'openslxBasePath'}/lib/plugins/$self->{'name'}/files";
+ my @files = qw(nvram);
+ foreach my $file (@files) {
+ copyFile("$pluginFilesPath/$file", "$self->{'pluginRepositoryPath'}/$kind");
+ }
+
+ } # else { TODO: errorhandling if file or string doesn't exist }
+
+ ## creating needed config /etc/vmware/config
+ $self->_writeVmwareConfigs("$kind", "$vmpath");
+}
+
+sub _vmpl2Installation {
+ my $self = shift;
+
+ my $kind = "vmpl2.0";
+ my $vmpath = "/opt/openslx/plugin-repo/vmware/$kind/vmroot/lib/vmware";
+ my $vmbin = "/opt/openslx/plugin-repo/vmware/$kind/vmroot/bin";
+
+ my $pluginFilesPath
+ = "$self->{'openslxBasePath'}/lib/plugins/$self->{'name'}/files";
+ my $installationPath = "$self->{'pluginRepositoryPath'}/$kind";
+
+ mkpath($installationPath);
+
+ ##
+ ## Copy needed files
+
+ # copy 'normal' needed files
+ my @files = qw( nvram install-vmpl.sh );
+ foreach my $file (@files) {
+ copyFile("$pluginFilesPath/$file", "$installationPath");
+ }
+
+ # Install the binarys from given pkgpath
+ system("/bin/sh /opt/openslx/plugin-repo/$self->{'name'}/$kind/install-vmpl.sh $kind");
+
+ # Create runlevel script
+ $self->_writeRunlevelScript($vmpath, $kind);
+
+ # Create wrapperscripts
+ $self->_writeWrapperScript("$vmpath", "$kind", "player");
+
+ # Creating needed config /etc/vmware/config
+ $self->_writeVmwareConfigs("$kind", "$vmpath");
+
+}
+
+sub _vmpl25Installation {
+ my $self = shift;
+
+ my $kind = "vmpl2.5";
+ my $vmpath = "/opt/openslx/plugin-repo/vmware/$kind/vmroot/lib/vmware";
+ my $vmbin = "/opt/openslx/plugin-repo/vmware/$kind/vmroot/bin";
+ my $vmversion = "6.5";
+ my $vmbuildversion = "TODO_we_need_it_for_enhanced_runvmware_config_in_stage1";
+
+ my $pluginFilesPath
+ = "$self->{'openslxBasePath'}/lib/plugins/$self->{'name'}/files";
+ my $installationPath = "$self->{'pluginRepositoryPath'}/$kind";
+
+ mkpath($installationPath);
+
+ # copy 'normal' needed files
+ my @files = qw( nvram install-vmpl.sh );
+ foreach my $file (@files) {
+ copyFile("$pluginFilesPath/$file", "$installationPath");
+ }
+
+ # Install the binarys from given pkgpath
+ system("/bin/sh /opt/openslx/plugin-repo/$self->{'name'}/$kind/install-vmpl.sh $kind");
+
+ # Create runlevel script
+ $self->_writeRunlevelScript($vmpath, $kind);
+
+ # Create wrapperscripts
+ $self->_writeWrapperScript("$vmpath", "$kind", "player");
+
+ # Creating needed config /etc/vmware/config
+ $self->_writeVmwareConfigs("$kind", "$vmpath");
+
+}
+
+sub _vmpl1Installation {
+ my $self = shift;
+
+ my $kind = "vmpl1.0";
+ my $vmpath = "/opt/openslx/plugin-repo/vmware/$kind/vmroot/lib/vmware";
+ my $vmbin = "/opt/openslx/plugin-repo/vmware/$kind/vmroot/bin";
+ my $vmversion = "5.5";
+ my $vmbuildversion = "TODO_we_need_it_for_enhanced_runvmware_config_in_stage1";
+
+ my $pluginFilesPath
+ = "$self->{'openslxBasePath'}/lib/plugins/$self->{'name'}/files";
+ my $installationPath = "$self->{'pluginRepositoryPath'}/$kind";
+
+ mkpath($installationPath);
+
+ # copy 'normal' needed files
+ my @files = qw( nvram install-vmpl.sh );
+ foreach my $file (@files) {
+ copyFile("$pluginFilesPath/$file", "$installationPath");
+ }
+
+ # Download and install the binarys
+ system("/bin/sh /opt/openslx/plugin-repo/$self->{'name'}/$kind/install-vmpl.sh $kind");
+
+ # Create runlevel script
+ $self->_writeRunlevelScript($vmpath, $kind);
+
+ # create wrapper scripts
+ $self->_writeWrapperScript("$vmpath", "$kind", "player");
+
+ # creating needed config /etc/vmware/config
+ $self->_writeVmwareConfigs("$kind", "$vmpath");
+
+}
+
+# The bridge configuration needs the bridge module to be present in early
+# stage3
+sub suggestAdditionalKernelModules
+{
+ my $self = shift;
+ my $makeInitRamFSEngine = shift;
+
+ my @suggestedModules;
+
+ push @suggestedModules, qw( bridge );
+
+ return @suggestedModules;
+}
+
+1;
diff --git a/src/os-plugins/plugins/vmware/XX_vmware.sh b/src/os-plugins/plugins/vmware/XX_vmware.sh
new file mode 100644
index 00000000..26b49cc5
--- /dev/null
+++ b/src/os-plugins/plugins/vmware/XX_vmware.sh
@@ -0,0 +1,201 @@
+# Copyright (c) 2007..2009 - RZ Uni Freiburg
+# Copyright (c) 2008..2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# script is included from init via the "." load function - thus it has all
+# variables and functions available
+
+# TODO:
+# configs nach /etc/opt/openslx/plugins/vmware
+# cp nach run-virt.include
+
+# TODO: nvram,functions
+# write /etc/vmware/config (if a non-standard location of vmware basedir is
+# to be configured), /etc/init.d/vmware
+
+# include default directories
+. /etc/openslx.conf
+
+ETCDIR=/mnt/${OPENSLX_DEFAULT_CONFDIR}
+PLUGINCONFDIR=${ETCDIR}/plugins/vmware
+BINDIR=/mnt/${OPENSLX_DEFAULT_BINDIR}
+PLUGINDIR=/mnt/${OPENSLX_DEFAULT_DIR}/plugin-repo/vmware
+VIRTDIR=/mnt/${OPENSLX_DEFAULT_VIRTDIR}
+
+# check if the configuration file is available
+if [ -e /initramfs/plugin-conf/vmware.conf ]; then
+
+ # load needed variables
+ . /initramfs/plugin-conf/vmware.conf
+
+ # Test if this plugin is activated... more or less useless with the
+ # new plugin system
+ if [ $vmware_active -ne 0 ]; then
+
+ [ $DEBUGLEVEL -gt 0 ] && echo "executing the 'vmware' os-plugin ...";
+ # Load general configuration
+ . /initramfs/machine-setup
+
+ testmkd /mnt/tmp/vmware 1777
+ testmkd /dev/shm/vmware 1777
+ testmkd /mnt/var/run/vmware 1777
+ testmkd ${PLUGINCONFDIR}
+ testmkd /mnt/etc/vmware/udhcpd
+
+ # write the ${PLUGINCONFDIR}/vmware.conf file
+ # check for the several variables and write the several files:
+ # dhcpd.conf for vmnet* interfaces
+ # nat.conf for the NAT configuration of vmnet8
+ # TODO: vmnet-natd-8.mac not clear if really needed and which mac it
+ # should contain (seems to be an average one)
+ echo -e "# configuration file for vmware background services written in \
+stage3 setup" > ${PLUGINCONFDIR}/vmware.conf
+ if [ "$vmware_bridge" = 1 ] ; then
+ echo "vmnet0=true" >> ${PLUGINCONFDIR}/vmware.conf
+ fi
+
+ # variable might contain ",NAT" which is to be taken off
+ if [ -n "$vmware_vmnet1" ] ; then
+ local vmnet1=${vmware_vmnet1%,*} # x.x.x.x/yy,NAT => 'x.x.x.x/yy'
+ local vmnat=${vmware_vmnet1#$vmnet1*} # x.x.x.x/yy,NAT => ',NAT'
+ local vmip=${vmnet1%/*} # x.x.x.x/yy => 'x.x.x.x'">
+ local vmpx=${vmnet1#*/} # x.x.x.x/yy => 'yy'
+ local vmsub=$(echo $vmip |sed 's,\(.*\)\..*,\1,') # x.x.x.x => x.x.x
+ echo -e "vmnet1=$vmnet1" >> ${PLUGINCONFDIR}/vmware.conf
+ [ -n "$vmnat" ] && echo "vmnet1nat=true" >> ${PLUGINCONFDIR}/vmware.conf
+ # setting up the udhcpd configuration
+ sed -e "s,NWIF,vmnet1,;s,/misc/,/vmware/," \
+ -e "s,CNETWORK,$vmsub,;s,PIDFILE,/var/run/vmware/udhcpd-vmnet1.pid," \
+ -e "s,LEASEFILE,/var/run/vmware/udhcpd-vmnet1.leases," \
+ /mnt/etc/opt/openslx/udhcpd.conf >/mnt/etc/vmware/udhcpd/udhcpd-vmnet1.conf
+ fi
+
+ # vmware nat interface configuration
+ if [ -n "$vmware_vmnet8" ] ; then
+ local vmnet8ip=${vmware_vmnet8%/*}
+ local vmpx=${vmware_vmnet8#*/}
+ local vmsub=$(echo $vmnet8ip |sed 's,\(.*\)\..*,\1,') # x.x.x.x => x.x.x">
+ # vmip is user for vmnet8 device
+ # vmnet is user for config files nat.conf/dhcp
+ local vmip="${vmsub}.1"
+ local vmnet="${vmsub}.2"
+ echo -e "vmnet8=$vmip/$vmpx" >>${PLUGINCONFDIR}/vmware.conf
+ # setting up the udhcpd configuration
+ sed -e "s,NWIF,vmnet8,;s,/misc/,/vmware/," \
+ -e "s,CNETWORK,$vmsub,;s,PIDFILE,/var/run/vmware/udhcpd-vmnet8.pid," \
+ -e "s,LEASEFILE,/var/run/vmware/udhcpd-vmnet8.leases," \
+ /mnt/etc/opt/openslx/udhcpd.conf >/mnt/etc/vmware/udhcpd/udhcpd-vmnet8.conf
+ # might be not needed any more ...
+ echo -e "# Linux NAT configuration file" \
+ > /mnt/etc/vmware/nat.conf
+ echo -e "[host]" \
+ >> /mnt/etc/vmware/nat.conf
+ echo -e "ip = $vmnet/$vmpx" \
+ >> /mnt/etc/vmware/nat.conf
+ echo -e "device = /dev/vmnet8" \
+ >> /mnt/etc/vmware/nat.conf
+ echo -e "activeFTP = 1" \
+ >> /mnt/etc/vmware/nat.conf
+ echo -e "[udp]" \
+ >> /mnt/etc/vmware/nat.conf
+ echo -e "timeout = 60" \
+ >> /mnt/etc/vmware/nat.conf
+ echo -e "[incomingtcp]" \
+ >> /mnt/etc/vmware/nat.conf
+ echo -e "[incomingudp]" \
+ >> /mnt/etc/vmware/nat.conf
+ echo "00:50:56:F1:30:50" > /mnt/etc/vmware/vmnet-natd-8.mac
+ fi
+ # copy the runlevel script to the proper place and activate it
+ sed "s/eth0/$nwif/g" ${PLUGINDIR}/vmware-slx > /mnt/etc/init.d/vmware-env \
+ || echo " * Error copying runlevel script. Shouldn't happen."
+ chmod a+x /mnt/etc/init.d/vmware-env
+ rllinker "vmware-env" 20 2
+
+ ############################################################################
+ # vmware stuff first part: two scenarios
+ # * VM images in /usr/share/vmware - then simply link
+ # * VM images via additional mount (mount source NFS, NBD, ...)
+
+ # get source of vmware image server (get type, server and path)
+ if strinstr "/" "${vmware_imagesrc}" ; then
+ vmimgprot=$(uri_token ${vmware_imagesrc} prot)
+ vmimgserv=$(uri_token ${vmware_imagesrc} server)
+ vmimgpath="$(uri_token ${vmware_imagesrc} path)"
+ fi
+ if [ -n "${vmimgserv}" -a -n ${vmimgpath} -a -n ${vmimgprot} ] ; then
+ mnttarget=${VIRTDIR}/vmware
+ # mount the vmware image source readonly (ro)
+ fsmount ${vmimgprot} ${vmimgserv} ${vmimgpath} ${mnttarget} ro
+ else
+ [ $DEBUGLEVEL -gt 1 ] && error " * Incomplete information in variable \
+${vmware_imagesrc}." nonfatal
+ fi
+
+ ############################################################################
+ # vmware stuff second part: setting up the environment
+ # make udhcpd more silent
+ touch /mnt/var/run/vmware/udhcpd-vmnet1.leases \
+ /mnt/var/run/vmware/udhcpd-vmnet8.leases
+
+ # create the needed devices which effects all vmware options
+ # they are not created automatically via module load
+ for i in "/dev/vmnet0 c 119 0" "/dev/vmnet1 c 119 1" \
+ "/dev/vmnet8 c 119 8" "/dev/vmmon c 10 165"; do
+ mknod $i
+ done
+ chmod 0700 /dev/vmnet*
+
+ echo -e "usbfs\t\t/proc/bus/usb\tusbfs\t\tauto\t\t 0 0" >> /mnt/etc/fstab
+ # needed for VMware 5.5.4 and versions below
+ echo -e "\tmount -t usbfs usbfs /proc/bus/usb 2>/dev/null" \
+ >>/mnt/etc/init.d/boot.slx
+
+ # allow VMware swapping if RamZSWAP is enabled
+ if grep -E "^ramzswap.*1 -.*" /proc/modules ; then
+ echo -e '.encoding = "UTF-8"\nprefvmx.minVmMemPct = "50"
+prefvmx.useRecommendedLockedMemSize = "TRUE"' | sed -e "s/^ *//" \
+ >/mnt/etc/vmware/config
+ else
+ # disable VMware swapping else
+ echo -e '.encoding = "UTF-8"\nprefvmx.minVmMemPct = "100"
+prefvmx.useRecommendedLockedMemSize = "TRUE"' | sed -e "s/^ *//" \
+ >/mnt/etc/vmware/config
+ fi
+
+ # copy virtualization include files to config dir
+ cp ${PLUGINDIR}/run-virt.include ${PLUGINCONFDIR}
+ # copy version depending files
+ cp ${PLUGINDIR}/${vmware_kind}/vmplayer ${BINDIR}/vmplayer
+ if [ -e ${PLUGINDIR}/${vmware_kind}/vmware ]; then
+ cp ${PLUGINDIR}/${vmware_kind}/vmware ${BINDIR}/vmware
+ fi
+
+ # affects only kernel and config depending configuration of not
+ # local installed versions
+ cat ${PLUGINDIR}/${vmware_kind}/config >>/mnt/etc/vmware/config
+ chmod 644 /mnt/etc/vmware/config
+ echo "# stage1 variables produced during plugin install" \
+ >>${PLUGINCONFDIR}/vmware.conf
+ cat ${PLUGINDIR}/${vmware_kind}/vmware.conf >>${PLUGINCONFDIR}/vmware.conf
+
+ # if /tmp resides on nfs: create an empty container file for vmware *.vmem
+ # it does not like to live on NFS exports (still needed??)
+ #if [ cat /proc/mounts|grep -qe "^/tmp "|grep -qe "nfs" ] ; then
+ # dd if=/dev/zero of=/mnt/tmp/vm-container count=1 seek=2048000
+ # diskfm /mnt/tmp/vm-container /mnt/tmp/vmware
+ # chmod a+rwxt /mnt/tmp/vmware
+ #fi
+ [ $DEBUGLEVEL -gt 0 ] && echo "done with 'vmware' os-plugin ..."
+
+ fi
+else
+ [ $DEBUGLEVEL -gt 0 ] && echo " * Configuration of vmware plugin failed"
+fi
diff --git a/src/os-plugins/plugins/vmware/files/README b/src/os-plugins/plugins/vmware/files/README
new file mode 100644
index 00000000..ae8bf1e7
--- /dev/null
+++ b/src/os-plugins/plugins/vmware/files/README
@@ -0,0 +1,12 @@
+Files
+- nvram (version from VMware5)
+ This nvram supports a second Floppy drive. Helpfull if you want to
+ get some data from linux to your Windows VirtualMachine (like
+ Scanner-IP or Userinformation)
+- run-virt.include
+ The main include script for the vmchooser plugin run-virt.sh vir-
+ tualization environments start script. All vmware related stuff like
+ the creation of the configuration file is handled within this script.
+- install-vmpl.sh
+ Install script, can handle different vmware version installations
+
diff --git a/src/os-plugins/plugins/vmware/files/install-vmpl.sh b/src/os-plugins/plugins/vmware/files/install-vmpl.sh
new file mode 100644
index 00000000..e0795b30
--- /dev/null
+++ b/src/os-plugins/plugins/vmware/files/install-vmpl.sh
@@ -0,0 +1,284 @@
+#!/bin/sh
+
+cd /opt/openslx/plugin-repo/vmware/
+
+### Check if player are still installed
+if [ -d ${1}/vmroot/ ]; then
+ echo " * $1 seems to be installed. There shouldn't be a need for a new installation."
+ echo " If you want to reinstall $1 press \"y\" else we will exit"
+ read
+ if [ "${REPLY}" != "y" ]; then
+ echo " * $1 is already installed. Nothing to do."
+ exit
+ fi
+ echo " * $1 will be reinstalled"
+fi
+
+
+### Now define values
+if [ "$1" = "vmpl1.0" ]; then
+ vmplversion="vmpl1.0"
+ tgzfile=$(ls packages/VMware-player-1.0.*|sort|tail -n 1)
+elif [ "$1" = "vmpl2.0" ]; then
+ vmplversion="vmpl2.0"
+ tgzfile=$(ls packages/VMware-player-2.0.*|sort|tail -n 1)
+elif [ "$1" = "vmpl2.5" ]; then
+ vmplversion="vmpl2.5"
+ tgzfile=$(ls packages/VMware-Player-2.5.*.bundle|sort|tail -n 1)
+else
+ echo "Attribute of install-vmpl.sh isn't valid!"
+ echo "This shouldn't happen! Fix vmware.pm!"
+ exit 1;
+fi
+
+
+### Main installation part
+if [ "${vmplversion}" != "vmpl2.5" ]; then
+ # tgz Installation of vmpl1.0 and vmpl2.0
+ cd ${vmplversion}
+
+ echo " * Unpacking vmplayer ${vmplversion}"
+ tar xfz ../${tgzfile}
+ # TODO: errorcheck if tgz wasnt downloaded properly.
+ # ask on mailinglist if theres a way how to handle it
+ # in preInstallation() "exit 1" is enough. Perhaps it will work
+ # here, too. Try first, and then document it in the wiki
+
+ # reduce some errors
+ echo " * deleting old files if available"
+ rm -rf vmroot
+
+ echo " * copying files..."
+ mkdir vmroot
+ mkdir -p vmroot/modules
+ mkdir -p vmroot/lib
+ mv vmware-player-distrib/lib vmroot/lib/vmware
+ mv vmware-player-distrib/bin vmroot/
+ if [ "${vmplversion}" != "vmpl1.0" ]; then
+ mv vmware-player-distrib/sbin vmroot/
+ fi
+ mv vmware-player-distrib/doc vmroot/
+ rm -rf vmware-player-distrib/
+ rm -rf vmroot/lib/vmware/modules/binary
+
+ echo " * fixing file permission"
+ chmod 04755 vmroot/lib/vmware/bin/vmware-vmx
+
+ # I don't want to understand what vmware is doing, but without this
+ # step we need to have LD_LIBRARY_PATH with 53 entrys. welcome to
+ # library hell
+ echo " * fixing librarys..."
+ cd vmroot/lib/vmware/lib
+ mkdir test
+ mv lib* test
+ mv test/lib*/* .
+ rm -rf test
+ cd ../../../..
+
+ echo " * fixing gdk and pango config files"
+ sed -i \
+ "s,/build/mts/.*/vmui/../libdir/libconf,/opt/openslx/plugin-repo/vmware/${vmplversion}/vmroot/lib/vmware/libconf," \
+ vmroot/lib/vmware/libconf/etc/gtk-2.0/gdk-pixbuf.loaders
+ sed -i \
+ "s,/build/mts/.*/vmui/../libdir/libconf,/opt/openslx/plugin-repo/vmware/${vmplversion}/vmroot/lib/vmware/libconf," \
+ vmroot/lib/vmware/libconf/etc/gtk-2.0/gtk.immodules
+ sed -i \
+ "s,/build/mts/.*/vmui/../libdir/libconf,/opt/openslx/plugin-repo/vmware/${vmplversion}/vmroot/lib/vmware/libconf," \
+ vmroot/lib/vmware/libconf/etc/pango/pango.modules
+ sed -i \
+ "s,/build/mts/.*/vmui/../libdir/libconf,/opt/openslx/plugin-repo/vmware/${vmplversion}/vmroot/lib/vmware/libconf," \
+ vmroot/lib/vmware/libconf/etc/pango/pangorc
+ sed -i \
+ "s,/etc/pango/pango/,/etc/pango/," \
+ vmroot/lib/vmware/libconf/etc/pango/pangorc
+
+ echo " * creating /etc/vmware"
+ rm -rf /etc/vmware
+ mkdir -p /etc/vmware
+
+ echo " * unpacking kernel modules"
+ cd vmroot/lib/vmware/modules/source
+ tar xf vmnet.tar
+ tar xf vmmon.tar
+ if [ "${vmplversion}" != "vmpl1.0" ]; then
+ tar xf vmblock.tar
+ fi
+
+ echo " * building vmblock module"
+ if [ "${vmplversion}" != "vmpl1.0" ]; then
+ cd vmblock-only/
+ sed -i "s%^VM_UNAME = .*%VM_UNAME = $(find /boot/vmlinuz* -maxdepth 0|sed 's,/boot/vmlinuz-,,g'|sort|tail -n 1)%" Makefile
+ make -s
+ mv vmblock.ko vmblock.o ../../../../../modules
+ cd ..
+ fi
+
+ echo " * building vmmon module"
+ cd vmmon-only
+ sed -i "s%^VM_UNAME = .*%VM_UNAME = $(find /boot/vmlinuz* -maxdepth 0|sed 's,/boot/vmlinuz-,,g'|sort|tail -n 1)%" Makefile
+ make -s
+ mv vmmon.ko vmmon.o ../../../../../modules
+ cd ..
+
+ echo " * building vmnet module"
+ cd vmnet-only
+ sed -i "s%^VM_UNAME = .*%VM_UNAME = $(find /boot/vmlinuz* -maxdepth 0|sed 's,/boot/vmlinuz-,,g'|sort|tail -n 1)%" Makefile
+ make -s
+ mv vmnet.ko vmnet.o ../../../../../modules
+ cd ../../../../../..
+
+ echo " * setting up EULA"
+ mv vmroot/doc/EULA vmroot/lib/vmware/share/EULA.txt
+
+ echo " * finishing installation"
+
+
+else
+ # bundle Installation of vmpl2.5
+ # note: the rpm just include the stupid .bundle file...
+ cd ${vmplversion}
+
+ echo " * Manipulating and extracting vmplayer ${vmplversion} package. this may take a while"
+
+ # fool non-root user extraction... just for testing
+ sed -i 's/ exit 1/ echo 1/' ../${tgzfile}
+ # don't use deinstallation stuff and checks of /etc...
+ # and don't modify file size, else it wont work!
+ sed -i 's/ migrate_networks/ echo te_networks/' ../${tgzfile}
+ sed -i 's/ uninstall_legacy/ echo tall_legacy/' ../${tgzfile}
+ sed -i 's/ uninstall_rpm/ echo tall_rpm/' ../${tgzfile}
+ sed -i 's/ uninstall_bundle/ echo tall_bundle/' ../${tgzfile}
+ # this won't work as root on our clients... I hope it don't break
+ # anything on our clients in stage1
+ sh ../${tgzfile} -x temp
+ # TODO: errorcheck if rpm wasnt downloaded properly.
+ # ask on mailinglist if theres a way how to handle it
+ # in preInstallation() "exit 1" is enough. Perhaps it will work
+ # here, too. Try first, and then document it in the wiki
+
+ # reduce some errors
+ echo " * deleting old files if available"
+ rm -rf vmroot
+
+ echo " * copying files..."
+ mkdir -p vmroot
+ mkdir -p vmroot/lib
+ mkdir -p vmroot/modules
+
+ mv temp/vmware-player/lib vmroot/lib/vmware
+ mv temp/vmware-player/sbin vmroot/
+ # the following shouldn't be needed, just to have it 1:1 self-created
+ # copy of /usr/lib/vmware
+ # Todo: clean it out when everything is running
+ mv temp/vmware-installer vmroot/lib/vmware/installer
+ rm -rf vmroot/lib/vmware/installer/.installer
+ rm -rf vmroot/lib/vmware/installer/bootstrap
+ mkdir -p vmroot/lib/vmware/setup
+ mv temp/vmware-player-setup/vmware-config vmroot/lib/vmware/setup
+ mv temp/vmware-player/doc vmroot/
+ mv temp/vmware-player/bin vmroot/
+
+ ##
+ ## left files/dirs
+ ##
+ # temp/vmware-player/files/index.theme ... hopefully not needed,
+ # temp/vmware-player/share => /usr/share ... icons
+ # temp/vmware-player/etc/... => /etc
+ # temp/vmware-player/build => unknown... not found...
+
+
+ # etc/vmware/
+ # bootstrap => Path definitions. confusing due of version 1.0
+ # which looks like the instller version
+ # perhaps just for installer... hopefully
+ # config => path definition, networking, different configurations
+ # database => sqlite3 db. includes all files mapped to component
+ # hopefully just used by installer and some path config
+ # networking => networking config... has options which are in
+ # dhcpd.conf, hopefully not needed
+ # vmnet(1|8) => we know it from v1/v2
+
+ echo " * fixing file permission"
+ chmod 755 vmroot/lib/vmware/bin/*
+ chmod 04755 vmroot/lib/vmware/bin/vmware-vmx
+ chmod 04755 vmroot/lib/vmware/bin/vmware-vmx-debug
+ chmod 04755 vmroot/lib/vmware/bin/vmware-vmx-stats
+ chmod 755 vmroot/bin/*
+ chmod 755 vmroot/lib/vmware/lib/wrapper-gtk24.sh
+
+ # I don't want to understand what vmware is doing, but without this
+ # step we need to have LD_LIBRARY_PATH with 53 entrys. welcome to
+ # library hell
+ # if this fact is still valid for 2.5 is unclear, but lets do it
+ echo " * fixing librarys..."
+ cd vmroot/lib/vmware/lib
+ mkdir test
+ mv lib* test
+ mv test/lib*/* .
+ rm -rf test
+ cd ../../../..
+
+ echo " * fixing gdk and pango config files"
+ sed -i \
+ "s,@@LIBCONF_DIR@@,/opt/openslx/plugin-repo/vmware/${vmplversion}/vmroot/lib/vmware/libconf," \
+ vmroot/lib/vmware/libconf/etc/gtk-2.0/gdk-pixbuf.loaders
+ sed -i \
+ "s,@@LIBCONF_DIR@@,/opt/openslx/plugin-repo/vmware/${vmplversion}/vmroot/lib/vmware/libconf," \
+ vmroot/lib/vmware/libconf/etc/gtk-2.0/gtk.immodules
+ sed -i \
+ "s,@@LIBCONF_DIR@@,/opt/openslx/plugin-repo/vmware/${vmplversion}/vmroot/lib/vmware/libconf," \
+ vmroot/lib/vmware/libconf/etc/pango/pango.modules
+ sed -i \
+ "s,@@LIBCONF_DIR@@,/opt/openslx/plugin-repo/vmware/${vmplversion}/vmroot/lib/vmware/libconf," \
+ vmroot/lib/vmware/libconf/etc/pango/pangorc
+ sed -i \
+ "s,/etc/pango/pango/,/etc/pango/," \
+ vmroot/lib/vmware/libconf/etc/pango/pangorc
+
+ echo " * creating /etc/vmware"
+ rm -rf /etc/vmware
+ mkdir -p /etc/vmware
+
+ echo " * unpacking kernel modules"
+ cd vmroot/lib/vmware/modules/source
+ tar xf vmnet.tar
+ tar xf vmmon.tar
+ tar xf vmblock.tar
+ #tar xf vmci.tar # just for 2 or more VMs => not needed
+ #tar xf vmppuser.tar # we don't need it
+ tar xf vsock.tar
+
+ echo " * building vmblock module"
+ cd vmblock-only/
+ sed -i "s%^VM_UNAME = .*%VM_UNAME = $(find /boot/vmlinuz* -maxdepth 0|sed 's,/boot/vmlinuz-,,g'|sort|tail -n 1)%" Makefile
+ make -s
+ mv vmblock.ko vmblock.o ../../../../../modules
+ cd ..
+
+ echo " * building vmmon module"
+ cd vmmon-only
+ sed -i "s%^VM_UNAME = .*%VM_UNAME = $(find /boot/vmlinuz* -maxdepth 0|sed 's,/boot/vmlinuz-,,g'|sort|tail -n 1)%" Makefile
+ make -s
+ mv vmmon.ko vmmon.o ../../../../../modules
+ cd ..
+
+ echo " * building vmnet module"
+ cd vmnet-only
+ sed -i "s%^VM_UNAME = .*%VM_UNAME = $(find /boot/vmlinuz* -maxdepth 0|sed 's,/boot/vmlinuz-,,g'|sort|tail -n 1)%" Makefile
+ make -s
+ mv vmnet.ko vmnet.o ../../../../../modules
+ cd ..
+
+ echo " * building vmsock module"
+ cd vsock-only
+ sed -i "s%^VM_UNAME = .*%VM_UNAME = $(find /boot/vmlinuz* -maxdepth 0|sed 's,/boot/vmlinuz-,,g'|sort|tail -n 1)%" Makefile
+ make -s
+ mv vsock.ko vsock.o ../../../../../modules
+ cd ../../../../../..
+
+ echo " * setting up EULA"
+ mv vmroot/doc/EULA vmroot/lib/vmware/share/EULA.txt
+
+ echo " * finishing installation"
+
+fi
diff --git a/src/os-plugins/plugins/vmware/files/nvram b/src/os-plugins/plugins/vmware/files/nvram
new file mode 100644
index 00000000..85125f1e
--- /dev/null
+++ b/src/os-plugins/plugins/vmware/files/nvram
Binary files differ
diff --git a/src/os-plugins/plugins/vmware/files/run-virt.include b/src/os-plugins/plugins/vmware/files/run-virt.include
new file mode 100644
index 00000000..2010dc4b
--- /dev/null
+++ b/src/os-plugins/plugins/vmware/files/run-virt.include
@@ -0,0 +1,448 @@
+# run-virt.include
+# -----------------------------------------------------------------------------
+# Copyright (c) 2009..2010 - RZ Uni Freiburg
+# Copyright (c) 2009..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# run-virt.include
+# - component for vmware/player of the vmchooser plugin run-virt.sh
+################################################################################
+
+# configuration writer functions
+################################################################################
+
+runvmwareconfheader ()
+{
+echo "# This configuration file was generated by $0" >${conffile}
+
+case "$vmversion" in
+ *)
+ svga_autodetect="TRUE"
+ numvcpus="1"
+ shared_folder="FALSE"
+ echo ".encoding = \"UTF-8\"
+# version specific stuff - all versions
+config.version = \"8\"" >>${conffile}
+ ;;
+esac
+case "$vmversion" in
+ 2.*|3.*|6.*|7.*)
+ shared_folder="TRUE"
+ echo "
+# version specific stuff - ver. 2.*|3.*|6.*|7.*
+sharedFolder.option = \"alwaysEnabled\"" >>${conffile}
+ ;;
+esac
+case "$vmversion" in
+ 2.5|3.*|6.5|7.*)
+ if [ "${cpu_cores}" -ge "2" 2>/dev/null ]; then
+ numvcpus="2"
+ fi
+ cap3d="TRUE" # helper var for loging output
+ echo "
+# version specific stuff - ver. 2.5|3.*|6.5|7.*
+ehci.present = \"TRUE\"
+mks.enable3d = \"${enable3d}\"" >>${conffile}
+ ;;
+esac
+case "$vmversion" in
+ 3.*|7.*)
+ numvcpus="${cpu_cores}"
+ # svga_autodetect="FALSE" # if defined manual, see below
+ echo "
+# version specific stuff - ver. 3.*|7.*
+cpuid.coresPerSocket = \"${cpu_cores}\"
+maxvcpus = \"4\"
+# svga.numDisplays = "2"
+# svga.maxWidth = "2560"
+# svga.maxHeight = "2048"
+# svga.vramSize = "134217728"
+monitor.virtual_mmu = \"automatic\"
+monitor.virtual_exec = \"automatic\"
+floppy1.clientDevice = \"FALSE\"
+floppy1.readonly = \"TRUE\"" >>${conffile}
+ ;;
+esac
+
+echo "
+# id
+virtualHW.version = \"${hwver}\"
+displayName = \"${displayname}\"
+guestOS = \"${vmostype}\"
+
+# CPU/MEM
+numvcpus = \"${numvcpus}\"
+memsize = \"${mem}\"
+MemAllowAutoScaleDown = \"FALSE\"
+MemTrimRate = \"-1\"
+
+# ide-disks
+ide0:0.present = \"${ide}\"
+ide0:0.fileName = \"${diskfile}\"
+ide0:0.mode = \"independent-nonpersistent\"
+ide1:0.present = \"${cdrom0}\"
+ide1:0.autodetect = \"TRUE\"
+ide1:0.fileName = \"auto detect\"
+ide1:0.deviceType = \"cdrom-raw\"
+ide1:1.present = \"${cdrom1}\"
+ide1:1.autodetect = \"TRUE\"
+ide1:1.fileName = \"auto detect\"
+ide1:1.deviceType = \"cdrom-raw\"
+
+# scsi-disks
+scsi0.present = \"${scsi}\"
+scsi0:0.present = \"${scsi}\"
+scsi0:0.fileName = \"${diskfile}\"
+scsi0.virtualDev = \"${hddrv}\"
+scsi0:0.mode = \"independent-nonpersistent\"
+
+# floppies
+floppy0.present = \"${floppy0}\"
+floppy0.startConnected = \"FALSE\"
+floppy0.autodetect = \"TRUE\"
+floppy0.fileName = \"auto detect\"
+# we need floppy b: for our windows client configuration
+floppy1.present = \"${floppy1}\"
+floppy1.startConnected = \"TRUE\"
+floppy1.fileType = \"file\"
+floppy1.fileName = \"${floppy1name}\"
+
+# nics
+ethernet0.present = \"TRUE\"
+ethernet0.addressType = \"static\"
+${network_virtualDev}
+ethernet0.connectionType = \"${network_kind}\"
+#ethernet1.connectionType = \"custom\"
+#ethernet1.vnet = \"/dev/vmnet2\"
+ethernet0.address = \"00:50:56:${VM_ID}:${machostpart}\"
+ethernet0.wakeOnPcktRcv = \"FALSE\"
+
+# sound
+sound.present = \"TRUE\"
+sound.fileName = \"-1\"
+sound.autodetect = \"TRUE\"
+
+# svga
+svga.autodetect = \"${svga_autodetect}\"
+
+# usb
+usb.present = \"TRUE\"
+usb.generic.autoconnect = \"TRUE\"
+
+# shared folders
+sharedFolder0.present = \"TRUE\"
+sharedFolder0.enabled = \"${shared_folder}\"
+sharedFolder0.expiration = \"never\"
+sharedFolder0.guestName = \"${sharename}\"
+sharedFolder0.hostPath = \"${sharepath}\"
+sharedFolder0.readAccess = \"TRUE\"
+sharedFolder0.writeAccess = \"TRUE\"
+sharedFolder.maxNum = \"1\"
+
+# dirs/configs
+tmpDirectory = \"${redodir}\"
+redoLogDir = \"${redodir}\"
+mainMem.useNamedFile = \"TRUE\"
+snapshot.disabled = \"TRUE\"
+tools.syncTime = \"TRUE\"
+isolation.tools.hgfs.disable = \"FALSE\"
+hgfs.mapRootShare = \"TRUE\"
+isolation.tools.dnd.disable = \"FALSE\"
+isolation.tools.copy.enable = \"TRUE\"
+isolation.tools.paste.enabled = \"TRUE\"
+
+# serial port
+serial0.present = \"${serial}\"
+${serialdev}
+
+# parallel port
+parallel0.present = \"${parallel}\"
+parallel0.bidirectional = \"${paralbidi}\"
+${paraldev}" >>${conffile}
+
+# set the appropriate permissions for the vmware config file
+chmod u+rwx ${conffile} >/dev/null 2>&1
+}
+
+preferencesheader ()
+{
+echo ".encoding = \"UTF-8\"
+# This configuration file was generated by $0
+
+# updates/tips
+webUpdate.enabled = \"FALSE\"
+pref.downloadPermission = \"deny\"
+pref.vmplayer.downloadPermission = \"deny\"
+pref.vmplayer.webUpdateOnStartup = \"FALSE\"
+pref.tip.startup = \"FALSE\"
+hints.hideAll = \"TRUE\"
+hint.vmui.showAllUSBDevs = \"FALSE\"
+
+# configs
+prefvmx.defaultVMPath = \"${vmhome}\"
+prefvmx.mru.config = \"${conffile}:\"
+
+# hot keys
+pref.hotkey.control = \"true\"
+pref.hotkey.alt = \"true\"
+pref.hotkey.shift = \"true\"
+pref.hotkey.gui = \"true\"
+gui.restricted = \"true\"
+
+# fullscreen/mouse/keyboard
+pref.fullscreen.toolbarPixels = \"0\"
+pref.vmplayer.fullscreen.autohide = \"TRUE\"
+pref.grabOnMouseClick = \"TRUE\"
+pref.grabOnKeyPress = \"FALSE\"
+pref.motionGrab = \"TRUE\"
+pref.motionUngrab = \"TRUE\"
+pref.hideCursorOnUngrab = \"TRUE\"
+pref.autoFit = \"TRUE\"
+pref.autoFitFullScreen = \"fitGuestToHost\"
+pref.vmplayer.exit.vmAction = \"poweroff\"
+pref.vmplayer.confirmOnExit = \"TRUE\"
+
+# shared folders
+pref.enableAllSharedFolders = \"TRUE\"
+
+# eula
+pref.eula.size = \"2\"
+pref.eula.0.appName = \"VMware Player\"
+pref.eula.0.buildNumber = \"${vmbuild}\"
+pref.eula.1.appName = \"VMware Workstation\"
+pref.eula.1.buildNumber = \"${vmbuild}\"" >${vmhome}/preferences
+}
+
+
+# declaration of default variables
+################################################################################
+
+# VM-ID static (0D), remove if changed to 00
+VM_ID="0D"
+# temporary disk space for logs, etc...
+redodir=/tmp/vmware/${USER}
+# dir for configs and vmem file
+confdir=${redodir}
+# configfile
+conffile="${confdir}/run-vmware.conf"
+# diskfile
+diskfile=${vmpath}
+# users vmware config folder
+vmhome="${HOME}/.vmware"
+
+# get several version infos for vmware/player
+. ${OPENSLX_DEFAULT_CONFDIR}/plugins/vmware/vmware.conf
+vmbuild=$buildversion
+vmversion=$version
+
+# VMware start options
+# "-X": start in fullscreen
+vmopt="-X"
+
+
+# hardware checks
+################################################################################
+
+# use different network card
+if [ -n "${network_card}" ]; then
+ network_virtualDev='ethernet0.virtualDev = "e1000"'
+else
+ network_virtualDev='# using default virtualDev for ethernet0'
+fi
+
+case "$enable3d" in
+ *true*|*TRUE*|*yes*|*YES*)
+ enable3d="TRUE"
+ ;;
+ *)
+ enable3d="FALSE"
+ ;;
+esac
+
+# serial/parallel port defined (e.g. "ttyS0, lp0" or "autodetect")
+case "$serial" in
+ tty*)
+ serialdev="serial0.filename = \"/dev/${serial}\""
+ serial="TRUE"
+ ;;
+ auto*)
+ serialdev="serial0.autodetect = \"TRUE\""
+ serial="TRUE"
+ ;;
+ *)
+ serialdev="# no serial port configured"
+ serial="FALSE"
+ ;;
+esac
+case "$parallel" in
+ lp*|parport*)
+ paraldev="parallel0.filename = \"/dev/${parallel}\""
+ paralbidi="TRUE"
+ parallel="TRUE"
+ ;;
+ auto*)
+ paraldev="parallel0.autodetect = \"TRUE\""
+ paralbidi="TRUE"
+ parallel="TRUE"
+ ;;
+ *)
+ paraldev="# no parallel port configured"
+ paralbidi="FALSE"
+ parallel="FALSE"
+ ;;
+esac
+
+# adjust memory available for vmware guests
+#if [ -n "${forcemem}" ]; then
+# mem="${forcemem}"
+#else
+# case "$vmversion" in
+# 2.*|6.*)
+# permem=30
+# ;;
+# 3.*|7.*)
+# permem=25
+# ;;
+# esac
+# if [ "${totalmem}" -ge "2500" ]; then
+# permem=40
+# fi
+# # check if /tmp is on harddisk
+# if grep -qe "/dev/.* /tmp " /proc/mounts ; then
+# permem=60
+# id44="1"
+# # Hack, if more than 2,5G RAM use 40% of Ram and write vmem into Ram as well
+# # (40% vmware | 40% confdir(vmem...) | 20% host
+# # VMplayer 2+ issue
+# if [ "${totalmem}" -ge "2500" ]; then
+# permem=40
+# confdir=/dev/shm/vmware/$USER
+# conffile=${confdir}/run-vmware.conf
+# mkdir -p /dev/shm/vmware/$USER
+# fi
+# fi
+# mem=$(expr ${totalmem} / 100 \* ${permem} / 4 \* 4)
+# if [ "${id44}" = "1" ]; then
+# hostmem=$(expr ${totalmem} - ${mem})
+# else
+# hostmem=$(expr ${totalmem} - ${mem} - ${mem})
+# fi
+#fi
+
+# check if ide/scsi and hwver of image
+# read only the first 30 lines to be shure
+imghead=$(head -30 ${diskfile})
+hddrv=$(echo "${imghead}" | grep -m1 -ia "ddb.adapterType" |\
+ awk -F '"' '{print $2}')
+hwver=$(echo "${imghead}" | grep -m1 -ia "ddb.virtualHWVersion" |\
+ awk -F '"' '{print $2}')
+case "${hddrv}" in
+ ide)
+ ide="TRUE"
+ scsi="FALSE"
+ ;;
+ lsilogic|buslogic)
+ ide="FALSE"
+ scsi="TRUE"
+ ;;
+esac
+
+
+# write configuration files
+################################################################################
+
+# create vmware directories
+mkdir -p ${redodir} >/dev/null 2>&1
+mkdir -p ${confdir} >/dev/null 2>&1
+mkdir -p ${vmhome} >/dev/null 2>&1
+
+# create preferences
+preferencesheader
+
+# create VMware startup file
+runvmwareconfheader
+# link to conffile if confdir != redodir
+ln -s ${conffile} ${redodir}/run-vmware.conf >/dev/null 2>&1
+
+# sync is needed to ensure that data is really written to virtual disk
+sync
+
+# own nvram. We need it for floppy drive b, default nvram has just drive a
+# TODO: optimize, currently kinda inefficient, too much copys, but we
+# don't know which one is installed...
+for i in /opt/openslx/plugin-repo/vmware/*; do
+ cp ${i}/nvram ${confdir}/nvram 2>/dev/null
+done
+
+
+# logging and stdout
+################################################################################
+
+# log script information
+writelog "# File created by $0 (VMversion ${vmversion})\n# on $(date)\n"
+writelog "Starting with non-persistent mode ...\n"
+
+# check memory range
+if [ "${mem}" -lt "256" ] || [ "${hostmem}" -lt "256" ]; then
+ writelog "\tMemory out of range: ${mem} MB (guest) / ${hostmem} MB (host)!"
+ writelog "\tMin. 256 MB for host and guest!"
+ exit 1
+fi
+
+# write all results to logfile
+# log disksetup
+writelog "Directories:"
+writelog "\tConfdir:\t${confdir}"
+writelog "\tConffile:\t${conffile}"
+writelog "\tRedodir:\t${redodir}"
+writelog "\tVMhome:\t\t${vmhome}"
+writelog "\t/tmp info: \
+ $(grep "/tmp " /proc/mounts) $(df -h | grep " /tmp$" | awk '{print $2}')"
+# hw setup
+writelog "Hardware:"
+writelog "\tMAC:\t\t00:50:56:${VM_ID}:${machostpart}"
+if [ -n "${network_card}" ]; then
+ writelog "\tNet Adaptor:\t${network_card}"
+fi
+writelog "\tMem:\t\t${mem} MB"
+# echo nur wenn hostmem gesetzt
+[ -n "${hostmem}" ] && writelog "\tHostmem:\t${hostmem} MB"
+writelog "\tMax. res.:\t${xres}x${yres}"
+writelog "\tCD-ROM1:\t${cdrom0}"
+writelog "\tCD-ROM2:\t${cdrom1}"
+writelog "\tFloppy_A:\t${floppy0}"
+if [ "${serial}" = "TRUE" ]; then
+ writelog "\tSerial Port:\t${serialdev}"
+fi
+if [ "${parallel}" = "TRUE" ]; then
+ writelog "\tParallel Port:\t${paraldev}"
+fi
+# image
+writelog "Diskimage:"
+writelog "\tDiskfile:\t${diskfile}"
+writelog "\tDisktype:\t${hddrv}"
+writelog "\tHWVersion:\t${hwver}"
+writelog "\tVMostype:\t${vmostype}"
+# misc
+writelog "Misc:"
+writelog "\tDisplayname:\t${displayname}"
+if [ "${cap3d}" = "TRUE" -a "${enable3d}" = "TRUE" ]; then
+ writelog "\t3D Graphics:\tenabled"
+fi
+# empty line at end
+writelog ""
+
+
+# finally set env for run-virt.sh
+################################################################################
+
+# using the modified version of the wrapper script
+VIRTCMD="${OPENSLX_DEFAULT_BINDIR}/vmplayer"
+VIRTCMDOPTS="${vmopt} ${conffile}"
diff --git a/src/os-plugins/plugins/vmware/init-hooks/20-nw-bridge-config/bridge.sh b/src/os-plugins/plugins/vmware/init-hooks/20-nw-bridge-config/bridge.sh
new file mode 100755
index 00000000..3ae7e946
--- /dev/null
+++ b/src/os-plugins/plugins/vmware/init-hooks/20-nw-bridge-config/bridge.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+# Copyright (c) 2009..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# Init hook to create a bridge on the active network interface
+# (should be kept identical to the files of virtualbox and qemukvm plugins)
+#############################################################################
+
+local bridge=br0
+local brnwif=${nwif}
+local nwifmac=${macaddr}
+
+# bridge 0 already defined or some other problem
+brctl addbr ${bridge} || exit 0
+brctl stp ${bridge} 0
+brctl setfd ${bridge} 0.000000000001
+ip link set addr ${nwifmac} ${bridge}
+ip link set dev ${nwif} up
+brctl addif ${bridge} ${nwif}
+
+# fixme: sending back the variable to init does not work properly at the
+# moment
+nwif=${bridge}
diff --git a/src/os-plugins/plugins/vmware/init-hooks/60-have-servconfig/vm-dhcpd.sh b/src/os-plugins/plugins/vmware/init-hooks/60-have-servconfig/vm-dhcpd.sh
new file mode 100755
index 00000000..b4f02389
--- /dev/null
+++ b/src/os-plugins/plugins/vmware/init-hooks/60-have-servconfig/vm-dhcpd.sh
@@ -0,0 +1,60 @@
+#!/bin/sh
+# Copyright (c) 2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# Init hook to create a bridge on the active network interface
+# (should be kept identical in vmware, virtualbox and qemukvm plugins)
+#############################################################################
+
+. /etc/openslx.conf
+
+CONFDIR=/mnt/${OPENSLX_DEFAULT_CONFDIR}
+testmkd ${CONFDIR}
+
+# configuring dhcpd stub for virtual networks
+cat > ${CONFDIR}/udhcpd.conf << EOF
+# general udhcpd configuration file for virtual machines written by
+# $0 during OpenSLX stage3 configuration
+
+# start and end of the IP lease block
+start CNETWORK.20
+end CNETWORK.100
+
+# interface that udhcpd will use
+interface NWIF
+
+# how long an offered address is reserved (leased) in seconds
+offer_time 6000
+
+# location of the leases file
+lease_file LEASEFILE
+
+# location of the pid file
+pidfile PIDFILE
+
+option dns ${domain_name_servers}
+option subnet 255.255.255.0
+option router CNETWORK.1
+option wins CNETWORK.10
+option domain virtual.site ${domain_name}
+
+# additional options known to udhcpd
+#subnet #timezone
+#router #timesvr
+#namesvr #dns
+#logsvr #cookiesvr
+#lprsvr #bootsize
+#domain #swapsvr
+#rootpath #ipttl
+#mtu #broadcast
+#wins #lease
+#ntpsrv #tftp
+#bootfile
+EOF
diff --git a/src/os-plugins/plugins/vmware/init-hooks/80-after-plugins/adapt-tmpfs.sh b/src/os-plugins/plugins/vmware/init-hooks/80-after-plugins/adapt-tmpfs.sh
new file mode 100644
index 00000000..a28a8c6f
--- /dev/null
+++ b/src/os-plugins/plugins/vmware/init-hooks/80-after-plugins/adapt-tmpfs.sh
@@ -0,0 +1,24 @@
+#!/bin/sh
+# Copyright (c) 2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# Init hook to adapt the tmpfs size for VMware/Player
+# (should be kept identical to the files of virtualbox plugin)
+#############################################################################
+
+# adapt tmpfs size (overbook)
+case $(grep tmpfs /proc/mounts) in
+ */tmp*)
+ mount -o remount,size=160% /mnt/tmp
+ ;;
+ */uniontmp*)
+ mount -o remount,size=160% /mnt/uniontmp
+ ;;
+esac
diff --git a/src/os-plugins/plugins/wlanboot/OpenSLX/OSPlugin/wlanboot.pm b/src/os-plugins/plugins/wlanboot/OpenSLX/OSPlugin/wlanboot.pm
new file mode 100644
index 00000000..ab1c614e
--- /dev/null
+++ b/src/os-plugins/plugins/wlanboot/OpenSLX/OSPlugin/wlanboot.pm
@@ -0,0 +1,154 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# wlanboot.pm
+# - an wlanboot extension to the stage3 system
+# -----------------------------------------------------------------------------
+package OpenSLX::OSPlugin::wlanboot;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSPlugin::Base);
+
+use File::Path;
+
+use Data::Dumper;
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+# if you have any questions regarding the concept of OS-plugins and their
+# implementation, please drop a mail to: ot@openslx.com, or join the IRC-channel
+# '#openslx' (on freenode).
+################################################################################
+sub new
+{
+ my $class = shift;
+
+ my $self = {
+ name => 'wlanboot',
+ };
+
+ return bless $self, $class;
+}
+
+sub getInfo
+{
+ my $self = shift;
+
+ return {
+ description => unshiftHereDoc(<<' End-of-Here'),
+ wlanboot is an extension for stage 3
+ End-of-Here
+ precedence => 50,
+ };
+}
+
+sub getAttrInfo
+{ # returns a hash-ref with information about all attributes supported
+ # by this specific plugin
+ my $self = shift;
+
+ # This default configuration will be added as attributes to the default
+ # system, such that it can be overruled for any specific system by means
+ # of slxconfig.
+ return {
+ # attribute 'active' is mandatory for all plugins
+ 'wlanboot::active' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should the 'wlanboot'-plugin be executed during boot?
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '1 means active - 0 means inactive',
+ default => '1',
+ },
+ 'wlanboot::activenics' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ kernel modules to load ..
+ End-of-Here
+ content_regex => '',
+ content_descr => 'space seperated list of kernel modules (without .ko)',
+ default => 'iwl3945 arc4 ecb',
+ },
+ };
+}
+
+sub installationPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ my $pluginRepoPath = $info->{'plugin-repo-path'};
+ my $pluginTempPath = $info->{'plugin-temp-path'};
+ my $openslxBasePath = $info->{'openslx-base-path'};
+ my $openslxConfigPath = $info->{'openslx-config-path'};
+ my $attrs = $info->{'plugin-attrs'};
+
+ my $filesDir = "$openslxBasePath/lib/plugins/wlanboot/files";
+ slxsystem("cp -r $filesDir $pluginRepoPath/");
+
+ return;
+}
+
+sub removalPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ my $pluginRepoPath = $info->{'plugin-repo-path'};
+ my $pluginTempPath = $info->{'plugin-temp-path'};
+
+ return;
+}
+
+sub suggestAdditionalKernelModules
+{
+ my $self = shift;
+ my $info = shift;
+
+ my $attrs = $info->{'attrs'};
+
+ my @suggestedKernelModules;
+
+ print Dumper(split(/ /, $attrs->{'wlanboot::activenics'}));
+ push(@suggestedKernelModules, split(/ /, $attrs->{'wlanboot::activenics'} ));
+
+ return @suggestedKernelModules;
+}
+
+sub copyRequiredFilesIntoInitramfs
+{
+ my $self = shift;
+ my $targetPath = shift;
+ my $attrs = shift;
+ my $makeInitRamFSEngine = shift;
+ my $pluginRepoPath = "$openslxConfig{'base-path'}/lib/plugins/wlanboot";
+
+ $makeInitRamFSEngine->addCMD(
+ "cp -p $pluginRepoPath/files/bin/* $targetPath/bin/"
+ );
+ $makeInitRamFSEngine->addCMD(
+ "cp -a $pluginRepoPath/files/firmware $targetPath/lib"
+ );
+ $makeInitRamFSEngine->addCMD(
+ "cp -a $pluginRepoPath/files/lib $targetPath/"
+ );
+ vlog(1, _tr("wlanboot-plugin: ..."));
+
+ return;
+}
+
+1;
diff --git a/src/os-plugins/plugins/wlanboot/XX_wlanboot.sh b/src/os-plugins/plugins/wlanboot/XX_wlanboot.sh
new file mode 100644
index 00000000..c33c1e19
--- /dev/null
+++ b/src/os-plugins/plugins/wlanboot/XX_wlanboot.sh
@@ -0,0 +1,27 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# stage3 part of 'wlanboot' plugin - the runlevel script
+#
+# script is included from init via the "." load function - thus it has all
+# variables and functions available
+
+if [ -e /initramfs/plugin-conf/wlanboot.conf ]; then
+ . /initramfs/plugin-conf/wlanboot.conf
+ if [ $wlanboot_active -ne 0 ]; then
+ [ $DEBUGLEVEL -gt 0 ] && echo "executing the 'wlanboot' os-plugin ...";
+ #iwconfig wlan0 essid "wlanboottest"
+ #ip link set wlan0 up
+ #udhcpc -i wlan0
+
+ [ $DEBUGLEVEL -gt 0 ] && echo "done with 'wlanboot' os-plugin ...";
+
+ fi
+fi
diff --git a/src/os-plugins/plugins/wlanboot/files/bin/iwconfig b/src/os-plugins/plugins/wlanboot/files/bin/iwconfig
new file mode 100755
index 00000000..42c18ca1
--- /dev/null
+++ b/src/os-plugins/plugins/wlanboot/files/bin/iwconfig
Binary files differ
diff --git a/src/os-plugins/plugins/wlanboot/files/bin/iwevent b/src/os-plugins/plugins/wlanboot/files/bin/iwevent
new file mode 100755
index 00000000..bf9b921b
--- /dev/null
+++ b/src/os-plugins/plugins/wlanboot/files/bin/iwevent
Binary files differ
diff --git a/src/os-plugins/plugins/wlanboot/files/bin/iwgetid b/src/os-plugins/plugins/wlanboot/files/bin/iwgetid
new file mode 100755
index 00000000..a310ee85
--- /dev/null
+++ b/src/os-plugins/plugins/wlanboot/files/bin/iwgetid
Binary files differ
diff --git a/src/os-plugins/plugins/wlanboot/files/bin/iwlist b/src/os-plugins/plugins/wlanboot/files/bin/iwlist
new file mode 100755
index 00000000..9597d4d4
--- /dev/null
+++ b/src/os-plugins/plugins/wlanboot/files/bin/iwlist
Binary files differ
diff --git a/src/os-plugins/plugins/wlanboot/files/bin/iwpriv b/src/os-plugins/plugins/wlanboot/files/bin/iwpriv
new file mode 100755
index 00000000..a9fd399e
--- /dev/null
+++ b/src/os-plugins/plugins/wlanboot/files/bin/iwpriv
Binary files differ
diff --git a/src/os-plugins/plugins/wlanboot/files/bin/iwspy b/src/os-plugins/plugins/wlanboot/files/bin/iwspy
new file mode 100755
index 00000000..2bded1e1
--- /dev/null
+++ b/src/os-plugins/plugins/wlanboot/files/bin/iwspy
Binary files differ
diff --git a/src/os-plugins/plugins/wlanboot/files/bin/iwtest b/src/os-plugins/plugins/wlanboot/files/bin/iwtest
new file mode 100644
index 00000000..c6846702
--- /dev/null
+++ b/src/os-plugins/plugins/wlanboot/files/bin/iwtest
@@ -0,0 +1 @@
+test file for plugin wlanboot.
diff --git a/src/os-plugins/plugins/wlanboot/files/firmware/README b/src/os-plugins/plugins/wlanboot/files/firmware/README
new file mode 100644
index 00000000..0845746d
--- /dev/null
+++ b/src/os-plugins/plugins/wlanboot/files/firmware/README
@@ -0,0 +1,8 @@
+Put all the required firmwares of WLAN adapters you would like to use in
+your setup here into this subdirectory. They are copied into the InitRamFS
+to be present for device configuration via modprobe/mdev in stage3.
+
+For more information on the "wlanboot" plugin have a look at the project
+page!
+
+The OpenSLX Team
diff --git a/src/os-plugins/plugins/wlanboot/files/firmware/iwlwifi-3945-1.ucode b/src/os-plugins/plugins/wlanboot/files/firmware/iwlwifi-3945-1.ucode
new file mode 100644
index 00000000..14dc7aac
--- /dev/null
+++ b/src/os-plugins/plugins/wlanboot/files/firmware/iwlwifi-3945-1.ucode
Binary files differ
diff --git a/src/os-plugins/plugins/wlanboot/files/firmware/iwlwifi-3945-2.ucode b/src/os-plugins/plugins/wlanboot/files/firmware/iwlwifi-3945-2.ucode
new file mode 100644
index 00000000..c1ea0aab
--- /dev/null
+++ b/src/os-plugins/plugins/wlanboot/files/firmware/iwlwifi-3945-2.ucode
Binary files differ
diff --git a/src/os-plugins/plugins/wlanboot/files/firmware/iwlwifi-4965-1.ucode b/src/os-plugins/plugins/wlanboot/files/firmware/iwlwifi-4965-1.ucode
new file mode 100644
index 00000000..6d67a882
--- /dev/null
+++ b/src/os-plugins/plugins/wlanboot/files/firmware/iwlwifi-4965-1.ucode
Binary files differ
diff --git a/src/os-plugins/plugins/wlanboot/files/firmware/iwlwifi-4965-2.ucode b/src/os-plugins/plugins/wlanboot/files/firmware/iwlwifi-4965-2.ucode
new file mode 100644
index 00000000..8cf429d3
--- /dev/null
+++ b/src/os-plugins/plugins/wlanboot/files/firmware/iwlwifi-4965-2.ucode
Binary files differ
diff --git a/src/os-plugins/plugins/wlanboot/files/firmware/iwlwifi-5000-1.ucode b/src/os-plugins/plugins/wlanboot/files/firmware/iwlwifi-5000-1.ucode
new file mode 100644
index 00000000..5519149b
--- /dev/null
+++ b/src/os-plugins/plugins/wlanboot/files/firmware/iwlwifi-5000-1.ucode
Binary files differ
diff --git a/src/os-plugins/plugins/wlanboot/files/lib/libiw.so b/src/os-plugins/plugins/wlanboot/files/lib/libiw.so
new file mode 120000
index 00000000..ee7675c6
--- /dev/null
+++ b/src/os-plugins/plugins/wlanboot/files/lib/libiw.so
@@ -0,0 +1 @@
+libiw.so.29 \ No newline at end of file
diff --git a/src/os-plugins/plugins/wlanboot/files/lib/libiw.so.29 b/src/os-plugins/plugins/wlanboot/files/lib/libiw.so.29
new file mode 100755
index 00000000..1fde3844
--- /dev/null
+++ b/src/os-plugins/plugins/wlanboot/files/lib/libiw.so.29
Binary files differ
diff --git a/src/os-plugins/plugins/wlanboot/init-hooks/10-nw-if-config/wlanboot.sh b/src/os-plugins/plugins/wlanboot/init-hooks/10-nw-if-config/wlanboot.sh
new file mode 100755
index 00000000..fee893d4
--- /dev/null
+++ b/src/os-plugins/plugins/wlanboot/init-hooks/10-nw-if-config/wlanboot.sh
@@ -0,0 +1,75 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# stage3 init-hook 10 of 'wlanboot' plugin - firing up the wlan connection
+
+#setting udhcpc up
+mkdir -p /usr/share/udhcpc
+echo -e "#!/bin/ash\nunset infomsg HOME IFS mask lease interface DEBUGLEVEL \
+BOOT_IMAGE\nset >/tmp/ipstuff" >/usr/share/udhcpc/default.script
+chmod u+x /usr/share/udhcpc/default.script
+
+echo "! shutting down watchdog for debugging";
+killall watchdog;
+
+essid=$(sed -n 's/.*essid=\([^[:blank:]]*\) .*/\1/p' /proc/cmdline);
+[ $DEBUGLEVEL -gt 0 ] && echo "set essid to ${essid}";
+#value of essid unchecked yet
+
+
+# load network adaptor modules
+#modprobe iwl3945
+cd /lib/modules/$(ls /lib/modules/)/kernel/drivers/net/wireless
+for mod in $(find . | grep .ko | sed 's,.*/\([^/]*\).ko,\1',); do
+ echo "Mod:";
+ echo $mod;
+ modprobe $mod || echo "module $mod did not load for some reason"
+ usleep 10000
+done
+cd /
+
+wlanif=$(iwconfig 2>/dev/null|sed -n "/ESSID:/p"|sed "s/ .*//")
+[ $DEBUGLEVEL -gt 0 ] && echo "wlancard recognized as ${wlanif}";
+
+if [ -n "$wlanif" ] ; then
+ ip link set dev ${wlanif} up
+ if iwconfig ${wlanif} mode managed essid "${essid}"; then
+ nwif=${wlanif}
+ else
+ error " Unable to configure the WLAN interface."
+ fi
+
+
+ ( sleep 6 ; killall udhcpc >/dev/null 2>&1 ) &
+ udhcpc -f -n -q $vci -s /usr/share/udhcpc/default.script -i $nwif 2>/dev/null
+ if grep "ip=" /tmp/ipstuff >/dev/null 2>&1 ; then
+ . /tmp/ipstuff
+ for i in $dns ; do
+ echo "nameserver $i" >>/etc/resolv.conf
+ done
+ # simply add a single dns server for passing via kernel cmdline to stage3
+ # (quickhack, just the last, list of dns might be better ...)
+ echo "dnssrv=$i" >>/tmp/ipstuff
+ return
+ else
+ if [ $i -eq 1 ] ; then
+ sleep 1
+ else
+ echo "Did not get any proper IP configuration"; /bin/ash
+ fi
+ fi
+
+ ip addr add $ip/$(ipcalc -s -p $ip $subnet|sed s/.*=//) dev $nwif
+ ip route add default via $router
+ [ $DEBUGLEVEL -gt 0 ] && echo "IP-Configuration: $ip on interface $wlanif."
+else
+ error " No wireless LAN capable interface found. Did you provide the \
+proper kernel\n modules and firmware?"
+fi \ No newline at end of file
diff --git a/src/os-plugins/plugins/x11vnc/OpenSLX/Distro/Base.pm b/src/os-plugins/plugins/x11vnc/OpenSLX/Distro/Base.pm
new file mode 100644
index 00000000..1e6a97a5
--- /dev/null
+++ b/src/os-plugins/plugins/x11vnc/OpenSLX/Distro/Base.pm
@@ -0,0 +1,94 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# x11vnc/OpenSLX/Distro/Base.pm
+# - provides base implementation of the Distro API for the x11vnc plugin.
+# -----------------------------------------------------------------------------
+package x11vnc::OpenSLX::Distro::Base;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+use Scalar::Util qw( weaken );
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {};
+ return bless $self, $class;
+}
+
+sub initialize
+{
+ my $self = shift;
+ $self->{engine} = shift;
+ weaken($self->{engine});
+ # avoid circular reference between plugin and its engine
+
+ return 1;
+}
+
+sub fillRunlevelScript
+{
+ my $self = shift;
+
+ my $script = unshiftHereDoc(<<" End-of-Here");
+ #! /bin/sh
+ # completely generic start/stop script, generated via stage1 'x11vnc' plugin
+ # install
+ #
+ # This script manages the services needed to run x11vnc software
+
+ # Basic support for the Linux Standard Base Specification 1.3
+ ### BEGIN INIT INFO
+ # Provides: x11vnc
+ # Required-Start:
+ # Required-Stop:
+ # Default-Start:
+ # Default-Stop:
+ # Short-Description: Manages the services needed to run x11vnc software
+ # Description: Manages the services needed to run x11vnc software
+ ### END INIT INFO
+
+ [ -f /opt/openslx/plugin-repo/x11vnc/x11vnc-init ] \\
+ && CMD="/opt/openslx/plugin-repo/x11vnc/x11vnc-init"
+
+ case \$1 in
+ start)
+ echo "Starting x11vnc ..."
+ \$CMD start
+ ;;
+ stop)
+ # message output should match the given vendor-os
+ echo "Stopping x11vnc ..."
+ \$CMD stop
+ ;;
+ #status)
+ # echo "Say something useful here ..."
+ #;;
+ restart)
+ "\$0" stop
+ "\$0" start
+ ;;
+ esac
+ exit 0
+ End-of-Here
+ return $script;
+}
+
+1;
diff --git a/src/os-plugins/plugins/x11vnc/OpenSLX/Distro/Debian.pm b/src/os-plugins/plugins/x11vnc/OpenSLX/Distro/Debian.pm
new file mode 100644
index 00000000..6623d22f
--- /dev/null
+++ b/src/os-plugins/plugins/x11vnc/OpenSLX/Distro/Debian.pm
@@ -0,0 +1,88 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# x11vnc/OpenSLX/Distro/debian.pm
+# - provides Debian-specific overrides of the Distro API for the x11vnc
+# plugin.
+# -----------------------------------------------------------------------------
+package x11vnc::OpenSLX::Distro::Debian;
+
+use strict;
+use warnings;
+
+use base qw(x11vnc::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub fillRunlevelScript
+{
+ my $self = shift;
+
+ my $script = unshiftHereDoc(<<" End-of-Here");
+ #!/bin/sh
+ # Ubuntu/Debian specific start/stop script, generated via stage1 'x11vnc'
+ # plugin install
+ # inspiration taken from x11vnc start script:
+ # Copyright 1998-2007 x11vnc, Inc. All rights reserved.
+ #
+ # This script manages the services needed to run x11vnc software
+
+ # Basic support for the Linux Standard Base Specification 1.3
+ ### BEGIN INIT INFO
+ # Provides: x11vnc
+ # Required-Start: \$syslog
+ # Required-Stop:
+ # Default-Start: 2 3 5
+ # Default-Stop: 0 6
+ # Short-Description: Manages the services needed to run x11vnc software
+ # Description: Manages the services needed to run x11vnc software
+ ### END INIT INFO
+
+ # initialize the lsb status messages
+ . /lib/lsb/init-functions
+
+ [ -f /opt/openslx/plugin-repo/x11vnc/x11vnc-init ] \\
+ && CMD="/opt/openslx/plugin-repo/x11vnc/x11vnc-init"
+
+ case \$1 in
+ start)
+ log_daemon_msg "Starting x11vnc background services ..." "x11vnc"
+ \$CMD start
+ log_end_msg \$?
+ ;;
+ stop)
+ log_daemon_msg "Stopping x11vnc background services ..." "x11vnc"
+ \$CMD stop
+ log_end_msg \$?
+ ;;
+ #status)
+ # log_daemon_msg "Say something useful here ..."
+ #;;
+ restart)
+ \$0 stop
+ \$0 start
+ exit $?
+ ;;
+ *)
+ log_success_msg "Usage: \$0 {start|stop|restart}"
+ exit 2
+ ;;
+ esac
+ exit 0
+ End-of-Here
+ return $script;
+}
+
+1;
diff --git a/src/os-plugins/plugins/x11vnc/OpenSLX/Distro/Fedora.pm b/src/os-plugins/plugins/x11vnc/OpenSLX/Distro/Fedora.pm
new file mode 100644
index 00000000..a1678912
--- /dev/null
+++ b/src/os-plugins/plugins/x11vnc/OpenSLX/Distro/Fedora.pm
@@ -0,0 +1,30 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# x11vnc/OpenSLX/Distro/Fedora.pm
+# - provides Fedora-specific overrides of the Distro API for the x11vnc
+# plugin.
+# -----------------------------------------------------------------------------
+package x11vnc::OpenSLX::Distro::Fedora;
+
+use strict;
+use warnings;
+
+use base qw(x11vnc::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+
+################################################################################
+### interface methods
+################################################################################
+
+# TODO: implement!
+
+1;
diff --git a/src/os-plugins/plugins/x11vnc/OpenSLX/Distro/Gentoo.pm b/src/os-plugins/plugins/x11vnc/OpenSLX/Distro/Gentoo.pm
new file mode 100644
index 00000000..1bacf1d8
--- /dev/null
+++ b/src/os-plugins/plugins/x11vnc/OpenSLX/Distro/Gentoo.pm
@@ -0,0 +1,30 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# x11vnc/OpenSLX/Distro/Gentoo.pm
+# - provides Gentoo-specific overrides of the Distro API for the x11vnc
+# plugin.
+# -----------------------------------------------------------------------------
+package x11vnc::OpenSLX::Distro::Gentoo;
+
+use strict;
+use warnings;
+
+use base qw(x11vnc::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+
+################################################################################
+### interface methods
+################################################################################
+
+# TODO: implement!
+
+1;
diff --git a/src/os-plugins/plugins/x11vnc/OpenSLX/Distro/Suse.pm b/src/os-plugins/plugins/x11vnc/OpenSLX/Distro/Suse.pm
new file mode 100644
index 00000000..f43a3893
--- /dev/null
+++ b/src/os-plugins/plugins/x11vnc/OpenSLX/Distro/Suse.pm
@@ -0,0 +1,91 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# x11vnc/OpenSLX/Distro/Suse.pm
+# - provides SUSE-specific overrides of the Distro API for the x11vnc plugin.
+# -----------------------------------------------------------------------------
+package x11vnc::OpenSLX::Distro::Suse;
+
+use strict;
+use warnings;
+
+use base qw(x11vnc::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub fillRunlevelScript
+{
+ my $self = shift;
+
+ my $script = unshiftHereDoc(<<" End-of-Here");
+ #!/bin/sh
+ # SuSE compatible start/stop script, generated via stage1 'x11vnc' plugin
+ # installation
+ #
+ # inspiration taken from x11vnc start script:
+ # Copyright 1998-2007 x11vnc, Inc. All rights reserved.
+ #
+ # This script manages the services needed to run x11vnc software
+
+ # Basic support for the Linux Standard Base Specification 1.3
+ ### BEGIN INIT INFO
+ # Provides: x11vnc
+ # Required-Start: \$syslog
+ # Required-Stop:
+ # Default-Start: 2 3 5
+ # Default-Stop: 0 6
+ # Short-Description: Manages the services needed to run x11vnc software
+ # Description: Manages the services needed to run x11vnc software
+ ### END INIT INFO
+
+ # load the helper stuff
+ . /etc/rc.status
+ # reset the script status
+ rc_reset
+
+ [ -f /opt/openslx/plugin-repo/x11vnc/x11vnc-init ] \\
+ && CMD="/opt/openslx/plugin-repo/x11vnc/x11vnc-init"
+
+ case \$1 in
+ start)
+ echo -n "Starting x11vnc background services ..."
+ \$CMD start
+ rc_status -v
+ ;;
+ stop)
+ # message output should match the given vendor-os
+ echo -n "Stopping x11vnc background services ..."
+ rc_reset
+ \$CMD stop
+ rc_status -v
+ ;;
+ #status)
+ # echo -n "Say something useful here ..."
+ #;;
+ restart)
+ "\$0" stop
+ "\$0" start
+ ;;
+ *)
+ echo "Usage: `basename "\$0"` {start|stop|restart}"
+ exit 1
+ ;;
+ esac
+ exit 0
+ End-of-Here
+ return $script;
+}
+
+1;
diff --git a/src/os-plugins/plugins/x11vnc/OpenSLX/Distro/Ubuntu.pm b/src/os-plugins/plugins/x11vnc/OpenSLX/Distro/Ubuntu.pm
new file mode 100644
index 00000000..3379f14d
--- /dev/null
+++ b/src/os-plugins/plugins/x11vnc/OpenSLX/Distro/Ubuntu.pm
@@ -0,0 +1,23 @@
+# Copyright (c) 2006, 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# x11vnc/OpenSLX/Distro/Ubuntu.pm
+# - provides Ubuntu-specific overrides of the Distro API for the x11vnc
+# plugin.
+# -----------------------------------------------------------------------------
+package x11vnc::OpenSLX::Distro::Ubuntu;
+
+use strict;
+use warnings;
+
+# inherit everything from Debian (as Ubuntu is based on it anyway)
+use base qw(x11vnc::OpenSLX::Distro::Debian);
+
+1;
diff --git a/src/os-plugins/plugins/x11vnc/OpenSLX/OSPlugin/x11vnc.pm b/src/os-plugins/plugins/x11vnc/OpenSLX/OSPlugin/x11vnc.pm
new file mode 100644
index 00000000..fe06648c
--- /dev/null
+++ b/src/os-plugins/plugins/x11vnc/OpenSLX/OSPlugin/x11vnc.pm
@@ -0,0 +1,221 @@
+# Copyright (c) 2007, 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# x11vnc.pm
+# -----------------------------------------------------------------------------
+package OpenSLX::OSPlugin::x11vnc;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSPlugin::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+sub new
+{
+ my $class = shift;
+ my $self = {
+ name => 'x11vnc',
+ };
+
+ return bless $self, $class;
+}
+
+sub getInfo
+{
+ my $self = shift;
+ return {
+ description => unshiftHereDoc(<<' End-of-Here'),
+ enables x11vnc server (user or xorg)
+ End-of-Here
+ # waits for xorg to add configuration if needed
+ precedence => 70,
+ };
+}
+
+sub getAttrInfo
+{
+ my $self = shift;
+
+ return {
+ 'x11vnc::active' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should the 'x11vnc' plugin be executed during boot?
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '1 means active - 0 means inactive',
+ default => '1',
+ },
+
+ 'x11vnc::mode' => {
+ applies_to_systems => 1,
+ applies_to_clients => 0,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ set x11vnc to listen on Xorg user sessions (default), general
+ access to the Xorg server (including displaymanager login) and
+ console framebuffer.
+ End-of-Here
+ content_regex => qr{^(x11user|x11mod|fb)$},
+ content_descr => 'x11user for user, x11mod for access via Xorg module or fb',
+ default => 'x11user',
+ },
+
+ 'x11vnc::scale' => {
+ applies_to_systems => 1,
+ applies_to_clients => 0,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ scale screen size (e.g. as fraction 2/3 or as decimal 0.5)
+ End-of-Here
+ content_regex => undef,
+ content_descr => undef,
+ default => '',
+ },
+
+ 'x11vnc::shared' => {
+ applies_to_systems => 1,
+ applies_to_clients => 0,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ by default x11vnc is always called with the -shared option
+ End-of-Here
+ content_regex => qr{^(yes|no|1|0)$},
+ content_descr => 'use 1 or yes to enable - 0 or no to disable',
+ default => 'yes',
+ },
+
+ 'x11vnc::force_viewonly' => {
+ applies_to_systems => 1,
+ applies_to_clients => 0,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ disable user interaction with vnc
+ End-of-Here
+ content_regex => qr{^(yes|no|1|0)$},
+ content_descr => 'use 1 or yes to enable - 0 or no to disable',
+ default => 'no',
+ },
+
+ 'x11vnc::auth_type' => {
+ applies_to_systems => 1,
+ applies_to_clients => 0,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ set authentication type of the vnc connection. rfbauth is
+ available for x11user and fb only.
+ End-of-Here
+ content_regex => qr{^(passwd|rfbauth|none)$},
+ content_descr => 'choose: passwd, rfbauth, none',
+ default => 'passwd',
+ },
+
+ 'x11vnc::allowed_hosts' => {
+ applies_to_systems => 1,
+ applies_to_clients => 0,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ set allowed hosts (multiple hosts are seperated by semicolons,
+ (simple) subnets are possible too e.g. "192.168.")
+ End-of-Here
+ content_regex => undef,
+ content_descr => undef,
+ default => '',
+ },
+
+ 'x11vnc::force_localhost' => {
+ applies_to_systems => 1,
+ applies_to_clients => 0,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ force x11vnc to only accept local connections and only listen
+ on the loopback device
+ End-of-Here
+ content_regex => qr{^(1|0|yes|no)$},
+ content_descr => 'use 1 or yes to enable - 0 or no to disable',
+ default => 'no',
+ },
+
+ 'x11vnc::pass' => {
+ applies_to_systems => 1,
+ applies_to_clients => 0,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ viewonly password (you can add multiple passwords seperated
+ by semicolons, if you're using rfbauth only the first one is
+ used)
+ End-of-Here
+ content_regex => undef,
+ content_descr => undef,
+ default => '',
+ },
+
+ 'x11vnc::viewonlypass' => {
+ applies_to_systems => 1,
+ applies_to_clients => 0,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ viewonly password (you can add multiple passwords seperated by
+ semicolons, disabled with rfb-auth)
+ End-of-Here
+ content_regex => undef,
+ content_descr => undef,
+ default => 'viewonly',
+ },
+
+ 'x11vnc::logging' => {
+ applies_to_systems => 1,
+ applies_to_clients => 0,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ enable logging
+ End-of-Here
+ content_regex => qr{^(1|0|yes|no)$},
+ content_descr => 'use 1 or yes to enable - 0 or no to disable',
+ default => 'yes',
+ },
+ };
+}
+
+sub installationPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ my $pluginRepositoryPath = $info->{'plugin-repo-path'};
+ my $pluginTempPath = $info->{'plugin-temp-path'};
+ my $openslxBasePath = $info->{'openslx-base-path'};
+
+ # should we distinguish between the two different packages!?
+ # libvnc should be part of the xorg package!? (so no check needed)
+ my $engine = $self->{'os-plugin-engine'};
+ if (!isInPath('x11vnc')) {
+ $engine->installPackages(
+ $engine->getInstallablePackagesForSelection('x11vnc')
+ );
+ } else {
+ vlog(3, "x11vnc is already installed");
+ }
+
+ # get path of files we need to install
+ my $pluginFilesPath = "$openslxBasePath/lib/plugins/$self->{'name'}/files";
+ my $script = $self->{distro}->fillRunlevelScript();
+
+ # copy all needed files now
+ copyFile("$pluginFilesPath/x11vnc-init", "$pluginRepositoryPath");
+
+ spitFile("/etc/init.d/x11vnc", $script);
+ chmod 0755, "/etc/init.d/x11vnc";
+
+ vlog(3, "install init file");
+
+}
+
+sub removalPhase
+{
+ my $self = shift;
+ my $info = shift;
+}
+
+1;
diff --git a/src/os-plugins/plugins/x11vnc/XX_x11vnc.sh b/src/os-plugins/plugins/x11vnc/XX_x11vnc.sh
new file mode 100644
index 00000000..3970e468
--- /dev/null
+++ b/src/os-plugins/plugins/x11vnc/XX_x11vnc.sh
@@ -0,0 +1,135 @@
+# Copyright (c) 2007..2009 - RZ Uni Freiburg
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# script is included from init via the "." load function - thus it has all
+# variables and functions available
+
+# check if the plugin config directory is generally available or if the client
+# configuration failed somehow
+[ -d /initramfs/plugin-conf ] || error "${init_picfg}" nonfatal
+
+# function to add vnc functionality to xorg server
+addvnc2xorg () {
+ sed -e '/^# autog/a# modified by x11vnc plugin (adding vnc module config)' \
+ -e '/\"Module\"/a\\ \ Load "vnc"' \
+ -e '/n \"Device\"/a\\ \ Option "usevnc" "yes"' \
+ -e '/n \"Device\"/a\\ \ Option "rfbauth" "/etc/X11/vncpasswd"' \
+ -e '/e \"Generic Mouse\"/a\\ \ InputDevice "VNC Keyboard" "ExtraKeyboard"' \
+ -e '/e \"Generic Mouse\"/a\\ \ InputDevice "VNC Mouse" "ExtraPointer"' \
+ -e '/\"CorePointer\"/ {
+a\
+EndSection\
+Section "InputDevice"\
+ Identifier "VNC Keyboard"\
+ Driver "rfbkeyb"\
+EndSection\
+Section "InputDevice"\
+ Identifier "VNC Mouse"\
+ Driver "rfbmouse"
+}' -i /mnt/etc/X11/xorg.conf
+}
+
+# main script
+if [ -e /initramfs/plugin-conf/x11vnc.conf ]; then
+ . /initramfs/plugin-conf/x11vnc.conf
+ if [ $x11vnc_active -ne 0 ]; then
+ [ $DEBUGLEVEL -gt 0 ] && echo "executing the 'x11vnc' os-plugin ...";
+ # configure x11vnc user mode or framebuffer
+ if [ "$x11vnc_mode" = "x11user" -o "$x11vnc_mode" = "fb" ] ; then
+ # create config dir for stage 3
+ mkdir -p /mnt/etc/x11vnc
+ # default parameters
+ PARAMS="-bg -forever"
+ # client restrictions
+ if [ -z x11vnc_allowed_hosts ]; then
+ PARAMS="$PARAMS -allow $x11vnc_allowd_hosts"
+ fi
+ # mode
+ case "$x11vnc_mode" in
+ x11user)
+ PARAMS="$PARAMS -display :0"
+ X11VNC_X11=1
+ ;;
+ fb)
+ PARAMS="$PARAMS -rawfb console"
+ ;;
+ esac
+ # auth type
+ case "$x11vnc_auth_type" in
+ passwd)
+ # use x11vnc passwd style - recommended
+ echo "$x11vnc_pass" > /mnt/etc/x11vnc/passwd
+ echo "__BEGIN_VIEWONLY__" >> /mnt/etc/x11vnc/passwd
+ echo "$x11vnc_viewonlypass" >> /mnt/etc/x11vnc/passwd
+ # multiuser handling
+ sed -i "s/,/\n/" /mnt/etc/x11vnc/passwd
+ # add parameter to commandline
+ PARAMS="$PARAMS -passwdfile rm:/etc/x11vnc/passwd"
+ ;;
+ rfbauth)
+ # use rfbauth
+ vncpasswd "$x11vnc_pass" > /mnt/etc/x11vnc/passwd
+ PARAMS="$PARAMS -rfbauth /etc/x11vnc/passwd"
+ ;;
+ *)
+ # no password
+ PARAMS="$PARAMS -nopw"
+ ;;
+ esac
+
+ # force viewonly
+ if [ "$x11vnc_force_viewonly" = "1" \
+ -o "$x11vnc_force_viewonly" = "yes" ]; then
+ PARAMS="$PARAMS -viewonly"
+ fi
+
+ # force localhost
+ if [ "$x11vnc_force_localhost" = "1" \
+ -o "$x11vnc_force_localhost" = "yes" ]; then
+ PARAMS="$PARAMS -localhost"
+ fi
+
+ # enable logging
+ if [ "$x11vnc_logging" = "1" -o "$x11vnc_logging" = "yes" ]; then
+ PARAMS="$PARAMS -o /var/log/x11vnc.log"
+ fi
+
+ # shared desktops
+ if [ "$x11vnc_shared" = "1" -o "$x11vnc_shared" = "yes" ]; then
+ PARAMS="$PARAMS -shared"
+ fi
+
+ # scale desktop
+ if [ "$x11vnc_scale" != "" ]; then
+ PARAMS="$PARAMS -scale $x11vnc_scale"
+ fi
+
+ # write config file
+ echo "# parameters generated by $0" > /mnt/etc/x11vnc/x11vnc.conf
+ echo "X11VNC_PARAMS=\"$PARAMS\"" >> /mnt/etc/x11vnc/x11vnc.conf
+ echo "X11VNC_X11=\"$X11VNC_X11\"" >> /mnt/etc/x11vnc/x11vnc.conf
+
+ rllinker "x11vnc" 30 10
+
+ [ $DEBUGLEVEL -gt 0 ] && echo "done with 'x11vnc' os-plugin ...";
+
+ # x11mod offers access to the running X server via module
+ elif [ "$x11vnc_mode" = "x11mod" ]; then
+ # password setting (use stage4 environment)
+ echo -e "$x11vnc_pass\n$x11vnc_viewonlypass" | chroot /mnt vncpasswd -f \
+ > /mnt/etc/X11/vncpasswd
+ ( waitfor /mnt/etc/X11/xorg.conf 10000; addvnc2xorg ) &
+ fi
+ fi
+else
+ [ $DEBUGLEVEL -gt 2 ] && \
+ echo "No configuration file found for x11vnc plugin."
+fi
diff --git a/src/os-plugins/plugins/x11vnc/files/x11vnc-init b/src/os-plugins/plugins/x11vnc/files/x11vnc-init
new file mode 100755
index 00000000..548b2114
--- /dev/null
+++ b/src/os-plugins/plugins/x11vnc/files/x11vnc-init
@@ -0,0 +1,83 @@
+#!/bin/bash
+# --------------------------------
+# /etc/init.d/x11vnc
+# --------------------------------
+
+if [ -f /etc/x11vnc/x11vnc.conf ]
+then
+ . /etc/x11vnc/x11vnc.conf
+fi
+
+# find xauthority file
+find_xauth () {
+ FOUND=0
+ RETRIES=4
+ [ -z "$1" ] || RETRIES="$1"
+
+ [ -e "/var/lib/kdm/" ] &&
+ XAUTHFILE_KDM=`find /var/lib/kdm/ -iname "A\:0-*"`
+ [ -e "/var/run/xauth/" ] &&
+ XAUTHFILE_KDM2=`find /var/run/xauth/ -iname "A\:0-*"`
+ [ -e "/var/lib/xdm/authdir/authfiles/" ] &&
+ XAUTHFILE_XDM=`find /var/lib/xdm/authdir/authfiles/ -iname "A\:0-*"`
+ [ -e "/var/lib/gdm/" ] &&
+ XAUTHFILE_GDM=`find /var/lib/gdm/ -iname *Xauth*`
+
+ [ -f "$XAUTHFILE_KDM" ] && FOUND=1 && XAUTHORITY="$XAUTHFILE_KDM"
+ [ -f "$XAUTHFILE_KDM2" ] && FOUND=1 && XAUTHORITY="$XAUTHFILE_KDM2"
+ [ -f "$XAUTHFILE_XDM" ] && FOUND=1 && XAUTHORITY="$XAUTHFILE_XDM"
+ [ -f "$XAUTHFILE_GDM" ] && FOUND=1 && XAUTHORITY="$XAUTHFILE_GDM"
+
+ if [ "$FOUND" -eq "0" ]; then
+ if [ "$RETRIES" -gt "0" ]; then
+ let "RETRIES-=1"
+ find_xauth "$RETRIES"
+ else
+ echo "start FAILED (can't find way to authenticate myself against X)" >>/var/log/x11vnc.debug
+ exit -1
+ fi
+ else
+ echo "found authfile ($XAUTHORITY)" >>/var/log/x11vnc.debug
+ fi
+}
+
+START_COMMAND="x11vnc"
+
+case "$1" in
+ start)
+
+ if [ ! -f /etc/x11vnc/passwd ]; then
+ echo " start FAILED (/etc/x11vnc/passwd not found)" >>/var/log/x11vnc.debug
+ echo " Create it manualy and retry starting x11vnc" >>/var/log/x11vnc.debug
+ exit -1;
+ fi
+
+ #su -c "$COMMAND" -l x11vnc &
+ if [ $X11VNC_X11 = 1 ]; then
+ find_xauth
+ START_COMMAND="$START_COMMAND -auth $XAUTHORITY $X11VNC_PARAMS"
+ else
+ START_COMMAND="$START_COMMAND $X11VNC_PARAMS"
+ fi
+ OUTPUT=`$START_COMMAND`
+ echo "$START_COMMAND" >>/var/log/x11vnc.debug
+ echo "$OUTPUT" >>/var/log/x11vnc.debug
+ ;;
+ stop)
+ pid=`pidof x11vnc`
+ if [ -z "$pid" ]
+ then
+ echo "x11vnc not running" >>/var/log/x11vnc.debug
+ exit -1;
+ else
+ kill -9 $pid
+ echo "x11vnc stopped" >>/var/log/x11vnc.debug
+ fi
+
+ ;;
+ *)
+ echo "x11vnc startscript"
+ echo "Usage: $0 (start|stop)"
+ ;;
+esac
+exit 0
diff --git a/src/os-plugins/plugins/xen/OpenSLX/OSPlugin/xen.pm b/src/os-plugins/plugins/xen/OpenSLX/OSPlugin/xen.pm
new file mode 100644
index 00000000..12331983
--- /dev/null
+++ b/src/os-plugins/plugins/xen/OpenSLX/OSPlugin/xen.pm
@@ -0,0 +1,185 @@
+# Copyright (c) 2010 - RZ Uni Freiburg
+# Copyright (c) 2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# xen.pm
+# - implementation of the 'xen' plugin
+# -----------------------------------------------------------------------------
+package OpenSLX::OSPlugin::xen;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSPlugin::Base);
+
+use File::Path;
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+sub new
+{
+ my $class = shift;
+
+ my $self = {
+ name => 'xen',
+ };
+
+ return bless $self, $class;
+}
+
+sub getInfo
+{
+ my $self = shift;
+
+ return {
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Configures Xen diskless boot, no installation yet.
+ End-of-Here
+ precedence => 10,
+ };
+}
+
+sub getAttrInfo
+{
+ my $self = shift;
+
+ return {
+ 'xen::active' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should the 'xen'-plugin be executed during boot?
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '1 means active - 0 means inactive',
+ # set active to 0, later set specially created Xen system to 1
+ default => '0',
+ },
+ # attribute 'imagesrc' defines where we can find xen images
+ 'xen::imagesrc' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Where do we store our xen images? NFS? Filesystem?
+ End-of-Here
+ content_regex => qr{^(/|nfs://)},
+ content_descr => 'local path or URI or "-" (unset)',
+ default => undef,
+ },
+ # attribute 'tftpdir' defines TFTP dir for network boots /w NAT
+ 'xen::tftpdir' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Do you want to define a stage 4 TFTP dir for netwoork boots?
+ Needed to boot Xen via NFS, we only need the initramfs
+ Hint: Mount your TFTP ro via NFS to a local dir
+ End-of-Here
+ content_regex => qr{^(/)},
+ content_descr => 'local path or "-" (unset)',
+ default => undef,
+ },
+ };
+}
+
+sub installationPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ $self->{pluginRepositoryPath} = $info->{'plugin-repo-path'};
+ $self->{openslxBasePath} = $info->{'openslx-base-path'};
+
+ # Copy run-virt.include and template files to the appropriate place for
+ # inclusion in stage4
+ my $pluginName = $self->{'name'};
+ my $pluginBasePath =
+ "$self->{openslxBasePath}/lib/plugins/$pluginName/files";
+
+ foreach my $file ( qw( run-virt.include machine.include hvm.include ) ) {
+ copyFile("$pluginBasePath/$file", "$self->{pluginRepositoryPath}/");
+ chmod 0644, "$self->{pluginRepositoryPath}/$file";
+ }
+
+ return;
+}
+
+sub removalPhase
+{
+ my $self = shift;
+ my $info = shift;
+
+ return;
+}
+
+sub suggestAdditionalKernelModules
+{
+ my $self = shift;
+ my $makeInitRamFSEngine = shift;
+
+ my @suggestedModules;
+
+ # Xen needs bridge module, for guests xennet and maybe xenblk
+ # earlier versions needed netloop
+ push @suggestedModules, qw( bridge xennet xenblk );
+
+ return @suggestedModules;
+}
+
+#sub _xenLabel
+#{
+# # set label for each Xen system
+# foreach my $info (@$systemInfos) {
+# if ($info->{xen::active} eq 1) {
+# my $label = $info->{label} || '';
+# if (!length($label) || $label eq $info->{name}) {
+# if ($info->{name} =~ m{^(.+)::(.+)$}) {
+# my $system = $1;
+# my $exportType = $2;
+# $label = $system . "-xen" . ' ' x (36-length($system))
+# . $exportType;
+# } else {
+# $label = $info->{name};
+# }
+# }
+# }
+# $info->{pxeLabel} = $label;
+# }
+# return $info; #???
+#}
+
+#sub _xenBootEntry
+#{
+# # Xen entries look different
+# # Example:
+# # KERNEL mboot.c32 vendor-os/xen.gz dom0_mem=128000 ---
+# # vendor-os/vmlinuz-xen debug=3 --- vendor-os/initramfs-1
+# # TODO: versionsort oder per attr?
+# if ($info->{xen::active} eq 1) {
+# my $xenKernel = slxsystem(ls /boot/xen* | sort | tail -n 1);
+# $append .= " file=$bootURI" if length($bootURI);
+# $append .= " file=$tftpPrefix" if length($tftpPrefix);
+# $append .= " $clientAppend";
+# $append .= " --- $pxePrefix$vendorOSName/$info->{'initramfs-name'}";
+# $slxLabels .= "LABEL openslx-$info->{'external-id'}-xen\n";
+# # $slxLabels .= $pxeDefault;
+# $slxLabels .= "\tMENU LABEL ^$info->{pxeLabel}\n";
+# $slxLabels .= "\tKERNEL mboot.c32\n";
+# $slxLabels .= "\tAPPEND $pxePrefix$vendorOSName/$xenKernel";
+# # $slxLabels .= " dom0_mem=128000";
+# $slxLabels .= " --- $pxePrefix$vendorOSName/$kernelName";
+# $slxLabels .= " --- $append\n";
+# $slxLabels .= "\tIPAPPEND 3\n";
+# }
+# return $slxLabels;
+#}
+
+1;
diff --git a/src/os-plugins/plugins/xen/XX_xen.sh b/src/os-plugins/plugins/xen/XX_xen.sh
new file mode 100644
index 00000000..7dddeee0
--- /dev/null
+++ b/src/os-plugins/plugins/xen/XX_xen.sh
@@ -0,0 +1,73 @@
+# Copyright (c) 2010 - RZ Uni Freiburg
+# Copyright (c) 2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# stage3 part of 'xen' plugin - the runlevel script
+#
+# script is included from init via the "." load function - thus it has all
+# variables and functions available
+
+# include default directories
+. /etc/openslx.conf
+
+CONFFILE=/initramfs/plugin-conf/xen.conf
+PLUGINCONFDIR=/mnt/${OPENSLX_DEFAULT_CONFDIR}/plugins/xen
+PLUGINDIR=/mnt/${OPENSLX_DEFAULT_DIR}/plugin-repo/xen
+VIRTDIR=/mnt/${OPENSLX_DEFAULT_VIRTDIR}/xen
+
+# check if the configuration file is available
+if [ -e ${CONFFILE} ]; then
+
+ # load needed variables
+ . ${CONFFILE}
+
+ # Test if this plugin is activated... more or less useless with the
+ # new plugin system
+ if [ $xen_active -ne 0 2>/dev/null ]; then
+
+ [ $DEBUGLEVEL -gt 0 ] && echo "executing the 'xen' os-plugin ...";
+
+ # load general configuration
+ . /etc/initramfs-setup
+
+ # get source of xen image server (get type, server and path)
+ if strinstr "/" "${xen_imagesrc}" ; then
+ vbimgprot=$(uri_token ${xen_imagesrc} prot)
+ vbimgserv=$(uri_token ${xen_imagesrc} server)
+ vbimgpath="$(uri_token ${xen_imagesrc} path)"
+ fi
+ if [ -n "${vbimgserv}" ] ; then
+ # directory where qemu images are expected in
+ mnttarget=${VIRTDIR}
+ # mount the xen image source readonly (ro)
+ fsmount ${vbimgprot} ${vbimgserv} ${vbimgpath} ${mnttarget} ro
+ else
+ [ $DEBUGLEVEL -gt 1 ] && \
+ error " * Incomplete information in variable ${xen_imagesrc}." \
+ nonfatal
+ fi
+
+ # copy virtualization include files to config dir
+ testmkd ${PLUGINCONFDIR}
+ testmkd /mnt/var/log/xen
+ testmkd /mnt/var/run/xend
+ testmkd /mnt/var/run/xenstored
+ cp ${PLUGINDIR}/*.include ${PLUGINCONFDIR}
+ # copy ${CONFFILE} to ${PLUGINCONFDIR} just in case
+ cp ${CONFFILE} ${PLUGINCONFDIR}
+
+ # activate init files
+ # TODO: in xen-slx start
+ # increase loop devices for loop images
+ modprobe -q loop max_loop=64 >/tmp/xen.log 2>&1
+ rllinker "xendomains" 14 8
+ rllinker "xend" 13 9
+ fi
+fi
diff --git a/src/os-plugins/plugins/xen/files/hvm.include b/src/os-plugins/plugins/xen/files/hvm.include
new file mode 100644
index 00000000..beb9315a
--- /dev/null
+++ b/src/os-plugins/plugins/xen/files/hvm.include
@@ -0,0 +1,209 @@
+# This is an machine template for run-virt.include of the Xen plugin.
+# This template was taken from an example in openSUSE 11.2
+# HVM template
+
+cat <<EOF
+# -*- mode: python; -*-
+#============================================================================
+# Python configuration setup for 'xm create'.
+# This configuration was created through $0 on $(date)
+#============================================================================
+
+import os, re
+
+arch_libdir = 'lib'
+arch = os.uname()[4]
+if os.uname()[0] == 'Linux' and re.search('64', arch):
+ arch_libdir = 'lib64'
+
+#----------------------------------------------------------------------------
+# Kernel image file.
+kernel = "/usr/lib/xen/boot/hvmloader"
+
+# The domain build function. HVM domain uses 'hvm'.
+builder='hvm'
+
+# Initial memory allocation (in megabytes) for the new domain.
+memory = ${mem}
+
+# Shadow pagetable memory for the domain, in MB.
+# If not explicictly set, xend will pick an appropriate value.
+# Should be at least 2KB per MB of domain memory, plus a few MB per vcpu.
+#shadow_memory = 8
+
+# A name for your domain. All domains must have different names.
+name = "${vm_name}"
+
+#-----------------------------------------------------------------------------
+# The number of cpus guest platform has, default=1
+#vcpus=1
+
+# Enable/disable HVM guest PAE, default=1 (enabled)
+#pae=1
+
+# Enable/disable HVM guest ACPI, default=1 (enabled)
+#acpi=1
+
+# Enable/disable HVM APIC mode, default=1 (enabled)
+# Note that this option is ignored if vcpus > 1
+#apic=1
+
+# Enable/disable extended power management support within HVM guest, i.e., beyond
+# S3, S4, S5 within guest like exposing battery meter.
+# 0 (default option, extended power management support disabled)
+# 1 (pass-through mode; uses pass-through as needed; efficient but limited in scope)
+# 2 (non pass-through mode; extended scope, likely to work on all applicable environment
+# but comparitively less efficient than pass-through mode)
+# xen_extended_power_mgmt=0
+
+# List of which CPUS this domain is allowed to use, default Xen picks
+#cpus = "" # leave to Xen to pick
+#cpus = "0" # all vcpus run on CPU0
+#cpus = "0-3,5,^1" # all vcpus run on cpus 0,2,3,5
+#cpus = ["2", "3"] # VCPU0 runs on CPU2, VCPU1 runs on CPU3
+
+#----------------------------------------------------------------------------
+# Optionally define mac and/or bridge for the network interfaces.
+# Random MACs are assigned if not given.
+#vif = [ 'type=ioemu, mac=00:16:3e:00:00:11, bridge=xenbr0, model=ne2k_pci' ]
+# type=ioemu specify the NIC is an ioemu device not netfront
+#vif = [ 'type=ioemu, bridge=xenbr0' ]
+vif = [ '${xen_vif}' ]
+
+#----------------------------------------------------------------------------
+# Define the disk devices you want the domain to have access to, and
+# what you want them accessible as.
+# Each disk entry is of the form phy:UNAME,DEV,MODE
+# where UNAME is the device, DEV is the device name the domain will see,
+# and MODE is r for read-only, w for read-write.
+#disk = [ 'phy:hda1,hda1,r' ]
+#disk = [ 'file:/var/lib/xen/images/disk.img,ioemu:hda,w', ',hdc:cdrom,r' ]
+disk = [ '${xen_disk}' ]
+
+#----------------------------------------------------------------------------
+# Configure the behaviour when a domain exits. There are three 'reasons'
+# for a domain to stop: poweroff, reboot, and crash. For each of these you
+# may specify:
+# "destroy", meaning that the domain is cleaned up as normal;
+# "restart", meaning that a new domain is started in place of the old
+# one;
+# "preserve", meaning that no clean-up is done until the domain is
+# manually destroyed (using xm destroy, for example); or
+# "rename-restart", meaning that the old domain is not cleaned up, but is
+# renamed and a new domain started in its place.
+# In the event a domain stops due to a crash, you have the additional options:
+# "coredump-destroy", meaning dump the crashed domain's core and then destroy;
+# "coredump-restart', meaning dump the crashed domain's core and the restart.
+# The default is
+# on_poweroff = 'destroy'
+# on_reboot = 'restart'
+# on_crash = 'restart'
+#on_poweroff = 'destroy'
+#on_reboot = 'restart'
+#on_crash = 'restart'
+
+#============================================================================
+# HVM specific
+#============================================================================
+# Device Model to be used
+device_model = '/usr/' + arch_libdir + '/xen/bin/qemu-dm'
+
+#-----------------------------------------------------------------------------
+# boot on floppy (a), hard disk (c), Network (n) or CD-ROM (d)
+# default: hard disk, cd-rom, floppy
+#boot="cda"
+
+#-----------------------------------------------------------------------------
+# write to temporary files instead of disk image files
+#snapshot=1
+
+#----------------------------------------------------------------------------
+# enable SDL library for graphics, default = 0
+sdl=0
+
+#----------------------------------------------------------------------------
+# enable OpenGL for texture rendering inside the SDL window, default = 1
+# valid only if sdl is enabled.
+opengl=1
+
+#----------------------------------------------------------------------------
+# enable VNC library for graphics, default = 1
+vnc=1
+
+#----------------------------------------------------------------------------
+# address that should be listened on for the VNC server if vnc is set.
+# default is to use 'vnc-listen' setting from /etc/xen/xend-config.sxp
+#vnclisten="127.0.0.1"
+
+#----------------------------------------------------------------------------
+# set VNC display number, default = domid
+#vncdisplay=1
+
+#----------------------------------------------------------------------------
+# try to find an unused port for the VNC server, default = 1
+#vncunused=1
+
+#----------------------------------------------------------------------------
+# set password for domain's VNC console
+# default is depents on vncpasswd in xend-config.sxp
+vncpasswd=''
+
+#----------------------------------------------------------------------------
+# no graphics, use serial port
+#nographic=0
+
+#----------------------------------------------------------------------------
+# enable stdvga, default = 0 (use cirrus logic device model)
+stdvga=0
+
+#-----------------------------------------------------------------------------
+# serial port re-direct to pty deivce, /dev/pts/n
+# then xm console or minicom can connect
+serial='pty'
+
+
+#-----------------------------------------------------------------------------
+# Qemu Monitor, default is disable
+# Use ctrl-alt-2 to connect
+#monitor=1
+
+
+#-----------------------------------------------------------------------------
+# enable sound card support, [sb16|es1370|all|..,..], default none
+#soundhw='sb16'
+
+
+#-----------------------------------------------------------------------------
+# set the real time clock to local time [default=0 i.e. set to utc]
+#localtime=1
+
+
+#-----------------------------------------------------------------------------
+# set the real time clock offset in seconds [default=0 i.e. same as dom0]
+#rtc_timeoffset=3600
+
+#-----------------------------------------------------------------------------
+# start in full screen
+#full-screen=1
+
+
+#-----------------------------------------------------------------------------
+# Enable USB support (specific devices specified at runtime through the
+# monitor window)
+#usb=1
+# Enable USB mouse support (only enable one of the following, `mouse' for
+# PS/2 protocol relative mouse, `tablet' for
+# absolute mouse)
+#usbdevice='mouse'
+#usbdevice='tablet'
+
+#-----------------------------------------------------------------------------
+# Set keyboard layout, default is en-us keyboard.
+#keymap='de'
+
+#-----------------------------------------------------------------------------
+# Enable/disable xen platform PCI device, default=1 (enabled)
+#xen_platform_pci=1
+
+#============================================================================
+EOF
diff --git a/src/os-plugins/plugins/xen/files/machine.include b/src/os-plugins/plugins/xen/files/machine.include
new file mode 100644
index 00000000..06848949
--- /dev/null
+++ b/src/os-plugins/plugins/xen/files/machine.include
@@ -0,0 +1,167 @@
+# This is an machine template for run-virt.include of the Xen plugin.
+# This template was taken from an example in openSUSE 11.2
+
+cat <<EOF
+# -*- mode: python; -*-
+#============================================================================
+# Python configuration setup for 'xm create'.
+# This configuration was created through $0 on $(date)
+#============================================================================
+
+#----------------------------------------------------------------------------
+# Kernel image file and (optional) ramdisk (initrd).
+kernel = "${xen_kernel}"
+ramdisk = "${xen_ramdisk}"
+
+# Or use domUloader instead of kernel/ramdisk to get kernel from domU FS
+#bootloader = "/usr/lib/xen/boot/domUloader.py"
+#bootentry = "hda1:/${xen_kernel},/${xen_ramdisk}"
+# TODO: check these:
+#bootargs="--entry=xvda2:/boot/vmlinuz-xen,/boot/initrd-xen"
+
+localtime=0
+
+# The domain build function. Default is 'linux', HVM domain uses 'hvm'.
+builder = 'linux'
+
+# Initial memory allocation (in megabytes) for the new domain.
+memory = ${mem}
+
+# A name for your domain. All domains must have different names.
+name = "${vm_name}"
+
+# List of which CPUS this domain is allowed to use, default Xen picks
+#cpus = "" # leave to Xen to pick
+#cpus = "0" # all vcpus run on CPU0
+#cpus = "0-3,5,^1" # run on cpus 0,2,3,5
+#cpus = "${xen_cpus}"
+
+# Number of Virtual CPUS to use, default is 1
+#vcpus = ${xen_vcpus}
+
+#----------------------------------------------------------------------------
+# Define network interfaces.
+
+# By default, no network interfaces are configured. You may have one created
+# with sensible defaults using an empty vif clause:
+# vif = [ '' ]
+# or optionally override backend, bridge, ip, mac, script, type, or vifname:
+# vif = [ 'mac=00:16:3e:00:00:11, bridge=xenbr0' ]
+# or more than one interface may be configured:
+# vif = [ '', 'bridge=xenbr1' ]
+vif = [ '${xen_vif}' ]
+
+#----------------------------------------------------------------------------
+# Define the disk devices you want the domain to have access to, and
+# what you want them accessible as.
+# Each disk entry is of the form phy:UNAME,DEV,MODE
+# where UNAME is the device, DEV is the device name the domain will see,
+# and MODE is r for read-only, w for read-write.
+# disk = [ 'phy:hda1,hda1,w' ]
+${xen_disk}
+
+#----------------------------------------------------------------------------
+# Define frame buffer device.
+# By default, no frame buffer device is configured.
+# To create one using the SDL backend and sensible defaults:
+# vfb = [ 'type=sdl' ]
+# This uses environment variables XAUTHORITY and DISPLAY. You
+# can override that:
+# vfb = [ 'type=sdl,xauthority=/home/bozo/.Xauthority,display=:1' ]
+# To create one using the VNC backend and sensible defaults:
+# vfb = [ 'type=vnc' ]
+# The backend listens on 127.0.0.1 port 5900+N by default, where N is
+# the domain ID. You can override both address and N:
+# vfb = [ 'type=vnc,vnclisten=127.0.0.1,vncdisplay=1' ]
+# Or you can bind the first unused port above 5900:
+# vfb = [ 'type=vnc,vnclisten=0.0.0.0,vnunused=1' ]
+# You can override the password:
+# vfb = [ 'type=vnc,vncpasswd=MYPASSWD' ]
+# Empty password disables authentication. Defaults to the vncpasswd
+# configured in xend-config.sxp.
+
+#----------------------------------------------------------------------------
+# Define to which TPM instance the user domain should communicate.
+# The vtpm entry is of the form 'instance=INSTANCE,backend=DOM'
+# where INSTANCE indicates the instance number of the TPM the VM
+# should be talking to and DOM provides the domain where the backend
+# is located.
+# Note that no two virtual machines should try to connect to the same
+# TPM instance. The handling of all TPM instances does require
+# some management effort in so far that VM configration files (and thus
+# a VM) should be associated with a TPM instance throughout the lifetime
+# of the VM / VM configuration file. The instance number must be
+# greater or equal to 1.
+#vtpm = [ 'instance=1,backend=0' ]
+
+#----------------------------------------------------------------------------
+# Set the kernel command line for the new domain.
+# You only need to define the IP parameters and hostname if the domain's
+# IP config doesn't, e.g. in ifcfg-eth0 or via DHCP.
+# You can use 'extra' to set the runlevel and custom environment
+# variables used by custom rc scripts (e.g. VMID=, usr= ).
+
+# Set if you want dhcp to allocate the IP address.
+dhcp="${xen_dhcp}"
+# Set netmask.
+#netmask=
+# Set default gateway.
+#gateway=
+# Set the hostname.
+hostname= "${hostname}"
+
+# Set root device (eg. /dev/hda1).
+root = "${xen_root}"
+
+# Root device for nfs.
+#root = "/dev/nfs"
+# The nfs server.
+#nfs_server = '169.254.1.0'
+# Root directory on the nfs server.
+#nfs_root = '/full/path/to/root/directory'
+
+# Extra arguments to pass to the kernel.
+# Eg: set runlevel
+extra = "${xen_extra}"
+
+#----------------------------------------------------------------------------
+# Configure the behaviour when a domain exits. There are three 'reasons'
+# for a domain to stop: poweroff, reboot, and crash. For each of these you
+# may specify:
+# "destroy", meaning that the domain is cleaned up as normal;
+# "restart", meaning that a new domain is started in place of the old
+# one;
+# "preserve", meaning that no clean-up is done until the domain is
+# manually destroyed (using xm destroy, for example); or
+# "rename-restart", meaning that the old domain is not cleaned up, but is
+# renamed and a new domain started in its place.
+# In the event a domain stops due to a crash, you have the additional options:
+# "coredump-destroy", meaning dump the crashed domain's core and then destroy;
+# "coredump-restart', meaning dump the crashed domain's core and the restart.
+# The default is
+# on_poweroff = 'destroy'
+# on_reboot = 'restart'
+# on_crash = 'restart'
+#on_poweroff = 'destroy'
+#on_reboot = 'restart'
+#on_crash = 'restart'
+
+#-----------------------------------------------------------------------------
+# Configure PVSCSI devices:
+# PDEV gives physical SCSI device to be attached to specified guest
+# domain by one of the following identifier format.
+# - XX:XX:XX:XX (4-tuples with decimal notation which shows
+# "host:channel:target:lun")
+# - /dev/sdxx or sdx
+# - /dev/stxx or stx
+# - /dev/sgxx or sgx
+# - result of 'scsi_id -gu -s'.
+# ex. # scsi_id -gu -s /block/sdb
+# 36000b5d0006a0000006a0257004c0000
+# VDEV gives virtual SCSI device by 4-tuples (XX:XX:XX:XX) as
+# which the specified guest domain recognize.
+#vscsi = [ 'PDEV, VDEV' ]
+#vscsi = [ '/dev/sdx, 0:0:0:0' ]
+
+#============================================================================
+EOF
diff --git a/src/os-plugins/plugins/xen/files/run-virt.include b/src/os-plugins/plugins/xen/files/run-virt.include
new file mode 100644
index 00000000..36a1d1f4
--- /dev/null
+++ b/src/os-plugins/plugins/xen/files/run-virt.include
@@ -0,0 +1,157 @@
+# run-virt.include
+# -----------------------------------------------------------------------------
+# Copyright (c) 2010 - RZ Uni Freiburg
+# Copyright (c) 2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+# -----------------------------------------------------------------------------
+# run-virt.include
+# - Include script for running Xen on an OpenSLX client via the run-virt.sh
+# or run-vmgrid.sh
+################################################################################
+
+################################################################################
+### Include general configuration
+################################################################################
+if [ -f ${OPENSLX_DEFAULT_CONFDIR}/plugins/${self}/${self}.conf ]; then
+ . ${OPENSLX_DEFAULT_CONFDIR}/plugins/${self}/${self}.conf
+else
+ writelog "Problems reading config file of ${self} plugin"
+ exit 1
+fi
+
+################################################################################
+### Declaration of default variables
+################################################################################
+
+PLUGINCONFXEN="${PLUGINCONFROOT}/${self}"
+# create TMPDIR for all users
+mkdir -m 1777 /tmp/${self} 2>/dev/null
+# dir for configs
+confdir="/tmp/${self}/${USER}/${VM_ID}"
+# use vm_shortname for VM name since vm_name can be very long
+# add id so we can start more tahn one of the same image
+vm_name="${vm_shortname}-${VM_ID}"
+conffile=${confdir}/${vm_name}
+# define dirs and files which can be removed after exit, be carefull!
+rm -rf ${confdir} 2>/dev/null
+mkdir -p ${confdir} 2>/dev/null
+
+xen_kernel=${kernel:-"/boot/vmlinuz-xen"}
+xen_ramdisk=${initramfs:-"/boot/initrd-xen"}
+xen_extra="xencons=tty 3"
+[ -n "${imgname}" ] && xen_disk="disk = [ 'file:${vmpath},hda1,r' ]"
+
+writelog "Directories:"
+writelog "\tConfig dir:\t\t$confdir"
+
+################################################################################
+### Hardware checks
+################################################################################
+
+# memory part equal to vmware plugin
+# percentage of memory to use for virtualbox in standard case
+if [ -n "${forcemem}" ]; then
+ mem="${forcemem}"
+else
+ permem=30
+ if [ "${totalmem}" -ge "1600" ]; then
+ permem=40
+ fi
+ # check if /tmp is on harddisk
+ if grep -qe "/dev/.* /tmp " /proc/mounts ; then
+ permem=60
+ id44="1"
+ # Hack, if more than 2,5G RAM use 40% of Ram and write vmem into Ram as well
+ # (40% vmware | 40% confdir(vmem...) | 20% host
+ # VMplayer 2+ issue
+ # TODO: makes this sense for vbox?
+ #if [ "${totalmem}" -ge "2500" ]; then
+ #permem=40
+ #rmdir ${snapshotdir}
+ #snapshotdirold=${snapshotdir}
+ #snapshotdir=/dev/shm/${self}/${USER}/${VM_ID}
+ #mkdir -p ${snapshotdir}
+ #ln -sf ${snapshotdir} ${snapshotdirold}
+ #fi
+ fi
+ mem=$(expr ${totalmem} / 100 \* ${permem})
+ if [ "${id44}" = "1" ]; then
+ memhost=$(expr ${totalmem} - ${mem})
+ else
+ memhost=$(expr ${totalmem} - ${mem} - ${mem})
+ fi
+ #permem=40
+ #mem=$(expr ${totalmem} * ${permem})
+ if [ "${mem}" -lt "256" ] || [ "${memhost}" -lt "256" ]; then
+ writelog "Memory out of range: ${mem} MB (guest) / ${memhost} MB (host)!"
+ writelog "Min. 256 MB for host and guest!"
+ exit 1
+ fi
+fi
+
+# translate network kinds (nat, bridged, host-only)
+case "${network_kind}" in
+ bridge*)
+ xen_vif="mac=$macaddr, bridge=br0"
+ ;;
+ *)
+ xen_vif="mac=$macaddr"
+esac
+xen_dhcp="dhcp" # off
+
+# translate boot, use if set else set to disk
+xen_root=/dev/hda1
+case ${boot} in
+ n*|tftp)
+ pxe_label=$(grep -o 'pxe_label param=.*"' ${xmlfile} \
+ | sed -e "s/&.*;/; /g" | awk -F '"' '{print $2}')
+ pxe_label=$(grep -A 3 "^LABEL *${pxe_label}" \
+ ${xen_tftpdir}/pxelinux.cfg/default 2>/dev/null \
+ | grep "^ *KERNEL ")
+ if [ -n "${pxe_label}" ] && [ -n "${xen_tftpdir}" ]; then
+ xen_root=/dev/nfs
+ xen_kernel="${xen_tftpdir}/$(echo ${pxe_label} \
+ | awk -F " --- " '{print $2}' | awk '{print $1}')"
+ xen_ramdisk="${xen_tftpdir}/$(echo ${pxe_label} \
+ | awk -F " --- " '{print $3}')"
+ fi
+ ;;
+ # later maybe c|disk|hd*|sd*) for HD and d|cd*) for CD-ROM
+ *)
+ xen_root=/dev/hda1
+ ;;
+esac
+
+[ ${diskless} -eq 0 ] && writelog "Diskimage:"
+[ ${diskless} -eq 0 ] && writelog "\tMachine diskfile:\t$vmpath"
+writelog "Virtual Hardware:"
+writelog "\tGuest RAM:\t\t${mem} MB"
+# echo nur wenn memhost gesetzt
+[ -n "${memhost}" ] && writelog "\tHost RAM:\t\t${memhost} MB"
+writelog "\tMAC address:\t\t$macaddr"
+
+################################################################################
+### Pepare and configure virtual machine and disk image
+################################################################################
+
+. ${PLUGINCONFXEN}/machine.include > ${conffile}
+
+################################################################################
+### finally set env for run-virt.sh
+################################################################################
+
+# set the variables appropriately (several interfaces with different names)
+VIRTCMD=$(which xm 2>/dev/null)
+# '-c' for console, no graphical output available, later vnc possible
+VIRTCMDOPTS="create -c ${conffile}"
+
+# set headless mode
+VIRTCMDHL=$(which xm 2>/dev/null)
+VIRTCMDOPTSHL="create ${conffile}"
diff --git a/src/os-plugins/plugins/xen/init-hooks/10-nw-if-config/xennet.sh b/src/os-plugins/plugins/xen/init-hooks/10-nw-if-config/xennet.sh
new file mode 100644
index 00000000..d514b68d
--- /dev/null
+++ b/src/os-plugins/plugins/xen/init-hooks/10-nw-if-config/xennet.sh
@@ -0,0 +1,4 @@
+# load xennet if necessary, usualy within a NFS VM
+if grep -q "Xen Virtual Ethernet Card" /etc/hwinfo.netcard-usbctrl; then
+ modprobe xennet >/tmp/xennet.log 2>&1
+fi
diff --git a/src/os-plugins/plugins/xen/init-hooks/20-nw-bridge-config/bridge.sh b/src/os-plugins/plugins/xen/init-hooks/20-nw-bridge-config/bridge.sh
new file mode 100755
index 00000000..d5245234
--- /dev/null
+++ b/src/os-plugins/plugins/xen/init-hooks/20-nw-bridge-config/bridge.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# Init hook to create a bridge on the active network interface
+# (should be kept identical to the files of virtualbox and qemukvm plugins)
+#############################################################################
+
+local bridge=br0
+local brnwif=${nwif}
+local nwifmac=${macaddr}
+
+# bridge 0 already defined or some other problem
+brctl addbr ${bridge} || exit 0
+brctl stp ${bridge} 0
+brctl setfd ${bridge} 0.000000000001
+ip link set addr ${nwifmac} ${bridge}
+ip link set dev ${nwif} up
+brctl addif ${bridge} ${nwif}
+
+# fixme: sending back the variable to init does not work properly at the
+# moment
+nwif=${bridge}
diff --git a/src/os-plugins/plugins/xserver/OpenSLX/Distro/Base.pm b/src/os-plugins/plugins/xserver/OpenSLX/Distro/Base.pm
new file mode 100644
index 00000000..51c1c60b
--- /dev/null
+++ b/src/os-plugins/plugins/xserver/OpenSLX/Distro/Base.pm
@@ -0,0 +1,212 @@
+# Copyright (c) 2008..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# xserver/OpenSLX/Distro/Base.pm
+# - provides base implementation of the Distro API for the xserver plugin.
+# -----------------------------------------------------------------------------
+package xserver::OpenSLX::Distro::Base;
+
+use strict;
+use warnings;
+
+our $VERSION = 1.01; # API-version . implementation-version
+
+use File::Basename;
+use File::Path;
+use Scalar::Util qw( weaken );
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+sub new
+{
+ my $class = shift;
+ my $self = {};
+ return bless $self, $class;
+}
+
+sub initialize
+{
+ my $self = shift;
+ $self->{engine} = shift;
+ weaken($self->{engine});
+ # avoid circular reference between plugin and its engine
+
+ return 1;
+}
+
+sub setupXserverScript
+{
+ my $self = shift;
+ my $repoPath = shift;
+
+ my $pathInfo = $self->XserverPathInfo();
+ my $configFile = $pathInfo->{config};
+
+ my $script = unshiftHereDoc(<<' End-of-Here');
+ # xserver.sh (base part)
+ # written by OpenSLX-plugin 'xserver' (via xserver/Distro/Base.pm module)
+
+ # generating the base configuration file (might be split into several
+ # files for newer Xorg servers)
+ echo -e "# ${xfc#/mnt*}\n# autogenerated X hardware configuration by \
+ the xserver plugin in OpenSLX stage3\n# DO NOT EDIT THIS FILE BUT THE PLUGIN \
+ INSTEAD" >${xfc}
+ # using variables defined in XX_xserver.sh
+ echo -e "${x_modpath}\n${x_srvflags}\n${x_modules}" >>${xfc}
+ echo -e "${x_keyboard}\n${x_mouse}\n${x_videocard}" >>${xfc}
+ echo -e "${x_monitor}\n${x_screen}\n${x_srvlayout}\n${x_dri}" >>${xfc}
+ # if no module was detected, stick to vesa module
+ if [ -n "$xmodule" ] ; then
+ sed "s/vesa/$xmodule/;s/\"us\"/\"${XKEYBOARD}\"/" -i ${xfc}
+ else
+ sed "s/\"us\"/\"${XKEYBOARD}\"/" -i ${xfc}
+ fi
+ if [ -n "${BUSID}" ]; then
+ sed -e "s,^#.*BusID .*, BusID \"${BUSID}\",g" -i ${xfc}
+ fi
+ # end of base xorg.conf generation
+
+ End-of-Here
+
+ return $script;
+}
+
+# not used yet, kept as example
+sub XserverPathInfo
+{
+ my $self = shift;
+
+ my $pathInfo = {
+ config => '/etc/X11/xorg.conf',
+ paths => [
+ '/usr/bin',
+ ],
+ };
+
+ return $pathInfo;
+}
+
+
+# looks for the NVIDIA-installer and extracts it
+sub installNvidia
+{
+ my $self = shift;
+ my $repopath = shift || "/opt/openslx/plugin-repo/xserver/";
+ my $pkgpath = shift || "packages";
+
+ my @paths = glob $repopath.$pkgpath."/NVIDIA-Linux-x86*\n";
+ my $paths = @paths;
+
+ if ($paths > 1)
+ {
+ print "Found more than one NVIDIA-Linux-x86 installer. Taking first one.\n";
+ }
+ if ($paths == 0)
+ {
+ print "Found no NVIDIA-Linux-x86 installer. Quitting NVIDIA installation!\n";
+ return "error";
+ }
+
+ if ( ! -X $paths[0] )
+ {
+ system("chmod +x ".$paths[0]);
+ }
+ system($paths[0]." -x --target $repopath/nvidia/temp >/dev/null 2>&1");
+
+ if($? == -1 )
+ {
+ print "Failed to execute ".$paths[0]."\n";
+ return "error";
+ }
+
+ system("mv $repopath/nvidia/temp/usr/src $repopath/nvidia/temp/");
+ system("mv $repopath/nvidia/temp/usr/ $repopath/nvidia/");
+ rmtree("$repopath/nvidia/usr/share/");
+
+ return "$repopath/nvidia/temp/src/nv";
+}
+
+
+sub installAti
+{
+ my $self = shift;
+ my $repopath = shift || "/opt/openslx/plugin-repo/xserver/";
+ my $pkgpath = shift || "packages";
+
+ my @paths = glob $repopath."/".$pkgpath."/ati-driver-installer*";
+ my $paths = @paths;
+
+ if ($paths > 1)
+ {
+ print "Found more than one ati-driver-installer. Taking first one.\n";
+ }
+ if ($paths == 0)
+ {
+ print "Found no ati-driver-installer. Quitting ATI installation!\n";
+ return "error";
+ }
+
+ if ( ! -X $paths[0] )
+ {
+ system("chmod +x ".$paths[0]);
+ }
+ system($paths[0]." --extract $repopath/ati/temp >/dev/null 2>&1");
+
+ if($? == -1 )
+ {
+ print "Failed to execute ".$paths[0]."\n";
+ return "error";
+ }
+
+ # TODO: allow x86_64 driver installation (libs)
+ my $arch = "x86";
+
+ rmtree("$repopath/ati/usr");
+ system("mv $repopath/ati/temp/common/usr $repopath/ati/");
+ if (!-d "$repopath/ati/usr/lib" ) {
+ mkdir "$repopath/ati/usr/lib";
+ }
+ system("mv $repopath/ati/temp/arch/$arch/usr/X11R6/lib/* $repopath/ati/usr/lib/");
+ system("mv $repopath/ati/temp/arch/$arch/usr/lib/* $repopath/ati/usr/lib/");
+ rmtree("$repopath/ati/usr/share/");
+
+ my $cmd='gcc --version | head -n 1 | sed -e "s/[^0-9. ]//g;s/^ *//;s/^\(.\)\..*$/\1/"';
+ my $gcc_ver_maj =`$cmd`;
+ chomp($gcc_ver_maj);
+
+ system("mv $repopath/ati/temp/arch/$arch/lib/modules/fglrx/build_mod/libfglrx_ip.a.GCC$gcc_ver_maj $repopath/ati/temp/common/lib/modules/fglrx/build_mod/");
+
+
+ return "$repopath/ati/temp/common/lib/modules/fglrx/build_mod";
+}
+
+# get dkms with wget/tar and put it into /sbin
+sub getdkms
+{
+ if( !-f "/sbin/dkms") {
+ if(!-f "dkms-2.0.21.1.tar.gz" ) {
+ system("wget http://linux.dell.com/dkms/permalink/dkms-2.0.21.1.tar.gz >/dev/null 2>&1");
+ die("Could not download dkms tarball! Exiting!") if($? > 0 );
+ }
+ if(!-f "dkms-2.0.21.1/dkms" ) {
+ system("tar -zxvf dkms-2.0.21.1.tar.gz dkms-2.0.21.1/dkms >/dev/null 2>&1");
+ die("Could not extract dkms script from tarball! Exiting!") if($? > 0 );
+ }
+ copyFile("dkms-2.0.21.1/dkms","/sbin");
+ chmod 0755, "/sbin/dkms";
+ }
+}
+
+
+1;
diff --git a/src/os-plugins/plugins/xserver/OpenSLX/Distro/Debian.pm b/src/os-plugins/plugins/xserver/OpenSLX/Distro/Debian.pm
new file mode 100644
index 00000000..29156e60
--- /dev/null
+++ b/src/os-plugins/plugins/xserver/OpenSLX/Distro/Debian.pm
@@ -0,0 +1,50 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# xserver/OpenSLX/Distro/Debian.pm
+# - provides Debian-specific overrides of the distro API for the xserver
+# plugin.
+# -----------------------------------------------------------------------------
+package xserver::OpenSLX::Distro::Debian;
+
+use strict;
+use warnings;
+
+use base qw(xserver::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub setupXserverScript
+{
+ my $self = shift;
+ my $repoPath = shift;
+
+ my $script = $self->SUPER::setupXserverScript($repoPath);
+
+ $script .= unshiftHereDoc(<<' End-of-Here');
+ # Debian specific extension to stage3 xserver.sh
+ testmkd /mnt/var/lib/xkb
+ End-of-Here
+
+ return $script;
+}
+
+# stage3 script might need to add special path /var/X11R6/bin to the PATH variable
+# # fixme!! add path directly to /etc/profile!?
+# #[ "x$addpath" != "x" ] && \
+# # echo -e "# added path component by $0: $date\n\
+# #PATH=\"\$PATH:/var/X11R6/bin\"" >>/mnt/etc/profile
+
+1;
diff --git a/src/os-plugins/plugins/xserver/OpenSLX/Distro/Suse.pm b/src/os-plugins/plugins/xserver/OpenSLX/Distro/Suse.pm
new file mode 100644
index 00000000..7a706019
--- /dev/null
+++ b/src/os-plugins/plugins/xserver/OpenSLX/Distro/Suse.pm
@@ -0,0 +1,89 @@
+# Copyright (c) 2008..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# xserver/OpenSLX/Distro/Suse.pm
+# - provides SUSE-specific overrides of the Distro API for the xserver
+# plugin.
+# -----------------------------------------------------------------------------
+package xserver::OpenSLX::Distro::Suse;
+
+use strict;
+use warnings;
+
+use base qw(xserver::OpenSLX::Distro::Base);
+
+use File::Path;
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+use OpenSLX::DistroUtils;
+
+use Data::Dumper;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub setupXserverScript
+{
+ my $self = shift;
+ my $repoPath = shift;
+
+ my $script = $self->SUPER::setupXserverScript($repoPath);
+
+ # add stuff to the script generated via Base.pm
+ $script .= unshiftHereDoc(<<' End-of-Here');
+ # SuSE specific extension to stage3 xserver.sh
+ testmkd /mnt/etc/X11/xorg.conf.d
+ # Add InputClass to proper setup the keyboard and other input
+ echo 'Section "InputClass"
+ Identifier "evdev pointer catchall"
+ MatchIsPointer "on"
+ MatchDevicePath "/dev/input/event*"
+ Driver "evdev"
+ EndSection
+ Section "InputClass"
+ Identifier "evdev keyboard catchall"
+ MatchIsKeyboard "on"
+ MatchDevicePath "/dev/input/event*"
+ Driver "evdev"
+ EndSection
+ Section "InputClass"
+ Identifier "evdev touchpad catchall"
+ MatchIsTouchpad "on"
+ MatchDevicePath "/dev/input/event*"
+ Driver "evdev"
+ EndSection
+ Section "InputClass"
+ Identifier "evdev tablet catchall"
+ MatchIsTablet "on"
+ MatchDevicePath "/dev/input/event*"
+ Driver "evdev"
+ EndSection
+ Section "InputClass"
+ Identifier "evdev touchscreen catchall"
+ MatchIsTouchscreen "on"
+ MatchDevicePath "/dev/input/event*"
+ Driver "evdev"
+ EndSection' >/mnt/etc/X11/xorg.conf.d/10-evdev.conf
+ # Xorg hardware is autodetected, so no module information provided
+ [ -z "${xmodule}" ] && \
+ sed "/Section \"Device\"/,/EndSection/d" -i ${xfc}
+ testmkd /mnt/var/lib/xkb/compiled
+ testmkd /mnt/var/lib/X11
+ testmkd /mnt/var/lib/xdm/authdir/authfiles 0700
+ ln -s /usr/bin/Xorg /mnt/var/lib/X11/X
+ rm /mnt/etc/X11/xdm/SuSEconfig.xdm
+ End-of-Here
+
+ return $script;
+}
+
+1;
diff --git a/src/os-plugins/plugins/xserver/OpenSLX/Distro/Suse_10.pm b/src/os-plugins/plugins/xserver/OpenSLX/Distro/Suse_10.pm
new file mode 100644
index 00000000..f0c3ebb8
--- /dev/null
+++ b/src/os-plugins/plugins/xserver/OpenSLX/Distro/Suse_10.pm
@@ -0,0 +1,63 @@
+# Copyright (c) 2008..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# xserver/OpenSLX/Distro/Suse_10.pm
+# - provides SUSE-specific overrides of the Distro API for the xserver
+# plugin.
+# -----------------------------------------------------------------------------
+package xserver::OpenSLX::Distro::Suse_10;
+
+use strict;
+use warnings;
+
+use base qw(xserver::OpenSLX::Distro::Base);
+
+use File::Path;
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub setupXserverScript
+{
+ my $self = shift;
+ my $repoPath = shift;
+
+ my $script = $self->SUPER::setupXserverScript($repoPath);
+
+ $script .= unshiftHereDoc(<<' End-of-Here');
+ # suse specific extension to stage3 xserver.sh
+ testmkd /mnt/var/lib/xkb/compiled
+ testmkd /mnt/var/X11R6/bin
+ ln -s /usr/bin/Xorg /mnt/var/X11R6/bin/X
+ rm /mnt/etc/X11/xdm/SuSEconfig.xdm
+ # use the old kbd keyboard driver instead of evdev
+ sed "s/\"evdev\"/,/\"kbd\"/" -i ${xfc}
+ # relevant for older xservers only: check for kind of xorg module used
+ # and patch the i8,9XX VGA BIOS if needed
+ #if strinfile '"i810"' $xfc && [ -f /etc/hwinfo.display ] ; then
+ # highres=$(sort -run /etc/hwinfo.display|grep -i x -m 1)
+ # 915resolution -l|sed -n "s/Mode //;/32 bits/p" > /tmp/915res
+ # strinfile ${highres} /tmp/915res || {
+ # 915resolution $(grep -i x -m 1 /tmp/915res|sed "s/\ :.*//") $(echo \
+ # $highres|sed "s/x/\ /") 2>&1 >/dev/null;
+ # # for some reason the above does not work for a Dell laptop with Intel
+ # # 855 chipset, so add another mode too
+ # 915resolution 3c $(echo $highres|sed "s/x/\ /") 2>&1 >/dev/null; }
+ #fi
+ End-of-Here
+
+ return $script;
+}
+
+1;
diff --git a/src/os-plugins/plugins/xserver/OpenSLX/Distro/Suse_11_0.pm b/src/os-plugins/plugins/xserver/OpenSLX/Distro/Suse_11_0.pm
new file mode 100644
index 00000000..4117c421
--- /dev/null
+++ b/src/os-plugins/plugins/xserver/OpenSLX/Distro/Suse_11_0.pm
@@ -0,0 +1,360 @@
+# Copyright (c) 2008..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# xserver/OpenSLX/Distro/Suse_11_0.pm
+# - provides SUSE-specific overrides of the Distro API for the xserver
+# plugin.
+# -----------------------------------------------------------------------------
+package xserver::OpenSLX::Distro::Suse_11_0;
+
+use strict;
+use warnings;
+
+use base qw(xserver::OpenSLX::Distro::Base);
+
+use File::Path;
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+use OpenSLX::DistroUtils;
+
+use Data::Dumper;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub setupXserverScript
+{
+ my $self = shift;
+ my $repoPath = shift;
+
+ my $script = $self->SUPER::setupXserverScript($repoPath);
+
+ $script .= unshiftHereDoc(<<' End-of-Here');
+ # SuSE specific extension to stage3 xserver.sh
+ testmkd /mnt/var/lib/xkb/compiled
+ testmkd /mnt/var/X11R6/bin
+ testmkd /mnt/var/lib/xdm/authdir/authfiles 0700
+ ln -s /usr/bin/Xorg /mnt/var/X11R6/bin/X
+ rm /mnt/etc/X11/xdm/SuSEconfig.xdm
+ End-of-Here
+
+ return $script;
+}
+
+# This function needs wget installed
+sub installNvidia
+{
+ my $self = shift;
+ my $repopath = shift || "/opt/openslx/plugin-repo/xserver/";
+ my $pkgpath = shift || "packages";
+
+ my $tmpdir = "$repopath/nvidia/temp";
+ if( !-d $tmpdir ) {
+ mkdir( $tmpdir );
+ }
+ else {
+ system("rm -rf $tmpdir/*");
+ }
+
+ my $mykernel = getKernelVersionForDistro("/boot");
+ my $kver = $mykernel->{'version'};
+ my $ksuffix = $mykernel->{'suffix'};
+
+ my $srinfo = `head -n1 /etc/SuSE-release`;
+ my @data = split (/ /, $srinfo);
+ chomp(@data);
+
+ my $version = $data[1];
+ my $chost = substr($data[2],1,-1);
+
+ my $url = "ftp://download.nvidia.com/opensuse/$version/$chost";
+
+ print " * Downloading NVIDIA rpm from ftp://download.nvidia.com/opensuse/$version\n";
+
+ system("wget -P $tmpdir -t2 -T2 $url/nvidia-gfxG01-kmp-$ksuffix* >/dev/null 2>&1");
+
+ if($? > 0) {
+ print "Could not download nvidia kernel module rpm!\n";
+ }
+
+ my @rpm = glob "$tmpdir/nvidia-gfxG01*.rpm";
+ my $rpm = @rpm;
+ $rpm[0] =~ /nvidia-gfxG01-kmp-$ksuffix-(.*?)_(.*?)-.*?\.$chost.rpm/;
+
+ my $nv_kver = $2;
+ $nv_kver =~ s/_/-/g;
+
+ if($rpm == 0) {
+ print "Could not download nvidia kernel module rpm!";
+ return;
+ }
+
+ system("cd $tmpdir; rpm2cpio $rpm[0] | cpio -idv >/dev/null 2>&1");
+
+ if(!-d "$repopath/nvidia/modules/")
+ {
+ mkdir("$repopath/nvidia/modules/");
+ }
+
+
+ # since kernel 2.6.25.20-0.1 there has to be a call to ld
+ # ld -r -m elf_i386 -o ../modules/nvidia.ko lib/modules/2.6.25.20-0.4-pae/updates/{nv-kernel,nv-linux}.o
+
+ my $nv_path = glob "$tmpdir/lib/modules/*-$ksuffix/updates/";
+ if ( -f "$nv_path/nv-kernel.o" ) {
+ # we have to link our kernel module here
+ system("ld -r -m elf_i386 -o $nv_path/nvidia.ko $nv_path/{nv-kernel,nv-linux}.o");
+ }
+
+ copyFile("$nv_path/nvidia.ko", "$repopath/nvidia/modules");
+
+
+ my @versions = split(/-/, $rpm[0]);
+ my @nv_versions = split('_',$versions[5]);
+ my $nv_version = $nv_versions[0];
+
+ system("wget -P $tmpdir -t2 -T2 $url/x11-video-nvidiaG01-$nv_version* >/dev/null 2>&1");
+
+ @rpm = glob "$tmpdir/x11-video-nvidiaG01-$nv_version*";
+ $rpm = @rpm;
+
+ if($rpm == 0)
+ {
+ print "Could not download x11-video-nvidiaG01-$nv_version*.rpm!\n";
+ print "Exiting nvidia driver installation!\n";
+ return;
+ }
+
+ system("cd $tmpdir; rpm2cpio $rpm[0] | cpio -idv >/dev/null 2>&1");
+
+ rmtree("$tmpdir/usr/share");
+ system("mv $tmpdir/usr $repopath/nvidia/");
+
+ rmtree($tmpdir);
+
+}
+
+# this function needs wget
+sub installAti
+{
+ my $self = shift;
+ my $repopath = shift || "/opt/openslx/plugin-repo/xserver/";
+ my $pkgpath = shift || "packages";
+
+ my $tmpdir = "$repopath/ati/temp";
+ if( !-d $tmpdir ) {
+ mkdir( $tmpdir );
+ }
+ else {
+ system("rm -rf $tmpdir/*");
+ }
+
+ my $mykernel = getKernelVersionForDistro("/boot");
+ my $kver = $mykernel->{'version'};
+ my $kver_ati = $kver;
+ $kver_ati =~ s/-/_/;
+
+ my $ksuffix = $mykernel->{'suffix'};
+
+ my $srinfo = `head -n1 /etc/SuSE-release`;
+ my @data = split (/ /, $srinfo);
+ chomp(@data);
+
+ my $version = $data[1];
+ my $chost = substr($data[2],1,-1);
+
+ my $url = "http://www2.ati.com/suse/$version/";
+
+ print " * Downloading ATI rpm from http://www2.ati.com/suse/$version\n";
+
+ system("wget -P $tmpdir -t2 -T2 $url/repodata/primary.xml.gz >/dev/null 2>&1");
+
+ my $url2 = `zcat $tmpdir/primary.xml.gz | grep -P -o "$chost/ati-fglrxG01-kmp-$ksuffix.*?$kver_ati.*?$chost.rpm"`;
+ chomp($url2);
+
+ if($url2 eq '') {
+ # Taking more general kernel version (minus local suse version)
+ my $newkernvers = '';
+ if($kver_ati =~ /(.*)_(.*?)$/) {
+ # if we have a match here
+ $newkernvers = $1;
+ }
+ else {
+ # just try the old method
+ $newkernvers = substr $kver_ati, 0, -4;
+ }
+ $url2 = `zcat $tmpdir/primary.xml.gz | grep -P -o "$chost/ati-fglrxG01-kmp-$ksuffix.*?$newkernvers.*?$chost.rpm"`;
+ chomp($url2);
+ if(! $url2 eq '') {
+ $kver = $newkernvers;
+ }
+ else {
+ # Minus local Suse version number - hoping, there was no ABI change
+ if($newkernvers =~ /(.*).(.*?)$/) {
+ # here we try with yet another older kernel version
+ $newkernvers = $1;
+ }
+ else {
+ $newkernvers = substr $kver_ati, 0, -7;
+ }
+ $url2 = `zcat $tmpdir/primary.xml.gz | grep -P -o "$chost/ati-fglrxG01-kmp-$ksuffix.*?$newkernvers.*?$chost.rpm"`;
+ chomp($url2);
+ if(! $url2 eq '') {
+ $kver = $newkernvers;
+ }
+
+ }
+ }
+
+# print "KVER = $kver; CHOST = $chost; ksuffix=$ksuffix\n";
+# system("bash");
+
+ if($url2 eq '') {
+ print "No ATI module rpm for the chosen kernel version ($kver) found! Exiting!\n";
+ return;
+ }
+ system("wget -P $tmpdir -t2 -T2 $url/$url2 >/dev/null 2>&1");
+
+ my @rpm = glob "$tmpdir/ati-fglrxG01-kmp-$ksuffix*$chost.rpm";
+ my $rpm = @rpm;
+
+ if($rpm == 0) {
+ print "Could not download ATI kernel module rpm (for kernel $kver)!\n";
+ print "Consider downgrading your Kernel! \nTrying package-install!\n";
+ $self->installAtiOldStyle(@_);
+ return;
+ }
+
+ system("cd $tmpdir; rpm2cpio $rpm[0] | cpio -idv >/dev/null 2>&1");
+
+ if(!-d "$repopath/ati/modules/")
+ {
+ mkdir("$repopath/ati/modules/");
+ }
+ copyFile("$tmpdir/lib/modules/$kver*-$ksuffix/updates/fglrx.ko",
+ "$repopath/ati/modules");
+
+ my @versions = split(/-/, $rpm[0]);
+ my @ati_versions = split('_',$versions[5]);
+ my $ati_version = $ati_versions[0];
+
+ $url2 = `zcat $tmpdir/primary.xml.gz | grep -P -o "$chost/x11-video-fglrxG01-$ati_version-.*?.$chost.rpm"`;
+ chomp($url2);
+ system("wget -P $tmpdir -t2 -T2 $url/$url2 >/dev/null 2>&1");
+
+ @rpm = glob "$tmpdir/x11-video-fglrxG01-$ati_version*";
+ $rpm = @rpm;
+
+ if($rpm == 0)
+ {
+ print " Could not download x11-video-fglrxG01-$ati_version*.rpm!\n";
+ print " Exiting ATI driver installation!\n";
+ return;
+ }
+
+ system("cd $tmpdir; rpm2cpio $rpm[0] | cpio -idv >/dev/null 2>&1");
+
+ rmtree("$tmpdir/usr/share");
+ system("mv $tmpdir/usr $repopath/ati/");
+ system("mv $tmpdir/etc $repopath/ati/");
+ if( ! -d "/usr/X11R6/lib/modules/dri/" ) {
+ system("mkdir -p /usr/X11R6/lib/modules/dri/");
+ }
+ symlink("$repopath/ati/usr/lib/dri/fglrx_dri.so","/usr/X11R6/lib/modules/dri/fglrx_dri.so");
+
+ rmtree($tmpdir);
+}
+
+
+
+sub installAtiOldStyle
+{
+ my $self = shift;
+ my $repopath = shift || "/opt/openslx/plugin-repo/xserver/";
+ my $pkgpath = shift || "packages";
+
+
+ my $ret = $self->SUPER::installAti(@_);
+
+ if($ret =~ /^error$/) {
+ print "Something went wrong installing ATI files!\n";
+ return;
+ }
+
+ $self->SUPER::getdkms();
+ my $mykernel = getKernelVersionForDistro("/boot");
+ my $kver = $mykernel->{'version'};
+ my $kver_ati = $kver;
+ $kver_ati =~ s/-/_/;
+
+ my $ksuffix = $mykernel->{'suffix'};
+
+ my $srinfo = `head -n1 /etc/SuSE-release`;
+ my @data = split (/ /, $srinfo);
+ chomp(@data);
+
+ my $version = $data[1];
+ my $chost = substr($data[2],1,-1);
+
+ # here we have to compile the kernel modules for all kernels
+ #
+ my $ati_version = `head $repopath/$pkgpath/ati-driver-installer-*.run | grep -P -o '[0-9]+\.[0-9]{3}' | tail -n1`;
+ chomp($ati_version);
+
+ system("mv $ret /usr/src/fglrx-$ati_version >/dev/null 2>&1");
+
+ open FH,">/usr/src/fglrx-$ati_version/dkms.conf";
+ print FH "DEST_MODULE_LOCATION=/updates\n";
+ print FH "PACKAGE_NAME=fglrx\n";
+ print FH "PACKAGE_VERSION=$ati_version\n";
+ close FH;
+
+ my $cmd = "#============= Executing following command =============\n".
+ "/sbin/dkms ".
+ " -m fglrx -v $ati_version ".
+ " -k $kver-$ksuffix ".
+ " --kernelsourcedir /usr/src/linux-$kver-obj/i586/$ksuffix ".
+ " --no-prepare-kernel ".
+ " --no-clean-kernel ".
+ " build >/dev/null 2>&1 \n".
+ "#==========================================================";
+
+#print $cmd;
+ if(!-f "/var/lib/dkms/fglrx/$ati_version/$kver-$ksuffix/$chost/module/fglrx.ko") {
+ system("/sbin/dkms add -m fglrx -v $ati_version >/dev/null 2>&1");
+ system($cmd);
+ #if ($? > 0) {
+ # print "\n\nCould not compile module! Exit with Ctrl-D\n";
+ # system("/bin/bash");
+ #}
+ }
+
+
+ if(!-d "$repopath/ati/modules/")
+ {
+ mkdir( "$repopath/ati/modules/" );
+ }
+
+ if( -e "/var/lib/dkms/fglrx/$ati_version/$kver-$ksuffix/$chost/module/fglrx.ko") {
+ copyFile("/var/lib/dkms/fglrx/$ati_version/$kver-$ksuffix/$chost/module/fglrx.ko",
+ "$repopath/ati/modules");
+ }
+ else {
+ print "Could not install ati driver via pkg-installer!\n";
+ rmtree($repopath."/ati");
+ return;
+ }
+ rmtree("$repopath/ati/temp");
+
+}
+
+1;
diff --git a/src/os-plugins/plugins/xserver/OpenSLX/Distro/Suse_11_1.pm b/src/os-plugins/plugins/xserver/OpenSLX/Distro/Suse_11_1.pm
new file mode 100644
index 00000000..ab543549
--- /dev/null
+++ b/src/os-plugins/plugins/xserver/OpenSLX/Distro/Suse_11_1.pm
@@ -0,0 +1,361 @@
+# Copyright (c) 2008..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# xserver/OpenSLX/Distro/Suse_11_1.pm
+# - provides SUSE-specific overrides of the Distro API for the xserver
+# plugin.
+# -----------------------------------------------------------------------------
+package xserver::OpenSLX::Distro::Suse_11_1;
+
+use strict;
+use warnings;
+
+use base qw(xserver::OpenSLX::Distro::Base);
+
+use File::Path;
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+use OpenSLX::DistroUtils;
+
+use Data::Dumper;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub setupXserverScript
+{
+ my $self = shift;
+ my $repoPath = shift;
+
+ my $script = $self->SUPER::setupXserverScript($repoPath);
+
+ $script .= unshiftHereDoc(<<' End-of-Here');
+ # SuSE specific extension to stage3 xserver.sh
+ testmkd /mnt/var/lib/xkb/compiled
+ testmkd /mnt/var/X11R6/bin
+ testmkd /mnt/var/lib/xdm/authdir/authfiles 0700
+ ln -s /usr/bin/Xorg /mnt/var/X11R6/bin/X
+ rm /mnt/etc/X11/xdm/SuSEconfig.xdm
+ End-of-Here
+
+ return $script;
+}
+
+# This function needs wget installed
+sub installNvidia
+{
+ my $self = shift;
+ my $repopath = shift || "/opt/openslx/plugin-repo/xserver/";
+ my $pkgpath = shift || "packages";
+
+ my $tmpdir = "$repopath/nvidia/temp";
+ if( !-d $tmpdir ) {
+ mkdir( $tmpdir );
+ }
+ else {
+ system("rm -rf $tmpdir/*");
+ }
+
+ my $mykernel = getKernelVersionForDistro("/boot");
+ my $kver = $mykernel->{'version'};
+ my $ksuffix = $mykernel->{'suffix'};
+
+ my $srinfo = `head -n1 /etc/SuSE-release`;
+ my @data = split (/ /, $srinfo);
+ chomp(@data);
+
+ my $version = $data[1];
+ my $chost = substr($data[2],1,-1);
+
+ my $url = "ftp://download.nvidia.com/opensuse/$version/$chost";
+
+ print " * Downloading NVIDIA rpm from ftp://download.nvidia.com/opensuse/$version\n";
+
+ system("wget -P $tmpdir -t2 -T2 $url/nvidia-gfxG01-kmp-$ksuffix* >/dev/null 2>&1");
+
+ if($? > 0) {
+ print "Could not download nvidia kernel module rpm!\n";
+ }
+
+ my @rpm = glob "$tmpdir/nvidia-gfxG01*.rpm";
+ my $rpm = @rpm;
+ $rpm[0] =~ /nvidia-gfxG01-kmp-$ksuffix-(.*?)_(.*?)-.*?\.$chost.rpm/;
+
+ my $nv_kver = $2;
+ $nv_kver =~ s/_/-/g;
+
+ if($rpm == 0) {
+ print "Could not download nvidia kernel module rpm!";
+ return;
+ }
+
+ system("cd $tmpdir; rpm2cpio $rpm[0] | cpio -idv >/dev/null 2>&1");
+
+ if(!-d "$repopath/nvidia/modules/")
+ {
+ mkdir("$repopath/nvidia/modules/");
+ }
+
+
+ # since kernel 2.6.25.20-0.1 there has to be a call to ld
+ # ld -r -m elf_i386 -o ../modules/nvidia.ko lib/modules/2.6.25.20-0.4-pae/updates/{nv-kernel,nv-linux}.o
+
+ my $nv_path = glob "$tmpdir/lib/modules/*-$ksuffix/updates/";
+ if ( -f "$nv_path/nv-kernel.o" ) {
+ # we have to link our kernel module here
+ system("ld -r -m elf_i386 -o $nv_path/nvidia.ko $nv_path/{nv-kernel,nv-linux}.o");
+ }
+
+ copyFile("$nv_path/nvidia.ko", "$repopath/nvidia/modules");
+
+
+ my @versions = split(/-/, $rpm[0]);
+ my @nv_versions = split('_',$versions[5]);
+ my $nv_version = $nv_versions[0];
+
+ system("wget -P $tmpdir -t2 -T2 $url/x11-video-nvidiaG01-$nv_version* >/dev/null 2>&1");
+
+ @rpm = glob "$tmpdir/x11-video-nvidiaG01-$nv_version*";
+ $rpm = @rpm;
+
+ if($rpm == 0)
+ {
+ print "Could not download x11-video-nvidiaG01-$nv_version*.rpm!\n";
+ print "Exiting nvidia driver installation!\n";
+ return;
+ }
+
+ system("cd $tmpdir; rpm2cpio $rpm[0] | cpio -idv >/dev/null 2>&1");
+
+ rmtree("$tmpdir/usr/share");
+ system("mv $tmpdir/usr $repopath/nvidia/");
+
+ rmtree($tmpdir);
+
+}
+
+
+# this function needs wget
+sub installAti
+{
+ my $self = shift;
+ my $repopath = shift || "/opt/openslx/plugin-repo/xserver/";
+ my $pkgpath = shift || "packages";
+
+ my $tmpdir = "$repopath/ati/temp";
+ if( !-d $tmpdir ) {
+ mkdir( $tmpdir );
+ }
+ else {
+ system("rm -rf $tmpdir/*");
+ }
+
+ my $mykernel = getKernelVersionForDistro("/boot");
+ my $kver = $mykernel->{'version'};
+ my $kver_ati = $kver;
+ $kver_ati =~ s/-/_/;
+
+ my $ksuffix = $mykernel->{'suffix'};
+
+ my $srinfo = `head -n1 /etc/SuSE-release`;
+ my @data = split (/ /, $srinfo);
+ chomp(@data);
+
+ my $version = $data[1];
+ my $chost = substr($data[2],1,-1);
+
+ my $url = "http://www2.ati.com/suse/$version/";
+
+ print " * Downloading ATI rpm from http://www2.ati.com/suse/$version\n";
+
+ system("wget -P $tmpdir -t2 -T2 $url/repodata/primary.xml.gz >/dev/null 2>&1");
+
+ my $url2 = `zcat $tmpdir/primary.xml.gz | grep -P -o "$chost/ati-fglrxG01-kmp-$ksuffix.*?$kver_ati.*?$chost.rpm"`;
+ chomp($url2);
+
+ if($url2 eq '') {
+ # Taking more general kernel version (minus local suse version)
+ my $newkernvers = '';
+ if($kver_ati =~ /(.*)_(.*?)$/) {
+ # if we have a match here
+ $newkernvers = $1;
+ }
+ else {
+ # just try the old method
+ $newkernvers = substr $kver_ati, 0, -4;
+ }
+ $url2 = `zcat $tmpdir/primary.xml.gz | grep -P -o "$chost/ati-fglrxG01-kmp-$ksuffix.*?$newkernvers.*?$chost.rpm"`;
+ chomp($url2);
+ if(! $url2 eq '') {
+ $kver = $newkernvers;
+ }
+ else {
+ # Minus local Suse version number - hoping, there was no ABI change
+ if($newkernvers =~ /(.*).(.*?)$/) {
+ # here we try with yet another older kernel version
+ $newkernvers = $1;
+ }
+ else {
+ $newkernvers = substr $kver_ati, 0, -7;
+ }
+ $url2 = `zcat $tmpdir/primary.xml.gz | grep -P -o "$chost/ati-fglrxG01-kmp-$ksuffix.*?$newkernvers.*?$chost.rpm"`;
+ chomp($url2);
+ if(! $url2 eq '') {
+ $kver = $newkernvers;
+ }
+
+ }
+ }
+
+# print "KVER = $kver; CHOST = $chost; ksuffix=$ksuffix\n";
+# system("bash");
+
+ if($url2 eq '') {
+ print "No ATI module rpm for the chosen kernel version ($kver) found! Exiting!\n";
+ return;
+ }
+ system("wget -P $tmpdir -t2 -T2 $url/$url2 >/dev/null 2>&1");
+
+ my @rpm = glob "$tmpdir/ati-fglrxG01-kmp-$ksuffix*$chost.rpm";
+ my $rpm = @rpm;
+
+ if($rpm == 0) {
+ print "Could not download ATI kernel module rpm (for kernel $kver)!\n";
+ print "Consider downgrading your Kernel! \nTrying package-install!\n";
+ $self->installAtiOldStyle(@_);
+ return;
+ }
+
+ system("cd $tmpdir; rpm2cpio $rpm[0] | cpio -idv >/dev/null 2>&1");
+
+ if(!-d "$repopath/ati/modules/")
+ {
+ mkdir("$repopath/ati/modules/");
+ }
+ copyFile("$tmpdir/lib/modules/$kver*-$ksuffix/updates/fglrx.ko",
+ "$repopath/ati/modules");
+
+ my @versions = split(/-/, $rpm[0]);
+ my @ati_versions = split('_',$versions[5]);
+ my $ati_version = $ati_versions[0];
+
+ $url2 = `zcat $tmpdir/primary.xml.gz | grep -P -o "$chost/x11-video-fglrxG01-$ati_version-.*?.$chost.rpm"`;
+ chomp($url2);
+ system("wget -P $tmpdir -t2 -T2 $url/$url2 >/dev/null 2>&1");
+
+ @rpm = glob "$tmpdir/x11-video-fglrxG01-$ati_version*";
+ $rpm = @rpm;
+
+ if($rpm == 0)
+ {
+ print " Could not download x11-video-fglrxG01-$ati_version*.rpm!\n";
+ print " Exiting ATI driver installation!\n";
+ return;
+ }
+
+ system("cd $tmpdir; rpm2cpio $rpm[0] | cpio -idv >/dev/null 2>&1");
+
+ rmtree("$tmpdir/usr/share");
+ system("mv $tmpdir/usr $repopath/ati/");
+ system("mv $tmpdir/etc $repopath/ati/");
+ if( ! -d "/usr/X11R6/lib/modules/dri/" ) {
+ system("mkdir -p /usr/X11R6/lib/modules/dri/");
+ }
+ symlink("$repopath/ati/usr/lib/dri/fglrx_dri.so","/usr/X11R6/lib/modules/dri/fglrx_dri.so");
+
+ rmtree($tmpdir);
+}
+
+
+
+sub installAtiOldStyle
+{
+ my $self = shift;
+ my $repopath = shift || "/opt/openslx/plugin-repo/xserver/";
+ my $pkgpath = shift || "packages";
+
+
+ my $ret = $self->SUPER::installAti(@_);
+
+ if($ret =~ /^error$/) {
+ print "Something went wrong installing ATI files!\n";
+ return;
+ }
+
+ $self->SUPER::getdkms();
+ my $mykernel = getKernelVersionForDistro("/boot");
+ my $kver = $mykernel->{'version'};
+ my $kver_ati = $kver;
+ $kver_ati =~ s/-/_/;
+
+ my $ksuffix = $mykernel->{'suffix'};
+
+ my $srinfo = `head -n1 /etc/SuSE-release`;
+ my @data = split (/ /, $srinfo);
+ chomp(@data);
+
+ my $version = $data[1];
+ my $chost = substr($data[2],1,-1);
+
+ # here we have to compile the kernel modules for all kernels
+ #
+ my $ati_version = `head $repopath/$pkgpath/ati-driver-installer-*.run | grep -P -o '[0-9]+\.[0-9]{3}' | tail -n1`;
+ chomp($ati_version);
+
+ system("mv $ret /usr/src/fglrx-$ati_version >/dev/null 2>&1");
+
+ open FH,">/usr/src/fglrx-$ati_version/dkms.conf";
+ print FH "DEST_MODULE_LOCATION=/updates\n";
+ print FH "PACKAGE_NAME=fglrx\n";
+ print FH "PACKAGE_VERSION=$ati_version\n";
+ close FH;
+
+ my $cmd = "#============= Executing following command =============\n".
+ "/sbin/dkms ".
+ " -m fglrx -v $ati_version ".
+ " -k $kver-$ksuffix ".
+ " --kernelsourcedir /usr/src/linux-$kver-obj/i586/$ksuffix ".
+ " --no-prepare-kernel ".
+ " --no-clean-kernel ".
+ " build >/dev/null 2>&1 \n".
+ "#==========================================================";
+
+#print $cmd;
+ if(!-f "/var/lib/dkms/fglrx/$ati_version/$kver-$ksuffix/$chost/module/fglrx.ko") {
+ system("/sbin/dkms add -m fglrx -v $ati_version >/dev/null 2>&1");
+ system($cmd);
+ #if ($? > 0) {
+ # print "\n\nCould not compile module! Exit with Ctrl-D\n";
+ # system("/bin/bash");
+ #}
+ }
+
+
+ if(!-d "$repopath/ati/modules/")
+ {
+ mkdir( "$repopath/ati/modules/" );
+ }
+
+ if( -e "/var/lib/dkms/fglrx/$ati_version/$kver-$ksuffix/$chost/module/fglrx.ko") {
+ copyFile("/var/lib/dkms/fglrx/$ati_version/$kver-$ksuffix/$chost/module/fglrx.ko",
+ "$repopath/ati/modules");
+ }
+ else {
+ print "Could not install ati driver via pkg-installer!\n";
+ rmtree($repopath."/ati");
+ return;
+ }
+ rmtree("$repopath/ati/temp");
+
+}
+
+1;
diff --git a/src/os-plugins/plugins/xserver/OpenSLX/Distro/Suse_11_2.pm b/src/os-plugins/plugins/xserver/OpenSLX/Distro/Suse_11_2.pm
new file mode 100644
index 00000000..5cddcef0
--- /dev/null
+++ b/src/os-plugins/plugins/xserver/OpenSLX/Distro/Suse_11_2.pm
@@ -0,0 +1,53 @@
+# Copyright (c) 2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# xserver/OpenSLX/Distro/Suse_11_2.pm
+# - provides SUSE-specific overrides of the Distro API for the xserver
+# plugin.
+# -----------------------------------------------------------------------------
+package xserver::OpenSLX::Distro::Suse_11_2;
+
+use strict;
+use warnings;
+
+use base qw(xserver::OpenSLX::Distro::Base);
+
+use File::Path;
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+use OpenSLX::DistroUtils;
+
+use Data::Dumper;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub setupXserverScript
+{
+ my $self = shift;
+ my $repoPath = shift;
+
+ my $script = $self->SUPER::setupXserverScript($repoPath);
+
+ $script .= unshiftHereDoc(<<' End-of-Here');
+ # SuSE specific extension to stage3 xserver.sh
+ testmkd /mnt/var/lib/xkb/compiled
+ testmkd /mnt/var/lib/X11
+ testmkd /mnt/var/lib/xdm/authdir/authfiles 0700
+ ln -s /usr/bin/Xorg /mnt/var/lib/X11/X
+ rm /mnt/etc/X11/xdm/SuSEconfig.xdm
+ End-of-Here
+
+ return $script;
+}
+
+1;
diff --git a/src/os-plugins/plugins/xserver/OpenSLX/Distro/Ubuntu.pm b/src/os-plugins/plugins/xserver/OpenSLX/Distro/Ubuntu.pm
new file mode 100644
index 00000000..057cf138
--- /dev/null
+++ b/src/os-plugins/plugins/xserver/OpenSLX/Distro/Ubuntu.pm
@@ -0,0 +1,96 @@
+# Copyright (c) 2008..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# xserver/OpenSLX/Distro/Ubuntu.pm
+# - provides Ubuntu-specific overrides of the distro API for the xserver
+# plugin.
+# -----------------------------------------------------------------------------
+package xserver::OpenSLX::Distro::Ubuntu;
+
+use strict;
+use warnings;
+
+use base qw(xserver::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+# needs to be implemented ...
+sub XserverPathInfo
+{
+ my $self = shift;
+
+ my $pathInfo = {
+ config => '/etc/X11/xorg.openslx',
+ paths => [
+ '/usr/bin',
+ ],
+ };
+
+ return $pathInfo;
+}
+
+sub setupXserverScript
+{
+ my $self = shift;
+ my $repoPath = shift;
+
+ my $script = $self->SUPER::setupXserverScript($repoPath);
+
+ # overwriting script part from Base.pm
+ $script = unshiftHereDoc(<<' End-of-Here');
+ # Ubuntu specific extension to stage3 xserver.sh
+ echo -e "# ${xfc#/mnt*}\n# autogenerated X hardware configuration by \
+ the xserver plugin in OpenSLX stage3\n# DO NOT EDIT THIS FILE BUT THE PLUGIN \
+ INSTEAD" >${xfc}
+ # using variables defined in XX_xserver.sh
+ echo -e "${x_modpath}\n${x_srvflags}\n${x_modules}" >>${xfc}
+ echo "${x_keyboard}" | sed "s/kbd/evdev/" >>${xfc}
+ echo -e "${x_mouse}\n${x_monitor}\n${x_screen}" >>${xfc}
+ echo "${x_srvlayout}" | sed "/ Screen /d" >>${xfc}
+ testmkd /mnt/etc/X11/xorg.conf.d
+ testmkd /mnt/var/run/xauth
+ testmkd /mnt/var/lib/xkb
+ ln -sf /usr/bin/Xorg /mnt/etc/X11/X
+ End-of-Here
+
+ return $script;
+}
+
+
+sub installNvidia
+{
+ my $self = shift;
+ my $repopath = shift || "/opt/openslx/plugin-repo/xserver/";
+ my $pkgpath = shift || "packages";
+
+ my $distroName = $self->{engine}->distroName();
+
+ system($repopath."/ubuntu-gfx-install.sh nvidia $distroName");
+
+}
+
+sub installAti
+{
+ my $self = shift;
+ my $repopath = shift || "/opt/openslx/plugin-repo/xserver/";
+ my $pkgpath = shift || "packages";
+
+ my $distroName = $self->{engine}->distroName();
+
+ system($repopath."/ubuntu-gfx-install.sh ati $distroName");
+
+}
+
+1;
diff --git a/src/os-plugins/plugins/xserver/OpenSLX/Distro/Ubuntu_8.pm b/src/os-plugins/plugins/xserver/OpenSLX/Distro/Ubuntu_8.pm
new file mode 100644
index 00000000..1fa88446
--- /dev/null
+++ b/src/os-plugins/plugins/xserver/OpenSLX/Distro/Ubuntu_8.pm
@@ -0,0 +1,73 @@
+# Copyright (c) 2008..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# xserver/OpenSLX/Distro/Ubuntu_8.pm
+# - provides Ubuntu-specific overrides of the distro API for the xserver
+# plugin.
+# -----------------------------------------------------------------------------
+package xserver::OpenSLX::Distro::Ubuntu_8;
+
+use strict;
+use warnings;
+
+use base qw(xserver::OpenSLX::Distro::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+sub setupXserverScript
+{
+ my $self = shift;
+ my $repoPath = shift;
+
+ my $script = $self->SUPER::setupXserverScript($repoPath);
+
+ $script .= unshiftHereDoc(<<' End-of-Here');
+ # Ubuntu specific extension to stage3 xserver.sh
+ # use the old kbd keyboard driver instead of evdev
+ sed "s/\"evdev\"/,/\"kbd\"/" -i ${xfc}
+ testmkd /mnt/var/run/xauth
+ testmkd /mnt/var/lib/xkb
+ ln -sf /usr/bin/Xorg /mnt/etc/X11/X
+ End-of-Here
+
+ return $script;
+}
+
+
+sub installNvidia
+{
+ my $self = shift;
+ my $repopath = shift || "/opt/openslx/plugin-repo/xserver/";
+ my $pkgpath = shift || "packages";
+
+ my $distroName = $self->{engine}->distroName();
+
+ system($repopath."/ubuntu-gfx-install.sh nvidia $distroName");
+
+}
+
+sub installAti
+{
+ my $self = shift;
+ my $repopath = shift || "/opt/openslx/plugin-repo/xserver/";
+ my $pkgpath = shift || "packages";
+
+ my $distroName = $self->{engine}->distroName();
+
+ system($repopath."/ubuntu-gfx-install.sh ati $distroName");
+
+}
+
+1;
diff --git a/src/os-plugins/plugins/xserver/OpenSLX/Distro/Ubuntu_9.pm b/src/os-plugins/plugins/xserver/OpenSLX/Distro/Ubuntu_9.pm
new file mode 100644
index 00000000..80dccbc9
--- /dev/null
+++ b/src/os-plugins/plugins/xserver/OpenSLX/Distro/Ubuntu_9.pm
@@ -0,0 +1,30 @@
+# Copyright (c) 2008..2010 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# xserver/OpenSLX/Distro/Ubuntu_9.pm
+# - provides Ubuntu-specific overrides of the distro API for the xserver
+# plugin.
+# -----------------------------------------------------------------------------
+package xserver::OpenSLX::Distro::Ubuntu_9;
+
+use strict;
+use warnings;
+
+use base qw(xserver::OpenSLX::Distro::Ubuntu_8);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+################################################################################
+### interface methods
+################################################################################
+
+
+1;
diff --git a/src/os-plugins/plugins/xserver/OpenSLX/OSPlugin/xserver.pm b/src/os-plugins/plugins/xserver/OpenSLX/OSPlugin/xserver.pm
new file mode 100644
index 00000000..b172dc22
--- /dev/null
+++ b/src/os-plugins/plugins/xserver/OpenSLX/OSPlugin/xserver.pm
@@ -0,0 +1,396 @@
+# Copyright (c) 2008 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# xserver.pm
+# -----------------------------------------------------------------------------
+package OpenSLX::OSPlugin::xserver;
+
+use strict;
+use warnings;
+
+use base qw(OpenSLX::OSPlugin::Base);
+
+use OpenSLX::Basics;
+use OpenSLX::Utils;
+
+use File::Basename;
+
+################################################################################
+# if you have any questions regarding the concept of OS-plugins and their
+# implementation, please drop a mail to: ot@openslx.com, or join the IRC-channel
+# '#openslx' (on freenode).
+################################################################################
+sub new
+{
+ my $class = shift;
+
+ my $self = {
+ name => 'xserver',
+ };
+
+ return bless $self, $class;
+}
+
+sub getInfo
+{
+ my $self = shift;
+
+ return {
+ description => unshiftHereDoc(<<' End-of-Here'),
+ This plugin tries to configure the local Xorg-Server and
+ integrates binary graphics drivers (closed sourced) into the system.
+ Notice that you need to have kernel-headers installed to work properly.
+ in some cases. You need to download the driver packages yourself and
+ supply the download folder into the pkgpath option.
+ End-of-Here
+ precedence => 80,
+ };
+}
+
+sub getAttrInfo
+{ # returns a hash-ref with information about all attributes supported
+ # by this specific plugin
+ my $self = shift;
+
+ # This default configuration will be added as attributes to the default
+ # system, such that it can be overruled for any specific system by means
+ # of slxconfig.
+ return {
+ # attribute 'active' is mandatory for all plugins
+ 'xserver::active' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should the 'xserver'-plugin be executed during boot?
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '1 means active - 0 means inactive',
+ default => '1',
+ },
+ 'xserver::ddcinfo' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should the 'xserver'-plugin use the ddcinfo (if available) for
+ the monitor/tft setup? Might help in scenarios with resolutions
+ configured much lower than physically possible. (0 ignore, 1 use)
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '0 ignore ddcinfo, 1 use ddcinfo if available',
+ default => '0',
+ },
+ 'xserver::driver' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ force to use defined driver
+ End-of-Here
+ content_regex => undef,
+ content_descr => 'force to use defined driver',
+ default => undef,
+ },
+ 'xserver::prefnongpl' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should the 'xserver'-plugin use the non-gpl drivers for some graphic
+ adaptors if available (0 prefer gpl, 1 use the nongpl)
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '0 prefer gpl, 1 use the nongpl',
+ default => '0',
+ },
+ 'xserver::multihead' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should the 'xserver'-plugin configure multi-head setups of Xorg
+ for different scenarios and dynamically added displays
+ (not implemented yet)
+ End-of-Here
+ content_regex => undef,
+ content_descr => '',
+ default => '1',
+ },
+
+ # plugin specific attributes start here ...
+
+ # stage1
+ # Currently not needed in scenarios where distro specific packages are
+ # available, but for example in SUSE 10.2 we use this method
+ # -> provide downloaded packages here.
+ 'xserver::pkgpath' => {
+ applies_to_vendor_os => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Path to downloaded ATI or Nvidia package
+ End-of-Here
+ content_regex => qr{^.+$}, # not empty
+ content_descr => 'Path to Nvidia or ATI packages',
+ default => '/root/xserver-pkgs',
+ },
+ 'xserver::ati' => {
+ applies_to_vendor_os => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should the non-gpl ATI drivers be available (installed in vendor-OS - not implemented yet)?
+ End-of-Here
+ content_regex => qr{^0|1$},
+ content_descr => '"0", "1"',
+ default => '0',
+ },
+ 'xserver::nvidia' => {
+ applies_to_vendor_os => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ should the non-gpl NVidia drivers be available (installed in vendor-OS - not implemented yet)?
+ End-of-Here
+ content_regex => qr{^0|1$},
+ content_descr => '"0", "1"',
+ default => '0',
+ },
+ #'xserver::matrox' => {
+ # applies_to_vendor_os => 1,
+ # description => unshiftHereDoc(<<' End-of-Here'),
+ # should the non-gpl Matrox drivers (e.g. for the Parhelia) be
+ # available (installed in vendor-OS)?
+ # End-of-Here
+ # content_regex => qr{^0|1$},
+ # content_descr => '"0", "1"',
+ # default => '0',
+ #},
+ };
+}
+
+
+sub preInstallationPhase()
+{
+ my $self = shift;
+ my $info = shift;
+
+ $self->{pluginRepositoryPath} = $info->{'plugin-repo-path'};
+ $self->{pluginTempPath} = $info->{'plugin-temp-path'};
+ $self->{openslxBasePath} = $info->{'openslx-base-path'};
+ $self->{openslxConfigPath} = $info->{'openslx-config-path'};
+ $self->{attrs} = $info->{'plugin-attrs'};
+ $self->{vendorOsPath} = $info->{'vendor-os-path'};
+
+
+ my $pkgpath = $self->{attrs}->{'xserver::pkgpath'};
+ $pkgpath ||= "";
+ my $installAti = $self->{attrs}->{'xserver::ati'};
+ my $installNvidia = $self->{attrs}->{'xserver::nvidia'};
+
+ if (! -d $pkgpath && ($installAti == 1 || $installNvidia == 1)) {
+ print "\n\n * xserver::pkgpath: no such directory!\n";
+ print " * xserver plugin can only install ATI or Nvidia driver\n";
+ print " via operating system packaging (e.g. != SuSE-10.2)!\n";
+ # exit 1 => xserver plugin is not getting installed because ati
+ # or nvidia where selected but are not installable!
+ # exit 1;
+ }
+
+ if (-d $pkgpath && ($installNvidia == 1 || $installAti == 1)) {
+ system("cp -r $pkgpath $self->{pluginRepositoryPath}/packages");
+ }
+
+}
+
+
+sub installationPhase
+{ # called while chrooted to the vendor-OS root in order to give the plugin
+ # a chance to install required files into the vendor-OS.
+ my $self = shift;
+ my $info = shift;
+
+ # ehh... every plugin has it's own different installationPhase
+ # variable definition?
+ my $pluginRepoPath = $info->{'plugin-repo-path'};
+ # The folder where the stage1-plugin should store all files
+ # required by the corresponding stage3 runlevel script.
+ # As this method is being executed while chrooted into the vendor-OS,
+ # this path is relative to that root (i.e. directly usable).
+ my $pluginTempPath = $info->{'plugin-temp-path'};
+ # A temporary playground that will be cleaned up automatically.
+ # As this method is being executed while chrooted into the vendor-OS,
+ # this path is relative to that root (i.e. directly usable).
+ my $openslxBasePath = $info->{'openslx-base-path'};
+ # the openslx base path (/opt/openslx) bind-mounted into the chroot
+ my $openslxConfigPath = $info->{'openslx-config-path'};
+ # the openslx config path (/etc/opt/openlsx) bind-mounted into the
+ # chroot
+ my $attrs = $info->{'plugin-attrs'};
+ # attributes in effect for this installation
+ my $vendorOSName = $self->{'os-plugin-engine'}->{'vendor-os-name'};
+
+ # write the distro specific extension (inclusion) of XX_xserver.sh
+ my $script = $self->{distro}->setupXserverScript($pluginRepoPath);
+ spitFile("$pluginRepoPath/xserver.sh", $script);
+
+ # if defined: build nvidia or ati binarys
+ my $pluginFilesPath =
+ "$openslxBasePath/lib/plugins/$self->{'name'}/files";
+ my $installationPath = "$pluginRepoPath/";
+ my $binDrivers = 0;
+ my $engine = $self->{'os-plugin-engine'};
+
+ # removeLinks is to remove Links to the files
+ # TODO: In future versions this call can be removed - deprecated version
+ $self->removeLinks();
+
+ if ($attrs->{'xserver::nvidia'} == 1 || $attrs->{'xserver::ati'} == 1 ) {
+ if($vendorOSName =~ /.*?ubuntu.*?/i)
+ {
+ if($vendorOSName =~ /.*?8.10|9.04|9.10.*?/i)
+ {
+ copyFile("$pluginFilesPath/ubuntu-ng-gfx-install.sh",
+ "$installationPath");
+ rename("$installationPath/ubuntu-ng-gfx-install.sh",
+ "$installationPath/ubuntu-gfx-install.sh");
+ }
+ else
+ {
+ copyFile("$pluginFilesPath/ubuntu-gfx-install.sh", "$installationPath");
+ }
+ }
+ $binDrivers = 1;
+ }
+ if ($attrs->{'xserver::ati'} == 1 ) {
+ $self->{distro}->installAti($pluginRepoPath,"packages");
+ }
+ if ($attrs->{'xserver::nvidia'} == 1 ) {
+ $self->{distro}->installNvidia($pluginRepoPath,"packages");
+ }
+
+ if ($binDrivers == 1) {
+ $self->ldconf($info);
+ system("chmod -R 755 $installationPath");
+ }
+
+ return;
+}
+
+sub removalPhase
+{ # called while chrooted to the vendor-OS root in order to give the plugin
+ # a chance to uninstall no longer required files from the vendor-OS.
+ my $self = shift;
+ my $info = shift;
+
+ my $pluginRepoPath = $info->{'plugin-repo-path'};
+ # The folder where the stage1-plugin should store all files
+ # required by the corresponding stage3 runlevel script.
+ # As this method is being executed while chrooted into the vendor-OS,
+ # this path is relative to that root (i.e. directly usable).
+ my $pluginTempPath = $info->{'plugin-temp-path'};
+ # A temporary playground that will be cleaned up automatically.
+ # As this method is being executed while chrooted into the vendor-OS,
+ # this path is relative to that root (i.e. directly usable).
+
+
+ # TODO (in far future): Remove - linking is deprecated
+ # Make sure nobody has installed the old plugin version
+ $self->removeLinks();
+
+ return;
+}
+
+
+
+# Create ld.so.conf for the binary drivers
+sub ldconf
+{
+ my $self = shift;
+ my $info = shift;
+
+ my $attrs = $info->{'plugin-attrs'};
+ my $ldincl = $info->{'plugin-repo-path'}.'/';
+ my $ldpl = "/etc/ld.conf.preload";
+ my $ldconf = "/etc/ld.so.conf";
+ my $ldcache = "";
+
+ if( -d $ldincl.'nvidia/') {
+
+ ## WRITE ld.so.conf ##
+
+ open(IN,'>'.$ldincl.'nvidia/ld.so.conf');
+ print IN $ldincl."nvidia/usr/lib\n".$ldincl.'nvidia/usr/X11R6/lib';
+ close(IN);
+
+ ## CREATE DIFFERENT 'ld.so.cache' ##
+
+ $ldcache = $ldincl.'/nvidia/ld.so.cache';
+ system('sed -e "1s,^,include '.$ldincl.'nvidia/ld.so.conf\n,g" -i '.$ldconf);
+ #print "Calling ldconfig to create $ldcache ... Please Wait\n";
+ system('ldconfig -C '.$ldcache);
+ system('sed -e "1d" -i '.$ldconf);
+ }
+
+
+ if( -d $ldincl.'ati/') {
+ open(IN,'>'.$ldincl.'ati/ld.so.conf');
+ print IN $ldincl."ati/usr/lib\n".$ldincl.'ati/usr/X11R6/lib';
+ close(IN);
+
+ $ldcache = $ldincl.'/ati/ld.so.cache';
+ system('sed -e "1s,^,include '.$ldincl.'ati/ld.so.conf\n,g" -i '.$ldconf);
+ #print "Calling ldconfig to create $ldcache ... Please Wait\n";
+ system('ldconfig -C '.$ldcache);
+ system('sed -e "1d" -i '.$ldconf);
+ }
+}
+
+
+# deprecated
+# removes linked libraries from /usr/lib/
+sub removeLinks
+{
+ my $instFolders = "/usr/lib";
+ if(-d "/usr/X11R6/lib") {
+ $instFolders .= " /usr/X11R6/lib";
+ }
+ my $divertFolder = "/var/X11R6/lib";
+ my $pluginFolder = "/opt/openslx/plugin-repo/xserver";
+
+ # get all previously installed links
+ my @linkedFiles =
+ `find $instFolders -lname "$divertFolder*" -o -lname "$pluginFolder*" `;
+
+
+ # also remove _MESA backup files
+ my @backupFiles =
+ `find $instFolders -name "*_MESA.so*"`;
+ my $origfile = '';
+ for my $file (@backupFiles) {
+ $origfile = $file;
+ $file =~ s/_MESA//;
+ rename($origfile,$file);
+ }
+ unlink "/usr/lib/libGL.so", "/usr/lib/libGL.so.1";
+ symlink "/usr/lib/libGL.so.1.2", "/usr/lib/libGL.so.1";
+ symlink "/usr/lib/libGL.so.1.2", "/usr/lib/libGL.so";
+
+
+ foreach my $file (@linkedFiles) {
+ chomp($file);
+ unlink $file;
+ }
+
+ # this should not print any file at all ;-(
+ my @files = `find $instFolders -lname "$divertFolder*" -o -lname "$pluginFolder*" `;
+ if ( $#files > 0 ) {
+ print "Links were not removed properly! Exiting!\n";
+ my $bla;
+ foreach (@files) {
+ chomp($bla = $_);
+ print $bla;
+ }
+ exit(1);
+ }
+ return;
+}
+
+1;
diff --git a/src/os-plugins/plugins/xserver/XX_xserver.sh b/src/os-plugins/plugins/xserver/XX_xserver.sh
new file mode 100644
index 00000000..1b757901
--- /dev/null
+++ b/src/os-plugins/plugins/xserver/XX_xserver.sh
@@ -0,0 +1,351 @@
+# Copyright (c) 2008 - RZ Uni Freiburg
+# Copyright (c) 2008..2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# stage3 part of 'xserver' plugin - the runlevel script setting up the Xorg
+# configuration and checking for 3D capabilities and non-gpl drivers
+#
+# script is included from init via the "." load function - thus it has all
+# variables and functions available
+
+# defining a set of stanard configuration blocks
+x_modpath='Section "Files"
+# ModulePath "/usr/lib/xorg/modules/,/usr/lib64/xorg/modules/"
+EndSection'
+x_srvflags='Section "ServerFlags"
+ Option "AllowMouseOpenFail"
+ Option "AllowEmptyInput" "false"
+ Option "blank time" "5"
+ Option "standby time" "10"
+ Option "suspend time" "15"
+ Option "off time" "20"
+EndSection'
+x_modules='Section "Module"
+ Load "i2c"
+ Load "bitmap"
+ Load "ddc"
+ Load "extmod"
+ Load "freetype"
+ Load "int10"
+ Load "vbe"
+ Load "glx"
+ Load "dri"
+EndSection'
+x_mouse='Section "InputDevice"
+ Identifier "Generic Mouse"
+ Driver "mouse"
+# Option "Device" "/dev/input/mice"
+# Option "Protocol" "ImPS/2"
+# Option "ZAxisMapping" "4 5"
+# Option "Emulate3Buttons" "true"
+ Option "CorePointer"
+EndSection'
+x_keyboard='Section "InputDevice"
+ Identifier "Generic Keyboard"
+ Driver "evdev"
+ Option "CoreKeyboard"
+ Option "XkbRules" "xorg"
+ Option "XkbModel" "pc105"
+ Option "XkbLayout" "us"
+EndSection'
+x_videocard='Section "Device"
+ Identifier "Generic Video Card"
+ Driver "vesa"
+# BusID "PCI:xx" #especially needed for fglrx
+EndSection'
+x_monitor='Section "Monitor"
+ Identifier "Generic Display"
+ Option "DPMS"
+# Modelname "could be enabled via xserver::ddcinfo attribute"
+# Vertrefresh ...
+# Horizsync ...
+# DisplaySize ...
+EndSection'
+x_screen='Section "Screen"
+ Identifier "Default Screen"
+ Device "Generic Video Card"
+ Monitor "Generic Display"
+ DefaultDepth 24
+# SubSection "Display"
+# Depth 24
+# Modes "1024x768" "800x600"
+# EndSubSection
+EndSection'
+x_srvlayout='Section "ServerLayout"
+ Identifier "Default Layout"
+ Screen "Default Screen"
+ InputDevice "Generic Keyboard"
+ InputDevice "Generic Mouse"
+EndSection'
+x_dri='Section "DRI"
+ Mode 0666
+EndSection'
+# Xorg configuration file location
+xfc="/mnt/etc/X11/xorg.conf"
+
+# read the central configuration file (fixme: should the keyboard layout
+# defined within the xserver plugin settings - probably not, dvs)
+if [ -e /initramfs/machine-setup ] ; then
+ . /initramfs/machine-setup
+else
+ error " The central configuration file 'machine-setup' (produced by the \
+slxconfig-demuxer\n and transported via fileget) is not present" nonfatal
+fi
+
+if [ -e /etc/slxsystem.conf ]; then
+ . /etc/slxsystem.conf
+fi
+
+# directory for libGL, DRI library links to point to proper library set
+# depending on the hardware environment
+glliblinks="/mnt/var/X11R6/lib/"
+testmkd ${glliblinks}
+
+# check for the existance of plugin configuration and non-existance of an
+# admin provided config file in ConfTGZ
+if [ -e /initramfs/plugin-conf/xserver.conf -a \
+ ! -f /rootfs/etc/X11/xorg.conf ]; then
+ . /initramfs/plugin-conf/xserver.conf
+ # check if driver set via xserver_driver
+ # if so check for xserver_prefnongpl and xserver_driver because you want to
+ # force driver even if xserver_prefnongpl=0
+ # eg: [ -n "$xserver_driver" -o "$xserver_prefnongpl" -eq 1 ]
+ if [ -n "$xserver_driver" ]; then
+ if `grep -qi "Server Module" /etc/hwinfo.gfxcard`; then
+ sed -i "s,XFree86.*,FORCED XFree86 v4 Server Module: ${xserver_driver}," \
+ /etc/hwinfo.gfxcard
+ echo -e "\n# File modified by $1" >> /etc/hwinfo.gfxcard
+ echo "# Reason: attribute server_driver set to ${xserver_driver}" \
+ >> /etc/hwinfo.gfxcard
+ else
+ echo -e "\n# File modified by $1" >> /etc/hwinfo.gfxcard
+ echo "# Reason: attribute server_driver set to ${xserver_driver}" \
+ >> /etc/hwinfo.gfxcard
+ echo "FORCED XFree86 v4 Server Module: ${xserver_driver}" >> /etc/hwinfo.gfxcard
+ fi
+ fi
+ # do not start any configuration if the admin provided a preconfigured
+ # xorg.conf in /rootfs/etc/X11/xorg.conf
+ if [ $xserver_active -ne 0 -a ! -f /rootfs/${xfc#/mnt} ]; then
+ [ $DEBUGLEVEL -gt 0 ] && echo "executing the 'xserver' os-plugin ...";
+ xmodule=$(grep -i -m 1 "XFree86 v4 Server Module" /etc/hwinfo.gfxcard | \
+ sed "s/.*v4 Server Module: //")
+ # proprietary ATI/NVidia modules listed a different way with hwinfo
+ [ -z "$xmodule" ] || error "${hcfg_hwsetup}" nonfatal
+
+ ######################################################################
+ # begin proprietary drivers section (xorg.conf part)
+ ######################################################################
+
+ if $(grep -iq -m 1 'Module: fglrx' /etc/hwinfo.gfxcard) && \
+ [ -n "$xserver_driver" -o "$xserver_prefnongpl" -eq 1 ]
+ then
+ # we have an ati card here
+ PLUGIN_ROOTFS="/opt/openslx/plugin-repo/xserver/ati"
+ if [ -f /mnt${PLUGIN_ROOTFS}/usr/X11R6/lib/dri/fglrx_dri.so -o \
+ -f /mnt${PLUGIN_ROOTFS}/usr/lib/dri/fglrx_dri.so ]; then
+
+ # this will be written before standard module path into xorg.conf
+ MODULE_PATH="${PLUGIN_ROOTFS}/usr/lib/xorg/modules/\,\
+${PLUGIN_ROOTFS}/usr/X11R6/lib/modules/\,"
+ xmodule="fglrx"
+ PLUGIN_PATH="/mnt/${PLUGIN_ROOTFS}"
+
+ # impossible to load it directly via stage3 insmod - yes, somehow this is too big
+ chroot /mnt /sbin/insmod ${PLUGIN_ROOTFS}/modules/fglrx.ko
+
+ # workaround for bug #453 (for some ati graphics cards)
+ if [ $? -gt 0 -a "${slxconf_distro_name}" = "ubuntu" ]; then
+ xmodule="radeon"
+ MODULE_PATH="/usr/lib/xorg/modules/,/usr/X11R6/lib/xorg/modules/"
+ else
+
+ # we need some database for driver initialization
+ cp -r "${PLUGIN_PATH}/etc/ati" /mnt/etc
+
+ if [ "${slxconf_distro_name}" = "ubuntu" ]; then
+ echo "${PLUGIN_ROOTFS}/usr/lib/libGL.so.1" >> /mnt/etc/ld.so.preload
+ fi
+
+ # if fglrx_dri.so is linked wrong -> we have to link it here
+ if [ "1" -eq "$( ls -l /mnt/usr/lib/dri/fglrx_dri.so \
+ | grep -o "/var/X11R6.*so$" | wc -l )" ]; then
+ ln -s ${PLUGIN_ROOTFS}/usr/lib/dri/fglrx_dri.so \
+ ${glliblinks}dri/fglrx_dri.so
+ fi
+ BUSID=$(grep -m1 -i " SysFS BusID: .*" /etc/hwinfo.gfxcard | \
+ awk -F':' '{print "PCI:"$3":"$4}' | sed -e 's,\.,:,g')
+ echo -e "\t${PLUGIN_ROOTFS}/usr/bin/aticonfig --initial &>/dev/null"\
+ >> /mnt/etc/init.d/boot.slx
+ ATI=1
+ fi # if kernel module not loaded properly
+ fi
+ elif $(grep -iq -m 1 'Module: nvidia' /etc/hwinfo.gfxcard) && \
+ [ -n "$xserver_driver" -o "$xserver_prefnongpl" -eq 1 ]
+ then
+ # we have an nvidia card here
+ NVIDIA=1
+ PLUGIN_ROOTFS="/opt/openslx/plugin-repo/xserver/nvidia"
+ MODULE_PATH="${PLUGIN_ROOTFS}/usr/lib/xorg/modules/\,\
+${PLUGIN_ROOTFS}/usr/X11R6/lib/modules/\,"
+ xmodule="nvidia"
+ PLUGIN_PATH="/mnt${PLUGIN_ROOTFS}"
+
+ # if we can't find the nongpl kernel module, use gpl xorg
+ # nvidia driver
+ if [ -e ${PLUGIN_PATH}/modules/nvidia.ko ]; then
+ # sometimes the kernel module needs agpgart
+ modprobe agpgart
+ # insert kernel driver
+ chroot /mnt /sbin/insmod ${PLUGIN_ROOTFS}/modules/nvidia.ko
+
+
+ # workaround for bug #453 (Xorg does not start with ld.so.preload)
+ if [ "${slxconf_distro_name}" = "ubuntu" -a "${xmodule}" != "nvidia" ]; then
+ echo "${PLUGIN_ROOTFS}/usr/lib/libGL.so.1" >> /mnt/etc/ld.so.preload
+ fi
+
+ else
+ xmodule="nv"
+ fi
+
+ fi
+
+ ######################################################################
+ # end proprietary drivers xorg.conf section
+ ######################################################################
+
+ # write the xorg.conf completely or in files needed (depending on
+ # distro version)
+ # determine keyboard setup (fill XKEYBOARD)
+ localization "${country}"
+
+ # run distro specific generated stage3 script which uses variables
+ # defined in the beginning of this script like ${x_*}, ${xfc}
+ [ -e /mnt/opt/openslx/plugin-repo/xserver/xserver.sh ] && \
+ . /mnt/opt/openslx/plugin-repo/xserver/xserver.sh
+
+ # set nodeadkeys for special layouts
+ if [ ${XKEYBOARD} = "de" ]; then
+ sed -e '/\"XkbLayout\"/a\\ \ Option "XkbVariant" "nodeadkeys"' \
+ -i ${xfc}
+ fi
+ # if a synaptic touchpad is present, add it to the device list
+ if grep -q -E "ynaptics" /etc/hwinfo.mouse || \
+ dmesg | grep -q -E "ynaptics" ; then
+ sed -e '/\"CorePointer\"/ {
+a\
+EndSection\
+Section "InputDevice"\
+ Identifier "Synaptics TP"\
+ Driver "synaptics"\
+ Option "Device" "/dev/input/mice"\
+ Option "SendCoreEvents" "true"
+}' -e '/Device "Generic Mouse"/ {
+a\ \ InputDevice\ \ "Synaptics TP"\ \ \ \ \ \ "SendCoreEvents"
+}' -i ${xfc}
+ fi
+
+ # ModulePath for proprietary drivers (otherwise disabled)
+ if [ -n "$xserver_driver" -o "$xserver_prefnongpl" -eq "1" ]; then
+ sed -e "s,# ModulePath \", ModulePath \"${MODULE_PATH},g" \
+ -i ${xfc}
+ fi
+
+ ############################################
+ # Copy the appropriate ld.so.cache file
+ ############################################
+ if [ "${xmodule}" = "fglrx" -o "${xmodule}" = "nvidia" ]; then
+ cp ${PLUGIN_PATH}/ld.so.cache /mnt/etc/ld.so.cache
+
+ # just in case somebody needs to run ldconfig - insert GL-Libs at the beginning
+ sed -e "1s,^,include ${PLUGIN_ROOTFS}/ld.so.conf\n,g" -i /mnt/etc/ld.so.conf
+
+ if [ "${xmodule}" = "nvidia" ]; then
+ sed -i "s,\(Driver.*\"nvidia\"\),\1\n Option \"NoLogo\" \"True\"," ${xfc}
+ fi
+ fi
+
+ # check if tablet hardware available, read device information from file
+ if [ -e /etc/tablet.conf ]; then
+ . /etc/tablet.conf
+ echo -e 'Section "InputDevice"
+ Driver "wacom"
+ Identifier "Stylus"
+ Option "Device" "/dev/input/wacom"
+ Option "Type" "stylus"
+ Option "ForceDevice" "ISDV4" # Tablet PC ONLY
+EndSection
+Section "InputDevice"
+ Driver "wacom"
+ Identifier "Pad"
+ Option "Device" "/dev/input/wacom"
+ Option "Type" "pad"
+ Option "ForceDevice" "ISDV4" # Tablet PC ONLY
+EndSection
+Section "InputDevice"
+ Driver "wacom"
+ Identifier "Eraser"
+ Option "Device" "/dev/input/wacom"
+ Option "Type" "eraser"
+ Option "ForceDevice" "ISDV4" # Tablet PC ONLY
+EndSection
+Section "InputDevice"
+ Driver "wacom"
+ Identifier "Cursor"
+ Option "Device" "/dev/input/wacom"
+ Option "Type" "cursor"
+ Option "ForceDevice" "ISDV4" # Tablet PC ONLY
+EndSection' >> ${xfc}
+ sed -e "s,/dev/input/wacom,/dev/${wacomdev}," \
+ -e '/e \"Generic Mouse\"/a\\ \ InputDevice "Stylus" "SendCoreEvents"' \
+ -e '/e \"Generic Mouse\"/a\\ \ InputDevice "Pad" "SendCoreEvents"' \
+ -e '/e \"Generic Mouse\"/a\\ \ InputDevice "Cursor" "SendCoreEvents"' \
+ -e '/e \"Generic Mouse\"/a\\ \ InputDevice "Eraser" "SendCoreEvents"' \
+ -i ${xfc}
+ fi
+
+ # some configurations produce no proper screen resolution without
+ # Horizsync and Vertrefresh set (more enhancements might be needed for
+ # really old displays like CRTs)
+ if [ $xserver_ddcinfo -ne 0 ] ; then
+ # read /etc/hwinfo.display started at "runinithook '00-started'"
+ vert=$(grep -m 1 "Vert.*Range:" /etc/hwinfo.display | \
+ sed 's|.*Range:\ ||;s|\ Hz||')
+ horz=$(grep -m 1 "Hor.*Range:" /etc/hwinfo.display | \
+ sed 's|.*Range:\ ||;s|\ kHz||')
+ modl=$(grep -m 1 " Model: " /etc/hwinfo.display | \
+ sed 's|.*Model:\ ||;s|"||g')
+ size="$(grep -m 1 " Size: " /etc/hwinfo.display | \
+ sed 's|.*ize:\ ||;s|\ mm||;s|x|\ |')"
+ modes=$(grep -i "Resolution: .*@" /etc/hwinfo.display | \
+ awk '{print $2}'| sort -unr| awk -F '@' '{print "\"" $1 "\""}'|\
+ tr "\n" " ")
+ [ -n "$vert" -a -n "$horz" ] && \
+ sed -e "s|# Horizsync.*| Horizsync $horz|;\
+ s|# Vertrefre.*| Vertrefresh $vert|;\
+ s|# Modelname.*| Modelname \"$modl\"|" -i ${xfc}
+ [ -n "$size" ] && \
+ sed -e "s|# DisplaySi.*| DisplaySize $size|" -i ${xfc}
+ [ -n "$modes" ] && \
+ sed -e "s|# SubSection.*| SubSection \"Display\"|;\
+ s|# Depth 24.*| Depth 24|;\
+ s|# Modes.*| Modes $modes|;\
+ s|# EndSubSection.*| EndSubSection|;" -i ${xfc}
+
+ fi
+
+ [ $DEBUGLEVEL -gt 0 ] && echo "done with 'xserver' os-plugin ..."
+
+ fi
+elif [ ! -e /initramfs/plugin-conf/xserver.conf ]; then
+ [ $DEBUGLEVEL -gt 2 ] && \
+ echo "No configuration file found for xserver plugin."
+fi
diff --git a/src/os-plugins/plugins/xserver/files/README b/src/os-plugins/plugins/xserver/files/README
new file mode 100644
index 00000000..c13d9570
--- /dev/null
+++ b/src/os-plugins/plugins/xserver/files/README
@@ -0,0 +1,77 @@
+Some development notes
+======================
+
+
+Infos about ati-packages:
+Most are identical, even when 64bit packages have a different name
+Only a couple of cards have its own special package. We need to
+investigate, if they are different or one package works for all.
+
+It seems - only for the FireMV 2200 PCI graphics card, they offer an older
+version (8.25) of the unified fglrx-driver. For the FirMV PCIE-Card they
+offer a more recent Version (8.5).
+By the time of writing the drivers were at version 8.7
+
+From the ATI-FAQ:
+
+Q2: Which ATI graphics cards can use this driver?
+A2: The ATI Proprietary Linux driver currently supports Radeon 8500 and
+later AGP or PCI Express graphics products, as well as ATI FireGL 8700
+and later products. We do not currently plan to include support for any
+products earlier than this.
+
+Support for earlier graphics card can be achieved by "radeon" or "ati" drivers!
+
+===============================================================================
+
+Infos about nvidia packages:
+they seem to differ much more as ati if you search directly for a
+specific graphic card. But if you take a look on
+http://www.nvidia.com/object/unix.html there seem to be just 3 different
+ersions - all for different architectures (ia32, ia64, amd64)
+
+
+
+Supported graphics cards can be read from the nvidia-documentation
+
+For the 173.14.12-NVIDIA-Driver go to
+http://www.nvidia.com/object/linux_display_ia32_173.14.12.html
+and click on "Supported Products List" on the right side
+
+(below each unified driver a line to symbolize the evolution of
+ drivers - correct me if I'm wrong)
+
+173.14.12 driver: GeForce FX 5100 & all newer supported
+ |---------------------------------->
+ 71.86.06 driver: Riva TNT - GeForce 6800 Ultra
+|---------------|
+ 96.43.07 driver: some GeForce3 - GeForce 7900 ??
+ |---------------|
+
+The Question is, wether we need to support older graphics cards.
+Probably we don't need to bother because the user can download right
+driver package for his needs - almost the same interfaces for the installer...
+
+
+
+===============================================================================
+Taken from the readme on
+http://us.download.nvidia.com/XFree86/Linux-x86/96.43.07/README/README.txt
+
+since 96.43.07 no longer supported in the unified driver:
+
+ NVIDIA chip name Device PCI ID
+ ---------------------------------- ----------------------------------
+ RIVA TNT 0x0020
+ RIVA TNT2/TNT2 Pro 0x0028
+ RIVA TNT2 Ultra 0x0029
+ Vanta/Vanta LT 0x002C
+ RIVA TNT2 Model 64/Model 64 Pro 0x002D
+ Aladdin TNT2 0x00A0
+ GeForce 256 0x0100
+ GeForce DDR 0x0101
+ Quadro 0x0103
+ GeForce2 GTS/GeForce2 Pro 0x0150
+ GeForce2 Ti 0x0151
+ GeForce2 Ultra 0x0152
+ Quadro2 Pro 0x0153
diff --git a/src/os-plugins/plugins/xserver/files/ati-install.sh b/src/os-plugins/plugins/xserver/files/ati-install.sh
new file mode 100755
index 00000000..662b96bf
--- /dev/null
+++ b/src/os-plugins/plugins/xserver/files/ati-install.sh
@@ -0,0 +1,24 @@
+#!/bin/sh
+
+cd /opt/openslx/plugin-repo/xserver
+
+DISTRO=$1
+case $DISTRO in
+
+ ubuntu-9.10*)
+ ./ubuntu-ng-gfx-install.sh ati ${DISTRO}
+ ;;
+ ubuntu-9.04*)
+ ./ubuntu-ng-gfx-install.sh ati ${DISTRO}
+ ;;
+ ubuntu-8.10*)
+ ./ubuntu-ng-gfx-install.sh ati ${DISTRO}
+ ;;
+ ubuntu-*)
+ ./ubuntu-gfx-install.sh ati ${DISTRO}
+ ;;
+
+ suse-*)
+ ./suse-gfx-install.sh ati ${DISTRO}
+ ;;
+esac
diff --git a/src/os-plugins/plugins/xserver/files/nvidia-install.sh b/src/os-plugins/plugins/xserver/files/nvidia-install.sh
new file mode 100755
index 00000000..aa2b2269
--- /dev/null
+++ b/src/os-plugins/plugins/xserver/files/nvidia-install.sh
@@ -0,0 +1,138 @@
+#!/bin/bash
+
+##########################################################
+# Installs NVIDIA binary drivers into openslx plugin-repo
+##########################################################
+PLUGIN_PATH="/opt/openslx/plugin-repo/xserver"
+
+# we could easily pass this information via calling stage1 script and do not
+# need to find it our here ...
+DISTRO=$1
+
+
+# for development we take the only kernel version from normal systems
+if [ -L /boot/vmlinuz ]; then
+ KVERS=$(ls -l /boot/vmlinuz | awk -F "->" '{print $2}'| grep -P -o "2.6.*")
+else
+ KVERS=$(ls /boot/vmlinuz-* | head -n1 | awk -F "->" '{print $2}' | grep -P -o "2.6.*" )
+fi
+
+
+#change to plugin path
+cd ${PLUGIN_PATH}
+
+case ${DISTRO} in
+ ubuntu-9.10*)
+ ./ubuntu-ng-gfx-install.sh nvidia ${DISTRO}
+ ;;
+ ubuntu-9.04*)
+ ./ubuntu-ng-gfx-install.sh nvidia ${DISTRO}
+ ;;
+ ubuntu-8.10*)
+ ./ubuntu-ng-gfx-install.sh nvidia ${DISTRO}
+ ;;
+ ubuntu*)
+ ./ubuntu-gfx-install.sh nvidia ${DISTRO}
+ ;;
+ suse-1*)
+ ./suse-gfx-install.sh nvidia ${DISTRO}
+ ;;
+ # general purpose nvidia installer script
+ *)
+ echo "* Running general NVidia installer (expected in xserver::pkgpath)"
+ # unpack the nvidia installer; quickhack - expects just one package
+ echo " * Unpacking installer"
+ sh packages/NVIDIA-Linux-*.run -a -x >>nvidia-inst.log 2>&1
+ # prefix and paths should be matched more closely to each distro
+ # just demo at the moment ... but working at the moment
+ # without the kernel module
+ stdprfx=/opt/openslx/plugin-repo/xserver/nvidia
+
+ # backing up libglx.so and libGLcore.so
+ BACKUP_PATH=${stdprfx}/../mesa/usr/lib/xorg/modules/extensions
+ mkdir -p ${BACKUP_PATH}
+ if [ -f /usr/lib/xorg/modules/extensions/libglx.so ]; then
+ cp /usr/lib/xorg/modules/extensions/libGLcore.so ${BACKUP_PATH}
+ cp /usr/lib/xorg/modules/extensions/libglx.so ${BACKUP_PATH}
+ elif [ -f /usr/X11R6/lib/xorg/modules/extensions/libglx.so ]; then
+ cp /usr/X11R6/lib/xorg/modules/extensions/libglx.so ${BACKUP_PATH}
+ cp /usr/X11R6/lib/xorg/modules/extensions/libGLcore.so ${BACKUP_PATH}
+ touch ${BACKUP_PATH}/X11R6
+ fi
+ if [ -f /usr/lib/libGL.so.1.2 ]; then
+ cp /usr/lib/libGL.so.1.2 ${BACKUP_PATH}/../../..
+ elif [ -f /usr/X11R6/lib/libGL.so.1.2 ]; then
+ cp /usr/X11R6/lib/libGL.so.1.2 ${BACKUP_PATH}/../../..
+ touch ${BACKUP_PATH}/../../../X11R6
+ fi
+
+
+ # run the lib installer
+ echo " * Starting the library installer"
+ echo "Starting the lib installer" >>nvidia-inst.log
+ $(ls -d NVIDIA-Linux-*)/nvidia-installer -s -q -N --no-abi-note \
+ --x-prefix=${stdprfx}/usr --x-library-path=${stdprfx}/usr/lib \
+ --x-module-path=${stdprfx}/usr/lib/xorg/modules \
+ --opengl-prefix=${stdprfx}/usr --utility-prefix=${stdprfx}/usr \
+ --documentation-prefix=${stdprfx}/usr --no-runlevel-check \
+ --no-rpms --no-x-check --no-kernel-module \
+ --log-file-name=nvidia-lib.log >>nvidia-inst.log 2>&1
+ # how to get an idea of the installed kernel?
+ # run the kernel module creator (should be done for every kernel!?)
+ kernel=${KVERS}
+ echo " * Trying to compile a kernel module for $kernel"
+ echo "Starting the kernel $kernel installer" >>nvidia-inst.log
+ # we need the .config file in /usr/src/linux or where ever!
+ # we need scripts/genksyms/genksyms compiled via make scripts in /usr/src/linux
+ # option available in newer nvidia packages
+ cd /usr/src/linux-${kernel%-*}
+ # in suse we have the config file lying there
+ cp /boot/config-${kernel} .config
+ ARCH=$(cat .config| grep -o CONFIG_M.86=y |tail -n1|grep -o "[0-9]86")
+ SUFFIX=${kernel##*-}
+ #cp -r /usr/src/linux-${kernel%-*}-obj/i${ARCH}/${SUFFIX}/ \
+ # /usr/src/linux-${kernel%-*}
+ make oldconfig >/dev/null 2>&1
+ make prepare >/dev/null 2>&1
+ cd - >/dev/null 2>&1
+ #/usr/src/linux-${kernel%-*}
+ addopts="--no-cc-version-check"
+ $(ls -d NVIDIA-Linux-*)/nvidia-installer -s -q -N -K --no-abi-note \
+ --kernel-source-path=/usr/src/linux-${kernel%-*} \
+ --kernel-include-path=/usr/src/linux-${kernel%-*}-obj/i${ARCH}/${SUFFIX}/include \
+ -k ${kernel} \
+ --kernel-install-path=/opt/openslx/plugin-repo/xserver/nvidia/modules \
+ --no-runlevel-check --no-abi-note --no-rpms ${addopts} \
+ --log-file-name=nvidia-kernel.log >>nvidia-inst.log 2>&1
+ if [ $? -gt 0 ];then
+ echo "* kernel module built failed!"
+ fi
+ echo " * Have a look into the several *.log files in "
+ echo " stage1/${DISTRO}/plugin-repo/xserver"
+
+
+ # redo some unwanted changes of nvidia-installer
+ if [ -f ${BACKUP_PATH}/libglx.so ]; then
+ cp ${BACKUP_PATH}/libGLcore.so /usr/lib/xorg/modules/extensions
+ cp ${BACKUP_PATH}/libglx.so /usr/lib/xorg/modules/extensions
+ if [ -f ${BACKUP_PATH}/X11R6 ]; then
+ cp ${BACKUP_PATH}/libGLcore.so /usr/X11R6/lib/xorg/modules/extensions
+ cp ${BACKUP_PATH}/libglx.so /usr/X11R6/lib/xorg/modules/extensions
+ fi
+ fi
+ if [ -f ${BACKUP_PATH}/../../../libGL.so.1.2 ]; then
+ cp ${BACKUP_PATH}/../../../libGL.so.1.2 /usr/lib
+ ln -sf /usr/lib/libGL.so.1.2 /usr/lib/libGL.so.1
+ ln -sf /usr/lib/libGL.so.1.2 /usr/lib/libGL.so
+ elif [ -f ${BACKUP_PATH}/../../../X11R6 ]; then
+ cp ${BACKUP_PATH}/../../../libGL.so.1.2 /usr/X11R6/lib/
+ ln -sf /usr/lib/libGL.so.1.2 /usr/lib/libGL.so.1
+ ln -sf /usr/lib/libGL.so.1.2 /usr/lib/libGL.so
+ fi
+
+
+ ;;
+esac
+
+# set a proper return value to evaluate it in the calling script
+exit 0
diff --git a/src/os-plugins/plugins/xserver/files/suse-gfx-install.sh b/src/os-plugins/plugins/xserver/files/suse-gfx-install.sh
new file mode 100755
index 00000000..ac6713fb
--- /dev/null
+++ b/src/os-plugins/plugins/xserver/files/suse-gfx-install.sh
@@ -0,0 +1,330 @@
+#!/bin/bash
+
+#
+# supported:
+# nvidia:
+# * 10.2 (pkg-installer)
+# * 11.0 (zypper rpm packages)
+# * 11.1 (zypper rpm packages)
+#
+# ati:
+# * 10.2 (pkg-installer)
+# * 11.0 (zypper rpm packages)
+# * 11.1 (zypper rpm packages)
+#
+
+# not right any more - removed from script
+# is there any busybox in this environment
+#BUSYBOX="/mnt/opt/openslx//busybox/busybox"
+
+BASE=/opt/openslx/plugin-repo/xserver
+DISTRO=$2
+cd ${BASE}
+
+if [ -L /boot/vmlinuz ]; then
+ KSUFFIX=$(ls -l /boot/vmlinuz | grep -P -o -e "-[a-z]*$" )
+ KVERS=$(ls -l /boot/vmlinuz | awk -F "->" '{print $2}'| grep -P -o "2.6.*")
+else
+ KSUFFIX=$(ls /boot/vmlinuz-* | head -n1 | grep -P -o -e "-[a-z]*$" )
+ KVERS=$(ls /boot/vmlinuz-* | head -n1 | awk -F "->" '{print $2}' | grep -P -o "2.6.*" )
+
+fi
+
+if [ -z "${KSUFFIX}" ]; then
+ echo "Could not determine proper local kernel suffix!"
+ echo "This is needed to install kernel modules for graphics drivers!"
+ exit 1
+fi
+
+
+buildfglrx() {
+ # build ATI kernel module
+ cd ${BASE}/ati/usr/src/kernel-modules/fglrx
+ rm -rf fglrx.ko >/dev/null 2>&1
+ make KVER=${1} >/dev/null 2>&1
+ if [ "$?" -eq "0" ]; then
+ cp fglrx.ko ../../../../modules
+ else
+ echo -e "Kernel module for kernel ${1} could not be built!"
+ fi
+ cd - >/dev/null 2>&1
+}
+
+
+##########################################################################
+# NVidia section
+##########################################################################
+if [ "$1" = "nvidia" ]; then
+ if [ -e nvidia/usr/lib/libGL.so.1 ]; then
+ exit
+ fi
+ if [ ! -d nvidia ]; then
+ mkdir -p nvidia/{modules,usr,temp}
+ fi
+ cd nvidia/temp
+
+ case ${DISTRO} in
+ suse-10.2*)
+ echo "* Running general NVidia installer (expected in xserver::pkgpath)"
+ # unpack the nvidia installer; quickhack - expects just one package
+ echo " * Unpacking installer"
+ sh ../../packages/NVIDIA-Linux-*.run -a -x >>nvidia-inst.log 2>&1
+ # prefix and paths should be matched more closely to each distro
+ # just demo at the moment ... but working at the moment
+ # without the kernel module
+ stdprfx=/opt/openslx/plugin-repo/xserver/nvidia
+
+ # backing up libglx.so and libGLcore.so
+ bkpprfx=${stdprfx}/../mesa/lib/xorg/modules/extensions
+ mkdir -p ${bkpprfx}
+ if [ -f /usr/lib/xorg/modules/extensions/libglx.so ]; then
+ cp /usr/lib/xorg/modules/extensions/libGLcore.so ${bkpprfx}
+ cp /usr/lib/xorg/modules/extensions/libglx.so ${bkpprfx}
+ elif [ -f /usr/X11R6/lib/xorg/modules/extensions/libglx.so ]; then
+ cp /usr/X11R6/lib/xorg/modules/extensions/libglx.so ${bkpprfx}
+ cp /usr/X11R6/lib/xorg/modules/extensions/libGLcore.so ${bkpprfx}
+ touch ${bkpprfx}/../../../../X11R6
+ fi
+ if [ -f /usr/lib/libGL.so.1.2 ]; then
+ cp /usr/lib/libGL.so.1.2 ${bkpprfx}/../../..
+ elif [ -f /usr/X11R6/lib/libGL.so.1.2 ]; then
+ cp /usr/X11R6/lib/libGL.so.1.2 ${bkpprfx}/../../..
+ touch ${bkpprfx}/../../../X11R6
+ fi
+
+
+ # run the lib installer
+ echo " * Starting the library installer"
+ echo "Starting the lib installer" >>nvidia-inst.log
+ $(ls -d NVIDIA-Linux-*)/nvidia-installer -s -q -N --no-abi-note \
+ --x-prefix=${stdprfx}/usr --x-library-path=${stdprfx}/usr/lib \
+ --x-module-path=${stdprfx}/usr/lib/xorg/modules \
+ --opengl-prefix=${stdprfx}/usr --utility-prefix=${stdprfx}/usr \
+ --documentation-prefix=${stdprfx}/usr --no-runlevel-check \
+ --no-rpms --no-x-check --no-kernel-module \
+ --log-file-name=nvidia-lib.log >>nvidia-inst.log 2>&1
+ # how to get an idea of the installed kernel?
+ # run the kernel module creator (should be done for every kernel!?)
+ kernel=${KVERS}
+ echo " * Trying to compile a kernel module for $kernel"
+ echo "Starting the kernel module installer for $kernel" >>nvidia-inst.log
+ # we need the .config file in /usr/src/linux or where ever!
+ # we need scripts/genksyms/genksyms compiled via make scripts in /usr/src/linux
+ # option available in newer nvidia packages
+ cd /usr/src/linux-${kernel%-*}
+ # in suse we have the config file lying there
+ cp /boot/config-${kernel} .config
+ ARCH=$(cat .config| grep -o CONFIG_M.86=y |tail -n1|grep -o "[0-9]86")
+ SUFFIX=${kernel##*-}
+ cp -r /usr/src/linux-${kernel%-*}-obj/i${ARCH}/${SUFFIX}/ \
+ /usr/src/linux-${kernel%-*}
+ make scripts >/dev/null 2>&1
+ make prepare >/dev/null 2>&1
+ cd - >/dev/null 2>&1
+ #/usr/src/linux-${kernel%-*}
+ addopts="--no-cc-version-check"
+ $(ls -d NVIDIA-Linux-*)/nvidia-installer -s -q -N -K --no-abi-note \
+ --kernel-source-path=/usr/src/linux-${kernel%-*} \
+ -k ${kernel} \
+ --kernel-install-path=/opt/openslx/plugin-repo/xserver/nvidia/modules \
+ --no-runlevel-check --no-abi-note --no-rpms ${addopts} \
+ --log-file-name=nvidia-kernel.log >>nvidia-inst.log 2>&1
+ if [ $? -gt 0 ];then
+ echo "* kernel module built failed!"
+ echo "* Have a look into the several log files in "
+ echo " stage1/${DISTRO}/plugin-repo/xserver"
+ fi
+
+
+ # redo some unwanted changes of nvidia-installer
+ if [ -f ${bkpprfx}/libglx.so ]; then
+ cp ${bkpprfx}/libGLcore.so /usr/lib/xorg/modules/extensions
+ cp ${bkpprfx}/libglx.so /usr/lib/xorg/modules/extensions
+ if [ -f ${bkpprfx}/X11R6 ]; then
+ cp ${bkpprfx}/libGLcore.so /usr/X11R6/lib/xorg/modules/extensions
+ cp ${bkpprfx}/libglx.so /usr/X11R6/lib/xorg/modules/extensions
+ fi
+ fi
+ if [ -f ${bkpprfx}/../../../libGL.so.1.2 ]; then
+ cp ${bkpprfx}/../../../libGL.so.1.2 /usr/lib
+ ln -sf /usr/lib/libGL.so.1.2 /usr/lib/libGL.so.1
+ ln -sf /usr/lib/libGL.so.1.2 /usr/lib/libGL.so
+ fi
+ ;;
+ suse-11.*)
+ echo "* Downloading nvidia rpm packages... this could take some time..."
+ # add repository for nvidia drivers
+ case ${DISTRO} in
+ suse-11.0*)
+ REPO=http://download.nvidia.com/opensuse/11.0/
+ ;;
+ suse-11.1*)
+ REPO=http://download.nvidia.com/opensuse/11.1/
+ ;;
+ esac
+ zypper --no-gpg-checks addrepo ${REPO} NVIDIA > /dev/null 2>&1
+ # get URLs by virtually installing nvidia-OpenGL driver
+ zypper --no-gpg-checks -n -vv install -D \
+ nvidia-gfxG01-kmp${KSUFFIX} > logfile 2>&1
+
+ # zypper refresh is requested if something is not found
+ if [ "1" -le "$(cat logfile | grep -o "zypper refresh"| wc -l)" ]; then
+ zypper --no-gpg-checks refresh >/dev/null 2>&1
+ fi
+
+ # take unique urls from logfile
+ URLS=$(cat logfile | grep -P -o "http://.*?rpm " | sort -u | xargs)
+ for RPM in $URLS; do
+ RNAME=$(echo ${RPM} | sed -e 's,^.*/\(.*\)$,\1,g')
+ if [ ! -e ${RNAME} ]; then
+ wget ${RPM} > /dev/null 2>&1
+ fi
+ # We use rpm2cpio from suse to extract
+ if [ -f ${RNAME} ]; then
+ rpm2cpio ${RNAME} | cpio -id > /dev/null 2>&1
+ fi
+ done
+ if [ -d ./usr/X11R6/lib ]; then
+ mv ./usr/X11R6/lib/* ./usr/lib/
+ fi
+ if [ $(find ./usr/ -name *.so* 2>/dev/null | wc -l ) -eq 0 ]; then
+ echo " NVIDIA files failed to install via zypper!!"
+ exit
+ fi
+
+ rm -rf ../usr
+ if [ -d ./usr ]; then
+ mv ./usr ..
+ fi
+ find lib/ -name "*.ko" -exec mv '{}' ../modules \; > /dev/null 2>&1
+ if [ $? -ne 0 ]; then
+ echo " Could not find kernel module nvidia.ko!";
+ fi
+
+ cd ..
+ ;;
+ esac
+
+ rm -rf temp/
+ cd ..
+
+fi
+
+
+############################################################################
+# ATI section
+############################################################################
+if [ "$1" = "ati" ]; then
+ if [ -e ati/usr/lib/libGL.so.1.2 ]; then
+ exit
+ fi
+
+ mkdir -p ati/modules ati/temp
+
+ case ${DISTRO} in
+ suse-10.2*)
+ ### SUSE 10.2 section ###
+ echo "* Extracting ATI package (expected in xserver::pkgpath) ... this could take some time..."
+
+ PKG=`find packages/ -name ati-driver*\.run | tail -n1`
+ PKG_VERSION=`head ${PKG} | grep -P -o "[0-9]\.[0-9]{3}"`
+
+ chmod +x ${PKG}
+
+ ${PKG} --extract ati/temp >/dev/null 2>&1
+
+ cd ati/temp/
+ RPM=`./ati-installer.sh ${PKG_VERSION} --buildpkg SuSE/SUSE102-IA32 2>&1 | grep Package | awk '{print $2}' | tail -n1`
+
+ cd ..
+ rpm2cpio ${RPM} 2>/dev/null | cpio -id >/dev/null 2>&1
+
+
+ if [ -d ./usr/X11R6/lib ]; then
+ mv ./usr/X11R6/lib/* ./usr/lib/
+ fi
+ if [ -d etc ]; then
+ cp -r etc/* /etc/
+ fi
+
+ # cleanup
+ rm -rf ${RPM}
+ cd ..
+ rm -rf ${PKG}
+
+
+ buildfglrx ${KVERS}
+
+ ;;
+ suse-11.*)
+ ### SUSE 11.0 Section ###
+
+ echo "* Downloading ati rpm packages... this could take some time..."
+ cd ati/temp
+
+ # add repository for ATI drivers
+ case ${DISTRO} in
+ suse-11.0*)
+ zypper --no-gpg-checks addrepo http://www2.ati.com/suse/11.0/ ATI > /dev/null 2>&1
+ ;;
+ suse-11.1*)
+ zypper --no-gpg-checks addrepo http://www2.ati.com/suse/11.1/ ATI > /dev/null 2>&1
+ ;;
+ esac
+ # get URLs by virtually installing fglrx-OpenGL driver
+ zypper --no-gpg-checks -n -vv install -D ati-fglrxG01-kmp${KSUFFIX} \
+ x11-video-fglrxG01 > logfile 2>&1
+
+ # zypper refresh is requested if something is not found
+ if [ "1" -le "$(cat logfile | grep -o "zypper refresh" | wc -l)" ]; then
+ zypper --no-gpg-check refresh >/dev/null 2>&1
+ fi
+
+ # take unique urls from logfile
+ URLS=$(cat logfile | grep -P -o "http://.*?rpm " | grep fglrx | sort -u | xargs)
+ for RPM in $URLS; do
+ RNAME=$(echo ${RPM} | sed -e 's,^.*/\(.*\)$,\1,g')
+ if [ ! -e ${RNAME} ]; then
+ wget ${RPM} > /dev/null 2>&1
+ fi
+ # We use rpm2cpio from suse to extract -> propably new rpm version
+ if [ -f ${RNAME} ]; then
+ rpm2cpio ${RNAME} | cpio -id > /dev/null 2>&1
+ fi
+ done
+
+ if [ -d ./usr/X11R6/lib ]; then
+ mv ./usr/X11R6/lib/* ./usr/lib/ > /dev/null 2>&1
+ fi
+ if [ $(find ./usr/ -name *.so* 2>/dev/null | wc -l ) -eq 0 ]; then
+ echo " ATI files failed to install via zypper!!"
+ exit
+ fi
+
+ mv ./usr ..
+ mv ./etc ..
+
+ find lib/ -name "*.ko" -exec mv {} ../modules \; >/dev/null 2>&1
+ if [ $? -ne 0 ]; then
+ echo " Could not find kernel module fglrx.ko!";
+ fi
+
+ ;;
+ esac
+ cd ..
+
+ # OpenGl implementation (libGL?) expect fglrx_dri.so in /usr/X11R6/lib/dri/
+ if [ ! -f /usr/X11R6/lib/modules/dri/fglrx_dri.so -a \
+ ! -f usr/X11R6/lib/modules/dri/fglrx_dri.so ]; then
+ if [ ! -d /usr/X11R6/lib/modules/dri ]; then
+ mkdir -p /usr/X11R6/lib/modules/dri
+ fi
+ if [ -f usr/lib/dri/fglrx_dri.so ]; then
+ ln -s ${BASE}/ati/usr/lib/dri/fglrx_dri.so \
+ /usr/X11R6/lib/modules/dri/fglrx_dri.so
+ fi
+ fi
+
+ rm -rf temp/
+fi
+
diff --git a/src/os-plugins/plugins/xserver/files/ubuntu-gfx-install.sh b/src/os-plugins/plugins/xserver/files/ubuntu-gfx-install.sh
new file mode 100755
index 00000000..c6ac17c9
--- /dev/null
+++ b/src/os-plugins/plugins/xserver/files/ubuntu-gfx-install.sh
@@ -0,0 +1,124 @@
+#!/bin/sh
+
+# gets needed packages for ubuntu nvidia/ati drivers
+# $1 = nvidia | ati
+PLUGIN_FOLDER="/opt/openslx/plugin-repo/xserver"
+TMP_FOLDER="/tmp/slx-plugin/xserver"
+TARGET="$1"
+DISTRO="$2"
+
+if [ ! -d "${PLUGIN_FOLDER}" ]; then
+ mkdir -p "${PLUGIN_FOLDER}/modules"
+fi
+
+# change into temp
+cd ${TMP_FOLDER} > /dev/null
+
+if [ -e "/boot/vmlinuz" ]; then
+ KVER=$(ls -ahl '/boot/vmlinuz' | sed -e 's,^.*vmlinuz-,,g')
+else
+ KVER=$(find /lib/modules/2.6* -maxdepth 0|sed 's,/lib/modules/,,g'|sort|tail -n1)
+fi
+
+
+echo " * downloading restricted modules... this may take a while"
+# TODO: remove commented out "> /dev/null ..." later... multiple times
+# in this script! check all comments!
+aptitude download linux-restricted-modules-${KVER} #> /dev/null 2&>1
+if [ $? -eq 1 ]; then
+ echo " * Didn't get restricted modules. Exit now!"
+ #TODO: remove sh when development is finished
+ sh
+ exit
+fi
+MODULE_DEB=$(ls linux-restricted-modules-*.deb | tail -n1)
+dpkg-deb -x ${MODULE_DEB} ${TMP_FOLDER}/modules
+
+case ${TARGET} in
+ ati)
+ mkdir -p ${PLUGIN_FOLDER}/ati
+ mkdir -p ${PLUGIN_FOLDER}/ati/modules
+
+ echo " * downloading fglrx xorg package... this may take a while"
+ aptitude download xorg-driver-fglrx #> /dev/null 2&>1
+ if [ $? -eq 1 ]; then
+ echo " * Didn't get package xorg-driver-fglrx! Exit now!"
+ #TODO: remove sh when development is finished
+ sh
+ exit
+ fi
+ FGLRX_DEB=$(ls xorg-driver-fglrx_*.deb | tail -n1)
+ # extract $DEB
+ dpkg-deb -x ${FGLRX_DEB} ${PLUGIN_FOLDER}/ati
+
+ # assemble module
+ cd modules/lib/linux-restricted-modules/${KVER}/
+ ld_static -d -r -o ${PLUGIN_FOLDER}/ati/modules/fglrx.ko fglrx/*
+
+ if [ -f /usr/lib/dri/fglrx_dri.so ]; then
+ mv /usr/lib/dri/fglrx_dri.so /usr/lib/dri/fglrx_dri.so.slx
+ else
+ # remove link
+ rm -rf /usr/lib/dri/fglrx_dri.so
+ fi
+ ln -s ${PLUGIN_FOLDER}/ati/usr/lib/dri/fglrx_dri.so \
+ /usr/lib/dri/fglrx_dri.so
+
+ # Recent ATI drivers expect the driver link in /xyz
+ if [ ! -d /usr/X11R6/lib/modules/dri ]; then
+ mkdir -p /usr/X11R6/lib/modules/dri
+ fi
+ ln -s ${PLUGIN_FOLDER}/ati/usr/lib/dri/fglrx_dri.so \
+ /usr/X11R6/lib/modules/dri/fglrx_dri.so
+
+ # cleanup
+ cd ${PLUGIN_FOLDER}/ati
+
+ #@Volker: We need /etc-files - there is a database
+ # file for the fglrx-driver in stage3 !!!
+ #rm -rf ./etc
+ #TODO: check for more cleanups when the main part works!
+
+ ;;
+
+
+ nvidia)
+ mkdir -p ${PLUGIN_FOLDER}/nvidia
+ mkdir -p ${PLUGIN_FOLDER}/nvidia/modules
+
+ echo " * downloading fglrx xorg package... this may take a while"
+ aptitude download nvidia-glx-new #> /dev/null 2&>1
+ if [ $? -eq 1 ]; then
+ echo " * Didn't get package nvidia-glx-new!"
+ #TODO: remove sh when development is finished
+ sh
+ exit
+ fi
+ #Bastian: what is this? please explain
+ #aptitude download nvidia-glx
+ NVIDIA_DEB=$(ls nvidia-glx*.deb | tail -n1)
+ # extract $DEB
+ dpkg-deb -x ${NVIDIA_DEB} ${PLUGIN_FOLDER}/nvidia
+
+ # assemble module - we just need the new one here
+ # TODO: modules for older graphics hardware can be found here
+ cd modules/lib/linux-restricted-modules/${KVER}/
+ ld_static -d -r -o ${PLUGIN_FOLDER}/nvidia/modules/nvidia.ko nvidia_new/*
+
+ #TODO: if we use this part, we need to copy the check from ati, too!
+ #if [ -f /usr/lib/dri/fglrx_dri.so ]; then
+ # mv /usr/lib/dri/fglrx_dri.so /usr/lib/dri/fglrx_dri.so.slx
+ #else
+ # # remove link
+ # rm -rf /usr/lib/dri/fglrx_dri.so
+ #fi
+ #ln -s ${PLUGIN_FOLDER}/nvidia/nvroot/usr/lib/dri/nvidia_dri.so \
+ # /usr/lib/dri/fglrx_dri.so
+
+ # cleanup
+ cd ${PLUGIN_FOLDER}/nvidia
+ rm -rf ./etc
+ #TODO: check for more cleanups when the main part works!
+ ;;
+esac
+
diff --git a/src/os-plugins/plugins/xserver/files/ubuntu-ng-gfx-install.sh b/src/os-plugins/plugins/xserver/files/ubuntu-ng-gfx-install.sh
new file mode 100755
index 00000000..259f2650
--- /dev/null
+++ b/src/os-plugins/plugins/xserver/files/ubuntu-ng-gfx-install.sh
@@ -0,0 +1,236 @@
+#!/bin/sh
+
+# gets needed packages for ubuntu nvidia/ati drivers
+# $1 = nvidia | ati
+PLUGIN_FOLDER="/opt/openslx/plugin-repo/xserver"
+TMP_FOLDER="/tmp/slx-plugin/xserver"
+TARGET="$1"
+
+if [ ! -d "${PLUGIN_FOLDER}" ]; then
+ mkdir -p "${PLUGIN_FOLDER}/modules"
+fi
+
+# change into temp
+cd ${TMP_FOLDER} > /dev/null
+
+if [ -e "/boot/vmlinuz" ]; then
+ KVER=$(ls -ahl '/boot/vmlinuz' | sed -e 's,^.*vmlinuz-,,g')
+else
+ KVER=$(find /lib/modules/2.6* -maxdepth 0|sed 's,/lib/modules/,,g'|sort|tail -n1)
+fi
+
+# TODO: check for build-essential !!
+
+if [ ! -e "/usr/sbin/dkms" ]; then
+ echo -n " * DKMS not found: installing .."
+ aptitude -y install dkms > /dev/null 2>&1
+ if [ $? -eq 1 ]; then
+ echo "fail"
+ echo " * Didn't get package dkms! Exit now!"
+ exit 1
+ else
+ echo "ok"
+ fi
+fi
+
+# TODO: find a more clean way for this workaround
+# the current dkms script included in ubuntu is trying to compile
+# kernel modules under the user nobody using "su" which is not
+# working in the installation phase of the plugin.
+
+if [ $(grep -c "getent passwd nobody" /usr/sbin/dkms) -ne 0 ]; then
+ echo -n " * Patch DKMS not to run under user nobody .."
+ sed -i "s/getent passwd nobody/getent passwd N0/" \
+ /usr/sbin/dkms
+ echo "ok"
+fi
+
+case ${TARGET} in
+ ati)
+ mkdir -p ${PLUGIN_FOLDER}/ati/modules
+
+ echo -n " * downloading fglrx xorg package... "
+ aptitude download xorg-driver-fglrx > /dev/null 2>&1
+ if [ $? -eq 1 ]; then
+ echo "fail"
+ echo " * Didn't get package xorg-driver-fglrx! Exit now!"
+ exit 1
+ else
+ echo "ok"
+ fi
+ FGLRX_DEB=$(ls xorg-driver-fglrx_*.deb | tail -n1)
+ # extract $DEB
+ dpkg-deb -x ${FGLRX_DEB} ${PLUGIN_FOLDER}/ati
+
+ echo -n " * downloading fglrx kernel package... "
+ aptitude download fglrx-kernel-source >/dev/null 2>&1
+ if [ $? -eq 1 ]; then
+ echo "fail"
+ echo " * Didn't get package fglrx-kernel-source!"
+ exit 1
+ else
+ echo "ok"
+ fi
+
+ FGLRX_KERNEL_DEB=$(ls fglrx-kernel-source*.deb | tail -n1)
+ dpkg-deb -x ${FGLRX_KERNEL_DEB} /
+
+ FGLRX_SOURCE_DIR=$(find /usr/src/fglrx-${FGLRX_DRIVER_VERSION}* \
+ -maxdepth 0 -type d)
+ FGLRX_FULL_VERSION=$(echo ${FGLRX_SOURCE_DIR} | \
+ sed -e 's/\/usr\/src\/fglrx-//')
+
+ FGLRX_DKMS_DIR="/var/lib/dkms/fglrx/${FGLRX_FULL_VERSION}"
+
+ if [ -d /var/lib/dkms/fglrx/${FGLRX_FULL_VERSION} ]; then
+ if [ ! -L ${FGLRX_DKMS_DIR}/source ]; then
+ ln -sf ${FGLRX_SOURCE_DIR} ${FGLRX_DKMS_DIR}/source
+ fi
+ else
+ echo -n " * Add fglrx kernel module to dkms tree... "
+ dkms add -m fglrx -v ${FGLRX_FULL_VERSION} >/dev/null 2>&1
+ if [ $? -eq 0 ]; then
+ echo "ok"
+ else
+ echo "fail"
+ exit 1
+ fi
+ fi
+
+ ###### build kernel module ######
+ echo -n " * Building fglrx kernel module for kernel ${KVER}... "
+ dkms -m fglrx -v ${FGLRX_FULL_VERSION} \
+ -k ${KVER} \
+ --kernelsourcedir /usr/src/linux-headers-${KVER}/ \
+ --no-prepare-kernel \
+ --no-clean-kernel \
+ build \
+ > /tmp/dkms.log 2>&1
+ if [ $? -eq 0 ]; then
+ echo "ok"
+ else
+ if $(cat /tmp/dkms.log | grep -q "has already"); then
+ echo "--- fglrx module already built ---"
+ else
+ echo "fail"
+ echo "------ dkms.log -----"
+ cat /tmp/dkms.log
+ echo "---------------------"
+ rm /tmp/dkms.log
+ exit 1
+ fi
+ fi
+
+ FGLRX_MODULE_PATH=$(find ${FGLRX_DKMS_DIR}/${KVER}/ -name fglrx.ko \
+ | tail -n1 )
+
+ cp ${FGLRX_MODULE_PATH} ${PLUGIN_FOLDER}/ati/modules/fglrx.ko
+
+ # cleanup
+ if [ -f /usr/lib/dri/fglrx_dri.so ]; then
+ mv /usr/lib/dri/fglrx_dri.so /usr/lib/dri/fglrx_dri.so.slx
+ else
+ # remove link
+ rm -rf /usr/lib/dri/fglrx_dri.so
+ fi
+ ln -s ${PLUGIN_FOLDER}/ati/usr/lib/dri/fglrx_dri.so \
+ /usr/lib/dri/fglrx_dri.so
+
+ # cleanup
+ rm /tmp/dkms.log
+ cd ${PLUGIN_FOLDER}/ati
+
+ ;;
+
+
+ nvidia)
+ mkdir -p ${PLUGIN_FOLDER}/nvidia/modules
+
+ NVIDIA_DRIVER_VERSION=173
+
+ echo -n " * downloading nvidia xorg package... "
+ aptitude download nvidia-glx-${NVIDIA_DRIVER_VERSION} > /dev/null 2>&1
+ if [ $? -eq 1 ]; then
+ echo "fail"
+ echo " * Didn't get package nvidia-glx-${NVIDIA_DRIVER_VERSION}!"
+ exit 1
+ else
+ echo "ok"
+ fi
+
+ echo -n " * downloading nvidia kernel package... "
+ aptitude download nvidia-${NVIDIA_DRIVER_VERSION}-kernel-source >/dev/null 2>&1
+ if [ $? -eq 1 ]; then
+ echo "fail"
+ echo " * Didn't get package nvidia-${NVIDIA_DRIVER_VERSION}-kernel-source!"
+ exit 1
+ else
+ echo "ok"
+ fi
+
+ NVIDIA_DEB=$(ls -1 nvidia-glx*.deb | tail -n1)
+ NVIDIA_KERNEL_DEB=$(ls -1 nvidia-${NVIDIA_DRIVER_VERSION}-kernel-source*.deb | tail -n1)
+ # extract $DEB
+ dpkg-deb -x ${NVIDIA_DEB} ${PLUGIN_FOLDER}/nvidia
+ # extract the sources deb to root
+ dpkg-deb -x ${NVIDIA_KERNEL_DEB} /
+
+ NVIDIA_SOURCE_DIR=$(find /usr/src/nvidia-${NVIDIA_DRIVER_VERSION}* \
+ -maxdepth 0 -type d)
+ NVIDIA_FULL_VERSION=$(echo ${NVIDIA_SOURCE_DIR} | \
+ sed -e 's/\/usr\/src\/nvidia-//')
+
+ NVIDIA_DKMS_DIR="/var/lib/dkms/nvidia/${NVIDIA_FULL_VERSION}"
+
+ if [ -d /var/lib/dkms/nvidia/${NVIDIA_FULL_VERSION} ]; then
+ if [ ! -L ${NVIDIA_DKMS_DIR}/source ]; then
+ ln -sf ${NVIDIA_SOURCE_DIR} ${NVIDIA_DKMS_DIR}/source
+ fi
+ else
+ echo -n " * Add nvidia kernel module to dkms tree... "
+ dkms add -m nvidia -v ${NVIDIA_FULL_VERSION} >/dev/null 2>&1
+ if [ $? -eq 0 ]; then
+ echo "ok"
+ else
+ echo "fail"
+ exit 1
+ fi
+ fi
+
+ ###### build kernel module ######
+ echo -n " * Building nvidia kernel module for kernel ${KVER}... "
+ dkms -m nvidia -v ${NVIDIA_FULL_VERSION} \
+ -k ${KVER} \
+ --kernelsourcedir /usr/src/linux-headers-${KVER}/ \
+ --no-prepare-kernel \
+ --no-clean-kernel \
+ build \
+ > /tmp/dkms.log 2>&1
+ if [ $? -eq 0 ]; then
+ echo "ok"
+ else
+ if $(cat /tmp/dkms.log | grep -q "has already"); then
+ echo "--- nvidia module already built ---"
+ else
+ echo "fail"
+ echo "------ dkms.log -----"
+ cat /tmp/dkms.log
+ echo "---------------------"
+ rm /tmp/dkms.log
+ exit 1
+ fi
+ fi
+
+ NVIDIA_MODULE_PATH=$(find ${NVIDIA_DKMS_DIR}/${KVER}/ -name \
+ nvidia.ko | tail -n 1)
+
+ cp ${NVIDIA_MODULE_PATH} ${PLUGIN_FOLDER}/nvidia/modules/nvidia.ko
+
+ # cleanup
+ rm /tmp/dkms.log
+ cd ${PLUGIN_FOLDER}/nvidia
+ rm -rf ./etc
+ #TODO: check for more cleanups when the main part works!
+ ;;
+esac
+
diff --git a/src/os-plugins/plugins/xserver/init-hooks/00-started/xserver.sh b/src/os-plugins/plugins/xserver/init-hooks/00-started/xserver.sh
new file mode 100644
index 00000000..0b08ec13
--- /dev/null
+++ b/src/os-plugins/plugins/xserver/init-hooks/00-started/xserver.sh
@@ -0,0 +1,53 @@
+# Copyright (c) 2008 - RZ Uni Freiburg
+# Copyright (c) 2008..2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# stage3 part of 'xserver' plugin - the runlevel script setting up the Xorg
+# configuration and checking for 3D capabilities and non-gpl drivers
+#
+# script is included from init via the "." load function - thus it has all
+# variables and functions available
+
+# get an idea of the installed graphics hardware - might be needed if the
+# automatic Xorg configation fails in this field. If no useable info was
+# detected just delete the file.
+
+# tablet detection function
+tabletdetect () {
+ sleep 1; waitfor /etc/hwinfo.bios 20000
+ # quickhack for IBM X61/ACER tablet detection (some kind of positive list
+ # or external admin configurable file needed)
+ if grep -qiE "tablet|TravelMate C200" /etc/hwinfo.bios ; then
+ echo 'wacomdev="ttyS0"' >/etc/tablet.conf
+ fi
+ # wacom device attached to usb - code to be tested
+ if [ ! -e /etc/tablet.conf ]; then
+ if hwinfo --usb | grep -qiE "wacom|tablet" ; then
+ echo 'wacomdev="input/wacom"' >/etc/tablet.conf
+ fi
+ fi
+}
+
+# hardware detection not really needed for Xorg => 1.7 used in newer versions
+# distro distinguishing here not 100% conform to the OpenSLX ideas. Hardware
+# detection might be needed for proprietary Xorg drivers ...
+# (clean up expected with rewritten stage3)
+case ${slxconf_distro_ver} in
+ "10.04"|"11.3")
+ ;;
+ *)
+ # hwinfo --gfxcard moved to general hardware detection as needed for two
+ # different plugins (bootsplash, xserver)
+ #( hwinfo --gfxcard >/etc/hwinfo.gfxcard ) &
+ ( hwinfo --monitor >/etc/hwinfo.display; grep "Generic Monitor" \
+ /etc/hwinfo.display >/dev/null 2>&1 && rm /etc/hwinfo.display ) &
+ ;;
+esac
+( tabletdetect ) &
diff --git a/src/os-plugins/slxos-plugin b/src/os-plugins/slxos-plugin
new file mode 100755
index 00000000..ccd3d389
--- /dev/null
+++ b/src/os-plugins/slxos-plugin
@@ -0,0 +1,525 @@
+#! /usr/bin/perl
+# -----------------------------------------------------------------------------
+# Copyright (c) 2007 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+use strict;
+use warnings;
+
+my $abstract = q[
+slxos-plugin
+ OpenSLX-script to install/remove plugin modules into/from a vendor-OS.
+];
+
+# 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 lib "$FindBin::RealBin/../config-db";
+# development path to config-db
+
+use Getopt::Long qw(:config pass_through);
+use Pod::Usage;
+
+use OpenSLX::Basics;
+use OpenSLX::OSPlugin::Engine;
+use OpenSLX::Utils;
+
+my %option;
+
+GetOptions(
+ 'help|?' => \$option{helpReq},
+ 'man' => \$option{manReq},
+ 'verbose' => \$option{verbose},
+ 'version' => \$option{versionReq},
+)
+ or pod2usage(2);
+pod2usage(-msg => $abstract, -verbose => 0, -exitval => 1) if $option{helpReq};
+if ($option{manReq}) {
+ # avoid dubious problem with perldoc in combination with UTF-8 that
+ # leads to strange dashes and single-quotes being used
+ $ENV{LC_ALL} = 'POSIX';
+ pod2usage(-verbose => 2);
+}
+if ($option{versionReq}) {
+ system('slxversion');
+ exit 1;
+}
+
+openslxInit();
+
+my $action = shift @ARGV || '';
+
+if ($action =~ m[^list-at]i) {
+ my $plugin = shift @ARGV;
+ print
+ $plugin
+ ? _tr("List of attributes supported by '%s' plugin:\n", $plugin)
+ : _tr("List of plugin attributes:\n");
+ my $attrs = {};
+ require OpenSLX::OSPlugin::Roster;
+ OpenSLX::OSPlugin::Roster->addAllAttributesToHash($attrs, $plugin);
+ print join(
+ '',
+ map {
+ my $attr = $attrs->{$_};
+ my $stage
+ = $attr->{applies_to_vendor_os} ? '[stage 1]' : '[stage 3]';
+
+ if ($option{verbose}) {
+ my $output;
+ my $fill = ' ' x 28;
+ for my $key (qw( description content_descr )) {
+ $output .= "\n\t $key:" . ( ' ' x (15 - length($key)) );
+ chomp(my $value = $attr->{$key} || '');
+ $value =~ s{\n}{\n$fill}igms;
+ $output .= $value;
+ }
+ "\n\t$stage: $_$output\n";
+ }
+ else {
+ "\t$stage: $_\n";
+ }
+ }
+ sort {
+ my $stageDiff
+ = ($attrs->{$b}->{applies_to_vendor_os} || '')
+ cmp ($attrs->{$a}->{applies_to_vendor_os} || '');
+ return $stageDiff ? $stageDiff : $a cmp $b;
+ }
+ keys %$attrs
+ );
+} elsif ($action =~ m[^list-av]i) {
+ print _tr("List of available plugins:\n");
+ require OpenSLX::OSPlugin::Roster;
+ my $pluginInfo = OpenSLX::OSPlugin::Roster->getAvailablePlugins();
+ print join(
+ '',
+ map {
+ if ($option{verbose}) {
+ my $fill = ' ' x 12;
+ chomp(my $descr = $pluginInfo->{$_}->{description} || '');
+ $descr =~ s{\n}{\n$fill}igms;
+ my $pluginStr = "$_";
+ my $required = $pluginInfo->{$_}->{required} || [];
+ if (@$required) {
+ $pluginStr
+ .= _tr(' (requires: %s)', join(',', @$required));
+ }
+ "\n\t$pluginStr\n\t $descr\n";
+ }
+ else {
+ "\t$_\n";
+ }
+ }
+ sort keys %$pluginInfo
+ );
+} elsif ($action =~ m[^list-i]i) {
+ if (scalar(@ARGV) != 1) {
+ print STDERR _tr(
+ "You need to specify exactly one vendor-OS!\n"
+ );
+ pod2usage(2);
+ }
+ my $vendorOSName = shift @ARGV;
+
+ # for convenience, we alias default to <<<default>>>
+ $vendorOSName = '<<<default>>>' if $vendorOSName eq 'default';
+
+ # 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 OSPlugin-engine for given vendor-OS and ask it for the installed
+ # plugins:
+ my $engine = OpenSLX::OSPlugin::Engine->new;
+ $engine->initialize(undef, $vendorOSName);
+ my @installedPlugins = $engine->getInstalledPlugins();
+
+ if (!@installedPlugins) {
+ push @installedPlugins, { plugin_name => '<none>' };
+ }
+ print _tr("List of plugins installed in vendor-OS '$vendorOSName':\n");
+ print join(
+ '',
+ map {
+ if ($option{verbose}) {
+ my $attributes
+ = _tr("The following attributes were applied:")
+ . "\n\t ";
+ my $attrs = $_->{attrs};
+ my $attrInfo = {};
+ OpenSLX::OSPlugin::Roster->addAllStage1AttributesToHash(
+ $attrInfo, $_->{plugin_name}
+ );
+ $attributes .= join(
+ "\n\t ",
+ map {
+ my $stage
+ = $attrInfo->{$_}->{applies_to_vendor_os}
+ ? '[stage 1]'
+ : '[stage 3]';
+ "$stage $_="
+ . (defined $attrs->{$_} ? $attrs->{$_} : '-')
+ }
+ sort {
+ (($attrInfo->{$b}->{applies_to_vendor_os} || '')
+ cmp ($attrInfo->{$a}->{applies_to_vendor_os} || ''))
+ || ($a cmp $b);
+ }
+ keys %$attrs
+ );
+ "\n\t$_->{plugin_name}\n\t $attributes\n";
+ }
+ else {
+ "\t$_->{plugin_name}\n";
+ }
+ }
+ sort @installedPlugins
+ );
+} elsif ($action =~ m[^install]i) {
+ if (scalar(@ARGV) < 2) {
+ print STDERR _tr(
+ "You need to specify a vendor-OS and at least one plugin-name!\n"
+ );
+ pod2usage(2);
+ }
+ my $vendorOSName = shift @ARGV;
+ my $pluginAttrs = parsePluginAttrs(1);
+
+ # for convenience, we alias default to <<<default>>>
+ $vendorOSName = '<<<default>>>' if $vendorOSName eq 'default';
+
+ # 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, $!);
+
+ for my $pluginName (keys %$pluginAttrs) {
+ # create & start OSPlugin-engine for vendor-OS and current plugin:
+ my $engine = OpenSLX::OSPlugin::Engine->new;
+ $engine->initialize(
+ $pluginName, $vendorOSName, $pluginAttrs->{$pluginName}
+ );
+ if (!-e $engine->{'plugin-path'}) {
+ die _tr("plugin '%s' doesn't exist, giving up!\n",
+ $engine->{'plugin-path'});
+ }
+ if ($vendorOSName ne '<<<default>>>'
+ && !-e $engine->{'vendor-os-path'}) {
+ die _tr(
+ "vendor-OS '%s' doesn't exist, giving up!\n",
+ $engine->{'vendor-os-path'}
+ );
+ }
+ if ($engine->installPlugin()) {
+ print _tr(
+ "Plugin $pluginName has been installed into vendor-OS '$vendorOSName'.\n"
+ );
+ }
+ }
+} elsif ($action =~ m[^remove]i) {
+ if (scalar(@ARGV) < 2) {
+ print STDERR _tr(
+ "You need to specify a vendor-OS and at least one plugin-name!\n"
+ );
+ pod2usage(2);
+ }
+ my $vendorOSName = shift @ARGV;
+
+ # for convenience, we alias default to <<<default>>>
+ $vendorOSName = '<<<default>>>' if $vendorOSName eq 'default';
+
+ my $pluginAttrs = parsePluginAttrs(0);
+
+ # 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, $!);
+
+ for my $pluginName (keys %$pluginAttrs) {
+ # create & start OSPlugin-engine for vendor-OS and current plugin:
+ my $engine = OpenSLX::OSPlugin::Engine->new;
+ $engine->initialize(
+ $pluginName, $vendorOSName, $pluginAttrs->{$pluginName}
+ );
+ if (!-e $engine->{'plugin-path'}) {
+ die _tr("plugin '%s' doesn't exist, giving up!\n",
+ $engine->{'plugin-path'});
+ }
+ if ($vendorOSName ne '<<<default>>>' && !-e $engine->{'vendor-os-path'}) {
+ die _tr("vendor-OS '%s' doesn't exist, giving up!\n",
+ $engine->{'vendor-os-path'});
+ }
+ if ($engine->removePlugin()) {
+ print _tr(
+ "Plugin $pluginName has been removed from vendor-OS '$vendorOSName'.\n"
+ );
+ }
+ }
+} else {
+ vlog(0, _tr(unshiftHereDoc(<<' END-OF-HERE'), $0));
+ You need to specify exactly one action:
+ install <vendor-OS-name> <plugin-name> [<plugin-attr>=<value> ...]
+ list-attributes [<plugin-name>]
+ list-available
+ list-installed <vendor-OS-name>
+ remove <vendor-OS-name> <plugin-name>
+ Try '%s --help' for more info.
+ END-OF-HERE
+}
+
+sub parsePluginAttrs
+{
+ my $acceptAttributes = shift;
+
+ my (%pluginAttrs, $pluginName, @attrSpecs);
+ for my $arg (@ARGV) {
+ if ($arg =~ m{^(.+?)=(.*)$}) {
+ next if !$acceptAttributes;
+ my $attr = $1;
+ my $value = $2;
+ if ($value =~ m{^(-|undef)$}) {
+ $value = undef;
+ }
+ if ($attr =~ m{^(.+)::}) {
+ $pluginName = $1;
+ }
+ else {
+ if (!defined $pluginName) {
+ die _tr('You have to give a plugin-name before you can specify unscoped attributes!');
+ }
+ $attr = $pluginName . '::' . $attr;
+ }
+ $pluginAttrs{$pluginName}->{$attr} = $value;
+ }
+ else {
+ $pluginName = $arg;
+ $pluginAttrs{$pluginName} = {};
+ }
+ }
+ return \%pluginAttrs;
+}
+
+=head1 NAME
+
+slxos-plugin - OpenSLX-script to install/remove an OS-plugin into/from an
+installed vendor-OS.
+
+=head1 SYNOPSIS
+
+slxos-plugin [options] <action>
+
+=head3 Options
+
+ --help brief help message
+ --log-level=<int> level of logging verbosity (0-3)
+ --man show full documentation
+ --verbose show more information during execution
+ --version show version
+
+=head3 Actions
+
+=over 8
+
+=item B<< install <vendor-OS-name> <plugin-name> [<attr-name>=<value> ...] [<plugin-name>] ... >>
+
+Installs the OS-plugin(s) with the given name(s) into the specified
+vendor-OS, using any attribute values as specified.
+
+In order to spare you RSI, you can leave out the plugin scope, each attribute
+will be searched in the plugin that precedes it (see examples in the manual).
+
+=item B<< list-attributes [<plugin-name>] >>
+
+List all attributes supported by the different OS-plugins. If you specify a
+plugin name, only the attributes of that plugin will be listed.
+
+In verbose mode, more details about the individual attributes are shown.
+
+=item B<< list-available >>
+
+List all available OS-plugins.
+
+In verbose mode a short description of each plugin will be shown, too.
+
+=item B<< list-installed <vendor-os-name> >>
+
+List all the plugins installed into the specified vendor-OS.
+
+In verbose mode all applied attributes are shown, too.
+
+=item B<< remove <vendor-OS-name> <plugin-name> [<plugin-name>] ... >>
+
+Removes the OS-plugin(s) with the given name(s) from the specified vendor-OS.
+
+If you pass in any attributes, they will be ignored.
+
+=back
+
+=head1 DESCRIPTION
+
+B<slxos-plugin> installs or removes specific functionality extensions into/from
+an installed vendor-OS. That extension can be something rather simple (like
+a boot-splash) or something rather complicated (e.g. the automatic detection,
+installation and activation of the graphics driver most appropriate for the
+booting client).
+
+Installation of any plugin will result in some files being added to the
+vendor-OS (they will live in /opt/openslx/plugins/<plugin-name>/). These files
+can be accessed by the booting client.in order to integrate the required
+functionality into the system.
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<--help>
+
+Prints a brief help message and exits.
+
+=item B<--man>
+
+Prints the manual page and exits.
+
+=item B<--verbose>
+
+Prints more information during execution of any action.
+
+=item B<--version>
+
+Prints the version and exits.
+
+=back
+
+=head1 EXAMPLES
+
+=over 8
+
+=head3 Installing a Plugin
+
+=item B<< slxos-plugin install suse-10.2 example >>
+
+Installs the plugin named 'example' into the installed vendor-OS 'suse-10.2'.
+
+=item B<< slxos-plugin install suse-10.2 desktop gdm=1 kde=1 >>
+
+Installs the desktop plugin into suse-10.2 and specifies two attributes. These
+attributes will be stored into the vendor-OS and pulled from there by the
+config-demuxer whenever it demuxes a system based on the suse-10.2 vendor-OS.
+
+=item B<< slxos-plugin install suse-10.2 desktop desktop::gdm=1 desktop::kde=1 >>
+
+Same as above, only this time with completely scoped attributes.
+
+=item B<< slxos-plugin install suse-10.2 desktop gdm=1 vmware binary=1 >>
+
+Installs two plugins (desktop and vmware) into suse-10.2. The attribute gdm=1
+will be set for desktop, while binary=1 will be set for vmware.
+
+=item B<< slxos-plugin install suse-10.2 desktop vmware binary=1 desktop::gdm=1 >>
+
+Same as above, only this time with a fully scoped attribute gdm=1, that will
+be set for the desktop plugin.
+
+=item B<< slxos-plugin install suse-10.2 desktop vmware binary=1 gdm=1 >>
+
+Bogus example, which will install desktop and vmware, but try to set bianry=1
+and gdm=1 for the vmware plugin. This will fail, as vmware does not support
+an attribute named gdm.
+
+=back
+
+=head3 Removing a Plugin
+
+=over 8
+
+=item B<< slxos-plugin remove suse-10.2 example >>
+
+Removes the plugin named 'example' from the installed vendor-OS 'suse-10.2'.
+
+=item B<< slxos-plugin remove suse-10.2 desktop vmware example >>
+
+Removes the three plugins desktop, vmware and example from suse-10.2.
+
+=back
+
+=head3 Listing Available Plugins
+
+=over 8
+
+=item B<< slxos-plugin list-available >>
+
+Gives a short list of all available plugins and their description.
+
+=item B<< slxos-plugin --verbose list-available >>
+
+Gives a detailed list of all available plugins and their description, including
+the names of all attributes supported by the respective plugin.
+
+=back
+
+=head3 Listing Attributes Supported by Plugins
+
+=over 8
+
+=item B<< slxos-plugin list-attributes >>
+
+Gives a short list of all supported attributes, sorted by stage and name.
+
+=item B<< slxos-plugin --verbose list-available desktop >>
+
+Gives a detailed list of the attributes supported by the 'desktop' plugin,
+including a description of the purpose and possible content values of each
+attribute.
+
+=back
+
+=head3 Listing Installed Plugins
+
+=over 8
+
+=item B<< slxos-plugin list-installed suse-10.2 >>
+
+Gives a short list of the plugins that were installed into suse-10.2.
+
+=item B<< slxos-plugin --verbose list-installed suse-10.2 >>
+
+Gives a detailed list of the plugins that were installed into suse-10.2,
+including a list of all.attributes and their respective values.
+
+=back
+=head1 SEE ALSO
+
+slxsettings, slxos-setup, slxconfig, slxconfig-demuxer
+
+=head1 GENERAL OPENSLX OPTIONS
+
+Being a part of OpenSLX, this script supports several other options
+which can be used to overrule the OpenSLX settings:
+
+ --db-name=<string> name of database
+ --db-spec=<string> full DBI-specification of database
+ --db-type=<string> type of database to connect to
+ --locale=<string> locale to use for translations
+ --log-level=<int> level of logging verbosity (0-3)
+ --logfile=<string> file to write logging output to
+ --private-path=<string> path to private data
+ --public-path=<string> path to public (client-accesible) data
+ --temp-path=<string> path to temporary data
+
+Please refer to the C<slxsettings>-manpage for a more detailed description
+of these options.
+
+=cut
+
diff --git a/src/tools/README.busybox b/src/tools/README.busybox
new file mode 100644
index 00000000..9c12a65b
--- /dev/null
+++ b/src/tools/README.busybox
@@ -0,0 +1,10 @@
+How busybox (version 1.13.2) is created:
+
+1. Get our current sources from openslx-src-tools/trunk/busybox
+2. bind mount the busybox folder to the correspoding uclibc-build-environment
+ folder (see http://www.openslx.org/wiki/openslx/GentooUclibcChroot for
+ how to create such an environment)
+3. chroot into the uclibc-build-environment
+4. cd into the bind-mounted busybox folder
+5. make oldconfig and adjust the configuration if required.
+6. build busybox (make)
diff --git a/src/tools/mksquashfs b/src/tools/mksquashfs
new file mode 100755
index 00000000..e65a35a5
--- /dev/null
+++ b/src/tools/mksquashfs
Binary files differ
diff --git a/src/tools/mksquashfs-filter-patch b/src/tools/mksquashfs-filter-patch
new file mode 100644
index 00000000..5cb4ba24
--- /dev/null
+++ b/src/tools/mksquashfs-filter-patch
@@ -0,0 +1,201 @@
+--- squashfs-tools/mksquashfs.c 2007-01-16 09:24:40.000000000 +0100
++++ squashfs-tools-vito/mksquashfs.c 2007-01-17 08:34:17.000000000 +0100
+@@ -44,6 +44,7 @@
+ #include <sys/mman.h>
+ #include <pthread.h>
+ #include <math.h>
++#include <regex.h>
+
+ #ifndef linux
+ #define __BYTE_ORDER BYTE_ORDER
+@@ -162,15 +163,19 @@
+ struct file_info *dupl[65536];
+ int dup_files = 0;
+
+-/* list of exclude dirs/files */
+-struct exclude_info {
++/* list of include/exclude files/regexes */
++struct filter_info {
+ dev_t st_dev;
+ ino_t st_ino;
++ regex_t *preg;
++ int action;
+ };
+
+-#define EXCLUDE_SIZE 8192
+-int exclude = 0;
+-struct exclude_info *exclude_paths = NULL;
++#define EXCLUDE 0
++#define INCLUDE 1
++#define FILTER_SIZE 8192
++int filter_count = 0;
++struct filter_info *filters = NULL;
+ int excluded(char *filename, struct stat *buf);
+
+ /* fragment block data structures */
+@@ -2606,20 +2611,32 @@
+ {
+ int i;
+
+- for(i = 0; i < exclude; i++)
+- if((exclude_paths[i].st_dev == buf->st_dev) && (exclude_paths[i].st_ino == buf->st_ino))
+- return TRUE;
++ for(i = 0; i < filter_count; i++) {
++ struct filter_info f = filters[i];
++
++ if(f.preg == NULL) {
++ if((f.st_dev == buf->st_dev) && (f.st_ino == buf->st_ino))
++ return TRUE;
++ } else if(regexec(f.preg, filename, (size_t)0, NULL, 0) == 0)
++ if(f.action == EXCLUDE)
++ return TRUE;
++ else
++ return FALSE;
++ }
++
+ return FALSE;
+ }
+
+
+-#define ADD_ENTRY(buf) \
+- if(exclude % EXCLUDE_SIZE == 0) {\
+- if((exclude_paths = (struct exclude_info *) realloc(exclude_paths, (exclude + EXCLUDE_SIZE) * sizeof(struct exclude_info))) == NULL)\
+- BAD_ERROR("Out of memory in exclude dir/file table\n");\
++#define ADD_ENTRY(b, a, p) \
++ if(filter_count % FILTER_SIZE == 0) {\
++ if((filters = (struct filter_info *) realloc(filters, (filter_count + FILTER_SIZE) * sizeof(struct filter_info))) == NULL)\
++ BAD_ERROR("Out of memory in the include/exclude file/regex table\n");\
+ }\
+- exclude_paths[exclude].st_dev = buf.st_dev;\
+- exclude_paths[exclude++].st_ino = buf.st_ino;
++ filters[filter_count].action = a;\
++ filters[filter_count].preg = p;\
++ filters[filter_count].st_dev = b.st_dev;\
++ filters[filter_count++].st_ino = b.st_ino;
+ int add_exclude(char *path)
+ {
+ int i;
+@@ -2632,7 +2649,7 @@
+ perror(buffer);
+ return TRUE;
+ }
+- ADD_ENTRY(buf);
++ ADD_ENTRY(buf, EXCLUDE, NULL);
+ return TRUE;
+ }
+
+@@ -2645,11 +2662,47 @@
+ }
+ continue;
+ }
+- ADD_ENTRY(buf);
++ ADD_ENTRY(buf, EXCLUDE, NULL);
+ }
+ return TRUE;
+ }
+
++void add_pattern(char *pattern)
++{
++ struct stat dummy;
++ int action = -1;
++
++ if(pattern[0] == '#')
++ return;
++
++ if(strlen(pattern) < 3)
++ goto bad_pattern;
++
++ if(strncmp(pattern, "+ ", 2) == 0)
++ action = INCLUDE;
++
++ if(strncmp(pattern, "- ", 2) == 0)
++ action = EXCLUDE;
++
++ if(action != -1) {
++ regex_t *preg = (regex_t*)malloc(sizeof(regex_t));
++ char message[1024];
++ int error = regcomp(preg, pattern+2, REG_EXTENDED|REG_NOSUB);
++ regerror(error, preg, message, 1024);
++
++ if(error) {
++ fprintf(stderr, "Ignoring invalid regex \"%s\" (%s)\n", pattern+2, message);
++ return;
++ }
++
++ ADD_ENTRY(dummy, action, preg);
++ return;
++ }
++
++bad_pattern:
++ fprintf(stderr, "Ignoring wrong filter pattern \"%s\"\n", pattern);
++}
++
+
+ void add_old_root_entry(char *name, squashfs_inode inode, int inode_number, int type)
+ {
+@@ -2849,6 +2902,11 @@
+ ERROR("%s: -ef missing filename\n", argv[0]);
+ exit(1);
+ }
++ } else if(strcmp(argv[i], "-ff") == 0) {
++ if(++i == argc) {
++ ERROR("%s: -ff missing filename\n", argv[0]);
++ exit(1);
++ }
+ } else if(strcmp(argv[i], "-no-duplicates") == 0)
+ duplicate_checking = FALSE;
+
+@@ -2991,6 +3049,10 @@
+ ERROR("\t\t\tfile or dir with priority per line. Priority -32768 to\n");
+ ERROR("\t\t\t32767, default priority 0\n");
+ ERROR("-ef <exclude_file>\tlist of exclude dirs/files. One per line\n");
++ ERROR("-ff <filter_file>\tlist of include/exclude patterns. One per line.\n");
++ ERROR("\t\t\tThe first pattern that matches a dir/file is applied.\n");
++ ERROR("\t\t\tExclude patterns are written '+ regex', include patterns\n");
++ ERROR("\t\t\tare written '- regex'. Comments start with #\n");
+ exit(1);
+ }
+ }
+@@ -3048,7 +3110,7 @@
+ signal(SIGINT, sighandler2);
+ }
+
+- /* process the exclude files - must be done afer destination file has been possibly created */
++ /* process the include/exclude files/patterns - must be done afer destination file has been possibly created */
+ for(i = source + 2; i < argc; i++)
+ if(strcmp(argv[i], "-ef") == 0) {
+ FILE *fd;
+@@ -3060,6 +3122,16 @@
+ while(fscanf(fd, "%16384[^\n]\n", filename) != EOF)
+ add_exclude(filename);
+ fclose(fd);
++ } else if(strcmp(argv[i], "-ff") == 0) {
++ FILE *fd;
++ char pattern[16385];
++ if((fd = fopen(argv[++i], "r")) == NULL) {
++ perror("Could not open filter file...");
++ EXIT_MKSQUASHFS();
++ }
++ while(fscanf(fd, "%16384[^\n]\n", pattern) != EOF)
++ add_pattern(pattern);
++ fclose(fd);
+ } else if(strcmp(argv[i], "-e") == 0)
+ break;
+ else if(strcmp(argv[i], "-b") == 0 || strcmp(argv[i], "-root-becomes") == 0 || strcmp(argv[i], "-sort") == 0)
+@@ -3073,14 +3145,14 @@
+ while(i < argc && add_exclude(argv[i++]));
+ }
+
+- /* process the sort files - must be done afer the exclude files */
++ /* process the sort files - must be done afer processing the include/exclude files/patterns */
+ for(i = source + 2; i < argc; i++)
+ if(strcmp(argv[i], "-sort") == 0) {
+ read_sort_file(argv[++i], source, source_path);
+ sorted ++;
+ } else if(strcmp(argv[i], "-e") == 0)
+ break;
+- else if(strcmp(argv[i], "-b") == 0 || strcmp(argv[i], "-root-becomes") == 0 || strcmp(argv[i], "-ef") == 0)
++ else if(strcmp(argv[i], "-b") == 0 || strcmp(argv[i], "-root-becomes") == 0 || strcmp(argv[i], "-ef") == 0 || strcmp(argv[i], "-ff") == 0)
+ i++;
+
+ initialise_threads();
diff --git a/src/tools/uclibc-wrapper b/src/tools/uclibc-wrapper
new file mode 100755
index 00000000..08934f32
--- /dev/null
+++ b/src/tools/uclibc-wrapper
@@ -0,0 +1,28 @@
+#!/bin/sh
+# Copyright (c) 2008..2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found under http://openslx.org
+#
+# Wrapper script for OpenSLX environments used with server and client stage4
+
+if [ -d /opt/openslx/share/uclib-rootfs ]; then
+ SLX_UCLIB_PATH=/opt/openslx/share/uclib-rootfs
+elif [ -d /opt/openslx/uclib-rootfs ]; then
+ SLX_UCLIB_PATH=/opt/openslx/uclib-rootfs
+else
+ echo "Can't find OpenSLX Environment." && exit 1
+fi
+
+[ -f /lib/ld-uClibc.so.0 ] || \
+ ln -sf $SLX_PATH/uclib-rootfs/lib/ld-uClibc.so.0 /lib/ld-uClibc.so.0
+
+PATH=$SLX_UCLIB_PATH/bin:$SLX_UCLIB_PATH/usr/bin:$SLX_UCLIB_PATH/sbin:\
+$SLX_UCLIB_PATH/usr/sbin
+LD_LIBRARY_PATH=$SLX_UCLIB_PATH/lib:$SLX_UCLIB_PATH/usr/lib
+LD_LIBRARY_PATH=$LD_LIBRARY_PATH PATH=$PATH PS1="#" $@