diff --git a/scstadmin/ChangeLog b/scstadmin/ChangeLog index c431b3fa3..aae494caa 100644 --- a/scstadmin/ChangeLog +++ b/scstadmin/ChangeLog @@ -1,3 +1,9 @@ +Changes since 1.0.6 + +- Added -resyncdev option to work with the new SCST resync_size option. +- SCST.pm: Added resyncDevice() +- SCST.pm: General cleanup. + Changes since 1.0.5 - Fixed a removeDevice() case when using -ForceConfig. diff --git a/scstadmin/scst-0.7.4/lib/SCST/SCST.pm b/scstadmin/scst-0.7.4/lib/SCST/SCST.pm index a4c73f123..49dc06220 100644 --- a/scstadmin/scst-0.7.4/lib/SCST/SCST.pm +++ b/scstadmin/scst-0.7.4/lib/SCST/SCST.pm @@ -2,7 +2,7 @@ package SCST::SCST; # Author: Mark R. Buechler # License: GPLv2 -# Copyright (c) 2005-2008 Mark R. Buechler +# Copyright (c) 2005-2009 Mark R. Buechler use 5.005; use IO::Handle; @@ -10,9 +10,6 @@ use IO::File; use strict; use Carp qw(cluck); -my $TRUE = 1; -my $FALSE = 0; - my $_SCST_DIR_ = '/proc/scsi_tgt'; my $_SCST_IO_ = $_SCST_DIR_.'/scsi_tgt'; my $_SCST_CDROM_IO_ = $_SCST_DIR_.'/dev_cdrom/dev_cdrom'; @@ -55,7 +52,7 @@ $IOTYPE_PHYSICAL = 100; $IOTYPE_VIRTUAL = 101; $IOTYPE_PERFORMANCE = 102; -$VERSION = 0.7.7; +$VERSION = 0.7.9; my $_SCST_MIN_MAJOR_ = 0; my $_SCST_MIN_MINOR_ = 9; @@ -129,7 +126,7 @@ my %_AVAILABLE_OPTIONS_ = ('WRITE_THROUGH' => 'WRITE_THROUGH', sub new { my $this = shift; my $debug = shift; - my $badVersion = $TRUE; + my $badVersion = 1; my $class = ref($this) || $this; my $self = {}; @@ -143,9 +140,10 @@ sub new { my($major, $minor, $release) = split(/\./, $scstVersion, 3); ($release, undef) = split(/\-/, $release) if ($release =~ /\-/); - $badVersion = $FALSE if (($major > $_SCST_MIN_MAJOR_) || - (($major == $_SCST_MIN_MAJOR_) && ($minor > $_SCST_MIN_MINOR_)) || - (($major == $_SCST_MIN_MAJOR_) && ($minor == $_SCST_MIN_MINOR_) && ($release >= $_SCST_MIN_RELEASE_))); + $badVersion = 0 if (($major > $_SCST_MIN_MAJOR_) || + (($major == $_SCST_MIN_MAJOR_) && ($minor > $_SCST_MIN_MINOR_)) || + (($major == $_SCST_MIN_MAJOR_) && ($minor == $_SCST_MIN_MINOR_) && + ($release >= $_SCST_MIN_RELEASE_))); croak("This module requires at least SCST version $_SCST_MIN_MAJOR_\.$_SCST_MIN_MINOR_\.". "$_SCST_MIN_RELEASE_ and version $scstVersion was found") if ($badVersion); @@ -157,7 +155,7 @@ sub scstVersion { my $self = shift; my $io = new IO::File $_SCST_VERSION_IO_, O_RDONLY; - return $TRUE if (!$io); + return 1 if (!$io); my $version = <$io>; chomp $version; @@ -189,10 +187,10 @@ sub groupExists { my $groups = $self->groups(); foreach my $_group (@{$groups}) { - return $TRUE if ($group eq $_group); + return 1 if ($group eq $_group); } - return $FALSE; + return 0; } sub addGroup { @@ -205,7 +203,7 @@ sub addGroup { if (!$io) { $self->{'error'} = "addGroup(): Failed to open handler IO '$_SCST_IO_'"; - return $TRUE; + return 1; } my $cmd = "add_group $group\n"; @@ -218,7 +216,7 @@ sub addGroup { close $io; - return $FALSE if ($self->{'debug'}); + return 0 if ($self->{'debug'}); return !$self->groupExists($group); } @@ -232,7 +230,7 @@ sub removeGroup { if (!$io) { $self->{'error'} = "removeGroup(): Failed to open handler IO '$_SCST_IO_'"; - return $TRUE; + return 1; } my $cmd = "del_group $group\n"; @@ -245,7 +243,7 @@ sub removeGroup { close $io; - return $FALSE if ($self->{'debug'}); + return 0 if ($self->{'debug'}); return $self->groupExists($group); } @@ -253,7 +251,7 @@ sub sgvStats { my $self = shift; my $io = new IO::File $_SCST_SGV_STATS_, O_RDONLY; my %stats; - my $first = $TRUE; + my $first = 1; if (!$io) { $self->{'error'} = "sgvStats(): Failed to open handler IO '$_SCST_IO_'"; @@ -264,7 +262,7 @@ sub sgvStats { chomp $line; if ($first || !$line) { - $first = $FALSE; + $first = 0; next; } @@ -303,7 +301,7 @@ sub sessions { my $self = shift; my $io = new IO::File $_SCST_SESSIONS_, O_RDONLY; my %sessions; - my $first = $TRUE; + my $first = 1; if (!$io) { $self->{'error'} = "sessions(): Failed to open handler IO '$_SCST_IO_'"; @@ -314,7 +312,7 @@ sub sessions { chomp $line; if ($first) { - $first = $FALSE; + $first = 0; next; } @@ -332,7 +330,7 @@ sub devices { my $self = shift; my $io = new IO::File $_SCST_IO_, O_RDONLY; my %devices; - my $first = $TRUE; + my $first = 1; if (!$io) { $self->{'error'} = "devices(): Failed to open handler IO '$_SCST_IO_'"; @@ -343,7 +341,7 @@ sub devices { chomp $line; if ($first) { - $first = $FALSE; + $first = 0; next; } @@ -362,7 +360,7 @@ sub handlerDevices { my $self = shift; my $handler = shift; my $handler_io = $_IO_MAP_{$handler}; - my $first = $TRUE; + my $first = 1; my $handler_name = $_REVERSE_MAP_{$handler}; my %devices; @@ -388,7 +386,7 @@ sub handlerDevices { chomp $line; if ($first) { - $first = $FALSE; + $first = 0; next; } @@ -425,9 +423,9 @@ sub handlerDeviceExists { my $devices = $self->handlerDevices($handler); return -1 if (!defined($devices)); - return $TRUE if (defined($$devices{$device})); + return 1 if (defined($$devices{$device})); - return $FALSE; + return 0; } sub handlerType { @@ -458,7 +456,6 @@ sub openDevice { ($options, $valid_opts) = $self->checkOptions($options); - if (!$valid_opts) { $self->{'error'} = "openDevice(): Invalid option(s) '$options' given for device '$device'"; return 1; @@ -489,7 +486,7 @@ sub openDevice { my $rc = $self->handler_private($handler_io, $cmd); - return $FALSE if ($self->{'debug'}); + return 0 if ($self->{'debug'}); return $rc if ($rc); $rc = !$self->handlerDeviceExists($handler, $device); @@ -513,12 +510,12 @@ sub closeDevice { if (!$handler_io) { $self->{'error'} = "closeDevice(): Failed to open handler IO '$handler_io'". " or handler '$handler_name' ($handler) invalid"; - return $TRUE; + return 1; } if (!$self->handlerExists($handler)) { $self->{'error'} = "closeDevice(): Handler '$handler_name' ($handler) does not exist"; - return $TRUE; + return 1; } if (!$self->handlerDeviceExists($handler, $device)) { @@ -530,7 +527,7 @@ sub closeDevice { my $rc = $self->handler_private($handler_io, $cmd); - return $FALSE if ($self->{'debug'}); + return 0 if ($self->{'debug'}); return $rc if ($rc); $rc = $self->handlerDeviceExists($handler, $device); @@ -543,6 +540,39 @@ sub closeDevice { return $rc; } +sub resyncDevice { + my $self = shift; + my $handler = shift; + my $device = shift; + my $handler_io = $_IO_MAP_{$handler}; + my $handler_name = $_REVERSE_MAP_{$handler}; + + if (!$handler_io) { + $self->{'error'} = "resyncDevice(): Failed to open handler IO '$handler_io'". + " or handler '$handler_name' ($handler) invalid"; + return 1; + } + + if (!$self->handlerExists($handler)) { + $self->{'error'} = "resyncDevice(): Handler '$handler_name' ($handler) does not exist"; + return 1; + } + + if (!$self->handlerDeviceExists($handler, $device)) { + $self->{'error'} = "resyncDevice(): Device '$device' does not exist"; + return 2; + } + + my $cmd = "resync_size $device\n"; + + my $rc = $self->handler_private($handler_io, $cmd); + + return 0 if ($self->{'debug'}); + return $rc if ($rc); + + return $rc; +} + sub userExists { my $self = shift; my $user = shift; @@ -553,10 +583,10 @@ sub userExists { return -1 if (!defined($users)); foreach my $_user (@{$users}) { - return $TRUE if ($user eq $_user); + return 1 if ($user eq $_user); } - return $FALSE; + return 0; } sub users { @@ -604,7 +634,7 @@ sub addUser { my $rc = $self->group_private($group, $_SCST_USERS_IO_, $cmd); - return $FALSE if ($self->{'debug'}); + return 0 if ($self->{'debug'}); return $rc if ($rc); $rc = !$self->userExists($user, $group); @@ -636,7 +666,7 @@ sub removeUser { my $rc = $self->group_private($group, $_SCST_USERS_IO_, $cmd); - return $FALSE if ($self->{'debug'}); + return 0 if ($self->{'debug'}); return $rc if ($rc); $rc = $self->userExists($user, $group); @@ -655,14 +685,14 @@ sub clearUsers { if (!$self->groupExists($group)) { $self->{'error'} = "clearUsers(): Group '$group' does not exist"; - return $TRUE; + return 1; } my $cmd = "clear\n"; my $rc = $self->group_private($group, $_SCST_USERS_IO_, $cmd); - return $FALSE if ($self->{'debug'}); + return 0 if ($self->{'debug'}); if ($rc) { $self->{'error'} = "clearUsers(): An error occured while clearing users from ". @@ -682,10 +712,10 @@ sub handlerExists { my $handlers = $self->handlers(); foreach my $_handler (@{$handlers}) { - return $TRUE if ($handler eq $_handler); + return 1 if ($handler eq $_handler); } - return $FALSE; + return 0; } sub handlers { @@ -718,19 +748,19 @@ sub groupDeviceExists { return -1 if (!defined($devices)); if (defined($lun)) { - return $TRUE if ($$devices{$device} eq $lun); + return 1 if ($$devices{$device} eq $lun); } else { - return $TRUE if (defined($$devices{$device})); + return 1 if (defined($$devices{$device})); } - return $FALSE; + return 0; } sub groupDevices { my $self = shift; my $group = shift; my %devices; - my $first = $TRUE; + my $first = 1; if (!$self->groupExists($group)) { $self->{'error'} = "groupDevices(): Group '$group' does not exist"; @@ -749,7 +779,7 @@ sub groupDevices { chomp $line; if ($first) { - $first = $FALSE; + $first = 0; next; } @@ -771,7 +801,7 @@ sub assignDeviceToGroup { if (!$self->groupExists($group)) { $self->{'error'} = "assignDeviceToGroup(): Group '$group' does not exist"; - return $TRUE; + return 1; } if ($self->groupDeviceExists($device, $group, $lun)) { @@ -784,7 +814,7 @@ sub assignDeviceToGroup { my $rc = $self->group_private($group, $_SCST_DEVICES_IO_, $cmd); - return $FALSE if ($self->{'debug'}); + return 0 if ($self->{'debug'}); return $rc if ($rc); $rc = !$self->groupDeviceExists($device, $group, $lun); @@ -807,12 +837,12 @@ sub assignDeviceToHandler { if (!$handler_io) { $self->{'error'} = "assignDeviceToHandler(): Failed to open handler IO '$handler_io' or ". "handler '$handler_name' ($handler) invalid"; - return $TRUE; + return 1; } if (!$self->handlerExists($handler)) { $self->{'error'} = "assignDeviceToHandler(): Handler '$handler_name' ($handler) does not exist"; - return $TRUE; + return 1; } if ($self->handlerDeviceExists($handler, $device)) { @@ -825,7 +855,7 @@ sub assignDeviceToHandler { my $rc = $self->scst_private($cmd); - return $FALSE if ($self->{'debug'}); + return 0 if ($self->{'debug'}); return $rc if($rc); $rc = !$self->handlerDeviceExists($handler, $device); @@ -845,7 +875,7 @@ sub removeDeviceFromGroup { if (!$self->groupExists($group)) { $self->{'error'} = "removeDeviceFromGroup(): Group '$group' does not exist"; - return $TRUE; + return 1; } if (!$self->groupDeviceExists($device, $group)) { @@ -857,7 +887,7 @@ sub removeDeviceFromGroup { my $rc = $self->group_private($group, $_SCST_DEVICES_IO_, $cmd); - return $FALSE if ($self->{'debug'}); + return 0 if ($self->{'debug'}); return $rc if ($rc); $rc = $self->groupDeviceExists($device, $group); @@ -874,13 +904,13 @@ sub clearGroupDevices { my $self = shift; my $group = shift; - return $TRUE if (!$self->groupExists($group)); + return 1 if (!$self->groupExists($group)); my $cmd = "clear\n"; my $rc = $self->group_private($group, $_SCST_DEVICES_IO_, $cmd); - return $FALSE if ($self->{'debug'}); + return 0 if ($self->{'debug'}); if ($rc) { $self->{'error'} = "clearGroupDevices(): An error occured while clearing devices from ". @@ -902,7 +932,7 @@ sub handler_private { if (!$io) { cluck("WARNING: SCST/SCST.pm: Failed to open handler IO $handler_io, assuming disabled"); - return $FALSE; + return 0; } if ($self->{'debug'}) { @@ -913,7 +943,7 @@ sub handler_private { close $io; - return $FALSE; + return 0; } sub scst_private { @@ -924,7 +954,7 @@ sub scst_private { if (!$io) { $self->{'error'} = "SCST/SCST.pm: Failed to open handler IO '$_SCST_IO_'"; - return $TRUE; + return 1; } if ($self->{'debug'}) { @@ -935,7 +965,7 @@ sub scst_private { close $io; - return $FALSE; + return 0; } sub group_private { @@ -948,7 +978,7 @@ sub group_private { if (!$io) { $self->{'error'} = "SCST/SCST.pm: Failed to open handler IO '".$_SCST_GROUPS_DIR_."/$group/".$file."'"; - return $TRUE; + return 1; } if ($self->{'debug'}) { @@ -959,7 +989,7 @@ sub group_private { close $io; - return $FALSE; + return 0; } sub checkOptions { @@ -967,15 +997,15 @@ sub checkOptions { my $options = shift; my $o_string; my $b_string; - my $bad = $FALSE; + my $bad = 0; - return undef, $TRUE if (!$options); + return undef, 1 if (!$options); foreach my $option (split(/[\s+|\,]/, $options)) { my $map = $_AVAILABLE_OPTIONS_{$option}; if (!$map) { - $bad = $TRUE; + $bad = 1; $b_string .= ",$option"; } else { $o_string .= ",$map"; @@ -984,12 +1014,12 @@ sub checkOptions { if ($bad) { $b_string =~ s/^\,//; - return $b_string, $FALSE; + return $b_string, 0; } $o_string =~ s/^\,//; - return $o_string, $TRUE; + return $o_string, 1; } sub errorString { diff --git a/scstadmin/scstadmin b/scstadmin/scstadmin index 391cff530..be9fa9a0a 100755 --- a/scstadmin/scstadmin +++ b/scstadmin/scstadmin @@ -1,11 +1,11 @@ #!/usr/bin/perl -$Version = 'SCST Configurator v1.0.5'; +$Version = 'SCST Configurator v1.0.6'; # Configures SCST # # Author: Mark R. Buechler # License: GPLv2 -# Copyright (c) 2005-2007 Mark R. Buechler +# Copyright (c) 2005-2009 Mark R. Buechler sub usage { @@ -24,16 +24,18 @@ Target Driver Operations -enable : Enable target mode for driver at specified WWN or host. -disable : Disable target mode for driver at specified WWN or host. -Devices Operations +Device Operations -adddev : Adds a device to a handler. -handler -path -options -blocksize + -resyncdev : Resync the size of a device with the initiator(s). + -handler -RemoveDev : Remove a device from a handler. -handler -Users Operations +User Operations -adduser : Adds a user to a security group. -group -RemoveUser : Delete a user from a security group. @@ -41,11 +43,11 @@ Users Operations -ClearUsers : Clear all users from a given security group. -group -Groups Operations +Group Operations -addgroup : Add a given group to available security groups. -RemoveGroup : Remove a give group from available security groups. -Assignments Operations +Assignment Operations -assigndev : Assign a given device to a security group. -group -lun @@ -169,6 +171,7 @@ sub getArgs { my $showSessions; my $addDev; my $devPath; + my $resyncDev; my $removeDev; my $addUser; my $removeUser; @@ -204,6 +207,7 @@ sub getArgs { 'addgroup=s' => \$addGroup, 'RemoveGroup=s' => \$removeGroup, 'assigndev=s' => \$assignDev, + 'resyncdev=s' => \$resyncDev, 'ReleaseDev=s' => \$releaseDev, 'ClearDevs' => \$clearDevs, 'handler=s' => \$handler, @@ -250,6 +254,11 @@ sub getArgs { usage(); } + if ($resyncDev && !$handler) { + print "Please specify -handler with -resyncdev.\n\n"; + usage(); + } + if ($removeDev && !$handler) { print "Please specify -handler with -RemoveDev.\n\n"; usage(); @@ -298,8 +307,8 @@ sub getArgs { $enable =~ tr/A-Z/a-z/; $disable =~ tr/A-Z/a-z/; $options =~ tr/a-z/A-Z/ if ($options); - if ((defined($showSessions) + defined($addDev) + defined($removeDev) + - defined($addUser) + defined($enable) + defined($disable) + + if ((defined($showSessions) + defined($addDev) + defined($resyncDev) + + defined($removeDev)+ defined($addUser) + defined($enable) + defined($disable) + defined($removeUser) + defined($clearUsers) + defined($assignDev) + defined($releaseDev) + defined($clearDevs) + defined($applyConfig) + defined($clearConfig) + defined($writeConfig) + defined($checkConfig)) > 1) { @@ -310,9 +319,9 @@ sub getArgs { $applyConfig = $_DEF_CONFIG_ if (defined($applyConfig) && !$applyConfig); $checkConfig = $_DEF_CONFIG_ if (defined($checkConfig) && !$checkConfig); - return ($enable, $disable, $addDev, $devPath, $devLun, $removeDev, $addUser, $removeUser, - $clearUsers, $addGroup, $removeGroup, $assignDev, $releaseDev, $clearDevs, - $handler, $group, $options, $blocksize, $applyConfig, $forceConfig, + return ($enable, $disable, $addDev, $devPath, $devLun, $resyncDev, $removeDev, $addUser, + $removeUser, $clearUsers, $addGroup, $removeGroup, $assignDev, $releaseDev, + $clearDevs, $handler, $group, $options, $blocksize, $applyConfig, $forceConfig, $clearConfig, $writeConfig, $checkConfig, $showSessions); } @@ -324,9 +333,9 @@ sub main { # We need to run as root if ( $> ) {die("This program must run as root.\n");} - my ($enable, $disable, $addDev, $devPath, $devLun, $removeDev, $addUser, $removeUser, - $clearUsers, $addGroup, $removeGroup, $assignDev, $releaseDev, $clearDevs, - $handler, $group, $options, $blocksize, $applyConfig, $forceConfig, + my ($enable, $disable, $addDev, $devPath, $devLun, $resyncDev, $removeDev, $addUser, + $removeUser, $clearUsers, $addGroup, $removeGroup, $assignDev, $releaseDev, + $clearDevs, $handler, $group, $options, $blocksize, $applyConfig, $forceConfig, $clearConfig, $writeConfig, $checkConfig, $showSessions) = getArgs(); $SCST = new SCST::SCST($_DEBUG_); @@ -367,6 +376,10 @@ sub main { $rc = addDevice($handler, $addDev, $devPath, $options, $blocksize); last SWITCH; }; + $resyncDev && do { + $rc = resyncDevice($handler, $resyncDev); + last SWITCH; + }; $removeDev && do { $rc = removeDevice($handler, $removeDev); last SWITCH; @@ -958,7 +971,7 @@ sub clearConfiguration { print "If this is not what you intend, press ctrl-c now. Waiting 10 seconds.\n\n"; sleep 10; - print "\nRemoving all user and groups:\n\n"; + print "\nRemoving all users and groups:\n\n"; foreach my $group (keys %GROUPS) { $errs += removeGroup($group) if ($group ne $_DEFAULT_GROUP_); } @@ -1040,6 +1053,29 @@ sub addDevice { return $FALSE; } +sub resyncDevice { + my $handler = shift; + my $device = shift; + + my $_handler = $_HANDLER_MAP_{$handler}; + my $htype = $SCST->handlerType($_handler); + + if (!defined($$DEVICES{$device})) { + print "WARNING: Device '$device' not defined.\n"; + return $TRUE; + } + + print "\t-> Resync'ing virtual device '$device'..\n"; + + if ($SCST->resyncDevice($_handler, $device)) { + print "WARNING: Failed to resync virtual device '$device': ". + $SCST->errorString()."\n"; + return $TRUE; + } + + return $FALSE; +} + sub removeDevice { my $handler = shift; my $device = shift;