- 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:
Mark Buechler
2010-05-06 16:46:32 +00:00
parent c21f57bc97
commit c770d037bd
2 changed files with 196 additions and 64 deletions

View File

@@ -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;
}

View File

@@ -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 {