2020-05-22 17:04:52 +00:00
|
|
|
# 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.
|
|
|
|
|
2020-05-27 17:06:28 +00:00
|
|
|
# Common routines for a BeaconNode and a ValidatorClient
|
2020-05-22 17:04:52 +00:00
|
|
|
|
|
|
|
import
|
|
|
|
# Standard library
|
2020-07-15 13:15:55 +00:00
|
|
|
tables, random, strutils, os, typetraits,
|
2020-05-22 17:04:52 +00:00
|
|
|
|
|
|
|
# Nimble packages
|
2020-07-15 13:15:55 +00:00
|
|
|
chronos, confutils/defs,
|
2020-05-22 17:04:52 +00:00
|
|
|
chronicles, chronicles/helpers as chroniclesHelpers,
|
|
|
|
|
|
|
|
# Local modules
|
2020-06-05 09:57:40 +00:00
|
|
|
spec/[datatypes, crypto], eth2_network, time
|
2020-05-22 17:04:52 +00:00
|
|
|
|
2020-07-15 13:15:55 +00:00
|
|
|
proc setupLogging*(logLevel: string, logFile: Option[OutFile]) =
|
2020-05-22 17:04:52 +00:00
|
|
|
when compiles(defaultChroniclesStream.output.writer):
|
2020-07-15 13:15:55 +00:00
|
|
|
defaultChroniclesStream.outputs[0].writer =
|
2020-05-22 17:04:52 +00:00
|
|
|
proc (logLevel: LogLevel, msg: LogOutputStr) {.gcsafe, raises: [Defect].} =
|
|
|
|
try:
|
|
|
|
stdout.write(msg)
|
|
|
|
except IOError as err:
|
|
|
|
logLoggingFailure(cstring(msg), err)
|
|
|
|
|
|
|
|
randomize()
|
|
|
|
|
2020-07-15 13:15:55 +00:00
|
|
|
if logFile.isSome:
|
|
|
|
when defaultChroniclesStream.outputs.type.arity > 1:
|
|
|
|
block openLogFile:
|
|
|
|
let
|
|
|
|
logFile = logFile.get.string
|
|
|
|
logFileDir = splitFile(logFile).dir
|
|
|
|
try:
|
|
|
|
createDir logFileDir
|
|
|
|
except CatchableError as err:
|
|
|
|
error "Failed to create directory for log file", path = logFileDir, err = err.msg
|
|
|
|
break openLogFile
|
|
|
|
|
|
|
|
if not defaultChroniclesStream.outputs[1].open(logFile):
|
|
|
|
error "Failed to create log file", logFile
|
|
|
|
else:
|
|
|
|
warn "The --log-file option is not active in the current build"
|
|
|
|
|
2020-05-22 17:04:52 +00:00
|
|
|
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
|
|
|
|
|
2020-05-27 17:06:28 +00:00
|
|
|
template makeBannerAndConfig*(clientId: string, ConfType: type): untyped =
|
2020-06-30 12:23:52 +00:00
|
|
|
let
|
|
|
|
version = clientId & "\p" & copyrights & "\p\p" &
|
|
|
|
"eth2 specification v" & SPEC_VERSION & "\p\p" &
|
|
|
|
nimBanner
|
|
|
|
# TODO for some reason, copyrights are printed when doing `--help`
|
|
|
|
ConfType.load(
|
|
|
|
version = version,
|
|
|
|
copyrightBanner = clientId) # but a short version string makes more sense...
|
2020-06-05 09:57:40 +00:00
|
|
|
|
|
|
|
# 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),
|
2020-07-16 13:16:51 +00:00
|
|
|
fromNow = shortLog(fromNow.offset)
|
2020-06-05 09:57:40 +00:00
|
|
|
|
|
|
|
await sleepAsync(fromNow.offset)
|
|
|
|
return true
|
|
|
|
return false
|