Skip to content

Commit 42f2368

Browse files
committed
Add prefix aggregates and advertised prefixes queries to ASN page. Update template to display new data tables for aggregates and advertised prefixes, enhancing the overall information presentation for ASNs.
1 parent 364a1ef commit 42f2368

2 files changed

Lines changed: 133 additions & 5 deletions

File tree

routes/asn.py

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,55 @@ def asn(asn):
114114
FROM info_asn
115115
WHERE asn = :asn
116116
""")
117+
118+
# Query for prefix aggregates
119+
aggregates_query = text("""
120+
SELECT r.aggregate
121+
FROM (
122+
SELECT distinct w.prefix,
123+
FIRST_VALUE(a.prefix) OVER (
124+
PARTITION BY w.prefix ORDER BY a.prefix ASC) as aggregate
125+
FROM (
126+
SELECT prefix
127+
FROM global_ip_rib
128+
WHERE iswithdrawn = false
129+
AND recv_origin_as = :asn
130+
AND prefix_len > 0 and prefix_len <= 25
131+
GROUP BY prefix
132+
) w
133+
JOIN (
134+
SELECT distinct prefix
135+
FROM global_ip_rib
136+
WHERE iswithdrawn = false
137+
AND recv_origin_as = :asn
138+
AND prefix_len > 0 and prefix_len <= 25
139+
) a ON (w.prefix <<= a.prefix)
140+
) r
141+
GROUP BY r.aggregate
142+
ORDER BY aggregate
143+
""")
144+
145+
# Query for advertised prefixes with details
146+
advertised_prefixes_query = text("""
147+
SELECT
148+
r.prefix,
149+
r.rpki_origin_as,
150+
i.origin_as as irr_origin_as,
151+
r.last_change,
152+
i.descr as irr_description,
153+
i.source as irr_source
154+
FROM (
155+
SELECT
156+
prefix,
157+
rpki_origin_as,
158+
max(timestamp) as last_change
159+
FROM global_ip_rib
160+
WHERE recv_origin_as = :asn
161+
GROUP BY prefix, rpki_origin_as
162+
) r
163+
LEFT JOIN info_route i ON (i.prefix = r.prefix)
164+
ORDER BY r.prefix
165+
""")
117166

118167
# Execute queries
119168
ipv4_result = db.execute(ipv4_query, {"asn": asn})
@@ -135,6 +184,24 @@ def asn(asn):
135184
# Get ASN Info
136185
asn_info_result = db.execute(asn_info_query, {"asn": asn})
137186
asn_info = asn_info_result.fetchone()
187+
188+
# Get prefix aggregates
189+
aggregates_result = db.execute(aggregates_query, {"asn": asn})
190+
prefixes_aggregates = [row[0] for row in aggregates_result.fetchall()]
191+
192+
# Get advertised prefixes
193+
advertised_prefixes_result = db.execute(advertised_prefixes_query, {"asn": asn})
194+
prefixes = [
195+
{
196+
'prefix': row[0],
197+
'rpki_origin_as': row[1],
198+
'irr_origin_as': row[2],
199+
'last_changed': row[3].isoformat() if row[3] else None,
200+
'irr_description': row[4],
201+
'irr_source': row[5]
202+
}
203+
for row in advertised_prefixes_result.fetchall()
204+
]
138205

139206
# Process trend data
140207
trend_data = []
@@ -195,5 +262,7 @@ def asn(asn):
195262
trend_data=trend_data,
196263
asn_info=asn_info_dict,
197264
upstream_asns=upstream_asns,
198-
downstream_asns=downstream_asns
265+
downstream_asns=downstream_asns,
266+
prefixes_aggregates=prefixes_aggregates,
267+
prefixes=prefixes
199268
)

templates/pages/asn.html

Lines changed: 63 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ <h2 class="container__title" id="asn">
4141
<div class="tab__item" target="connectivity">
4242
Connectivity
4343
</div>
44-
<div class="tab__item" target="measurements">
45-
Measurements
44+
<div class="tab__item" target="activity">
45+
Activity
4646
</div>
4747
<div class="tab__item" target="whois">
4848
Whois
@@ -184,12 +184,71 @@ <h2 class="container__title" id="asn">
184184
</div>
185185
</div>
186186
<div class="content__panel" id="prefixes" aria-labelledby="tab-prefixes">
187-
Tab Panel 2
187+
<div class="panel__content">
188+
<div class="content__tables">
189+
<cds-table class="tables__item tables__item--span-16-columns cds-theme-zone-white" with-header="true">
190+
<cds-table-header-title slot="title" style="font-size: 1rem; margin-bottom: 0.5rem;">
191+
Aggregates
192+
</cds-table-header-title>
193+
<cds-table-header-description slot="description" style="font-weight: 250; font-size: 1rem; margin-bottom: -0.5rem;">
194+
All prefixes advertised by this ASN
195+
</cds-table-header-description>
196+
<cds-table-head>
197+
<cds-table-header-row>
198+
<cds-table-header-cell>Prefix</cds-table-header-cell>
199+
</cds-table-header-row>
200+
</cds-table-head>
201+
<cds-table-body>
202+
{% for prefix in prefixes_aggregates %}
203+
<cds-table-row>
204+
<cds-table-cell>{{ prefix }}</cds-table-cell>
205+
</cds-table-row>
206+
{% endfor %}
207+
</cds-table-body>
208+
</cds-table>
209+
210+
<cds-table class="tables__item tables__item--span-16-columns cds-theme-zone-white" with-header="true">
211+
<cds-table-header-title slot="title" style="font-size: 1rem; margin-bottom: 0.5rem;">
212+
Advertised Prefixes
213+
</cds-table-header-title>
214+
<cds-table-header-description slot="description" style="font-weight: 250; font-size: 1rem; margin-bottom: -0.5rem;">
215+
All prefixes advertised by this ASN, including multiple entries from IRR databases
216+
</cds-table-header-description>
217+
<cds-table-toolbar slot="toolbar">
218+
<cds-table-toolbar-content ?has-batch-actions="true">
219+
<cds-table-toolbar-search placeholder="Filter prefixes" expanded></cds-table-toolbar-search>
220+
</cds-table-toolbar-content>
221+
</cds-table-toolbar>
222+
<cds-table-head>
223+
<cds-table-header-row>
224+
<cds-table-header-cell>Prefix</cds-table-header-cell>
225+
<cds-table-header-cell>RPKI Origin AS</cds-table-header-cell>
226+
<cds-table-header-cell>IRR Origin AS</cds-table-header-cell>
227+
<cds-table-header-cell>Last Change</cds-table-header-cell>
228+
<cds-table-header-cell>IRR Description</cds-table-header-cell>
229+
<cds-table-header-cell>IRR Source</cds-table-header-cell>
230+
</cds-table-header-row>
231+
</cds-table-head>
232+
<cds-table-body>
233+
{% for prefix in prefixes %}
234+
<cds-table-row>
235+
<cds-table-cell>{{ prefix.prefix }}</cds-table-cell>
236+
<cds-table-cell>{{ prefix.rpki_origin_as or '' }}</cds-table-cell>
237+
<cds-table-cell>{{ prefix.irr_origin_as or '' }}</cds-table-cell>
238+
<cds-table-cell>{{ prefix.last_changed or '' }}</cds-table-cell>
239+
<cds-table-cell>{{ prefix.irr_description or '' }}</cds-table-cell>
240+
<cds-table-cell>{{ prefix.irr_source or '' }}</cds-table-cell>
241+
</cds-table-row>
242+
{% endfor %}
243+
</cds-table-body>
244+
</cds-table>
245+
</div>
246+
</div>
188247
</div>
189248
<div class="content__panel" id="connectivity" aria-labelledby="tab-connectivity">
190249
Tab Panel 3
191250
</div>
192-
<div class="content__panel" id="measurements" aria-labelledby="tab-measurements">
251+
<div class="content__panel" id="activity" aria-labelledby="tab-activity">
193252
Tab Panel 4
194253
</div>
195254
<div class="content__panel" id="whois" aria-labelledby="tab-whois">

0 commit comments

Comments
 (0)