| 195 | } |
| 196 | |
| 197 | func parseResponseRule(node config.Node) (ResponseRule, error) { |
| 198 | var rule ResponseRule |
| 199 | |
| 200 | if len(node.Args) == 0 { |
| 201 | return rule, config.NodeErr(node, "response block requires at least one IP address or CIDR as argument") |
| 202 | } |
| 203 | |
| 204 | // Parse IP addresses/CIDRs from arguments |
| 205 | for _, arg := range node.Args { |
| 206 | // If there is no / - it is a plain IP address, append '/32' or '/128' |
| 207 | resp := arg |
| 208 | if !strings.Contains(resp, "/") { |
| 209 | // Check if it's IPv6 to determine the mask |
| 210 | if strings.Contains(resp, ":") { |
| 211 | resp += "/128" |
| 212 | } else { |
| 213 | resp += "/32" |
| 214 | } |
| 215 | } |
| 216 | |
| 217 | _, ipNet, err := net.ParseCIDR(resp) |
| 218 | if err != nil { |
| 219 | return rule, config.NodeErr(node, "invalid IP address or CIDR: %s: %v", arg, err) |
| 220 | } |
| 221 | rule.Networks = append(rule.Networks, *ipNet) |
| 222 | } |
| 223 | |
| 224 | // Parse directives within the response block |
| 225 | cfg := config.NewMap(nil, node) |
| 226 | cfg.Int("score", false, true, 0, &rule.Score) |
| 227 | cfg.String("message", false, false, "", &rule.Message) |
| 228 | if _, err := cfg.Process(); err != nil { |
| 229 | return rule, err |
| 230 | } |
| 231 | |
| 232 | return rule, nil |
| 233 | } |
| 234 | |
| 235 | func (bl *DNSBL) testList(listCfg List) { |
| 236 | // Check RFC 5782 Section 5 requirements. |