[PATCH] Change tgt-admin to re-uses existing accounts

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Currently tgt-admin always deletes and add accounts. The effect
of the current behavior is that multiple targets can't use the
same incoming or outgoing account. This patch allows multiple
targets to use the same incoming and/or outgoing accounts and
supports a targets.conf with the following configuration:

<target iqn.1999-07.com.gurulabs:station1>
        backing-store /srv/iscsi-luns/station1
        incominguser station1 letmein
        outgoinguser server1 itsreallyme
</target>
<target iqn.1999-07.com.gurulabs:station2>
        backing-store /srv/iscsi-luns/station2
        incominguser station2 letmein
        outgoinguser server1 itsreallyme
</target>

Signed-off-by: Dax Kelson <dkelson@xxxxxxxxxxxx>
---
 scripts/tgt-admin |   34 ++++++++++++++++++++++++++++++----
 1 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/scripts/tgt-admin b/scripts/tgt-admin
index fa0db57..99754bf 100755
--- a/scripts/tgt-admin
+++ b/scripts/tgt-admin
@@ -89,6 +89,7 @@ my %tgtadm_output_tid;
 my %tgtadm_output_name;
 my @largest_tid;
 my $next_tid;
+my %existing_accounts;
 
 # Look up which targets are configured
 sub process_targets {
@@ -118,6 +119,21 @@ sub process_targets {
 	$next_tid = $largest_tid[$#largest_tid];
 }
 
+sub process_accounts {
+	# We need to run as root
+	if ( $> ) {
+		die("You must be root to run this program.\n");
+	}
+
+	my @show_account = `tgtadm --op show --mode account`;
+	# Here, we create a hash of accounts
+	foreach my $show_account_line (@show_account) {
+		if ( $show_account_line =~ m/^\s+(.*?)$/ ) {
+			$existing_accounts{$1} = 1;
+		}
+	}
+}
+
 # Parse config file(s)
 sub parse_configs {
 	# Parse the config
@@ -638,8 +654,12 @@ sub process_options {
 		foreach my $incominguser (@value_arr) {
 			my @userpass = split(/ /, $incominguser);
 			check_value($userpass[1]);
-			execute("tgtadm --lld $driver --mode account --op delete --user=$userpass[0]");
-			execute("tgtadm --lld $driver --mode account --op new --user=$userpass[0] --password=$userpass[1]");
+			# Only delete or create account if it doesn't already exist
+			if (! exists $existing_accounts{$userpass[0]} ) {
+				execute("tgtadm --lld $driver --mode account --op delete --user=$userpass[0]");
+				execute("tgtadm --lld $driver --mode account --op new --user=$userpass[0] --password=$userpass[1]");
+				$existing_accounts{$userpass[0]} = 1;
+			}
 			execute("tgtadm --lld $driver --mode account --op bind --tid=$next_tid --user=$userpass[0]");
 		}
 	}
@@ -652,8 +672,12 @@ sub process_options {
 		}
 		my @userpass = split(/ /, @$value[0]);
 		check_value($userpass[1]);
-		execute("tgtadm --lld $driver --mode account --op delete --user=$userpass[0]");
-		execute("tgtadm --lld $driver --mode account --op new --user=$userpass[0] --password=$userpass[1]");
+		# Only delete or create account if it doesn't already exist
+		if (! exists $existing_accounts{$userpass[0]} ) {
+			execute("tgtadm --lld $driver --mode account --op delete --user=$userpass[0]");
+			execute("tgtadm --lld $driver --mode account --op new --user=$userpass[0] --password=$userpass[1]");
+			$existing_accounts{$userpass[0]} = 1;
+		}
 		execute("tgtadm --lld $driver --mode account --op bind --tid=$next_tid --user=$userpass[0] --outgoing");
 	}
 
@@ -1205,12 +1229,14 @@ sub execute {
 
 if ($execute == 1) {
 	process_targets;
+	process_accounts;
 	parse_configs;
 	add_targets;
 	remove_targets;
 } elsif ($delete ne 0) {
 	delete_targets;
 } elsif ($update ne 0) {
+	process_accounts;
 	update_targets;
 } elsif ($dump == 1) {
 	dump_config;
-- 
1.6.6.1

--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux SCSI]     [Linux RAID]     [Linux Clusters]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]

  Powered by Linux