You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.5 KiB
57 lines
1.5 KiB
package nat |
|
|
|
import ( |
|
"fmt" |
|
"strconv" |
|
"strings" |
|
) |
|
|
|
// PartParser parses and validates the specified string (data) using the specified template |
|
// e.g. ip:public:private -> 192.168.0.1:80:8000 |
|
// DEPRECATED: do not use, this function may be removed in a future version |
|
func PartParser(template, data string) (map[string]string, error) { |
|
// ip:public:private |
|
var ( |
|
templateParts = strings.Split(template, ":") |
|
parts = strings.Split(data, ":") |
|
out = make(map[string]string, len(templateParts)) |
|
) |
|
if len(parts) != len(templateParts) { |
|
return nil, fmt.Errorf("Invalid format to parse. %s should match template %s", data, template) |
|
} |
|
|
|
for i, t := range templateParts { |
|
value := "" |
|
if len(parts) > i { |
|
value = parts[i] |
|
} |
|
out[t] = value |
|
} |
|
return out, nil |
|
} |
|
|
|
// ParsePortRange parses and validates the specified string as a port-range (8000-9000) |
|
func ParsePortRange(ports string) (uint64, uint64, error) { |
|
if ports == "" { |
|
return 0, 0, fmt.Errorf("Empty string specified for ports.") |
|
} |
|
if !strings.Contains(ports, "-") { |
|
start, err := strconv.ParseUint(ports, 10, 16) |
|
end := start |
|
return start, end, err |
|
} |
|
|
|
parts := strings.Split(ports, "-") |
|
start, err := strconv.ParseUint(parts[0], 10, 16) |
|
if err != nil { |
|
return 0, 0, err |
|
} |
|
end, err := strconv.ParseUint(parts[1], 10, 16) |
|
if err != nil { |
|
return 0, 0, err |
|
} |
|
if end < start { |
|
return 0, 0, fmt.Errorf("Invalid range specified for the Port: %s", ports) |
|
} |
|
return start, end, nil |
|
}
|
|
|