- Added -moveuser, -renamegroup and -ReplaceDev options and necessary -to argument.
authormgandalf <mgandalf@d57e44dd-8a1f-0410-8b47-8ef2f437770f>
Wed, 16 Sep 2009 19:28:13 +0000 (19:28 +0000)
committermgandalf <mgandalf@d57e44dd-8a1f-0410-8b47-8ef2f437770f>
Wed, 16 Sep 2009 19:28:13 +0000 (19:28 +0000)
- Fixed minor bug in new renameGroup() method in SCST::SCST.

git-svn-id: https://scst.svn.sourceforge.net/svnroot/scst/trunk@1102 d57e44dd-8a1f-0410-8b47-8ef2f437770f

scstadmin/ChangeLog
scstadmin/scst-0.7.4/lib/SCST/SCST.pm
scstadmin/scstadmin

index 8cf59a8..c4df75a 100644 (file)
@@ -1,3 +1,8 @@
+Changes for 1.0.7
+
+- Added -moveuser, -renamegroup and -ReplaceDev options and necessary -to argument.
+- Fixed minor bug in new renameGroup() method in SCST::SCST.
+
 Changes for 1.0.6
 
 - Added -resyncdev option to work with the new SCST resync_size option.
index ffce684..f97e9e6 100644 (file)
@@ -252,7 +252,7 @@ sub renameGroup {
        my $oldName = shift;
        my $newName = shift;
 
-       if ($self->groupExists($oldName)) {
+       if (!$self->groupExists($oldName)) {
                $self->{'error'} = "renameGroup(): Group '$oldName' doesn't exist";
                return 1;
        }
index be9fa9a..a05eed6 100755 (executable)
@@ -1,5 +1,5 @@
 #!/usr/bin/perl
-$Version  = 'SCST Configurator v1.0.6';
+$Version  = 'SCST Configurator v1.0.7';
 
 # Configures SCST
 #
@@ -38,6 +38,9 @@ Device Operations
 User Operations
      -adduser <user>      : Adds a user to a security group.
          -group <group>
+     -MoveUser <user>     : Moves a user from one security group to another.
+         -group <group 1>
+         -to <group 2>
      -RemoveUser <user>   : Delete a user from a security group.
          -group <group>
      -ClearUsers          : Clear all users from a given security group.
@@ -45,12 +48,17 @@ User Operations
 
 Group Operations
      -addgroup <group>    : Add a given group to available security groups.
+     -renamegroup <group> : Renames a give group to a new name.
+         -to <new group>
      -RemoveGroup <group> : Remove a give group from available security groups.
      
 Assignment Operations
      -assigndev <device>  : Assign a given device to a security group.
          -group <group>
          -lun <lun>
+     -ReplaceDev <new dev>: Replaces a device assigned to a give LUN and group.
+         -group <group>
+         -lun <lun>
      -ReleaseDev <device> : Remove a given device from a security group.
          -group <group>
      -ClearDevs           : Clear all device assignments for a security group.
@@ -84,6 +92,9 @@ Examples:
      Assign a device to a security group:
        scstadmin -assigndev DISK01 -group HOST01 -lun 1
 
+     Rename a security group:
+       scstadmin -RenameGroup HOST01 -to SERVER01
+
 EndUsage
   }
 
@@ -172,13 +183,18 @@ sub getArgs {
        my $addDev;
        my $devPath;
        my $resyncDev;
+       my $replaceDev;
        my $removeDev;
        my $addUser;
+       my $moveUser;
        my $removeUser;
        my $clearUsers;
        my $addGroup;
+       my $toGroup;
+       my $renameGroup;
        my $removeGroup;
        my $assignDev;
+       my $replaceDev;
        my $releaseDev;
        my $clearDevs;
        my $devLun;
@@ -199,13 +215,17 @@ sub getArgs {
                            'sessions'          => \$showSessions,
                            'adddev=s'          => \$addDev,
                            'path=s'            => \$devPath,
+                           'ReplaceDev=s'      => \$replaceDev,
                            'RemoveDev=s'       => \$removeDev,
                            'lun=s'             => \$devLun,
                            'adduser=s'         => \$addUser,
+                           'MoveUser=s'        => \$moveUser,
                            'RemoveUser=s'      => \$removeUser,
                            'ClearUsers'        => \$clearUsers,
                            'addgroup=s'        => \$addGroup,
+                           'to=s'              => \$toGroup,
                            'RemoveGroup=s'     => \$removeGroup,
+                           'renamegroup=s'     => \$renameGroup,
                            'assigndev=s'       => \$assignDev,
                            'resyncdev=s'       => \$resyncDev,
                            'ReleaseDev=s'      => \$releaseDev,
@@ -269,6 +289,11 @@ sub getArgs {
                usage();
        }
 
+       if ($moveUser && (!defined($group) || !defined($toGroup))) {
+               print "Please specify -group and -to with -MoveUser.\n\n";
+               usage();
+       }
+
        if ($removeUser && !defined($group)) {
                print "Please specify -group with -RemoveUser.\n\n";
                usage();
@@ -279,8 +304,18 @@ sub getArgs {
                usage();
        }
 
-       if ($assignDev && !(defined($group) && defined($devLun))) {
-               print "Please specify -group and -lun with -assigndev.\n\n";
+       if ($renameGroup && !defined($toGroup)) {
+               print "Please specify -to with -renamegroup.\n\n";
+               usage();
+       }
+
+       if ($assignDev && !defined($group)) {
+               print "Please specify -group with -assigndev.\n\n";
+               usage();
+       }
+
+       if ($replaceDev && (!defined($group) || !defined($devLun))) {
+               print "Please specify -group and -lun with -ReplaceDev.\n\n";
                usage();
        }
 
@@ -320,9 +355,9 @@ sub getArgs {
        $checkConfig = $_DEF_CONFIG_ if (defined($checkConfig) && !$checkConfig);
 
        return ($enable, $disable, $addDev, $devPath, $devLun, $resyncDev, $removeDev, $addUser,
-               $removeUser, $clearUsers, $addGroup, $removeGroup, $assignDev, $releaseDev,
-               $clearDevs, $handler, $group, $options, $blocksize, $applyConfig, $forceConfig,
-               $clearConfig, $writeConfig, $checkConfig, $showSessions);
+               $moveUser, $removeUser, $clearUsers, $addGroup, $renameGroup, $toGroup, $removeGroup,
+               $assignDev, $replaceDev, $releaseDev, $clearDevs, $handler, $group, $options, $blocksize,
+               $applyConfig, $forceConfig, $clearConfig, $writeConfig, $checkConfig, $showSessions);
 }
 
 sub main {
@@ -334,9 +369,9 @@ sub main {
        if ( $> ) {die("This program must run as root.\n");}
 
        my ($enable, $disable, $addDev, $devPath, $devLun, $resyncDev, $removeDev, $addUser,
-           $removeUser, $clearUsers, $addGroup, $removeGroup, $assignDev, $releaseDev,
-           $clearDevs, $handler, $group, $options, $blocksize, $applyConfig, $forceConfig,
-           $clearConfig, $writeConfig, $checkConfig, $showSessions) = getArgs();
+           $moveUser, $removeUser, $clearUsers, $addGroup, $renameGroup, $toGroup, $removeGroup,
+           $assignDev, $replaceDev, $releaseDev, $clearDevs, $handler, $group, $options, $blocksize,
+           $applyConfig, $forceConfig, $clearConfig, $writeConfig, $checkConfig, $showSessions) = getArgs();
 
        $SCST = new SCST::SCST($_DEBUG_);
 
@@ -388,6 +423,10 @@ sub main {
                        $rc = addUser($group, $addUser);
                        last SWITCH;
                };
+               $moveUser && do {
+                       $rc = moveUser($group, $moveUser, $toGroup);
+                       last SWITCH;
+               };
                $removeUser && do {
                        $rc = removeUser($group, $removeUser);
                        last SWITCH;
@@ -400,6 +439,10 @@ sub main {
                        $rc = addGroup($addGroup);
                        last SWITCH;
                };
+               $renameGroup && do {
+                       $rc = renameGroup($renameGroup, $toGroup);
+                       last SWITCH;
+               };
                $removeGroup && do {
                        $rc = removeGroup($removeGroup);
                        last SWITCH;
@@ -408,6 +451,10 @@ sub main {
                        $rc = assignDevice($group, $assignDev, $devLun);
                        last SWITCH;
                };
+               $replaceDev && do {
+                       $rc = replaceDevice($group, $replaceDev, $devLun);
+                       last SWITCH;
+               };
                $releaseDev && do {
                        $rc = releaseDevice($group, $releaseDev);
                        last SWITCH;
@@ -1136,6 +1183,29 @@ sub addGroup {
        return $FALSE;
 }
 
+sub renameGroup {
+       my $group = shift;
+       my $toGroup = shift;
+
+       if (defined($GROUPS{$toGroup})) {
+               print "WARNING: Group '$toGroup' already exists.\n";
+               return $TRUE;
+       }
+
+       print "\t-> Renaming security group '$group' to '$toGroup'..\n";
+
+       if ($SCST->renameGroup($group, $toGroup)) {
+               print "WARNING: Failed to rename security group '$group' to ".
+                 "'$toGroup': ".$SCST->errorString()."\n";
+               return $TRUE;
+       }
+
+       delete $GROUPS{$group};
+       $GROUPS{$toGroup}++;
+
+       return $FALSE;
+}
+
 sub removeGroup {
        my $group = shift;
 
@@ -1186,6 +1256,35 @@ sub addUser {
        return $FALSE;
 }
 
+sub moveUser {
+       my $group = shift;
+       my $user = shift;
+       my $toGroup = shift;
+
+       if (!defined($GROUPS{$group})) {
+               print "WARNING: Failed to move user '$user' from group '$group', group does not exist.\n";
+               return $TRUE;
+       }
+
+       if (defined($USERS{$toGroup}->{$user})) {
+               print "WARNING: User '$user' already exists in security group '$toGroup'.\n";
+               return $TRUE;
+       }
+
+       print "\t-> Moving user '$user' from security group '$group' to security group '$toGroup'..\n";
+
+       if ($SCST->moveUser($user, $group, $toGroup)) {
+               print "WARNING: Failed to move user '$user' from security group '$group' to ".
+                 "security group '$toGroup': ".$SCST->errorString()."\n";
+               return $TRUE;
+       }
+
+       delete $USERS{$group}->{$user};
+       $USERS{$toGroup}->{$user}++;
+
+       return $FALSE;
+}
+
 sub removeUser {
        my $group = shift;
        my $user = shift;
@@ -1295,6 +1394,52 @@ sub assignDevice {
        return $FALSE;
 }
 
+sub replaceDevice {
+       my $group = shift;
+       my $newDevice = shift;
+       my $lun = shift;
+       my %allLuns;
+
+       # Put luns into something easier to parse..
+       foreach my $_group (keys %ASSIGNMENTS) {
+               my $_gAssigns = $ASSIGNMENTS{$_group};
+
+               foreach my $_device (keys %{$_gAssigns}) {
+                       @{$allLuns{$_group}}[$$_gAssigns{$_device}] = $_device;
+               }
+       }
+                       
+       if (!defined($$DEVICES{$newDevice})) {
+               print "WARNING: Unable to assign non-existant device '$newDevice' to group '$group'.\n";
+               return $TRUE;
+       }
+
+       if (${$allLuns{$group}}[$lun] eq $newDevice) {
+               print "ERROR: Device '$newDevice': Lun '$lun' is already assigned to device '$newDevice'.\n";
+               return $TRUE;
+       }
+
+       print "\t-> Replace device at LUN '$lun' in group '$group' with new device '$newDevice'..\n";
+
+       if ($SCST->replaceDeviceInGroup($newDevice, $group, $lun)) {
+               print "WARNING: Failed to replace LUN '$lun' in group '$group' with new device '$newDevice': ".
+                 $SCST->errorString()."\n";
+               return $TRUE;
+       }
+
+       if (!defined($ASSIGNMENTS{$group})) {
+               my %assignments_t;
+               $ASSIGNMENTS{$group} = \%assignments_t;
+       }
+
+       my $_assignments = $ASSIGNMENTS{$group};
+
+       delete $$_assignments{${$allLuns{$group}}[$lun]};
+       $$_assignments{$newDevice} = $lun;
+
+       return $FALSE;
+}
+
 sub releaseDevice {
        my $group = shift;
        my $device = shift;