-
Notifications
You must be signed in to change notification settings - Fork 4
/
block_domains_decider_hosts.go
89 lines (74 loc) · 2.08 KB
/
block_domains_decider_hosts.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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package blocker
import (
"bufio"
"os"
"strings"
"time"
"github.com/miekg/dns"
)
type BlockDomainsDeciderHosts struct {
blocklist map[string]bool
blocklistFile string
lastUpdated time.Time
log Logger
}
// Name ...
func NewBlockDomainsDeciderHosts(filePath string, logger Logger) BlockDomainsDecider {
return &BlockDomainsDeciderHosts{
blocklistFile: filePath,
log: logger,
blocklist: map[string]bool{},
}
}
// IsDomainBlocked ...
func (d *BlockDomainsDeciderHosts) IsDomainBlocked(domain string) bool {
return d.blocklist[domain]
}
// StartBlocklistUpdater ...
func (d *BlockDomainsDeciderHosts) StartBlocklistUpdater(ticker *time.Ticker) {
go func() {
for {
tick := <-ticker.C
d.log.Debugf("Ticker arrived at time: %v", tick)
if d.IsBlocklistUpdateRequired() {
d.log.Debug("update required")
d.UpdateBlocklist()
} else {
d.log.Debug("update not required")
}
}
}()
}
// UpdateBlocklist ...
func (d *BlockDomainsDeciderHosts) UpdateBlocklist() error {
// Update process
blocklistContent, err := os.Open(d.blocklistFile)
if err != nil {
d.log.Errorf("could not read blocklist file: %s", d.blocklistFile)
return err
}
defer blocklistContent.Close()
numBlockedDomainsBefore := len(d.blocklist)
lastUpdatedBefore := d.lastUpdated
scanner := bufio.NewScanner(blocklistContent)
for scanner.Scan() {
hostLine := scanner.Text()
comps := strings.Split(hostLine, " ")
if len(comps) < 2 {
// Bad line in the input file
d.log.Warningf("unformatted line present in the input file: %s", hostLine)
continue
}
domain := comps[1]
d.blocklist[dns.Fqdn(domain)] = true
}
d.lastUpdated = time.Now()
d.log.Infof("updated blocklist; blocked domains: before: %d, after: %d; last updated: before: %v, after: %v",
numBlockedDomainsBefore, len(d.blocklist), lastUpdatedBefore, d.lastUpdated)
return nil
}
// IsBlocklistUpdateRequired ...
func (d *BlockDomainsDeciderHosts) IsBlocklistUpdateRequired() bool {
blocklistFileStat, _ := os.Stat(d.blocklistFile)
return blocklistFileStat.ModTime().After(d.lastUpdated)
}