Chain rename button
authorJamie Cameron <jcameron@webmin.com>
Thu, 25 Feb 2010 23:49:01 +0000 (15:49 -0800)
committerJamie Cameron <jcameron@webmin.com>
Thu, 25 Feb 2010 23:49:01 +0000 (15:49 -0800)
firewall/CHANGELOG
firewall/index.cgi
firewall/lang/en
firewall/save_policy.cgi

index 884e5cc..270063a 100644 (file)
@@ -32,3 +32,4 @@ Disallow rules on virtual interfaces, as they don't work.
 Removed invalid "Above" options for packet flow rate.
 ---- Changes since 1.500 ----
 Added a button to move rules to another chain.
+Added a button to rename an existing custom chain.
index 499de7f..2620a05 100755 (executable)
@@ -286,6 +286,7 @@ else {
                print "<table width=100%><tr>\n";
                local $d = $table->{'defaults'}->{$c};
                if ($d ne '-') {
+                       # Built-in chain
                        if ($access{'policy'}) {
                                # Change default button
                                print "<td width=33% nowrap>",
@@ -314,15 +315,18 @@ else {
                        print "</td>\n";
                        }
                else {
-                       # Delete chain and delete selected buttons
+                       # Custom chain
                        if ($access{'delchain'}) {
+                               # Delete and rename chain buttons
                                print "<td width=33%>",
                                   &ui_submit($text{'index_cdelete'}, "delete"),
+                                  "\n",
+                                  &ui_submit($text{'index_crename'}, "rename"),
                                   "</td>\n";
                                }
                        print "<td align=center width=33%>\n";
                        if (@rules) {
-                               # Delete chain button
+                               # Clear chain button
                                if ($access{'delchain'}) {
                                        print &ui_submit($text{'index_cclear'},
                                                         "clear"),"\n";
index ec80291..c2d2b40 100644 (file)
@@ -35,6 +35,7 @@ index_jump_=Do nothing
 index_jump=Run chain $1
 index_radd=Add Rule
 index_cdelete=Delete Chain
+index_crename=Rename Chain
 index_cclear=Clear All Rules
 index_cdeletesel=Delete Selected
 index_cmovesel=Move Selected
@@ -258,6 +259,7 @@ log_modify_rule=Modified rule in chain $1 in table $2
 log_delete_rule=Deleted rule in chain $1 in table $2
 log_move_rule=Moved rule in chain $1 in table $2
 log_delete_chain=Deleted chain $1 from table $2
+log_rename_chain=Renamed chain $1 in table $2
 log_clear_chain=Cleared chain $1 in table $2
 log_create_chain=Created chain $1 in table $2
 log_modify_chain=Set default action for chain $1 in table $2
@@ -321,3 +323,13 @@ move_chain=Current change
 move_dest=Destination chain
 move_ok=Move Now
 move_header=Rule move options
+
+rename_title=Rename Chain
+rename_count=Rules in chain
+rename_chain=Current name
+rename_name=New name
+rename_ok=Rename Now
+rename_header=Chain rename options
+rename_adjust=Modify other rules that jump to this chain?
+rename_none=None
+rename_ecannot=You are not allowed to rename chains
index 83ff5dc..9661eb7 100755 (executable)
@@ -60,6 +60,71 @@ elsif ($in{'delete'} || $in{'clear'}) {
        print "<input type=submit name=confirm value='$text{'delete_ok'}'>\n";
        print "</center></form>\n";
 
+       &ui_print_footer("index.cgi?table=$in{'table'}", $text{'index_return'});
+       }
+elsif ($in{'rename'} && $in{'newname'}) {
+       # Rename a chain
+       &lock_file($iptables_save_file);
+       $access{'delchain'} || &error($text{'rename_ecannot'});
+       $in{'newname'} =~ /^\S+$/ || &error($text{'new_ename'});
+
+       # Change the chain on each rule
+       foreach $r (@{$table->{'rules'}}) {
+               if ($r->{'chain'} eq $in{'chain'}) {
+                       $r->{'chain'} = $in{'newname'};
+                       }
+               }
+
+       # Rename the default
+       $table->{'defaults'}->{$in{'newname'}} =
+               $table->{'defaults'}->{$in{'chain'}};
+       delete($table->{'defaults'}->{$in{'chain'}});
+
+       # Adjust any other rules
+       if ($in{'adjust'}) {
+               foreach $r (@{$table->{'rules'}}) {
+                       if ($r->{'j'} && $r->{'j'}->[1] eq $in{'chain'}) {
+                               $r->{'j'}->[1] = $in{'newname'};
+                               }
+                       }
+               }
+
+       &run_before_command();
+       &save_table($table);
+       &run_after_command();
+       &copy_to_cluster();
+       &unlock_file($iptables_save_file);
+       &webmin_log("rename", "chain", undef, { 'chain' => $in{'chain'},
+                                               'table' => $table->{'name'} });
+       &redirect("index.cgi?table=$in{'table'}");
+       }
+elsif ($in{'rename'}) {
+       # Show chain rename form
+       &ui_print_header(undef, $text{'rename_title'}, "");
+
+       print &ui_form_start("save_policy.cgi");
+       print &ui_hidden("table", $in{'table'});
+       print &ui_hidden("chain", $in{'chain'});
+       print &ui_hidden("rename", 1);
+       print &ui_table_start($text{'rename_header'}, undef, 2);
+
+       # Number of rules and old name
+       @rules = grep { $_->{'chain'} eq $in{'chain'} } @{$table->{'rules'}};
+       print &ui_table_row($text{'rename_chain'}, $in{'chain'});
+       print &ui_table_row($text{'rename_count'},
+               scalar(@rules) || $text{'rename_none'});
+
+       # Destination chain
+       print &ui_table_row($text{'rename_name'},
+               &ui_textbox("newname", undef, 20));
+
+       # Adjust other rules?
+       print &ui_table_row(" ",
+               &ui_checkbox("adjust", 1, $text{'rename_adjust'}, 1));
+
+       print &ui_table_end();
+       print &ui_form_end([ [ undef, $text{'rename_ok'} ] ]);
+
        &ui_print_footer("index.cgi?table=$in{'table'}", $text{'index_return'});
        }
 elsif ($in{'delsel'}) {