- Updated for vdisk/vcdrom from disk_fileio/cdrom_fileio
authormgandalf <mgandalf@d57e44dd-8a1f-0410-8b47-8ef2f437770f>
Tue, 19 Jun 2007 20:21:27 +0000 (20:21 +0000)
committermgandalf <mgandalf@d57e44dd-8a1f-0410-8b47-8ef2f437770f>
Tue, 19 Jun 2007 20:21:27 +0000 (20:21 +0000)
- Added new errorString() method to SCST/SCST.pm containing
  error message of last error encountered.
- Minor updates to scst_db - UNTESTED
- Changed SCST/SCST.pm to look for files like vdisk/vdisk instead
  of vdisk/type to gather list of valid device handlers
- Minor bug fixes

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

scstadmin/Changes
scstadmin/SCST/SCST.pm
scstadmin/examples/scst.conf
scstadmin/examples/scst_example.sql
scstadmin/scst_db/scst_db
scstadmin/scstadmin

index 6bf7ba0..3f50be1 100644 (file)
@@ -15,3 +15,14 @@ Changes since 0.9.5-pre0:
 - Removed the comment which prevented a target from being enabled in enableTarget()
 - Updated init.d/scst to use scstadmin instead of scst_db
 - Fixup of README file
+
+Changes since 0.9.6-pre2:
+
+- Updated SCST/SCST.pm for vdisk/vcdrom from cdrom_fileio/disk_fileio
+- Updated scstadmin for vdisk/vcdrom...
+- Minor updates to scst_db for vdisk/vcdrom - UNTESTED
+- Enhanced error messages in SCST/SCST.pm. Now has new method errorString()
+- Added additional error messaging to scstadmin
+- Changed SCST/SCST.pm to look for vdisk/vdisk instead of vdisk/type for
+  valid device handler types.
+- Minor bug fixes
index b64837d..c04788f 100644 (file)
@@ -17,13 +17,13 @@ my $_SCST_IO_            = $_SCST_DIR_.'/scsi_tgt';
 my $_SCST_CDROM_IO_      = $_SCST_DIR_.'/dev_cdrom/dev_cdrom';
 my $_SCST_CHANGER_IO_    = $_SCST_DIR_.'/dev_changer/dev_changer';
 my $_SCST_DISK_IO_       = $_SCST_DIR_.'/dev_disk/dev_disk';
-my $_SCST_DISK_FILE_IO_  = $_SCST_DIR_.'/disk_fileio/disk_fileio';
-my $_SCST_CDROM_FILE_IO_ = $_SCST_DIR_.'/cdrom_fileio/cdrom_fileio';
 my $_SCST_DISKP_IO_      = $_SCST_DIR_.'/dev_disk_perf/dev_disk_perf';
 my $_SCST_MODISK_IO_     = $_SCST_DIR_.'/dev_modisk/dev_modisk';
 my $_SCST_MODISKP_IO_    = $_SCST_DIR_.'/dev_modisk_perf/dev_modisk_perf';
 my $_SCST_TAPE_IO_       = $_SCST_DIR_.'/dev_tape/dev_tape';
 my $_SCST_TAPEP_IO_      = $_SCST_DIR_.'/dev_tape_perf/dev_tape_perf';
+my $_SCST_VDISK_IO_      = $_SCST_DIR_.'/vdisk/vdisk';
+my $_SCST_VCDROM_IO_     = $_SCST_DIR_.'/vcdrom/vcdrom';
 my $_SCST_GROUPS_DIR_    = $_SCST_DIR_.'/groups';
 my $_SCST_SGV_STATS_     = $_SCST_DIR_.'/sgv';
 my $_SCST_SESSIONS_      = $_SCST_DIR_.'/sessions';
@@ -34,32 +34,32 @@ my $_SCST_DEVICES_IO_    = 'devices';
 
 my @_AVAILABLE_OPTIONS_  = ('WRITE_THROUGH', 'O_DIRECT', 'READ_ONLY', 'NULLIO', 'NV_CACHE');
 
-use vars qw(@ISA @EXPORT $VERSION $CDROM_TYPE $CHANGER_TYPE $DISK_TYPE $DISKFILE_TYPE
-            $CDROMFILE_TYPE $DISKPERF_TYPE $MODISK_TYPE $MODISKPERF_TYPE $TAPE_TYPE
+use vars qw(@ISA @EXPORT $VERSION $CDROM_TYPE $CHANGER_TYPE $DISK_TYPE $VDISK_TYPE
+            $VCDROM_TYPE $DISKPERF_TYPE $MODISK_TYPE $MODISKPERF_TYPE $TAPE_TYPE
             $TAPEPERF_TYPE);
 
 $CDROM_TYPE      = 1;
 $CHANGER_TYPE    = 2;
 $DISK_TYPE       = 3;
-$DISKFILE_TYPE   = 4;
-$CDROMFILE_TYPE  = 5;
+$VDISK_TYPE      = 4;
+$VCDROM_TYPE     = 5;
 $DISKPERF_TYPE   = 6;
 $MODISK_TYPE     = 7;
 $MODISKPERF_TYPE = 8;
 $TAPE_TYPE       = 9;
 $TAPEPERF_TYPE   = 10;
 
-$VERSION = 0.6;
+$VERSION = 0.6.1;
 
 my $_SCST_MIN_MAJOR_   = 0;
 my $_SCST_MIN_MINOR_   = 9;
-my $_SCST_MIN_RELEASE_ = 5;
+my $_SCST_MIN_RELEASE_ = 6;
 
 my %_IO_MAP_ = ($CDROM_TYPE => $_SCST_CDROM_IO_,
                $CHANGER_TYPE => $_SCST_CHANGER_IO_,
                $DISK_TYPE => $_SCST_DISK_IO_,
-               $DISKFILE_TYPE => $_SCST_DISK_FILE_IO_,
-               $CDROMFILE_TYPE => $_SCST_CDROM_FILE_IO_,
+               $VDISK_TYPE => $_SCST_VDISK_IO_,
+               $VCDROM_TYPE => $_SCST_VCDROM_IO_,
                $DISKPERF_TYPE => $_SCST_DISKP_IO_,
                $MODISK_TYPE => $_SCST_MODISK_IO_,
                $MODISKPERF_TYPE => $_SCST_MODISKP_IO_,
@@ -69,8 +69,8 @@ my %_IO_MAP_ = ($CDROM_TYPE => $_SCST_CDROM_IO_,
 my %_TYPE_MAP_ = ('dev_cdrom' => $CDROM_TYPE,
                  'dev_changer' => $CHANGER_TYPE,
                  'dev_disk' => $DISK_TYPE,
-                 'disk_fileio' => $DISKFILE_TYPE,
-                 'cdrom_fileio' => $CDROMFILE_TYPE,
+                 'vdisk' => $VDISK_TYPE,
+                 'vcdrom' => $VCDROM_TYPE,
                  'dev_disk_perf' => $DISKPERF_TYPE,
                  'dev_modisk' => $MODISK_TYPE,
                  'dev_modisk_perf' => $MODISKPERF_TYPE,
@@ -87,11 +87,12 @@ sub new {
 
        bless($self, $class);
 
-       $self->{'debug'} = $debug if $debug;
+       $self->{'debug'} = $debug;
 
        my $scstVersion = $self->scstVersion();
 
        my($major, $minor, $release) = split(/\./, $scstVersion, 3);
+       ($release, undef) = split(/\-/, $release) if ($release =~ /\-/);
 
        $badVersion = $FALSE if (($major > $_SCST_MIN_MAJOR_) ||
                                 (($major == $_SCST_MIN_MAJOR_) && ($minor > $_SCST_MIN_MINOR_)) ||
@@ -152,7 +153,11 @@ sub addGroup {
        return 2 if ($self->groupExists($group));
 
        my $io = new IO::File $_SCST_IO_, O_WRONLY;
-       return $TRUE if (!$io);
+
+       if (!$io) {
+               $self->{'error'} = "addGroup(): Failed to open handler IO $_SCST_IO_";
+               return $TRUE;
+       }
 
        my $cmd = "add_group $group\n";
 
@@ -175,7 +180,11 @@ sub removeGroup {
        return 2 if (!$self->groupExists($group));
 
        my $io = new IO::File $_SCST_IO_, O_WRONLY;
-       return $TRUE if (!$io);
+
+       if (!$io) {
+               $self->{'error'} = "removeGroup(): Failed to open handler IO $_SCST_IO_";
+               return $TRUE;
+       }
 
        my $cmd = "del_group $group\n";
 
@@ -197,7 +206,10 @@ sub sgvStats {
        my %stats;
        my $first = $TRUE;
 
-       return undef if (!$io);
+       if (!$io) {
+               $self->{'error'} = "sgvStats(): Failed to open handler IO $_SCST_IO_";
+               return undef;
+       }
 
        while (my $line = <$io>) {
                chomp $line;
@@ -244,7 +256,10 @@ sub sessions {
        my %sessions;
        my $first = $TRUE;
 
-       return undef if (!$io);
+       if (!$io) {
+               $self->{'error'} = "sessions(): Failed to open handler IO $_SCST_IO_";
+               return undef;
+       }
 
        while (my $line = <$io>) {
                chomp $line;
@@ -270,7 +285,10 @@ sub devices {
        my %devices;
        my $first = $TRUE;
 
-       return undef if (!$io);
+       if (!$io) {
+               $self->{'error'} = "devices(): Failed to open handler IO $_SCST_IO_";
+               return undef;
+       }
 
        while (my $line = <$io>) {
                chomp $line;
@@ -296,11 +314,22 @@ sub handlerDevices {
        my $first = $TRUE;
        my %devices;
 
-       return undef if (!$handler_io);
-       return undef if (!$self->handlerExists($handler));
+       if (!$handler_io) {
+               $self->{'error'} = "handlerDevices(): Failed to open handler IO $handler_io or handler $handler invalid";
+               return undef;
+       }
+
+       if (!$self->handlerExists($handler)) {
+               $self->{'error'} = "handlerDevices(): Handler $handler does not exist";
+               return undef;
+       }
 
        my $io = new IO::File $handler_io, O_RDONLY;
-       return undef if (!$io);
+
+       if (!$io) {
+               $self->{'error'} = "handlerDevices(): Failed to open handler IO $handler_io";
+               return undef;
+       }
 
        while (my $line = <$io>) {
                chomp $line;
@@ -349,10 +378,26 @@ sub openDevice {
        my $blocksize = shift;
        my $handler_io = $_IO_MAP_{$handler};
 
-       return $TRUE if ($self->checkOptions($options));
-       return $TRUE if (!$handler_io);
-       return $TRUE if (!$self->handlerExists($handler));
-       return 2 if ($self->handlerDeviceExists($handler, $device));
+       if ($self->checkOptions($options)) {
+               $self->{'error'} = "openDevice(): Invalid options '$options' given for device $device";
+               return $TRUE;
+       }
+
+       if (!$handler_io) {
+               $self->{'error'} = "openDevice(): Failed to open handler IO $handler_io or ".
+                 "handler $handler invalid";
+               return $TRUE;
+       }
+
+       if (!$self->handlerExists($handler)) {
+               $self->{'error'} = "openDevice(): Handler $handler does not exist";
+               return $TRUE;
+       }
+
+       if ($self->handlerDeviceExists($handler, $device)) {
+               $self->{'error'} = "openDevice(): Device $device is already open";
+               return 2;
+       }
 
        $options = $self->cleanupString($options);
 
@@ -364,7 +409,15 @@ sub openDevice {
 
        return $FALSE if ($self->{'debug'});
        return $rc if ($rc);
-       return !$self->handlerDeviceExists($handler, $device);
+
+       $rc = !$self->handlerDeviceExists($handler, $device);
+
+       if ($rc) {
+               $self->{'error'} = "openDevice(): An error occured while opening device $device. ".
+                 "See dmesg/kernel log for more information.";
+       }
+
+       return $rc;
 }
 
 sub closeDevice {
@@ -374,9 +427,20 @@ sub closeDevice {
        my $path = shift;
        my $handler_io = $_IO_MAP_{$handler};
 
-       return $TRUE if (!$handler_io);
-       return $TRUE if (!$self->handlerExists($handler));
-       return 2 if (!$self->handlerDeviceExists($handler, $device));
+       if (!$handler_io) {
+               $self->{'error'} = "closeDevice(): Failed to open handler IO $handler_io or handler $handler invalid";
+               return $TRUE;
+       }
+
+       if (!$self->handlerExists($handler)) {
+               $self->{'error'} = "closeDevice(): Handler $handler does not exist";
+               return $TRUE;
+       }
+
+       if ($self->handlerDeviceExists($handler, $device)) {
+               $self->{'error'} = "closeDevice(): Device $device is not open";
+               return 2;
+       }
 
        my $cmd = "close $device $path\n";
 
@@ -384,7 +448,15 @@ sub closeDevice {
 
        return $FALSE if ($self->{'debug'});
        return $rc if ($rc);
-       return $self->handlerDeviceExists($handler, $device);
+
+       $rc = $self->handlerDeviceExists($handler, $device);
+
+       if ($rc) {
+               $self->{'error'} = "closeDevice(): An error occured while closing device $device. ".
+                 "See dmesg/kernel log for more information.";
+       }
+
+       return $rc;
 }
 
 sub userExists {
@@ -411,7 +483,12 @@ sub users {
        return undef if (!$self->groupExists($group));
 
        my $io = new IO::File $_SCST_GROUPS_DIR_."/$group/".$_SCST_USERS_IO_, O_RDONLY;
-       return undef if (!$io);
+
+       if (!$io) {
+               $self->{'error'} = "users(): Failed to open handler IO ".$_SCST_GROUPS_DIR_.
+                 "/$group/".$_SCST_USERS_IO_;
+               return undef;
+       }
 
        while (my $line = <$io>) {
                chomp $line;
@@ -429,8 +506,15 @@ sub addUser {
        my $user = shift;
        my $group = shift;
 
-       return $TRUE if (!$self->groupExists($group));
-       return 2 if ($self->userExists($user, $group));
+       if (!$self->groupExists($group)) {
+               $self->{'error'} = "addUser(): Group $group does not exist";
+               return $TRUE;
+       }
+
+       if ($self->userExists($user, $group)) {
+               $self->{'error'} = "addUser(): User $user already exists in group $group";
+               return 2;
+       }
 
        my $cmd = "add $user\n";
 
@@ -438,7 +522,15 @@ sub addUser {
 
        return $FALSE if ($self->{'debug'});
        return $rc if ($rc);
-       return !$self->userExists($user, $group);
+
+       $rc = !$self->userExists($user, $group);
+
+       if ($rc) {
+               $self->{'error'} = "addUser(): An error occured while adding user $user to group $group. ".
+                 "See dmesg/kernel log for more information.";
+       }
+
+       return $rc;
 }
 
 sub removeUser {
@@ -446,8 +538,15 @@ sub removeUser {
        my $user = shift;
        my $group = shift;
 
-       return $TRUE if (!$self->groupExists($group));
-       return 2 if (!$self->userExists($user, $group));
+       if (!$self->groupExists($group)) {
+               $self->{'error'} = "removeUser(): Group $group does not exist";
+               return $TRUE;
+       }
+
+       if ($self->userExists($user, $group)) {
+               $self->{'error'} = "removeUser(): User $user does not exist in group $group";
+               return 2;
+       }
 
        my $cmd = "del $user\n";
 
@@ -455,21 +554,37 @@ sub removeUser {
 
        return $FALSE if ($self->{'debug'});
        return $rc if ($rc);
-       return $self->userExists($user, $group);
+
+       $rc = $self->userExists($user, $group);
+
+       if ($rc) {
+               $self->{'error'} = "removeUser(): An error occured while removing user $user ".
+                 "from group $group. See dmesg/kernel log for more information.";
+       }
+
+       return $rc;
 }
 
 sub clearUsers {
        my $self = shift;
        my $group = shift;
 
-       return $TRUE if (!$self->groupExists($group));
+       if (!$self->groupExists($group)) {
+               $self->{'error'} = "clearUsers(): Group $group does not exist";
+               return $TRUE;
+       }
 
        my $cmd = "clear\n";
 
        my $rc = $self->group_private($group, $_SCST_USERS_IO_, $cmd);
 
        return $FALSE if ($self->{'debug'});
-       return $rc if ($rc);
+
+       if ($rc) {
+               $self->{'error'} = "clearUsers(): An error occured while clearing users from ".
+                 "group $group. See dmesg/kernel log for more information.";
+               return $rc;
+       }
 
        my $users = $self->users($group);
 
@@ -498,8 +613,7 @@ sub handlers {
 
        foreach my $entry (readdir($dirHandle)) {
                next if (($entry eq '.') || ($entry eq '..'));
-
-               if ((-d $_SCST_DIR_.'/'.$entry ) && (-f $_SCST_DIR_.'/'.$entry.'/type')) {
+               if ((-d $_SCST_DIR_.'/'.$entry ) && (-f $_SCST_DIR_.'/'.$entry.'/'.$entry)) {
                        push @handlers, $_TYPE_MAP_{$entry} if ($_TYPE_MAP_{$entry});
                }
        }
@@ -533,10 +647,18 @@ sub groupDevices {
        my %devices;
        my $first = $TRUE;
 
-       return undef if (!$self->groupExists($group));
+       if (!$self->groupExists($group)) {
+               $self->{'error'} = "groupDevices(): Group $group does not exist";
+               return undef;
+       }
 
        my $io = new IO::File $_SCST_GROUPS_DIR_."/$group/".$_SCST_DEVICES_IO_, O_RDONLY;
-       return undef if (!$io);
+
+       if (!$io) {
+               $self->{'error'} = "groupDevices(): Failed to open handler IO ".$_SCST_GROUPS_DIR_.
+                 "/$group/".$_SCST_DEVICES_IO_;
+               return undef;
+       }
 
        while (my $line = <$io>) {
                chomp $line;
@@ -562,8 +684,16 @@ sub assignDeviceToGroup {
        my $group = shift;
        my $lun = shift;
 
-       return $TRUE if (!$self->groupExists($group));
-       return 2 if ($self->groupDeviceExists($device, $group, $lun));
+       if (!$self->groupExists($group)) {
+               $self->{'error'} = "assignDeviceToGroup(): Group $group does not exist";
+               return $TRUE;
+       }
+
+       if ($self->groupDeviceExists($device, $group, $lun)) {
+               $self->{'error'} = "assignDeviceToGroup(): Device $device is already ".
+                 "assigned to group $group";
+               return 2;
+       }
 
        my $cmd = "add $device $lun\n";
 
@@ -571,7 +701,15 @@ sub assignDeviceToGroup {
 
        return $FALSE if ($self->{'debug'});
        return $rc if ($rc);
-       return !$self->groupDeviceExists($device, $group, $lun);
+
+       $rc = !$self->groupDeviceExists($device, $group, $lun);
+
+       if ($rc) {
+               $self->{'error'} = "assignDeviceToGroup(): An error occured while assigning device $device ".
+                 "to group $group. See dmesg/kernel log for more information.";
+       }
+
+       return $rc;
 }
 
 sub assignDeviceToHandler {
@@ -579,10 +717,22 @@ sub assignDeviceToHandler {
        my $device = shift;
        my $handler = shift;
        my $handler_io = $_IO_MAP_{$handler};
-       
-       return $TRUE if (!$handler_io);
-       return $TRUE if (!$self->handlerExists($handler));
-       return 2 if ($self->handlerDeviceExists($handler, $device));
+
+       if (!$handler_io) {
+               $self->{'error'} = "assignDeviceToHandler(): Failed to open handler IO $handler_io or ".
+                 "handler $handler invalid";
+               return $TRUE;
+       }
+
+       if (!$self->handlerExists($handler)) {
+               $self->{'error'} = "assignDeviceToHandler(): Handler $handler does not exist";
+               return $TRUE;
+       }
+
+       if ($self->handlerDeviceExists($device, $handler)) {
+               $self->{'error'} = "assignDeviceToHandler(): Device $device is already assigned to handler $handler";
+               return 2;
+       }
 
        my $cmd = "assign $device $handler\n";
 
@@ -590,7 +740,15 @@ sub assignDeviceToHandler {
 
        return $FALSE if ($self->{'debug'});
        return $rc if($rc);
-       return !$self->handlerDeviceExists($handler, $device);
+
+       $rc = !$self->handlerDeviceExists($handler, $device);
+
+       if ($rc) {
+               $self->{'error'} = "assignDeviceToHandler(): An error occured while assigning device $device ".
+                 "to handler $handler. See dmesg/kernel log for more information.";
+       }
+
+       return $rc;
 }
 
 sub removeDeviceFromGroup {
@@ -598,8 +756,15 @@ sub removeDeviceFromGroup {
        my $device = shift;
        my $group = shift;
 
-       return $TRUE if (!$self->groupExists($group));
-       return 2 if (!$self->groupDeviceExists($device, $group));
+       if (!$self->groupExists($group)) {
+               $self->{'error'} = "removeDeviceFromGroup(): Group $group does not exist";
+               return $TRUE;
+       }
+
+       if (!$self->groupDeviceExists($device, $group)) {
+               $self->{'error'} = "removeDeviceFromGroup(): Device $device does not exist in group $group";
+               return 2;
+       }
 
        my $cmd = "del $device\n";
 
@@ -607,7 +772,15 @@ sub removeDeviceFromGroup {
 
        return $FALSE if ($self->{'debug'});
        return $rc if ($rc);
-       return $self->groupDeviceExists($device, $group);
+
+       $rc = $self->groupDeviceExists($device, $group);
+
+       if ($rc) {
+               $self->{'error'} = "removeDeviceFromGroup(): An error occured while removing device $device ".
+                 "from group $group. See dmesg/kernel log for more information.";
+       }
+
+       return $rc;
 }
 
 sub clearGroupDevices {
@@ -621,7 +794,12 @@ sub clearGroupDevices {
        my $rc = $self->group_private($group, $_SCST_DEVICES_IO_, $cmd);
 
        return $FALSE if ($self->{'debug'});
-       return $rc if ($rc);
+
+       if ($rc) {
+               $self->{'error'} = "clearGroupDevices(): An error occured while clearing devices from ".
+                 "group $group. See dmesg/kernel log for more information.";
+               return $rc;
+       }
 
        my $devices = $self->groupDevices($group);
 
@@ -634,7 +812,11 @@ sub handler_private {
        my $cmd = shift;
 
        my $io = new IO::File $handler_io, O_WRONLY;
-       return $TRUE if (!$io);
+
+       if (!$io) {
+               $self->{'error'} = "SCST/SCST.pm: Failed to open handler IO $handler_io";
+               return $TRUE;
+       }
 
        if ($self->{'debug'}) {
                print "DBG($$): '$handler_io' -> '$cmd'\n";
@@ -652,7 +834,11 @@ sub scst_private {
        my $cmd = shift;
 
        my $io = new IO::File $_SCST_IO_, O_WRONLY;
-        return $TRUE if (!$io);
+
+       if (!$io) {
+               $self->{'error'} = "SCST/SCST.pm: Failed to open handler IO $_SCST_IO_";
+               return $TRUE;
+       }
 
        if ($self->{'debug'}) {
                print "DBG($$): '$_SCST_IO_' -> '$cmd'\n";
@@ -672,7 +858,11 @@ sub group_private {
        my $cmd = shift;
 
        my $io = new IO::File $_SCST_GROUPS_DIR_."/$group/".$file, O_WRONLY;
-       return $TRUE if (!$io);
+
+       if (!$io) {
+               $self->{'error'} = "SCST/SCST.pm: Failed to open handler IO ".$_SCST_GROUPS_DIR_."/$group/".$file;
+               return $TRUE;
+       }
 
        if ($self->{'debug'}) {
                print "DBG($$): $_SCST_GROUPS_DIR_/$group/$file -> $cmd\n";
@@ -700,6 +890,17 @@ sub checkOptions {
        return $TRUE;
 }
 
+sub errorString {
+       my $self = shift;
+
+       return undef if (!$self->{'error'});
+
+       my $string = $self->{'error'};
+       $self->{'error'} = undef;
+
+       return $string;
+}
+
 sub cleanupString {
        my $self = shift;
        my $string = shift;
@@ -724,9 +925,9 @@ SCST::SCST - Generic SCST methods.
     
     print "Using SCST version".$p->scstVersion()."\n";
     
-    if ($p->handlerDeviceExists($SCST::SCST::DISKFILE_TYPE)) {
+    if ($p->handlerDeviceExists($SCST::SCST::VDISK_TYPE)) {
          print "openDevice() failed\n"
-           if ($p->openDevice($SCST::SCST::DISKFILE_TYPE, 'DISK01', '/vdisk/disk01.dsk'));
+           if ($p->openDevice($SCST::SCST::VDISK_TYPE, 'DISK01', '/vdisk/disk01.dsk'));
     }
     
     undef $p;
@@ -976,6 +1177,16 @@ Arguments: (string) $group
 
 Returns: (int) $success
 
+=item SCST::SCST->errorString();
+
+Contains a description of the last error occured or undef if no error
+has occured or if this method has already been called once since the
+last error.
+
+Arguments: (void)
+
+Returns: (string) $error_string
+
 =back
 
 =head1 WARNING
@@ -992,8 +1203,8 @@ Available Device Handlers:
 CDROM_TYPE,
 CHANGER_TYPE,
 DISK_TYPE,
-DISKFILE_TYPE,
-CDROMFILE_TYPE,
+VDISK_TYPE,
+VCDROM_TYPE,
 DISKPERF_TYPE,
 MODISK_TYPE,
 MODISKPERF_TYPE,
index c348095..99794b1 100644 (file)
@@ -1,51 +1,60 @@
 # Automatically generated by scst.
 
-[HANDLER disk_fileio]
-DEVICE GW15K000,/dev/evms/GW15K000,512
-DEVICE GW15K001,/dev/evms/GW15K001,512
-DEVICE MP15K004,/dev/evms/MP15K004,512
-DEVICE MP15K005,/dev/evms/MP15K005,512
-DEVICE MP15K006,/dev/evms/MP15K006,512
-DEVICE MP15K007,/dev/evms/MP15K007,512
-DEVICE MP15K008,/dev/evms/MP15K008,512
-DEVICE MP15K009,/dev/evms/MP15K009,512
-DEVICE MP15K00a,/dev/evms/MP15K00a,512
-DEVICE MP15K00b,/dev/evms/MP15K00b,512
-DEVICE MP15K00c,/dev/evms/MP15K00c,512
-DEVICE MP15K00d,/dev/evms/MP15K00d,512
-DEVICE MP15K00e,/dev/evms/MP15K00e,512
-DEVICE MS10K006,/dev/evms/MS10K002,512
-DEVICE MS15K000,/dev/evms/MS15K000,512
-DEVICE MS15K001,/dev/evms/MS15K001,512
-DEVICE MS15K002,/dev/evms/MS15K002,512
-DEVICE MS15K005,/dev/evms/MS15K003,512
-DEVICE RG10K000,/dev/evms/RG10K000,512
-DEVICE RG72K001,/dev/evms/RG72K001,512
-
-[HANDLER cdrom_fileio]
+[HANDLER vdisk]
+#DEVICE <vdisk name>,<device path>,<options>,<block size>
+DEVICE GW15K000,/dev/evms/GW15K000,,512
+DEVICE GW15K001,/dev/evms/GW15K001,,512
+DEVICE MP15K004,/dev/evms/MP15K004,,512
+DEVICE MP15K005,/dev/evms/MP15K005,,512
+DEVICE MP15K006,/dev/evms/MP15K006,,512
+DEVICE MP15K007,/dev/evms/MP15K007,,512
+DEVICE MP15K008,/dev/evms/MP15K008,,512
+DEVICE MP15K009,/dev/evms/MP15K009,,512
+DEVICE MP15K00a,/dev/evms/MP15K00a,,512
+DEVICE MP15K00b,/dev/evms/MP15K00b,,512
+DEVICE MP15K00c,/dev/evms/MP15K00c,,512
+DEVICE MP15K00d,/dev/evms/MP15K00d,,512
+DEVICE MP15K00e,/dev/evms/MP15K00e,,512
+DEVICE MS10K006,/dev/evms/MS10K002,,512
+DEVICE MS15K000,/dev/evms/MS15K000,,512
+DEVICE MS15K001,/dev/evms/MS15K001,,512
+DEVICE MS15K002,/dev/evms/MS15K002,,512
+DEVICE MS15K005,/dev/evms/MS15K003,,512
+DEVICE RG10K000,/dev/evms/RG10K000,,512
+DEVICE RG72K001,/dev/evms/RG72K001,,512
+
+[HANDLER vcdrom]
 
 [GROUP CORBIN2_a]
+#USER <user wwn>
 USER 21:00:00:e0:8b:11:8d:8a
 
 [GROUP CORBIN3_a]
+#USER <user wwn>
 USER 21:00:00:e0:8b:03:9e:1a
 
 [GROUP MENTASM_a]
+#USER <user wwn>
 USER 21:00:00:e0:8b:11:06:8a
 
 [GROUP PC1_a]
+#USER <user wwn>
 USER 21:00:00:e0:8b:11:3f:8d
 
 [GROUP PC2_a]
+#USER <user wwn>
 USER 21:00:00:e0:8b:03:d8:4a
 
 [GROUP PC3_a]
+#USER <user wwn>
 USER 21:00:00:e0:8b:13:ba:01
 
 [GROUP PC4_a]
+#USER <user wwn>
 USER 21:00:00:e0:8b:11:a6:8b
 
 [GROUP RAISTLIN_a]
+#USER <user wwn>
 USER 21:00:00:e0:8b:11:75:8b
 
 [ASSIGNMENT CORBIN2_a]
@@ -55,35 +64,44 @@ DEVICE RG10K000,2
 DEVICE RG72K001,3
 
 [ASSIGNMENT CORBIN3_a]
+#ASSIGNMENT <device name>,<lun>
 DEVICE MP15K00d,0
 
 [ASSIGNMENT Default]
+#ASSIGNMENT <device name>,<lun>
 DEVICE GW15K000,0
 DEVICE GW15K001,1
 
 [ASSIGNMENT MENTASM_a]
+#ASSIGNMENT <device name>,<lun>
 DEVICE MP15K006,0
 DEVICE MP15K008,1
 DEVICE MP15K00e,2
 
 [ASSIGNMENT PC1_a]
+#ASSIGNMENT <device name>,<lun>
 DEVICE MS15K000,0
 
 [ASSIGNMENT PC2_a]
+#ASSIGNMENT <device name>,<lun>
 DEVICE MS15K005,0
 
 [ASSIGNMENT PC3_a]
+#ASSIGNMENT <device name>,<lun>
 DEVICE MP15K00c,0
 
 [ASSIGNMENT PC4_a]
+#ASSIGNMENT <device name>,<lun>
 DEVICE MP15K005,0
 DEVICE MP15K007,1
 
 [ASSIGNMENT RAISTLIN_a]
+#ASSIGNMENT <device name>,<lun>
 DEVICE MP15K00a,0
 DEVICE MP15K00b,1
 
 [TARGETS enable]
+#HOST <wwn identifier>
 HOST 0x50060b0000397178
 HOST 0x50060b000039717a
 
index b397328..926e9b6 100644 (file)
@@ -148,7 +148,7 @@ CREATE TABLE `scst_handlers` (
 
 LOCK TABLES `scst_handlers` WRITE;
 /*!40000 ALTER TABLE `scst_handlers` DISABLE KEYS */;
-INSERT INTO `scst_handlers` VALUES (1,'disk','N'),(2,'disk_fileio','Y'),(3,'cdrom','N'),(4,'changer','N'),(5,'disk_perf','N'),(6,'modisk','N'),(7,'modisk_perf','N'),(8,'tape','N'),(9,'tape_perf','N');
+INSERT INTO `scst_handlers` VALUES (1,'disk','N'),(2,'vdisk','Y'),(3,'cdrom','N'),(4,'changer','N'),(5,'disk_perf','N'),(6,'modisk','N'),(7,'modisk_perf','N'),(8,'tape','N'),(9,'tape_perf','N');
 /*!40000 ALTER TABLE `scst_handlers` ENABLE KEYS */;
 UNLOCK TABLES;
 
index 6b3c6f9..7f50a3d 100755 (executable)
@@ -1,5 +1,5 @@
 #!/usr/bin/perl
-$Version  = 'SCST DB Configurator v0.51';
+$Version  = 'SCST DB Configurator v0.51.1';
 
 # Configures SCST
 #
@@ -61,8 +61,8 @@ my %MD_DEVICES;
 my %_HANDLER_MAP_ = ('cdrom' => $SCST::SCST::CDROM_TYPE,
                     'changer' => $SCST::SCST::CHANGER_TYPE,
                     'disk' => $SCST::SCST::DISK_TYPE,
-                    'disk_fileio' => $SCST::SCST::DISKFILE_TYPE,
-                    'cdrom_fileio' => $SCST::SCST::CDROMFILE_TYPE,
+                    'vdisk' => $SCST::SCST::VDISK_TYPE,
+                    'vcdrom' => $SCST::SCST::VCDROM_TYPE,
                     'disk_perf' => $SCST::SCST::DISKPERF_TYPE,
                     'modisk' => $SCST::SCST::MODISK_TYPE,
                     'modisk_perf' => $SCST::SCST::MODISKPERF_TYPE,
@@ -72,8 +72,8 @@ my %_HANDLER_MAP_ = ('cdrom' => $SCST::SCST::CDROM_TYPE,
 my %_REVERSE_MAP_ = ($SCST::SCST::CDROM_TYPE => 'cdrom',
                     $SCST::SCST::CHANGER_TYPE => 'changer',
                     $SCST::SCST::DISK_TYPE => 'disk',
-                    $SCST::SCST::DISKFILE_TYPE => 'disk_fileio',
-                    $SCST::SCST::CDROMFILE_TYPE => 'cdrom_fileio',
+                    $SCST::SCST::VDISK_TYPE => 'vdisk',
+                    $SCST::SCST::VCDROM_TYPE => 'vcdrom',
                     $SCST::SCST::DISKPERF_TYPE => 'disk_perf',
                     $SCST::SCST::MODISK_TYPE => 'modisk',
                     $SCST::SCST::MODISKPERF_TYPE => 'modisk_perf',
index d125b33..0420a4f 100755 (executable)
@@ -1,5 +1,5 @@
 #!/usr/bin/perl
-$Version  = 'SCST Configurator v0.6';
+$Version  = 'SCST Configurator v0.6.1';
 
 # Configures SCST
 #
@@ -59,7 +59,7 @@ Debugging (limited support)
      -debug               : Debug mode - don\'t do anything destructive.
 
 Available Handlers:
-      disk, disk_fileio, disk_perf, cdrom, changer, modisk, modisk_perf, tape, tape_perf
+      disk, vdisk, disk_perf, cdrom, vcdrom, changer, modisk, modisk_perf, tape, tape_perf
 
 Available Options for create and open:
       WRITE_THROUGH, READ_ONLY, O_DIRECT, NULLIO, NV_CACHE
@@ -75,7 +75,7 @@ Examples:
        scstadmin -addgroup HOST01
        
      Create a device given an already existing disk file:
-       scstadmin -adddev DISK01 -handler disk_fileio -path /vdisks/disk01.dsk -options READ_ONLY,WRITE_THROUGH
+       scstadmin -adddev DISK01 -handler vdisk -path /vdisks/disk01.dsk -options READ_ONLY,WRITE_THROUGH
        
      Assign a device to a security group:
        scstadmin -assigndev DISK01 -group HOST01 -lun 1
@@ -113,8 +113,8 @@ my $_DEBUG_;
 my %_HANDLER_MAP_ = ('cdrom' => $SCST::SCST::CDROM_TYPE,
                     'changer' => $SCST::SCST::CHANGER_TYPE,
                     'disk' => $SCST::SCST::DISK_TYPE,
-                    'disk_fileio' => $SCST::SCST::DISKFILE_TYPE,
-                    'cdrom_fileio' => $SCST::SCST::CDROMFILE_TYPE,
+                    'vdisk' => $SCST::SCST::VDISK_TYPE,
+                    'vcdrom' => $SCST::SCST::VCDROM_TYPE,
                     'disk_perf' => $SCST::SCST::DISKPERF_TYPE,
                     'modisk' => $SCST::SCST::MODISK_TYPE,
                     'modisk_perf' => $SCST::SCST::MODISKPERF_TYPE,
@@ -124,8 +124,8 @@ my %_HANDLER_MAP_ = ('cdrom' => $SCST::SCST::CDROM_TYPE,
 my %_REVERSE_MAP_ = ($SCST::SCST::CDROM_TYPE => 'cdrom',
                     $SCST::SCST::CHANGER_TYPE => 'changer',
                     $SCST::SCST::DISK_TYPE => 'disk',
-                    $SCST::SCST::DISKFILE_TYPE => 'disk_fileio',
-                    $SCST::SCST::CDROMFILE_TYPE => 'cdrom_fileio',
+                    $SCST::SCST::VDISK_TYPE => 'vdisk',
+                    $SCST::SCST::VCDROM_TYPE => 'vcdrom',
                     $SCST::SCST::DISKPERF_TYPE => 'disk_perf',
                     $SCST::SCST::MODISK_TYPE => 'modisk',
                     $SCST::SCST::MODISKPERF_TYPE => 'modisk_perf',
@@ -134,6 +134,8 @@ my %_REVERSE_MAP_ = ($SCST::SCST::CDROM_TYPE => 'cdrom',
 
 $SIG{INT} = \&commitSuicide;
 
+use vars qw($Version);
+
 POSIX::setsid();
 
 &main();
@@ -268,6 +270,8 @@ sub getArgs {
                usage();
        }
 
+       $_DEBUG_ = $TRUE if (defined($_DEBUG_));
+
        $forceConfig = $TRUE if (defined($forceConfig));
        $showSessions = $TRUE if (defined($showSessions));
 
@@ -403,6 +407,8 @@ sub readCurrentConfig {
 
        my $eHandlers = $SCST->handlers();
 
+       immediateExit($SCST->errorString());
+
        foreach my $handler (@{$eHandlers}) {
                $HANDLERS{$handler}++; # For quick lookups
        }
@@ -410,7 +416,10 @@ sub readCurrentConfig {
        $TARGETS = targets();
 
        $DEVICES = $SCST->devices();
+       immediateExit($SCST->errorString());
+
        my $_eGroups = $SCST->groups();
+       immediateExit($SCST->errorString());
 
        foreach my $group (@{$_eGroups}) {
                $GROUPS{$group}++; # For quick lookups
@@ -445,14 +454,17 @@ sub writeConfiguration {
 
        print "Writing current configuration to file '$file'.. ";
 
-       print $io "# Automatically generated by scst.\n\n";
+       print $io "# Automatically generated by $Version.\n\n";
 
        # Device information
        foreach my $handler (sort keys %HANDLERS) {
                print $io "[HANDLER ".$_REVERSE_MAP_{$handler}."]\n";
+               print $io "#DEVICE <vdisk name>,<device path>,<options>,<block size>\n";
 
                my $devices = $SCST->handlerDevices($handler);
 
+               immediateExit($SCST->errorString());
+
                foreach my $device (sort keys %{$devices}) {
                        my $options = $$devices{$device}->{'OPTIONS'};
                        $options =~ s/\,/\|/;
@@ -469,6 +481,7 @@ sub writeConfiguration {
        # User configuration
        foreach my $group (sort keys %USERS) {
                print $io "[GROUP $group]\n";
+               print $io "#USER <user wwn>\n";
 
                foreach my $user (keys %{$USERS{$group}}) {
                        print $io "USER $user\n";
@@ -480,6 +493,7 @@ sub writeConfiguration {
        # Assignments configuration
        foreach my $group (sort keys %ASSIGNMENTS) {
                print $io "[ASSIGNMENT $group]\n";
+               print $io "#DEVICE <device name>,<lun>\n";
 
                my $pointer = $ASSIGNMENTS{$group};
                foreach my $device (sort keys %{$pointer}) {
@@ -492,6 +506,7 @@ sub writeConfiguration {
        # Targets configuration
        foreach my $type ('enable', 'disable') {
                print $io "[TARGETS $type]\n";
+               print $io "#HOST <wwn identifier>\n";
 
                foreach my $target (sort keys %{$TARGETS}) {
                        if ((($type eq 'enable') && $$TARGETS{$target}->{'enabled'}) ||
@@ -827,6 +842,7 @@ sub clearConfiguration {
 
 sub showSessions {
        my $sessions = $SCST->sessions();
+       immediateExit($SCST->errorString());
 
        print "\n\tTarget Name\tInitiator Name\t\t\tGroup Name\t\tCommand Count\n";
 
@@ -864,7 +880,8 @@ sub addDevice {
        print "\t-> Opening virtual device '$device' at path '$path' using handler '$handler'..\n";
 
        if ($SCST->openDevice($_handler, $device, $path, $options, $blocksize)) {
-               print "WARNING: Failed to open virtual device '$device' at path '$path'.\n";
+               print "WARNING: Failed to open virtual device '$device' at path '$path': ".
+                 $SCST->errorString()."\n";
                return $TRUE;
        }
 
@@ -887,7 +904,8 @@ sub removeDevice {
        print "\t-> Closing virtual device '$device'..\n";
 
        if ($SCST->closeDevice($_handler, $device)) {
-               print "WARNING: Failed to close virtual device '$device'.\n";
+               print "WARNING: Failed to close virtual device '$device': ".
+                 $SCST->errorString();
                return $TRUE;
        }
 
@@ -907,7 +925,8 @@ sub addGroup {
        print "\t-> Creating security group '$group'..\n";
 
        if ($SCST->addGroup($group)) {
-               print "WARNING: Failed to create security group '$group'.\n";
+               print "WARNING: Failed to create security group '$group': ".
+                 $SCST->errorString()."\n";
                return $TRUE;
        }
 
@@ -927,7 +946,8 @@ sub removeGroup {
        print "\t-> Removing security group '$group'..\n";
 
        if ($SCST->removeGroup($group)) {
-               print "WARNING: Failed to remove security group '$group'.\n";
+               print "WARNING: Failed to remove security group '$group': ".
+                 $SCST->errorString()."\n";
                return $TRUE;
        }
 
@@ -953,7 +973,8 @@ sub addUser {
        print "\t-> Adding user '$user' to security group '$group'..\n";
 
        if ($SCST->addUser($user, $group)) {
-               print "WARNING: Failed to add user '$user' to security group '$group'.\n";
+               print "WARNING: Failed to add user '$user' to security group '$group': ".
+                 $SCST->errorString()."\n";
                return $TRUE;
        }
 
@@ -979,7 +1000,8 @@ sub removeUser {
        print "\t-> Removing user '$user' from security group '$group'..\n";
 
        if ($SCST->removeUser($user, $group)) {
-               print "WARNING: Failed to add user '$user' to security group '$group'.\n";
+               print "WARNING: Failed to add user '$user' to security group '$group': ".
+                 $SCST->errorString()."\n";
                return $TRUE;
        }
 
@@ -999,7 +1021,8 @@ sub clearUsers {
        print "\t-> Clearing users from security group '$group'..\n";
 
        if ($SCST->clearUsers($group)) {
-               print "WARNING: Failed to clear users from security group '$group'.\n";
+               print "WARNING: Failed to clear users from security group '$group': ".
+                 $SCST->errorString()."\n";
                return $TRUE;
        }
 
@@ -1052,7 +1075,8 @@ sub assignDevice {
        print "\t-> Assign virtual device '$device' to group '$group' at LUN '$lun'..\n";
 
        if ($SCST->assignDeviceToGroup($device, $group, $lun)) {
-               print "WARNING: Failed to assign device '$device' to group '$group'.\n";
+               print "WARNING: Failed to assign device '$device' to group '$group': ".
+                 $SCST->errorString()."\n";
                return $TRUE;
        }
 
@@ -1085,7 +1109,8 @@ sub releaseDevice {
        print "\t-> Release virtual device '$device' from group '$group'..\n";
 
        if ($SCST->removeDeviceFromGroup($device, $group)) {
-               print "WARNING: Failed to release device '$device' from group '$group'.\n";
+               print "WARNING: Failed to release device '$device' from group '$group': ".
+                 $SCST->errorString()."\n";
                return $TRUE;
        }
 
@@ -1107,7 +1132,8 @@ sub clearDevices {
        print "\t-> Clear virtual devices from group '$group'..\n";
 
        if ($SCST->clearGroupDevices($group)) {
-               print "WARNING: Failed to clear devices from group '$group'.\n";
+               print "WARNING: Failed to clear devices from group '$group': ".
+                 $SCST->errorString()."\n";
                return $TRUE;
        }
 
@@ -1263,6 +1289,18 @@ sub unformatTarget {
        return $target;
 }
 
+# If we have an unread error from SCST, exit immediately
+sub immediateExit {
+       my $error = shift;
+
+       return if (!$error);
+
+       print "\n\nFATAL: Received the following error:\n\n\t";
+       print "$error\n\n";
+
+       exit 1;
+}
+
 # Hey! Stop that!
 sub commitSuicide {
        print "\n\nAborting immediately.\n";