# beacon_chain # Copyright (c) 2018-2020 Status Research & Development GmbH # Licensed and distributed under either of # * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT). # * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0). # at your option. This file may not be copied, modified, or distributed except according to those terms. # Common routines for a BeaconNode and a ValidatorClient import # Standard library tables, random, strutils, # Nimble packages chronos, chronicles, chronicles/helpers as chroniclesHelpers, # Local modules spec/[datatypes, crypto], eth2_network, time proc setupMainProc*(logLevel: string) = when compiles(defaultChroniclesStream.output.writer): defaultChroniclesStream.output.writer = proc (logLevel: LogLevel, msg: LogOutputStr) {.gcsafe, raises: [Defect].} = try: stdout.write(msg) except IOError as err: logLoggingFailure(cstring(msg), err) randomize() try: let directives = logLevel.split(";") try: setLogLevel(parseEnum[LogLevel](directives[0])) except ValueError: raise (ref ValueError)(msg: "Please specify one of TRACE, DEBUG, INFO, NOTICE, WARN, ERROR or FATAL") if directives.len > 1: for topicName, settings in parseTopicDirectives(directives[1..^1]): if not setTopicState(topicName, settings.state, settings.logLevel): warn "Unrecognized logging topic", topic = topicName except ValueError as err: stderr.write "Invalid value for --log-level. " & err.msg quit 1 template ctrlCHandling*(extraCode: untyped) = ## Ctrl+C handling proc controlCHandler() {.noconv.} = when defined(windows): # workaround for https://github.com/nim-lang/Nim/issues/4057 setupForeignThreadGc() info "Shutting down after having received SIGINT" extraCode setControlCHook(controlCHandler) template makeBannerAndConfig*(clientId: string, ConfType: type): untyped = let banner = clientId & "\p" & copyrights & "\p\p" & nimBanner ConfType.load(version = banner, copyrightBanner = banner) # TODO not sure if this belongs here but it doesn't belong in `time.nim` either proc sleepToSlotOffset*(clock: BeaconClock, extra: chronos.Duration, slot: Slot, msg: static string): Future[bool] {.async.} = let fromNow = clock.fromNow(slot.toBeaconTime(extra)) if fromNow.inFuture: trace msg, slot = shortLog(slot), fromNow = shortLog(fromNow.offset), cat = "scheduling" await sleepAsync(fromNow.offset) return true return false