mirror of
https://github.com/SCST-project/scst.git
synced 2026-05-17 10:41:26 +00:00
- 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:
@@ -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";
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user