-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.go
73 lines (62 loc) · 2.6 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package main
import (
"net"
"flag"
"os"
"net/url"
)
var (
flagSrc = flag.String("src", "", "Location of blocklist file. It may be URL or filepath.")
flagMaxNets = flag.Uint("max", uint(^uint32(0)), "Max subnets in output.")
flagSilent = flag.Bool("silent", false, "Prevent errors at stderr.")
flagAllowEmptyDomain = flag.Bool("empty-domains", false, "Use rules with empty domains from blocklist.")
flagAllowDomains = flag.String("allowed-domains", "", "Use only allowed domains from blocklist rules. Not contains empty domains.")
flagExcludeNets = flag.String("exclude", "", "Comma-separated nets in CIDR that must be excluded from result. Private subnets always excluded.")
flagOutputFormat = flag.String("output", "default", "Output format: default, cidr, ovpn, push-ovpn.")
)
func main() {
var err error
flag.Parse()
// Создаем парсер блоклиста (данных о заблокированных ресурсах)
blParser := &ZapretInfoParser{
AllowEmptyDomain: *flagAllowEmptyDomain || *flagAllowDomains == "",
}
if *flagAllowDomains != "" {
// Разрешаем парсеру включать в список только перечисленные домены (с поддоменами)
if err := blParser.LoadAllowedDomains(*flagAllowDomains); err != nil {
Log("Unable to load allowed domains: %s", err)
os.Exit(1)
}
}
// Инициализируем блоклист и устанавливаем парсер
bl := NewBlocklist()
bl.SetParser(blParser)
// Выбираем источник данных о заблокированных ресурсах
if *flagSrc == "" {
err = bl.Parse(os.Stdin)
} else if u, err := url.Parse(*flagSrc); err == nil && u.IsAbs() {
err = bl.LoadFromURL(u)
} else {
err = bl.LoadFromFile(*flagSrc)
}
if err != nil {
Log("Unable to load blocklist: %s", err)
os.Exit(1)
}
// Формируем дерево подсетей из блоклиста
netsTreeRoot := bl.SubnetsTree()
// Частные сети исключаем всегда
excludedNets := []*net.IPNet{privateNet8, privateNet12, privateNet16}
if *flagExcludeNets != "" {
// Добавляем для исключения указанные дополнительные сети
en, err := LoadExcludedNets(*flagExcludeNets)
if err != nil {
Log("Unable to load excluded nets: %s", err)
os.Exit(1)
}
excludedNets = append(excludedNets, en...)
}
ipNets := GetOptimizedNets(netsTreeRoot, excludedNets, *flagMaxNets)
OutputNets(ipNets)
Log("Total nets: %d, excluded: %d", len(ipNets), len(excludedNets))
}