File: //opt/alt/python37/lib/python3.7/site-packages/pyroute2/ndb/__pycache__/query.cpython-37.pyc
B
��f � @ s d dl mZ G dd� de�ZdS )� )� RecordSetc @ sH e Zd Zddd�Zddd�Zddd�Zdd d
�Zddd�Zdd
d�ZdS )�Query�rawc C s || _ || _d S )N)�_schema�_fmt)�selfZschema�fmt� r �C/opt/alt/python37/lib/python3.7/site-packages/pyroute2/ndb/query.py�__init__ s zQuery.__init__Nc c s� |p| j }|dkrj|r"d�|�V x�|D ]<}|r8||�}t|ttf�r^d�dd� |D ��V q(|V q(W n<|dkr�|r||V x(|D ]}|r�||�}|V q�W ntd��d S )N�csv�,c S s g | ]}t |��qS r )�str)�.0�xr r r
�
<listcomp> s z$Query._formatter.<locals>.<listcomp>r zformat not supported)r �join�
isinstance�list�tuple� TypeError)r �cursorr �headerZ transform�recordr r r
�
_formatter s$
zQuery._formatterc C s d}t | �| j�d�||��S )z8
List all the nodes within the cluster.
)�nodenamezJ
SELECT DISTINCT f_target
FROM interfaces
)r r r �fetch)r r r r r r
�nodes s zQuery.nodesc C s d}t | �| j�d�||��S )zc
List point to point edges within the cluster, like
GRE or PPP interfaces.
)� left_node�
right_nodez�
SELECT DISTINCT
l.f_target, r.f_target
FROM p2p AS l
INNER JOIN p2p AS r
ON
l.f_p2p_local = r.f_p2p_remote
AND l.f_target != r.f_target
)r r r r )r r r r r r
� p2p_edges2 s zQuery.p2p_edgesc C s d}t | �| j�d�||��S )a�
List l2 links within the cluster, reconstructed
from the ARP caches on the nodes. Works as follows:
1. for every node take the ARP cache
2. for every record in the cache reconstruct two triplets:
* the interface index -> the local interface name
* the neighbour lladdr -> the remote node and interface name
Issues: does not filter out fake lladdr, so CARP interfaces
produce fake l2 edges within the cluster.
)r Zleft_ifnameZleft_lladdrr Zright_ifnameZright_lladdra�
SELECT DISTINCT
j.f_target, j.f_IFLA_IFNAME, j.f_IFLA_ADDRESS,
d.f_target, d.f_IFLA_IFNAME, j.f_NDA_LLADDR
FROM
(SELECT
n.f_target, i.f_IFLA_IFNAME,
i.f_IFLA_ADDRESS, n.f_NDA_LLADDR
FROM
neighbours AS n
INNER JOIN
interfaces AS i
ON
n.f_target = i.f_target
AND i.f_IFLA_ADDRESS != '00:00:00:00:00:00'
AND n.f_ifindex = i.f_index) AS j
INNER JOIN
interfaces AS d
ON
j.f_NDA_LLADDR = d.f_IFLA_ADDRESS
AND j.f_target != d.f_target
)r r r r )r r r r r r
�l2_edgesJ s zQuery.l2_edgesc C s d}t | �| j�d�||��S )aG
List l3 edges. For every address on every node look
if it is used as a gateway on remote nodes. Such cases
are reported as l3 edges.
Issues: does not report routes (edges) via point to point
connections like GRE where local addresses are used as
gateways. To be fixed.
)Zsource_nodeZgateway_nodeZgateway_address�dstZdst_lena
SELECT DISTINCT
r.f_target, a.f_target, a.f_IFA_ADDRESS,
r.f_RTA_DST, r.f_dst_len
FROM
addresses AS a
INNER JOIN
routes AS r
ON
r.f_target != a.f_target
AND r.f_RTA_GATEWAY = a.f_IFA_ADDRESS
AND r.f_RTA_GATEWAY NOT IN
(SELECT
f_IFA_ADDRESS
FROM
addresses
WHERE
f_target = r.f_target)
)r r r r )r r r r r r
�l3_edges s zQuery.l3_edges)r )NNN)N)N)N)N) �__name__�
__module__�__qualname__r r r r r! r# r r r r
r s
5r N)�reportr �objectr r r r r
�<module> s