mirror of
https://github.com/SCST-project/scst.git
synced 2026-05-17 10:41:26 +00:00
- Rename *AvailableParameters() to *CreateParameters() in module.
- Both write and apply target parameters now. - Perform config deletions now with -force option. Scstadmin.sysfs should now suffice to perform basic configuration changes as well as apply from a config file. git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1682 d57e44dd-8a1f-0410-8b47-8ef2f437770f
This commit is contained in:
@@ -899,7 +899,7 @@ sub addLun {
|
||||
return SCST_C_DEV_NO_DEVICE if (!$rc);
|
||||
return $rc if ($rc > 1);
|
||||
|
||||
$rc = $self->checkLunAvailableParameters($driver, $target, $group, $parameters);
|
||||
$rc = $self->checkLunCreateParameters($driver, $target, $group, $parameters);
|
||||
return SCST_C_LUN_BAD_PARAMETERS if ($rc == TRUE);
|
||||
return $rc if ($rc > 1);
|
||||
|
||||
@@ -1014,7 +1014,7 @@ sub replaceLun {
|
||||
return SCST_C_DEV_NO_DEVICE if (!$rc);
|
||||
return $rc if ($rc > 1);
|
||||
|
||||
$rc = $self->checkLunAvailableParameters($driver, $target, $group, $parameters);
|
||||
$rc = $self->checkLunCreateParameters($driver, $target, $group, $parameters);
|
||||
return SCST_C_LUN_BAD_PARAMETERS if ($rc == TRUE);
|
||||
return $rc if ($rc > 1);
|
||||
|
||||
@@ -1871,7 +1871,7 @@ sub devicesByHandler {
|
||||
return \@{$$parameters{'devices'}->{'value'}};
|
||||
}
|
||||
|
||||
sub checkDeviceAvailableParameters {
|
||||
sub checkDeviceCreateParameters {
|
||||
my $self = shift;
|
||||
my $handler = shift;
|
||||
my $check = shift;
|
||||
@@ -1882,7 +1882,7 @@ sub checkDeviceAvailableParameters {
|
||||
return SCST_C_HND_NO_HANDLER if (!$rc);
|
||||
return $rc if (!$rc > 1);
|
||||
|
||||
my $available = $self->deviceAvailableParameters($handler);
|
||||
my $available = $self->deviceCreateParameters($handler);
|
||||
|
||||
return SCST_C_FATAL_ERROR if (!defined($available));
|
||||
|
||||
@@ -1895,14 +1895,14 @@ sub checkDeviceAvailableParameters {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
sub deviceAvailableParameters {
|
||||
sub deviceCreateParameters {
|
||||
my $self = shift;
|
||||
my $handler = shift;
|
||||
my $available;
|
||||
my %parameters;
|
||||
|
||||
if ($self->handlerExists($handler) != TRUE) {
|
||||
$self->{'err_string'} = "deviceAvailableParameters():Handler '$handler' ".
|
||||
$self->{'err_string'} = "deviceCreateParameters():Handler '$handler' ".
|
||||
"is not available";
|
||||
return undef;
|
||||
}
|
||||
@@ -1910,7 +1910,7 @@ sub deviceAvailableParameters {
|
||||
my $io = new IO::File mkpath(SCST_ROOT, SCST_HANDLERS, $handler, SCST_MGMT_IO), O_RDONLY;
|
||||
|
||||
if (!$io) {
|
||||
$self->{'err_string'} = "deviceAvailableParameters(): Unable to open mgmt ".
|
||||
$self->{'err_string'} = "deviceCreateParameters(): Unable to open mgmt ".
|
||||
"interface for handler '$handler': $!";
|
||||
return undef;
|
||||
}
|
||||
@@ -1943,7 +1943,7 @@ sub openDevice {
|
||||
return SCST_C_HND_NO_HANDLER if (!$rc);
|
||||
return $rc if ($rc > 1);
|
||||
|
||||
$rc = $self->checkDeviceAvailableParameters($handler, $parameters);
|
||||
$rc = $self->checkDeviceCreateParameters($handler, $parameters);
|
||||
return SCST_C_DEV_BAD_PARAMETERS if ($rc == TRUE);
|
||||
return $rc if ($rc > 1);
|
||||
|
||||
@@ -2078,7 +2078,7 @@ sub setT10DeviceId {
|
||||
return $self->setDeviceParameter($device, 't10_dev_id', $t10_id);
|
||||
}
|
||||
|
||||
sub checkLunAvailableParameters {
|
||||
sub checkLunCreateParameters {
|
||||
my $self = shift;
|
||||
my $driver = shift;
|
||||
my $target = shift;
|
||||
@@ -2099,7 +2099,7 @@ sub checkLunAvailableParameters {
|
||||
return SCST_C_GRP_NO_GROUP if (!$rc);
|
||||
return $rc if ($rc > 1);
|
||||
|
||||
my $available = $self->lunAvailableParameters($driver, $target, $group);
|
||||
my $available = $self->lunCreateParameters($driver, $target, $group);
|
||||
|
||||
return SCST_C_FATAL_ERROR if (!defined($available));
|
||||
|
||||
@@ -2112,7 +2112,7 @@ sub checkLunAvailableParameters {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
sub lunAvailableParameters {
|
||||
sub lunCreateParameters {
|
||||
my $self = shift;
|
||||
my $driver = shift;
|
||||
my $target = shift;
|
||||
@@ -2121,19 +2121,19 @@ sub lunAvailableParameters {
|
||||
my %parameters;
|
||||
|
||||
if ($self->driverExists($driver) != TRUE) {
|
||||
$self->{'err_string'} = "lunAvailableParameters(): Driver '$driver' ".
|
||||
$self->{'err_string'} = "lunCreateParameters(): Driver '$driver' ".
|
||||
"is not available";
|
||||
return undef;
|
||||
}
|
||||
|
||||
if ($self->targetExists($driver, $target) != TRUE) {
|
||||
$self->{'err_string'} = "lunAvailableParameters(): Target '$target' ".
|
||||
$self->{'err_string'} = "lunCreateParameters(): Target '$target' ".
|
||||
"is not available";
|
||||
return undef;
|
||||
}
|
||||
|
||||
if ($self->groupExists($driver, $target, $group) != TRUE) {
|
||||
$self->{'err_string'} = "lunAvailableParameters(): Group '$group' ".
|
||||
$self->{'err_string'} = "lunCreateParameters(): Group '$group' ".
|
||||
"does not exist";
|
||||
return undef;
|
||||
}
|
||||
@@ -2142,7 +2142,7 @@ sub lunAvailableParameters {
|
||||
SCST_GROUPS, $group, SCST_LUNS, SCST_MGMT_IO), O_RDONLY;
|
||||
|
||||
if (!$io) {
|
||||
$self->{'err_string'} = "lunAvailableParameters(): Unable to open luns mgmt ".
|
||||
$self->{'err_string'} = "lunCreateParameters(): Unable to open luns mgmt ".
|
||||
"interface for group '$group': $!";
|
||||
return undef;
|
||||
}
|
||||
@@ -2165,7 +2165,7 @@ sub lunAvailableParameters {
|
||||
return \%parameters;
|
||||
}
|
||||
|
||||
sub checkInitiatorAvailableParameters {
|
||||
sub checkInitiatorCreateParameters {
|
||||
my $self = shift;
|
||||
my $driver = shift;
|
||||
my $target = shift;
|
||||
@@ -2186,7 +2186,7 @@ sub checkInitiatorAvailableParameters {
|
||||
return SCST_C_GRP_NO_GROUP if (!$rc);
|
||||
return $rc if ($rc > 1);
|
||||
|
||||
my $available = $self->initiatorAvailableParameters($driver, $target, $group);
|
||||
my $available = $self->initiatorCreateParameters($driver, $target, $group);
|
||||
|
||||
return SCST_C_FATAL_ERROR if (!defined($available));
|
||||
|
||||
@@ -2199,7 +2199,7 @@ sub checkInitiatorAvailableParameters {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
sub initiatorAvailableParameters {
|
||||
sub initiatorCreateParameters {
|
||||
my $self = shift;
|
||||
my $driver = shift;
|
||||
my $target = shift;
|
||||
@@ -2208,19 +2208,19 @@ sub initiatorAvailableParameters {
|
||||
my %parameters;
|
||||
|
||||
if ($self->driverExists($driver) != TRUE) {
|
||||
$self->{'err_string'} = "initiatorAvailableParameters(): Driver '$driver' ".
|
||||
$self->{'err_string'} = "initiatorCreateParameters(): Driver '$driver' ".
|
||||
"is not available";
|
||||
return undef;
|
||||
}
|
||||
|
||||
if ($self->targetExists($driver, $target) != TRUE) {
|
||||
$self->{'err_string'} = "initiatorAvailableParameters(): Target '$target' ".
|
||||
$self->{'err_string'} = "initiatorCreateParameters(): Target '$target' ".
|
||||
"is not available";
|
||||
return undef;
|
||||
}
|
||||
|
||||
if ($self->groupExists($driver, $target, $group) != TRUE) {
|
||||
$self->{'err_string'} = "initiatorAvailableParameters(): Group '$group' ".
|
||||
$self->{'err_string'} = "initiatorCreateParameters(): Group '$group' ".
|
||||
"does not exist";
|
||||
return undef;
|
||||
}
|
||||
@@ -2229,7 +2229,7 @@ sub initiatorAvailableParameters {
|
||||
SCST_GROUPS, $group, SCST_LUNS, SCST_MGMT_IO), O_RDONLY;
|
||||
|
||||
if (!$io) {
|
||||
$self->{'err_string'} = "initiatorAvailableParameters(): Unable to open initiators mgmt ".
|
||||
$self->{'err_string'} = "initiatorCreateParameters(): Unable to open initiators mgmt ".
|
||||
"interface for group '$group': $!";
|
||||
return undef;
|
||||
}
|
||||
|
||||
@@ -506,22 +506,13 @@ sub main {
|
||||
|
||||
SWITCH: {
|
||||
$applyConfig && do {
|
||||
if ($force) {
|
||||
$rc = applyConfiguration($applyConfig, TRUE, TRUE);
|
||||
die("Configuration errors found, aborting.\n") if ($rc);
|
||||
|
||||
if (!$noprompt) {
|
||||
print "\nConfiguration will apply in 10 seconds, type ctrl-c to abort..\n";
|
||||
sleep 10;
|
||||
}
|
||||
}
|
||||
|
||||
readWorkingConfig();
|
||||
$rc = applyConfiguration($applyConfig, $force, FALSE);
|
||||
$rc = checkConfiguration($applyConfig);
|
||||
immediateExit("Configuration has errors, aborting.") if ($rc);
|
||||
$rc = applyConfiguration($applyConfig, $force);
|
||||
last SWITCH;
|
||||
};
|
||||
$checkConfig && do {
|
||||
$rc = applyConfiguration($checkConfig, FALSE, TRUE);
|
||||
$rc = checkConfiguration($checkConfig);
|
||||
last SWITCH;
|
||||
};
|
||||
$writeConfig && do {
|
||||
@@ -772,7 +763,7 @@ sub writeConfiguration {
|
||||
print $io "\n";
|
||||
|
||||
foreach my $handler (sort keys %{$CURRENT{'handler'}}) {
|
||||
my $handler_params = $SCST->deviceAvailableParameters($handler);
|
||||
my $handler_params = $SCST->deviceCreateParameters($handler);
|
||||
|
||||
print $io "HANDLER $handler {\n";
|
||||
|
||||
@@ -791,7 +782,7 @@ sub writeConfiguration {
|
||||
my $devices = $CURRENT{'handler'}->{$handler};
|
||||
|
||||
foreach my $device (@{$devices}) {
|
||||
print $io "\tDEVICE $device {\n";
|
||||
print $io "\n\tDEVICE $device {\n";
|
||||
|
||||
$parameters = $SCST->deviceParameters($device);
|
||||
|
||||
@@ -814,19 +805,21 @@ sub writeConfiguration {
|
||||
|
||||
print $io "\n" if ($written);
|
||||
|
||||
print $io "\t\tCREATE_ATTRIBUTES {\n";
|
||||
if (!defined($$parameters{'scsi_device'})) {
|
||||
print $io "\t\tCREATE_ATTRIBUTES {\n";
|
||||
|
||||
foreach my $parameter (sort keys %{$parameters}) {
|
||||
next if (defined($$parameters{$parameter}->{'set'}));
|
||||
foreach my $parameter (sort keys %{$parameters}) {
|
||||
next if (defined($$parameters{$parameter}->{'set'}));
|
||||
|
||||
if (defined($$handler_params{$parameter})) {
|
||||
my $value = $$parameters{$parameter}->{'value'};
|
||||
$value = "\"$value\"" if ($value =~ / /);
|
||||
print $io "\t\t\t$parameter $value\n" if (defined($value));
|
||||
if (defined($$handler_params{$parameter})) {
|
||||
my $value = $$parameters{$parameter}->{'value'};
|
||||
$value = "\"$value\"" if ($value =~ / /);
|
||||
print $io "\t\t\t$parameter $value\n" if (defined($value));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
print $io "\t\t}\n";
|
||||
print $io "\t\t}\n";
|
||||
}
|
||||
|
||||
print $io "\t}\n";
|
||||
}
|
||||
@@ -835,18 +828,37 @@ sub writeConfiguration {
|
||||
}
|
||||
|
||||
foreach my $driver (sort keys %{$CURRENT{'assign'}}) {
|
||||
print $io "TARGET_DRIVER $driver {";
|
||||
print $io "TARGET_DRIVER $driver {\n";
|
||||
|
||||
my $targets = $CURRENT{'assign'}->{$driver};
|
||||
|
||||
foreach my $target (sort keys %{$targets}) {
|
||||
my $tgt_params = $SCST->targetParameters($driver, $target);
|
||||
|
||||
print $io "\n\tTARGET $target {";
|
||||
|
||||
my $_wrote = FALSE;
|
||||
foreach my $parm (keys %{$tgt_params}) {
|
||||
next if ($$tgt_params{$parm}->{'static'});
|
||||
next if ($$tgt_params{$parm}->{'set'});
|
||||
|
||||
my $value = $$tgt_params{$parm}->{'value'};
|
||||
|
||||
next if (!defined($value));
|
||||
|
||||
$value = "\"$value\"" if ($value =~ /\s/);
|
||||
|
||||
print $io "\n\t\t$parm $value";
|
||||
$_wrote = TRUE;
|
||||
}
|
||||
|
||||
print $io "\n" if ($_wrote);
|
||||
|
||||
my $groups = $CURRENT{'assign'}->{$driver}->{$target};
|
||||
|
||||
foreach my $group (sort keys %{$groups}) {
|
||||
my $lun_params = $SCST->lunAvailableParameters($driver, $target, $group);
|
||||
my $ini_params = $SCST->initiatorAvailableParameters($driver, $target, $group);
|
||||
my $lun_params = $SCST->lunCreateParameters($driver, $target, $group);
|
||||
my $ini_params = $SCST->initiatorCreateParameters($driver, $target, $group);
|
||||
|
||||
print $io "\n\t\tGROUP $group {";
|
||||
|
||||
@@ -908,13 +920,71 @@ sub writeConfiguration {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
sub applyConfiguration {
|
||||
sub checkConfiguration {
|
||||
my $file = shift;
|
||||
|
||||
print "Checking configuration file '$file' for errors: ";
|
||||
|
||||
my $config = readConfig($file);
|
||||
|
||||
my $handlers = $$config{'HANDLER'};
|
||||
my $assignments = $$config{'TARGET_DRIVER'};
|
||||
print "done\n";
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
sub applyConfiguration {
|
||||
my $file = shift;
|
||||
my $force = shift;
|
||||
|
||||
my $config = readConfig($file);
|
||||
|
||||
# Apply config deletions
|
||||
if ($force) {
|
||||
applyConfigAssignments($config, $force);
|
||||
applyConfigDevices($config, $force);
|
||||
|
||||
readWorkingConfig();
|
||||
}
|
||||
|
||||
# Apply config additions
|
||||
applyConfigDevices($config, FALSE);
|
||||
applyConfigAssignments($config, FALSE);
|
||||
|
||||
# And SCST parameters..
|
||||
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 applyConfigDevices {
|
||||
my $config = shift;
|
||||
my $deletions = shift;
|
||||
|
||||
my $handlers = $CURRENT{'handler'};
|
||||
|
||||
foreach my $handler (keys %{$handlers}) {
|
||||
foreach my $device (@{$$handlers{$handler}}) {
|
||||
if (!defined($$config{'HANDLER'}) ||
|
||||
!defined($$config{'HANDLER'}->{$handler}) ||
|
||||
!defined($$config{'HANDLER'}->{$handler}->{'DEVICE'}) ||
|
||||
!defined($$config{'HANDLER'}->{$handler}->{'DEVICE'}->{$device})) {
|
||||
if ($deletions) {
|
||||
closeDevice($device, $handler, $deletions);
|
||||
} else {
|
||||
print "-> Device '$device' is not in configuration. Use -force to close it.\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$handlers = $$config{'HANDLER'};
|
||||
|
||||
foreach my $handler (sort keys %{$handlers}) {
|
||||
if (defined($$handlers{$handler}->{'DEVICE'})) {
|
||||
@@ -928,6 +998,70 @@ sub applyConfiguration {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub applyConfigAssignments {
|
||||
my $config = shift;
|
||||
my $deletions = shift;
|
||||
|
||||
my $assignments = $CURRENT{'assign'};
|
||||
|
||||
foreach my $driver (keys %{$assignments}) {
|
||||
foreach my $target (keys %{$$assignments{$driver}}) {
|
||||
foreach my $group (keys %{$$assignments{$driver}->{$target}}) {
|
||||
my $luns = $$assignments{$driver}->{$target}->{$group}->{'LUNS'};
|
||||
my $inits = $$assignments{$driver}->{$target}->{$group}->{'INITIATORS'};
|
||||
|
||||
if (!defined($$config{'TARGET_DRIVER'}) ||
|
||||
!defined($$config{'TARGET_DRIVER'}->{$driver}) ||
|
||||
!defined($$config{'TARGET_DRIVER'}->{$driver}->{'TARGET'}) ||
|
||||
!defined($$config{'TARGET_DRIVER'}->{$driver}->{'TARGET'}->{$target}) ||
|
||||
!defined($$config{'TARGET_DRIVER'}->{$driver}->{'TARGET'}->{$target}->{'GROUP'}) ||
|
||||
!defined($$config{'TARGET_DRIVER'}->{$driver}->{'TARGET'}->{$target}->{'GROUP'}->{$group})) {
|
||||
if ($deletions) {
|
||||
removeGroup($group, $driver, $target);
|
||||
} else {
|
||||
print "-> Group '$group' is not in configuration. Use -force to remove.\n";
|
||||
}
|
||||
|
||||
next;
|
||||
}
|
||||
|
||||
my $def_group = $$config{'TARGET_DRIVER'}->{$driver}->{'TARGET'}->{$target}->{'GROUP'}->{$group};
|
||||
|
||||
foreach my $lun (keys %{$luns}) {
|
||||
my $device = $$luns{$lun};
|
||||
|
||||
if (!defined($$def_group{'LUN'}) ||
|
||||
!defined($$def_group{'LUN'}->{$lun}) ||
|
||||
!defined($$def_group{'LUN'}->{$lun}->{$device})) {
|
||||
if ($deletions) {
|
||||
removeLun($lun, $driver, $target, $group, $device);
|
||||
} else {
|
||||
print "-> Device '$device' at LUN '$lun' is not in configuration ".
|
||||
"for driver/target/group '$driver/$target/$group'. ".
|
||||
"Use -force to remove it.\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach my $init (@{$inits}) {
|
||||
if (!defined($$def_group{'INITIATOR'}) ||
|
||||
!defined($$def_group{'INITIATOR'}->{$init})) {
|
||||
if ($deletions) {
|
||||
removeInitiator($init, $driver, $target, $group);
|
||||
} else {
|
||||
print "-> Initiator '$init' is not in configuration ".
|
||||
"for driver/target/group '$driver/$target/$group'. ".
|
||||
"Use -force to remove it.\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$assignments = $$config{'TARGET_DRIVER'};
|
||||
|
||||
foreach my $driver (sort keys %{$assignments}) {
|
||||
if (!defined($CURRENT{'assign'}->{$driver})) {
|
||||
@@ -974,19 +1108,18 @@ sub applyConfiguration {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
my %_parameters;
|
||||
foreach my $item (keys %{$$targets{$target}}) {
|
||||
next if ($item eq 'GROUP');
|
||||
$_parameters{$item} = $$targets{$target}->{$item};
|
||||
}
|
||||
|
||||
my $parameters = configToParm(\%_parameters);
|
||||
|
||||
setTargetParameters($target, $driver, $parameters);
|
||||
}
|
||||
}
|
||||
|
||||
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 {
|
||||
@@ -1080,7 +1213,6 @@ sub listDevices {
|
||||
|
||||
listDevice($device) if ($device);
|
||||
|
||||
|
||||
}
|
||||
|
||||
sub listDevice {
|
||||
|
||||
Reference in New Issue
Block a user