import electrumx
import aiorpcx

import asyncio
import hashlib
import socket
import ssl

async def main():
    coin_peers = {
        coin.NAME: coin.PEERS
        for coin in electrumx.lib.coins.util.subclasses(electrumx.lib.coins.Coin)
        if len(coin.PEERS) > 0
    }

    nonverifying_ssl = ssl.SSLContext(ssl.PROTOCOL_TLS)
    
    for name, peers in coin_peers.items():
        try:
            for peer in peers:
                peer = electrumx.lib.peer.Peer.from_real_name(peer, '')
                cert_msg = ''
                client = aiorpcx.connect_rs(peer.host, peer.ssl_port, ssl=True)
                try:
                    transport, protocol = await client.create_connection()
                except ssl.SSLCertVerificationError as err:
                    if err.reason != 'CERTIFICATE_VERIFY_FAILED':
                        raise
                    else:
                        cert_msg = err.verify_message
                        client = aiorpcx.connect_rs(peer.host, peer.ssl_port, ssl=nonverifying_ssl)
                        transport, protocol = await client.create_connection()
                except socket.gaierror as err:
                    print(peer.real_name(), err.args[1])
                    continue
                except ConnectionRefusedError:
                    print(peer.real_name(), 'ssl connection refused')
                    continue
                except OSError as err:
                    if type(err) is OSError:
                        print(peer.real_name(), err.args[0].split(': ', 1)[1])
                    elif type(err) is TimeoutError:
                        print(peer.real_name(), 'timeout', err.strerror)
                    else:
                        import pdb; pdb.set_trace()
                        print(err)
                    continue
                try:
                    ssl_obj = protocol.session.transport._asyncio_transport.get_extra_info('ssl_object')
                    der_cert = ssl_obj.getpeercert(True)
                    for alg in 'md5 sha1 sha256 blake2b'.split(' '):
                        cert_print = getattr(hashlib, alg)(der_cert).hexdigest()
                        print(peer.real_name(), alg, cert_print, cert_msg)
                finally:
                    await protocol.session.close()
        except KeyError:
            continue

asyncio.run(main())
