#! /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] =head3 Options --help brief help message --log-level= level of logging verbosity (0-3) --man show full documentation --version show version =head3 Actions =over 8 =item B<< export >> 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 '-' appended to it (where 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 >> removes the export with the given name from disk and config-DB =back =head1 DESCRIPTION B 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 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. =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. =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. =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 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= name of database --db-spec= full DBI-specification of database --db-type= type of database to connect to --locale= locale to use for translations --log-level= level of logging verbosity (0-3) --logfile= file to write logging output to --private-path= path to private data --public-path= path to public (client-accesible) data --temp-path= path to temporary data Please refer to the C-manpage for a more detailed description of these options. =cut