From 355fafc70d0a8d98b1c73e9e7bd8aa109263fe85 Mon Sep 17 00:00:00 2001 From: Oliver Tappe Date: Thu, 29 Nov 2007 13:19:16 +0000 Subject: * added support for groups (add, change, list, remove and search) This has not been tested yet, so beware! git-svn-id: http://svn.openslx.org/svn/openslx/trunk@1413 95ad53e4-c205-0410-b2fa-d234c58c8868 --- config-db/slxconfig | 417 +++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 351 insertions(+), 66 deletions(-) (limited to 'config-db') diff --git a/config-db/slxconfig b/config-db/slxconfig index 5c58ba82..46cb01b8 100755 --- a/config-db/slxconfig +++ b/config-db/slxconfig @@ -36,7 +36,6 @@ use lib "$FindBin::RealBin/../config-db"; use OpenSLX::Basics; use OpenSLX::ConfigDB; use OpenSLX::ConfigFolder; -use OpenSLX::DBSchema; use OpenSLX::Utils; my ($helpReq, $manReq, $verbose, $versionReq,); @@ -130,19 +129,24 @@ else { vlog(0, _tr(unshiftHereDoc(<<' END-OF-HERE'), $0)); You need to specify exactly one of these actions: add-client + add-group add-system change-client change-export + change-group change-system change-vendor-os list-client list-export + list-group list-system list-vendor-os remove-client + remove-group remove-system search-client search-export + search-group search-system search-vendor-os Try '%s --help' for more info. @@ -171,6 +175,7 @@ sub parseKeyValueArgs } $dataHash{$key} = $value; } + return \%dataHash; } @@ -197,7 +202,8 @@ sub dumpElements else { print join('', sort map { $nameClause->($_); } @_); } - return; + + return 1; } sub listClients @@ -226,7 +232,8 @@ sub listClients sort { $a->{name} cmp $b->{name} } $openslxDB->fetchClientByFilter(\%nameSpec) ); - return; + + return 1; } sub listGroups @@ -244,17 +251,23 @@ sub listGroups dumpElements( 'groups', undef, map { - my @sysIDs = $openslxDB->fetchSystemIDsOfGroup($_->{id}); + my @systemIDs = $openslxDB->fetchSystemIDsOfGroup($_->{id}); $_->{systems} = join "\n", map { $_->{name} } sort { $a->{name} cmp $b->{name} } - $openslxDB->fetchSystemByID(\@sysIDs, 'name'); + $openslxDB->fetchSystemByID(\@systemIDs, 'name'); + my @clientIDs = $openslxDB->fetchClientIDsOfGroup($_->{id}); + $_->{clients} + = join "\n", map { $_->{name} } + sort { $a->{name} cmp $b->{name} } + $openslxDB->fetchClientByID(\@clientIDs, 'name'); $_; } sort { $a->{name} cmp $b->{name} } $openslxDB->fetchGroupByFilter(\%nameSpec) ); - return; + + return 1; } sub listExports @@ -287,7 +300,8 @@ sub listExports sort { $a->{name} eq $b->{name} || $a->{type} cmp $b->{type} } $openslxDB->fetchExportByFilter(\%nameSpec) ); - return; + + return 1; } sub listSystems @@ -320,7 +334,8 @@ sub listSystems sort { $a->{name} cmp $b->{name} } $openslxDB->fetchSystemByFilter(\%nameSpec) ); - return; + + return 1; } sub listVendorOSes @@ -338,14 +353,13 @@ sub listVendorOSes dumpElements('vendor-OS', undef, sort { $a->{name} cmp $b->{name} } $openslxDB->fetchVendorOSByFilter(\%nameSpec)); - return; + + return 1; } sub searchClients { - my @clientKeys = - map { (/^(\w+)\W/) ? $1 : $_; } @{$DbSchema->{tables}->{client}}; - + my @clientKeys = $openslxDB->getColumnsForTable('client'); my $clientData = parseKeyValueArgs(\@clientKeys, 'client', @_); # set verbose mode if any params have been passed in: @@ -364,14 +378,43 @@ sub searchClients sort { $a->{name} cmp $b->{name} } $openslxDB->fetchClientByFilter($clientData) ); - return; + + return 1; } -sub searchExports +sub searchGroups { - my @exportKeys = - map { (/^(\w+)\W/) ? $1 : $_; } @{$DbSchema->{tables}->{export}}; + my @groupKeys = $openslxDB->getColumnsForTable('groups'); + my $groupData = parseKeyValueArgs(\@groupKeys, 'groups', @_); + + # set verbose mode if any params have been passed in: + $verbose = 1 if %$groupData; + dumpElements( + 'group', undef, + map { + my @systemIDs = $openslxDB->fetchSystemIDsOfGroup($_->{id}); + $_->{systems} + = join "\n", map { $_->{name} } + sort { $a->{name} cmp $b->{name} } + $openslxDB->fetchSystemByID(\@systemIDs, 'name'); + my @clientIDs = $openslxDB->fetchClientIDsOfGroup($_->{id}); + $_->{clients} + = join "\n", map { $_->{name} } + sort { $a->{name} cmp $b->{name} } + $openslxDB->fetchClientByID(\@clientIDs, 'name'); + $_; + } + sort { $a->{name} cmp $b->{name} } + $openslxDB->fetchGroupByFilter($groupData) + ); + + return 1; +} + +sub searchExports +{ + my @exportKeys = $openslxDB->getColumnsForTable('export'); my $exportData = parseKeyValueArgs(\@exportKeys, 'export', @_); # set verbose mode if any params have been passed in: @@ -395,14 +438,13 @@ sub searchExports sort { $a->{name} eq $b->{name} || $a->{type} cmp $b->{type} } $openslxDB->fetchExportByFilter($exportData) ); - return; + + return 1; } sub searchSystems { - my @systemKeys = - map { (/^(\w+)\W/) ? $1 : $_; } @{$DbSchema->{tables}->{system}}; - + my @systemKeys = $openslxDB->getColumnsForTable('system'); my $systemData = parseKeyValueArgs(\@systemKeys, 'system', @_); # set verbose mode if any params have been passed in: @@ -424,14 +466,13 @@ sub searchSystems sort { $a->{name} cmp $b->{name} } $openslxDB->fetchSystemByFilter($systemData) ); - return; + + return 1; } sub searchVendorOSes { - my @vendorOSKeys = - map { (/^(\w+)\W/) ? $1 : $_; } @{$DbSchema->{tables}->{vendor_os}}; - + my @vendorOSKeys = $openslxDB->getColumnsForTable('vendor_os'); my $vendorOSData = parseKeyValueArgs(\@vendorOSKeys, 'vendor_os', @_); # set verbose mode if any params have been passed in: @@ -440,7 +481,8 @@ sub searchVendorOSes dumpElements('vendor-OS', undef, sort { $a->{name} cmp $b->{name} } $openslxDB->fetchVendorOSByFilter($vendorOSData)); - return; + + return 1; } sub changeVendorOSInConfigDB @@ -453,8 +495,7 @@ sub changeVendorOSInConfigDB ); } - my @keys = - map { (/^(\w+)\W/) ? $1 : $_; } @{$DbSchema->{tables}->{vendor_os}}; + my @keys = $openslxDB->getColumnsForTable('vendor_os'); my $vendorOSData = parseKeyValueArgs(\@keys, 'vendor_os', @_); my $vendorOS = $openslxDB->fetchVendorOSByFilter({'name' => $vendorOSName}); @@ -468,7 +509,8 @@ sub changeVendorOSInConfigDB if ($verbose) { listVendorOSes("id=$vendorOS->{id}"); } - return; + + return 1; } sub changeExportInConfigDB @@ -481,8 +523,7 @@ sub changeExportInConfigDB ); } - my @exportKeys = - map { (/^(\w+)\W/) ? $1 : $_; } @{$DbSchema->{tables}->{export}}; + my @exportKeys = $openslxDB->getColumnsForTable('export'); my $exportData = parseKeyValueArgs(\@exportKeys, 'export', @_); my $export = $openslxDB->fetchExportByFilter({'name' => $exportName}); @@ -496,7 +537,8 @@ sub changeExportInConfigDB if ($verbose) { listExports("id=$export->{id}"); } - return; + + return 1; } sub addClientToConfigDB @@ -507,8 +549,7 @@ sub addClientToConfigDB die _tr("you have to specify the name for the new client\n"); } - my @clientKeys = - map { (/^(\w+)\W/) ? $1 : $_; } @{$DbSchema->{tables}->{client}}; + my @clientKeys = $openslxDB->getColumnsForTable('client'); push @clientKeys, 'systems'; my $clientData = parseKeyValueArgs(\@clientKeys, 'client', @_); $clientData->{name} = $clientName; @@ -561,7 +602,76 @@ sub addClientToConfigDB if ($verbose) { listClients("id=$clientID"); } - return; + + return 1; +} + +sub addGroupToConfigDB +{ + my $groupName = _cleanName(shift || ''); + + if (!length($groupName)) { + die _tr("you have to specify the name for the new group\n"); + } + + my @groupKeys = $openslxDB->getColumnsForTable('groups'); + push @groupKeys, 'systems', 'clients'; + my $groupData = parseKeyValueArgs(\@groupKeys, 'groups', @_); + $groupData->{name} = $groupName; + + my @systemIDs; + if (exists $groupData->{systems}) { + @systemIDs = map { + my $system = $openslxDB->fetchSystemByFilter({'name' => $_}); + if (!defined $system) { + die _tr("system '%s' doesn't exist!\n", $_); + } + $system->{id}; + } + split '\s*,\s*', $groupData->{systems}; + delete $groupData->{systems}; + } + my @clientIDs; + if (exists $groupData->{clients}) { + @clientIDs = map { + my $client = $openslxDB->fetchClientByFilter({'name' => $_}); + if (!defined $client) { + die _tr("client '%s' doesn't exist in DB, giving up!\n", $_); + } + $client->{id}; + } + split '\s*,\s*', $groupData->{clients}; + delete $groupData->{clients}; + } + + if (!defined $groupData->{priority} || !length($groupData->{priority})) { + $groupData->{priority} = 50; + vlog(0, _tr("priority of new group has been set to default (50).")); + } + + if ($openslxDB->fetchGroupByFilter({'name' => $groupName})) { + die _tr("the group '%s' already exists in the DB, giving up!\n", + $groupName); + } + my $groupID = $openslxDB->addGroup([$groupData]); + vlog( + 0, + _tr( + "group '%s' has been successfully added to DB (ID=%s)\n", + $groupName, $groupID + ) + ); + if (@systemIDs) { + $openslxDB->addSystemIDsToGroup($groupID, \@systemIDs); + } + if (@clientIDs) { + $openslxDB->addClientIDsToGroup($groupID, \@clientIDs); + } + if ($verbose) { + listGroups("id=$groupID"); + } + + return 1; } sub addSystemToConfigDB @@ -572,8 +682,7 @@ sub addSystemToConfigDB die _tr("you have to specify the name of the new system!\n"); } - my @systemKeys = - map { (/^(\w+)\W/) ? $1 : $_; } @{$DbSchema->{tables}->{system}}; + my @systemKeys = $openslxDB->getColumnsForTable('system'); push @systemKeys, 'clients', 'export'; my $systemData = parseKeyValueArgs(\@systemKeys, 'system', @_); $systemData->{name} = $systemName; @@ -657,7 +766,8 @@ sub addSystemToConfigDB if ($verbose) { listSystems("id=$systemID"); } - return; + + return 1; } sub changeClientInConfigDB @@ -666,12 +776,11 @@ sub changeClientInConfigDB if (!length($clientName)) { die _tr( - "you have to specify the name for the client you'd like to change!\n" + "you have to specify the name of the client you'd like to change!\n" ); } - my @clientKeys = - map { (/^(\w+)\W/) ? $1 : $_; } @{$DbSchema->{tables}->{client}}; + my @clientKeys = $openslxDB->getColumnsForTable('client'); push @clientKeys, 'systems', 'add-systems', 'remove-systems'; my $clientData = parseKeyValueArgs(\@clientKeys, 'client', @_); @@ -689,8 +798,8 @@ sub changeClientInConfigDB die _tr("system '%s' doesn't exist!\n", $_); } $system->{id}; - } - split ",", $clientData->{systems}; + } + split ",", $clientData->{systems}; delete $clientData->{systems}; } if (exists $clientData->{'add-systems'}) { @@ -701,8 +810,8 @@ sub changeClientInConfigDB die _tr("system '%s' doesn't exist!\n", $_); } $system->{id}; - } - split ",", $clientData->{'add-systems'}; + } + split ",", $clientData->{'add-systems'}; delete $clientData->{'add-systems'}; } if (exists $clientData->{'remove-systems'}) { @@ -739,7 +848,121 @@ sub changeClientInConfigDB if ($verbose) { listClients("id=$client->{id}"); } - return; + + return 1; +} + +sub changeGroupInConfigDB +{ + my $groupName = _cleanName(shift || ''); + + if (!length($groupName)) { + die _tr( + "you have to specify the name of the group you'd like to change!\n" + ); + } + + my @groupKeys = $openslxDB->getColumnsForTable('group'); + push @groupKeys, qw( + systems add-systems remove-systems clients add-clients remove-clients + ); + my $groupData = parseKeyValueArgs(\@groupKeys, 'group', @_); + + my $group = $openslxDB->fetchGroupByFilter({'name' => $groupName}); + if (!defined $group) { + die _tr("the group '%s' doesn't exists in the DB, giving up!\n", + $groupName); + } + + my (@systemIDs, @clientIDs); + if (exists $groupData->{systems}) { + @systemIDs = map { + my $system = $openslxDB->fetchSystemByFilter({'name' => $_}); + if (!defined $system) { + die _tr("system '%s' doesn't exist!\n", $_); + } + $system->{id}; + } + split ",", $groupData->{systems}; + delete $groupData->{systems}; + } + if (exists $groupData->{'add-systems'}) { + @systemIDs = $openslxDB->fetchSystemIDsOfGroup($group->{id}); + push @systemIDs, map { + my $system = $openslxDB->fetchSystemByFilter({'name' => $_}); + if (!defined $system) { + die _tr("system '%s' doesn't exist!\n", $_); + } + $system->{id}; + } + split ",", $groupData->{'add-systems'}; + delete $groupData->{'add-systems'}; + } + if (exists $groupData->{'remove-systems'}) { + @systemIDs = $openslxDB->fetchSystemIDsOfGroup($group->{id}); + foreach my $sysName (split ',', $groupData->{'remove-systems'}) { + my $system = $openslxDB->fetchSystemByFilter({'name' => $sysName}); + if (!defined $system) { + die _tr("system '%s' doesn't exist!\n", $sysName); + } + @systemIDs = grep { $_ != $system->{id} } @systemIDs; + } + delete $groupData->{'remove-systems'}; + } + if (exists $groupData->{clients}) { + @clientIDs = map { + my $client = $openslxDB->fetchClientByFilter({'name' => $_}); + if (!defined $client) { + die _tr("client '%s' doesn't exist in DB, giving up!\n", $_); + } + $client->{id}; + } + split ",", $groupData->{clients}; + delete $groupData->{clients}; + } + if (exists $groupData->{'add-clients'}) { + @clientIDs = $openslxDB->fetchClientIDsOfGroup($group->{id}); + push @clientIDs, map { + my $client = $openslxDB->fetchClientByFilter({'name' => $_}); + if (!defined $client) { + die _tr("client '%s' doesn't exist!\n", $_); + } + $client->{id}; + } + split ",", $groupData->{'add-clients'}; + delete $groupData->{'add-clients'}; + } + if (exists $groupData->{'remove-clients'}) { + @clientIDs = $openslxDB->fetchClientIDsOfGroup($group->{id}); + foreach my $clientName (split ",", $groupData->{'remove-clients'}) { + my $client = + $openslxDB->fetchClientByFilter({'name' => $clientName}); + if (!defined $client) { + die _tr("client '%s' doesn't exist!\n", $clientName); + } + @clientIDs = grep { $_ != $client->{id} } @clientIDs; + } + delete $groupData->{'remove-clients'}; + } + + if (defined $groupData->{priority} && $groupData->{priority} !~ m{^\d+$}) { + die _tr("unknown priority-format given, expected an integer!\n"); + } + + $openslxDB->changeGroup($group->{id}, [$groupData]); + vlog(0, _tr("group '%s' has been successfully changed\n", $groupName)); + if (@systemIDs) { + $openslxDB->setSystemIDsOfGroup($group->{id}, \@systemIDs); + } + if (@clientIDs) { + $openslxDB->setClientIDsOfGroup($group->{id}, \@clientIDs); + } + if ($verbose) { + listGroups("id=$group->{id}"); + } + + + return 1; } sub changeSystemInConfigDB @@ -752,8 +975,7 @@ sub changeSystemInConfigDB ); } - my @systemKeys = - map { (/^(\w+)\W/) ? $1 : $_; } @{$DbSchema->{tables}->{system}}; + my @systemKeys = $openslxDB->getColumnsForTable('system'); push @systemKeys, 'clients', 'add-clients', 'remove-clients'; my $systemData = parseKeyValueArgs(\@systemKeys, 'system', @_); @@ -771,8 +993,8 @@ sub changeSystemInConfigDB die _tr("client '%s' doesn't exist in DB, giving up!\n", $_); } $client->{id}; - } - split ",", $systemData->{clients}; + } + split ",", $systemData->{clients}; delete $systemData->{clients}; } if (exists $systemData->{'add-clients'}) { @@ -783,8 +1005,8 @@ sub changeSystemInConfigDB die _tr("client '%s' doesn't exist!\n", $_); } $client->{id}; - } - split ",", $systemData->{'add-clients'}; + } + split ",", $systemData->{'add-clients'}; delete $systemData->{'add-clients'}; } if (exists $systemData->{'remove-clients'}) { @@ -812,7 +1034,8 @@ sub changeSystemInConfigDB if ($verbose) { listSystems("id=$system->{id}"); } - return; + + return 1; } sub removeClientFromConfigDB @@ -839,7 +1062,33 @@ sub removeClientFromConfigDB vlog(0, _tr("client '%s' has been successfully removed from DB\n", $clientName) ); - return; + + return 1; +} + +sub removegroupFromConfigDB +{ + my $groupName = _cleanName(shift || ''); + + if (!length($groupName)) { + die _tr( + "you have to specify the name of the group you'd like to remove!\n" + ); + } + + my $groupData = parseKeyValueArgs(['name'], 'groups', @_); + + my $group = $openslxDB->fetchGroupByFilter({'name' => $groupName}); + if (!defined $group) { + die _tr("the group '%s' doesn't exists in the DB, giving up!\n", + $groupName); + } + $openslxDB->removeGroup($group->{id}); + vlog(0, + _tr("group '%s' has been successfully removed from DB\n", $groupName) + ); + + return 1; } sub removeSystemFromConfigDB @@ -866,7 +1115,8 @@ sub removeSystemFromConfigDB vlog(0, _tr("system '%s' has been successfully removed from DB\n", $systemName) ); - return; + + return 1; } sub _cleanName @@ -879,6 +1129,7 @@ sub _cleanName if ($name =~ m[^name=(.+)$]) { return $1; } + return $name; } @@ -911,6 +1162,10 @@ adds a new client to the config-DB adds a new system to the config-DB +=item B<< add-group [priority=] [= ...] >> + +adds a new group to the config-DB + =item B<< change-vendor-os [= ...] >> changes the data of an existing vendor-OS in the config-DB @@ -923,6 +1178,10 @@ changes the data of an existing export in the config-DB changes the data of an existing client in the config-DB +=item B<< change-group [= ...] >> + +changes the data of an existing group in the config-DB + =item B<< change-system [= ...] >> changes the data of an existing system in the config-DB @@ -935,6 +1194,10 @@ lists client with given name lists export with given name +=item B<< list-group [] >> + +lists group with given name + =item B<< list-system [] >> lists system with given name @@ -947,6 +1210,10 @@ lists vendor-OS with given name removes a client from the config-DB +=item B<< remove-group >> + +removes a group from the config-DB + =item B<< remove-system >> removes a system from the config-DB @@ -959,6 +1226,10 @@ shows all clients in config-DB (optionally matching given criteria) shows all exports in config-DB (optionally matching given criteria) +=item B<< search-group [= ...] >> + +shows all groups in config-DB (optionally matching given criteria) + =item B<< search-system [= ...] >> shows all systems in config-DB (optionally matching given @@ -1000,7 +1271,7 @@ Prints the version and exits. =head1 EXAMPLES -=head3 Listing existing Clients / Exports / Systems / Vendor-OSes +=head3 Listing existing Clients / Exports / Groups / Systems / Vendor-OSes =over 8 @@ -1008,20 +1279,14 @@ Prints the version and exits. =item B<< slxconfig list-export >> +=item B<< slxconfig list-group >> + =item B<< slxconfig list-system >> =item B<< slxconfig list-vendor-os >> lists all existing instances of the respective DB-objects. -=item B<< slxconfig list-client id=3 >> - -lists the client with id=3 - -=item B<< slxconfig list-export type=nfs >> - -lists the exports of type 'nfs' - =back =head3 Adding a new System to an exported Vendor-OS @@ -1115,15 +1380,35 @@ will remove the system 'Debian-4.0' from the client named =back -=head3 Removing a System / Client +=head3 Removing a Client / Group / System =over 8 +=item B<< slxconfig remove-client >> + +=item B<< slxconfig remove-group >> + =item B<< slxconfig remove-system >> -=item B<< slxconfig remove-client >> +removes the client/group/system with the given name. + +=back + +=head3 Searching for Clients / Exports / Groups / Systems / Vendor-OSes + +=over 8 + +=item B<< slxconfig search-client mac='01:02:03:04:05:06' >> + +displays all clients with the MAC '01:02:03:04:05:06' (should be only one) + +=item B<< slxconfig search-export type=nfs >> + +displays the exports of type 'nfs' + +=item B<< slxconfig list-group priority=50 >> -removes the system/client with the given name. +displays the groups that have the default priority (50) =back -- cgit v1.2.3-55-g7522