Added a golang code example and also domans.list for archive
This commit is contained in:
parent
4bb5e83edb
commit
fc0e0045b5
28
convert-to-mt-address-list.rb
Executable file
28
convert-to-mt-address-list.rb
Executable file
@ -0,0 +1,28 @@
|
|||||||
|
#!/usr/bin/env ruby
|
||||||
|
|
||||||
|
filename = ARGV[0]
|
||||||
|
addressList = ARGV[1]
|
||||||
|
|
||||||
|
if filename.nil? or filename.empty?
|
||||||
|
STDERR.puts("Missing list filename")
|
||||||
|
exit 1
|
||||||
|
end
|
||||||
|
|
||||||
|
if addressList.nil? or addressList !~ /^[a-zA-Z\-\_0-9]+$/
|
||||||
|
STDERR.puts("Missing or wrong address list name")
|
||||||
|
exit 2
|
||||||
|
end
|
||||||
|
|
||||||
|
lines = File.open(filename).readlines
|
||||||
|
|
||||||
|
template = "/ip firewall address-list"
|
||||||
|
|
||||||
|
lines.each do |cidr|
|
||||||
|
l = cidr.strip
|
||||||
|
next if l.empty?
|
||||||
|
next if l[0] == "#"
|
||||||
|
|
||||||
|
template = "#{template}\nadd address=#{l} list=#{addressList}"
|
||||||
|
end
|
||||||
|
|
||||||
|
puts template
|
3
domains.list
Normal file
3
domains.list
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
gmail.com
|
||||||
|
outlook.com
|
||||||
|
monday.com
|
BIN
spf-to-ip4-list
Executable file
BIN
spf-to-ip4-list
Executable file
Binary file not shown.
115
spf-to-ip4-list.go
Normal file
115
spf-to-ip4-list.go
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"os"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func getSPFRecord(domain string) (string, error) {
|
||||||
|
txtRecords, err := net.LookupTXT(domain)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("error looking up TXT records for %s: %v", domain, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, record := range txtRecords {
|
||||||
|
if strings.HasPrefix(record, "v=spf1") {
|
||||||
|
return record, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", fmt.Errorf("no SPF record found for %s", domain)
|
||||||
|
}
|
||||||
|
|
||||||
|
func collectSpfRecordDetails(domain string) (map[string][]string, error) {
|
||||||
|
spfRecord, err := getSPFRecord(domain)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
result := make(map[string][]string)
|
||||||
|
for key, regexStr := range map[string]string{
|
||||||
|
"ipv4": `ip4:([\d\./]+)`,
|
||||||
|
"ipv6": `ip6:([a-f0-9\:\/]+)`,
|
||||||
|
"includes": `include\:([a-z\.\-\_0-9]+)`,
|
||||||
|
"redirects": `redirect\=([a-z\.\-\_0-9]+)`,
|
||||||
|
"a": `a\:([a-z\.\-\_0-9]+)`,
|
||||||
|
} {
|
||||||
|
re, err := regexp.Compile(regexStr)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("error compiling regex for %s: %v", key, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
matches := re.FindAllStringSubmatch(spfRecord, -1)
|
||||||
|
for _, match := range matches {
|
||||||
|
result[key] = append(result[key], match[1]) // Extract the captured group
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func collectAllItemsRecursively(domain, itemType string) ([]string, error) {
|
||||||
|
items, err := collectSpfRecordDetails(domain)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
allItems := items[itemType]
|
||||||
|
for _, item := range items[itemType] {
|
||||||
|
subItems, err := collectAllItemsRecursively(item, itemType)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
allItems = append(allItems, subItems...)
|
||||||
|
}
|
||||||
|
return allItems, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getAllSpfIPs(domain, ipVersion string) ([]string, error) {
|
||||||
|
redirects, err := collectAllItemsRecursively(domain, "redirects")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
includes, err := collectAllItemsRecursively(domain, "includes")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
items, err := collectSpfRecordDetails(domain)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
allIPs := items[ipVersion]
|
||||||
|
for _, item := range append(redirects, includes...) {
|
||||||
|
subIPs, err := getAllSpfIPs(item, ipVersion)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
allIPs = append(allIPs, subIPs...)
|
||||||
|
}
|
||||||
|
|
||||||
|
return allIPs, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
if len(os.Args) < 2 {
|
||||||
|
fmt.Println("Usage: spf_ips <domain>")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
domain := os.Args[1]
|
||||||
|
ipv4s, err := getAllSpfIPs(domain, "ipv4")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, ip := range ipv4s {
|
||||||
|
fmt.Println(ip)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user