mirror of https://github.com/ginuerzh/gost
9 changed files with 302 additions and 123 deletions
@ -1,5 +1,12 @@ |
|||||
|
# period for live reloading |
||||
|
reload 10s |
||||
|
|
||||
|
# matcher reversed |
||||
|
reverse true |
||||
|
|
||||
10.0.0.1 |
10.0.0.1 |
||||
192.168.0.0/24 |
192.168.0.0/24 |
||||
172.1.0.0/16 |
172.1.0.0/16 |
||||
192.168.100.190/32 |
192.168.100.190/32 |
||||
*.example.com |
*.example.com |
||||
|
.example.org |
||||
@ -0,0 +1,52 @@ |
|||||
|
package gost |
||||
|
|
||||
|
import ( |
||||
|
"io" |
||||
|
"os" |
||||
|
"time" |
||||
|
|
||||
|
"github.com/go-log/log" |
||||
|
) |
||||
|
|
||||
|
// Reloader is the interface for objects that support live reloading.
|
||||
|
type Reloader interface { |
||||
|
Reload(r io.Reader) error |
||||
|
Period() time.Duration |
||||
|
} |
||||
|
|
||||
|
// PeriodReload reloads the config periodically according to the period of the reloader.
|
||||
|
func PeriodReload(r Reloader, configFile string) error { |
||||
|
var lastMod time.Time |
||||
|
|
||||
|
for { |
||||
|
f, err := os.Open(configFile) |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
|
||||
|
finfo, err := f.Stat() |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
mt := finfo.ModTime() |
||||
|
if !mt.Equal(lastMod) { |
||||
|
if Debug { |
||||
|
log.Log("[reload]", configFile) |
||||
|
} |
||||
|
r.Reload(f) |
||||
|
lastMod = mt |
||||
|
} |
||||
|
f.Close() |
||||
|
|
||||
|
period := r.Period() |
||||
|
if period <= 0 { |
||||
|
log.Log("[reload] disabled:", configFile) |
||||
|
return nil |
||||
|
} |
||||
|
if period < time.Second { |
||||
|
period = time.Second |
||||
|
} |
||||
|
|
||||
|
<-time.After(period) |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue