- More updates to scstadmin.sysfs. This version has basic config

writing, reading and applying capability. No config file
  syntax checking is being done so be warned.



git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1679 d57e44dd-8a1f-0410-8b47-8ef2f437770f
This commit is contained in:
Mark Buechler
2010-05-04 17:41:35 +00:00
parent 07ecd8a5bc
commit f411449747
2 changed files with 395 additions and 67 deletions

View File

@@ -38,6 +38,9 @@ SCST_T10_IO => 't10_dev_id',
# Module return codes
SCST_C_FATAL_ERROR => 2,
SCST_C_BAD_PARAMETERS => 7,
SCST_C_PARAMETER_STATIC => 8,
SCST_C_SETPARAM_FAIL => 9,
SCST_C_HND_NO_HANDLER => 10,
@@ -90,6 +93,9 @@ SCST_C_INI_SETPARAM_FAIL => 99,
my %VERBOSE_ERROR = (
(SCST_C_FATAL_ERROR) => 'A fatal error occured. See "dmesg" for more information.',
(SCST_C_BAD_PARAMETERS) => 'Bad parameters given for SCST.',
(SCST_C_PARAMETER_STATIC) => 'SCST parameter specified is static',
(SCST_C_SETPARAM_FAIL) => 'Failed to set a SCST parameter. See "demsg" for more information.',
(SCST_C_HND_NO_HANDLER) => 'No such handler exists.',
@@ -253,6 +259,38 @@ sub scstParameters {
return \%parameters;
}
sub setScstParameter {
my $self = shift;
my $parameter = shift;
my $value = shift;
return TRUE if (!defined($parameter) || !defined($value));
my $parameters = $self->scstParameters();
return SCST_C_BAD_PARAMETERS if (!defined($$parameters{$parameter}));
return SCST_C_PARAMETER_STATIC if ($$parameters{$parameter}->{'static'});
my $path = mkpath(SCST_ROOT, $parameter);
my $io = new IO::File $path, O_WRONLY;
return SCST_C_SETPARAM_FAIL if (!$io);
my $bytes;
if ($self->{'debug'}) {
print "DBG($$): $path -> $parameter = $value\n";
} else {
$bytes = syswrite($io, $value, length($value));
}
close $io;
return FALSE if ($self->{'debug'} || $bytes);
return SCST_C_SETPARAM_FAIL;
}
sub drivers {
my $self = shift;
my @drivers;
@@ -1151,6 +1189,13 @@ sub deviceParameters {
$parameters{$parameter}->{'static'} = TRUE;
$parameters{$parameter}->{'value'} = $handler;
}
} elsif ($parameter eq 'scsi_device') {
my $linked = readlink $pPath;
$linked =~ s/^\.\.\/\.\.\/\.\.\/\.\.\//\/sys\//;
$parameters{$parameter}->{'static'} = TRUE;
$parameters{$parameter}->{'value'} = $linked;
} else {
if (!(($mode & S_IRUSR) >> 6)) {
$parameters{$parameter}->{'static'} = FALSE;
@@ -1953,7 +1998,7 @@ sub closeDevice {
}
$rc = $self->handlerDeviceExists($handler, $device);
return SCST_C_DEV_NO_DEVICE if ($rc == TRUE);
return SCST_C_DEV_NO_DEVICE if ($rc != TRUE);
return $rc if ($rc > 1);
my $cmd = "del_device $device\n";

View File

@@ -18,7 +18,6 @@ General Operations
-clear_config : Clear all SCST configuration.
-write_config <file> : Writes the current configuration out <file>.
-check_config <file> : Checks the saved configuration in <file>.
-sessions : List current initiator sessions.
Query Operations
-list_handler [<hndlr>] : List all available handlers or specific <hndlr>.
@@ -30,6 +29,7 @@ Query Operations
[-driver <driver>]
[-target <target>]
-list_scst_parm : List add parameters for SCST.
-list_hnd_parm <hndlr> : List all parameters for a given handler.
-list_dev_parm <device> : List all parameters for a given device.
-list_drv_parm <driver> : List all parameters for a given driver.
@@ -47,6 +47,8 @@ Query Operations
-list_sessions : List all current initiator sessions.
Set Operations
-set_scst_parm : Sets SCST parameter(s) <p> to value <v>.
-parameters <p=v,...>
-set_hnd_parm <hndlr> : Sets handler parameter(s) <p> to value <v>.
-parameters <p=v,...>
-set_dev_parm <device> : Sets device parameters(s) <p> to value <v>.
@@ -168,7 +170,7 @@ Examples:
EndUsage
}
use SCST::SCST;
use SCST::SCST 0.9.0;
use Getopt::Long;
use IO::File;
use IO::Dir;
@@ -209,6 +211,7 @@ sub getArgs {
my $listGroup;
my $listSessions;
my $listScstParm;
my $listHandlerParm;
my $listDeviceParm;
my $listDriverParm;
@@ -216,6 +219,7 @@ sub getArgs {
my $listLunParm;
my $listInitiatorParm;
my $setScstParm;
my $setHandlerParm;
my $setDeviceParm;
my $setDriverParm;
@@ -270,6 +274,7 @@ sub getArgs {
'list_group:s' => \$listGroup,
'list_sessions' => \$listSessions,
'list_scst_parm' => \$listScstParm,
'list_hnd_parm=s' => \$listHandlerParm,
'list_dev_parm=s' => \$listDeviceParm,
'list_drv_parm=s' => \$listDriverParm,
@@ -277,6 +282,7 @@ sub getArgs {
'list_lun_parm=s' => \$listLunParm,
'list_ini_parm=s' => \$listInitiatorParm,
'set_scst_parm' => \$setScstParm,
'set_hnd_parm=s' => \$setHandlerParm,
'set_dev_parm=s' => \$setDeviceParm,
'set_drv_parm=s' => \$setDriverParm,
@@ -326,13 +332,18 @@ sub getArgs {
$noprompt = TRUE if (defined($noprompt));
$clearInitiators = TRUE if (defined($clearInitiators));
$clearLuns = TRUE if (defined($clearLuns));
$issueLip = TRUE if (defined($issueLip));
$issueLip = TRUE if (defined($issueLip));
$listSessions = TRUE if (defined($listSessions));
$listScstParm = TRUE if (defined($listScstParm));
$setScstParm = TRUE if (defined($setScstParm));
my $query_mode = defined($listHandler) || defined($listDevice) || defined($listDriver) ||
defined($listTarget) || defined($listGroup) || defined($listSessions);
defined($listTarget) || defined($listGroup) || defined($listSessions) || defined($listScstParm) ||
defined($listHandlerParm) || defined($listDeviceParm) || defined($listDriverParm) ||
defined($listTargetParm) || defined($listLunParm) || defined($listInitiatorParm);
my $set_mode = defined($setHandlerParm) + defined($setDeviceParm) + defined($setDriverParm) +
defined($setTargetParm) + defined($setLunParm) + defined($setInitiatorParm);
my $set_mode = defined($setScstParm) + defined($setHandlerParm) + defined($setDeviceParm) +
defined($setDriverParm) + defined($setTargetParm) + defined($setLunParm) + defined($setInitiatorParm);
my $op_mode = defined($clearConfig) + defined($writeConfig) + defined($checkConfig) +
defined($openDev) + defined($closeDev) + defined($addGroup) + defined($removeGroup) +
@@ -345,6 +356,11 @@ sub getArgs {
usage();
}
if ($clearConfig && !$force) {
print "Please specify -force with -clear_config.\n";
usage();
}
if ($listTargetParm && !$driver) {
print "Please specify -driver with -list_tgt_parm.\n";
usage();
@@ -360,6 +376,11 @@ sub getArgs {
usage();
}
if ($setScstParm && !$parameters) {
print "Please specify -parameters with -set_scst_parm.\n";
usage();
}
if ($setHandlerParm && !$parameters) {
print "Please specify -parameters with -set_hnd_parm.\n";
usage();
@@ -441,10 +462,10 @@ sub getArgs {
}
return ($applyConfig, $clearConfig, $writeConfig, $checkConfig,
$listHandler, $listDevice, $listDriver, $listTarget, $listGroup, $listSessions,
$listHandlerParm, $listDeviceParm, $listDriverParm, $listTargetParm, $listLunParm,
$listInitiatorParm, $setHandlerParm, $setDeviceParm, $setDriverParm, $setTargetParm,
$setLunParm, $setInitiatorParm,
$listScstParm, $listHandler, $listDevice, $listDriver, $listTarget, $listGroup,
$listSessions, $listHandlerParm, $listDeviceParm, $listDriverParm, $listTargetParm,
$listLunParm, $listInitiatorParm, $setScstParm, $setHandlerParm, $setDeviceParm,
$setDriverParm, $setTargetParm, $setLunParm, $setInitiatorParm,
$openDev, $closeDev, $resyncDev,
$addGroup, $removeGroup,
$addInitiator, $removeInitiator, $moveInitiator, $clearInitiators,
@@ -464,10 +485,10 @@ sub main {
if ( $> ) {die("This program must run as root.\n");}
my ($applyConfig, $clearConfig, $writeConfig, $checkConfig,
$listHandler, $listDevice, $listDriver, $listTarget, $listGroup, $listSessions,
$listHandlerParm, $listDeviceParm, $listDriverParm, $listTargetParm, $listLunParm,
$listInitiatorParm, $setHandlerParm, $setDeviceParm, $setDriverParm, $setTargetParm,
$setLunParm, $setInitiatorParm,
$listScstParm, $listHandler, $listDevice, $listDriver, $listTarget, $listGroup,
$listSessions, $listHandlerParm, $listDeviceParm, $listDriverParm, $listTargetParm,
$listLunParm, $listInitiatorParm, $setScstParm, $setHandlerParm, $setDeviceParm,
$setDriverParm, $setTargetParm, $setLunParm, $setInitiatorParm,
$openDev, $closeDev, $resyncDev,
$addGroup, $removeGroup,
$addInitiator, $removeInitiator, $moveInitiator, $clearInitiators,
@@ -531,10 +552,14 @@ sub main {
$rc = listGroups($listGroup, $driver, $target);
$all_good = TRUE;
};
defined($listSessions) && do {
$listSessions && do {
$rc = listSessions();
$all_good = TRUE;
};
$listScstParm && do {
$rc = listScstParm();
$all_good = TRUE;
};
$listHandlerParm && do {
$rc = listHandlerParameters($listHandlerParm);
$all_good = TRUE;
@@ -559,6 +584,10 @@ sub main {
$rc = listInitiatorParameters($listInitiatorParm, $driver, $target, $group);
$all_good = TRUE;
};
$setScstParm && do {
$rc = setScstParameters($parameters);
last SWITCH;
};
$setHandlerParm && do {
$rc = setHandlerParameters($setHandlerParm, $parameters);
last SWITCH;
@@ -682,9 +711,13 @@ sub readWorkingConfig {
immediateExit($SCST->errorString());
foreach my $driver (@{$drivers}) {
my %empty;
$CURRENT{'assign'}->{$driver} = \%empty;
my $targets = $SCST->targets($driver);
immediateExit($SCST->errorString());
foreach my $target (@{$targets}) {
my %empty;
$CURRENT{'assign'}->{$driver}->{$target} = \%empty;
my $groups = $SCST->groups($driver, $target);
immediateExit($SCST->errorString());
foreach my $group (@{$groups}) {
@@ -726,7 +759,7 @@ sub writeConfiguration {
my $parameters = $SCST->scstParameters();
immediateExit($SCST->errorString());
foreach my $parameter (keys %{$parameters}) {
foreach my $parameter (sort keys %{$parameters}) {
next if (defined($$parameters{$parameter}->{'set'}));
if (!$$parameters{$parameter}->{'static'}) {
@@ -738,14 +771,14 @@ sub writeConfiguration {
print $io "\n";
foreach my $handler (keys %{$CURRENT{'handler'}}) {
foreach my $handler (sort keys %{$CURRENT{'handler'}}) {
my $handler_params = $SCST->deviceAvailableParameters($handler);
print $io "HANDLER $handler {\n";
$parameters = $SCST->handlerParameters($handler);
foreach my $parameter (keys %{$parameters}) {
foreach my $parameter (sort keys %{$parameters}) {
next if (defined($$parameters{$parameter}->{'set'}));
if (!$$parameters{$parameter}->{'static'}) {
@@ -764,7 +797,7 @@ sub writeConfiguration {
my $written = 0;
foreach my $parameter (keys %{$parameters}) {
foreach my $parameter (sort keys %{$parameters}) {
next if (defined($$parameters{$parameter}->{'set'}));
if (!defined($$handler_params{$parameter})) {
@@ -783,7 +816,7 @@ sub writeConfiguration {
print $io "\t\tCREATE_ATTRIBUTES {\n";
foreach my $parameter (keys %{$parameters}) {
foreach my $parameter (sort keys %{$parameters}) {
next if (defined($$parameters{$parameter}->{'set'}));
if (defined($$handler_params{$parameter})) {
@@ -801,17 +834,17 @@ sub writeConfiguration {
print $io "}\n\n";
}
foreach my $driver (keys %{$CURRENT{'assign'}}) {
foreach my $driver (sort keys %{$CURRENT{'assign'}}) {
print $io "TARGET_DRIVER $driver {";
my $targets = $CURRENT{'assign'}->{$driver};
foreach my $target (keys %{$targets}) {
foreach my $target (sort keys %{$targets}) {
print $io "\n\tTARGET $target {";
my $groups = $CURRENT{'assign'}->{$driver}->{$target};
foreach my $group (keys %{$groups}) {
foreach my $group (sort keys %{$groups}) {
my $lun_params = $SCST->lunAvailableParameters($driver, $target, $group);
my $ini_params = $SCST->initiatorAvailableParameters($driver, $target, $group);
@@ -826,7 +859,7 @@ sub writeConfiguration {
$parameters = $SCST->lunParameters($driver, $target, $group, $lun);
foreach my $parameter (keys %{$parameters}) {
foreach my $parameter (sort keys %{$parameters}) {
next if (defined($$parameters{$parameter}->{'set'}));
if (!$$parameters{$parameter}->{'static'} ||
@@ -847,7 +880,7 @@ sub writeConfiguration {
$parameters = $SCST->initiatorParameters($driver, $target, $group, $init);
foreach my $parameter (keys %{$parameters}) {
foreach my $parameter (sort keys %{$parameters}) {
next if (defined($$parameters{$parameter}->{'set'}));
if (!$$parameters{$parameter}->{'static'} ||
@@ -879,21 +912,181 @@ sub applyConfiguration {
my $file = shift;
my $config = readConfig($file);
my $handlers = $$config{'HANDLER'};
my $assignments = $$config{'TARGET_DRIVER'};
foreach my $handler (sort keys %{$handlers}) {
if (defined($$handlers{$handler}->{'DEVICE'})) {
my $devices = $$handlers{$handler}->{'DEVICE'};
foreach my $device (sort keys %{$devices}) {
next if (handlerHasDevice($handler, $device));
my $parameters = configToParm($$devices{$device}->{'CREATE_ATTRIBUTES'});
openDevice($device, $handler, $parameters);
}
}
}
use Data::Dumper;
print Dumper(\%CURRENT);
foreach my $driver (sort keys %{$assignments}) {
if (!defined($CURRENT{'assign'}->{$driver})) {
immediateExit("Target driver '$driver' is not loaded or available.");
}
my $targets = $$assignments{$driver}->{'TARGET'};
foreach my $target (sort keys %{$targets}) {
if (!defined($CURRENT{'assign'}->{$driver}->{$target})) {
immediateExit("Target '$target' for driver '$driver' does not exist.");
}
my $groups = $$targets{$target}->{'GROUP'};
foreach my $group (sort keys %{$groups}) {
if (!defined($CURRENT{'assign'}->{$driver}->{$target}->{$group})) {
addGroup($group, $driver, $target);
}
my $inits = $CURRENT{'assign'}->{$driver}->{$target}->{$group}->{'INITIATORS'};
my $luns = $CURRENT{'assign'}->{$driver}->{$target}->{$group}->{'LUNS'};
if (defined($$groups{$group}->{'LUN'})) {
foreach my $lun (sort keys %{$$groups{$group}->{'LUN'}}) {
if (!defined($$luns{$lun})) {
if ((keys %{$$groups{$group}->{'LUN'}->{$lun}}) > 1) {
immediateExit("Invalid configuration encountered. ".
"Driver/target/group/lun $driver/$target/$group/$lun ".
"has multiple devices assigned.");
}
foreach my $device (sort keys %{$$groups{$group}->{'LUN'}->{$lun}}) {
my $parameters = configToParm($$groups{$group}->{'LUN'}->{$lun}->{$device});
addLun($lun, $driver, $target, $group, $device, $parameters);
}
}
}
}
if (defined($$groups{$group}->{'INITIATOR'})) {
foreach my $initiator (sort keys %{$$groups{$group}->{'INITIATOR'}}) {
if (!groupHasInitiator($inits, $initiator)) {
addInitiator($initiator, $driver, $target, $group);
}
}
}
}
}
}
my %_parameters;
foreach my $item (keys %{$config}) {
next if ($item eq 'HANDLER');
next if ($item eq 'TARGET_DRIVER');
$_parameters{$item} = $$config{$item};
}
my $parameters = configToParm(\%_parameters);
setScstParameters($parameters);
}
sub clearConfiguration {
my $noprompt = shift;
my $force = shift;
my $assignments = $CURRENT{'assign'};
foreach my $driver (sort keys %{$assignments}) {
foreach my $target (sort keys %{$$assignments{$driver}}) {
foreach my $group (sort keys %{$$assignments{$driver}->{$target}}) {
clearInitiators($driver, $target, $group);
clearLuns($driver, $target, $group);
removeGroup($group, $driver, $target, $force);
}
}
}
my $handlers = $CURRENT{'handler'};
foreach my $handler (sort keys %{$handlers}) {
foreach my $device (@{$$handlers{$handler}}) {
my $parameters = $SCST->deviceParameters($device);
if (!defined($$parameters{'scsi_device'})) {
closeDevice($device, $handler, $force);
}
}
}
}
####################################################################
sub listHandlers {
my $handler = shift;
return listHandler($handler) if ($handler);
my $handlers = $SCST->handlers();
my $l_handler;
foreach my $handler (@{$handlers}) {
$l_handler = length($handler) if ($l_handler < length($handler));
}
print "\tHandler\n";
print "\t";
for (my $x = 0; $x < $l_handler; $x++) {
print "-";
};
print "\n";
foreach my $handler (@{$handlers}) {
print "\t$handler\n";
}
}
sub listHandler {
my $handler = shift;
my $devices = $SCST->devicesByHandler($handler);
if ($#{$devices} > -1) {
my $l_device;
foreach my $device (@{$devices}) {
$l_device = length($device) if ($l_device < length($device));
}
printf("\t%-*s %-*s\n", length($handler), 'Handler', $l_device, 'Device');
print "\t";
for (my $x = 0; $x < (length($handler) + $l_device + 2); $x++) {
print "-";
};
print "\n";
my $first = TRUE;
foreach my $device (@{$devices}) {
if ($first) {
printf("\t%-*s %-*s\n", length($handler), $handler, $l_device, $device);
$first = FALSE;
} else {
printf("\t%-*s %-*s\n", length($handler), '', $l_device, $device);
}
}
} else {
print "\t(handler '$handler' has no assigned devices)\n";
}
}
sub listDevices {
my $device = shift;
listDevice($device) if ($device);
}
sub listDevice {
my $device = shift;
}
sub listDrivers {
@@ -963,34 +1156,6 @@ sub listTargets {
}
}
sub listGroups {
my $group = shift;
my $driver = shift;
my $target = shift;
if ($group && $driver && $target) {
return listGroup($driver, $target, $group);
}
my $drivers = $SCST->drivers();
foreach my $driver (@{$drivers}) {
my $targets = $SCST->targets($driver);
foreach my $target (@{$targets}) {
my $groups = $SCST->groups($driver, $target);
foreach my $group (@{$groups}) {
print "Driver: $driver\n";
print "Target: $target\n";
print "Group : $group\n\n";
listGroup($driver, $target, $group);
print "\n\n";
}
}
}
}
sub listSessions {
}
@@ -1058,6 +1223,34 @@ sub listGroup {
}
sub listGroups {
my $group = shift;
my $driver = shift;
my $target = shift;
if ($group && $driver && $target) {
return listGroup($driver, $target, $group);
}
my $drivers = $SCST->drivers();
foreach my $driver (@{$drivers}) {
my $targets = $SCST->targets($driver);
foreach my $target (@{$targets}) {
my $groups = $SCST->groups($driver, $target);
foreach my $group (@{$groups}) {
print "Driver: $driver\n";
print "Target: $target\n";
print "Group : $group\n\n";
listGroup($driver, $target, $group);
print "\n\n";
}
}
}
}
sub listExported {
my $device = shift;
my $parameters = shift;
@@ -1095,9 +1288,9 @@ sub listExported {
}
print "\n";
foreach my $driver (keys %{$exported}) {
foreach my $target (keys %{$$exported{$driver}}) {
foreach my $group (keys %{$$exported{$driver}->{$target}}) {
foreach my $driver (sort keys %{$exported}) {
foreach my $target (sort keys %{$$exported{$driver}}) {
foreach my $group (sort keys %{$$exported{$driver}->{$target}}) {
my $lun = $$exported{$driver}->{$target}->{$group};
printf("\t%-*s %-*s %-*s %-4s\n", $l_driver, $driver,
$l_target, $target, $l_group, $group, $lun);
@@ -1109,6 +1302,9 @@ sub listExported {
}
}
sub listScstParameters {
}
sub listHandlerParameters {
my $handler = shift;
@@ -1181,13 +1377,39 @@ sub listInitiatorParameters {
####################################################################
sub setScstParameters {
my $parameters = shift;
my $_parameters = $SCST->scstParameters();
foreach my $parameter (sort keys %{$parameters}) {
if (defined($$_parameters{$parameter}) &&
!$$_parameters{$parameter}->{'static'}) {
my $value = $$parameters{$parameter};
next if ($$_parameters{$parameter}->{'value'} eq $value);
print "-> Setting SCST parameter '$parameter' to '$value': ";
my $rc = $SCST->setScstParameter($parameter, $value);
print "done.\n";
immediateExit($SCST->errorString($rc)) if ($rc);
} else {
print "-> WARNING: SCST lacks the settable ".
"paraneter '$parameter', ignoring.\n";
}
}
}
sub setHandlerParameters {
my $handler = shift;
my $parameters = shift;
my $_parameters = $SCST->handlerParameters($handler);
foreach my $parameter (keys %{$parameters}) {
foreach my $parameter (sort keys %{$parameters}) {
if (defined($$_parameters{$parameter}) &&
!$$_parameters{$parameter}->{'static'}) {
my $value = $$parameters{$parameter};
@@ -1212,11 +1434,13 @@ sub setDeviceParameters {
my $_parameters = $SCST->deviceParameters($device);
foreach my $parameter (keys %{$parameters}) {
foreach my $parameter (sort keys %{$parameters}) {
if (defined($$_parameters{$parameter}) &&
!$$_parameters{$parameter}->{'static'}) {
my $value = $$parameters{$parameter};
next if ($$_parameters{$parameter}->{'value'} eq $value);
print "-> Setting device parameter '$parameter' to value '$value' for device '$device': ";
my $rc = $SCST->setDeviceParameter($device, $parameter, $value);
@@ -1237,11 +1461,13 @@ sub setDriverParameters {
my $_parameters = $SCST->driverParameters($driver);
foreach my $parameter (keys %{$parameters}) {
foreach my $parameter (sort keys %{$parameters}) {
if (defined($$_parameters{$parameter}) &&
!$$_parameters{$parameter}->{'static'}) {
my $value = $$parameters{$parameter};
next if ($$_parameters{$parameter}->{'value'} eq $value);
print "-> Setting driver parameter '$parameter' to value '$value' for driver '$driver': ";
my $rc = $SCST->setDriverParameter($driver, $parameter, $value);
@@ -1263,11 +1489,13 @@ sub setTargetParameters {
my $_parameters = $SCST->targetParameters($driver, $target);
foreach my $parameter (keys %{$parameters}) {
foreach my $parameter (sort keys %{$parameters}) {
if (defined($$_parameters{$parameter}) &&
!$$_parameters{$parameter}->{'static'}) {
my $value = $$parameters{$parameter};
next if ($$_parameters{$parameter}->{'value'} eq $value);
print "-> Setting target parameter '$parameter' to value '$value' for ".
"driver/target '$driver/$target': ";
@@ -1292,11 +1520,13 @@ sub setLunParameters {
my $_parameters = $SCST->lunParameters($driver, $target, $group, $lun);
foreach my $parameter (keys %{$parameters}) {
foreach my $parameter (sort keys %{$parameters}) {
if (defined($$_parameters{$parameter}) &&
!$$_parameters{$parameter}->{'static'}) {
my $value = $$parameters{$parameter};
next if ($$_parameters{$parameter}->{'value'} eq $value);
print "-> Setting LUN parameter '$parameter' to value '$value' for ".
"driver/target/group/lun '$driver/$target/$group/$lun': ";
@@ -1321,11 +1551,13 @@ sub setInitiatorParameters {
my $_parameters = $SCST->initiatorParameters($driver, $target, $group, $initiator);
foreach my $parameter (keys %{$parameters}) {
foreach my $parameter (sort keys %{$parameters}) {
if (defined($$_parameters{$parameter}) &&
!$$_parameters{$parameter}->{'static'}) {
my $value = $$parameters{$parameter};
next if ($$_parameters{$parameter}->{'value'} eq $value);
print "-> Setting initiator parameter '$parameter' to value '$value' for ".
"driver/target/group/initiator '$driver/$target/$group/$initiator': ";
@@ -1671,6 +1903,61 @@ sub parseLine {
}
}
####################################################################
sub handlerHasDevice {
my $handler = shift;
my $device = shift;
return FALSE if (!defined($CURRENT{'handler'}->{$handler}));
foreach my $_device (@{$CURRENT{'handler'}->{$handler}}) {
return TRUE if ($_device eq $device);
}
return FALSE;
}
sub groupHasInitiator {
my $initiators = shift;
my $initiator = shift;
foreach my $_initiator (@{$initiators}) {
return TRUE if ($_initiator eq $initiator);
}
return FALSE;
}
sub configToParm {
my $config = shift;
my %parameters;
foreach my $parm (keys %{$config}) {
if ((keys %{$$config{$parm}}) > 1) {
immediateExit("Invalid configuration encountered. ".
"Parameter '$parm' has multiple values!");
}
foreach my $value (keys %{$$config{$parm}}) {
if (keys %{$$config{$parm}->{$value}}) {
immediateExit("Invalid configuration encountered. ".
"Parameter '$parm' has an invalid value.");
}
$parameters{$parm} = $value;
}
}
return \%parameters;
}
sub numerically {
$a <=> $b;
}
####################################################################
# If we have an unread error from SCST, exit immediately
sub immediateExit {
my $error = shift;
@@ -1688,7 +1975,3 @@ sub commitSuicide {
print "\n\nAborting immediately.\n";
exit 1;
}
sub numerically {
$a <=> $b;
}