eping 3.60__tar.gz → 3.84__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.60
3
+ Version: 3.84
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
@@ -12,12 +12,12 @@ Classifier: Operating System :: POSIX :: Linux
12
12
  Classifier: Operating System :: MacOS
13
13
  Classifier: Programming Language :: Python :: 3
14
14
  Classifier: Topic :: System :: Networking :: Monitoring
15
- Requires-Python: >=3.8
15
+ Requires-Python: >=3.6
16
16
  Description-Content-Type: text/markdown
17
17
  License-File: LICENSE
18
18
  Dynamic: license-file
19
19
 
20
- # eping.py 3.60
20
+ # eping.py 3.84
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.
@@ -26,10 +26,11 @@ Written by Ewald Jeitler — <https://www.jeitler.cc>
26
26
 
27
27
  ## Requirements
28
28
 
29
- - Python 3.6+
29
+ - Python 3.6+ (eping.py and epinga.py)
30
30
  - `fping` in `$PATH`
31
31
  - A terminal supporting `curs_set()` for CLI mode
32
32
  - `--check-source` used automatically if fping supports it (5.0+)
33
+ - Non-UTF-8 terminal locale (e.g. `LANG=C`): works, but box-drawing characters are shown as ASCII/`?`; `LC_ALL=C.UTF-8` gives the full look
33
34
 
34
35
  ## Installation / Update
35
36
 
@@ -47,6 +48,19 @@ Standalone scripts (installs/updates `eping.py`, `epinga.py`, `esplit.py`):
47
48
 
48
49
  `esplit.py` isn't part of the pip package - use the standalone install for it.
49
50
 
51
+ ## Windows
52
+
53
+ Portable Windows version (web GUI only, no installation): download and unpack
54
+ [`eping-windows.zip`](https://github.com/ewaldj/eping/blob/main/Windows_Version/eping-windows.zip)
55
+ ([folder](https://github.com/ewaldj/eping/tree/main/Windows_Version/)), then start `eping.exe`.
56
+
57
+ - Contains `eping.exe` (small launcher window: web port, Start / Stop / Restart, open web GUI),
58
+ `eping.py`, `epinga.py`, `fping.exe` + `cygwin1.dll` (fping for Windows) and an embedded Python.
59
+ - The web GUI opens in the browser (default `http://127.0.0.1:8080`). The port is read from the hosts file
60
+ (`opt: -port 9000`); a port already in use is reported and can be changed in the launcher window.
61
+ - No terminal (curses) mode and no `-wv`/`-wvc` on Windows; log file names use `-` instead of `:`.
62
+ - Extra options: put them in `eping-args.txt` next to `eping.exe`. Details: `README-WINDOWS.txt` in the zip.
63
+
50
64
  ## Quick start
51
65
 
52
66
  pip install: use `eping`/`epinga` instead of `./eping.py`/`./epinga.py` below.
@@ -60,7 +74,7 @@ pip install: use `eping`/`epinga` instead of `./eping.py`/`./epinga.py` below.
60
74
  ./eping.py -wvc # CLI + controllable web view
61
75
  ```
62
76
 
63
- No args: creates a sample `eping-hosts.txt`. `-df`: start with no hosts, add at runtime.
77
+ No args: creates a sample `eping-hosts.txt` and `eping-hosts-sample.csv` (same hosts with invented inventory values, a template for the *Inventory CSV import*; never loaded by eping). `-df`: start with no hosts, add at runtime.
64
78
 
65
79
  ### Running unattended (screen / tmux)
66
80
 
@@ -73,7 +87,7 @@ Combinable:
73
87
 
74
88
  | Source | Option |
75
89
  |---|---|
76
- | Host file | `-f FILE[,FILE...]`, comma/space separated, disable with `-df` |
90
+ | Host file | `-f FILE[,FILE...]`, comma/space separated, disable with `-df`; `.txt` host list or inventory `.csv` (see *Inventory CSV import*) |
77
91
  | CIDR network | `-n` (mask /13 … /32), comma separated |
78
92
  | IP range | `-r`, `start-end`, comma separated |
79
93
 
@@ -85,7 +99,7 @@ expansion includes network/broadcast. Several `-f` files are combined before ded
85
99
 
86
100
  ### Host file format
87
101
 
88
- Same parser for `-f`, `F`/ADD FILE (CLI), and web GUI ADD FILE:
102
+ Same parser for `-f`, `F`/ADD FILE (CLI), and web GUI ADD HOSTS FILE:
89
103
 
90
104
  ```
91
105
  # comment to end of line
@@ -98,7 +112,7 @@ www.google.com # hostname/FQDN
98
112
  2606:4700:4700::1111/128 # IPv6 with /128 - single host
99
113
  ```
100
114
 
101
- Network mask range /13…/32 everywhere (host file, ADD FILE, web upload, ADD/DELETE
115
+ Network mask range /13…/32 everywhere (host file, ADD HOSTS FILE, web upload, ADD/DELETE
102
116
  host input); out of range is rejected (message names the allowed range; `-f` warns and
103
117
  ignores). IPv6: only `/128` accepted, any other mask rejected. Anything else is ignored.
104
118
 
@@ -116,12 +130,54 @@ opt: -web -port 9000
116
130
  Multiple `opt:` lines join in file order. `#` comments out the rest of the line (or
117
131
  the whole line at the start). Quote values with spaces: `opt: -f "my hosts.txt"`. A
118
132
  flag typed on the command line wins over the same flag from a file. Only applies to
119
- the initial `-f` read at startup — `F`/ADD FILE (CLI or web, FROM CLIENT/FROM SERVER)
133
+ the initial `-f` read at startup — `F`/ADD FILE (CLI) and ADD HOSTS FILE (web)
120
134
  never parse `opt:` lines, they're just text.
121
135
 
136
+ `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`).
137
+
122
138
  The default `eping-hosts.txt`: sample hosts, this section, then every CLI option as a
123
139
  commented-out `opt:` line with its default (remove `# ` to activate).
124
140
 
141
+ ## Inventory CSV import
142
+
143
+ A `.csv` inventory export (one device per row) can be used as host file: `-f FILE.csv`,
144
+ `F`/ADD FILE (CLI), web GUI FILE OPERATIONS > ADD HOSTS FILE (FROM CLIENT, FROM SERVER, drag and drop). Files
145
+ named `*.txt` are never treated as CSV - they keep the plain host file format above.
146
+
147
+ - **Detection**: first line that is not blank, a `#` comment or an `opt:` line is a header with the columns `IP Address` and
148
+ `Hostname` (case-insensitive); the delimiter (`;`, `,` or tab) is detected.
149
+ - **Columns used**: `IP Address`, `Hostname`, `Serial Number`, `Model`, `Location`,
150
+ `sysLocation`, `Type`, `Comment`. All other columns are ignored.
151
+ - **Host entry**: the `Hostname` (default; rows without an IP are pinged by name too,
152
+ NO-DNS if it does not resolve). A name that is not a valid hostname falls back to the
153
+ IP; rows without a usable entry are ignored. In the IP modes (`-ipo`, PREFER IP
154
+ ADDRESS, also when active while the file is added) the entry is the IP address
155
+ instead and rows without a valid IP are ignored. `-ph` is not needed for a CSV.
156
+ - **Duplicates**: one host per entry, the first row wins. The count of ignored and
157
+ duplicate rows is reported when the file is added (startup message / web footer).
158
+ - **Log**: the six inventory values and the CSV hostname are written with every row
159
+ of that host, see *Logging*. A `Hostname` that is not the host entry (IP mode) is
160
+ only kept there as information.
161
+ - **Filters**: `M` matches the inventory values as text, `V` / ADV FILTER selects them
162
+ (see *ADV FILTER*).
163
+ - **Save**: if the displayed hosts carry inventory values, `SAVE HOSTS FILE` writes an
164
+ inventory `.csv` (see *Web GUI*); plain `.txt` hosts are saved as `.txt`.
165
+
166
+ Example (`;` delimited, extra columns are ignored):
167
+
168
+ ```
169
+ Hostname;IP Address;Serial Number;Model;Location;sysLocation;Type;Comment
170
+ sw-core-01;10.0.0.1;FOC1234A1BC;C9300-48P;Vienna DC1;Rack A3;Switch;spare PSU missing
171
+ sw-core-02;10.0.0.2;FOC1234A1BD;C9300-48P;Vienna DC1;Rack A4;Switch;
172
+ ap-lobby-01;;FCW2528P5PSV;C9120AXI-E;Graz HQ;Lobby;AP;
173
+ rtr-edge-01;192.0.2.10;FTX9876B2CD;ISR4331;Linz POP;Rack B1;Router;uplink to ISP
174
+ sw-access-01;10.0.1.1;FOC5678C3DE;C9200L-24P;Vienna DC1;Rack C1;Switch;
175
+ fw-edge-01;192.0.2.1;JMX2345F6GH;ASA5516;Linz POP;Rack B2;Firewall;ASA 5516 - EoL 2027
176
+ ```
177
+
178
+ This gives 6 hosts, named by `Hostname`. In an IP mode it gives 5 hosts (the IP
179
+ addresses); `ap-lobby-01` has no IP and is ignored.
180
+
125
181
  ## CLI mode
126
182
 
127
183
  Sorted table (IPv4 numerically, then hostnames), 64-column blocks. Green = UP, red =
@@ -130,7 +186,8 @@ DOWN. Columns: hostname/IP, state, RTT (ms), last-change timestamp, change count
130
186
  | Key | Action |
131
187
  |---|---|
132
188
  | `U` | view picker — all 9 views (see *Views and sort orders*) |
133
- | `M` | match filter — regex on hostname/IP, display only (see *Match filter*) |
189
+ | `M` | match filter — regex on hostname/IP and inventory fields, display only (see *Match filter*) |
190
+ | `V` | ADV FILTER — check/uncheck Model/Location/sysLocation/Type/Comment values (show only / hide), display only (see *ADV FILTER*) |
134
191
  | `A` | add host — IP, hostname, CIDR (/13…/32), or `ip1-ip2` (max 524288) |
135
192
  | `D` | delete host — same formats/limits as add |
136
193
  | `F` | add hosts from a file |
@@ -153,7 +210,7 @@ same option set as the matching web GUI dropdown.
153
210
  Dialogs: ENTER confirms, ESC/empty cancels. Key bar shortens on narrow terminals.
154
211
  `PLEASE WAIT` box with elapsed counter shown until the first round has results.
155
212
 
156
- Ping checks keep running while a dialog (`A`/`D`/`F`/`M`/`T`) is open — same
213
+ Ping checks keep running while a dialog (`A`/`D`/`F`/`M`/`V`/`T`) is open — same
157
214
  retry/state/logging logic as the main loop; screen repaints once the dialog closes.
158
215
 
159
216
  Screen repaints ~7×/s independent of fping. `UP`, `SET REFERENCE`, `DEL HOST`, `ZERO
@@ -178,9 +235,9 @@ Single self-contained page, no external resources.
178
235
 
179
236
  - Table: CLI-style columns, filled top-down then next column right. Horizontal scroll
180
237
  if needed ("SCROLL RIGHT FOR MORE" hint in the stats bar).
181
- - Footer stats: RUNTIME, HOST UP/DOWN/FLAPPING, for the whole current view regardless
182
- of the match filter. RUNTIME shows `n/a` briefly during a background round.
183
- - Adding many hosts (`ADD`, `ADD FILE`, upload) shows "added N host(s) - please wait,
238
+ - Footer stats: HOSTS, RUNTIME, HOST UP/DOWN/FLAPPING, for the whole current view regardless
239
+ of the match filter and the ADV FILTER (HOSTS-SHOWN = shown count). The CLI footer counts the same way. RUNTIME shows `n/a` briefly during a background round.
240
+ - Adding many hosts (`ADD`, ADD HOSTS FILE, upload) shows "added N host(s) - please wait,
184
241
  pinging ..." until they appear with a state, then `done`.
185
242
  - Font size 6–28px (slider, `A−`/`A+`, `+`/`−` keys), stored in `localStorage`.
186
243
  - Column headers sort the list (IPv4-aware).
@@ -188,37 +245,46 @@ Single self-contained page, no external resources.
188
245
  - Row 1: view select (9 views), sort order select, SET REFERENCE, ZERO CHANGES,
189
246
  CLEAR ALL, address mode select, GET NAMES, ADV OPTIONS, RESET LOG, FILE OPERATIONS
190
247
  select, EXIT, font size.
191
- - Row 2: match filter (SET/CLEAR), host field (ADD/DELETE), comment field (COMMENT),
192
- ADD FILE select, GENERATE REPORT select.
248
+ - Row 2: match filter (SET/CLEAR), ADV FILTER, host field (ADD/DELETE), comment
249
+ field (COMMENT), GENERATE REPORT select.
193
250
  - View select, sort order select, address mode select and ADV OPTIONS all match the
194
- CLI's `U`/`O`/`P`/`X` pickers exactly. FILE OPERATIONS and ADD FILE > FROM CLIENT/
195
- FROM SERVER are web-gui-only (no CLI key - CLI already runs on the server's own
251
+ CLI's `U`/`O`/`P`/`X` pickers exactly. FILE OPERATIONS (incl. ADD HOSTS FILE FROM CLIENT/
252
+ FROM SERVER) is web-gui-only (no CLI key - CLI already runs on the server's own
196
253
  filesystem).
197
254
  - **FILE OPERATIONS** dropdown, in this order:
198
255
  | Entry | Does |
199
256
  |---|---|
200
- | 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 |
257
+ | 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
+ | ADD HOSTS FILE FROM CLIENT | local file picker (`.txt`/`.csv`), 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 |
201
260
  | UPLOAD FILE TO SERVER | picks a local `.txt`/`.csv`, saves as-is server-side, no host parsing; never overwrites, appends `-1`/`-2`/... |
202
- | DOWNLOAD ALL HOSTS | full reference list, plain text |
203
- | DOWNLOAD ACTIVE HOSTS | currently displayed hosts (view/address mode/filter applied), plain text |
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 |
204
263
  | DOWNLOAD ACTIVE LOGFILE | active CSV log, zipped; disabled while logging off |
205
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 |
206
265
  | DELETE FILES FROM SERVER | same picker as DOWNLOAD SELECTED FILES, red DELETE button, confirms with file count; active logfile can't be deleted |
207
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 |
208
- - **ADD FILE** dropdown: `FROM CLIENT` (local file picker) / `FROM SERVER` (picks one
209
- or more `.txt` files already on the server, adds their hosts).
210
267
  - Keyboard shortcuts (no modifier, only while no text field has focus; own quick
211
268
  variants, not the CLI's picker keys of the same letter): `U` cycles the original 3
212
269
  views (ALL HOSTS → CURRENTLY-UP → UP+FLAPPING → ALL HOSTS), the other 6 need the
213
270
  dropdown; `O` cycles all 5 sort orders one at a time; `P`/`I` toggle PREFER HOSTNAME /
214
271
  SWITCH TO IP ONLY directly, the address mode select reaches all 4 modes; `G`/`S`/`Z`/
215
272
  `C`/`L`/`E` click the matching button (`E`/`C`/`L` confirm); `A`/`D` focus host field;
216
- `M`/`T` focus their field; `F` opens the file picker; `R` forces a status refresh;
273
+ `M`/`T` focus their field; `V` opens ADV FILTER; `F` opens the ADD HOSTS FILE FROM CLIENT picker; `R` forces a status refresh;
217
274
  `+`/`−` font size (works while typing). No keyboard shortcut for `X`/ADV OPTIONS or
218
275
  GENERATE REPORT - click required.
219
276
  - Host field feeds both ADD/DELETE; ENTER triggers the button used last, ESC clears.
220
277
  - Files can also be dropped anywhere on the page (max 16MB, see *Host file format*).
221
278
  - Commands acknowledge immediately; a click aborts the running round.
279
+ - **Host popup**: hovering a host row (after ~350 ms) shows everything known about it:
280
+ state, previous state, RTT, last check, changes, time in the current state, resolved/CSV
281
+ IP, inventory values (Model, Location, sysLocation, Type, Comment, serial) and its
282
+ history (last up to 50 state changes, newest first, merged with the log `COMMENT`s
283
+ by time). The data is fetched per host on demand (`GET /api/host`), the polled status
284
+ stays small. A click on the row pins the popup: the text can be selected, `COPY` copies
285
+ all of it, `DELETE` removes the host immediately (no confirmation; not shown in `-wv`),
286
+ `×`/ESC/click elsewhere closes it. The history lives in memory only; it is cleared by
287
+ ZERO CHANGES and CLEAR ALL.
222
288
 
223
289
  ### Views and sort orders
224
290
 
@@ -290,7 +356,8 @@ Same bounds as the matching CLI flags (`-lms`/`-lmf` for the last two - see *Out
290
356
  |---|---|---|---|
291
357
  | GET | `/` | — | the page |
292
358
  | GET | `/api/status` | — | JSON: rows, counters, scan/phase info |
293
- | GET | `/api/logfiles` | — | JSON list of `.csv`/`.txt`/`.html` files (FILE OPERATIONS, ADD FILE > FROM SERVER) |
359
+ | GET | `/api/host?name=...` | — | JSON: all known data and history of one host (mouse-over popup) |
360
+ | GET | `/api/logfiles` | — | JSON list of `.csv`/`.txt`/`.html` files (FILE OPERATIONS > ADD HOSTS FILE FROM SERVER) |
294
361
  | GET | `/api/download/hosts_all` | — | full reference list, `.txt` |
295
362
  | GET | `/api/download/hosts_shown` | — | shown hosts, `.txt` |
296
363
  | GET | `/api/download/logfile` | — | active CSV log, zipped; `404` if logging off |
@@ -301,11 +368,14 @@ Same bounds as the matching CLI flags (`-lms`/`-lmf` for the last two - see *Out
301
368
  | POST | `/api/add_from_server` | `{"names":[...]}` | add hosts from listed `.txt` files |
302
369
  | GET | `/api/report` | — | last GENERATE REPORT HTML; `404` until done |
303
370
  | POST | `/api/command` | `{"cmd":"...","value":"..."}` | control (see cmd list below) |
371
+ | POST | `/api/advvalues` | `{"filter":{...}}` | ADV FILTER: values still selectable for a draft selection (same format as `adv_filter`) |
304
372
  | POST | `/api/upload` | host list, text | add hosts |
305
373
 
306
374
  `cmd` values: `up_only`, `set_filter`, `addr_mode`, `get_names`, `match_filter`,
307
- `sort`, `add`, `del`, `set_ref`, `zero`, `add_comment`, `reset_log`, `clear`,
308
- `set_option`, `reset_options`, `run_report`, `save_hosts_file`, `exit`. `set_option`
375
+ `adv_filter`, `sort`, `add`, `del`, `set_ref`, `zero`, `add_comment`, `reset_log`, `clear`,
376
+ `set_option`, `reset_options`, `run_report`, `save_hosts_file`, `exit`. `adv_filter` value: JSON object `{"<field>":{"mode":"in|out","values":[...]}}` with the fields `model`,
377
+ `location`, `sysloc`, `type`, `comment`; `\u0001none` as value = hosts without a value; `{}` = off
378
+ (the old `{"<field>":"<value>"}` form is still accepted as `in` with one value). `set_option`
309
379
  value: `key=value`. `reset_log` value: logging off - optional custom file name (blank =
310
380
  auto-generated); logging on - `y` (clear) or `new`/`new=<name>` (new file, optional
311
381
  custom name). `run_report`: `value` = empty (active logfile) or one `.csv` filename; or
@@ -321,7 +391,9 @@ authentication. Default bind `0.0.0.0` — use `-bind 127.0.0.1` outside trusted
321
391
  1. Hostnames resolved once (32 parallel), cached around `-dns` seconds (randomized a
322
392
  bit so a large batch resolved together doesn't all expire - and need re-resolving -
323
393
  in the same round later). Same-address names share one probe. Unresolvable → NO-DNS,
324
- no fping call. `-dns 0` = fping-side resolve.
394
+ no fping call. `-dns 0` = fping-side resolve. A command (filter, add, ...) cuts
395
+ the name resolution short as well, so it applies at once even with thousands of
396
+ hostnames.
325
397
  2. UP/new hosts get full `-re` retries; confirmed-DOWN hosts get `-dr` retries. Every
326
398
  `-fs`-th round probes everything with full retries.
327
399
  3. Only 1/`-ds` of DOWN hosts probed per round, strided.
@@ -389,9 +461,13 @@ Hard-enforced at startup and live via ADV OPTIONS (`-web` only), same bounds.
389
461
  Unless `-dl`, every round appends to `eping-log_YYYY-MM-DD_HH:MM:SS.csv` (or `-o FILE`):
390
462
 
391
463
  ```
392
- TIMESTAMP,HOSTNAME,PREVIOUS_STATE,CURRENT_STATE,RTT,NO_OF_CHANGES,CHANGE_TIMESTAMP,TBD,IP
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
393
465
  ```
394
466
 
467
+ `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
469
+ versions) stay readable by epinga.py.
470
+
395
471
  `TBD`: suppressed DOWN observations (`-cf`). `IP`: address actually pinged (empty for
396
472
  NO-DNS). Log rotates to a new file once it reaches `-lms` MB; a single round's data is
397
473
  always written in full to one file, rotation only starts the next round in a new file.
@@ -487,7 +563,9 @@ limit shown in the modal text.
487
563
  `PREFER HOSTNAME` (`-ph`): drops a raw-IP host from pinging when another entry resolves
488
564
  to the same address. Redundancy check cached `-dns` seconds. `PREFER IP ADDRESS`: the
489
565
  mirror - drops a hostname entry once its resolved address is already covered by a
490
- raw-IP entry. Both non-destructive, restored by switching to another mode.
566
+ raw-IP entry. Both non-destructive, restored by switching to another mode. Starting
567
+ with `-ph` resolves every hostname first (in parallel): the CLI shows a PLEASE WAIT
568
+ box with an elapsed counter meanwhile, the web mode a line in the terminal.
491
569
 
492
570
  `SWITCH TO IP ONLY` (`-ipo`): resolves every hostname to its address (v4/v6 per
493
571
  `-4`/`-6`, A preferred by default) and renames it in place (history/uptime carry over).
@@ -513,11 +591,37 @@ message shows for 3s after. Re-triggering while running shows "already running".
513
591
  ## Match filter
514
592
 
515
593
  `M` (CLI) / match filter field (web): case-insensitive regex, display only, matched
516
- against shown name and resolved IP. Every host keeps being pinged regardless. Empty
594
+ against shown name, resolved IP and the inventory fields (CSV hostname, serial
595
+ number, model, location, sysLocation, type, comment). Every host keeps being pinged regardless. Empty
517
596
  value turns it off. CLI: replaces the version banner with `MATCH FILTER '<regex>'
518
597
  active (N of M hosts shown, all still pinged)`. Invalid regex: error shown, previous
519
598
  filter unchanged.
520
599
 
600
+ ## ADV FILTER
601
+
602
+ Excel-style display filter on the inventory values of a CSV import (*Inventory CSV
603
+ import*) for `Model`, `Location`, `sysLocation`, `Type` and `Comment`. Display only -
604
+ every host keeps being pinged. Needs hosts with inventory values; without them the
605
+ dialog says so.
606
+
607
+ - **Open**: CLI `V`, web GUI button `ADV FILTER` or key `V`. A separate window; the
608
+ filter only changes when applied.
609
+ - **Per field**: check any number of values (with host count; `(empty)` = hosts without
610
+ a value) and choose the mode: `SHOW ONLY CHECKED` (include) or `HIDE CHECKED`
611
+ (exclude). Nothing checked = field not filtered.
612
+ - **Combination**: values within a field are ORed, fields are ANDed with each other, with
613
+ the match filter (`M`) and the view. The lists narrow as you select: only values still
614
+ possible with the other fields' selection are offered.
615
+ - **Web window**: one list per field with search box, `ALL`/`NONE` (act on the entries
616
+ matching the search), the mode toggle, APPLY, RESET ALL, CLOSE. Lists show the first
617
+ 500 entries, the rest via search.
618
+ - **CLI window**: `↑`/`↓` field, ENTER opens the value list (`SPACE` check, `I` show-only/hide,
619
+ `A` all, `N` none, ENTER ok, ESC cancel), then `A` APPLY, `R` RESET ALL, ESC CANCEL.
620
+ No search in the CLI list.
621
+ - **Banner**: while active the CLI banner shows e.g. `ADV Type not in (Firewall, Switch)`.
622
+ - **Reset**: SET REFERENCE and CLEAR ALL turn the filter off. It is not saved
623
+ with `SAVE HOSTS FILE`.
624
+
521
625
  ## IPv6
522
626
 
523
627
  IPv4/IPv6 mixed freely. Resolution follows `-4`/`-6` (preference, not restriction; A
@@ -543,7 +647,7 @@ phases: eping's own work (~0.12s on 4109 hosts).
543
647
  - `-p` > 1 and `-i 0` reduce accuracy (false DOWN) — defaults avoid both.
544
648
  - `-dr 0` produces flapping hosts in practice — keep the default of 1.
545
649
 
546
- # epinga.py 2.27
650
+ # epinga.py 2.35
547
651
 
548
652
  Analyses an eping.py CSV log: terminal summary + self-contained HTML report (no
549
653
  server, no external assets) with per-host detail, state-change timelines, and
@@ -593,13 +697,23 @@ Top bar: total/UP/flapping/DOWN/no-DNS/duplicate-host counts. Toolbar:
593
697
 
594
698
  | Control | Does |
595
699
  |---|---|
596
- | Filter | text or regex (case-insensitive), hostname + IP; invalid regex falls back to substring |
700
+ | Filter | text or regex (case-insensitive), hostname + IP + inventory fields (CSV hostname, serial, model, location, sysLocation, type, comment); invalid regex falls back to substring |
597
701
  | Show | restrict to one state (flapping independent of UP/DOWN/NO-DNS) |
598
702
  | Sort | name / uptime% / avg RTT / changes; click a header, shift+click adds a tie-breaker (①②③ badge), shift+click again flips direction |
599
703
  | IP View | toggle primary label hostname↔IP (table + buckets); independent of dedup |
600
704
  | Deduplication | No dedup / Prefer IP / Prefer hostname - hides the redundant side across table, buckets, top-bar cards; DUPLICATES card is `0` once a mode is active |
705
+ | Reset | clears Filter, Show and the inventory drop-downs (sort, IP View and deduplication stay) |
601
706
  | Download | saves the report exactly as shown (theme/dedup/sort/filter/collapsed state) as a standalone `.html`, client-side; hidden on `file://` |
602
707
 
708
+ **Inventory filters** (logs with inventory columns, see *Inventory CSV import*): to the
709
+ right of the top-bar counters, one drop-down each for Model, Location, sysLocation,
710
+ Type and Comment, listing the values found in the log with their host count (`(empty)` for hosts
711
+ without a value). They combine with each other and with Filter/Show and affect the
712
+ Host List only. A column without any value gets no drop-down; serial number and CSV
713
+ hostname are unique per device and searched via Filter instead. The drop-downs are
714
+ narrow; the one in use widens while it has focus and the others move aside. A host's detail shows
715
+ all inventory values, the Host List CSV download adds them as columns.
716
+
603
717
  **Comments**: section above Host List from `#COMMENT#` rows, collapsed by default,
604
718
  timestamp + text in log order. Also appear inline in a host's STATE CHANGES timeline
605
719
  (orange, 💬 marker), HTML-escaped. Same merge in text output (`PER-HOST DETAIL`,