1+ {-# LANGUAGE MultiWayIf #-}
2+ {-# LANGUAGE OverloadedStrings #-}
13{-# LANGUAGE ScopedTypeVariables #-}
4+ {-# LANGUAGE TemplateHaskell #-}
25{-# LANGUAGE TypeApplications #-}
36
47module Main where
58
6- import Control.Monad (void )
9+ import Control.Monad (void , when )
710import Control.Tracer (Tracer (.. ), nullTracer , traceWith )
811
912import Data.Act
1013import Data.Aeson (ToJSON )
1114import Data.Functor.Contravariant ((>$<) )
15+ import Data.Maybe (maybeToList )
16+ import Data.Text qualified as Text
17+ import Data.Text.IO qualified as Text
18+ import Data.Version (showVersion )
1219import Data.Void (Void )
1320import Options.Applicative
21+ import System.Exit (exitSuccess )
1422import System.Random (newStdGen , split )
1523
24+ import Cardano.Git.Rev (gitRev )
1625import Cardano.KESAgent.Protocols.StandardCrypto (StandardCrypto )
1726
1827import DMQ.Configuration
@@ -21,6 +30,7 @@ import DMQ.Configuration.Topology (readTopologyFileOrError)
2130import DMQ.Diffusion.Applications (diffusionApplications )
2231import DMQ.Diffusion.Arguments
2332import DMQ.Diffusion.NodeKernel (mempool , withNodeKernel )
33+ import DMQ.Handlers.TopLevel (toplevelExceptionHandler )
2434import DMQ.NodeToClient qualified as NtC
2535import DMQ.NodeToNode (dmqCodecs , dmqLimitsAndTimeouts , ntnApps )
2636import DMQ.Protocol.LocalMsgSubmission.Codec
@@ -33,8 +43,10 @@ import Ouroboros.Network.PeerSelection.PeerSharing.Codec (decodeRemoteAddress,
3343 encodeRemoteAddress )
3444import Ouroboros.Network.TxSubmission.Mempool.Simple qualified as Mempool
3545
46+ import Paths_dmq_node qualified as Meta
47+
3648main :: IO ()
37- main = void . runDMQ =<< execParser opts
49+ main = toplevelExceptionHandler $ void . runDMQ =<< execParser opts
3850 where
3951 opts = info (parseCLIOptions <**> helper)
4052 ( fullDesc
@@ -56,21 +68,40 @@ runDMQ commandLineConfig = do
5668 dmqcPrettyLog = I prettyLog,
5769 dmqcTopologyFile = I topologyFile,
5870 dmqcHandshakeTracer = I handshakeTracer,
59- dmqcLocalHandshakeTracer = I localHandshakeTracer
71+ dmqcLocalHandshakeTracer = I localHandshakeTracer,
72+ dmqcVersion = I version
6073 } = config' <> commandLineConfig
6174 `act`
6275 defaultConfiguration
6376 let tracer :: ToJSON ev => Tracer IO (WithEventType ev )
6477 tracer = dmqTracer prettyLog
6578
79+ when version $ do
80+ let gitrev = $ (gitRev)
81+ cleanGitRev = if | Text. take 6 (Text. drop 7 gitrev) == " -dirty"
82+ -- short dirty revision
83+ -> Just $ Text. take (6 + 7 ) gitrev
84+ | Text. all (== ' 0' ) gitrev
85+ -- no git revision available
86+ -> Nothing
87+ | otherwise
88+ -> Just gitrev
89+ Text. putStr $ Text. unlines $
90+ [ " dmq-node version: " <> Text. pack (showVersion Meta. version) ]
91+ ++
92+ [ " git revision: " <> rev
93+ | rev <- maybeToList cleanGitRev
94+ ]
95+ exitSuccess
96+
6697 traceWith tracer (WithEventType " Configuration" dmqConfig)
6798 nt <- readTopologyFileOrError topologyFile
6899 traceWith tracer (WithEventType " NetworkTopology" nt)
69100
70101 stdGen <- newStdGen
71102 let (psRng, policyRng) = split stdGen
72103
73- withNodeKernel @ StandardCrypto psRng $ \ nodeKernel -> do
104+ withNodeKernel @ StandardCrypto tracer dmqConfig psRng $ \ nodeKernel -> do
74105 dmqDiffusionConfiguration <- mkDiffusionConfiguration dmqConfig nt
75106
76107 let dmqNtNApps =
@@ -92,7 +123,8 @@ runDMQ commandLineConfig = do
92123 (\ _ _ -> Right () :: Either Void () )
93124 (\ _ -> True )
94125 (mempool nodeKernel)
95- in NtC. ntcApps mempoolReader mempoolWriter maxMsgs
126+ in NtC. ntcApps tracer dmqConfig
127+ mempoolReader mempoolWriter maxMsgs
96128 (NtC. dmqCodecs encodeReject decodeReject)
97129 dmqDiffusionArguments =
98130 diffusionArguments (if handshakeTracer
0 commit comments