summaryrefslogblamecommitdiffstats
path: root/src/installer/slxos-export
blob: 8c0733abd078c7dbf7f67dffd868552915d452af (plain) (tree)
1
2
3
4
5
6
7
8
9
                

                                                                               
 

                                                                    
 

                                                                         
 

                                                                               
           
             


                 
                                                          

  
           









                                                                  
                               


                              
                   
 
           

           


                                      

                  

                                                                               



                                                                       
 
                          

                         



              
                               

                              





































                                                                               
                                   











                                                                         
                                   

                                                          
                                  





















                                                                                   
                                  














                                                                               
        








                                                          
 
 

           
                                                                     


               
                               
 
              
 



                                                       

              


       
                                                      
 
                                                                         

                                                                         
                           












                               
                                     
 
                                                              
 

     









                                                                                
                              



                                                                             
                                   
 
                                                                        
                                                                              





                                                                               








                                                                               



              



                                      
              
 
                                 
 
                  
 
                             
 
     
 
               
 


                                    
 
                                                  
 
                                                      


                                                                       
 
                                    


       
                                                         
 

                                                                  

     
 



                         
                                                    

                                                                         
                                                                



                                            








                                                                   


                                                                 
                                                             
                                                               


                                                                     
                                                     



                                                                          

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