diff --git a/iscsi-target/atboot.cgi b/iscsi-target/atboot.cgi
new file mode 100755
index 000000000..f758b3215
--- /dev/null
+++ b/iscsi-target/atboot.cgi
@@ -0,0 +1,25 @@
+#!/usr/local/bin/perl
+# Change if the iscsi server is started at boot or not
+
+use strict;
+use warnings;
+require './iscsi-target-lib.pl';
+&foreign_require("init");
+our (%text, %config, %in);
+&ReadParse();
+&error_setup($text{'atboot_err'});
+
+my $old = &init::action_status($config{'init_name'});
+if ($old != 2 && $in{'boot'}) {
+ # Enable at boot
+ $old == 1 || &error(&text('atboot_einit',
+ "$config{'init_name'}"));
+ &init::enable_at_boot($config{'init_name'});
+ &webmin_log("atboot");
+ }
+elsif ($old == 2 && !$in{'boot'}) {
+ # Disable at boot
+ &init::disable_at_boot($config{'init_name'});
+ &webmin_log("delboot");
+ }
+&redirect("");
diff --git a/iscsi-target/edit_target.cgi b/iscsi-target/edit_target.cgi
index 7f67eac71..c4373eb29 100644
--- a/iscsi-target/edit_target.cgi
+++ b/iscsi-target/edit_target.cgi
@@ -154,7 +154,7 @@ print &ui_table_row($text{'target_iuser'},
$utable);
# Outgoing user
-my $u = &find_value($conf, "OutgoingUser");
+my $u = &find_value($target->{'members'}, "OutgoingUser");
my ($uname, $upass) = split(/\s+/, $u);
print &ui_table_row($text{'target_ouser'},
&ui_radio("ouser_def", $u ? 0 : 1,
diff --git a/iscsi-target/iscsi-target-lib.pl b/iscsi-target/iscsi-target-lib.pl
index adef6c127..deada81d8 100644
--- a/iscsi-target/iscsi-target-lib.pl
+++ b/iscsi-target/iscsi-target-lib.pl
@@ -21,6 +21,9 @@ return &text('check_econfig', "$config{'config_file'}")
if (!-r $config{'config_file'});
return &text('check_eietadm', "$config{'ietadm'}")
if (!&has_command($config{'ietadm'}));
+&foreign_require("init");
+return &text('check_einit', "$config{'init_name'}")
+ if (&init::action_status($config{'init_name'}) == 0);
return undef;
}
@@ -147,8 +150,8 @@ return ($indent ? "\t" : "").$dir->{'name'}." ".$dir->{'value'};
sub find
{
my ($conf, $name) = @_;
-my @t = grep { lc($_->{'name'}) eq lc($name) } @$conf;
-return wantarray ? @t : $t[0];
+my @rv = grep { lc($_->{'name'}) eq lc($name) } @$conf;
+return wantarray ? @rv : $rv[0];
}
# find_value(&config, name)
@@ -156,10 +159,10 @@ return wantarray ? @t : $t[0];
sub find_value
{
my ($conf, $name) = @_;
-return map { $_->{'value'} } &find($conf, $name);
+my @rv = map { $_->{'value'} } &find($conf, $name);
+return wantarray ? @rv : $rv[0];
}
-
# is_iscsi_target_running()
# Returns the PID if the server process is running, or 0 if not
sub is_iscsi_target_running
@@ -172,6 +175,7 @@ return &check_pid_file($config{'pid_file'});
sub find_host_name
{
my ($conf) = @_;
+my %hcount;
foreach my $t (&find_value($conf, "Target")) {
my ($host) = split(/:/, $t);
$hcount{$host}++;
@@ -189,4 +193,31 @@ return sprintf("iqn.%.4d-%.2d.%s", $tm[5]+1900, $tm[4]+1,
join(".", reverse(split(/\./, &get_system_hostname()))));
}
+# start_iscsi_server()
+# Run the init script to start the server
+sub start_iscsi_server
+{
+&foreign_require("init");
+my ($ok, $out) = &init::start_action($config{'init_name'});
+return $ok ? undef : $out;
+}
+
+# stop_iscsi_server()
+# Run the init script to stop the server
+sub stop_iscsi_server
+{
+&foreign_require("init");
+my ($ok, $out) = &init::stop_action($config{'init_name'});
+return $ok ? undef : $out;
+}
+
+# restart_iscsi_server()
+# Run the init script to stop and then start the server
+sub restart_iscsi_server
+{
+&foreign_require("init");
+my ($ok, $out) = &init::restart_action($config{'init_name'});
+return $ok ? undef : $out;
+}
+
1;
diff --git a/iscsi-target/lang/en b/iscsi-target/lang/en
index 0b8e4869b..a08f7d9fd 100644
--- a/iscsi-target/lang/en
+++ b/iscsi-target/lang/en
@@ -1,5 +1,6 @@
check_econfig=The iSCSI target configuration file $1 was not found on your system.
check_eietadm=The iSCSI target administration command $1 was not found on your system.
+check_einit=Bootup action $1 does not exist
index_title=iSCSI Target
index_clink=Maybe it is not installed, or your module configuration is incorrect.
@@ -59,3 +60,19 @@ manual_title=Edit Configuration File
manual_desc=Use the text box below to edit the iSCSI server configuration file $1. Be careful, as no validation will be performed on your input!
manual_err=Failed to save configuration file
manual_edata=No contents entered!
+
+start_err=Failed to start iSCSI server
+stop_err=Failed to stop iSCSI server
+restart_err=Failed to restart iSCSI server
+atboot_err=Failed to enable at boot
+atboot_einit=Init script $1 does not exist
+
+log_create_target=Created target $1
+log_delete_target=Deleted target $1
+log_modify_target=Modified target $1
+log_start=Started iSCSI server
+log_stop=Stopped iSCSI server
+log_restart=Restarted iSCSI server
+log_atboot=Enabled iSCSI server at boot time
+log_delboot=Disabled iSCSI server at boot time
+log_manual=Manually edited configuration file
diff --git a/iscsi-target/log_parser.pl b/iscsi-target/log_parser.pl
new file mode 100755
index 000000000..51a0f4728
--- /dev/null
+++ b/iscsi-target/log_parser.pl
@@ -0,0 +1,18 @@
+# log_parser.pl
+# Functions for parsing this module's logs
+
+do 'iscsi-target-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 "target") {
+ return &text('log_'.$action.'_'.$type, &html_escape($object));
+ }
+else {
+ return $text{'log_'.$action};
+ }
+}
+
diff --git a/iscsi-target/restart.cgi b/iscsi-target/restart.cgi
new file mode 100755
index 000000000..d7c9be9cb
--- /dev/null
+++ b/iscsi-target/restart.cgi
@@ -0,0 +1,12 @@
+#!/usr/local/bin/perl
+# Stop and then re-start the iSCSI server process
+
+use strict;
+use warnings;
+require './iscsi-target-lib.pl';
+our (%text);
+&error_setup($text{'restart_err'});
+my $err = &restart_iscsi_server();
+&error("".&html_escape($err)."") if ($err);
+&webmin_log("restart");
+&redirect("");
diff --git a/iscsi-target/save_target.cgi b/iscsi-target/save_target.cgi
index f704ab0a8..61e7e01fc 100644
--- a/iscsi-target/save_target.cgi
+++ b/iscsi-target/save_target.cgi
@@ -7,6 +7,7 @@ require './iscsi-target-lib.pl';
our (%text, %in);
&ReadParse();
&error_setup($text{'target_err'});
+&lock_file($config{'config_file'});
my $conf = &get_iscsi_config();
# Get the target
@@ -22,7 +23,7 @@ else {
if ($in{'delete'}) {
# Delete the target
- # XXX
+ &save_directive($conf, $conf, [ $target ], [ ]);
}
else {
# Validate and save directives, starting with target name
@@ -48,3 +49,9 @@ else {
# Save the target
# XXX
}
+
+&flush_file_lines($config{'config_file'});
+&unlock_file($config{'config_file'});
+&webmin_log($in{'delete'} ? 'delete' : $in{'new'} ? 'create' : 'modify',
+ 'target', $target->{'value'});
+&redirect("");
diff --git a/iscsi-target/start.cgi b/iscsi-target/start.cgi
new file mode 100755
index 000000000..3e9267c4a
--- /dev/null
+++ b/iscsi-target/start.cgi
@@ -0,0 +1,12 @@
+#!/usr/local/bin/perl
+# Start the iSCSI server process
+
+use strict;
+use warnings;
+require './iscsi-target-lib.pl';
+our (%text);
+&error_setup($text{'start_err'});
+my $err = &start_iscsi_server();
+&error("".&html_escape($err)."") if ($err);
+&webmin_log("start");
+&redirect("");
diff --git a/iscsi-target/stop.cgi b/iscsi-target/stop.cgi
new file mode 100755
index 000000000..49b464d13
--- /dev/null
+++ b/iscsi-target/stop.cgi
@@ -0,0 +1,12 @@
+#!/usr/local/bin/perl
+# Kill the running iscsi server process
+
+use strict;
+use warnings;
+require './iscsi-target-lib.pl';
+our (%text);
+&error_setup($text{'stop_err'});
+my $err = &stop_iscsi_server();
+&error($err) if ($err);
+&webmin_log("stop");
+&redirect("");