diff --git a/scstadmin/Changes b/scstadmin/Changes index 6bf7ba006..3f50be1f9 100644 --- a/scstadmin/Changes +++ b/scstadmin/Changes @@ -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 diff --git a/scstadmin/SCST/SCST.pm b/scstadmin/SCST/SCST.pm index b64837d9c..c04788ffa 100644 --- a/scstadmin/SCST/SCST.pm +++ b/scstadmin/SCST/SCST.pm @@ -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, diff --git a/scstadmin/examples/scst.conf b/scstadmin/examples/scst.conf index c348095b2..99794b16c 100644 --- a/scstadmin/examples/scst.conf +++ b/scstadmin/examples/scst.conf @@ -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 vdisk] +#DEVICE ,,, +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 vcdrom] [GROUP CORBIN2_a] +#USER USER 21:00:00:e0:8b:11:8d:8a [GROUP CORBIN3_a] +#USER USER 21:00:00:e0:8b:03:9e:1a [GROUP MENTASM_a] +#USER USER 21:00:00:e0:8b:11:06:8a [GROUP PC1_a] +#USER USER 21:00:00:e0:8b:11:3f:8d [GROUP PC2_a] +#USER USER 21:00:00:e0:8b:03:d8:4a [GROUP PC3_a] +#USER USER 21:00:00:e0:8b:13:ba:01 [GROUP PC4_a] +#USER USER 21:00:00:e0:8b:11:a6:8b [GROUP RAISTLIN_a] +#USER 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 MP15K00d,0 [ASSIGNMENT Default] +#ASSIGNMENT , DEVICE GW15K000,0 DEVICE GW15K001,1 [ASSIGNMENT MENTASM_a] +#ASSIGNMENT , DEVICE MP15K006,0 DEVICE MP15K008,1 DEVICE MP15K00e,2 [ASSIGNMENT PC1_a] +#ASSIGNMENT , DEVICE MS15K000,0 [ASSIGNMENT PC2_a] +#ASSIGNMENT , DEVICE MS15K005,0 [ASSIGNMENT PC3_a] +#ASSIGNMENT , DEVICE MP15K00c,0 [ASSIGNMENT PC4_a] +#ASSIGNMENT , DEVICE MP15K005,0 DEVICE MP15K007,1 [ASSIGNMENT RAISTLIN_a] +#ASSIGNMENT , DEVICE MP15K00a,0 DEVICE MP15K00b,1 [TARGETS enable] +#HOST HOST 0x50060b0000397178 HOST 0x50060b000039717a diff --git a/scstadmin/examples/scst_example.sql b/scstadmin/examples/scst_example.sql index b39732815..926e9b69f 100644 --- a/scstadmin/examples/scst_example.sql +++ b/scstadmin/examples/scst_example.sql @@ -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; diff --git a/scstadmin/scst_db/scst_db b/scstadmin/scst_db/scst_db index 6b3c6f9d5..7f50a3d75 100755 --- a/scstadmin/scst_db/scst_db +++ b/scstadmin/scst_db/scst_db @@ -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', diff --git a/scstadmin/scstadmin b/scstadmin/scstadmin index d125b3362..0420a4fe0 100755 --- a/scstadmin/scstadmin +++ b/scstadmin/scstadmin @@ -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 ,,,\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 \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 ,\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 \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";