summaryrefslogtreecommitdiffstats
path: root/src/installer/slxos-export
diff options
context:
space:
mode:
Diffstat (limited to 'src/installer/slxos-export')
-rwxr-xr-xsrc/installer/slxos-export323
1 files changed, 323 insertions, 0 deletions
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
+