From 90357a4cb7d25e4d973262dadc6577bd15edf403 Mon Sep 17 00:00:00 2001 From: Mark Buechler Date: Tue, 3 Aug 2010 17:39:05 +0000 Subject: [PATCH] - Finish up list functions, except for list_sessions. - Allow '0' named driver, target, groups, luns and attributes. git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1921 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- .../scst-0.9.00/lib/SCST/SCST.pm | 2 + scstadmin/scstadmin.sysfs/scstadmin | 252 +++++++++++------- 2 files changed, 162 insertions(+), 92 deletions(-) diff --git a/scstadmin/scstadmin.sysfs/scst-0.9.00/lib/SCST/SCST.pm b/scstadmin/scstadmin.sysfs/scst-0.9.00/lib/SCST/SCST.pm index d10c24a79..ecde0f160 100644 --- a/scstadmin/scstadmin.sysfs/scst-0.9.00/lib/SCST/SCST.pm +++ b/scstadmin/scstadmin.sysfs/scst-0.9.00/lib/SCST/SCST.pm @@ -2217,6 +2217,8 @@ sub lunAttributes { my $r = SCST_ROOT; $linked =~ s/\.\.\/\.\.\/\.\.\/\.\.\/\.\.\/\.\.\/\.\.\//\/$r\//; + $linked =~ s/\.\.\/\.\.\/\.\.\/\.\.\/\.\.\//\/$r\//; + $linked =~ s/^\/+/\//; $attributes{$attribute}->{'static'} = TRUE; $attributes{$attribute}->{'value'} = $linked; diff --git a/scstadmin/scstadmin.sysfs/scstadmin b/scstadmin/scstadmin.sysfs/scstadmin index 5033664fa..af16e78ad 100755 --- a/scstadmin/scstadmin.sysfs/scstadmin +++ b/scstadmin/scstadmin.sysfs/scstadmin @@ -148,8 +148,8 @@ Target Driver Operations -issue_lip : Issue LIP on all target-enabled FC fabrics. Options - -nonkey : When writing a configuration file, store non-key - attributes as well. + -nonkey : When writing a configuration file or listing + attributes, store/print non-key attributes as well. -force : Force all configuration changes, even deletions (DANGER!). -noprompt : Do not prompt or pause. Use with caution! @@ -376,97 +376,98 @@ sub getArgs { usage(); } - if ($clearConfig && !$force) { + if (defined($clearConfig) && !defined($force)) { print "Please specify -force with -clear_config.\n"; usage(); } - if ($listTargetAttr && !$driver) { + if (defined($listTargetAttr) && !defined($driver)) { print "Please specify -driver with -list_tgt_attr.\n"; usage(); } - if ($listLunAttr && (!$driver || !$target || !$group)) { + if (defined($listLunAttr) && (!defined($driver) || !defined($target))) { print "Please specify -driver -target and -group with -list_lun_attr.\n"; usage(); } - if ($listInitiatorAttr && (!$driver || !$target || !$group)) { + if (defined($listInitiatorAttr) && (!defined($driver) || !defined($target) || !defined($group))) { print "Please specify -driver -target and -group with -list_ini_attr.\n"; usage(); } - if ($setScstAttr && !$attributes) { + if (defined($setScstAttr) && !defined($attributes)) { print "Please specify -attributes with -set_scst_attr.\n"; usage(); } - if ($setHandlerAttr && !$attributes) { + if (defined($setHandlerAttr) && !defined($attributes)) { print "Please specify -attributes with -set_hnd_attr.\n"; usage(); } - if ($setDeviceAttr && !$attributes) { + if (defined($setDeviceAttr) && !defined($attributes)) { print "Please specify -attributes with -set_dev_attr.\n"; usage(); } - if ($setDriverAttr && !$attributes) { + if (defined($setDriverAttr) && !defined($attributes)) { print "Please specify -attributes with -set_drv_attr.\n"; usage(); } - if ($setTargetAttr && (!$driver || !$attributes)) { + if (defined($setTargetAttr) && (!defined($driver) || !defined($attributes))) { print "Please specify -driver and -attributes with -set_tgt_attr.\n"; usage(); } - if ($setLunAttr && (!$driver || !$target || !$group || !$attributes)) { + if (defined($setLunAttr) && + (!defined($driver) || !defined($target) || !defined($group) || !defined($attributes))) { print "Please specify -driver -target -group and -attributes with -set_lun_attr.\n"; usage(); } - if ($setDeviceAttr && (!$driver || !$target || !$group || !$attributes)) { + if (defined($setDeviceAttr) && + (!defined($driver) || !defined($target) || !defined($group) || !defined($attributes))) { print "Please specify -driver -target -group and -attributes with -set_ini_attr.\n"; usage(); } - if (($openDev || $closeDev) && !$handler) { + if ((defined($openDev) || defined($closeDev)) && !defined($handler)) { print "Please specify -handler with -open_dev/-close_dev.\n"; usage(); } - if (($addGroup || $removeGroup) && (!$driver || !$target)) { + if ((defined($addGroup) || defined($removeGroup)) && + (!defined($driver) || !defined($target))) { print "Please specify -driver and -target with -add_group/-remove_group.\n"; usage(); } - if (($addInitiator || $removeInitiator || $clearInitiators) && - (!$target || !$driver || !$group)) { + if ((defined($addInitiator) || defined($removeInitiator) || defined($clearInitiators)) && + (!defined($target) || !defined($driver) || !defined($group))) { print "Please specify -driver -target and -group with ". "-add_init/-remove_init/-clear_inits.\n"; usage(); } - if ($moveInitiator && (!$driver || !$target || !$group || !$to)) { + if (defined($moveInitiator) && + (!defined($driver) || !defined($target) || !defined($group) || !defined($to))) { print "Please specify -driver -target -group and -to with -move_init.\n"; usage(); } - if (($addLun || $replaceLun || $removeLun) && (!$driver || !$target || !$group || !$device)) { + if ((defined($addLun) || defined($replaceLun) || defined($removeLun)) && + (!defined($driver) || !defined($target) || !defined($group) || !defined($device))) { print "Please specify -driver -target -group and -device with -add_lun/-replace_lun.\n"; usage(); } - if ($clearLuns && (!$driver || !$target || !$group)) { + if (defined($clearLuns) && (!defined($driver) || !defined($target) || !defined($group))) { print "Please specify -driver -target and -group with -remove_lun/-clear_luns.\n"; usage(); } - if ($nonkey && !defined($writeConfig)) { - print "Option -nonkey ignored since -writeConfig was not specified.\n"; - } - $applyConfig = $_DEF_CONFIG_ if (defined($applyConfig) && !$applyConfig); $checkConfig = $_DEF_CONFIG_ if (defined($checkConfig) && !$checkConfig); @@ -529,21 +530,21 @@ sub main { my $all_good; SWITCH: { - $applyConfig && do { + defined($applyConfig) && do { $rc = checkConfiguration($applyConfig); immediateExit("Configuration has errors, aborting.") if ($rc); $rc = applyConfiguration($applyConfig, $force); last SWITCH; }; - $checkConfig && do { + defined($checkConfig) && do { $rc = checkConfiguration($checkConfig); last SWITCH; }; - $writeConfig && do { + defined($writeConfig) && do { $rc = writeConfiguration($writeConfig, $nonkey); last SWITCH; }; - $clearConfig && do { + defined($clearConfig) && do { $rc = clearConfiguration($noprompt, $force); last SWITCH; }; @@ -567,127 +568,127 @@ sub main { $rc = listGroups($driver, $target, $listGroup); $all_good = TRUE; }; - $listSessions && do { + defined($listSessions) && do { $rc = listSessions(); $all_good = TRUE; }; - $listScstAttr && do { + defined($listScstAttr) && do { $rc = listScstAttributes($nonkey); $all_good = TRUE; }; - $listHandlerAttr && do { + defined($listHandlerAttr) && do { $rc = listHandlerAttributes($listHandlerAttr, $nonkey); $all_good = TRUE; }; - $listDeviceAttr && do { + defined($listDeviceAttr) && do { $rc = listDevice($listDeviceAttr, $nonkey); $all_good = TRUE; }; - $listDriverAttr && do { - $rc = listDriverAttributes($listHandlerAttr, $nonkey); + defined($listDriverAttr) && do { + $rc = listDriverAttributes($listDriverAttr, $nonkey); $all_good = TRUE; }; - $listTargetAttr && do { + defined($listTargetAttr) && do { $rc = listTargetAttributes($driver, $listTargetAttr, $nonkey); $all_good = TRUE; }; - $listLunAttr && do { + defined($listLunAttr) && do { $rc = listLunAttributes($driver, $target, $group, $listLunAttr, $nonkey); $all_good = TRUE; }; - $listInitiatorAttr && do { + defined($listInitiatorAttr) && do { $rc = listInitiatorAttributes($driver, $target, $group, $listInitiatorAttr, $nonkey); $all_good = TRUE; }; - $setScstAttr && do { + defined($setScstAttr) && do { $rc = setScstAttributes($attributes); last SWITCH; }; - $setHandlerAttr && do { + defined($setHandlerAttr) && do { $rc = setHandlerAttributes($setHandlerAttr, $attributes); last SWITCH; }; - $setDeviceAttr && do { + defined($setDeviceAttr) && do { $rc = setDeviceAttributes($setDeviceAttr, $attributes); last SWITCH; }; - $setDriverAttr && do { + defined($setDriverAttr) && do { $rc = setDriverAttributes($setDriverAttr, $attributes, FALSE); last SWITCH; }; - $setTargetAttr && do { + defined($setTargetAttr) && do { $rc = setTargetAttributes($driver, $setTargetAttr, $attributes, FALSE); last SWITCH; }; - $setLunAttr && do { + defined($setLunAttr) && do { $rc = setLunAttributes($driver, $target, $setLunAttr, $attributes, $group); last SWITCH; }; - $setInitiatorAttr && do { + defined($setInitiatorAttr) && do { $rc = setInitiatorAttributes($driver, $target, $group, $setInitiatorAttr, $attributes); last SWITCH; }; - $openDev && do { + defined($openDev) && do { $rc = openDevice($handler, $openDev, $attributes); last SWITCH; }; - $closeDev && do { + defined($closeDev) && do { $rc = closeDevice($handler, $closeDev, $force); last SWITCH; }; - $resyncDev && do { + defined($resyncDev) && do { $rc = resyncDevice($resyncDev); last SWITCH; }; - $addGroup && do { + defined($addGroup) && do { $rc = addGroup($driver, $target, $addGroup); last SWITCH; }; - $removeGroup && do { + defined($removeGroup) && do { $rc = removeGroup($driver, $target, $removeGroup, $force); last SWITCH; }; - $addInitiator && do { + defined($addInitiator) && do { $rc = addInitiator($driver, $target, $addInitiator, $group); last SWITCH; }; - $removeInitiator && do { + defined($removeInitiator) && do { $rc = removeInitiator($driver, $target, $group, $removeInitiator); last SWITCH; }; - $moveInitiator && do { + defined($moveInitiator) && do { $rc = moveInitiator($driver, $target, $group, $moveInitiator, $to); last SWITCH; }; - $clearInitiators && do { + defined($clearInitiators) && do { $rc = clearInitiators($driver, $target, $group); last SWITCH; }; - $addLun && do { + defined($addLun) && do { $rc = addLun($driver, $target, $device, $addLun, $attributes, $group); last SWITCH; }; - $removeLun && do { + defined($removeLun) && do { $rc = removeLun($driver, $target, $device, $removeLun, $group); last SWITCH; }; - $replaceLun && do { + defined($replaceLun) && do { $rc = replaceLun($driver, $target, $group, $replaceLun, $device, $attributes); last SWITCH; }; - $clearLuns && do { + defined($clearLuns) && do { $rc = clearLuns($driver, $target, $group); last SWITCH; }; - $enableTarget && do { + defined($enableTarget) && do { $rc = enableTarget($enableTarget); last SWITCH; }; - $disableTarget && do { + defined($disableTarget) && do { $rc = disableTarget($disableTarget); last SWITCH; }; - $issueLip && do { + defined($issueLip) && do { $rc = issueLip(); last SWITCH; }; @@ -1822,7 +1823,7 @@ sub listDevices { my $device = shift; my $nonkey = shift; - return listDevice($device, $nonkey) if ($device); + return listDevice($device, $nonkey) if (defined($device)); return listHandler(); } @@ -1843,7 +1844,7 @@ sub listDevice { sub listDrivers { my $driver = shift; - return listTargets($driver, undef) if ($driver); + return listTargets($driver, undef) if (defined($driver)); my $drivers = $SCST->drivers(); @@ -1869,7 +1870,7 @@ sub listTargets { my $target = shift; my %toprint; - return listGroups($driver, $target, undef) if ($target && $driver); + return listGroups($driver, $target, undef) if (defined($target) && defined($driver)); my $got_driver = defined($driver); @@ -1966,24 +1967,30 @@ sub listGroup { print "\t(none)\n"; } - print "\nAssigned Initiators:\n\n"; + if (defined($group)) { + print "\nAssigned Initiators:\n\n"; - if ($#{$initiators} > -1) { - print "\tInitiator\n"; - print "\t"; - for (my $x = 0; $x < $l_initiator; $x++) { - print "-"; - } - print "\n"; + if ($#{$initiators} > -1) { + print "\tInitiator\n"; + print "\t"; + for (my $x = 0; $x < $l_initiator; $x++) { + print "-"; + } + print "\n"; - foreach my $initiator (@{$initiators}) { - print "\t$initiator\n"; + foreach my $initiator (@{$initiators}) { + print "\t$initiator\n"; + } + } else { + print "\t(none)\n"; } - } else { - print "\t(none)\n"; } } else { - print "Group '$group' has no associated LUNs or initiators.\n"; + if (defined($group)) { + print "Group '$group' has no associated LUNs or initiators.\n"; + } else { + print "Driver/target '$driver/$target' has no associated LUNs.\n"; + } } } @@ -1994,7 +2001,7 @@ sub listGroups { my $group = shift; my $found = FALSE; - if ($group && $driver && $target) { + if (defined($group) && defined($driver) && defined($target)) { return listGroup($driver, $target, $group); } @@ -2013,15 +2020,20 @@ sub listGroups { $target = $_target if (!$got_target); if ($target eq $_target) { + $found++; + print "Driver: $driver\n"; + print "Target: $target\n\n"; + + listGroup($driver, $target, undef); + + print "\n"; + my $groups = $SCST->groups($driver, $target); foreach my $_group (@{$groups}) { $group = $_group if (!$got_group); if ($group eq $_group) { - $found++; - print "Driver: $driver\n"; - print "Target: $target\n"; - print "Group : $group\n\n"; + print "Group: $group\n\n"; listGroup($driver, $target, $group); @@ -2116,7 +2128,7 @@ sub listAttributes { } } - printf("\t%-*s %-*s %-*s %-*s\n", $l_attr, 'Attribute', $l_value, + printf("\t%-*s %-*s %-*s %-*s\n", $l_attr, 'Attribute', $l_value, 'Value', 9, 'Writable', 3, 'KEY'); print "\t"; for (my $x = 0; $x < ($l_attr + $l_value + 27); $x++) { @@ -2135,11 +2147,11 @@ sub listAttributes { my $static = ($$attributes{$attribute}->{'static'}) ? 'No' : 'Yes'; $value = '' if ($value eq ''); if ($first) { - printf("\t%-*s %-*s %-*s %-*s\n", + printf("\t%-*s %-*s %-*s %-*s\n", $l_attr, $attribute, $l_value, $value, 9, $static, 3, 'Yes'); $first = FALSE; } else { - printf("\t%-*s %-*s %-*s %-*s\n", + printf("\t%-*s %-*s %-*s %-*s\n", $l_attr, '', $l_value, $value, 9, $static, 3, 'Yes'); } @@ -2147,15 +2159,15 @@ sub listAttributes { } } elsif ($nonkey) { my $value = $$attributes{$attribute}->{'value'}; - next if (ref($value) eq 'HASH'); - $value = 'N/A' if (!defined($value)); + next if ((ref($value) eq 'HASH') || (ref($value) eq 'ARRAY')); + $value = '' if (!defined($value)); $value = '' if ($value eq ''); my $static = ($$attributes{$attribute}->{'static'}) ? 'No' : 'Yes'; if ($first) { - printf("\t%-*s %-*s %-*s %-*s\n", + printf("\t%-*s %-*s %-*s %-*s\n", $l_attr, $attribute, $l_value, $value, 9, $static, 3, 'No'); } else { - printf("\t%-*s %-*s %-*s %-*s\n", + printf("\t%-*s %-*s %-*s %-*s\n", $l_attr, '', $l_value, $value, 9, $static, 3, 'No'); } @@ -2183,34 +2195,90 @@ sub listScstAttributes { sub listHandlerAttributes { my $handler = shift; + my $nonkey = shift; + my $attributes = $SCST->handlerAttributes($handler); + + if (!scalar(keys %{$attributes})) { + print "No such handler '$handler' found.\n"; + return; + } + + return listAttributes($attributes, $nonkey); } sub listDriverAttributes { my $driver = shift; - + my $nonkey = shift; + + my $attributes = $SCST->driverAttributes($driver); + + if (!scalar(keys %{$attributes})) { + print "No such driver '$driver' found.\n"; + return; + } + + return listAttributes($attributes, $nonkey); } sub listTargetAttributes { - my $target = shift; my $driver = shift; + my $target = shift; + my $nonkey = shift; + my $attributes = $SCST->targetAttributes($driver, $target); + + if (!scalar(keys %{$attributes})) { + print "No such driver/target '$driver/$target' found.\n"; + return; + } + + return listAttributes($attributes, $nonkey); } sub listLunAttributes { - my $lun = shift; my $driver = shift; my $target = shift; my $group = shift; + my $lun = shift; + my $nonkey = shift; + my $attributes = $SCST->lunAttributes($driver, $target, $lun, $group); + + if (!scalar(keys %{$attributes})) { + if (defined($group)) { + print "No such driver/target/group/lun '$driver/$target/$group/$lun' found.\n"; + } else { + print "No such driver/target/lun '$driver/$target/$lun' found.\n"; + } + return; + } + + return listAttributes($attributes, $nonkey); } sub listInitiatorAttributes { - my $initiator = shift; my $driver = shift; my $target = shift; my $group = shift; + my $initiator = shift; + my $nonkey = shift; + my $attributes = $SCST->initiatorAttributes($driver, $target, $group, $initiator); + + # As if writing, initiators didn't have attributes. This will + # allow us to support it in the future. + if ($SCST->errorString() =~ /Not a directory/) { + print "Initiators do not (yet) have attributes.\n"; + return; + } + + if (!scalar(keys %{$attributes})) { + print "No such driver/target/group/initiator '$driver/$target/$group/$initiator' found.\n"; + return; + } + + return listAttributes($attributes, $nonkey); } ####################################################################