Skip to content

Commit ee02bd0

Browse files
committed
feat: add datasets watcher
1 parent 18d1d50 commit ee02bd0

File tree

4 files changed

+86
-15
lines changed

4 files changed

+86
-15
lines changed

internal/runner/runner.go

Lines changed: 61 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,21 @@ import (
1414
"github.com/charmbracelet/log"
1515
"github.com/fsnotify/fsnotify"
1616
"github.com/kitabisa/teler-proxy/common"
17+
"github.com/kitabisa/teler-proxy/internal/cron"
1718
"github.com/kitabisa/teler-proxy/pkg/tunnel"
19+
"github.com/kitabisa/teler-waf"
20+
"github.com/kitabisa/teler-waf/threat"
1821
)
1922

2023
type Runner struct {
2124
*common.Options
22-
*fsnotify.Watcher
25+
*cron.Cron
2326
*http.Server
2427

2528
shuttingDown bool
2629
shutdownLock sync.Mutex
30+
telerOpts teler.Options
31+
watcher
2732
}
2833

2934
func New(opt *common.Options) error {
@@ -35,23 +40,17 @@ func New(opt *common.Options) error {
3540
run := &Runner{Options: opt}
3641

3742
if opt.Config.Path != "" {
38-
watcher, err := fsnotify.NewWatcher()
43+
w, err := fsnotify.NewWatcher()
3944
if err != nil {
4045
return err
4146
}
4247

43-
if err := watcher.Add(opt.Config.Path); err != nil {
48+
if err := w.Add(opt.Config.Path); err != nil {
4449
return err
4550
}
4651

47-
run.Watcher = watcher
48-
defer run.Watcher.Close()
49-
50-
go func() {
51-
if err := run.watch(); err != nil {
52-
opt.Logger.Fatal("Something went wrong", "err", err)
53-
}
54-
}()
52+
defer w.Close()
53+
run.watcher.config = w
5554
}
5655

5756
dest := buildDest(opt.Destination)
@@ -70,7 +69,36 @@ func New(opt *common.Options) error {
7069
Handler: tun,
7170
ErrorLog: logger,
7271
}
72+
7373
run.Server = server
74+
run.telerOpts = tun.Options
75+
76+
if run.shouldCron() && run.Cron == nil {
77+
w, err := fsnotify.NewWatcher()
78+
if err != nil {
79+
return err
80+
}
81+
82+
ds, err := threat.Location()
83+
if err != nil {
84+
return err
85+
}
86+
87+
if err := w.Add(ds); err != nil {
88+
return err
89+
}
90+
91+
defer w.Close()
92+
run.watcher.datasets = w
93+
94+
run.cron()
95+
}
96+
97+
go func() {
98+
if err := run.watch(); err != nil {
99+
opt.Logger.Fatal("Something went wrong", "err", err)
100+
}
101+
}()
74102

75103
go func() {
76104
if err := run.start(); err != nil {
@@ -154,13 +182,32 @@ func (r *Runner) notify(sigCh chan os.Signal) error {
154182
func (r *Runner) watch() error {
155183
for {
156184
select {
157-
case event := <-r.Watcher.Events:
158-
if event.Op == 2 {
185+
case event := <-r.watcher.config.Events:
186+
if event.Op.Has(fsnotify.Write) {
159187
r.Options.Logger.Warn("Configuration file has changed", "conf", r.Options.Config.Path)
160188
return r.restart()
161189
}
162-
case err := <-r.Watcher.Errors:
190+
case event := <-r.watcher.datasets.Events:
191+
if event.Op.Has(fsnotify.Write) || event.Op.Has(fsnotify.Remove) {
192+
r.Options.Logger.Warn("Threat datasets has updated", "event", event.Op)
193+
return r.restart()
194+
}
195+
case err := <-r.watcher.config.Errors:
196+
return err
197+
case err := <-r.watcher.datasets.Errors:
163198
return err
164199
}
165200
}
166201
}
202+
203+
func (r *Runner) cron() error {
204+
c, err := cron.New()
205+
if err != nil {
206+
return err
207+
}
208+
209+
r.Cron = c
210+
c.Scheduler.StartAsync()
211+
212+
return nil
213+
}

internal/runner/utils.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,17 @@ func isReachable(inputURL string, timeout time.Duration) bool {
5353

5454
return true
5555
}
56+
57+
func (r *Runner) shouldCron() bool {
58+
if r.Options.Config.Path == "" {
59+
return false
60+
}
61+
62+
opt := r.telerOpts
63+
64+
if !opt.InMemory && !opt.NoUpdateCheck {
65+
return true
66+
}
67+
68+
return false
69+
}

internal/runner/watcher.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package runner
2+
3+
import "github.com/fsnotify/fsnotify"
4+
5+
type watcher struct {
6+
config, datasets *fsnotify.Watcher
7+
}

pkg/tunnel/tunnel.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@ import (
1313
)
1414

1515
type Tunnel struct {
16-
*teler.Teler
1716
*httputil.ReverseProxy
17+
*teler.Teler
18+
19+
Options teler.Options
1820
}
1921

2022
func NewTunnel(port int, dest, cfgPath, optFormat string) (*Tunnel, error) {
@@ -48,6 +50,7 @@ func NewTunnel(port int, dest, cfgPath, optFormat string) (*Tunnel, error) {
4850
return nil, err
4951
}
5052

53+
tun.Options = opt
5154
tun.Teler = teler.New(opt)
5255
} else {
5356
tun.Teler = teler.New()

0 commit comments

Comments
 (0)