def fetch_routing_info(self, address):
metadata = {}<EOL>records = []<EOL>def fail(md):<EOL><INDENT>if md.get("<STR_LIT:code>") == "<STR_LIT>":<EOL><INDENT>raise RoutingProtocolError("<STR_LIT>".format(address))<EOL><DEDENT>else:<EOL><INDENT>raise RoutingProtocolError("<STR_LIT>".format(address))<EOL><DEDENT><DEDENT>try:<EOL><INDENT>with self.acquire_direct(address) as cx:<EOL><INDENT>_, _, server_version = (cx.server.agent or "<STR_LIT>").partition("<STR_LIT:/>")<EOL>if server_version and Version.parse(server_version) >= Version((<NUM_LIT:3>, <NUM_LIT:2>)):<EOL><INDENT>log_debug("<STR_LIT>", cx.local_port, self.routing_context or {})<EOL>cx.run("<STR_LIT>",<EOL>{"<STR_LIT>": self.routing_context}, on_success=metadata.update, on_failure=fail)<EOL><DEDENT>else:<EOL><INDENT>log_debug("<STR_LIT>", cx.local_port)<EOL>cx.run("<STR_LIT>", {}, on_success=metadata.update, on_failure=fail)<EOL><DEDENT>cx.pull_all(on_success=metadata.update, on_records=records.extend)<EOL>cx.sync()<EOL>routing_info = [dict(zip(metadata.get("<STR_LIT>", ()), values)) for values in records]<EOL>log_debug("<STR_LIT>", cx.local_port, routing_info)<EOL><DEDENT>return routing_info<EOL><DEDENT>except RoutingProtocolError as error:<EOL><INDENT>raise ServiceUnavailable(*error.args)<EOL><DEDENT>except ServiceUnavailable:<EOL><INDENT>self.deactivate(address)<EOL>return None<EOL><DEDENT>
Fetch raw routing info from a given router address.

        :param address: router address
        :return: list of routing records or
                 None if no connection could be established
        :raise ServiceUnavailable: if the server does not support routing or
                                   if routing support is broken