66
77module Cardano.CLI.Compatible.StakePool.Run
88 ( runCompatibleStakePoolCmds
9+ , stakePoolRelayToAddr
910 )
1011where
1112
13+ import Control.Tracer (nullTracer , (>$<) )
14+ import Data.IP (IP (.. ))
15+ import Data.ByteString.Char8 qualified as BSC
16+
1217import Cardano.Api
1318import Cardano.Api.Compatible.Certificate
1419import Cardano.Api.Experimental qualified as Exp
15- import Cardano.Api.Experimental.Certificate (StakePoolParameters (.. ), toShelleyPoolParams )
20+ import Cardano.Api.Experimental.Certificate (StakePoolParameters (.. ), StakePoolRelay ( .. ), toShelleyPoolParams )
1621
1722import Cardano.CLI.Compatible.Exception
1823import Cardano.CLI.Compatible.StakePool.Command
@@ -24,6 +29,8 @@ import Cardano.CLI.Type.Common
2429import Cardano.CLI.Type.Error.StakePoolCmdError
2530import Cardano.CLI.Type.Key (readVerificationKeyOrFile )
2631
32+ import Cardano.Network.Ping qualified as Ping
33+
2734import Control.Monad
2835
2936runCompatibleStakePoolCmds
@@ -53,6 +60,32 @@ runStakePoolRegistrationCertificateCmd
5360 , outFile
5461 } =
5562 shelleyBasedEraConstraints sbe $ do
63+
64+ let pingOpts =
65+ Ping. PingOpts {
66+ Ping. pingOptsCount = 1 ,
67+ Ping. pingOptsMagic = toNetworkMagic network,
68+ Ping. pingOptsJson = Ping. AsText ,
69+ Ping. pingOptsQuiet = True ,
70+ Ping. pingOptsSRVPrefix = " _cardano._tcp" ,
71+ Ping. pingOptsColor = Ping. ColorNever ,
72+ Ping. pingOptsMode = Ping. TipMode
73+ }
74+ pingErrs <- liftIO $ do
75+ stderr <- Ping. mkStdErrTracer
76+ headerTracer <- Ping. mkHeaderTracer pingOpts stderr
77+ Ping. pingClients'
78+ (Ping. format Ping. AsText >$< stderr)
79+ nullTracer
80+ headerTracer
81+ (Ping. toText >$< stderr)
82+ pingOpts
83+ Ping. AddressIsNotAFilePath
84+ (concatMap stakePoolRelayToAddr relays)
85+
86+ unless (null pingErrs) $
87+ throwCliError (StakePoolCmdRelayPingErrors pingErrs)
88+
5689 -- Pool verification key
5790 stakePoolVerKey <- getVerificationKeyFromStakePoolVerificationKeySource poolVerificationKeyOrFile
5891 let stakePoolId' = anyStakePoolVerificationKeyHash stakePoolVerKey
@@ -100,3 +133,18 @@ runStakePoolRegistrationCertificateCmd
100133 where
101134 registrationCertDesc :: TextEnvelopeDescr
102135 registrationCertDesc = " Stake Pool Registration Certificate"
136+
137+
138+ stakePoolRelayToAddr
139+ :: StakePoolRelay
140+ -> [Ping. Address (Ping. Unresolved Ping. SRVOrFilePathUnresolved )]
141+ stakePoolRelayToAddr (StakePoolRelayIp (Just ipv4) Nothing (Just port)) = [Ping. IP (IPv4 ipv4) (fromIntegral port)]
142+ stakePoolRelayToAddr (StakePoolRelayIp Nothing (Just ipv6) (Just port)) = [Ping. IP (IPv6 ipv6) (fromIntegral port)]
143+ stakePoolRelayToAddr (StakePoolRelayIp (Just ipv4) (Just ipv6) (Just port)) = [Ping. IP (IPv6 ipv6) (fromIntegral port), Ping. IP (IPv4 ipv4) (fromIntegral port)]
144+ -- the pSingHostAddress parser always includes a port number
145+ stakePoolRelayToAddr (StakePoolRelayIp _ _ Nothing ) = error " unexpected happend"
146+ -- the pSingHostAddress parser always includes at least one ip address
147+ stakePoolRelayToAddr (StakePoolRelayIp Nothing Nothing _) = error " unexpected happend"
148+ stakePoolRelayToAddr (StakePoolRelayDnsARecord dns (Just port)) = [Ping. mkAddress (BSC. unpack dns ++ " :" ++ show port)]
149+ stakePoolRelayToAddr (StakePoolRelayDnsARecord dns Nothing ) = [Ping. mkAddress (BSC. unpack dns)]
150+ stakePoolRelayToAddr (StakePoolRelayDnsSrvRecord srv) = [Ping. mkAddress (BSC. unpack srv)]
0 commit comments