--- /dev/null
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use PVE::Firewall;
+
+my ($pve_fw_parsed_macros, $pve_fw_macro_descr) = PVE::Firewall::get_macros();
+
+#use Data::Dumper;
+#print Dumper($pve_fw_macro_descr);
+#print Dumper($pve_fw_parsed_macros);
+
+foreach my $name (sort keys %$pve_fw_parsed_macros) {
+ my $descr = $pve_fw_macro_descr->{$name};
+ die "no description for macro '$name'" if !defined($descr);
+ print "[horizontal]\n'$name':: $descr\n\n";
+
+ print "[width=\"100%\",options=\"header\"]\n" .
+ "|===========================================================\n" .
+ "|Action|proto|dport|sport\n";
+
+ my $rules = $pve_fw_parsed_macros->{$name};
+
+ foreach my $rule (@$rules) {
+ print "|$rule->{action}|";
+ print (($rule->{proto} || '') . '|');
+ print (($rule->{dport} || '') . '|');
+ print (($rule->{sport} || '') . "\n");
+ }
+
+ print "|===========================================================\n";
+
+ print "\n";
+}