Make recent changes available to 1.0.1.x branch.

git-svn-id: http://svn.code.sf.net/p/scst/svn/branches/1.0.1.x@787 d57e44dd-8a1f-0410-8b47-8ef2f437770f
This commit is contained in:
Mark Buechler
2009-04-17 18:33:09 +00:00
parent a61ac60fb9
commit d5f266c172
3 changed files with 151 additions and 79 deletions
+6
View File
@@ -1,3 +1,9 @@
Changes since 1.0.6
- Added -resyncdev option to work with the new SCST resync_size option.
- SCST.pm: Added resyncDevice()
- SCST.pm: General cleanup.
Changes since 1.0.5
- Fixed a removeDevice() case when using -ForceConfig.
+94 -64
View File
@@ -2,7 +2,7 @@ package SCST::SCST;
# Author: Mark R. Buechler
# License: GPLv2
# Copyright (c) 2005-2008 Mark R. Buechler
# Copyright (c) 2005-2009 Mark R. Buechler
use 5.005;
use IO::Handle;
@@ -10,9 +10,6 @@ use IO::File;
use strict;
use Carp qw(cluck);
my $TRUE = 1;
my $FALSE = 0;
my $_SCST_DIR_ = '/proc/scsi_tgt';
my $_SCST_IO_ = $_SCST_DIR_.'/scsi_tgt';
my $_SCST_CDROM_IO_ = $_SCST_DIR_.'/dev_cdrom/dev_cdrom';
@@ -55,7 +52,7 @@ $IOTYPE_PHYSICAL = 100;
$IOTYPE_VIRTUAL = 101;
$IOTYPE_PERFORMANCE = 102;
$VERSION = 0.7.7;
$VERSION = 0.7.9;
my $_SCST_MIN_MAJOR_ = 0;
my $_SCST_MIN_MINOR_ = 9;
@@ -129,7 +126,7 @@ my %_AVAILABLE_OPTIONS_ = ('WRITE_THROUGH' => 'WRITE_THROUGH',
sub new {
my $this = shift;
my $debug = shift;
my $badVersion = $TRUE;
my $badVersion = 1;
my $class = ref($this) || $this;
my $self = {};
@@ -143,9 +140,10 @@ sub new {
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_)) ||
(($major == $_SCST_MIN_MAJOR_) && ($minor == $_SCST_MIN_MINOR_) && ($release >= $_SCST_MIN_RELEASE_)));
$badVersion = 0 if (($major > $_SCST_MIN_MAJOR_) ||
(($major == $_SCST_MIN_MAJOR_) && ($minor > $_SCST_MIN_MINOR_)) ||
(($major == $_SCST_MIN_MAJOR_) && ($minor == $_SCST_MIN_MINOR_) &&
($release >= $_SCST_MIN_RELEASE_)));
croak("This module requires at least SCST version $_SCST_MIN_MAJOR_\.$_SCST_MIN_MINOR_\.".
"$_SCST_MIN_RELEASE_ and version $scstVersion was found") if ($badVersion);
@@ -157,7 +155,7 @@ sub scstVersion {
my $self = shift;
my $io = new IO::File $_SCST_VERSION_IO_, O_RDONLY;
return $TRUE if (!$io);
return 1 if (!$io);
my $version = <$io>;
chomp $version;
@@ -189,10 +187,10 @@ sub groupExists {
my $groups = $self->groups();
foreach my $_group (@{$groups}) {
return $TRUE if ($group eq $_group);
return 1 if ($group eq $_group);
}
return $FALSE;
return 0;
}
sub addGroup {
@@ -205,7 +203,7 @@ sub addGroup {
if (!$io) {
$self->{'error'} = "addGroup(): Failed to open handler IO '$_SCST_IO_'";
return $TRUE;
return 1;
}
my $cmd = "add_group $group\n";
@@ -218,7 +216,7 @@ sub addGroup {
close $io;
return $FALSE if ($self->{'debug'});
return 0 if ($self->{'debug'});
return !$self->groupExists($group);
}
@@ -232,7 +230,7 @@ sub removeGroup {
if (!$io) {
$self->{'error'} = "removeGroup(): Failed to open handler IO '$_SCST_IO_'";
return $TRUE;
return 1;
}
my $cmd = "del_group $group\n";
@@ -245,7 +243,7 @@ sub removeGroup {
close $io;
return $FALSE if ($self->{'debug'});
return 0 if ($self->{'debug'});
return $self->groupExists($group);
}
@@ -253,7 +251,7 @@ sub sgvStats {
my $self = shift;
my $io = new IO::File $_SCST_SGV_STATS_, O_RDONLY;
my %stats;
my $first = $TRUE;
my $first = 1;
if (!$io) {
$self->{'error'} = "sgvStats(): Failed to open handler IO '$_SCST_IO_'";
@@ -264,7 +262,7 @@ sub sgvStats {
chomp $line;
if ($first || !$line) {
$first = $FALSE;
$first = 0;
next;
}
@@ -303,7 +301,7 @@ sub sessions {
my $self = shift;
my $io = new IO::File $_SCST_SESSIONS_, O_RDONLY;
my %sessions;
my $first = $TRUE;
my $first = 1;
if (!$io) {
$self->{'error'} = "sessions(): Failed to open handler IO '$_SCST_IO_'";
@@ -314,7 +312,7 @@ sub sessions {
chomp $line;
if ($first) {
$first = $FALSE;
$first = 0;
next;
}
@@ -332,7 +330,7 @@ sub devices {
my $self = shift;
my $io = new IO::File $_SCST_IO_, O_RDONLY;
my %devices;
my $first = $TRUE;
my $first = 1;
if (!$io) {
$self->{'error'} = "devices(): Failed to open handler IO '$_SCST_IO_'";
@@ -343,7 +341,7 @@ sub devices {
chomp $line;
if ($first) {
$first = $FALSE;
$first = 0;
next;
}
@@ -362,7 +360,7 @@ sub handlerDevices {
my $self = shift;
my $handler = shift;
my $handler_io = $_IO_MAP_{$handler};
my $first = $TRUE;
my $first = 1;
my $handler_name = $_REVERSE_MAP_{$handler};
my %devices;
@@ -388,7 +386,7 @@ sub handlerDevices {
chomp $line;
if ($first) {
$first = $FALSE;
$first = 0;
next;
}
@@ -425,9 +423,9 @@ sub handlerDeviceExists {
my $devices = $self->handlerDevices($handler);
return -1 if (!defined($devices));
return $TRUE if (defined($$devices{$device}));
return 1 if (defined($$devices{$device}));
return $FALSE;
return 0;
}
sub handlerType {
@@ -458,7 +456,6 @@ sub openDevice {
($options, $valid_opts) = $self->checkOptions($options);
if (!$valid_opts) {
$self->{'error'} = "openDevice(): Invalid option(s) '$options' given for device '$device'";
return 1;
@@ -489,7 +486,7 @@ sub openDevice {
my $rc = $self->handler_private($handler_io, $cmd);
return $FALSE if ($self->{'debug'});
return 0 if ($self->{'debug'});
return $rc if ($rc);
$rc = !$self->handlerDeviceExists($handler, $device);
@@ -513,12 +510,12 @@ sub closeDevice {
if (!$handler_io) {
$self->{'error'} = "closeDevice(): Failed to open handler IO '$handler_io'".
" or handler '$handler_name' ($handler) invalid";
return $TRUE;
return 1;
}
if (!$self->handlerExists($handler)) {
$self->{'error'} = "closeDevice(): Handler '$handler_name' ($handler) does not exist";
return $TRUE;
return 1;
}
if (!$self->handlerDeviceExists($handler, $device)) {
@@ -530,7 +527,7 @@ sub closeDevice {
my $rc = $self->handler_private($handler_io, $cmd);
return $FALSE if ($self->{'debug'});
return 0 if ($self->{'debug'});
return $rc if ($rc);
$rc = $self->handlerDeviceExists($handler, $device);
@@ -543,6 +540,39 @@ sub closeDevice {
return $rc;
}
sub resyncDevice {
my $self = shift;
my $handler = shift;
my $device = shift;
my $handler_io = $_IO_MAP_{$handler};
my $handler_name = $_REVERSE_MAP_{$handler};
if (!$handler_io) {
$self->{'error'} = "resyncDevice(): Failed to open handler IO '$handler_io'".
" or handler '$handler_name' ($handler) invalid";
return 1;
}
if (!$self->handlerExists($handler)) {
$self->{'error'} = "resyncDevice(): Handler '$handler_name' ($handler) does not exist";
return 1;
}
if (!$self->handlerDeviceExists($handler, $device)) {
$self->{'error'} = "resyncDevice(): Device '$device' does not exist";
return 2;
}
my $cmd = "resync_size $device\n";
my $rc = $self->handler_private($handler_io, $cmd);
return 0 if ($self->{'debug'});
return $rc if ($rc);
return $rc;
}
sub userExists {
my $self = shift;
my $user = shift;
@@ -553,10 +583,10 @@ sub userExists {
return -1 if (!defined($users));
foreach my $_user (@{$users}) {
return $TRUE if ($user eq $_user);
return 1 if ($user eq $_user);
}
return $FALSE;
return 0;
}
sub users {
@@ -604,7 +634,7 @@ sub addUser {
my $rc = $self->group_private($group, $_SCST_USERS_IO_, $cmd);
return $FALSE if ($self->{'debug'});
return 0 if ($self->{'debug'});
return $rc if ($rc);
$rc = !$self->userExists($user, $group);
@@ -636,7 +666,7 @@ sub removeUser {
my $rc = $self->group_private($group, $_SCST_USERS_IO_, $cmd);
return $FALSE if ($self->{'debug'});
return 0 if ($self->{'debug'});
return $rc if ($rc);
$rc = $self->userExists($user, $group);
@@ -655,14 +685,14 @@ sub clearUsers {
if (!$self->groupExists($group)) {
$self->{'error'} = "clearUsers(): Group '$group' does not exist";
return $TRUE;
return 1;
}
my $cmd = "clear\n";
my $rc = $self->group_private($group, $_SCST_USERS_IO_, $cmd);
return $FALSE if ($self->{'debug'});
return 0 if ($self->{'debug'});
if ($rc) {
$self->{'error'} = "clearUsers(): An error occured while clearing users from ".
@@ -682,10 +712,10 @@ sub handlerExists {
my $handlers = $self->handlers();
foreach my $_handler (@{$handlers}) {
return $TRUE if ($handler eq $_handler);
return 1 if ($handler eq $_handler);
}
return $FALSE;
return 0;
}
sub handlers {
@@ -718,19 +748,19 @@ sub groupDeviceExists {
return -1 if (!defined($devices));
if (defined($lun)) {
return $TRUE if ($$devices{$device} eq $lun);
return 1 if ($$devices{$device} eq $lun);
} else {
return $TRUE if (defined($$devices{$device}));
return 1 if (defined($$devices{$device}));
}
return $FALSE;
return 0;
}
sub groupDevices {
my $self = shift;
my $group = shift;
my %devices;
my $first = $TRUE;
my $first = 1;
if (!$self->groupExists($group)) {
$self->{'error'} = "groupDevices(): Group '$group' does not exist";
@@ -749,7 +779,7 @@ sub groupDevices {
chomp $line;
if ($first) {
$first = $FALSE;
$first = 0;
next;
}
@@ -771,7 +801,7 @@ sub assignDeviceToGroup {
if (!$self->groupExists($group)) {
$self->{'error'} = "assignDeviceToGroup(): Group '$group' does not exist";
return $TRUE;
return 1;
}
if ($self->groupDeviceExists($device, $group, $lun)) {
@@ -784,7 +814,7 @@ sub assignDeviceToGroup {
my $rc = $self->group_private($group, $_SCST_DEVICES_IO_, $cmd);
return $FALSE if ($self->{'debug'});
return 0 if ($self->{'debug'});
return $rc if ($rc);
$rc = !$self->groupDeviceExists($device, $group, $lun);
@@ -807,12 +837,12 @@ sub assignDeviceToHandler {
if (!$handler_io) {
$self->{'error'} = "assignDeviceToHandler(): Failed to open handler IO '$handler_io' or ".
"handler '$handler_name' ($handler) invalid";
return $TRUE;
return 1;
}
if (!$self->handlerExists($handler)) {
$self->{'error'} = "assignDeviceToHandler(): Handler '$handler_name' ($handler) does not exist";
return $TRUE;
return 1;
}
if ($self->handlerDeviceExists($handler, $device)) {
@@ -825,7 +855,7 @@ sub assignDeviceToHandler {
my $rc = $self->scst_private($cmd);
return $FALSE if ($self->{'debug'});
return 0 if ($self->{'debug'});
return $rc if($rc);
$rc = !$self->handlerDeviceExists($handler, $device);
@@ -845,7 +875,7 @@ sub removeDeviceFromGroup {
if (!$self->groupExists($group)) {
$self->{'error'} = "removeDeviceFromGroup(): Group '$group' does not exist";
return $TRUE;
return 1;
}
if (!$self->groupDeviceExists($device, $group)) {
@@ -857,7 +887,7 @@ sub removeDeviceFromGroup {
my $rc = $self->group_private($group, $_SCST_DEVICES_IO_, $cmd);
return $FALSE if ($self->{'debug'});
return 0 if ($self->{'debug'});
return $rc if ($rc);
$rc = $self->groupDeviceExists($device, $group);
@@ -874,13 +904,13 @@ sub clearGroupDevices {
my $self = shift;
my $group = shift;
return $TRUE if (!$self->groupExists($group));
return 1 if (!$self->groupExists($group));
my $cmd = "clear\n";
my $rc = $self->group_private($group, $_SCST_DEVICES_IO_, $cmd);
return $FALSE if ($self->{'debug'});
return 0 if ($self->{'debug'});
if ($rc) {
$self->{'error'} = "clearGroupDevices(): An error occured while clearing devices from ".
@@ -902,7 +932,7 @@ sub handler_private {
if (!$io) {
cluck("WARNING: SCST/SCST.pm: Failed to open handler IO $handler_io, assuming disabled");
return $FALSE;
return 0;
}
if ($self->{'debug'}) {
@@ -913,7 +943,7 @@ sub handler_private {
close $io;
return $FALSE;
return 0;
}
sub scst_private {
@@ -924,7 +954,7 @@ sub scst_private {
if (!$io) {
$self->{'error'} = "SCST/SCST.pm: Failed to open handler IO '$_SCST_IO_'";
return $TRUE;
return 1;
}
if ($self->{'debug'}) {
@@ -935,7 +965,7 @@ sub scst_private {
close $io;
return $FALSE;
return 0;
}
sub group_private {
@@ -948,7 +978,7 @@ sub group_private {
if (!$io) {
$self->{'error'} = "SCST/SCST.pm: Failed to open handler IO '".$_SCST_GROUPS_DIR_."/$group/".$file."'";
return $TRUE;
return 1;
}
if ($self->{'debug'}) {
@@ -959,7 +989,7 @@ sub group_private {
close $io;
return $FALSE;
return 0;
}
sub checkOptions {
@@ -967,15 +997,15 @@ sub checkOptions {
my $options = shift;
my $o_string;
my $b_string;
my $bad = $FALSE;
my $bad = 0;
return undef, $TRUE if (!$options);
return undef, 1 if (!$options);
foreach my $option (split(/[\s+|\,]/, $options)) {
my $map = $_AVAILABLE_OPTIONS_{$option};
if (!$map) {
$bad = $TRUE;
$bad = 1;
$b_string .= ",$option";
} else {
$o_string .= ",$map";
@@ -984,12 +1014,12 @@ sub checkOptions {
if ($bad) {
$b_string =~ s/^\,//;
return $b_string, $FALSE;
return $b_string, 0;
}
$o_string =~ s/^\,//;
return $o_string, $TRUE;
return $o_string, 1;
}
sub errorString {
+51 -15
View File
@@ -1,11 +1,11 @@
#!/usr/bin/perl
$Version = 'SCST Configurator v1.0.5';
$Version = 'SCST Configurator v1.0.6';
# Configures SCST
#
# Author: Mark R. Buechler
# License: GPLv2
# Copyright (c) 2005-2007 Mark R. Buechler
# Copyright (c) 2005-2009 Mark R. Buechler
sub usage
{
@@ -24,16 +24,18 @@ Target Driver Operations
-enable <wwn|host> : Enable target mode for driver at specified WWN or host.
-disable <wwn|host> : Disable target mode for driver at specified WWN or host.
Devices Operations
Device Operations
-adddev <device> : Adds a device to a handler.
-handler <handler>
-path <path>
-options <options>
-blocksize <bytes>
-resyncdev <device> : Resync the size of a device with the initiator(s).
-handler <handler>
-RemoveDev <device> : Remove a device from a handler.
-handler <handler>
Users Operations
User Operations
-adduser <user> : Adds a user to a security group.
-group <group>
-RemoveUser <user> : Delete a user from a security group.
@@ -41,11 +43,11 @@ Users Operations
-ClearUsers : Clear all users from a given security group.
-group <group>
Groups Operations
Group Operations
-addgroup <group> : Add a given group to available security groups.
-RemoveGroup <group> : Remove a give group from available security groups.
Assignments Operations
Assignment Operations
-assigndev <device> : Assign a given device to a security group.
-group <group>
-lun <lun>
@@ -169,6 +171,7 @@ sub getArgs {
my $showSessions;
my $addDev;
my $devPath;
my $resyncDev;
my $removeDev;
my $addUser;
my $removeUser;
@@ -204,6 +207,7 @@ sub getArgs {
'addgroup=s' => \$addGroup,
'RemoveGroup=s' => \$removeGroup,
'assigndev=s' => \$assignDev,
'resyncdev=s' => \$resyncDev,
'ReleaseDev=s' => \$releaseDev,
'ClearDevs' => \$clearDevs,
'handler=s' => \$handler,
@@ -250,6 +254,11 @@ sub getArgs {
usage();
}
if ($resyncDev && !$handler) {
print "Please specify -handler with -resyncdev.\n\n";
usage();
}
if ($removeDev && !$handler) {
print "Please specify -handler with -RemoveDev.\n\n";
usage();
@@ -298,8 +307,8 @@ sub getArgs {
$enable =~ tr/A-Z/a-z/; $disable =~ tr/A-Z/a-z/;
$options =~ tr/a-z/A-Z/ if ($options);
if ((defined($showSessions) + defined($addDev) + defined($removeDev) +
defined($addUser) + defined($enable) + defined($disable) +
if ((defined($showSessions) + defined($addDev) + defined($resyncDev) +
defined($removeDev)+ defined($addUser) + defined($enable) + defined($disable) +
defined($removeUser) + defined($clearUsers) + defined($assignDev) +
defined($releaseDev) + defined($clearDevs) + defined($applyConfig) +
defined($clearConfig) + defined($writeConfig) + defined($checkConfig)) > 1) {
@@ -310,9 +319,9 @@ sub getArgs {
$applyConfig = $_DEF_CONFIG_ if (defined($applyConfig) && !$applyConfig);
$checkConfig = $_DEF_CONFIG_ if (defined($checkConfig) && !$checkConfig);
return ($enable, $disable, $addDev, $devPath, $devLun, $removeDev, $addUser, $removeUser,
$clearUsers, $addGroup, $removeGroup, $assignDev, $releaseDev, $clearDevs,
$handler, $group, $options, $blocksize, $applyConfig, $forceConfig,
return ($enable, $disable, $addDev, $devPath, $devLun, $resyncDev, $removeDev, $addUser,
$removeUser, $clearUsers, $addGroup, $removeGroup, $assignDev, $releaseDev,
$clearDevs, $handler, $group, $options, $blocksize, $applyConfig, $forceConfig,
$clearConfig, $writeConfig, $checkConfig, $showSessions);
}
@@ -324,9 +333,9 @@ sub main {
# We need to run as root
if ( $> ) {die("This program must run as root.\n");}
my ($enable, $disable, $addDev, $devPath, $devLun, $removeDev, $addUser, $removeUser,
$clearUsers, $addGroup, $removeGroup, $assignDev, $releaseDev, $clearDevs,
$handler, $group, $options, $blocksize, $applyConfig, $forceConfig,
my ($enable, $disable, $addDev, $devPath, $devLun, $resyncDev, $removeDev, $addUser,
$removeUser, $clearUsers, $addGroup, $removeGroup, $assignDev, $releaseDev,
$clearDevs, $handler, $group, $options, $blocksize, $applyConfig, $forceConfig,
$clearConfig, $writeConfig, $checkConfig, $showSessions) = getArgs();
$SCST = new SCST::SCST($_DEBUG_);
@@ -367,6 +376,10 @@ sub main {
$rc = addDevice($handler, $addDev, $devPath, $options, $blocksize);
last SWITCH;
};
$resyncDev && do {
$rc = resyncDevice($handler, $resyncDev);
last SWITCH;
};
$removeDev && do {
$rc = removeDevice($handler, $removeDev);
last SWITCH;
@@ -958,7 +971,7 @@ sub clearConfiguration {
print "If this is not what you intend, press ctrl-c now. Waiting 10 seconds.\n\n";
sleep 10;
print "\nRemoving all user and groups:\n\n";
print "\nRemoving all users and groups:\n\n";
foreach my $group (keys %GROUPS) {
$errs += removeGroup($group) if ($group ne $_DEFAULT_GROUP_);
}
@@ -1040,6 +1053,29 @@ sub addDevice {
return $FALSE;
}
sub resyncDevice {
my $handler = shift;
my $device = shift;
my $_handler = $_HANDLER_MAP_{$handler};
my $htype = $SCST->handlerType($_handler);
if (!defined($$DEVICES{$device})) {
print "WARNING: Device '$device' not defined.\n";
return $TRUE;
}
print "\t-> Resync'ing virtual device '$device'..\n";
if ($SCST->resyncDevice($_handler, $device)) {
print "WARNING: Failed to resync virtual device '$device': ".
$SCST->errorString()."\n";
return $TRUE;
}
return $FALSE;
}
sub removeDevice {
my $handler = shift;
my $device = shift;