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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: eping
3
- Version: 4.0
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.00
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 also limits what's
304
- probed — filtered hosts aren't probed until back to ALL HOSTS. Host list snapshotted at
305
- 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.
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 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) |
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.00
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 also limits what's
285
- probed — filtered hosts aren't probed until back to ALL HOSTS. Host list snapshotted at
286
- 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.
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 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) |
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.00"
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.00'
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. Like before, the filter also shrinks what is pinged,
100
- # which is what makes UP-ONLY shorten the cycle. Hosts filtered away are not probed and
101
- # therefore cannot come back until the view is switched to ALL again.
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
- base_list = filter_hosts(filter_mode, original_hosts_list,
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
- _keep = set(active_hosts_list) # once, not per element (was O(n^2))
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(active_hosts_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
- base_list = filter_hosts(filter_mode, original_hosts_list, host_state,
9342
- tz_offset, flap_window, up_seen)
9343
- active_hosts_list = (apply_prefer_ip(base_list, int(args.dns_ttl)) if prefer_ip
9344
- else apply_prefer_hostname(base_list, int(args.dns_ttl))
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
- base_list = filter_hosts(filter_mode, original_hosts_list, host_state,
10289
- tz_offset, flap_window, up_seen)
10290
- active_hosts_list = (apply_prefer_ip(base_list, int(args.dns_ttl)) if prefer_ip
10291
- else apply_prefer_hostname(base_list, int(args.dns_ttl))
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
- _keep = set(active_hosts_list) # once, not per element (was O(n^2))
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(active_hosts_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.0
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.00
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 also limits what's
304
- probed — filtered hosts aren't probed until back to ALL HOSTS. Host list snapshotted at
305
- 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.
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 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) |
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.
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes