|
59 | 59 | String $comment = $name, |
60 | 60 | Optional[Ferm::Actions] $action = undef, |
61 | 61 | Optional[Ferm::Policies] $policy = undef, |
62 | | - Optional[Variant[Stdlib::Port,Array[Stdlib::Port]]] $dport = undef, |
63 | | - Optional[Variant[Stdlib::Port,Array[Stdlib::Port]]] $sport = undef, |
| 62 | + Optional[Ferm::Port] $dport = undef, |
| 63 | + Optional[Ferm::Port] $sport = undef, |
64 | 64 | Optional[Variant[Array, String[1]]] $saddr = undef, |
65 | 65 | Optional[Variant[Array, String[1]]] $daddr = undef, |
66 | 66 | Optional[String[1]] $proto_options = undef, |
|
95 | 95 | String => "proto ${proto}", |
96 | 96 | } |
97 | 97 |
|
98 | | - # ferm supports implicit multiport using the "dports" shortcut |
| 98 | + |
99 | 99 | if $dport =~ Array { |
100 | 100 | $dports = join($dport, ' ') |
101 | | - $dport_real = "dports (${dports})" |
| 101 | + $dport_real = "mod multiport destination-ports (${dports})" |
102 | 102 | } elsif $dport =~ Integer { |
103 | 103 | $dport_real = "dport ${dport}" |
104 | | - } else { |
| 104 | + } elsif String($dport) =~ /^\d*:\d+$/ { |
| 105 | + $portrange = split($dport, /:/) |
| 106 | + $lower = $portrange[0] ? { |
| 107 | + '' => 0, |
| 108 | + default => Integer($portrange[0]), |
| 109 | + } |
| 110 | + $upper = Integer($portrange[1]) |
| 111 | + assert_type(Tuple[Stdlib::Port, Stdlib::Port], [$lower, $upper]) |$expected, $actual| { |
| 112 | + fail("The data type should be \'${expected}\', not \'${actual}\'. The data is [${lower}, ${upper}])}.") |
| 113 | + '' |
| 114 | + } |
| 115 | + if $lower > $upper { |
| 116 | + fail("Lower port number of the port range is larger than upper. ${lower}:${upper}") |
| 117 | + } |
| 118 | + $dport_real = "dport ${lower}:${upper}" |
| 119 | + } elsif String($dport) == '' { |
105 | 120 | $dport_real = '' |
| 121 | + } else { |
| 122 | + fail("invalid destination-port: ${dport}") |
106 | 123 | } |
107 | 124 |
|
108 | | - # ferm supports implicit multiport using the "sports" shortcut |
109 | 125 | if $sport =~ Array { |
110 | 126 | $sports = join($sport, ' ') |
111 | | - $sport_real = "sports (${sports})" |
| 127 | + $sport_real = "mod multiport source-ports (${sports})" |
112 | 128 | } elsif $sport =~ Integer { |
113 | 129 | $sport_real = "sport ${sport}" |
114 | | - } else { |
| 130 | + } elsif String($sport) =~ /^\d*:\d+$/ { |
| 131 | + $portrange = split($sport, /:/) |
| 132 | + $lower = $portrange[0] ? { |
| 133 | + '' => 0, |
| 134 | + default => Integer($portrange[0]), |
| 135 | + } |
| 136 | + $upper = Integer($portrange[1]) |
| 137 | + assert_type(Tuple[Stdlib::Port, Stdlib::Port], [$lower, $upper]) |$expected, $actual| { |
| 138 | + fail("The data type should be \'${expected}\', not \'${actual}\'. The data is [${lower}, ${upper}])}.") |
| 139 | + '' |
| 140 | + } |
| 141 | + if $lower > $upper { |
| 142 | + fail("Lower port number of the port range is larger than upper. ${lower}:${upper}") |
| 143 | + } |
| 144 | + $sport_real = "sport ${lower}:${upper}" |
| 145 | + } elsif String($sport) == '' { |
115 | 146 | $sport_real = '' |
| 147 | + } else { |
| 148 | + fail("invalid source-port: ${sport}") |
116 | 149 | } |
117 | 150 |
|
| 151 | + |
118 | 152 | if $saddr =~ Array { |
119 | 153 | assert_type(Array[Stdlib::IP::Address], flatten($saddr)) |$expected, $actual| { |
120 | 154 | fail( "The data type should be \'${expected}\', not \'${actual}\'. The data is ${flatten($saddr)}." ) |
|
0 commit comments