From c0f0b544c144623e7a03bb82f5fa6290798bbb9c Mon Sep 17 00:00:00 2001 From: Jamie Cameron Date: Sun, 16 Sep 2012 23:10:16 -0700 Subject: [PATCH] Work on interfaces list / selection --- blue-theme/iscsi-client/images/ifaces.gif | Bin 0 -> 3306 bytes iscsi-client/add_conn.cgi | 5 ++- iscsi-client/add_form.cgi | 5 ++- iscsi-client/images/ifaces.gif | Bin 0 -> 362 bytes iscsi-client/index.cgi | 11 ++++-- iscsi-client/iscsi-client-lib.pl | 45 +++++++++++++++++++--- iscsi-client/lang/en | 5 +++ iscsi-client/list_conns.cgi | 13 +++++++ iscsi-client/log_parser.pl | 22 +++++++++++ 9 files changed, 94 insertions(+), 12 deletions(-) create mode 100644 blue-theme/iscsi-client/images/ifaces.gif create mode 100644 iscsi-client/images/ifaces.gif create mode 100755 iscsi-client/log_parser.pl diff --git a/blue-theme/iscsi-client/images/ifaces.gif b/blue-theme/iscsi-client/images/ifaces.gif new file mode 100644 index 0000000000000000000000000000000000000000..37b53455697546cc25f0bd92b2bc88fa3b6a3c29 GIT binary patch literal 3306 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'name'}.":".$_->{'target'}, $_ } print &ui_form_start("add_conn.cgi", "post"); print &ui_hidden("host", $in{'host'}); print &ui_hidden("port", $in{'port_def'} ? undef : $in{'port'}); +print &ui_hidden("iface", $in{'iface'}); print &ui_table_start($text{'conns_header'}, undef, 2); print &ui_table_row($text{'conns_host'}, $in{'host'}); print &ui_table_row($text{'conns_port'}, $in{'port_def'} ? $text{'default'} : $in{'port'}); +print &ui_table_row($text{'conns_iface'}, + $in{'iface'} || "$text{'conns_ifacedef'}"); print &ui_table_row($text{'add_target'}, &ui_select("target", undef, diff --git a/iscsi-client/images/ifaces.gif b/iscsi-client/images/ifaces.gif new file mode 100644 index 0000000000000000000000000000000000000000..8932c3fd00524524abc68c93057d676f180102d7 GIT binary patch literal 362 zcmZ?wbhEHbG+;1bc+9{sbLLEi4w?V||1&T!+~3>%OW1+o|NpeKG|}G-{~yKx#nFJ` zPZmZ727U$|pn9MQ1`G@=|2~}bT)o%g_1WG36Eyl#GUsKiT9@;Bp9Vv9Lk?@jy7x8j zpKtYcFwha|-2X(sLfT@!zf5A3f&|AY#S(`#vV2nyh-od2+IUm<9QU%0!#T`>EM$|@Uow^qxNfHJ2lW}BXB%epx8mZ^RHRvrFjxp_7DJ=T-T&FA;`wwKl~ zNu1^}eWBIjxxx!lQYX$>*|~a)(6&Ge4vw80JtsHTF$N!P@;Z^X&hm`Ka_fwY)lQyQ z4kTX>a$sPc(z@RIQj67%M^8>}pKtpn+wA?pk2arIbNJr>QDpjKtI>D<1Y3XB|BOYQv|G$L>5fHWQb(_ZlylRRiUK#bezo9LF()@IJw4qZ`P32tMh0sD DyML%S literal 0 HcmV?d00001 diff --git a/iscsi-client/index.cgi b/iscsi-client/index.cgi index 0c785b322..cfda56d37 100755 --- a/iscsi-client/index.cgi +++ b/iscsi-client/index.cgi @@ -15,12 +15,15 @@ if ($err) { } my @links = ( "edit_auth.cgi", "edit_timeout.cgi", - "edit_iscsi.cgi", "list_conns.cgi" ); + "edit_iscsi.cgi", "list_ifaces.cgi", + "list_conns.cgi" ); my @titles = ( $text{'auth_title'}, $text{'timeout_title'}, - $text{'iscsi_title'}, $text{'conns_title'} ); + $text{'iscsi_title'}, $text{'ifaces_title'}, + $text{'conns_title'} ); my @icons = ( "images/auth.gif", "images/timeout.gif", - "images/iscsi.gif", "images/conns.gif" ); -&icons_table(\@links, \@titles, \@icons, 4); + "images/iscsi.gif", "images/ifaces.gif", + "images/conns.gif" ); +&icons_table(\@links, \@titles, \@icons, 5); if ($config{'init_name'}) { # Show start at boot button diff --git a/iscsi-client/iscsi-client-lib.pl b/iscsi-client/iscsi-client-lib.pl index 5397ada39..d59a8a83d 100644 --- a/iscsi-client/iscsi-client-lib.pl +++ b/iscsi-client/iscsi-client-lib.pl @@ -163,14 +163,15 @@ foreach my $l (@lines) { return \@rv; } -# list_iscsi_targets(host, [port]) +# list_iscsi_targets(host, [port], [iface]) # Returns an array ref listing available targets on some host, or an error # message string sub list_iscsi_targets { -my ($host, $port) = @_; +my ($host, $port, $iface) = @_; my $cmd = "$config{'iscsiadm'} -m discovery -t sendtargets -p ". - quotemeta($host).($port ? ":".quotemeta($port) : ""); + quotemeta($host).($port ? ":".quotemeta($port) : ""). + ($iface ? " -I ".quotemeta($iface) : ""); &clean_language(); my $out = &backquote_command("$cmd 2>&1"); &reset_environment(); @@ -190,15 +191,16 @@ foreach my $l (@lines) { return \@rv; } -# create_iscsi_connection(host, [port], [&target]) +# create_iscsi_connection(host, [port], [iface], [&target]) # Attempts to connect to an iscsi server for the given target (or all targets) sub create_iscsi_connection { -my ($host, $port, $target) = @_; +my ($host, $port, $iface, $target) = @_; my $cmd = "$config{'iscsiadm'} -m node". ($target ? " -T ".quotemeta($target->{'name'}).":". quotemeta($target->{'target'}) : ""). " -p ".quotemeta($host).($port ? ":".quotemeta($port) : ""). + ($iface ? " -I ".quotemeta($iface) : ""). " --login"; &clean_language(); my $out = &backquote_command("$cmd 2>&1"); @@ -269,4 +271,37 @@ $out =~ s/\r?\n//; return $out; } +# list_iscsi_ifaces() +# Returns an array ref of details of all existing interfaces +sub list_iscsi_ifaces +{ +&clean_language(); +my $out = &backquote_command( + "$config{'iscsiadm'} -m iface -o show -P 1 2>/dev/null"); +&reset_environment(); +my @lines = split(/\r?\n/, $out); +if ($?) { + return $lines[0]; + } +my @rv; +my ($iface, $target); +foreach my $l (@lines) { + if ($l =~ /^Iface:\s+(\S+)/) { + $iface = { 'name' => $1, + 'targets' => [ ] }; + push(@rv, $iface); + } + elsif ($l =~ /Target:\s+(\S+):(\S+)/) { + $target = { 'name' => $1, + 'target' => $2 }; + push(@{$iface->{'targets'}}, $target); + } + elsif ($l =~ /Portal:\s+(\S+):(\d+)/) { + $target->{'ip'} = $1; + $target->{'port'} = $2; + } + } +return \@rv; +} + 1; diff --git a/iscsi-client/lang/en b/iscsi-client/lang/en index 386d62be2..499195ea4 100644 --- a/iscsi-client/lang/en +++ b/iscsi-client/lang/en @@ -66,6 +66,8 @@ iscsi_eretry=Missing or non-numeric number of times to re-try login iscsi_ecmds=Missing or non-numeric maximum commands queued per session iscsi_equeue=Missing or non-numeric maximum commands queued per device +ifaces_title=iSCSI Interfaces + conns_title=iSCSI Connections conns_elist=Failed to list connections : $1 conns_ip=Server IP @@ -82,6 +84,9 @@ conns_host=iSCSI server hostname or IP conns_port=iSCSI server port conns_start=Connect.. conns_return=list of connections +conns_iface=iSCSI interface +conns_ifacedef=Choose automatically +conns_ifaceerr=Failed to fetch interfaces : $1 add_title=Add iSCSI Connection add_err=Failed to add iSCSI connection diff --git a/iscsi-client/list_conns.cgi b/iscsi-client/list_conns.cgi index db1477e2e..8c20b049f 100755 --- a/iscsi-client/list_conns.cgi +++ b/iscsi-client/list_conns.cgi @@ -47,6 +47,19 @@ print &ui_table_row($text{'conns_host'}, print &ui_table_row($text{'conns_port'}, &ui_opt_textbox("port", undef, 5, $text{'default'}." (3260)")); +# Interface to use +my $ifaces = &list_iscsi_ifaces(); +if (ref($ifaces)) { + print &ui_table_row($text{'conns_iface'}, + &ui_select("iface", undef, + [ [ undef, "<".$text{'conns_ifacedef'}.">" ], + map { $_->{'name'} } @$ifaces ])); + } +else { + print &ui_table_row($text{'conns_iface'}, + &text('conns_ifaceerr', $ifaces)); + } + print &ui_table_end(); print &ui_form_end([ [ undef, $text{'conns_start'} ] ]); diff --git a/iscsi-client/log_parser.pl b/iscsi-client/log_parser.pl new file mode 100755 index 000000000..506e23011 --- /dev/null +++ b/iscsi-client/log_parser.pl @@ -0,0 +1,22 @@ +# log_parser.pl +# Functions for parsing this module's logs + +do 'iscsi-client-lib.pl'; + +# parse_webmin_log(user, script, action, type, object, ¶ms) +# Converts logged information from this module into human-readable form +sub parse_webmin_log +{ +my ($user, $script, $action, $type, $object, $p) = @_; +if ($type eq "connection") { + return &text('log_'.$action.'_'.$type, &html_escape($p->{'host'}), + &html_escape($p->{'target'})); + } +elsif ($type eq "connections") { + return &text('log_'.$action.'_'.$type, $object); + } +else { + return $text{'log_'.$action}; + } +} +