eping 4.12__tar.gz → 4.76__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: eping
3
- Version: 4.12
3
+ Version: 4.76
4
4
  Summary: Continuous ICMP reachability monitor built on fping, with a CSV logfile analyser (epinga)
5
5
  Author-email: Ewald Jeitler <ewald@jeitler.cc>
6
6
  License: GPL-3.0-or-later
@@ -17,13 +17,25 @@ Description-Content-Type: text/markdown
17
17
  License-File: LICENSE
18
18
  Dynamic: license-file
19
19
 
20
- # eping.py 4.12
20
+ # eping.py 4.76
21
21
 
22
22
  Continuous ICMP reachability monitor built on `fping`. Scans a host list in a loop,
23
23
  reports each host UP/DOWN/NO-DNS, counts state changes. CLI (curses) or web GUI.
24
24
 
25
25
  Written by Ewald Jeitler — <https://www.jeitler.cc>
26
26
 
27
+ ## Screenshots
28
+
29
+ Web GUI (`-web`) - 61 demo hosts, mouse-over shows the host details and its state history:
30
+
31
+ ![eping web GUI](https://raw.githubusercontent.com/ewaldj/eping/main/docs/img/web-gui.png)
32
+
33
+ ![eping web GUI, host details](https://raw.githubusercontent.com/ewaldj/eping/main/docs/img/web-gui-host-details.png)
34
+
35
+ Terminal (curses) mode:
36
+
37
+ ![eping CLI](https://raw.githubusercontent.com/ewaldj/eping/main/docs/img/cli.png)
38
+
27
39
  ## Requirements
28
40
 
29
41
  - Python 3.6+ (eping.py and epinga.py)
@@ -57,7 +69,7 @@ Portable Windows version (web GUI only, no installation): download and unpack
57
69
  - The web GUI opens in the browser (default `http://127.0.0.1:8080`). The port is read from the hosts file
58
70
  (`opt: -port 9000`); a port already in use is reported and can be changed in the launcher window.
59
71
  - No terminal (curses) mode and no `-wv`/`-wvc` on Windows; log file names use `-` instead of `:`.
60
- - Extra options: put them in `eping-args.txt` next to `eping.exe`. Details: `README-WINDOWS.txt` in the zip.
72
+ - Extra options: CLI options field or `eping-args.txt` in the working folder. Working folder: `<home>/eping` (`%USERPROFILE%\eping` on Windows) - hosts file, logs, reports, `eping-console.log`, `eping-args.txt` and `eping-launcher.cfg` live there, so the program folder needs no write access. Change it with the *Working dir* field (paste a path, Enter confirms) or the *Change...* button (folder dialog); applied with Start / Restart, or with `-wd DIR` in the CLI options field (wins over the button) (hosts file, logs, reports and console log then use DIR). An `eping-args.txt` / `eping-launcher.cfg` found next to the program (older versions) is read until the first save; copy an existing `eping-hosts.txt` to the working folder once. Details: `README-WINDOWS.txt` in the zip.
61
73
 
62
74
  ## Quick start
63
75
 
@@ -131,7 +143,7 @@ flag typed on the command line wins over the same flag from a file. Only applies
131
143
  the initial `-f` read at startup — `F`/ADD FILE (CLI) and ADD HOSTS FILE (web)
132
144
  never parse `opt:` lines, they're just text.
133
145
 
134
- `opt:` lines also work at the top of an inventory `.csv`. SAVE HOSTS FILE and DOWNLOAD ALL/ACTIVE HOSTS write every option that differs from the default there (start-up flags and live ADV OPTIONS changes; not `-f -df -n -r -o -up -setref -gn -cl`).
146
+ `opt:` lines also work at the top of an inventory `.csv`. SAVE HOSTS writes every option that differs from the default there (start-up flags and live ADV OPTIONS changes; not `-f -df -n -r -o -up -setref -gn -cl`).
135
147
 
136
148
  The default `eping-hosts.txt`: sample hosts, this section, then every CLI option as a
137
149
  commented-out `opt:` line with its default (remove `# ` to activate).
@@ -159,8 +171,8 @@ named `*.txt` are never treated as CSV - they keep the plain host file format ab
159
171
  only kept there as information.
160
172
  - **Filters**: `M` matches the inventory values as text, `V` / ADV FILTER selects them
161
173
  (see *ADV FILTER*).
162
- - **Save**: if the displayed hosts carry inventory values, `SAVE HOSTS FILE` writes an
163
- inventory `.csv` (see *Web GUI*); plain `.txt` hosts are saved as `.txt`.
174
+ - **Save**: if the displayed hosts carry inventory values, `SAVE HOSTS` offers an
175
+ inventory `.csv` (default for such hosts, see *Web GUI*) or a plain `.txt`.
164
176
 
165
177
  Example (`;` delimited, extra columns are ignored):
166
178
 
@@ -237,16 +249,24 @@ Single self-contained page, no external resources.
237
249
  if needed ("SCROLL RIGHT FOR MORE" hint in the stats bar).
238
250
  - Footer stats: HOSTS, RUNTIME, HOST UP/DOWN/FLAPPING always count all hosts; SHOWN is the
239
251
  number of rows displayed after the view, the match filter and the ADV FILTER. The CLI footer counts the same way. RUNTIME shows `n/a` briefly during a background round.
252
+ - While a source switch (local / jump host) is under way the message line shows `switching to ... - please wait ...`,
253
+ then `switched to ... - done`. The JUMPHOST button is green while a jump host is active.
240
254
  - Adding many hosts (`ADD`, ADD HOSTS FILE, upload) shows "added N host(s) - please wait,
241
255
  pinging ..." until they appear with a state, then `done`.
242
256
  - Font size 6–28px (slider, `A−`/`A+`, `+`/`−` keys), stored in `localStorage`.
243
257
  - Column headers sort the list (IPv4-aware).
244
258
  - Toolbar, two rows (wraps if narrow):
245
259
  - Row 1: view select (9 views), sort order select, SET REFERENCE, ZERO CHANGES,
246
- CLEAR ALL, address mode select, GET NAMES, ADV OPTIONS, RESET LOG, FILE OPERATIONS
247
- select, EXIT, font size.
260
+ CLEAR ALL, address mode select, GET NAMES, ADV OPTIONS, LOGGING, FILE OPERATIONS
261
+ select, STOP, font size.
248
262
  - Row 2: match filter (SET/CLEAR), ADV FILTER, host field (ADD/DELETE), ADD/DEL LIST, comment
249
- field (COMMENT), GENERATE REPORT select.
263
+ field (COMMENT), GENERATE REPORT select, PAUSE/RESUME button.
264
+ - **PAUSE / RESUME** (last button of row 2): `PAUSE` pauses the check - no pings are sent, the table, the
265
+ counters and the log stay as they are (header shows `PAUSED`, the button turns red and reads `RESUME`).
266
+ Commands (view, sort, filter, ADD/DELETE ...) keep working while paused; added hosts are pinged after
267
+ `RESUME`. A round that is running when `PAUSE` is pressed is cut short. The log gets the comment rows
268
+ `CHECK PAUSED` / `CHECK RESUMED`; epinga.py shows the pause as a gap in the timeline
269
+ (grey, like missing data) and does not count it as time in any state. Works in `-web` and `-wvc` (no CLI key); not in the read-only view (`-wv`).
250
270
  - View select, sort order select, address mode select and ADV OPTIONS all match the
251
271
  CLI's `U`/`O`/`P`/`X` pickers exactly. FILE OPERATIONS (incl. ADD HOSTS FILE FROM CLIENT/
252
272
  FROM SERVER) is web-gui-only (no CLI key - CLI already runs on the server's own
@@ -256,19 +276,13 @@ Single self-contained page, no external resources.
256
276
  |---|---|
257
277
  | ADD HOSTS FILE FROM SERVER | picks one or more `.txt` files or inventory `.csv` files already on the server, adds their hosts; a `.csv` without the inventory header, e.g. an eping log, is refused |
258
278
  | ADD HOSTS FILE FROM CLIENT | dialog with a file picker (`.txt`/`.csv`; works in Safari), adds the hosts; a file can also be dropped anywhere on the page |
259
- | SAVE HOSTS FILE ON SERVER | confirmation, then saves the currently displayed hosts; blank name overwrites the active `-f` hostfile (first one, if eping.py was started with one) or, with none active, the default `eping-hosts.txt`; a typed name always saves as that new file instead, `.txt` appended once, active hostfile left untouched. If the displayed hosts carry inventory values (CSV import) an inventory `.csv` is written instead (`;` delimited, columns as in *Inventory CSV import*); a `.txt` name or hostfile then becomes `.csv`, the default is `eping-hosts.csv`. The options that differ from the default are written first as `opt:` lines (see *Host file format*); for a `.csv` the checkboxes `include options (opt: lines)` (default on) and `save as .txt (hosts only, no inventory)` (default off) are offered |
260
- | UPLOAD FILE TO SERVER | picks a local `.txt`/`.csv`, saves as-is server-side, no host parsing; never overwrites, appends `-1`/`-2`/... |
261
- | DOWNLOAD ALL HOSTS | full reference list: inventory `.csv` if the hosts carry inventory values, else `.txt`; non-default options first as `opt:` lines (`.csv`: checkboxes `include options`, default on, and `save as .txt`, default off) |
262
- | DOWNLOAD ACTIVE HOSTS | currently displayed hosts (view/address mode/filter applied), same format and options as DOWNLOAD ALL HOSTS |
263
- | DOWNLOAD ACTIVE LOGFILE | active CSV log, zipped; disabled while logging off |
264
- | DOWNLOAD SELECTED FILES | picker: every `.csv`/`.txt`/`.html` in the working dir, table (name/size/date), extension filter, "select all", "no compression" checkbox (single-file selection only); multi-select bundles into one ZIP |
265
- | DELETE FILES FROM SERVER | same picker as DOWNLOAD SELECTED FILES, red DELETE button, confirms with file count; active logfile can't be deleted |
266
- | VIEW FILE FROM SERVER | picker: every `.csv`/`.txt` in the working dir, table (name/size/date), "select all"; opens each picked file read-only, raw content, COPY/DOWNLOAD buttons - see *VIEW FILE FROM SERVER* below |
279
+ | SAVE HOSTS | one dialog: `ALL HOSTS` (default, full reference list) or `SHOWN HOSTS` (current view/address mode/filter); `ON SERVER` or `DOWNLOAD TO THIS COMPUTER`; format `CSV` (inventory `;` columns, preselected) or `TXT` (one host per line) is offered only if the list carries inventory values, otherwise `TXT` is used without asking; checkbox `include options (opt: lines)` (default on). On the server a blank name overwrites the active `-f` hostfile (first one; extension follows the format) or, with none active, writes `eping-hosts.csv`/`.txt`; a typed name saves as that new file, active hostfile untouched |
280
+ | SERVER OPERATIONS | one dialog with a file table (every `.csv`/`.txt`/`.html`/`.zip` in the working dir; name/size/date, sortable, extension filter, "select all") and the buttons `DOWNLOAD` (more than one file = one ZIP; "no compression" checkbox for a single file), `VIEW` (only `.txt`/`.csv`, read-only, raw content, COPY/DOWNLOAD buttons - see *VIEW (SERVER OPERATIONS)* below), `DELETE` (red, confirms with file count, never the active logfile) and `UPLOAD` (picks a local `.txt`/`.csv`/`.zip`, saves as-is server-side, no host parsing; never overwrites, appends `-1`/`-2`/...) |
267
281
  - Keyboard shortcuts (no modifier, only while no text field has focus; own quick
268
282
  variants, not the CLI's picker keys of the same letter): `U` cycles the original 3
269
283
  views (ALL HOSTS → CURRENTLY-UP → UP+FLAPPING → ALL HOSTS), the other 6 need the
270
- dropdown; `O` cycles all 5 sort orders one at a time; `P`/`I` toggle PREFER HOSTNAME /
271
- SWITCH TO IP ONLY directly, the address mode select reaches all 4 modes; `G`/`S`/`Z`/
284
+ dropdown; `O` cycles all 5 sort orders one at a time; `P`/`I` toggle DEDUP: KEEP HOSTNAME /
285
+ RESOLVE ALL TO IP directly, the address mode select reaches all 4 modes; `G`/`S`/`Z`/
272
286
  `C`/`L`/`E` click the matching button (`E`/`C`/`L` confirm); `A`/`D` focus host field;
273
287
  `M`/`T` focus their field; `V` opens ADV FILTER; `F` opens the ADD HOSTS FILE FROM CLIENT picker; `R` forces a status refresh;
274
288
  `+`/`−` font size (works while typing). No keyboard shortcut for `X`/ADV OPTIONS or
@@ -340,21 +354,19 @@ directly, `D` resets the selected option to its default, `R` resets all, ESC/`X`
340
354
 
341
355
  | Option | Range | 0/-1 means |
342
356
  |---|---|---|
343
- | BACKOFF | 1 – 2 | — |
344
357
  | TIMEOUT | 10 – 5000 ms | — |
345
358
  | RETRIES | 0 – 5 | — |
346
- | DOWN RETRIES | 0 – 5 | `0` = disabled, full RETRIES |
347
359
  | INTERVAL | -1 – 250 ms | `-1` = auto (use RATE), `0` = no pacing |
348
360
  | THREADS | 0 – 32 | `0` = auto |
349
361
  | WAIT TIME | 0 – 600 s | — |
350
362
  | CONFIRM | 1 – 10 | — |
363
+ | NEW HOST GRACE | 0 – 60 s | — |
364
+ | SILENT LIMIT | 2 – 10 periods | — |
351
365
  | RATE | 10 – 25000 pps | — |
352
366
  | FLAP WINDOW | 1 – 72000 min | — |
353
- | DOWN SLICES | 1 – 20 | — |
354
- | FULL SWEEP | 0 – 50 | `0` = disabled |
355
367
  | DNS TTL | 0 – 3600 s | — |
356
368
  | TIMEZONE | -24 – +24 h | — |
357
- | MAX LOG SIZE | 0, 10 – 2500 MB | `0` = no rotation |
369
+ | MAX LOG SIZE | 0, 10 – 2500 MB | default `500`; `0` = no rotation |
358
370
  | MAX LOG FILES | 0 – 500 | `0` = unlimited |
359
371
 
360
372
  Same bounds as the matching CLI flags (`-lms`/`-lmf` for the last two - see *Output*).
@@ -380,48 +392,60 @@ Same bounds as the matching CLI flags (`-lms`/`-lmf` for the last two - see *Out
380
392
  | POST | `/api/command` | `{"cmd":"...","value":"..."}` | control (see cmd list below) |
381
393
  | POST | `/api/advvalues` | `{"filter":{...}}` | ADV FILTER: values still selectable for a draft selection (same format as `adv_filter`) |
382
394
  | POST | `/api/upload` | host list, text | add hosts |
383
- | POST | `/api/log_sources` | `{"names":[...]}` | SOURCE values of the named logfiles (empty = active logfile), for SELECT JUMPHOST |
384
395
  | POST | `/api/jumphost` | `{"action":"info|test|trust|connect|local","host":...,"port":...,"user":...,"secret":...,"hostkey":"ask|accept-new|off","key":...}` | JUMPHOST window (see *SSH source (JUMPHOST)*) |
385
396
 
386
397
  `cmd` values: `up_only`, `set_filter`, `addr_mode`, `get_names`, `match_filter`,
387
398
  `adv_filter`, `sort`, `add`, `del`, `set_ref`, `zero`, `add_comment`, `reset_log`, `clear`,
388
- `set_option`, `reset_options`, `run_report`, `save_hosts_file`, `exit`. `adv_filter` value: JSON object `{"<field>":{"mode":"in|out","values":[...]}}` with the fields `model`,
399
+ `set_option`, `reset_options`, `run_report`, `pause` (value `1` = PAUSE, `0` = RESUME), `save_hosts_file`, `exit`. `adv_filter` value: JSON object `{"<field>":{"mode":"in|out","values":[...]}}` with the fields `model`,
389
400
  `location`, `sysloc`, `type`, `comment`; `\u0001none` as value = hosts without a value; `{}` = off
390
- (the old `{"<field>":"<value>"}` form is still accepted as `in` with one value). `set_option`
401
+ `set_option`
391
402
  value: `key=value`. `reset_log` value: logging off - optional custom file name (blank =
392
403
  auto-generated); logging on - `y` (clear) or `new`/`new=<name>` (new file, optional
393
404
  custom name). `run_report`: `value` = empty (active logfile) or one `.csv` filename; or
394
405
  JSON body field `values`: `[...]` to merge and analyse multiple `.csv` files as one
395
- (max 25); optional body field `sources`: `[...]` restricts the analysis to these SOURCE values. `save_hosts_file` value: optional target file name (blank
396
- = active `-f` hostfile, or `eping-hosts.txt` if none).
406
+ (max 25); optional body field `sources`: `[...]` restricts the analysis to these SOURCE values. `save_hosts_csv`/`save_hosts_txt` (+ `_noopt`, + `_all` for all hosts) value: optional target file name (blank
407
+ = active `-f` hostfile, or `eping-hosts.csv`/`.txt` if none); `save_hosts_file` = auto format.
397
408
 
398
409
  `-wv` answers `403` to `POST /api/command`/`/api/upload`; `-wvc`/`-web` allow both. No
399
410
  authentication. Default bind `0.0.0.0` — use `-bind 127.0.0.1` outside trusted networks.
400
411
 
401
- ## How a scan round works
402
-
403
- 1. Hostnames resolved once (32 parallel), cached around `-dns` seconds (randomized a
404
- bit so a large batch resolved together doesn't all expire - and need re-resolving -
405
- in the same round later). Same-address names share one probe. Unresolvable → NO-DNS,
406
- no fping call. `-dns 0` = fping-side resolve. A command (filter, add, ...) cuts
407
- the name resolution short as well, so it applies at once even with thousands of
408
- hostnames.
409
- 2. UP/new hosts get full `-re` retries; confirmed-DOWN hosts get `-dr` retries. Every
410
- `-fs`-th round probes everything with full retries.
411
- 3. Only 1/`-ds` of DOWN hosts probed per round, strided.
412
- 4. Both classes run concurrently, one fping process each, sharing `--rate`; `-i`
413
- derived from that share.
414
- 5. With `-cf` > 1, a host leaves UP only after that many consecutive non-UP results;
415
- suppressed count written to the log's TBD column.
416
-
417
- One fping process per group (`-p` still accepts up to 32 for diagnostics): measured on
418
- a /20 with 4109 hosts, 9 processes reported 244 UP, one process reported 866.
419
-
420
- `-i` floor is 1ms (~1000 pps nominal); measured ~1.8ms (~550 pps) on a real /20. `-i 0`
421
- removes pacing (needs fping's install privileges), one hard burst.
412
+ ## How checking works (loop mode)
413
+
414
+ eping starts long-running `fping -l` processes and takes one snapshot of their latest results
415
+ per round. A process keeps one ICMP identifier for its whole life (few NAT / conntrack entries
416
+ on a router) and a jump host sees one command instead of one per round.
417
+
418
+ - **Period:** fping pings every host once per period = `-w` (at least 200 ms), raised to
419
+ `hosts x interval + timeout` so one pass fits. A round ends when every host delivered a new
420
+ result (at most one period + timeout). RUNS counts only rounds in which hosts were checked.
421
+ - **UP / DOWN:** a reply = UP at once. DOWN after `-re` + 1 timeouts in a row (fewer when the ping period is
422
+ long: the number is cut to what fits in 2 x `-t`, at least 2), or when fping delivered nothing for a host for
423
+ `-sp` periods. fping drops replies later than `-t`, so `-t` is the longest a reply may take. With `-cf` > 1 a
424
+ host leaves UP only after that many consecutive non-UP results (suppressed count in the log's TBD column).
425
+ - **New hosts:** only an answer is reported during a grace period of (miss limit + 1) periods + `-ng` s (1 s) - a slow first
426
+ contact (new NAT / firewall state) must not show up as DOWN.
427
+ - **Names:** resolved by background threads (32 parallel, cached `-dns` seconds, randomized; an expired
428
+ entry stays in use until its refresh is done). A name without an address yet joins as soon as it
429
+ resolves, a round waits at most 2 s for names never resolved before; unresolvable = NO-DNS.
430
+ `-dns 0` = fping resolves. With a jump host the jump host resolves.
431
+ - **Add / delete:** ADD starts one extra fping for the new hosts, running processes are not touched.
432
+ DELETE only stops judging the hosts. Everything is restarted (results kept) when the source or a
433
+ timing option changes, a process died, there are more than 16 processes or many hosts were removed.
434
+ - **Stall guard:** if at least 30 % (and 20) of the hosts of one fping process go silent at once, that is
435
+ taken as a stall of fping or of this computer's network, not as hosts being down: their state is kept for
436
+ up to 5 silent periods.
437
+ - **Rate:** one process sends one packet per `-i` ms, `-ra` sets the packets/s. A pass over N hosts takes at
438
+ least N / `-ra` s: 32 000 hosts at `-ra 1000` = about 34 s per round. Raise `-ra` for big lists (mind the
439
+ router / NAT / jump host). `-i` floor is 1 ms; `-i 0` removes pacing.
440
+ - PAUSE stops the processes, RESUME starts them again.
422
441
 
423
442
  ## Options
424
443
 
444
+ ### Working directory
445
+ `-wd DIR` · hosts file, logs and reports live in DIR (created if missing, `~` expanded; default: current directory).
446
+ Relative `-f` / `-sshkey` paths stay relative to the invocation directory. Not read from `opt:` lines. The macOS / Windows
447
+ launchers pass `-wd <home>/eping` by default; change it with `-wd DIR` in the launcher's CLI options field.
448
+
425
449
  ### Host selection
426
450
  `-f` hostfile(s) (comma/space separated) · `-df` disable hostfile · `-n` CIDR (comma
427
451
  separated) · `-r` IP range (comma separated, shortened end)
@@ -429,21 +453,19 @@ separated) · `-r` IP range (comma separated, shortened end)
429
453
  ### Probing
430
454
  | Option | Range | Default | Meaning |
431
455
  |---|---|---|---|
432
- | `-B` | 1 – 2 | 1.5 | backoff factor per retry |
433
- | `-t` | 10 – 5000 | 250 | initial timeout (ms) |
434
- | `-re` | 0 – 5 | 3 | retries, UP/unknown hosts |
435
- | `-dr` | 0 – 5 | 1 | retries, confirmed DOWN (`0` = same as others) |
456
+ | `-t` | 10 – 5000 | 1000 | ping timeout (ms): a reply later than this is lost |
457
+ | `-re` | 0 – 5 | 3 | DOWN after up to `-re` + 1 timeouts in a row (see *How checking works*) |
436
458
  | `-i` | -1 – 250 | auto | send interval (ms), overrides `-ra`; `-1` auto, `0` unpaced |
437
- | `-p` | 0 – 32 | auto | fping processes per group |
438
- | `-w` | 0 – 600 | 0.5 | pause between rounds (s) |
459
+ | `-p` | 0 – 32 | auto | fping processes per address family |
460
+ | `-w` | 0 – 600 | 0.5 | ping period per host (s, at least 0.2) |
439
461
  | `-cf` | 1 – 10 | 2 | consecutive DOWN before leaving UP (`1` = off) |
462
+ | `-ng` | 0 – 60 | 1 | seconds added to the grace period of new hosts |
463
+ | `-sp` | 2 – 10 | 3 | silent ping periods (no fping output) until DOWN |
440
464
  | `-ra` | 10 – 25000 | 1000 | ICMP packets/s |
441
465
  | `-fw` | 1 – 72000 | 72000 | minutes to count as flapping |
442
- | `-ds` | 1 – 20 | 4 | spread DOWN hosts over N rounds |
443
- | `-fs` | 0 – 50 | 10 | every Nth round: full sweep (`0` = never) |
444
466
  | `-dns` | 0 – 3600 | 300 | hostname cache TTL (s, `0` off) |
445
467
  | `-4` / `-6` | — | auto | prefer IPv4/IPv6, mutually exclusive |
446
- | `-ph` | — | off | start with PREFER HOSTNAMES |
468
+ | `-ph` | — | off | start with DEDUP: KEEP HOSTNAME |
447
469
  | `-ipo` | — | off | start with IP ONLY |
448
470
  | `-gn` | — | off | GET NAMES once at startup |
449
471
  | `-ncs` | — | off | skip `--check-source` |
@@ -465,9 +487,11 @@ Hard-enforced at startup and live via ADV OPTIONS (`-web` only), same bounds.
465
487
  | `-cl` | — | — | delete all `eping-*` files and exit |
466
488
  | `-tz` | -24 – +24 | 0 | timezone offset (h) |
467
489
  | `-dg` | — | off | cycle time breakdown |
490
+ | `-debug` | — | off | write engine events (LOOP START / ADD / DOWN burst / STALL, SLOW ROUND) as `#COMMENT#` rows to the log |
468
491
  | `-du` | — | — | disable online version check |
469
- | `-lms` | 0, 10 – 2500 | 0 | max CSV log size (MB) before rotating; `0` = no rotation |
492
+ | `-lms` | 0, 10 – 2500 | 500 | max CSV log size (MB) before rotating; `0` = no rotation |
470
493
  | `-lmf` | 0 – 500 | 0 | max `eping-log_*.csv` files kept, oldest deleted first; `0` = unlimited |
494
+ | `-lnz` | — | off | do not zip logfiles finished by size rotation (default: zipped in the background) |
471
495
  | `-web` | — | off | web GUI instead of CLI |
472
496
  | `-wv` | — | off | CLI + read-only web view |
473
497
  | `-port` | — | 8080 | http port |
@@ -493,6 +517,12 @@ original timestamp with an incrementing `-1`/`-2`/... suffix
493
517
  (`eping-log_<original-timestamp>-N.csv`); starting a new file manually (`RESET
494
518
  LOGGING`/`L`) always gets the current time instead and begins a fresh chain.
495
519
 
520
+ By default a finished (rotated) file is zipped in the background to `eping-log_<ts>-N.csv.zip` (one csv inside, original
521
+ timestamp kept; the csv is removed only after the zip is complete); `-lnz` keeps plain csv. A `*.zip` (rotated file, or a
522
+ download - also `name(1).zip`) is handled like a `*.csv` everywhere: CHOOSE FILE / VIEW FILE / DELETE lists, UPLOAD FILE TO
523
+ SERVER / UPLOAD FROM CLIENT, GENERATE REPORT (a zip with several csv, e.g. a multi-file download, is read completely and
524
+ merged), `-lmf` pruning and `epinga.py -f` (one csv per zip). Downloading a zip sends it as is.
525
+
496
526
  `ZERO CHANGES`/`Z`: resets `NO_OF_CHANGES`/`CHANGE_TIMESTAMP` for the running instance;
497
527
  log file keeps everything already written.
498
528
 
@@ -500,11 +530,12 @@ log file keeps everything already written.
500
530
  in `HOSTNAME`, text in `IP`. No-op with a notice if logging is off. epinga.py detects
501
531
  these rows automatically.
502
532
 
503
- `RESET LOGGING`/`L`:
533
+ `LOGGING`/`L`:
504
534
  - Logging on: confirmation first (CLI keypress / web modal). `Y` clears all entries,
505
535
  restarts logging into the same file. `N` starts a fresh file, old file untouched -
506
536
  optional custom name (blank = auto-generated `eping-log_<timestamp>.csv`); a name
507
- that already exists is rejected, nothing is created. `ESC`/`ENTER` cancels.
537
+ that already exists is rejected, nothing is created. `S` (STOP LOGGING) stops logging,
538
+ file kept; `L` then offers START LOGGING again. `ESC`/`ENTER` cancels.
508
539
  - Logging off: same dialog, no clear option - `START LOGGING` starts a fresh file
509
540
  right away, same optional custom name.
510
541
 
@@ -515,6 +546,9 @@ Run fping on a jump host instead of locally (system `ssh` only). Any Linux host
515
546
  the password or key passphrase is asked on the terminal at startup. At runtime: `J` in the CLI,
516
547
  JUMPHOST button in the web GUI (after ADV OPTIONS).
517
548
 
549
+ With a working resolver on the jump host (default, see `-sshnr`) the `IP` column of the log holds the address the jump host
550
+ resolved a hostname to - like a local run - so epinga shows `host | IP` for jump host rows as well. Without one it stays the hostname.
551
+
518
552
  ![JUMPHOST window](https://raw.githubusercontent.com/ewaldj/eping/main/docs/img/jumphost.png)
519
553
 
520
554
  - Window: HOST, PORT, USER, PASSWORD (key passphrase), HOST KEY, NAMES, KEY FILE. TEST checks ssh, login and
@@ -560,7 +594,7 @@ exit, a full notice prints once:
560
594
  https://github.com/ewaldj/eping
561
595
  ```
562
596
 
563
- Shown on any terminal-driven exit (CLI `[E]`/Ctrl-C, `-web`'s EXIT/Ctrl-C in its
597
+ Shown on any terminal-driven exit (CLI `[E]`/Ctrl-C, `-web`'s STOP/Ctrl-C in its
564
598
  terminal). The web GUI's in-browser banner is separate and shorter.
565
599
 
566
600
  ## Run analysis on exit
@@ -573,7 +607,7 @@ Run an analysis of this logfile with epinga.py now? [y/N]:
573
607
 
574
608
  `y` (case-insensitive) runs `epinga.py -f <logfile>` before exit; anything else skips
575
609
  it. Only asked on a terminal-driven exit (CLI `[E]`/Ctrl-C, or `-wv`/`-wvc`'s own
576
- keyboard `[E]`/Ctrl-C); exiting via a browser's EXIT button never asks. No prompt if
610
+ keyboard `[E]`/Ctrl-C); exiting via a browser's STOP button never asks. No prompt if
577
611
  logging is off or the logfile is empty/missing.
578
612
 
579
613
  ## GENERATE REPORT (web gui) / ANALYSE NOW (CLI `N`)
@@ -583,17 +617,16 @@ running - not just at exit. Web: GENERATE REPORT dropdown, four entries - `ACTIV
583
617
  LOGFILE` analyses the active CSV log (needs logging on, non-empty logfile, else the tab
584
618
  closes and a footer error is shown), `CHOOSE LOGFILE` picks one or more `.csv` files in
585
619
  the working dir - table (name/size/date), "select all" checkbox, nothing preselected;
586
- up to 25 files per report, checking a 26th is refused. `SELECT JUMPHOST` lists the
587
- sources (`local` and jump hosts, log column `SOURCE`) found in the active logfile - all checked,
588
- ENTER = GENERATE; only the periods of the checked sources are calculated (see *Source filter* in the
589
- epinga.py section). Shown only if the log holds more than one source.
620
+ up to 25 files per report, checking a 26th is refused. If a log holds more than one source (`local` and jump hosts, log column `SOURCE`), the report contains all of them and a
621
+ source switch (see *Source switch in the HTML report*); no dialog.
622
+
623
+ The report tab opens right away; if the browser blocks it (e.g. after a long upload), a REPORT READY dialog with an OPEN REPORT button appears.
624
+ While the report is generated the waiting tab shows a progress bar with the step (merging files / analysing / analysing source N of M / writing report), the percentage and an estimated remaining time (extrapolated from the elapsed time, shown after a few seconds); without a tab the same text is shown in the footer. The percentage covers all passes (the main analysis plus one per source, see *Source switch*).
590
625
 
591
626
  `UPLOAD FROM CLIENT` picks one or more `.csv` logfiles on the computer running the browser (max 25, 1 GB each);
592
627
  they are uploaded to a server temp dir, merged like `CHOOSE LOGFILE` and analysed as one report. Temp files and
593
628
  report are removed when eping.py exits or on the next upload.
594
629
 
595
- ![SELECT JUMPHOST](https://raw.githubusercontent.com/ewaldj/eping/main/docs/img/select-jumphost.png)
596
-
597
630
  More than one selected file is merged chronologically (by the row timestamps, streamed) into one temporary
598
631
  CSV, analysed as a single logfile, then the temp file is removed. Result opens in a new
599
632
  tab; if a selected file was invalid or has meanwhile been removed (e.g. by log rotation
@@ -603,10 +636,10 @@ logfile only (needs logging on, non-empty logfile, else a notice is shown); resu
603
636
  path/error shown once done. Only one run at a time either way. See *epinga.py* below for
604
637
  the report, and *Called from eping.py* under epinga.py for the invocation.
605
638
 
606
- ## VIEW FILE FROM SERVER (web gui only)
639
+ ## VIEW (SERVER OPERATIONS, web gui only)
607
640
 
608
641
  Read-only viewer for one or more `.csv`/`.txt` files in the working dir - FILE
609
- OPERATIONS > VIEW FILE FROM SERVER, table picker (name/size/date), "select all". Each
642
+ OPERATIONS > SERVER OPERATIONS > VIEW, table picker (name/size/date), "select all". Each
610
643
  selected file opens in its own tab: raw content, COPY (clipboard) and DOWNLOAD buttons,
611
644
  no editing. Selecting more than one file opens the first tab right away; that tab shows
612
645
  a centered "N more file(s) selected / OPEN NEXT FILE" box to open the next one, and so
@@ -615,26 +648,27 @@ Max 200MB per file - larger files are refused with a message pointing at DOWNLOA
615
648
  instead, and the picker greys those files out, labeled "TOO LARGE", with the current
616
649
  limit shown in the modal text.
617
650
 
618
- ## Address modes (PREFER HOSTNAME / SWITCH TO IP ONLY / GET NAMES)
651
+ ## Address modes (DEDUP: KEEP HOSTNAME / RESOLVE ALL TO IP / GET NAMES)
619
652
 
620
- `PREFER HOSTNAME` (`-ph`): drops a raw-IP host from pinging when another entry resolves
621
- to the same address. Redundancy check cached `-dns` seconds. `PREFER IP ADDRESS`: the
653
+ `DEDUP: KEEP HOSTNAME` (`-ph`): drops a raw-IP host from pinging when another entry resolves
654
+ to the same address. Redundancy check cached `-dns` seconds. `DEDUP: KEEP IP`: the
622
655
  mirror - drops a hostname entry once its resolved address is already covered by a
623
656
  raw-IP entry. Both non-destructive, restored by switching to another mode. Starting
624
657
  with `-ph` resolves every hostname first (in parallel): the CLI shows a PLEASE WAIT
625
658
  box with an elapsed counter meanwhile, the web mode a line in the terminal.
626
659
 
627
- `SWITCH TO IP ONLY` (`-ipo`): resolves every hostname to its address (v4/v6 per
660
+ `RESOLVE ALL TO IP` (`-ipo`): resolves every hostname to its address (v4/v6 per
628
661
  `-4`/`-6`, A preferred by default) and renames it in place (history/uptime carry over).
629
662
  CLI: a hostname whose address collides with another host is dropped and not restored.
630
663
  Web GUI: colliding/unresolvable hosts are hidden (not pinged) while active, restored
631
664
  automatically when switching away.
665
+ The web GUI mouse-over of a renamed host shows the hostname it had before (`hostname` row).
632
666
 
633
667
  CLI `P` and the web GUI's address mode select/`P` picker reach the same 4 exclusive
634
- modes: `HOSTNAME & IP` (default, no dedup), `PREFER HOSTNAME`, `PREFER IP ADDRESS`,
635
- `SWITCH TO IP ONLY`. The web GUI additionally has its own `P`/`I` keyboard shortcuts
636
- that toggle PREFER HOSTNAME / SWITCH TO IP ONLY directly (see *Web GUI*). Leaving
637
- `SWITCH TO IP ONLY` restores hostnames before applying the new mode.
668
+ modes: `KEEP ALL (NO DEDUP)` (default), `DEDUP: KEEP HOSTNAME`,
669
+ `DEDUP: KEEP IP`, `RESOLVE ALL TO IP`. The web GUI additionally has its own `P`/`I` keyboard shortcuts
670
+ that toggle DEDUP: KEEP HOSTNAME / RESOLVE ALL TO IP directly (see *Web GUI*). Leaving
671
+ `RESOLVE ALL TO IP` restores hostnames before applying the new mode.
638
672
 
639
673
  `GET NAMES`/`G` (`-gn`): reverse-DNS every raw IP with no hostname counterpart, renames
640
674
  on a PTR match (history/uptime carry over). Stays an IP if: no PTR record, name
@@ -677,7 +711,7 @@ dialog says so.
677
711
  No search in the CLI list.
678
712
  - **Banner**: while active the CLI banner shows e.g. `ADV Type not in (Firewall, Switch)`.
679
713
  - **Reset**: SET REFERENCE and CLEAR ALL turn the filter off. It is not saved
680
- with `SAVE HOSTS FILE`.
714
+ with `SAVE HOSTS`.
681
715
 
682
716
  ## IPv6
683
717
 
@@ -691,20 +725,22 @@ other mask rejected. IPv6 addresses are always stored in shortest form.
691
725
  ## Diagnostics (`-dg`)
692
726
 
693
727
  ```
694
- FPING 11.46 [full 865(-r 3,-i 5ms) 4.31s reduced 3242(-r 1,-i 1ms) 11.46s]
695
- || DNS 0.00 STATE 0.01 BUILD 0.00 WAIT 0.50 DRAW 0.11
728
+ FPING 34.11 [loop restarts=1 adds=0 pend=0 dnspend=0 abort=0 silent=0 young=0 30000(-r 4miss,-i 1ms) 34.11s]
729
+ || DNS 0.00 STATE 0.35 BUILD 0.01 WAIT 0.10 DRAW 0.11
696
730
  ```
697
731
 
698
- `FPING`: round wall time, then per-group wall time (parallel, max not sum). Remaining
699
- phases: eping's own work (~0.12s on 4109 hosts).
732
+ `FPING`: wait for the snapshot, then engine counters: process restarts, added processes, hosts still without
733
+ a new result (`pend`), names being resolved (`dnspend`), cut short by a command (`abort`), hosts DOWN by
734
+ silence (`silent`), hosts in the grace period (`young`). Remaining phases: eping's own work.
735
+ With `-debug` a round longer than 10 s is also logged as a `SLOW ROUND` comment with these times.
700
736
 
701
737
  ## Notes
702
738
 
703
739
  - ICMP echo requests only. Use only on authorised networks.
704
740
  - `-p` > 1 and `-i 0` reduce accuracy (false DOWN) — defaults avoid both.
705
- - `-dr 0` produces flapping hosts in practice — keep the default of 1.
741
+ - Needs an fping with `-l` and per-target sequence numbers (fping 4.3 or newer; the Windows / macOS packages have it).
706
742
 
707
- # epinga.py 2.38
743
+ # epinga.py 2.47
708
744
 
709
745
  Analyses an eping.py CSV log: terminal summary + self-contained HTML report (no
710
746
  server, no external assets) with per-host detail, state-change timelines, and
@@ -716,6 +752,7 @@ always-UP/flapping/always-DOWN/no-DNS buckets.
716
752
  ./epinga.py # interactive menu - pick a *.csv
717
753
  ./epinga.py -f eping-log_2026-09-05.csv # analyse a specific logfile
718
754
  ./epinga.py -f FILE --open # analyse and open the report
755
+ ./epinga.py -f eping-log_...csv.zip # a zipped logfile (one csv inside) is read directly
719
756
  ```
720
757
 
721
758
  Output: `<base>_report.txt` and `<base>_report.html` (`--html FILE` overrides).
@@ -730,6 +767,8 @@ Output: `<base>_report.txt` and `<base>_report.html` (`--html FILE` overrides).
730
767
  | `-e`, `--end YYYY-MM-DD HH:MM:SS` | rows up to this timestamp |
731
768
  | `-S`, `--sort {name,flapping,uptime,rtt}` | summary sort order (default `name`) |
732
769
  | `--source SOURCE` | only rows of this source - `local` or the jump host label from the log column `SOURCE` (repeatable; see *Source filter*) |
770
+ | `--progress-file FILE` | write the progress (percent, remaining seconds, phase) as JSON to FILE - used by eping.py's GENERATE REPORT |
771
+ | `--no-source-switch` | HTML report: do not embed one dataset per source (no source switch; faster on big multi-source logs) |
733
772
  | `--no-detail` | summary only |
734
773
  | `--no-changes` | omit state-change list |
735
774
  | `--html FILE` | custom HTML filename |
@@ -743,9 +782,17 @@ Logs written while eping.py ran on a jump host carry a `SOURCE` column. With `--
743
782
  selection shown on a terminal when the log holds several sources; numbers like `1,3`, ENTER = all)
744
783
  only the periods of the selected sources are calculated: uptime, up/down time, RTT, changes and the
745
784
  timeline. Periods of other sources are excluded and shown as a gap in the timeline; a state change that
746
- happened during such a gap is not counted. Without `--source` everything is combined (as before).
785
+ happened during such a gap is not counted. Without `--source` everything is combined.
747
786
  Logs without a `SOURCE` column are treated as `local`.
748
787
 
788
+ **Source switch in the HTML report**: if the (selected) sources are two or more, epinga analyses every source on
789
+ its own as well and embeds these datasets in the same HTML file. A drop-down in the toolbar (`All sources
790
+ (combined)` / `<label>`) switches the whole report - cards, host table, timelines, filters - to that
791
+ source; the choice is kept in the URL (`#src=<label>`), a reload keeps it, sort/filter state is reset on a switch.
792
+ The text report and the terminal output stay combined. Cost: one extra pass over the log per source and a
793
+ correspondingly larger HTML file; `--no-source-switch` turns it off. A saved copy of the report (Download) opens
794
+ on `All sources`.
795
+
749
796
  ![epinga report, source local](https://raw.githubusercontent.com/ewaldj/eping/main/docs/img/report-source.png)
750
797
 
751
798
  ## Called from eping.py