eping 3.86__tar.gz → 4.0__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: 3.86
3
+ Version: 4.0
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,7 +17,7 @@ Description-Content-Type: text/markdown
17
17
  License-File: LICENSE
18
18
  Dynamic: license-file
19
19
 
20
- # eping.py 3.86
20
+ # eping.py 4.00
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.
@@ -52,7 +52,7 @@ Portable Windows version (web GUI only, no installation): download and unpack
52
52
  [`eping-windows.zip`](https://github.com/ewaldj/eping/blob/main/Windows_Version/eping-windows.zip)
53
53
  ([folder](https://github.com/ewaldj/eping/tree/main/Windows_Version/)), then start `eping.exe`.
54
54
 
55
- - Contains `eping.exe` (small launcher window: web port, Start / Stop / Restart, open web GUI),
55
+ - Contains `eping.exe` (small launcher window: web port, Start / Stop / Restart, open web GUI, Disable autostart / logging / file, CLI options, Check updates),
56
56
  `eping.py`, `epinga.py`, `fping.exe` + `cygwin1.dll` (fping for Windows) and an embedded Python.
57
57
  - The web GUI opens in the browser (default `http://127.0.0.1:8080`). The port is read from the hosts file
58
58
  (`opt: -port 9000`); a port already in use is reported and can be changed in the launcher window.
@@ -197,6 +197,7 @@ DOWN. Columns: hostname/IP, state, RTT (ms), last-change timestamp, change count
197
197
  | `C` | clear all hosts and state |
198
198
  | `P` | address mode picker — 4 modes (see *Address modes*) |
199
199
  | `X` | ADV OPTIONS — live option editing (see *ADV OPTIONS*) |
200
+ | `J` | JUMPHOST — run fping on a jump host via ssh (see *SSH source (JUMPHOST)*) |
200
201
  | `N` | ANALYSE NOW — run epinga.py against the active logfile in the background (see *GENERATE REPORT*) |
201
202
  | `G` | GET NAMES — reverse-DNS raw IPs, one-shot, background |
202
203
  | `R` | redraw screen |
@@ -244,7 +245,7 @@ Single self-contained page, no external resources.
244
245
  - Row 1: view select (9 views), sort order select, SET REFERENCE, ZERO CHANGES,
245
246
  CLEAR ALL, address mode select, GET NAMES, ADV OPTIONS, RESET LOG, FILE OPERATIONS
246
247
  select, EXIT, font size.
247
- - Row 2: match filter (SET/CLEAR), ADV FILTER, host field (ADD/DELETE), comment
248
+ - Row 2: match filter (SET/CLEAR), ADV FILTER, host field (ADD/DELETE), ADD/DEL LIST, comment
248
249
  field (COMMENT), GENERATE REPORT select.
249
250
  - View select, sort order select, address mode select and ADV OPTIONS all match the
250
251
  CLI's `U`/`O`/`P`/`X` pickers exactly. FILE OPERATIONS (incl. ADD HOSTS FILE FROM CLIENT/
@@ -273,6 +274,13 @@ Single self-contained page, no external resources.
273
274
  `+`/`−` font size (works while typing). No keyboard shortcut for `X`/ADV OPTIONS or
274
275
  GENERATE REPORT - click required.
275
276
  - Host field feeds both ADD/DELETE; ENTER triggers the button used last, ESC clears.
277
+ - **ADD/DEL LIST** (button after DELETE; also Ctrl/Cmd+V on the page while no field has focus): paste a
278
+ host list - one per line or separated by comma/semicolon/blank, `#` comment, CIDR expanded. A live
279
+ preview shows found / new / already in list / ignored words / masks out of range; ADD and DELETE are
280
+ enabled only if they would change something (DELETE over 20 hosts asks to confirm; exact name match
281
+ only). A pasted inventory `.csv` (with the `IP Address`/`Hostname` header) also updates hosts already in
282
+ the list: IP entries (e.g. from a `.txt`) are renamed to the CSV hostname, history kept, and the CSV
283
+ values are attached. Works with `-wvc` too.
276
284
  - Files can also be dropped anywhere on the page (max 16MB, see *Host file format*).
277
285
  - Commands acknowledge immediately; a click aborts the running round.
278
286
  - **Host popup**: hovering a host row (after ~350 ms) shows everything known about it:
@@ -369,6 +377,8 @@ Same bounds as the matching CLI flags (`-lms`/`-lmf` for the last two - see *Out
369
377
  | POST | `/api/command` | `{"cmd":"...","value":"..."}` | control (see cmd list below) |
370
378
  | POST | `/api/advvalues` | `{"filter":{...}}` | ADV FILTER: values still selectable for a draft selection (same format as `adv_filter`) |
371
379
  | POST | `/api/upload` | host list, text | add hosts |
380
+ | POST | `/api/log_sources` | `{"names":[...]}` | SOURCE values of the named logfiles (empty = active logfile), for SELECT JUMPHOST |
381
+ | 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)*) |
372
382
 
373
383
  `cmd` values: `up_only`, `set_filter`, `addr_mode`, `get_names`, `match_filter`,
374
384
  `adv_filter`, `sort`, `add`, `del`, `set_ref`, `zero`, `add_comment`, `reset_log`, `clear`,
@@ -379,7 +389,7 @@ value: `key=value`. `reset_log` value: logging off - optional custom file name (
379
389
  auto-generated); logging on - `y` (clear) or `new`/`new=<name>` (new file, optional
380
390
  custom name). `run_report`: `value` = empty (active logfile) or one `.csv` filename; or
381
391
  JSON body field `values`: `[...]` to merge and analyse multiple `.csv` files as one
382
- (max 25). `save_hosts_file` value: optional target file name (blank
392
+ (max 25); optional body field `sources`: `[...]` restricts the analysis to these SOURCE values. `save_hosts_file` value: optional target file name (blank
383
393
  = active `-f` hostfile, or `eping-hosts.txt` if none).
384
394
 
385
395
  `-wv` answers `403` to `POST /api/command`/`/api/upload`; `-wvc`/`-web` allow both. No
@@ -434,6 +444,9 @@ separated) · `-r` IP range (comma separated, shortened end)
434
444
  | `-ipo` | — | off | start with IP ONLY |
435
445
  | `-gn` | — | off | GET NAMES once at startup |
436
446
  | `-ncs` | — | off | skip `--check-source` |
447
+ | `-ssh` | `[USER@]HOST[:PORT]` | off | run fping on a jump host via ssh (see *SSH source (JUMPHOST)*) |
448
+ | `-sshkey` | file | agent | private key file for `-ssh` |
449
+ | `-sshhk` | accept-new/ask/off | accept-new | host key check for `-ssh` |
437
450
  | `-ncf` | — | off | CSV: do not ping the CSV IP of a name without DNS record |
438
451
  | `-up` | — | 0 | learning phase: after N rounds keep only hosts seen UP |
439
452
  | `-setref` | — | off | with `-up`: hosts seen UP become new reference list |
@@ -461,11 +474,11 @@ Hard-enforced at startup and live via ADV OPTIONS (`-web` only), same bounds.
461
474
  Unless `-dl`, every round appends to `eping-log_YYYY-MM-DD_HH:MM:SS.csv` (or `-o FILE`):
462
475
 
463
476
  ```
464
- TIMESTAMP,HOSTNAME,PREVIOUS_STATE,CURRENT_STATE,RTT,NO_OF_CHANGES,CHANGE_TIMESTAMP,TBD,IP,INV_HOSTNAME,SERIAL_NUMBER,MODEL,LOCATION,SYSLOCATION,TYPE,INV_COMMENT
477
+ TIMESTAMP,HOSTNAME,PREVIOUS_STATE,CURRENT_STATE,RTT,NO_OF_CHANGES,CHANGE_TIMESTAMP,TBD,IP,INV_HOSTNAME,SERIAL_NUMBER,MODEL,LOCATION,SYSLOCATION,TYPE,INV_COMMENT,SOURCE
465
478
  ```
466
479
 
467
480
  `INV_HOSTNAME` … `INV_COMMENT`: the inventory values of a host added from an inventory CSV (see
468
- *Inventory CSV import*), empty for all other hosts. Logs without these columns (older
481
+ *Inventory CSV import*), empty for all other hosts. `SOURCE`: `local` or the ssh jump host that produced the row. Logs without these columns (older
469
482
  versions) stay readable by epinga.py.
470
483
 
471
484
  `TBD`: suppressed DOWN observations (`-cf`). `IP`: address actually pinged (empty for
@@ -491,6 +504,29 @@ these rows automatically.
491
504
  - Logging off: same dialog, no clear option - `START LOGGING` starts a fresh file
492
505
  right away, same optional custom name.
493
506
 
507
+ ## SSH source (JUMPHOST)
508
+
509
+ Run fping on a jump host instead of locally (system `ssh` only). Any Linux host with a working `fping`
510
+ (e.g. a caretaker) will do; it resolves the names itself. Start: `-ssh [USER@]HOST[:PORT]` (+ `-sshkey FILE`, `-sshhk MODE`);
511
+ the password or key passphrase is asked on the terminal at startup. At runtime: `J` in the CLI,
512
+ JUMPHOST button in the web GUI (after ADV OPTIONS).
513
+
514
+ ![JUMPHOST window](https://raw.githubusercontent.com/ewaldj/eping/main/docs/img/jumphost.png)
515
+
516
+ - Window: HOST, PORT, USER, PASSWORD (key passphrase), HOST KEY, KEY FILE. TEST checks ssh, login and
517
+ fping on the jump host, CONNECT switches the scan source, USE LOCAL switches back. A missing local
518
+ `ssh` is shown in the window.
519
+ - HOST KEY: `accept-new` (default) - hosts seen for the first time are trusted automatically, a changed
520
+ key is still refused; `ask` - an unknown key is shown with its fingerprint and must be accepted with
521
+ TRUST KEY; `off` - no check at all (insecure).
522
+ - The switch is applied at the start of the next round; hosts, states and counters are kept.
523
+ - Connection loss: results of the round are discarded, hosts keep their state, a banner is shown and
524
+ eping reconnects. Logged as `#COMMENT#` rows (`JUMPHOST ... OFFLINE: <reason>`, `JUMPHOST ... ONLINE
525
+ again`, `SOURCE SWITCH <old> -> <new>`), shown in the report's comment timeline.
526
+ - Log column `SOURCE`: `local` or the jump host of each row.
527
+ - Limits: GET NAMES and the CSV-IP fallback are not available over ssh; at most 4 ssh processes
528
+ (2 on Windows); the web password transfer is plain HTTP - use `-bind 127.0.0.1` or a trusted network.
529
+
494
530
  ## Web GUI header
495
531
 
496
532
  Header: `eping.py vX.XX · © Ewald Jeitler · supervised by Nelly · tools.jeitler.cc ·
@@ -532,11 +568,17 @@ logging is off or the logfile is empty/missing.
532
568
  ## GENERATE REPORT (web gui) / ANALYSE NOW (CLI `N`)
533
569
 
534
570
  Runs epinga.py against one or more logfiles in the background while eping.py keeps
535
- running - not just at exit. Web: GENERATE REPORT dropdown, two entries - `ACTIVE
571
+ running - not just at exit. Web: GENERATE REPORT dropdown, three entries - `ACTIVE
536
572
  LOGFILE` analyses the active CSV log (needs logging on, non-empty logfile, else the tab
537
573
  closes and a footer error is shown), `CHOOSE LOGFILE` picks one or more `.csv` files in
538
574
  the working dir - table (name/size/date), "select all" checkbox, nothing preselected;
539
- up to 25 files per report, checking a 26th is refused.
575
+ up to 25 files per report, checking a 26th is refused. `SELECT JUMPHOST` lists the
576
+ sources (`local` and jump hosts, log column `SOURCE`) found in the active logfile - all checked,
577
+ ENTER = GENERATE; only the periods of the checked sources are calculated (see *Source filter* in the
578
+ epinga.py section). Shown only if the log holds more than one source.
579
+
580
+ ![SELECT JUMPHOST](https://raw.githubusercontent.com/ewaldj/eping/main/docs/img/select-jumphost.png)
581
+
540
582
  More than one selected file is merged chronologically (by mtime) into one temporary
541
583
  CSV, analysed as a single logfile, then the temp file is removed. Result opens in a new
542
584
  tab; if a selected file was invalid or has meanwhile been removed (e.g. by log rotation
@@ -647,7 +689,7 @@ phases: eping's own work (~0.12s on 4109 hosts).
647
689
  - `-p` > 1 and `-i 0` reduce accuracy (false DOWN) — defaults avoid both.
648
690
  - `-dr 0` produces flapping hosts in practice — keep the default of 1.
649
691
 
650
- # epinga.py 2.35
692
+ # epinga.py 2.37
651
693
 
652
694
  Analyses an eping.py CSV log: terminal summary + self-contained HTML report (no
653
695
  server, no external assets) with per-host detail, state-change timelines, and
@@ -672,6 +714,7 @@ Output: `<base>_report.txt` and `<base>_report.html` (`--html FILE` overrides).
672
714
  | `-s`, `--start YYYY-MM-DD HH:MM:SS` | rows from this timestamp on |
673
715
  | `-e`, `--end YYYY-MM-DD HH:MM:SS` | rows up to this timestamp |
674
716
  | `-S`, `--sort {name,flapping,uptime,rtt}` | summary sort order (default `name`) |
717
+ | `--source SOURCE` | only rows of this source - `local` or the jump host label from the log column `SOURCE` (repeatable; see *Source filter*) |
675
718
  | `--no-detail` | summary only |
676
719
  | `--no-changes` | omit state-change list |
677
720
  | `--html FILE` | custom HTML filename |
@@ -679,6 +722,17 @@ Output: `<base>_report.txt` and `<base>_report.html` (`--html FILE` overrides).
679
722
  | `-q`, `--quiet` | suppress progress bar |
680
723
  | `--no-version-check` | skip online update check |
681
724
 
725
+ ## Source filter
726
+
727
+ Logs written while eping.py ran on a jump host carry a `SOURCE` column. With `--source` (or the
728
+ selection shown on a terminal when the log holds several sources; numbers like `1,3`, ENTER = all)
729
+ only the periods of the selected sources are calculated: uptime, up/down time, RTT, changes and the
730
+ timeline. Periods of other sources are excluded and shown as a gap in the timeline; a state change that
731
+ happened during such a gap is not counted. Without `--source` everything is combined (as before).
732
+ Logs without a `SOURCE` column are treated as `local`.
733
+
734
+ ![epinga report, source local](https://raw.githubusercontent.com/ewaldj/eping/main/docs/img/report-source.png)
735
+
682
736
  ## Called from eping.py
683
737
 
684
738
  `GENERATE REPORT` (web gui) and `N`/ANALYSE NOW (CLI) both run epinga.py in a
@@ -1,4 +1,4 @@
1
- # eping.py 3.86
1
+ # eping.py 4.00
2
2
 
3
3
  Continuous ICMP reachability monitor built on `fping`. Scans a host list in a loop,
4
4
  reports each host UP/DOWN/NO-DNS, counts state changes. CLI (curses) or web GUI.
@@ -33,7 +33,7 @@ Portable Windows version (web GUI only, no installation): download and unpack
33
33
  [`eping-windows.zip`](https://github.com/ewaldj/eping/blob/main/Windows_Version/eping-windows.zip)
34
34
  ([folder](https://github.com/ewaldj/eping/tree/main/Windows_Version/)), then start `eping.exe`.
35
35
 
36
- - Contains `eping.exe` (small launcher window: web port, Start / Stop / Restart, open web GUI),
36
+ - Contains `eping.exe` (small launcher window: web port, Start / Stop / Restart, open web GUI, Disable autostart / logging / file, CLI options, Check updates),
37
37
  `eping.py`, `epinga.py`, `fping.exe` + `cygwin1.dll` (fping for Windows) and an embedded Python.
38
38
  - The web GUI opens in the browser (default `http://127.0.0.1:8080`). The port is read from the hosts file
39
39
  (`opt: -port 9000`); a port already in use is reported and can be changed in the launcher window.
@@ -178,6 +178,7 @@ DOWN. Columns: hostname/IP, state, RTT (ms), last-change timestamp, change count
178
178
  | `C` | clear all hosts and state |
179
179
  | `P` | address mode picker — 4 modes (see *Address modes*) |
180
180
  | `X` | ADV OPTIONS — live option editing (see *ADV OPTIONS*) |
181
+ | `J` | JUMPHOST — run fping on a jump host via ssh (see *SSH source (JUMPHOST)*) |
181
182
  | `N` | ANALYSE NOW — run epinga.py against the active logfile in the background (see *GENERATE REPORT*) |
182
183
  | `G` | GET NAMES — reverse-DNS raw IPs, one-shot, background |
183
184
  | `R` | redraw screen |
@@ -225,7 +226,7 @@ Single self-contained page, no external resources.
225
226
  - Row 1: view select (9 views), sort order select, SET REFERENCE, ZERO CHANGES,
226
227
  CLEAR ALL, address mode select, GET NAMES, ADV OPTIONS, RESET LOG, FILE OPERATIONS
227
228
  select, EXIT, font size.
228
- - Row 2: match filter (SET/CLEAR), ADV FILTER, host field (ADD/DELETE), comment
229
+ - Row 2: match filter (SET/CLEAR), ADV FILTER, host field (ADD/DELETE), ADD/DEL LIST, comment
229
230
  field (COMMENT), GENERATE REPORT select.
230
231
  - View select, sort order select, address mode select and ADV OPTIONS all match the
231
232
  CLI's `U`/`O`/`P`/`X` pickers exactly. FILE OPERATIONS (incl. ADD HOSTS FILE FROM CLIENT/
@@ -254,6 +255,13 @@ Single self-contained page, no external resources.
254
255
  `+`/`−` font size (works while typing). No keyboard shortcut for `X`/ADV OPTIONS or
255
256
  GENERATE REPORT - click required.
256
257
  - Host field feeds both ADD/DELETE; ENTER triggers the button used last, ESC clears.
258
+ - **ADD/DEL LIST** (button after DELETE; also Ctrl/Cmd+V on the page while no field has focus): paste a
259
+ host list - one per line or separated by comma/semicolon/blank, `#` comment, CIDR expanded. A live
260
+ preview shows found / new / already in list / ignored words / masks out of range; ADD and DELETE are
261
+ enabled only if they would change something (DELETE over 20 hosts asks to confirm; exact name match
262
+ only). A pasted inventory `.csv` (with the `IP Address`/`Hostname` header) also updates hosts already in
263
+ the list: IP entries (e.g. from a `.txt`) are renamed to the CSV hostname, history kept, and the CSV
264
+ values are attached. Works with `-wvc` too.
257
265
  - Files can also be dropped anywhere on the page (max 16MB, see *Host file format*).
258
266
  - Commands acknowledge immediately; a click aborts the running round.
259
267
  - **Host popup**: hovering a host row (after ~350 ms) shows everything known about it:
@@ -350,6 +358,8 @@ Same bounds as the matching CLI flags (`-lms`/`-lmf` for the last two - see *Out
350
358
  | POST | `/api/command` | `{"cmd":"...","value":"..."}` | control (see cmd list below) |
351
359
  | POST | `/api/advvalues` | `{"filter":{...}}` | ADV FILTER: values still selectable for a draft selection (same format as `adv_filter`) |
352
360
  | POST | `/api/upload` | host list, text | add hosts |
361
+ | POST | `/api/log_sources` | `{"names":[...]}` | SOURCE values of the named logfiles (empty = active logfile), for SELECT JUMPHOST |
362
+ | 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)*) |
353
363
 
354
364
  `cmd` values: `up_only`, `set_filter`, `addr_mode`, `get_names`, `match_filter`,
355
365
  `adv_filter`, `sort`, `add`, `del`, `set_ref`, `zero`, `add_comment`, `reset_log`, `clear`,
@@ -360,7 +370,7 @@ value: `key=value`. `reset_log` value: logging off - optional custom file name (
360
370
  auto-generated); logging on - `y` (clear) or `new`/`new=<name>` (new file, optional
361
371
  custom name). `run_report`: `value` = empty (active logfile) or one `.csv` filename; or
362
372
  JSON body field `values`: `[...]` to merge and analyse multiple `.csv` files as one
363
- (max 25). `save_hosts_file` value: optional target file name (blank
373
+ (max 25); optional body field `sources`: `[...]` restricts the analysis to these SOURCE values. `save_hosts_file` value: optional target file name (blank
364
374
  = active `-f` hostfile, or `eping-hosts.txt` if none).
365
375
 
366
376
  `-wv` answers `403` to `POST /api/command`/`/api/upload`; `-wvc`/`-web` allow both. No
@@ -415,6 +425,9 @@ separated) · `-r` IP range (comma separated, shortened end)
415
425
  | `-ipo` | — | off | start with IP ONLY |
416
426
  | `-gn` | — | off | GET NAMES once at startup |
417
427
  | `-ncs` | — | off | skip `--check-source` |
428
+ | `-ssh` | `[USER@]HOST[:PORT]` | off | run fping on a jump host via ssh (see *SSH source (JUMPHOST)*) |
429
+ | `-sshkey` | file | agent | private key file for `-ssh` |
430
+ | `-sshhk` | accept-new/ask/off | accept-new | host key check for `-ssh` |
418
431
  | `-ncf` | — | off | CSV: do not ping the CSV IP of a name without DNS record |
419
432
  | `-up` | — | 0 | learning phase: after N rounds keep only hosts seen UP |
420
433
  | `-setref` | — | off | with `-up`: hosts seen UP become new reference list |
@@ -442,11 +455,11 @@ Hard-enforced at startup and live via ADV OPTIONS (`-web` only), same bounds.
442
455
  Unless `-dl`, every round appends to `eping-log_YYYY-MM-DD_HH:MM:SS.csv` (or `-o FILE`):
443
456
 
444
457
  ```
445
- TIMESTAMP,HOSTNAME,PREVIOUS_STATE,CURRENT_STATE,RTT,NO_OF_CHANGES,CHANGE_TIMESTAMP,TBD,IP,INV_HOSTNAME,SERIAL_NUMBER,MODEL,LOCATION,SYSLOCATION,TYPE,INV_COMMENT
458
+ TIMESTAMP,HOSTNAME,PREVIOUS_STATE,CURRENT_STATE,RTT,NO_OF_CHANGES,CHANGE_TIMESTAMP,TBD,IP,INV_HOSTNAME,SERIAL_NUMBER,MODEL,LOCATION,SYSLOCATION,TYPE,INV_COMMENT,SOURCE
446
459
  ```
447
460
 
448
461
  `INV_HOSTNAME` … `INV_COMMENT`: the inventory values of a host added from an inventory CSV (see
449
- *Inventory CSV import*), empty for all other hosts. Logs without these columns (older
462
+ *Inventory CSV import*), empty for all other hosts. `SOURCE`: `local` or the ssh jump host that produced the row. Logs without these columns (older
450
463
  versions) stay readable by epinga.py.
451
464
 
452
465
  `TBD`: suppressed DOWN observations (`-cf`). `IP`: address actually pinged (empty for
@@ -472,6 +485,29 @@ these rows automatically.
472
485
  - Logging off: same dialog, no clear option - `START LOGGING` starts a fresh file
473
486
  right away, same optional custom name.
474
487
 
488
+ ## SSH source (JUMPHOST)
489
+
490
+ Run fping on a jump host instead of locally (system `ssh` only). Any Linux host with a working `fping`
491
+ (e.g. a caretaker) will do; it resolves the names itself. Start: `-ssh [USER@]HOST[:PORT]` (+ `-sshkey FILE`, `-sshhk MODE`);
492
+ the password or key passphrase is asked on the terminal at startup. At runtime: `J` in the CLI,
493
+ JUMPHOST button in the web GUI (after ADV OPTIONS).
494
+
495
+ ![JUMPHOST window](https://raw.githubusercontent.com/ewaldj/eping/main/docs/img/jumphost.png)
496
+
497
+ - Window: HOST, PORT, USER, PASSWORD (key passphrase), HOST KEY, KEY FILE. TEST checks ssh, login and
498
+ fping on the jump host, CONNECT switches the scan source, USE LOCAL switches back. A missing local
499
+ `ssh` is shown in the window.
500
+ - HOST KEY: `accept-new` (default) - hosts seen for the first time are trusted automatically, a changed
501
+ key is still refused; `ask` - an unknown key is shown with its fingerprint and must be accepted with
502
+ TRUST KEY; `off` - no check at all (insecure).
503
+ - The switch is applied at the start of the next round; hosts, states and counters are kept.
504
+ - Connection loss: results of the round are discarded, hosts keep their state, a banner is shown and
505
+ eping reconnects. Logged as `#COMMENT#` rows (`JUMPHOST ... OFFLINE: <reason>`, `JUMPHOST ... ONLINE
506
+ again`, `SOURCE SWITCH <old> -> <new>`), shown in the report's comment timeline.
507
+ - Log column `SOURCE`: `local` or the jump host of each row.
508
+ - Limits: GET NAMES and the CSV-IP fallback are not available over ssh; at most 4 ssh processes
509
+ (2 on Windows); the web password transfer is plain HTTP - use `-bind 127.0.0.1` or a trusted network.
510
+
475
511
  ## Web GUI header
476
512
 
477
513
  Header: `eping.py vX.XX · © Ewald Jeitler · supervised by Nelly · tools.jeitler.cc ·
@@ -513,11 +549,17 @@ logging is off or the logfile is empty/missing.
513
549
  ## GENERATE REPORT (web gui) / ANALYSE NOW (CLI `N`)
514
550
 
515
551
  Runs epinga.py against one or more logfiles in the background while eping.py keeps
516
- running - not just at exit. Web: GENERATE REPORT dropdown, two entries - `ACTIVE
552
+ running - not just at exit. Web: GENERATE REPORT dropdown, three entries - `ACTIVE
517
553
  LOGFILE` analyses the active CSV log (needs logging on, non-empty logfile, else the tab
518
554
  closes and a footer error is shown), `CHOOSE LOGFILE` picks one or more `.csv` files in
519
555
  the working dir - table (name/size/date), "select all" checkbox, nothing preselected;
520
- up to 25 files per report, checking a 26th is refused.
556
+ up to 25 files per report, checking a 26th is refused. `SELECT JUMPHOST` lists the
557
+ sources (`local` and jump hosts, log column `SOURCE`) found in the active logfile - all checked,
558
+ ENTER = GENERATE; only the periods of the checked sources are calculated (see *Source filter* in the
559
+ epinga.py section). Shown only if the log holds more than one source.
560
+
561
+ ![SELECT JUMPHOST](https://raw.githubusercontent.com/ewaldj/eping/main/docs/img/select-jumphost.png)
562
+
521
563
  More than one selected file is merged chronologically (by mtime) into one temporary
522
564
  CSV, analysed as a single logfile, then the temp file is removed. Result opens in a new
523
565
  tab; if a selected file was invalid or has meanwhile been removed (e.g. by log rotation
@@ -628,7 +670,7 @@ phases: eping's own work (~0.12s on 4109 hosts).
628
670
  - `-p` > 1 and `-i 0` reduce accuracy (false DOWN) — defaults avoid both.
629
671
  - `-dr 0` produces flapping hosts in practice — keep the default of 1.
630
672
 
631
- # epinga.py 2.35
673
+ # epinga.py 2.37
632
674
 
633
675
  Analyses an eping.py CSV log: terminal summary + self-contained HTML report (no
634
676
  server, no external assets) with per-host detail, state-change timelines, and
@@ -653,6 +695,7 @@ Output: `<base>_report.txt` and `<base>_report.html` (`--html FILE` overrides).
653
695
  | `-s`, `--start YYYY-MM-DD HH:MM:SS` | rows from this timestamp on |
654
696
  | `-e`, `--end YYYY-MM-DD HH:MM:SS` | rows up to this timestamp |
655
697
  | `-S`, `--sort {name,flapping,uptime,rtt}` | summary sort order (default `name`) |
698
+ | `--source SOURCE` | only rows of this source - `local` or the jump host label from the log column `SOURCE` (repeatable; see *Source filter*) |
656
699
  | `--no-detail` | summary only |
657
700
  | `--no-changes` | omit state-change list |
658
701
  | `--html FILE` | custom HTML filename |
@@ -660,6 +703,17 @@ Output: `<base>_report.txt` and `<base>_report.html` (`--html FILE` overrides).
660
703
  | `-q`, `--quiet` | suppress progress bar |
661
704
  | `--no-version-check` | skip online update check |
662
705
 
706
+ ## Source filter
707
+
708
+ Logs written while eping.py ran on a jump host carry a `SOURCE` column. With `--source` (or the
709
+ selection shown on a terminal when the log holds several sources; numbers like `1,3`, ENTER = all)
710
+ only the periods of the selected sources are calculated: uptime, up/down time, RTT, changes and the
711
+ timeline. Periods of other sources are excluded and shown as a gap in the timeline; a state change that
712
+ happened during such a gap is not counted. Without `--source` everything is combined (as before).
713
+ Logs without a `SOURCE` column are treated as `local`.
714
+
715
+ ![epinga report, source local](https://raw.githubusercontent.com/ewaldj/eping/main/docs/img/report-source.png)
716
+
663
717
  ## Called from eping.py
664
718
 
665
719
  `GENERATE REPORT` (web gui) and `N`/ANALYSE NOW (CLI) both run epinga.py in a
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "eping"
7
- version = "3.86"
7
+ version = "4.00"
8
8
  description = "Continuous ICMP reachability monitor built on fping, with a CSV logfile analyser (epinga)"
9
9
  readme = "README.md"
10
10
  license = { text = "GPL-3.0-or-later" }