add geoip node mapping and cleanup dockerfiles

This commit is contained in:
lza_menace
2023-10-10 23:10:14 -07:00
parent 4650866877
commit 086b023dfc
7 changed files with 498 additions and 88 deletions

View File

@@ -1,4 +1,4 @@
FROM ubuntu:22.04
FROM ubuntu:22.04 as OG
ENV MONERO_HASH 186800de18f67cca8475ce392168aabeb5709a8f8058b0f7919d7c693786d56b
ENV MONERO_DL_URL https://downloads.getmonero.org/cli/monero-linux-x64-v0.18.2.2.tar.bz2
@@ -34,7 +34,9 @@ RUN wget -qO ${MONERO_DL_FILE} ${MONERO_DL_URL} \
WORKDIR /data
RUN wget https://gui.xmr.pm/files/block.txt -q
# Copy to fresh Ubuntu image to reduce size
FROM ubuntu:22.04
COPY --from=OG /usr/local/bin/monerod /usr/local/bin/monerod
EXPOSE 18080
EXPOSE 18081

13
dockerfiles/nodemapper Normal file
View File

@@ -0,0 +1,13 @@
FROM ubuntu:22.04 as OG
WORKDIR /srv/nodemapper
RUN apt update && apt install wget python3 python3-venv -y
RUN python3 -m venv .venv
RUN .venv/bin/pip install flask==3.0.0
RUN .venv/bin/pip install geoip2==4.7.0
RUN wget https://github.com/P3TERX/GeoLite.mmdb/raw/download/GeoLite2-City.mmdb -qO ./geoip.mmdb
COPY nodemapper.py app.py
ENTRYPOINT [ ".venv/bin/flask", "--app", "app", "run", "--host", "0.0.0.0" ]

56
dockerfiles/nodemapper.py Normal file
View File

@@ -0,0 +1,56 @@
#!/usr/bin/env python3
"""
This is a lightweight web service which will retrieve a peer list
from a Monero node, determine GeoIP information, and return
a list of metrics in a Prometheus compatible structure.
Use it to start plotting maps of active node connections.
"""
import socket, struct
from os import environ as env
import requests
import geoip2.database
from flask import Flask, make_response
app = Flask(__name__)
NODE_HOST = env.get('NODE_HOST', 'monerod')
NODE_PORT = env.get('NODE_PORT', 18083)
def get_geoip(ip):
"""Takes an IP address and determines GeoIP data"""
with geoip2.database.Reader("./geoip.mmdb") as reader:
return reader.city(ip)
@app.route("/metrics")
def nodes():
"""Return all nodes"""
peers = list()
peer_list = requests.get(f'http://{NODE_HOST}:{NODE_PORT}/get_peer_list').json()
def add_peer(host, status):
geo = get_geoip(host)
geostr = 'geoip{{latitude="{lat}", longitude="{lon}", country_code="{country_code}", country_name="{country_name}", status="{status}"}} 1'
if geostr not in peers:
peers.append(geostr.format(
lat=geo.location.latitude,
lon=geo.location.longitude,
country_code=geo.continent.code,
country_name=geo.continent.names['en'],
status=status
))
for peer in peer_list['gray_list']:
if peer.get('host'):
add_peer(peer['host'], 'gray')
for peer in peer_list['white_list']:
if peer.get('host'):
add_peer(peer['host'], 'white')
data = '\n'.join(peers)
response = make_response(data, 200)
response.mimetype = "text/plain"
return response