diff --git a/cmd/main.go b/cmd/main.go index 06425f5d..c17afd1e 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -64,7 +64,7 @@ func main() { shadowsocksConf := shadowsocks.NewConfigurator(fileManager, logger) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - streamMerger := command.NewStreamMerger(ctx) + streamMerger := command.NewStreamMerger() e.PrintVersion(ctx, "OpenVPN", ovpnConf.Version) e.PrintVersion(ctx, "Unbound", dnsConf.Version) @@ -118,7 +118,7 @@ func main() { go func() { // Blocking line merging paramsReader for all programs: openvpn, tinyproxy, unbound and shadowsocks logger.Info("Launching standard output merger") - err = streamMerger.CollectLines(func(line string) { + streamMerger.CollectLines(ctx, func(line string) { logger.Info(line) if strings.Contains(line, "Initialization Sequence Completed") { time.AfterFunc(time.Second, func() { @@ -132,8 +132,9 @@ func main() { allSettings.System.GID) }) } + }, func(err error) { + logger.Error(err) }) - e.FatalOnError(err) }() waiter := command.NewWaiter() @@ -149,7 +150,7 @@ func main() { stream, waitFn, err := dnsConf.Start(ctx, allSettings.DNS.VerbosityDetailsLevel) e.FatalOnError(err) 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 err = dnsConf.UseDNSSystemWide(net.IP{127, 0, 0, 1}) // use Unbound e.FatalOnError(err) @@ -238,7 +239,7 @@ func main() { stream, waitFn, err := tinyProxyConf.Start(ctx) e.FatalOnError(err) 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 { @@ -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) e.FatalOnError(err) waiter.Add(waitFn) - go streamMerger.Merge(stdout, command.MergeName("shadowsocks"), command.MergeColor(constants.ColorShadowsocks())) - go streamMerger.Merge(stderr, command.MergeName("shadowsocks error"), command.MergeColor(constants.ColorShadowsocksError())) + go streamMerger.Merge(ctx, stdout, command.MergeName("shadowsocks"), command.MergeColor(constants.ColorShadowsocks())) + go streamMerger.Merge(ctx, stderr, command.MergeName("shadowsocks error"), command.MergeColor(constants.ColorShadowsocksError())) } // Runs openvpn and restarts it if it does not exit cleanly go func() { for { stream, waitFn, err := ovpnConf.Start(ctx) 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 { logger.Error("openvpn crashed: %s", err) } else { @@ -288,7 +289,7 @@ func main() { logger.Error(err) } } - errors := waiter.WaitForAll() + errors := waiter.WaitForAll(ctx) for _, err := range errors { logger.Error(err) } diff --git a/go.mod b/go.mod index f8577fba..f2f3e9b4 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/fatih/color v1.9.0 github.com/golang/mock v1.4.3 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 - golang.org/x/sys v0.0.0-20200413165638-669c56c373c4 + golang.org/x/sys v0.0.0-20200428200454-593003d681fa ) diff --git a/go.sum b/go.sum index 7e243862..e0f19fc0 100644 --- a/go.sum +++ b/go.sum @@ -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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 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-20200419200147-04dea671b563/go.mod h1:pikkTN7g7zRuuAnERwqW1yAFq6pYmxrxpjiwGvb0Ysc= +github.com/qdm12/golibs v0.0.0-20200429235556-d24605138c3d h1:Sxemv0PblfDegUUms/rT29AJKDG4MB99AmcXmb8AwNw= +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/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= 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-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-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.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=