Repository navigation
Releases
Releases · ST-DEVPT/smoketrace
v0.16.0
- Heatmap colours that hold without hue. Warning, critical and down cells now step clearly in lightness in
both themes (in the light theme warning and critical had almost the same lightness, so with red-green colour
blindness they read as one). The cells, the table's history strips, the loss bars and their legends have their
own colours for this; status text and icons keep theirs. - The page is locked to its own server: a Content-Security-Policy (it loads and talks to this server only,
nothing may frame it, forms post here only) andReferrer-Policy: no-referrer, on the page and the sign-in.
v0.15.1
- The image runs Python 3.15 (was 3.14); CI tests 3.10 to 3.15.
- CI actions updated: actions/setup-python 7.1.0, docker/login-action 4.7.0.
v0.15.0
- New versions are announced. Every 6 hours the server asks GitHub for the latest release. When it is newer,
the sidebar says so (with a dot on the menu button on phones), with what changed and how to update, for the
server and for every site; one alert goes out per version (Discord, ntfy, webhook), remembered across restarts;
agents log it.UPDATE_CHECK=0turns the check off. - Update from the page. With
UPDATE_URL(the webhook or HTTP API of an updater you run, one that pulls the
image and recreates the container) andPASSWORD, an Update button asks the updater, waits for the new
version to answer and reloads the page. It updates the server; each site runs its own command. smoketrace is
never given the Docker socket. - Every site's version on the Sites page, marked when it is not on the server's (agents now say their
version; older ones show none). - A review of the page in every style (dark and light, English and Portuguese, 390, 768 and 1440 px), measured,
not eyeballed, on the overview, a target, Targets with its form, Sites, the update dialog and the sign-in: no
sideways scroll and no clipped text; every HTML text reaches 4.5:1 contrast (the light theme's secondary grey
and the amber of warning text were 3.8 to 4.4; the amber of heatmap cells and icons stays as it was, so the
cells still darken with severity); every control that stands alone is at least 24 px (table headers, Edit, the
sidebar's buttons); "Sign out" no longer breaks over two lines; the update commands wrap instead of hiding
their end; focus shows on every keyboard stop of the overview. Not measured: text drawn on the charts' canvas.
v0.14.1
A review of the whole project; what it found:
- Fixed:
DEMO=1deleted the real history. The demo starts by deleting its database, and in the imageDBis
/data/smoketrace.db, so turning the demo on in an existing compose file wiped it (and, since 0.14.0, dropped
every table of a MariaDBDB). The demo now keeps its owndemo.dbnext toDB, refuses a MariaDBDB, and a
test checks it can never pick the databaseDBnames. - Fixed: an agent behind a proxy could lose every round. 0.13.1 dropped any round answered 400, but a 400 may
come from a proxy in front of the server (plain HTTP sent to an HTTPS port, a firewall) and then every round was
thrown away. A round is dropped only when smoketrace itself refused it (itsbad roundanswer, any version) or
it is too large to ever pass; any other answer keeps it until the path is fixed. - Fixed: a pull agent's container was always "unhealthy". Its health check built the address from
LISTEN
wrongly (127.0.0.1:81000.0.0.0:8100). CI now starts a pull agent and waits for Docker to call it healthy. - Fixed:
PINGS=1broke every chart longer than a day (a division byPINGS - 1). - Errors inside a request are answered (500; 503 to an agent's push, which keeps that round and sends it again)
instead of the connection being dropped; a trace whose row the daily prune already removed reads as empty. - All sites lines its sites' heatmap cells up: a site's board made a cell earlier is made again.
- Sign-in: wrong passwords go one a second however many are sent at once, even all at the same moment (the
rest are answered 429 at once, without a thread held for each). - The image's one package, PyMySQL, is pinned by hash (
requirements.txt, kept current by Dependabot), and a
failed install fails the build. - Docs: the compose files' pinned-version example and the
ASN=0notes; SECURITY.md lists the Sites page, the
outside lookups and MariaDB.
v0.14.0
- MariaDB as the database, if you want it. SQLite stays the default.
DB=mariadb://user:password@host:3306/name
(ormysql://, MySQL 8 too) keeps the history in MariaDB instead; the password can go inDB_PASSWORD.
smoketrace makes its tables at the first start.docker-compose.mariadb.yml
runs it with a MariaDB of its own. The image now carries PyMySQL for this; without Docker,pip install PyMySQL. --copy-from(COPY_FROM): one-off, copies another database's history intoDB, SQLite to MariaDB or
back; rows already there are kept.- Rounds stored at the same moment from several sites retry when MariaDB reports a deadlock, and the daily
clean-up of old rows runs apart from the round that triggers it.
v0.13.1
- Fixed: one refused round stopped an agent for good. The agent kept a round the server refused (HTTP 400)
at the head of its queue and sent it again before any other, so every round after it piled up behind it
("push failed, 6 round(s) kept: HTTP Error 400"). It now drops a refused round, logs the server's reason, and
sends the rest; a wrong token or a server error still keeps the rounds for later. - The server refuses less. A target the agent is no longer given (removed, or its agent unticked, between
the agent's fetch and its push) or one target's bad figures used to refuse the whole round. Now only that
target's part is left out and logged; the round is kept. A round that is wrong as a whole (its time, its shape)
is still refused, now with the reason in the answer.
v0.13.0
- Sites page: every site (this server and its agents) with its public address, the network and country that
address is announced from, its last round and how many targets it probes. Type a place, a country, a provider
or a note where what was found is wrong; what you type wins, everywhere the site is named. Editing needs
PASSWORD, like the targets. - Where a site is, measured, not guessed. 0.12 took a site's provider from the first hop of its traceroutes
with an AS number, which is often the upstream, and its country from that AS's name, which is where the AS is
registered. Each site now asks for its own public address once an hour (one DNS question to Google's name
servers) and sends it with its rounds; the network, prefix and country come from Team Cymru's origin lookup of
that address. A 0.12 agent sends no address: its push's own address is used when it is public.ASN=0turns
the lookups off. - Charts no longer wait after a quiet spell. A board nobody had looked at for 10 minutes was thrown away, so
the next visitor waited for a new one (seconds for a week of 555 targets). It is now kept and shown at once, a
fresh one is made behind it, and the page fetches that a few seconds later. The overview's first board is made
when the server starts, and each board is compressed once for every viewer instead of once per request. - OK cells in the heatmap are a muted green (and so are the OK stretches of the table's history strips), so
a working target reads as working at a glance.
v0.12.0
- Fixed: the heatmap's buttons stopped working. A click on empty space in the page (between the controls, on the
heatmap's header) was read as a click on a view button, because the page itself carried adata-viewmarker.
The view became "dash", was saved, and from then on no view button was pressed and the heatmap's colour buttons
did nothing; it survived reloads. The marker is renamed, a saved view must be heatmap, table or cards, and
test_ui.pyclicks empty space to keep it so. 1200 random clicks across the overview found nothing else. - The overview no longer waits on a new round. Each round made the next visitor wait while the board was
rebuilt: up to 15 s for a week of every site on 555 targets. The last board is now served at once while the new
one is made behind it, and the boards someone looked at in the last 10 minutes are rebuilt right after each
round (only those, so a view opened once does not cost CPU every round from then on). - A target's page asks for its data and the other sites' together instead of one after the other.
- Working targets are green again: the status dot of an OK target, in the list, the heatmap rows and the cards.
- Names as you write them: host names may have capitals and
_(My_Host.lan), and so may site names in
NAMEandAGENTS(FS_OPO). A host that starts with-is still refused. - Where each site is: Seen from shows each site's country, and its provider in the tooltip, taken from its
own traceroutes (the network of its first hop with an AS number). The same line heads each site's traceroute.
Nothing is sent to an outside service. - The probe timeout kill also works where there are no process groups (Windows, for development).
v0.11.0
- Agents and servers no longer run out of processes. In the image, Python was PID 1: each mtr killed for
running too long left its helpers (mtr-packet, the child that looks up AS numbers) as zombies nobody reaped,
until mtr could not fork, fping failed with "Resource temporarily unavailable" and every round stopped with
"can't start new thread".tiniis now PID 1 and reaps them, and a probe that times out is killed with its
whole process group. CI checks that the containers run under tini with no zombies. - Every site's traceroute. When a target's page compares sites (always with All), the traceroute panel
shows each site's traceroute of the same moment, one under the other with the site's name, and Latency by hop
draws one chart per site.
v0.10.0
- Every site on one page. With agents, Seen from starts with All, now the default: each target shows
the status of the site where it is worst, with that site's latency and loss, and a heatmap cell is the worst any
site saw. The problems say which site sees each one, the timeline says where each change happened, and a target's
page shows its worst site with every site drawn on the chart. Picking home, porto or another site shows the
targets from there only, as before; the choice is remembered.