From c770d037bd43f1a42fbf2c8019f850b3a0dd18dd Mon Sep 17 00:00:00 2001 From: Mark Buechler Date: Thu, 6 May 2010 16:46:32 +0000 Subject: [PATCH] - 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 --- scstadmin/scst-0.9.00/lib/SCST/SCST.pm | 44 ++--- scstadmin/scstadmin.sysfs | 216 ++++++++++++++++++++----- 2 files changed, 196 insertions(+), 64 deletions(-) diff --git a/scstadmin/scst-0.9.00/lib/SCST/SCST.pm b/scstadmin/scst-0.9.00/lib/SCST/SCST.pm index ac934df3b..f2343b510 100644 --- a/scstadmin/scst-0.9.00/lib/SCST/SCST.pm +++ b/scstadmin/scst-0.9.00/lib/SCST/SCST.pm @@ -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; } diff --git a/scstadmin/scstadmin.sysfs b/scstadmin/scstadmin.sysfs index 67bb53eb0..88447ff7d 100755 --- a/scstadmin/scstadmin.sysfs +++ b/scstadmin/scstadmin.sysfs @@ -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 {