diff --git a/info/version.go b/info/version.go index c7ed4b8..a1790ee 100644 --- a/info/version.go +++ b/info/version.go @@ -85,7 +85,13 @@ func FullVersion() string { // CheckVersion checks if the metadata is ok. func CheckVersion() error { - if !strings.HasSuffix(os.Args[0], ".test") { + switch { + case strings.HasSuffix(os.Args[0], ".test"): + return nil // testing on linux/darwin + case strings.HasSuffix(os.Args[0], ".test.exe"): + return nil // testing on windows + default: + // check version information if name == "[NAME]" { return errors.New("must call SetInfo() before calling CheckVersion()") } @@ -100,5 +106,6 @@ func CheckVersion() error { return errors.New("please build using the supplied build script.\n$ ./build {main.go|...}") } } + return nil } diff --git a/modules/modules.go b/modules/modules.go index b330ddc..c280a4e 100644 --- a/modules/modules.go +++ b/modules/modules.go @@ -19,6 +19,9 @@ var ( // lock modules when starting modulesLocked = abool.New() + moduleStartTimeout = 2 * time.Minute + moduleStopTimeout = 1 * time.Minute + // ErrCleanExit is returned by Start() when the program is interrupted before starting. This can happen for example, when using the "--help" flag. ErrCleanExit = errors.New("clean exit requested") ) @@ -117,7 +120,7 @@ func (m *Module) prep(reports chan *report) { // execute function err = m.runCtrlFnWithTimeout( "prep module", - 10*time.Second, + moduleStartTimeout, m.prepFn, ) } @@ -173,7 +176,7 @@ func (m *Module) start(reports chan *report) { // execute function err = m.runCtrlFnWithTimeout( "start module", - 10*time.Second, + moduleStartTimeout, m.startFn, ) } @@ -248,7 +251,7 @@ func (m *Module) stopAllTasks(reports chan *report) { // wait for results select { case <-done: - case <-time.After(30 * time.Second): + case <-time.After(moduleStopTimeout): log.Warningf( "%s: timed out while waiting for stopfn/workers/tasks to finish: stopFn=%v workers=%d tasks=%d microtasks=%d, continuing shutdown...", m.Name, diff --git a/rng/rng.go b/rng/rng.go index ae99159..4a017ba 100644 --- a/rng/rng.go +++ b/rng/rng.go @@ -1,6 +1,7 @@ package rng import ( + "context" "crypto/aes" "crypto/cipher" "crypto/rand" @@ -49,14 +50,22 @@ func start() error { return errors.New("failed to initialize rng") } - // explicitly add randomness - osEntropy := make([]byte, minFeedEntropy/8) - _, err := rand.Read(osEntropy) - if err != nil { - return fmt.Errorf("could not read entropy from os: %s", err) - } - rng.Reseed(osEntropy) + // add another (async) OS rng seed + module.StartWorker("initial rng feed", func(_ context.Context) error { + // get entropy from OS + osEntropy := make([]byte, minFeedEntropy/8) + _, err := rand.Read(osEntropy) + if err != nil { + return fmt.Errorf("could not read entropy from os: %s", err) + } + // feed + rngLock.Lock() + rng.Reseed(osEntropy) + rngLock.Unlock() + return nil + }) + // mark as ready rngReady = true // random source: OS