eping 4.0__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.
- {eping-4.0 → eping-4.1}/PKG-INFO +9 -7
- {eping-4.0 → eping-4.1}/README.md +8 -6
- {eping-4.0 → eping-4.1}/pyproject.toml +1 -1
- {eping-4.0 → eping-4.1}/src/eping/eping.py +44 -47
- {eping-4.0 → eping-4.1}/src/eping.egg-info/PKG-INFO +9 -7
- {eping-4.0 → eping-4.1}/LICENSE +0 -0
- {eping-4.0 → eping-4.1}/setup.cfg +0 -0
- {eping-4.0 → eping-4.1}/src/eping/__init__.py +0 -0
- {eping-4.0 → eping-4.1}/src/eping/_launch_eping.py +0 -0
- {eping-4.0 → eping-4.1}/src/eping/epinga.py +0 -0
- {eping-4.0 → eping-4.1}/src/eping.egg-info/SOURCES.txt +0 -0
- {eping-4.0 → eping-4.1}/src/eping.egg-info/dependency_links.txt +0 -0
- {eping-4.0 → eping-4.1}/src/eping.egg-info/entry_points.txt +0 -0
- {eping-4.0 → eping-4.1}/src/eping.egg-info/top_level.txt +0 -0
{eping-4.0 → eping-4.1}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: eping
|
|
3
|
-
Version: 4.
|
|
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 4.
|
|
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.
|
|
@@ -192,7 +192,7 @@ 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*) |
|
|
@@ -300,9 +300,11 @@ unless lowered). `CH NO` counts changes; `Z` resets it.
|
|
|
300
300
|
|
|
301
301
|
CLI `U` and web GUI's view select/`U` picker (see *CLI mode*) reach the same 9 views.
|
|
302
302
|
The web GUI's own `U` keyboard shortcut only cycles ALL HOSTS → CURRENTLY-UP →
|
|
303
|
-
UP+FLAPPING → ALL HOSTS (see *Web GUI* keyboard shortcuts). A view
|
|
304
|
-
|
|
305
|
-
|
|
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.
|
|
306
308
|
|
|
307
309
|
`ALWAYS-UP`/`ALWAYS-DOWN`: never changed state this run (`CH NO` = 0). `NO-DNS` counts
|
|
308
310
|
as DOWN for `CURRENTLY-DOWN`/`ALWAYS-DOWN`/`DOWN+FLAPPING`.
|
|
@@ -448,7 +450,7 @@ separated) · `-r` IP range (comma separated, shortened end)
|
|
|
448
450
|
| `-sshkey` | file | agent | private key file for `-ssh` |
|
|
449
451
|
| `-sshhk` | accept-new/ask/off | accept-new | host key check for `-ssh` |
|
|
450
452
|
| `-ncf` | — | off | CSV: do not ping the CSV IP of a name without DNS record |
|
|
451
|
-
| `-up` | — | 0 | learning phase: after N rounds
|
|
453
|
+
| `-up` | — | 0 | learning phase: after N rounds show only hosts seen UP (view CURRENTLY-UP; all hosts are still pinged until SET REFERENCE) |
|
|
452
454
|
| `-setref` | — | off | with `-up`: hosts seen UP become new reference list |
|
|
453
455
|
|
|
454
456
|
Hard-enforced at startup and live via ADV OPTIONS (`-web` only), same bounds.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# eping.py 4.
|
|
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.
|
|
@@ -173,7 +173,7 @@ 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*) |
|
|
@@ -281,9 +281,11 @@ unless lowered). `CH NO` counts changes; `Z` resets it.
|
|
|
281
281
|
|
|
282
282
|
CLI `U` and web GUI's view select/`U` picker (see *CLI mode*) reach the same 9 views.
|
|
283
283
|
The web GUI's own `U` keyboard shortcut only cycles ALL HOSTS → CURRENTLY-UP →
|
|
284
|
-
UP+FLAPPING → ALL HOSTS (see *Web GUI* keyboard shortcuts). A view
|
|
285
|
-
|
|
286
|
-
|
|
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.
|
|
287
289
|
|
|
288
290
|
`ALWAYS-UP`/`ALWAYS-DOWN`: never changed state this run (`CH NO` = 0). `NO-DNS` counts
|
|
289
291
|
as DOWN for `CURRENTLY-DOWN`/`ALWAYS-DOWN`/`DOWN+FLAPPING`.
|
|
@@ -429,7 +431,7 @@ separated) · `-r` IP range (comma separated, shortened end)
|
|
|
429
431
|
| `-sshkey` | file | agent | private key file for `-ssh` |
|
|
430
432
|
| `-sshhk` | accept-new/ask/off | accept-new | host key check for `-ssh` |
|
|
431
433
|
| `-ncf` | — | off | CSV: do not ping the CSV IP of a name without DNS record |
|
|
432
|
-
| `-up` | — | 0 | learning phase: after N rounds
|
|
434
|
+
| `-up` | — | 0 | learning phase: after N rounds show only hosts seen UP (view CURRENTLY-UP; all hosts are still pinged until SET REFERENCE) |
|
|
433
435
|
| `-setref` | — | off | with `-up`: hosts seen UP become new reference list |
|
|
434
436
|
|
|
435
437
|
Hard-enforced at startup and live via ADV OPTIONS (`-web` only), same bounds.
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "eping"
|
|
7
|
-
version = "4.
|
|
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" }
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
# I knew how it worked.
|
|
8
8
|
# Now, only god knows it!
|
|
9
9
|
# - - - - - - - - - - - - - - - - - - - - - - - -
|
|
10
|
-
VERSION = '4.
|
|
10
|
+
VERSION = '4.01'
|
|
11
11
|
version = VERSION # legacy alias (kept for existing references)
|
|
12
12
|
|
|
13
13
|
# --- scaling limits ---
|
|
@@ -96,9 +96,9 @@ DOWN_SLICES_DEF = 4 # DOWN hosts are spread over this many rounds (1 =
|
|
|
96
96
|
FLAP_WINDOW_MAX = 72000 # minutes = 50 days - see -fw validation
|
|
97
97
|
FLAP_WINDOW_DEF = FLAP_WINDOW_MAX
|
|
98
98
|
|
|
99
|
-
# [U] cycles through these views.
|
|
100
|
-
#
|
|
101
|
-
#
|
|
99
|
+
# [U] cycles through these views. A view is a pure display filter, evaluated live on
|
|
100
|
+
# every refresh (see view_hosts()): all hosts keep being pinged. Only SET REFERENCE
|
|
101
|
+
# drops the hosts that are not shown from the host list.
|
|
102
102
|
FILTER_MODES = [
|
|
103
103
|
('ALL HOSTS', 'ALL', 'ALL'),
|
|
104
104
|
('UP', 'UP', 'UP'),
|
|
@@ -1710,6 +1710,12 @@ def apply_match_filter(rows, pattern):
|
|
|
1710
1710
|
return [r for r in rows
|
|
1711
1711
|
if host_visible(pattern, r[0], r[8] if len(r) > 8 and r[8] else '')]
|
|
1712
1712
|
|
|
1713
|
+
def view_hosts(mode, hosts, host_state, tz_offset, flap_window=FLAP_WINDOW_DEF):
|
|
1714
|
+
"""Hosts of 'hosts' shown by the view 'mode' (live; mode 0 = all, list unchanged)."""
|
|
1715
|
+
if mode <= 0:
|
|
1716
|
+
return hosts
|
|
1717
|
+
return filter_hosts(mode, hosts, host_state, tz_offset, flap_window)
|
|
1718
|
+
|
|
1713
1719
|
def filter_hosts(mode, original_hosts_list, host_state, tz_offset,
|
|
1714
1720
|
flap_window=FLAP_WINDOW_DEF, up_seen=None):
|
|
1715
1721
|
"""Host list for the given view mode - a snapshot, taken when the view switches.
|
|
@@ -7309,7 +7315,6 @@ def run_web_mode(original_hosts_list, host_state, args, logfile_file_name,
|
|
|
7309
7315
|
tz_offset, flap_window, up_seen)
|
|
7310
7316
|
if next_list or next_mode == 0:
|
|
7311
7317
|
filter_mode = next_mode
|
|
7312
|
-
active_hosts_list = apply_addr_mode(next_list)
|
|
7313
7318
|
message = 'view: ' + FILTER_MODES[filter_mode][0]
|
|
7314
7319
|
write_log_info(args.disable_logging, logfile_file_name,
|
|
7315
7320
|
'FILTER ' + FILTER_MODES[filter_mode][0], tz_offset)
|
|
@@ -7327,7 +7332,6 @@ def run_web_mode(original_hosts_list, host_state, args, logfile_file_name,
|
|
|
7327
7332
|
tz_offset, flap_window, up_seen)
|
|
7328
7333
|
if target_list or target_mode == 0:
|
|
7329
7334
|
filter_mode = target_mode
|
|
7330
|
-
active_hosts_list = apply_addr_mode(target_list)
|
|
7331
7335
|
message = 'view: ' + WEB_VIEW_MODES[filter_mode][0]
|
|
7332
7336
|
write_log_info(args.disable_logging, logfile_file_name,
|
|
7333
7337
|
'FILTER ' + WEB_VIEW_MODES[filter_mode][0], tz_offset)
|
|
@@ -7359,9 +7363,7 @@ def run_web_mode(original_hosts_list, host_state, args, logfile_file_name,
|
|
|
7359
7363
|
# IP ONLY is active - see the startup (-ipo) path above
|
|
7360
7364
|
active_hosts_list = [h for h in active_hosts_list if is_ip_host(h)]
|
|
7361
7365
|
else:
|
|
7362
|
-
|
|
7363
|
-
host_state, tz_offset, flap_window, up_seen)
|
|
7364
|
-
active_hosts_list = apply_addr_mode(base_list)
|
|
7366
|
+
active_hosts_list = apply_addr_mode(list(original_hosts_list))
|
|
7365
7367
|
message = 'address mode: ' + ADDR_MODE_LABELS[addr_mode]
|
|
7366
7368
|
elif cmd == 'get_names':
|
|
7367
7369
|
if gn_thread is not None and gn_thread.is_alive():
|
|
@@ -7508,7 +7510,7 @@ def run_web_mode(original_hosts_list, host_state, args, logfile_file_name,
|
|
|
7508
7510
|
# what is actually shown becomes the new reference list - the view
|
|
7509
7511
|
# filter (active_hosts_list) AND the [M]/display filter (display_list
|
|
7510
7512
|
# narrows it further) both apply, see quick/quick_rows just below
|
|
7511
|
-
shown_hosts = [o[0] for o in build_display(active_hosts_list, host_state,
|
|
7513
|
+
shown_hosts = [o[0] for o in build_display(view_hosts(filter_mode, active_hosts_list, host_state, tz_offset, flap_window), host_state,
|
|
7512
7514
|
sort_mode, tz_offset, flap_window)]
|
|
7513
7515
|
if match_filter_re is not None or adv_filter:
|
|
7514
7516
|
shown_hosts = [h for h in shown_hosts
|
|
@@ -7734,7 +7736,7 @@ def run_web_mode(original_hosts_list, host_state, args, logfile_file_name,
|
|
|
7734
7736
|
if cmds or gn_just_finished:
|
|
7735
7737
|
# view and order are pure display changes - show them at once instead of
|
|
7736
7738
|
# letting the browser wait for the running round, same as the CLI does
|
|
7737
|
-
quick = build_display(active_hosts_list, host_state, sort_mode,
|
|
7739
|
+
quick = build_display(view_hosts(filter_mode, active_hosts_list, host_state, tz_offset, flap_window), host_state, sort_mode,
|
|
7738
7740
|
tz_offset, flap_window)
|
|
7739
7741
|
quick_up = sum(1 for e in quick if 'UP' in e[1])
|
|
7740
7742
|
quick_total = len(quick)
|
|
@@ -7774,15 +7776,18 @@ def run_web_mode(original_hosts_list, host_state, args, logfile_file_name,
|
|
|
7774
7776
|
learning_phase = False
|
|
7775
7777
|
else:
|
|
7776
7778
|
learning_done = True
|
|
7777
|
-
active_hosts_list = sorted(up_seen, key=lambda h: (
|
|
7778
|
-
int(ipaddress.ip_address(h)) if is_ip_host(h) else float('inf')))
|
|
7779
|
-
active_hosts_list = apply_addr_mode(active_hosts_list)
|
|
7780
7779
|
if args.set_reference:
|
|
7781
7780
|
# -setref: same as the 'set_ref' web command, once learning ends
|
|
7782
|
-
|
|
7781
|
+
_up_list = apply_addr_mode(sorted(up_seen, key=lambda h: (
|
|
7782
|
+
int(ipaddress.ip_address(h)) if is_ip_host(h) else float('inf'))))
|
|
7783
|
+
_keep = set(_up_list) # once, not per element (was O(n^2))
|
|
7783
7784
|
prune_dropped_hosts([h for h in original_hosts_list if h not in _keep],
|
|
7784
7785
|
host_state, up_seen, down_streak)
|
|
7785
|
-
original_hosts_list = list(
|
|
7786
|
+
original_hosts_list = list(_up_list)
|
|
7787
|
+
active_hosts_list = _up_list
|
|
7788
|
+
filter_mode = 0
|
|
7789
|
+
else:
|
|
7790
|
+
filter_mode = 1 # UP view (display filter), every host is still pinged
|
|
7786
7791
|
learning_phase = True
|
|
7787
7792
|
else:
|
|
7788
7793
|
learning_phase = True
|
|
@@ -7831,7 +7836,7 @@ def run_web_mode(original_hosts_list, host_state, args, logfile_file_name,
|
|
|
7831
7836
|
phase['state'] = time.time() - _t
|
|
7832
7837
|
|
|
7833
7838
|
_t = time.time()
|
|
7834
|
-
display_list = build_display(active_hosts_list, host_state, sort_mode,
|
|
7839
|
+
display_list = build_display(view_hosts(filter_mode, active_hosts_list, host_state, tz_offset, flap_window), host_state, sort_mode,
|
|
7835
7840
|
tz_offset, flap_window)
|
|
7836
7841
|
# HOSTS/HOSTS-UP/HOSTS-DOWN are the totals for the whole current view - a
|
|
7837
7842
|
# [M] display filter narrows what's SHOWN, not what's actually being pinged,
|
|
@@ -9281,9 +9286,6 @@ if __name__=='__main__':
|
|
|
9281
9286
|
tz_offset, flap_window, up_seen)
|
|
9282
9287
|
if next_list or next_mode == 0:
|
|
9283
9288
|
filter_mode = next_mode
|
|
9284
|
-
active_hosts_list = (apply_prefer_ip(next_list, int(args.dns_ttl)) if prefer_ip
|
|
9285
|
-
else apply_prefer_hostname(next_list, int(args.dns_ttl))
|
|
9286
|
-
if prefer_hostname else next_list)
|
|
9287
9289
|
screen.clear()
|
|
9288
9290
|
write_log_info(args.disable_logging, logfile_file_name,
|
|
9289
9291
|
'FILTER ' + WEB_VIEW_MODES[filter_mode][0], tz_offset)
|
|
@@ -9302,9 +9304,6 @@ if __name__=='__main__':
|
|
|
9302
9304
|
tz_offset, flap_window, up_seen)
|
|
9303
9305
|
if target_list or target_mode == 0:
|
|
9304
9306
|
filter_mode = target_mode
|
|
9305
|
-
active_hosts_list = (apply_prefer_ip(target_list, int(args.dns_ttl)) if prefer_ip
|
|
9306
|
-
else apply_prefer_hostname(target_list, int(args.dns_ttl))
|
|
9307
|
-
if prefer_hostname else target_list)
|
|
9308
9307
|
screen.clear()
|
|
9309
9308
|
write_log_info(args.disable_logging, logfile_file_name,
|
|
9310
9309
|
'FILTER ' + WEB_VIEW_MODES[filter_mode][0], tz_offset)
|
|
@@ -9338,11 +9337,10 @@ if __name__=='__main__':
|
|
|
9338
9337
|
notice(io_msg.upper(), 2)
|
|
9339
9338
|
message = io_msg
|
|
9340
9339
|
else:
|
|
9341
|
-
|
|
9342
|
-
|
|
9343
|
-
|
|
9344
|
-
else
|
|
9345
|
-
if prefer_hostname else base_list)
|
|
9340
|
+
_full = list(original_hosts_list)
|
|
9341
|
+
active_hosts_list = (apply_prefer_ip(_full, int(args.dns_ttl)) if prefer_ip
|
|
9342
|
+
else apply_prefer_hostname(_full, int(args.dns_ttl))
|
|
9343
|
+
if prefer_hostname else _full)
|
|
9346
9344
|
message = 'address mode: ' + ADDR_MODE_LABELS[target_mode]
|
|
9347
9345
|
elif not (0 <= target_mode < len(ADDR_MODE_LABELS)):
|
|
9348
9346
|
message = 'invalid address mode'
|
|
@@ -9828,7 +9826,7 @@ if __name__=='__main__':
|
|
|
9828
9826
|
# mirror the same fix as run_web_mode(): HOSTS-UP/DOWN in the web view should
|
|
9829
9827
|
# be the totals for the current view, not narrowed by the [M] display filter
|
|
9830
9828
|
# the way the curses screen's own hosts_count_up/down are (left untouched here).
|
|
9831
|
-
total_list = build_display(active_hosts_list, host_state, sort_mode,
|
|
9829
|
+
total_list = build_display(view_hosts(filter_mode, active_hosts_list, host_state, tz_offset, flap_window), host_state, sort_mode,
|
|
9832
9830
|
tz_offset, flap_window)
|
|
9833
9831
|
total_up = sum(1 for e in total_list if 'UP' in e[1])
|
|
9834
9832
|
total_down = len(total_list) - total_up
|
|
@@ -9857,7 +9855,7 @@ if __name__=='__main__':
|
|
|
9857
9855
|
so they can take effect at once instead of after the next scan round.
|
|
9858
9856
|
"""
|
|
9859
9857
|
global display_list, hosts_count_up, hosts_count_down, hosts_count_flap
|
|
9860
|
-
display_list = build_display(active_hosts_list, host_state, sort_mode,
|
|
9858
|
+
display_list = build_display(view_hosts(filter_mode, active_hosts_list, host_state, tz_offset, flap_window), host_state, sort_mode,
|
|
9861
9859
|
tz_offset, flap_window)
|
|
9862
9860
|
# HOSTS/UP/DOWN/FLAPPING are the totals of the whole view - [M] and ADV FILTER
|
|
9863
9861
|
# only narrow what is shown, every host is still pinged
|
|
@@ -10232,9 +10230,6 @@ if __name__=='__main__':
|
|
|
10232
10230
|
tz_offset, flap_window, up_seen)
|
|
10233
10231
|
if new_list or new_mode == 0:
|
|
10234
10232
|
filter_mode = new_mode
|
|
10235
|
-
active_hosts_list = (apply_prefer_ip(new_list, int(args.dns_ttl)) if prefer_ip
|
|
10236
|
-
else apply_prefer_hostname(new_list, int(args.dns_ttl))
|
|
10237
|
-
if prefer_hostname else new_list)
|
|
10238
10233
|
screen.clear()
|
|
10239
10234
|
write_log_info(args.disable_logging, logfile_file_name,
|
|
10240
10235
|
'FILTER ' + WEB_VIEW_MODES[filter_mode][0], tz_offset)
|
|
@@ -10285,11 +10280,10 @@ if __name__=='__main__':
|
|
|
10285
10280
|
ip_only_mode = True
|
|
10286
10281
|
notice(io_msg.upper(), 2)
|
|
10287
10282
|
else:
|
|
10288
|
-
|
|
10289
|
-
|
|
10290
|
-
|
|
10291
|
-
else
|
|
10292
|
-
if prefer_hostname else base_list)
|
|
10283
|
+
_full = list(original_hosts_list)
|
|
10284
|
+
active_hosts_list = (apply_prefer_ip(_full, int(args.dns_ttl)) if prefer_ip
|
|
10285
|
+
else apply_prefer_hostname(_full, int(args.dns_ttl))
|
|
10286
|
+
if prefer_hostname else _full)
|
|
10293
10287
|
notice('ADDRESS MODE: ' + items[picked], 2)
|
|
10294
10288
|
elif cmd == 'GET_NAMES':
|
|
10295
10289
|
if gn_thread is not None and gn_thread.is_alive():
|
|
@@ -10513,20 +10507,23 @@ if __name__=='__main__':
|
|
|
10513
10507
|
learning_phase = False
|
|
10514
10508
|
else:
|
|
10515
10509
|
learning_done = True
|
|
10516
|
-
active_hosts_list = sorted(up_seen, key=lambda h: (
|
|
10517
|
-
int(ipaddress.ip_address(h)) if is_ip_host(h) else float('inf')
|
|
10518
|
-
))
|
|
10519
|
-
active_hosts_list = (apply_prefer_ip(active_hosts_list, int(args.dns_ttl)) if prefer_ip
|
|
10520
|
-
else apply_prefer_hostname(active_hosts_list, int(args.dns_ttl))
|
|
10521
|
-
if prefer_hostname else active_hosts_list)
|
|
10522
10510
|
if args.set_reference:
|
|
10523
10511
|
# -setref: same as pressing [S]/SET REFERENCE once learning ends
|
|
10524
|
-
|
|
10512
|
+
_up_list = sorted(up_seen, key=lambda h: (
|
|
10513
|
+
int(ipaddress.ip_address(h)) if is_ip_host(h) else float('inf')
|
|
10514
|
+
))
|
|
10515
|
+
_up_list = (apply_prefer_ip(_up_list, int(args.dns_ttl)) if prefer_ip
|
|
10516
|
+
else apply_prefer_hostname(_up_list, int(args.dns_ttl))
|
|
10517
|
+
if prefer_hostname else _up_list)
|
|
10518
|
+
_keep = set(_up_list) # once, not per element (was O(n^2))
|
|
10525
10519
|
prune_dropped_hosts([h for h in original_hosts_list if h not in _keep],
|
|
10526
10520
|
host_state, up_seen, down_streak)
|
|
10527
|
-
original_hosts_list = list(
|
|
10521
|
+
original_hosts_list = list(_up_list)
|
|
10522
|
+
active_hosts_list = _up_list
|
|
10523
|
+
filter_mode = 0
|
|
10524
|
+
else:
|
|
10525
|
+
filter_mode = 1 # UP view (display filter), every host is still pinged
|
|
10528
10526
|
screen.clear()
|
|
10529
|
-
filter_mode = 1 # the learning phase leaves an UP-only view
|
|
10530
10527
|
learning_phase = True
|
|
10531
10528
|
# same as after a command: the list changed, repaint at once
|
|
10532
10529
|
if have_data:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: eping
|
|
3
|
-
Version: 4.
|
|
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 4.
|
|
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.
|
|
@@ -192,7 +192,7 @@ 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*) |
|
|
@@ -300,9 +300,11 @@ unless lowered). `CH NO` counts changes; `Z` resets it.
|
|
|
300
300
|
|
|
301
301
|
CLI `U` and web GUI's view select/`U` picker (see *CLI mode*) reach the same 9 views.
|
|
302
302
|
The web GUI's own `U` keyboard shortcut only cycles ALL HOSTS → CURRENTLY-UP →
|
|
303
|
-
UP+FLAPPING → ALL HOSTS (see *Web GUI* keyboard shortcuts). A view
|
|
304
|
-
|
|
305
|
-
|
|
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.
|
|
306
308
|
|
|
307
309
|
`ALWAYS-UP`/`ALWAYS-DOWN`: never changed state this run (`CH NO` = 0). `NO-DNS` counts
|
|
308
310
|
as DOWN for `CURRENTLY-DOWN`/`ALWAYS-DOWN`/`DOWN+FLAPPING`.
|
|
@@ -448,7 +450,7 @@ separated) · `-r` IP range (comma separated, shortened end)
|
|
|
448
450
|
| `-sshkey` | file | agent | private key file for `-ssh` |
|
|
449
451
|
| `-sshhk` | accept-new/ask/off | accept-new | host key check for `-ssh` |
|
|
450
452
|
| `-ncf` | — | off | CSV: do not ping the CSV IP of a name without DNS record |
|
|
451
|
-
| `-up` | — | 0 | learning phase: after N rounds
|
|
453
|
+
| `-up` | — | 0 | learning phase: after N rounds show only hosts seen UP (view CURRENTLY-UP; all hosts are still pinged until SET REFERENCE) |
|
|
452
454
|
| `-setref` | — | off | with `-up`: hosts seen UP become new reference list |
|
|
453
455
|
|
|
454
456
|
Hard-enforced at startup and live via ADV OPTIONS (`-web` only), same bounds.
|
{eping-4.0 → eping-4.1}/LICENSE
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|