summaryrefslogblamecommitdiffstats
path: root/config-db/slxconfig
blob: fc1f7bcc05349f6b54669f1e0ee8501f57206a3c (plain) (tree)




































                                                                       


























                                                                       
                                                                                                          
























































































































































                                                                                                                













                                                                        



                                                      
















                                                                  






                             
#! /usr/bin/perl
#
# slxconfig -
#
# (c) 2006 - OpenSLX.com
#
# Oliver Tappe <ot@openslx.com>
#
use strict;

my $abstract = q[
slxconfig
    This script can be used to display or change the configuration
    of OpenSLX vendor-OSes. You can create systems that use a
    specific vendor-OS and you can create clients for that system, too.
];

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::ConfigDB qw(:access :manipulation);
use OpenSLX::DBSchema;
# use OpenSLX::OSSetup::Engine;

my (
	$helpReq,
	$manReq,
	$verbose,
	$versionReq,
);

GetOptions(
	'help|?' => \$helpReq,
	'man' => \$manReq,
	'verbose' => \$verbose,
	'version' => \$versionReq,
) or pod2usage(2);
pod2usage(-msg => $abstract, -verbose => 0, -exitval => 1) if $helpReq;
pod2usage(-verbose => 2) if $manReq;
if ($versionReq) {
	system('slxversion');
	exit 1;
}

openslxInit();

my $openslxDB = connectConfigDB();

my $action = shift @ARGV;
if ($action =~ m[^add-system$]i) {
    addSystemToConfigDB(@ARGV);
} elsif ($action =~ m[^add-client$]i) {
    addClientToConfigDB(@ARGV);
} else {
	print STDERR _tr("You need to specify exactly one of these actions:\n\tadd-system, add-client\n");
	pod2usage(2);
}

disconnectConfigDB($openslxDB);

exit;

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 = $1;
        my $value = $2;
        if (!grep { $_ eq $key } @$allowedKeys) {
            die _tr("unknown attribute '%s' specified for %s\n", $key, $table);
        }
        $dataHash{$1} = $2;
    }
    return \%dataHash;
}

sub addSystemToConfigDB
{
    my @systemKeys
		= map { (/^(\w+)\W/) ? $1 : $_; }
		  @{$DbSchema->{tables}->{system}};
	push @systemKeys, 'clients', 'vendor_os';
    my $systemData = parseKeyValueArgs(\@systemKeys, 'system', @_);

	if (!length($systemData->{vendor_os})) {
        die _tr("you have to specify the vendor_os the new system shall be based on\n");
	}
    my $vendorOSName = $systemData->{vendor_os};
	delete $systemData->{vendor_os};
	my $vendorOS
		= fetchVendorOSesByFilter($openslxDB, { 'name' => $vendorOSName });
	if (!defined $vendorOS) {
		die _tr("vendor-OS '%s' could not be found!\n", $vendorOSName);
	}
	$systemData->{vendor_os_id} = $vendorOS->{id};

	my @clientIDs;
	my $clientNames;
	if (exists $systemData->{clients}) {
		@clientIDs
			= map {
				my $client
					= fetchClientsByFilter($openslxDB,
										   { 'name' => $_ });
				if (!defined $client) {
					die _tr("client '%s' doesn't exist!\n", $_);
				}
				$client->{id};
			  }
			  split ",", $systemData->{clients};
		$clientNames = $systemData->{clients};
		delete $systemData->{clients};
	}

	if (!length($systemData->{export_type})) {
		die _tr("you have to specify the export_type for this system ('nfs', 'nbd' or 'nbd-squash')\n");
	}
	if (!length($systemData->{name})) {
		$systemData->{name} = $vendorOSName;
	}
	if (!length($systemData->{label})) {
		$systemData->{label} = $vendorOSName;
	}
	if (!length($systemData->{kernel})) {
		$systemData->{kernel} = '/boot/vmlinuz';
	}
	if (!length($systemData->{ramfs_debug_level})) {
		$systemData->{ramfs_debug_level} = '0';
	}
	if (!length($systemData->{ramfs_use_glibc})) {
		$systemData->{ramfs_use_glibc} = '0';
	}
	if (!length($systemData->{ramfs_use_busybox})) {
		$systemData->{ramfs_use_busybox} = '1';
	}
	my $systemID = addSystem($openslxDB, [$systemData]);

	if (scalar(@clientIDs)) {
	    addClientIDsToSystem($openslxDB, $systemID, \@clientIDs);
		if ($verbose) {
			print _tr("clients of this system are:\n\t%s\n", $clientNames);
		}
	}
}

sub addClientToConfigDB
{
    my @clientKeys
		= map { (/^(\w+)\W/) ? $1 : $_; }
		  @{$DbSchema->{tables}->{client}};
	push @clientKeys, 'systems';
    my $clientData = parseKeyValueArgs(\@clientKeys, 'client', @_);

	my @systemIDs;
	my $systemNames;
	if (exists $clientData->{systems}) {
		@systemIDs
			= map {
				my $system
					= fetchSystemsByFilter($openslxDB,
										   { 'name' => $_ });
				if (!defined $system) {
					die _tr("system '%s' doesn't exist!\n", $_);
				}
				$system->{id};
			  }
			  split ",", $clientData->{systems};
		$systemNames = $clientData->{systems};
		delete $clientData->{systems};
	}

	if (!length($clientData->{name})) {
		die _tr("you have to specify the name for the new client\n");
	}
	if (!length($clientData->{mac})) {
		die _tr("you have to specify the MAC for the new client\n");
	}
	if (!length($clientData->{boot_type})) {
		$clientData->{boot_type} = 'pxe';
	}

	my $clientID = addClient($openslxDB, [$clientData]);

	if (scalar(@systemIDs)) {
	    addSystemIDsToClient($openslxDB, $clientID, \@systemIDs);
		if ($verbose) {
			print _tr("systems for this client are:\n\t%s\n", $systemNames);
		}
	}
}

__END__

=head1 NAME

slxconfig - OpenSLX-script to configure a vendor-OS for use with
OpenSLX. You can create systems that will use the specified vendor-OS
and you can create clients for that system, too.

=head1 SYNOPSIS

=head2 Adding a new System to a Vendor-OS Export

  slxconfig add-system <export-name> [<attribute=value> ...]

  The above syntax is used to add a new system to the config-DB. The new
  system will use the given I<export> (an exported vendor-OS).

=head2 Adding a new Client

  slxos-setup clone <vendor-os-name> --source=<rsync-source>

=head2 General Format

  slxconfig [options] <action> <action-options>

  Options:
      --help                   brief help message
      --man                    show full documentation
      --version                show version

  Actions:
      list-systems             clones an existing system via rsync

=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.

=back

=cut