Better context handling (prep for restart logic)

This commit is contained in:
Quentin McGaw
2020-04-29 23:59:23 +00:00
parent a033637e85
commit eb62ad06db
3 changed files with 16 additions and 13 deletions

View File

@@ -64,7 +64,7 @@ func main() {
shadowsocksConf := shadowsocks.NewConfigurator(fileManager, logger) shadowsocksConf := shadowsocks.NewConfigurator(fileManager, logger)
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
defer cancel() defer cancel()
streamMerger := command.NewStreamMerger(ctx) streamMerger := command.NewStreamMerger()
e.PrintVersion(ctx, "OpenVPN", ovpnConf.Version) e.PrintVersion(ctx, "OpenVPN", ovpnConf.Version)
e.PrintVersion(ctx, "Unbound", dnsConf.Version) e.PrintVersion(ctx, "Unbound", dnsConf.Version)
@@ -118,7 +118,7 @@ func main() {
go func() { go func() {
// Blocking line merging paramsReader for all programs: openvpn, tinyproxy, unbound and shadowsocks // Blocking line merging paramsReader for all programs: openvpn, tinyproxy, unbound and shadowsocks
logger.Info("Launching standard output merger") logger.Info("Launching standard output merger")
err = streamMerger.CollectLines(func(line string) { streamMerger.CollectLines(ctx, func(line string) {
logger.Info(line) logger.Info(line)
if strings.Contains(line, "Initialization Sequence Completed") { if strings.Contains(line, "Initialization Sequence Completed") {
time.AfterFunc(time.Second, func() { time.AfterFunc(time.Second, func() {
@@ -132,8 +132,9 @@ func main() {
allSettings.System.GID) allSettings.System.GID)
}) })
} }
}, func(err error) {
logger.Error(err)
}) })
e.FatalOnError(err)
}() }()
waiter := command.NewWaiter() waiter := command.NewWaiter()
@@ -149,7 +150,7 @@ func main() {
stream, waitFn, err := dnsConf.Start(ctx, allSettings.DNS.VerbosityDetailsLevel) stream, waitFn, err := dnsConf.Start(ctx, allSettings.DNS.VerbosityDetailsLevel)
e.FatalOnError(err) e.FatalOnError(err)
waiter.Add(waitFn) waiter.Add(waitFn)
go streamMerger.Merge(stream, command.MergeName("unbound"), command.MergeColor(constants.ColorUnbound())) go streamMerger.Merge(ctx, stream, command.MergeName("unbound"), command.MergeColor(constants.ColorUnbound()))
dnsConf.UseDNSInternally(net.IP{127, 0, 0, 1}) // use Unbound dnsConf.UseDNSInternally(net.IP{127, 0, 0, 1}) // use Unbound
err = dnsConf.UseDNSSystemWide(net.IP{127, 0, 0, 1}) // use Unbound err = dnsConf.UseDNSSystemWide(net.IP{127, 0, 0, 1}) // use Unbound
e.FatalOnError(err) e.FatalOnError(err)
@@ -238,7 +239,7 @@ func main() {
stream, waitFn, err := tinyProxyConf.Start(ctx) stream, waitFn, err := tinyProxyConf.Start(ctx)
e.FatalOnError(err) e.FatalOnError(err)
waiter.Add(waitFn) waiter.Add(waitFn)
go streamMerger.Merge(stream, command.MergeName("tinyproxy"), command.MergeColor(constants.ColorTinyproxy())) go streamMerger.Merge(ctx, stream, command.MergeName("tinyproxy"), command.MergeColor(constants.ColorTinyproxy()))
} }
if allSettings.ShadowSocks.Enabled { if allSettings.ShadowSocks.Enabled {
@@ -254,15 +255,15 @@ func main() {
stdout, stderr, waitFn, err := shadowsocksConf.Start(ctx, "0.0.0.0", allSettings.ShadowSocks.Port, allSettings.ShadowSocks.Password, allSettings.ShadowSocks.Log) stdout, stderr, waitFn, err := shadowsocksConf.Start(ctx, "0.0.0.0", allSettings.ShadowSocks.Port, allSettings.ShadowSocks.Password, allSettings.ShadowSocks.Log)
e.FatalOnError(err) e.FatalOnError(err)
waiter.Add(waitFn) waiter.Add(waitFn)
go streamMerger.Merge(stdout, command.MergeName("shadowsocks"), command.MergeColor(constants.ColorShadowsocks())) go streamMerger.Merge(ctx, stdout, command.MergeName("shadowsocks"), command.MergeColor(constants.ColorShadowsocks()))
go streamMerger.Merge(stderr, command.MergeName("shadowsocks error"), command.MergeColor(constants.ColorShadowsocksError())) go streamMerger.Merge(ctx, stderr, command.MergeName("shadowsocks error"), command.MergeColor(constants.ColorShadowsocksError()))
} }
// Runs openvpn and restarts it if it does not exit cleanly // Runs openvpn and restarts it if it does not exit cleanly
go func() { go func() {
for { for {
stream, waitFn, err := ovpnConf.Start(ctx) stream, waitFn, err := ovpnConf.Start(ctx)
e.FatalOnError(err) e.FatalOnError(err)
go streamMerger.Merge(stream, command.MergeName("openvpn"), command.MergeColor(constants.ColorOpenvpn())) go streamMerger.Merge(ctx, stream, command.MergeName("openvpn"), command.MergeColor(constants.ColorOpenvpn()))
if err := waitFn(); err != nil { if err := waitFn(); err != nil {
logger.Error("openvpn crashed: %s", err) logger.Error("openvpn crashed: %s", err)
} else { } else {
@@ -288,7 +289,7 @@ func main() {
logger.Error(err) logger.Error(err)
} }
} }
errors := waiter.WaitForAll() errors := waiter.WaitForAll(ctx)
for _, err := range errors { for _, err := range errors {
logger.Error(err) logger.Error(err)
} }

4
go.mod
View File

@@ -6,7 +6,7 @@ require (
github.com/fatih/color v1.9.0 github.com/fatih/color v1.9.0
github.com/golang/mock v1.4.3 github.com/golang/mock v1.4.3
github.com/kyokomi/emoji v2.2.2+incompatible github.com/kyokomi/emoji v2.2.2+incompatible
github.com/qdm12/golibs v0.0.0-20200419200147-04dea671b563 github.com/qdm12/golibs v0.0.0-20200429235556-d24605138c3d
github.com/stretchr/testify v1.5.1 github.com/stretchr/testify v1.5.1
golang.org/x/sys v0.0.0-20200413165638-669c56c373c4 golang.org/x/sys v0.0.0-20200428200454-593003d681fa
) )

6
go.sum
View File

@@ -70,8 +70,8 @@ github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/qdm12/golibs v0.0.0-20200419200147-04dea671b563 h1:r6V5HuD76hv6IBrRg83YwoEe2txFMjSLZbuOfrbsY7k= github.com/qdm12/golibs v0.0.0-20200429235556-d24605138c3d h1:Sxemv0PblfDegUUms/rT29AJKDG4MB99AmcXmb8AwNw=
github.com/qdm12/golibs v0.0.0-20200419200147-04dea671b563/go.mod h1:pikkTN7g7zRuuAnERwqW1yAFq6pYmxrxpjiwGvb0Ysc= github.com/qdm12/golibs v0.0.0-20200429235556-d24605138c3d/go.mod h1:pikkTN7g7zRuuAnERwqW1yAFq6pYmxrxpjiwGvb0Ysc=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@@ -108,6 +108,8 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200413165638-669c56c373c4 h1:opSr2sbRXk5X5/givKrrKj9HXxFpW2sdCiP8MJSKLQY= golang.org/x/sys v0.0.0-20200413165638-669c56c373c4 h1:opSr2sbRXk5X5/givKrrKj9HXxFpW2sdCiP8MJSKLQY=
golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200428200454-593003d681fa h1:yMbJOvnfYkO1dSAviTu/ZguZWLBTXx4xE3LYrxUCCiA=
golang.org/x/sys v0.0.0-20200428200454-593003d681fa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=