eping 3.91__tar.gz → 4.1__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.91
3
+ Version: 4.1
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.91
20
+ # eping.py 4.01
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.
@@ -192,11 +192,12 @@ DOWN. Columns: hostname/IP, state, RTT (ms), last-change timestamp, change count
192
192
  | `F` | add hosts from a file |
193
193
  | `O` | sort order picker — 5 orders (see *Views and sort orders*) |
194
194
  | `T` | add comment — timestamped CSV row (logging on only) |
195
- | `S` | set reference — shown list becomes new base list |
195
+ | `S` | set reference — shown list becomes new base list (hosts not shown are removed and no longer pinged) |
196
196
  | `Z` | zero changes — reset CH-TIME/CH NO, states kept |
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 |
@@ -299,9 +300,11 @@ unless lowered). `CH NO` counts changes; `Z` resets it.
299
300
 
300
301
  CLI `U` and web GUI's view select/`U` picker (see *CLI mode*) reach the same 9 views.
301
302
  The web GUI's own `U` keyboard shortcut only cycles ALL HOSTS → CURRENTLY-UP →
302
- UP+FLAPPING → ALL HOSTS (see *Web GUI* keyboard shortcuts). A view also limits what's
303
- probed — filtered hosts aren't probed until back to ALL HOSTS. Host list snapshotted at
304
- switch time. A view with no matches is rejected, previous view stays active.
303
+ UP+FLAPPING → ALL HOSTS (see *Web GUI* keyboard shortcuts). A view is a pure display
304
+ filter, evaluated live on every refresh: all hosts keep being pinged, a host that goes
305
+ DOWN leaves `CURRENTLY-UP`, a host that comes UP appears. Only SET REFERENCE removes the
306
+ hosts that are not shown from the host list (they are no longer pinged) and resets the
307
+ view to ALL HOSTS. A view with no matches is rejected, previous view stays active.
305
308
 
306
309
  `ALWAYS-UP`/`ALWAYS-DOWN`: never changed state this run (`CH NO` = 0). `NO-DNS` counts
307
310
  as DOWN for `CURRENTLY-DOWN`/`ALWAYS-DOWN`/`DOWN+FLAPPING`.
@@ -376,6 +379,8 @@ Same bounds as the matching CLI flags (`-lms`/`-lmf` for the last two - see *Out
376
379
  | POST | `/api/command` | `{"cmd":"...","value":"..."}` | control (see cmd list below) |
377
380
  | POST | `/api/advvalues` | `{"filter":{...}}` | ADV FILTER: values still selectable for a draft selection (same format as `adv_filter`) |
378
381
  | POST | `/api/upload` | host list, text | add hosts |
382
+ | POST | `/api/log_sources` | `{"names":[...]}` | SOURCE values of the named logfiles (empty = active logfile), for SELECT JUMPHOST |
383
+ | 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)*) |
379
384
 
380
385
  `cmd` values: `up_only`, `set_filter`, `addr_mode`, `get_names`, `match_filter`,
381
386
  `adv_filter`, `sort`, `add`, `del`, `set_ref`, `zero`, `add_comment`, `reset_log`, `clear`,
@@ -386,7 +391,7 @@ value: `key=value`. `reset_log` value: logging off - optional custom file name (
386
391
  auto-generated); logging on - `y` (clear) or `new`/`new=<name>` (new file, optional
387
392
  custom name). `run_report`: `value` = empty (active logfile) or one `.csv` filename; or
388
393
  JSON body field `values`: `[...]` to merge and analyse multiple `.csv` files as one
389
- (max 25). `save_hosts_file` value: optional target file name (blank
394
+ (max 25); optional body field `sources`: `[...]` restricts the analysis to these SOURCE values. `save_hosts_file` value: optional target file name (blank
390
395
  = active `-f` hostfile, or `eping-hosts.txt` if none).
391
396
 
392
397
  `-wv` answers `403` to `POST /api/command`/`/api/upload`; `-wvc`/`-web` allow both. No
@@ -441,8 +446,11 @@ separated) · `-r` IP range (comma separated, shortened end)
441
446
  | `-ipo` | — | off | start with IP ONLY |
442
447
  | `-gn` | — | off | GET NAMES once at startup |
443
448
  | `-ncs` | — | off | skip `--check-source` |
449
+ | `-ssh` | `[USER@]HOST[:PORT]` | off | run fping on a jump host via ssh (see *SSH source (JUMPHOST)*) |
450
+ | `-sshkey` | file | agent | private key file for `-ssh` |
451
+ | `-sshhk` | accept-new/ask/off | accept-new | host key check for `-ssh` |
444
452
  | `-ncf` | — | off | CSV: do not ping the CSV IP of a name without DNS record |
445
- | `-up` | — | 0 | learning phase: after N rounds keep only hosts seen UP |
453
+ | `-up` | — | 0 | learning phase: after N rounds show only hosts seen UP (view CURRENTLY-UP; all hosts are still pinged until SET REFERENCE) |
446
454
  | `-setref` | — | off | with `-up`: hosts seen UP become new reference list |
447
455
 
448
456
  Hard-enforced at startup and live via ADV OPTIONS (`-web` only), same bounds.
@@ -468,11 +476,11 @@ Hard-enforced at startup and live via ADV OPTIONS (`-web` only), same bounds.
468
476
  Unless `-dl`, every round appends to `eping-log_YYYY-MM-DD_HH:MM:SS.csv` (or `-o FILE`):
469
477
 
470
478
  ```
471
- TIMESTAMP,HOSTNAME,PREVIOUS_STATE,CURRENT_STATE,RTT,NO_OF_CHANGES,CHANGE_TIMESTAMP,TBD,IP,INV_HOSTNAME,SERIAL_NUMBER,MODEL,LOCATION,SYSLOCATION,TYPE,INV_COMMENT
479
+ 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
472
480
  ```
473
481
 
474
482
  `INV_HOSTNAME` … `INV_COMMENT`: the inventory values of a host added from an inventory CSV (see
475
- *Inventory CSV import*), empty for all other hosts. Logs without these columns (older
483
+ *Inventory CSV import*), empty for all other hosts. `SOURCE`: `local` or the ssh jump host that produced the row. Logs without these columns (older
476
484
  versions) stay readable by epinga.py.
477
485
 
478
486
  `TBD`: suppressed DOWN observations (`-cf`). `IP`: address actually pinged (empty for
@@ -498,6 +506,29 @@ these rows automatically.
498
506
  - Logging off: same dialog, no clear option - `START LOGGING` starts a fresh file
499
507
  right away, same optional custom name.
500
508
 
509
+ ## SSH source (JUMPHOST)
510
+
511
+ Run fping on a jump host instead of locally (system `ssh` only). Any Linux host with a working `fping`
512
+ (e.g. a caretaker) will do; it resolves the names itself. Start: `-ssh [USER@]HOST[:PORT]` (+ `-sshkey FILE`, `-sshhk MODE`);
513
+ the password or key passphrase is asked on the terminal at startup. At runtime: `J` in the CLI,
514
+ JUMPHOST button in the web GUI (after ADV OPTIONS).
515
+
516
+ ![JUMPHOST window](https://raw.githubusercontent.com/ewaldj/eping/main/docs/img/jumphost.png)
517
+
518
+ - Window: HOST, PORT, USER, PASSWORD (key passphrase), HOST KEY, KEY FILE. TEST checks ssh, login and
519
+ fping on the jump host, CONNECT switches the scan source, USE LOCAL switches back. A missing local
520
+ `ssh` is shown in the window.
521
+ - HOST KEY: `accept-new` (default) - hosts seen for the first time are trusted automatically, a changed
522
+ key is still refused; `ask` - an unknown key is shown with its fingerprint and must be accepted with
523
+ TRUST KEY; `off` - no check at all (insecure).
524
+ - The switch is applied at the start of the next round; hosts, states and counters are kept.
525
+ - Connection loss: results of the round are discarded, hosts keep their state, a banner is shown and
526
+ eping reconnects. Logged as `#COMMENT#` rows (`JUMPHOST ... OFFLINE: <reason>`, `JUMPHOST ... ONLINE
527
+ again`, `SOURCE SWITCH <old> -> <new>`), shown in the report's comment timeline.
528
+ - Log column `SOURCE`: `local` or the jump host of each row.
529
+ - Limits: GET NAMES and the CSV-IP fallback are not available over ssh; at most 4 ssh processes
530
+ (2 on Windows); the web password transfer is plain HTTP - use `-bind 127.0.0.1` or a trusted network.
531
+
501
532
  ## Web GUI header
502
533
 
503
534
  Header: `eping.py vX.XX · © Ewald Jeitler · supervised by Nelly · tools.jeitler.cc ·
@@ -539,11 +570,17 @@ logging is off or the logfile is empty/missing.
539
570
  ## GENERATE REPORT (web gui) / ANALYSE NOW (CLI `N`)
540
571
 
541
572
  Runs epinga.py against one or more logfiles in the background while eping.py keeps
542
- running - not just at exit. Web: GENERATE REPORT dropdown, two entries - `ACTIVE
573
+ running - not just at exit. Web: GENERATE REPORT dropdown, three entries - `ACTIVE
543
574
  LOGFILE` analyses the active CSV log (needs logging on, non-empty logfile, else the tab
544
575
  closes and a footer error is shown), `CHOOSE LOGFILE` picks one or more `.csv` files in
545
576
  the working dir - table (name/size/date), "select all" checkbox, nothing preselected;
546
- up to 25 files per report, checking a 26th is refused.
577
+ up to 25 files per report, checking a 26th is refused. `SELECT JUMPHOST` lists the
578
+ sources (`local` and jump hosts, log column `SOURCE`) found in the active logfile - all checked,
579
+ ENTER = GENERATE; only the periods of the checked sources are calculated (see *Source filter* in the
580
+ epinga.py section). Shown only if the log holds more than one source.
581
+
582
+ ![SELECT JUMPHOST](https://raw.githubusercontent.com/ewaldj/eping/main/docs/img/select-jumphost.png)
583
+
547
584
  More than one selected file is merged chronologically (by mtime) into one temporary
548
585
  CSV, analysed as a single logfile, then the temp file is removed. Result opens in a new
549
586
  tab; if a selected file was invalid or has meanwhile been removed (e.g. by log rotation
@@ -654,7 +691,7 @@ phases: eping's own work (~0.12s on 4109 hosts).
654
691
  - `-p` > 1 and `-i 0` reduce accuracy (false DOWN) — defaults avoid both.
655
692
  - `-dr 0` produces flapping hosts in practice — keep the default of 1.
656
693
 
657
- # epinga.py 2.35
694
+ # epinga.py 2.37
658
695
 
659
696
  Analyses an eping.py CSV log: terminal summary + self-contained HTML report (no
660
697
  server, no external assets) with per-host detail, state-change timelines, and
@@ -679,6 +716,7 @@ Output: `<base>_report.txt` and `<base>_report.html` (`--html FILE` overrides).
679
716
  | `-s`, `--start YYYY-MM-DD HH:MM:SS` | rows from this timestamp on |
680
717
  | `-e`, `--end YYYY-MM-DD HH:MM:SS` | rows up to this timestamp |
681
718
  | `-S`, `--sort {name,flapping,uptime,rtt}` | summary sort order (default `name`) |
719
+ | `--source SOURCE` | only rows of this source - `local` or the jump host label from the log column `SOURCE` (repeatable; see *Source filter*) |
682
720
  | `--no-detail` | summary only |
683
721
  | `--no-changes` | omit state-change list |
684
722
  | `--html FILE` | custom HTML filename |
@@ -686,6 +724,17 @@ Output: `<base>_report.txt` and `<base>_report.html` (`--html FILE` overrides).
686
724
  | `-q`, `--quiet` | suppress progress bar |
687
725
  | `--no-version-check` | skip online update check |
688
726
 
727
+ ## Source filter
728
+
729
+ Logs written while eping.py ran on a jump host carry a `SOURCE` column. With `--source` (or the
730
+ selection shown on a terminal when the log holds several sources; numbers like `1,3`, ENTER = all)
731
+ only the periods of the selected sources are calculated: uptime, up/down time, RTT, changes and the
732
+ timeline. Periods of other sources are excluded and shown as a gap in the timeline; a state change that
733
+ happened during such a gap is not counted. Without `--source` everything is combined (as before).
734
+ Logs without a `SOURCE` column are treated as `local`.
735
+
736
+ ![epinga report, source local](https://raw.githubusercontent.com/ewaldj/eping/main/docs/img/report-source.png)
737
+
689
738
  ## Called from eping.py
690
739
 
691
740
  `GENERATE REPORT` (web gui) and `N`/ANALYSE NOW (CLI) both run epinga.py in a
@@ -1,4 +1,4 @@
1
- # eping.py 3.91
1
+ # eping.py 4.01
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.
@@ -173,11 +173,12 @@ DOWN. Columns: hostname/IP, state, RTT (ms), last-change timestamp, change count
173
173
  | `F` | add hosts from a file |
174
174
  | `O` | sort order picker — 5 orders (see *Views and sort orders*) |
175
175
  | `T` | add comment — timestamped CSV row (logging on only) |
176
- | `S` | set reference — shown list becomes new base list |
176
+ | `S` | set reference — shown list becomes new base list (hosts not shown are removed and no longer pinged) |
177
177
  | `Z` | zero changes — reset CH-TIME/CH NO, states kept |
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 |
@@ -280,9 +281,11 @@ unless lowered). `CH NO` counts changes; `Z` resets it.
280
281
 
281
282
  CLI `U` and web GUI's view select/`U` picker (see *CLI mode*) reach the same 9 views.
282
283
  The web GUI's own `U` keyboard shortcut only cycles ALL HOSTS → CURRENTLY-UP →
283
- UP+FLAPPING → ALL HOSTS (see *Web GUI* keyboard shortcuts). A view also limits what's
284
- probed — filtered hosts aren't probed until back to ALL HOSTS. Host list snapshotted at
285
- switch time. A view with no matches is rejected, previous view stays active.
284
+ UP+FLAPPING → ALL HOSTS (see *Web GUI* keyboard shortcuts). A view is a pure display
285
+ filter, evaluated live on every refresh: all hosts keep being pinged, a host that goes
286
+ DOWN leaves `CURRENTLY-UP`, a host that comes UP appears. Only SET REFERENCE removes the
287
+ hosts that are not shown from the host list (they are no longer pinged) and resets the
288
+ view to ALL HOSTS. A view with no matches is rejected, previous view stays active.
286
289
 
287
290
  `ALWAYS-UP`/`ALWAYS-DOWN`: never changed state this run (`CH NO` = 0). `NO-DNS` counts
288
291
  as DOWN for `CURRENTLY-DOWN`/`ALWAYS-DOWN`/`DOWN+FLAPPING`.
@@ -357,6 +360,8 @@ Same bounds as the matching CLI flags (`-lms`/`-lmf` for the last two - see *Out
357
360
  | POST | `/api/command` | `{"cmd":"...","value":"..."}` | control (see cmd list below) |
358
361
  | POST | `/api/advvalues` | `{"filter":{...}}` | ADV FILTER: values still selectable for a draft selection (same format as `adv_filter`) |
359
362
  | POST | `/api/upload` | host list, text | add hosts |
363
+ | POST | `/api/log_sources` | `{"names":[...]}` | SOURCE values of the named logfiles (empty = active logfile), for SELECT JUMPHOST |
364
+ | 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)*) |
360
365
 
361
366
  `cmd` values: `up_only`, `set_filter`, `addr_mode`, `get_names`, `match_filter`,
362
367
  `adv_filter`, `sort`, `add`, `del`, `set_ref`, `zero`, `add_comment`, `reset_log`, `clear`,
@@ -367,7 +372,7 @@ value: `key=value`. `reset_log` value: logging off - optional custom file name (
367
372
  auto-generated); logging on - `y` (clear) or `new`/`new=<name>` (new file, optional
368
373
  custom name). `run_report`: `value` = empty (active logfile) or one `.csv` filename; or
369
374
  JSON body field `values`: `[...]` to merge and analyse multiple `.csv` files as one
370
- (max 25). `save_hosts_file` value: optional target file name (blank
375
+ (max 25); optional body field `sources`: `[...]` restricts the analysis to these SOURCE values. `save_hosts_file` value: optional target file name (blank
371
376
  = active `-f` hostfile, or `eping-hosts.txt` if none).
372
377
 
373
378
  `-wv` answers `403` to `POST /api/command`/`/api/upload`; `-wvc`/`-web` allow both. No
@@ -422,8 +427,11 @@ separated) · `-r` IP range (comma separated, shortened end)
422
427
  | `-ipo` | — | off | start with IP ONLY |
423
428
  | `-gn` | — | off | GET NAMES once at startup |
424
429
  | `-ncs` | — | off | skip `--check-source` |
430
+ | `-ssh` | `[USER@]HOST[:PORT]` | off | run fping on a jump host via ssh (see *SSH source (JUMPHOST)*) |
431
+ | `-sshkey` | file | agent | private key file for `-ssh` |
432
+ | `-sshhk` | accept-new/ask/off | accept-new | host key check for `-ssh` |
425
433
  | `-ncf` | — | off | CSV: do not ping the CSV IP of a name without DNS record |
426
- | `-up` | — | 0 | learning phase: after N rounds keep only hosts seen UP |
434
+ | `-up` | — | 0 | learning phase: after N rounds show only hosts seen UP (view CURRENTLY-UP; all hosts are still pinged until SET REFERENCE) |
427
435
  | `-setref` | — | off | with `-up`: hosts seen UP become new reference list |
428
436
 
429
437
  Hard-enforced at startup and live via ADV OPTIONS (`-web` only), same bounds.
@@ -449,11 +457,11 @@ Hard-enforced at startup and live via ADV OPTIONS (`-web` only), same bounds.
449
457
  Unless `-dl`, every round appends to `eping-log_YYYY-MM-DD_HH:MM:SS.csv` (or `-o FILE`):
450
458
 
451
459
  ```
452
- TIMESTAMP,HOSTNAME,PREVIOUS_STATE,CURRENT_STATE,RTT,NO_OF_CHANGES,CHANGE_TIMESTAMP,TBD,IP,INV_HOSTNAME,SERIAL_NUMBER,MODEL,LOCATION,SYSLOCATION,TYPE,INV_COMMENT
460
+ 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
453
461
  ```
454
462
 
455
463
  `INV_HOSTNAME` … `INV_COMMENT`: the inventory values of a host added from an inventory CSV (see
456
- *Inventory CSV import*), empty for all other hosts. Logs without these columns (older
464
+ *Inventory CSV import*), empty for all other hosts. `SOURCE`: `local` or the ssh jump host that produced the row. Logs without these columns (older
457
465
  versions) stay readable by epinga.py.
458
466
 
459
467
  `TBD`: suppressed DOWN observations (`-cf`). `IP`: address actually pinged (empty for
@@ -479,6 +487,29 @@ these rows automatically.
479
487
  - Logging off: same dialog, no clear option - `START LOGGING` starts a fresh file
480
488
  right away, same optional custom name.
481
489
 
490
+ ## SSH source (JUMPHOST)
491
+
492
+ Run fping on a jump host instead of locally (system `ssh` only). Any Linux host with a working `fping`
493
+ (e.g. a caretaker) will do; it resolves the names itself. Start: `-ssh [USER@]HOST[:PORT]` (+ `-sshkey FILE`, `-sshhk MODE`);
494
+ the password or key passphrase is asked on the terminal at startup. At runtime: `J` in the CLI,
495
+ JUMPHOST button in the web GUI (after ADV OPTIONS).
496
+
497
+ ![JUMPHOST window](https://raw.githubusercontent.com/ewaldj/eping/main/docs/img/jumphost.png)
498
+
499
+ - Window: HOST, PORT, USER, PASSWORD (key passphrase), HOST KEY, KEY FILE. TEST checks ssh, login and
500
+ fping on the jump host, CONNECT switches the scan source, USE LOCAL switches back. A missing local
501
+ `ssh` is shown in the window.
502
+ - HOST KEY: `accept-new` (default) - hosts seen for the first time are trusted automatically, a changed
503
+ key is still refused; `ask` - an unknown key is shown with its fingerprint and must be accepted with
504
+ TRUST KEY; `off` - no check at all (insecure).
505
+ - The switch is applied at the start of the next round; hosts, states and counters are kept.
506
+ - Connection loss: results of the round are discarded, hosts keep their state, a banner is shown and
507
+ eping reconnects. Logged as `#COMMENT#` rows (`JUMPHOST ... OFFLINE: <reason>`, `JUMPHOST ... ONLINE
508
+ again`, `SOURCE SWITCH <old> -> <new>`), shown in the report's comment timeline.
509
+ - Log column `SOURCE`: `local` or the jump host of each row.
510
+ - Limits: GET NAMES and the CSV-IP fallback are not available over ssh; at most 4 ssh processes
511
+ (2 on Windows); the web password transfer is plain HTTP - use `-bind 127.0.0.1` or a trusted network.
512
+
482
513
  ## Web GUI header
483
514
 
484
515
  Header: `eping.py vX.XX · © Ewald Jeitler · supervised by Nelly · tools.jeitler.cc ·
@@ -520,11 +551,17 @@ logging is off or the logfile is empty/missing.
520
551
  ## GENERATE REPORT (web gui) / ANALYSE NOW (CLI `N`)
521
552
 
522
553
  Runs epinga.py against one or more logfiles in the background while eping.py keeps
523
- running - not just at exit. Web: GENERATE REPORT dropdown, two entries - `ACTIVE
554
+ running - not just at exit. Web: GENERATE REPORT dropdown, three entries - `ACTIVE
524
555
  LOGFILE` analyses the active CSV log (needs logging on, non-empty logfile, else the tab
525
556
  closes and a footer error is shown), `CHOOSE LOGFILE` picks one or more `.csv` files in
526
557
  the working dir - table (name/size/date), "select all" checkbox, nothing preselected;
527
- up to 25 files per report, checking a 26th is refused.
558
+ up to 25 files per report, checking a 26th is refused. `SELECT JUMPHOST` lists the
559
+ sources (`local` and jump hosts, log column `SOURCE`) found in the active logfile - all checked,
560
+ ENTER = GENERATE; only the periods of the checked sources are calculated (see *Source filter* in the
561
+ epinga.py section). Shown only if the log holds more than one source.
562
+
563
+ ![SELECT JUMPHOST](https://raw.githubusercontent.com/ewaldj/eping/main/docs/img/select-jumphost.png)
564
+
528
565
  More than one selected file is merged chronologically (by mtime) into one temporary
529
566
  CSV, analysed as a single logfile, then the temp file is removed. Result opens in a new
530
567
  tab; if a selected file was invalid or has meanwhile been removed (e.g. by log rotation
@@ -635,7 +672,7 @@ phases: eping's own work (~0.12s on 4109 hosts).
635
672
  - `-p` > 1 and `-i 0` reduce accuracy (false DOWN) — defaults avoid both.
636
673
  - `-dr 0` produces flapping hosts in practice — keep the default of 1.
637
674
 
638
- # epinga.py 2.35
675
+ # epinga.py 2.37
639
676
 
640
677
  Analyses an eping.py CSV log: terminal summary + self-contained HTML report (no
641
678
  server, no external assets) with per-host detail, state-change timelines, and
@@ -660,6 +697,7 @@ Output: `<base>_report.txt` and `<base>_report.html` (`--html FILE` overrides).
660
697
  | `-s`, `--start YYYY-MM-DD HH:MM:SS` | rows from this timestamp on |
661
698
  | `-e`, `--end YYYY-MM-DD HH:MM:SS` | rows up to this timestamp |
662
699
  | `-S`, `--sort {name,flapping,uptime,rtt}` | summary sort order (default `name`) |
700
+ | `--source SOURCE` | only rows of this source - `local` or the jump host label from the log column `SOURCE` (repeatable; see *Source filter*) |
663
701
  | `--no-detail` | summary only |
664
702
  | `--no-changes` | omit state-change list |
665
703
  | `--html FILE` | custom HTML filename |
@@ -667,6 +705,17 @@ Output: `<base>_report.txt` and `<base>_report.html` (`--html FILE` overrides).
667
705
  | `-q`, `--quiet` | suppress progress bar |
668
706
  | `--no-version-check` | skip online update check |
669
707
 
708
+ ## Source filter
709
+
710
+ Logs written while eping.py ran on a jump host carry a `SOURCE` column. With `--source` (or the
711
+ selection shown on a terminal when the log holds several sources; numbers like `1,3`, ENTER = all)
712
+ only the periods of the selected sources are calculated: uptime, up/down time, RTT, changes and the
713
+ timeline. Periods of other sources are excluded and shown as a gap in the timeline; a state change that
714
+ happened during such a gap is not counted. Without `--source` everything is combined (as before).
715
+ Logs without a `SOURCE` column are treated as `local`.
716
+
717
+ ![epinga report, source local](https://raw.githubusercontent.com/ewaldj/eping/main/docs/img/report-source.png)
718
+
670
719
  ## Called from eping.py
671
720
 
672
721
  `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.91"
7
+ version = "4.01"
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" }