#! /usr/bin/perl # # slxconfig - # # (c) 2006 - OpenSLX.com # # Oliver Tappe # 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 =\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 [ ...] The above syntax is used to add a new system to the config-DB. The new system will use the given I (an exported vendor-OS). =head2 Adding a new Client slxos-setup clone --source= =head2 General Format slxconfig [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