#! /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