- 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
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';
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_,
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,
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_)) ||
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";
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";
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;
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;
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;
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;
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);
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 {
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";
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 {
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;
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";
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 {
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";
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);
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});
}
}
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;
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";
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 {
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";
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 {
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";
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 {
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);
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";
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";
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";
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;
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;
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
CDROM_TYPE,
CHANGER_TYPE,
DISK_TYPE,
-DISKFILE_TYPE,
-CDROMFILE_TYPE,
+VDISK_TYPE,
+VCDROM_TYPE,
DISKPERF_TYPE,
MODISK_TYPE,
MODISKPERF_TYPE,
# 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]
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
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;
#!/usr/bin/perl
-$Version = 'SCST DB Configurator v0.51';
+$Version = 'SCST DB Configurator v0.51.1';
# Configures SCST
#
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,
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',
#!/usr/bin/perl
-$Version = 'SCST Configurator v0.6';
+$Version = 'SCST Configurator v0.6.1';
# Configures SCST
#
-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
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
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,
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',
$SIG{INT} = \&commitSuicide;
+use vars qw($Version);
+
POSIX::setsid();
&main();
usage();
}
+ $_DEBUG_ = $TRUE if (defined($_DEBUG_));
+
$forceConfig = $TRUE if (defined($forceConfig));
$showSessions = $TRUE if (defined($showSessions));
my $eHandlers = $SCST->handlers();
+ immediateExit($SCST->errorString());
+
foreach my $handler (@{$eHandlers}) {
$HANDLERS{$handler}++; # For quick lookups
}
$TARGETS = targets();
$DEVICES = $SCST->devices();
+ immediateExit($SCST->errorString());
+
my $_eGroups = $SCST->groups();
+ immediateExit($SCST->errorString());
foreach my $group (@{$_eGroups}) {
$GROUPS{$group}++; # For quick lookups
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/\,/\|/;
# 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";
# 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}) {
# 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'}) ||
sub showSessions {
my $sessions = $SCST->sessions();
+ immediateExit($SCST->errorString());
print "\n\tTarget Name\tInitiator Name\t\t\tGroup Name\t\tCommand Count\n";
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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";