From 1d5b42604355172a4a2827cdfd510452274f09fd Mon Sep 17 00:00:00 2001 From: Ilia Ross Date: Sun, 3 May 2026 00:05:24 +0200 Subject: [PATCH] Add active nftables table clear action --- nftables/active.cgi | 12 +++++++++--- nftables/clear_table.cgi | 41 ++++++++++++++++++++++++++++++++++++++++ nftables/index.cgi | 4 ++-- nftables/lang/en | 5 +++++ 4 files changed, 57 insertions(+), 5 deletions(-) create mode 100755 nftables/clear_table.cgi diff --git a/nftables/active.cgi b/nftables/active.cgi index 4f7843b90..e8472dc68 100755 --- a/nftables/active.cgi +++ b/nftables/active.cgi @@ -36,11 +36,17 @@ else { my $is_saved = table_is_webmin_managed($t, \@saved_tables); my $table_url = "active_table.cgi?family=".urlize($t->{'family'}). "&name=".urlize($t->{'name'}); - my $actions = $is_saved ? "-" : - ui_link( + my @actions; + push(@actions, ui_link( "import_table.cgi?family=".urlize($t->{'family'}). "&name=".urlize($t->{'name'}), - $text{'active_import'}); + $text{'active_import'})) if (!$is_saved); + push(@actions, ui_link( + "clear_table.cgi?family=".urlize($t->{'family'}). + "&name=".urlize($t->{'name'}), + $text{'active_clear'})) + if (!table_is_externally_managed($t)); + my $actions = @actions ? join(" ", @actions) : "-"; print ui_columns_row([ ui_link($table_url, html_escape(nft_table_spec($t))), html_escape($flags), diff --git a/nftables/clear_table.cgi b/nftables/clear_table.cgi new file mode 100755 index 000000000..a42879b5d --- /dev/null +++ b/nftables/clear_table.cgi @@ -0,0 +1,41 @@ +#!/usr/bin/perl +# clear_table.cgi +# Remove one table from the active nftables ruleset + +require './nftables-lib.pl'; ## no critic +use strict; +use warnings; +our (%in, %text); +ReadParse(); +error_setup($text{'clear_err'}); + +my ($tables, $err) = get_active_nftables_save(); +error(text('active_failed', $err)) if ($err); + +my $table; +foreach my $t (@$tables) { + if ($t->{'family'} eq $in{'family'} && $t->{'name'} eq $in{'name'}) { + $table = $t; + last; + } + } +$table || error($text{'active_table_notable'}); + +if ($in{'confirm'}) { + $err = delete_active_table($table); + error(text('clear_failed', $err)) if ($err); + webmin_log("clear", "table", $table->{'name'}, + { 'family' => $table->{'family'} }); + redirect("active.cgi"); + } + +ui_print_header(undef, $text{'clear_title'}, "", "intro", 1, 1); +print "
\n"; +print ui_form_start("clear_table.cgi"); +print ui_hidden("family", $table->{'family'}); +print ui_hidden("name", $table->{'name'}); +print text('clear_confirm', + "".html_escape(nft_table_spec($table)).""),"

\n"; +print ui_form_end([ [ "confirm", $text{'active_clear'} ] ]); +print "

\n"; +ui_print_footer("active.cgi", $text{'active_return'}); diff --git a/nftables/index.cgi b/nftables/index.cgi index e4ad1cd8b..14c42f7d8 100755 --- a/nftables/index.cgi +++ b/nftables/index.cgi @@ -213,9 +213,9 @@ if (!@tables) { my $actions_html = ui_link("edit_chain.cgi?table=$in{'table'}&chain=". - urlize($c), $text{'index_cedit'})."
". + urlize($c), $text{'index_cedit'})." | ". ui_link("rename_chain.cgi?table=$in{'table'}&chain=". - urlize($c), $text{'index_crename'})."
". + urlize($c), $text{'index_crename'})." | ". ui_link("edit_rule.cgi?table=$in{'table'}&chain=". urlize($c)."&new=1", $text{'index_radd'}); $chains_html .= ui_checked_columns_row([ diff --git a/nftables/lang/en b/nftables/lang/en index 6593556b7..d6d06a03f 100644 --- a/nftables/lang/en +++ b/nftables/lang/en @@ -293,11 +293,16 @@ active_external=Externally managed active_unclaimed=Unclaimed active_import=Import Copy active_importdesc=Import this active table as a separate Webmin-managed table. +active_clear=Clear active_return=active ruleset active_table_title=Active Table active_table_err=Failed to view active table active_table_notable=No such active table selected active_table_summary=Active table details +clear_title=Clear active table +clear_err=Failed to clear active table +clear_confirm=Clear active table $1 from the live ruleset? This does not change Webmin's saved configuration. +clear_failed=Failed to clear active table: $1 import_title=Import active table import_header=Import table as Webmin-managed copy import_err=Failed to import active table