diff --git a/firewalld/firewalld-lib.pl b/firewalld/firewalld-lib.pl index fa1c88142..4ce6b9839 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(", ", @ports), 'protocols' => uc(join('/', @protos))}; +} + # list_firewalld_services_with_ports() # Returns an array of service names and descriptions sub list_firewalld_services_with_ports @@ -90,7 +120,12 @@ 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; + $sdesc = " ($sports $sprotocols)" if ($sports); + push(@rv, [ $s, "$s$sdesc" ]); } } return @rv; diff --git a/firewalld/index.cgi b/firewalld/index.cgi index 6d3975266..0cb877439 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'}}) { @@ -95,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'}}) {