From 57e71aff37c1d13cfa5d367d3edeb9f3b8534afb Mon Sep 17 00:00:00 2001 From: Ilia Date: Sun, 10 Apr 2022 00:29:02 +0300 Subject: [PATCH 1/4] Add support for displaying service ports/protocols --- firewalld/firewalld-lib.pl | 30 ++++++++++++++++++++++++++++++ firewalld/index.cgi | 8 ++++++-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/firewalld/firewalld-lib.pl b/firewalld/firewalld-lib.pl index fa1c88142..e86853e9e 100644 --- a/firewalld/firewalld-lib.pl +++ b/firewalld/firewalld-lib.pl @@ -76,6 +76,36 @@ $out =~ s/\r|\n//g; return split(/\s+/, $out); } +# list_firewalld_service_desc(service) +# Returns a hashref of ports and protocols +# for in-built FirewallD service +sub list_firewalld_service_desc +{ +my ($service) = @_; +$service =~ s/[^A-Za-z0-9\-]//g; +# This is native way but too slow +# my $out = &backquote_command("$config{'firewall_cmd'} --service=".quotemeta($service)." --get-ports --permanent &1"); + +# Check for file in directory containing all services as xml files +my $services_dir = "/usr/lib/firewalld/services/"; +my $service_file = "$services_dir/$service.xml"; +my @ports; +my @protos; +if (-r $service_file) { + my $lref = &read_file_lines($service_file, 1); + foreach my $l (@{$lref}) { + $l =~ /\S+)["']\s+port=["'](?\d+)["']\/>/; + my $port = "$+{port}"; + my $proto = "$+{proto}"; + push(@ports, $port) if ($port); + push(@protos, $proto) if ($port && $proto); + } + } +@ports = &unique(@ports); +@protos = &unique(@protos); +return {'ports' => join(" $service:", @ports), 'protocols' => uc(join('/', @protos))}; +} + # list_firewalld_services_with_ports() # Returns an array of service names and descriptions sub list_firewalld_services_with_ports diff --git a/firewalld/index.cgi b/firewalld/index.cgi index 6d3975266..f5632be00 100755 --- a/firewalld/index.cgi +++ b/firewalld/index.cgi @@ -82,10 +82,14 @@ if (@{$zone->{'services'}} || @{$zone->{'ports'}}) { foreach my $s (@{$zone->{'services'}}) { my $url = "edit_serv.cgi?id=".&urlize($s). "&zone=".&urlize($zone->{'name'}); + my $sportsprotos = &list_firewalld_service_desc($s); + my $sport = $sportsprotos->{'ports'}; + my $sprotocols = $sportsprotos->{'protocols'}; + $sport = ":$sport" if ($sport); print &ui_checked_columns_row([ &ui_link($url, $text{'index_tservice'}), - &ui_link($url, $s), - "", + &ui_link($url, "$s$sport"), + $sprotocols || "", ], \@tds, "d", "service/".$s); } foreach my $p (@{$zone->{'ports'}}) { From 7994b5e62da16bcc7500dea0f2e9597191f5dcd4 Mon Sep 17 00:00:00 2001 From: Ilia Date: Sun, 10 Apr 2022 00:49:22 +0300 Subject: [PATCH 2/4] Add description when editing service; change output for multi ports --- firewalld/firewalld-lib.pl | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/firewalld/firewalld-lib.pl b/firewalld/firewalld-lib.pl index e86853e9e..683adeb64 100644 --- a/firewalld/firewalld-lib.pl +++ b/firewalld/firewalld-lib.pl @@ -103,7 +103,7 @@ if (-r $service_file) { } @ports = &unique(@ports); @protos = &unique(@protos); -return {'ports' => join(" $service:", @ports), 'protocols' => uc(join('/', @protos))}; +return {'ports' => join(":", @ports), 'protocols' => uc(join('/', @protos))}; } # list_firewalld_services_with_ports() @@ -120,7 +120,13 @@ foreach my $s (&list_firewalld_services()) { push(@rv, [ $s, $s." (".$n[2]." ".uc($n[3]).")" ]); } else { - push(@rv, [ $s, $s ]); + my $sportsprotos = &list_firewalld_service_desc($s); + my $sports = $sportsprotos->{'ports'}; + my $sprotocols = $sportsprotos->{'protocols'}; + my $sdesc; + $sports =~ s/:/, /g; + $sdesc = " ($sports $sprotocols)" if ($sports); + push(@rv, [ $s, "$s$sdesc" ]); } } return @rv; From 2fd31cdd387830045ff9c24e779d88409ac91a78 Mon Sep 17 00:00:00 2001 From: Ilia Date: Sun, 10 Apr 2022 00:55:06 +0300 Subject: [PATCH 3/4] Fix not to make protocol cell a link (for consistency) --- firewalld/index.cgi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firewalld/index.cgi b/firewalld/index.cgi index f5632be00..6112d168d 100755 --- a/firewalld/index.cgi +++ b/firewalld/index.cgi @@ -99,7 +99,7 @@ if (@{$zone->{'services'}} || @{$zone->{'ports'}}) { print &ui_checked_columns_row([ &ui_link($url, $text{'index_tport'}), &ui_link($url, $port), - &ui_link($url, uc($proto)), + uc($proto), ], \@tds, "d", "port/".$p); } foreach my $f (@{$zone->{'forward-ports'}}) { From 76adececf502423b77a8e6323d0b73711253ec16 Mon Sep 17 00:00:00 2001 From: Ilia Date: Sun, 10 Apr 2022 02:53:43 +0300 Subject: [PATCH 4/4] Display ports in parenthesis --- firewalld/firewalld-lib.pl | 3 +-- firewalld/index.cgi | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/firewalld/firewalld-lib.pl b/firewalld/firewalld-lib.pl index 683adeb64..4ce6b9839 100644 --- a/firewalld/firewalld-lib.pl +++ b/firewalld/firewalld-lib.pl @@ -103,7 +103,7 @@ if (-r $service_file) { } @ports = &unique(@ports); @protos = &unique(@protos); -return {'ports' => join(":", @ports), 'protocols' => uc(join('/', @protos))}; +return {'ports' => join(", ", @ports), 'protocols' => uc(join('/', @protos))}; } # list_firewalld_services_with_ports() @@ -124,7 +124,6 @@ foreach my $s (&list_firewalld_services()) { my $sports = $sportsprotos->{'ports'}; my $sprotocols = $sportsprotos->{'protocols'}; my $sdesc; - $sports =~ s/:/, /g; $sdesc = " ($sports $sprotocols)" if ($sports); push(@rv, [ $s, "$s$sdesc" ]); } diff --git a/firewalld/index.cgi b/firewalld/index.cgi index 6112d168d..0cb877439 100755 --- a/firewalld/index.cgi +++ b/firewalld/index.cgi @@ -85,7 +85,7 @@ if (@{$zone->{'services'}} || @{$zone->{'ports'}}) { my $sportsprotos = &list_firewalld_service_desc($s); my $sport = $sportsprotos->{'ports'}; my $sprotocols = $sportsprotos->{'protocols'}; - $sport = ":$sport" if ($sport); + $sport = " ($sport)" if ($sport); print &ui_checked_columns_row([ &ui_link($url, $text{'index_tservice'}), &ui_link($url, "$s$sport"),