__HOST__ date_local=2026-07-11T07:54:13+00:00 date_utc=2026-07-11T07:54:13+00:00 zonename= timezone=UTC __SAFETY_BASELINE__ audit_readonly=true refresh_executed_by_this_step=false apply_executed_by_this_step=false production_modified_by_this_step=false active_safe_manager_call=false active_legacy_cron_call=false legacy_process= __SLOTS_CONF__ slots_conf_exists=true # schema=router-egress-slots-v1 # fields: # slot_id interface table mark dscp provider repair_adapter health_targets strict_count strict_timeout enabled egress1 vpn1 201 0x201 cs4 hidemyname hmn_pool_replace 1.1.1.1,8.8.8.8 3 2 1 egress2 vpn2 202 0x202 cs5 hidemyname hmn_pool_replace 1.1.1.1,8.8.8.8 3 2 1 egress3 vpn3 203 0x203 cs1 hidemyname hmn_pool_replace 1.1.1.1,8.8.8.8 3 2 1 egress4 vpn4 204 0x204 cs2 hidemyname hmn_pool_replace 1.1.1.1,8.8.8.8 3 2 1 egress5 vpn5 205 0x205 cs3 hidemyname hmn_pool_replace 1.1.1.1,8.8.8.8 3 2 1 __CURRENT_ENDPOINTS__ endpoint.vpn1.current=178.215.227.13:44408 iface.vpn1.exists=true endpoint.vpn2.current=192.121.163.235:42530 iface.vpn2.exists=true endpoint.vpn3.current=95.211.68.119:45176 iface.vpn3.exists=true endpoint.vpn4.current=78.31.250.16:41729 iface.vpn4.exists=true endpoint.vpn5.current=157.173.27.69:41797 iface.vpn5.exists=true table201_has_route=true table202_has_route=true table203_has_route=true table204_has_route=true table205_has_route=true __STRICT_PINGS__ ping.vpn1.1.1.1.1.rc=0 ping.vpn1.1.1.1.1.received=3 ping.vpn1.8.8.8.8.rc=0 ping.vpn1.8.8.8.8.received=3 ping.vpn1.strict_ok=true ping.vpn2.1.1.1.1.rc=0 ping.vpn2.1.1.1.1.received=3 ping.vpn2.8.8.8.8.rc=0 ping.vpn2.8.8.8.8.received=3 ping.vpn2.strict_ok=true ping.vpn3.1.1.1.1.rc=0 ping.vpn3.1.1.1.1.received=3 ping.vpn3.8.8.8.8.rc=0 ping.vpn3.8.8.8.8.received=3 ping.vpn3.strict_ok=true ping.vpn4.1.1.1.1.rc=0 ping.vpn4.1.1.1.1.received=3 ping.vpn4.8.8.8.8.rc=0 ping.vpn4.8.8.8.8.received=3 ping.vpn4.strict_ok=true ping.vpn5.1.1.1.1.rc=0 ping.vpn5.1.1.1.1.received=3 ping.vpn5.8.8.8.8.rc=0 ping.vpn5.8.8.8.8.received=3 ping.vpn5.strict_ok=true __CACHE_SUMMARY__ cache.strict_foreign.path=/root/hmn/cache/ok-awg1-strict-foreign-latest.tsv cache.strict_foreign.exists=true cache.strict_foreign.mtime=2026-07-10T16:59:02+00:00 cache.strict_foreign.size=2829 cache.strict_foreign.endpoints=15 cache.strict_all.path=/root/hmn/cache/ok-awg1-strict-all-latest.tsv cache.strict_all.exists=true cache.strict_all.mtime=2026-07-10T16:59:02+00:00 cache.strict_all.size=3576 cache.strict_all.endpoints=19 cache.working.path=/root/hmn/cache/working-awg1-latest.tsv cache.working.exists=true cache.working.mtime=2026-07-10T16:36:45+00:00 cache.working.size=6294 cache.working.endpoints=35 cache.selected.path=/root/hmn/cache/selected-awg1-latest.tsv cache.selected.exists=true cache.selected.mtime=2026-07-08T06:16:33+00:00 cache.selected.size=375 cache.selected.endpoints=2 cache.serverlist.path=/root/hmn/cache/serverlist-latest.json cache.serverlist.exists=true cache.serverlist.mtime=2026-07-10T16:36:01+00:00 cache.serverlist.size=33274 cache.serverlist.endpoints=0 __TSV_SCHEMA_AND_SAMPLE__ ### TSV_FILE=/root/hmn/cache/ok-awg1-strict-foreign-latest.tsv line_count=16 first_line_begin rank file endpoint avg_ms ping_loss config_path first_line_end sample_10_begin rank file endpoint avg_ms ping_loss config_path 1 128-LV-Latvia-Riga-S1-192.121.163.235-awg1.conf 192.121.163.235:42530 39.008 9.9.9.9:0%,1.1.1.1:0% KEYMASK-LV-Latvia-Riga-S1-192.121.163.235-awg1.conf 2 075-NL-Netherlands-Amsterdam-H13-95.211.68.119-awg1.conf 95.211.68.119:45176 44.271 9.9.9.9:0%,1.1.1.1:0% KEYMASK-NL-Netherlands-Amsterdam-H13-95.211.68.119-awg1.conf 3 072-NL-Netherlands-Amsterdam-S8-78.31.250.16-awg1.conf 78.31.250.16:41729 50.697 9.9.9.9:0%,1.1.1.1:0% KEYMASK-NL-Netherlands-Amsterdam-S8-78.31.250.16-awg1.conf 4 150-NL-Netherlands-Amsterdam-R5-178.215.227.13-awg1.conf 178.215.227.13:44408 50.900 9.9.9.9:0%,1.1.1.1:0% KEYMASK-NL-Netherlands-Amsterdam-R5-178.215.227.13-awg1.conf 5 049-DE-Germany-Berlin-S7-157.173.27.69-awg1.conf 157.173.27.69:41797 56.803 9.9.9.9:0%,1.1.1.1:0% KEYMASK-DE-Germany-Berlin-S7-157.173.27.69-awg1.conf 6 149-AT-Austria-Vienna-S3-157.173.25.198-awg1.conf 157.173.25.198:34340 62.423 9.9.9.9:0%,1.1.1.1:0% KEYMASK-AT-Austria-Vienna-S3-157.173.25.198-awg1.conf 7 146-GB-United-Kingdom-London-S1-37.235.54.96-awg1.conf 37.235.54.96:38971 62.926 9.9.9.9:0%,1.1.1.1:0% KEYMASK-GB-United-Kingdom-London-S1-37.235.54.96-awg1.conf 8 153-SI-Slovenia-Ljubljana-S3-192.71.244.202-awg1.conf 192.71.244.202:45735 66.349 9.9.9.9:0%,1.1.1.1:0% KEYMASK-SI-Slovenia-Ljubljana-S3-192.71.244.202-awg1.conf 9 180-AT-Austria-Graz-S1-151.236.30.139-awg1.conf 151.236.30.139:33998 67.482 9.9.9.9:0%,1.1.1.1:0% KEYMASK-AT-Austria-Graz-S1-151.236.30.139-awg1.conf sample_10_end grep_latency_words_begin 1:rank file endpoint avg_ms ping_loss config_path 2:1 128-LV-Latvia-Riga-S1-192.121.163.235-awg1.conf 192.121.163.235:42530 39.008 9.9.9.9:0%,1.1.1.1:0% KEYMASK-LV-Latvia-Riga-S1-192.121.163.235-awg1.conf 3:2 075-NL-Netherlands-Amsterdam-H13-95.211.68.119-awg1.conf 95.211.68.119:45176 44.271 9.9.9.9:0%,1.1.1.1:0% KEYMASK-NL-Netherlands-Amsterdam-H13-95.211.68.119-awg1.conf 4:3 072-NL-Netherlands-Amsterdam-S8-78.31.250.16-awg1.conf 78.31.250.16:41729 50.697 9.9.9.9:0%,1.1.1.1:0% KEYMASK-NL-Netherlands-Amsterdam-S8-78.31.250.16-awg1.conf 5:4 150-NL-Netherlands-Amsterdam-R5-178.215.227.13-awg1.conf 178.215.227.13:44408 50.900 9.9.9.9:0%,1.1.1.1:0% KEYMASK-NL-Netherlands-Amsterdam-R5-178.215.227.13-awg1.conf 6:5 049-DE-Germany-Berlin-S7-157.173.27.69-awg1.conf 157.173.27.69:41797 56.803 9.9.9.9:0%,1.1.1.1:0% KEYMASK-DE-Germany-Berlin-S7-157.173.27.69-awg1.conf 7:6 149-AT-Austria-Vienna-S3-157.173.25.198-awg1.conf 157.173.25.198:34340 62.423 9.9.9.9:0%,1.1.1.1:0% KEYMASK-AT-Austria-Vienna-S3-157.173.25.198-awg1.conf 8:7 146-GB-United-Kingdom-London-S1-37.235.54.96-awg1.conf 37.235.54.96:38971 62.926 9.9.9.9:0%,1.1.1.1:0% KEYMASK-GB-United-Kingdom-London-S1-37.235.54.96-awg1.conf 9:8 153-SI-Slovenia-Ljubljana-S3-192.71.244.202-awg1.conf 192.71.244.202:45735 66.349 9.9.9.9:0%,1.1.1.1:0% KEYMASK-SI-Slovenia-Ljubljana-S3-192.71.244.202-awg1.conf 10:9 180-AT-Austria-Graz-S1-151.236.30.139-awg1.conf 151.236.30.139:33998 67.482 9.9.9.9:0%,1.1.1.1:0% KEYMASK-AT-Austria-Graz-S1-151.236.30.139-awg1.conf 11:10 073-TR-Turkey-Istanbul-S3-84.32.230.159-awg1.conf 84.32.230.159:43808 72.088 9.9.9.9:0%,1.1.1.1:0% KEYMASK-TR-Turkey-Istanbul-S3-84.32.230.159-awg1.conf 12:11 108-HU-Hungary-Budapest-S6-89.46.237.14-awg1.conf 89.46.237.14:38594 77.023 9.9.9.9:0%,1.1.1.1:0% KEYMASK-HU-Hungary-Budapest-S6-89.46.237.14-awg1.conf 13:12 218-KZ-Kazakhstan-Almaty-M2-77.67.8.84-awg1.conf 77.67.8.84:43378 163.880 9.9.9.9:0%,1.1.1.1:0% KEYMASK-KZ-Kazakhstan-Almaty-M2-77.67.8.84-awg1.conf 14:13 225-IL-Israel-Tel-Aviv-S5-192.71.27.64-awg1.conf 192.71.27.64:40044 164.930 9.9.9.9:0%,1.1.1.1:0% KEYMASK-IL-Israel-Tel-Aviv-S5-192.71.27.64-awg1.conf 15:14 162-KZ-Kazakhstan-Karaganda-S1-109.248.198.4-awg1.conf 109.248.198.4:37129 202.323 9.9.9.9:0%,1.1.1.1:0% KEYMASK-KZ-Kazakhstan-Karaganda-S1-109.248.198.4-awg1.conf 16:15 062-BE-Belgium-Oostkamp-S7-194.71.227.212-awg1.conf 194.71.227.212:32583 216.974 9.9.9.9:0%,1.1.1.1:0% KEYMASK-BE-Belgium-Oostkamp-S7-194.71.227.212-awg1.conf grep_latency_words_end ### TSV_FILE=/root/hmn/cache/ok-awg1-strict-all-latest.tsv line_count=20 first_line_begin rank file endpoint avg_ms ping_loss config_path first_line_end sample_10_begin rank file endpoint avg_ms ping_loss config_path 1 128-LV-Latvia-Riga-S1-192.121.163.235-awg1.conf 192.121.163.235:42530 39.008 9.9.9.9:0%,1.1.1.1:0% KEYMASK-LV-Latvia-Riga-S1-192.121.163.235-awg1.conf 2 075-NL-Netherlands-Amsterdam-H13-95.211.68.119-awg1.conf 95.211.68.119:45176 44.271 9.9.9.9:0%,1.1.1.1:0% KEYMASK-NL-Netherlands-Amsterdam-H13-95.211.68.119-awg1.conf 3 072-NL-Netherlands-Amsterdam-S8-78.31.250.16-awg1.conf 78.31.250.16:41729 50.697 9.9.9.9:0%,1.1.1.1:0% KEYMASK-NL-Netherlands-Amsterdam-S8-78.31.250.16-awg1.conf 4 150-NL-Netherlands-Amsterdam-R5-178.215.227.13-awg1.conf 178.215.227.13:44408 50.900 9.9.9.9:0%,1.1.1.1:0% KEYMASK-NL-Netherlands-Amsterdam-R5-178.215.227.13-awg1.conf 5 049-DE-Germany-Berlin-S7-157.173.27.69-awg1.conf 157.173.27.69:41797 56.803 9.9.9.9:0%,1.1.1.1:0% KEYMASK-DE-Germany-Berlin-S7-157.173.27.69-awg1.conf 6 149-AT-Austria-Vienna-S3-157.173.25.198-awg1.conf 157.173.25.198:34340 62.423 9.9.9.9:0%,1.1.1.1:0% KEYMASK-AT-Austria-Vienna-S3-157.173.25.198-awg1.conf 7 146-GB-United-Kingdom-London-S1-37.235.54.96-awg1.conf 37.235.54.96:38971 62.926 9.9.9.9:0%,1.1.1.1:0% KEYMASK-GB-United-Kingdom-London-S1-37.235.54.96-awg1.conf 8 153-SI-Slovenia-Ljubljana-S3-192.71.244.202-awg1.conf 192.71.244.202:45735 66.349 9.9.9.9:0%,1.1.1.1:0% KEYMASK-SI-Slovenia-Ljubljana-S3-192.71.244.202-awg1.conf 9 180-AT-Austria-Graz-S1-151.236.30.139-awg1.conf 151.236.30.139:33998 67.482 9.9.9.9:0%,1.1.1.1:0% KEYMASK-AT-Austria-Graz-S1-151.236.30.139-awg1.conf sample_10_end grep_latency_words_begin 1:rank file endpoint avg_ms ping_loss config_path 2:1 128-LV-Latvia-Riga-S1-192.121.163.235-awg1.conf 192.121.163.235:42530 39.008 9.9.9.9:0%,1.1.1.1:0% KEYMASK-LV-Latvia-Riga-S1-192.121.163.235-awg1.conf 3:2 075-NL-Netherlands-Amsterdam-H13-95.211.68.119-awg1.conf 95.211.68.119:45176 44.271 9.9.9.9:0%,1.1.1.1:0% KEYMASK-NL-Netherlands-Amsterdam-H13-95.211.68.119-awg1.conf 4:3 072-NL-Netherlands-Amsterdam-S8-78.31.250.16-awg1.conf 78.31.250.16:41729 50.697 9.9.9.9:0%,1.1.1.1:0% KEYMASK-NL-Netherlands-Amsterdam-S8-78.31.250.16-awg1.conf 5:4 150-NL-Netherlands-Amsterdam-R5-178.215.227.13-awg1.conf 178.215.227.13:44408 50.900 9.9.9.9:0%,1.1.1.1:0% KEYMASK-NL-Netherlands-Amsterdam-R5-178.215.227.13-awg1.conf 6:5 049-DE-Germany-Berlin-S7-157.173.27.69-awg1.conf 157.173.27.69:41797 56.803 9.9.9.9:0%,1.1.1.1:0% KEYMASK-DE-Germany-Berlin-S7-157.173.27.69-awg1.conf 7:6 149-AT-Austria-Vienna-S3-157.173.25.198-awg1.conf 157.173.25.198:34340 62.423 9.9.9.9:0%,1.1.1.1:0% KEYMASK-AT-Austria-Vienna-S3-157.173.25.198-awg1.conf 8:7 146-GB-United-Kingdom-London-S1-37.235.54.96-awg1.conf 37.235.54.96:38971 62.926 9.9.9.9:0%,1.1.1.1:0% KEYMASK-GB-United-Kingdom-London-S1-37.235.54.96-awg1.conf 9:8 153-SI-Slovenia-Ljubljana-S3-192.71.244.202-awg1.conf 192.71.244.202:45735 66.349 9.9.9.9:0%,1.1.1.1:0% KEYMASK-SI-Slovenia-Ljubljana-S3-192.71.244.202-awg1.conf 10:9 180-AT-Austria-Graz-S1-151.236.30.139-awg1.conf 151.236.30.139:33998 67.482 9.9.9.9:0%,1.1.1.1:0% KEYMASK-AT-Austria-Graz-S1-151.236.30.139-awg1.conf 11:10 073-TR-Turkey-Istanbul-S3-84.32.230.159-awg1.conf 84.32.230.159:43808 72.088 9.9.9.9:0%,1.1.1.1:0% KEYMASK-TR-Turkey-Istanbul-S3-84.32.230.159-awg1.conf 12:11 108-HU-Hungary-Budapest-S6-89.46.237.14-awg1.conf 89.46.237.14:38594 77.023 9.9.9.9:0%,1.1.1.1:0% KEYMASK-HU-Hungary-Budapest-S6-89.46.237.14-awg1.conf 13:12 117-US-USA-New-York-City-S3-64.253.89.235-awg1.conf 64.253.89.235:37402 124.618 9.9.9.9:0%,1.1.1.1:0% KEYMASK-US-USA-New-York-City-S3-64.253.89.235-awg1.conf 14:13 218-KZ-Kazakhstan-Almaty-M2-77.67.8.84-awg1.conf 77.67.8.84:43378 163.880 9.9.9.9:0%,1.1.1.1:0% KEYMASK-KZ-Kazakhstan-Almaty-M2-77.67.8.84-awg1.conf 15:14 225-IL-Israel-Tel-Aviv-S5-192.71.27.64-awg1.conf 192.71.27.64:40044 164.930 9.9.9.9:0%,1.1.1.1:0% KEYMASK-IL-Israel-Tel-Aviv-S5-192.71.27.64-awg1.conf 16:15 147-US-USA-Salt-Lake-City-S2-23.158.72.87-awg1.conf 23.158.72.87:45460 185.245 9.9.9.9:0%,1.1.1.1:0% KEYMASK-US-USA-Salt-Lake-City-S2-23.158.72.87-awg1.conf 17:16 206-HK-Hong-Kong-Central-District-S2-112.120.98.53-awg1.conf 112.120.98.53:46369 199.625 9.9.9.9:0%,1.1.1.1:0% KEYMASK-HK-Hong-Kong-Central-District-S2-112.120.98.53-awg1.conf 18:17 162-KZ-Kazakhstan-Karaganda-S1-109.248.198.4-awg1.conf 109.248.198.4:37129 202.323 9.9.9.9:0%,1.1.1.1:0% KEYMASK-KZ-Kazakhstan-Karaganda-S1-109.248.198.4-awg1.conf 19:18 062-BE-Belgium-Oostkamp-S7-194.71.227.212-awg1.conf 194.71.227.212:32583 216.974 9.9.9.9:0%,1.1.1.1:0% KEYMASK-BE-Belgium-Oostkamp-S7-194.71.227.212-awg1.conf 20:19 063-CL-Chile-Santiago-38.7.197.83-awg1.conf 38.7.197.83:38465 252.528 9.9.9.9:0%,1.1.1.1:0% KEYMASK-CL-Chile-Santiago-38.7.197.83-awg1.conf grep_latency_words_end ### TSV_FILE=/root/hmn/cache/working-awg1-latest.tsv line_count=36 first_line_begin id country name wg_ip wg_port endpoint endpoint_match address config_file first_line_end sample_10_begin id country name wg_ip wg_port endpoint endpoint_match address config_file 12 DK Denmark, Copenhagen S4 192.36.27.17 35500 192.36.27.17:35500 yes 10.119.249.139/32 KEYMASK-163600/012-DK-Denmark-Copenhagen-S4-192.36.27.17-awg1.conf 29 UA Ukraine, Kyiv S3 38.244.192.244 45389 38.244.192.244:45389 yes 10.112.60.219/32 KEYMASK-163600/029-UA-Ukraine-Kyiv-S3-38.244.192.244-awg1.conf 49 DE Germany, Berlin S7 157.173.27.69 41797 157.173.27.69:41797 yes 10.97.187.205/32 KEYMASK-163600/049-DE-Germany-Berlin-S7-157.173.27.69-awg1.conf 53 FI Finland, Helsinki S4 192.71.247.18 35999 192.71.247.18:35999 yes 10.98.185.144/32 KEYMASK-163600/053-FI-Finland-Helsinki-S4-192.71.247.18-awg1.conf 62 BE Belgium, Oostkamp S7 194.71.227.212 32583 194.71.227.212:32583 yes 10.100.254.15/32 KEYMASK-163600/062-BE-Belgium-Oostkamp-S7-194.71.227.212-awg1.conf 63 CL Chile, Santiago 38.7.197.83 38465 38.7.197.83:38465 yes 10.101.61.41/32 KEYMASK-163600/063-CL-Chile-Santiago-38.7.197.83-awg1.conf 70 CZ Czech Republic, Prague S1 193.235.207.39 38330 193.235.207.39:38330 yes 10.102.248.214/32 KEYMASK-163600/070-CZ-Czech-Republic-Prague-S1-193.235.207.39-awg1.conf 71 US USA, Los Angeles S2 107.172.187.100 39480 107.172.187.100:39480 yes 10.103.56.214/32 KEYMASK-163600/071-US-USA-Los-Angeles-S2-107.172.187.100-awg1.conf 72 NL Netherlands, Amsterdam S8 78.31.250.16 41729 78.31.250.16:41729 yes 10.103.120.171/32 KEYMASK-163600/072-NL-Netherlands-Amsterdam-S8-78.31.250.16-awg1.conf sample_10_end grep_latency_words_begin 1:id country name wg_ip wg_port endpoint endpoint_match address config_file 10:72 NL Netherlands, Amsterdam S8 78.31.250.16 41729 78.31.250.16:41729 yes 10.103.120.171/32 KEYMASK-163600/072-NL-Netherlands-Amsterdam-S8-78.31.250.16-awg1.conf 12:75 NL Netherlands, Amsterdam H13 95.211.68.119 45176 95.211.68.119:45176 yes 10.104.58.109/32 KEYMASK-163600/075-NL-Netherlands-Amsterdam-H13-95.211.68.119-awg1.conf 20:117 US USA, New York City S3 64.253.89.235 37402 64.253.89.235:37402 yes 10.83.172.142/32 KEYMASK-163600/117-US-USA-New-York-City-S3-64.253.89.235-awg1.conf 22:128 LV Latvia, Riga S1 192.121.163.235 42530 192.121.163.235:42530 yes 10.86.108.200/32 KEYMASK-163600/128-LV-Latvia-Riga-S1-192.121.163.235-awg1.conf 27:147 US USA, Salt Lake City S2 23.158.72.87 45460 23.158.72.87:45460 yes 10.91.43.12/32 KEYMASK-163600/147-US-USA-Salt-Lake-City-S2-23.158.72.87-awg1.conf 29:150 NL Netherlands, Amsterdam R5 178.215.227.13 44408 178.215.227.13:44408 yes 10.91.233.132/32 KEYMASK-163600/150-NL-Netherlands-Amsterdam-R5-178.215.227.13-awg1.conf grep_latency_words_end ### TSV_FILE=/root/hmn/cache/selected-awg1-latest.tsv line_count=3 first_line_begin slot file endpoint avg_ms config_path first_line_end sample_10_begin slot file endpoint avg_ms config_path vpn2 128-LV-Latvia-Riga-S1-192.121.163.235-awg1.conf 192.121.163.235:42530 38.879 KEYMASK-LV-Latvia-Riga-S1-192.121.163.235-awg1.conf vpn1 150-NL-Netherlands-Amsterdam-R5-178.215.227.13-awg1.conf 178.215.227.13:44408 53.234 KEYMASK-NL-Netherlands-Amsterdam-R5-178.215.227.13-awg1.conf sample_10_end grep_latency_words_begin 1:slot file endpoint avg_ms config_path 2:vpn2 128-LV-Latvia-Riga-S1-192.121.163.235-awg1.conf 192.121.163.235:42530 38.879 KEYMASK-LV-Latvia-Riga-S1-192.121.163.235-awg1.conf 3:vpn1 150-NL-Netherlands-Amsterdam-R5-178.215.227.13-awg1.conf 178.215.227.13:44408 53.234 KEYMASK-NL-Netherlands-Amsterdam-R5-178.215.227.13-awg1.conf grep_latency_words_end __PY_PARSE_CANDIDATE_RANKING_GUESS__ __REFRESH_SAFE_WRAPPER_RELEVANT__ safe_exists=true safe_executable=true safe_syntax_begin safe_syntax_rc=0 safe_syntax_end __HEALTH_MONITOR_CONTRACT__ health_conf_exists=true health_script_exists=true health_script_executable=true health_service_enabled=true health_service_running=true health_conf_begin MODE=--dry-run INTERVAL=60 SLOTS_CONF=/etc/router-egress-slots.d/slots.conf STATE_DIR=/var/lib/router-egress-slot-health STATE_JSONL=/var/lib/router-egress-slot-health/status.jsonl STATUS_KV=/var/lib/router-egress-slot-health/status.kv LAST_JSON=/var/lib/router-egress-slot-health/last.json LOG=/var/log/router-egress-slot-health.log health_conf_end health_script_hooks_begin 5:MON_CONF="${ROUTER_EGRESS_SLOT_HEALTH_CONF:-/etc/router-egress-slot-health.conf}" 8:SLOTS_CONF="${SLOTS_CONF:-/etc/router-egress-slots.d/slots.conf}" 9:STATE_DIR="${STATE_DIR:-/var/lib/router-egress-slot-health}" 10:STATE_JSONL="${STATE_JSONL:-${STATE_DIR}/status.jsonl}" 11:STATUS_KV="${STATUS_KV:-${STATE_DIR}/status.kv}" 12:LAST_JSON="${LAST_JSON:-${STATE_DIR}/last.json}" 13:LOG="${LOG:-/var/log/router-egress-slot-health.log}" 15:mkdir -p "$STATE_DIR" "$(dirname "$LOG")" 2>/dev/null || true 20:tmp="/tmp/router-egress-slot-health.$$" 21:tmpjson="/tmp/router-egress-slot-health.$$.json" 22:trap 'rm -f "$tmp" "$tmpjson"' EXIT 25:json_escape() { 29:if [ ! -f "$SLOTS_CONF" ]; then 30: echo "slots_conf_missing=$SLOTS_CONF" >&2 39:overall_ok=true 41:grep -Ev '^[[:space:]]*(#|$)' "$SLOTS_CONF" | while read -r slot_id iface table mark dscp provider repair_adapter health_targets strict_count strict_timeout enabled rest; do 42: [ -n "$slot_id" ] || continue 51: status="good" 52: fail_reasons="" 62: status="bad" 63: fail_reasons="${fail_reasons}missing_interface;" 69: status="bad" 70: fail_reasons="${fail_reasons}route_table_${table}_missing_dev_${iface};" 85: out="/tmp/router-egress-slot-health-${slot_id}-${target//./_}.$$" 86: err="/tmp/router-egress-slot-health-${slot_id}-${target//./_}.$$.err" 87: ping -I "$iface" -c "$strict_count" -W "$strict_timeout" "$target" > "$out" 2> "$err" 97: status="bad" 98: fail_reasons="${fail_reasons}${target}:rc=${rc}:recv=${recv}_expected_${strict_count};" 105: if [ "$status" = "good" ]; then 109: overall_ok=false 113: "$slot_id" "$iface" "$table" "$mark" "$dscp" "$provider" "$repair_adapter" "$health_targets" \ 114: "$strict_count" "$strict_timeout" "$iface_exists" "$operstate" "$route_ok" "$status" "$target_results" "$fail_reasons" >> "$tmp" 122:[ "$bad_count" = "0" ] && overall_ok=true || overall_ok=false 126: echo ' "schema": "router-egress-slot-health-v1",' 127: echo " \"mode\": \"$(json_escape "$MODE")\"," 129: echo " \"iso\": \"$(json_escape "$iso")\"," 130: echo " \"slots_conf\": \"$(json_escape "$SLOTS_CONF")\"," 131: echo " \"overall_ok\": $overall_ok," 136: echo ' "slots": [' 139: while IFS="$(printf '\t')" read -r slot_id iface table mark dscp provider repair_adapter health_targets strict_count strict_timeout iface_exists operstate route_ok status target_results fail_reasons; do 142: printf ' {"slot_id":"%s","interface":"%s","table":"%s","mark":"%s","dscp":"%s","provider":"%s","repair_adapter":"%s","health_targets":"%s","strict_count":%s,"strict_timeout":%s,"iface_exists":%s,"operstate":"%s","route_ok":%s,"status":"%s","target_results":"%s","fail_reasons":"%s"}' \ 143: "$(json_escape "$slot_id")" "$(json_escape "$iface")" "$(json_escape "$table")" "$(json_escape "$mark")" \ 144: "$(json_escape "$dscp")" "$(json_escape "$provider")" "$(json_escape "$repair_adapter")" "$(json_escape "$health_targets")" \ 145: "$strict_count" "$strict_timeout" "$iface_exists" "$(json_escape "$operstate")" "$route_ok" "$(json_escape "$status")" \ 146: "$(json_escape "$target_results")" "$(json_escape "$fail_reasons")" 153: echo ' "repair_layer": "separate_provider_adapter",' 155: echo ' "apply_reason": "dry_run_status_only"' 158:} > "$tmpjson" 160:cat "$tmpjson" 161:cat "$tmpjson" >> "$STATE_JSONL" 162:cp "$tmpjson" "$LAST_JSON" 165: echo "schema=router-egress-slot-health-v1" 169: echo "slots_conf=$SLOTS_CONF" 170: echo "overall_ok=$overall_ok" 175: while IFS="$(printf '\t')" read -r slot_id iface table mark dscp provider repair_adapter health_targets strict_count strict_timeout iface_exists operstate route_ok status target_results fail_reasons; do 176: echo "slot.${slot_id}.interface=$iface" 177: echo "slot.${slot_id}.table=$table" 178: echo "slot.${slot_id}.mark=$mark" 179: echo "slot.${slot_id}.dscp=$dscp" 180: echo "slot.${slot_id}.provider=$provider" 181: echo "slot.${slot_id}.repair_adapter=$repair_adapter" 182: echo "slot.${slot_id}.iface_exists=$iface_exists" 183: echo "slot.${slot_id}.route_ok=$route_ok" 184: echo "slot.${slot_id}.status=$status" 185: echo "slot.${slot_id}.target_results=$target_results" 186: echo "slot.${slot_id}.fail_reasons=$fail_reasons" 188:} > "$STATUS_KV" 190:echo "router-egress-slot-health ts=$iso mode=$MODE overall_ok=$overall_ok good=$good_count bad=$bad_count enabled=$enabled_count apply_performed=false" >> "$LOG" health_script_hooks_end health_status_kv_begin schema=router-egress-slot-health-v1 epoch=1783756415 iso=2026-07-11T07:53:35+00:00 mode=--dry-run slots_conf=/etc/router-egress-slots.d/slots.conf overall_ok=true enabled_count=5 good_count=5 bad_count=0 missing_count=0 slot.egress1.interface=vpn1 slot.egress1.table=201 slot.egress1.mark=0x201 slot.egress1.dscp=cs4 slot.egress1.provider=hidemyname slot.egress1.repair_adapter=hmn_pool_replace slot.egress1.iface_exists=true slot.egress1.route_ok=true slot.egress1.status=good slot.egress1.target_results=1.1.1.1,rc=0,recv=3,avg=53.509|8.8.8.8,rc=0,recv=3,avg=49.975| slot.egress1.fail_reasons= slot.egress2.interface=vpn2 slot.egress2.table=202 slot.egress2.mark=0x202 slot.egress2.dscp=cs5 slot.egress2.provider=hidemyname slot.egress2.repair_adapter=hmn_pool_replace slot.egress2.iface_exists=true slot.egress2.route_ok=true slot.egress2.status=good slot.egress2.target_results=1.1.1.1,rc=0,recv=3,avg=39.397|8.8.8.8,rc=0,recv=3,avg=39.355| slot.egress2.fail_reasons= slot.egress3.interface=vpn3 slot.egress3.table=203 slot.egress3.mark=0x203 slot.egress3.dscp=cs1 slot.egress3.provider=hidemyname slot.egress3.repair_adapter=hmn_pool_replace slot.egress3.iface_exists=true slot.egress3.route_ok=true slot.egress3.status=good slot.egress3.target_results=1.1.1.1,rc=0,recv=3,avg=50.696|8.8.8.8,rc=0,recv=3,avg=44.336| slot.egress3.fail_reasons= slot.egress4.interface=vpn4 slot.egress4.table=204 slot.egress4.mark=0x204 slot.egress4.dscp=cs2 slot.egress4.provider=hidemyname slot.egress4.repair_adapter=hmn_pool_replace slot.egress4.iface_exists=true slot.egress4.route_ok=true slot.egress4.status=good slot.egress4.target_results=1.1.1.1,rc=0,recv=3,avg=46.077|8.8.8.8,rc=0,recv=3,avg=45.903| slot.egress4.fail_reasons= slot.egress5.interface=vpn5 slot.egress5.table=205 slot.egress5.mark=0x205 slot.egress5.dscp=cs3 slot.egress5.provider=hidemyname slot.egress5.repair_adapter=hmn_pool_replace slot.egress5.iface_exists=true slot.egress5.route_ok=true slot.egress5.status=good slot.egress5.target_results=1.1.1.1,rc=0,recv=3,avg=59.004|8.8.8.8,rc=0,recv=3,avg=73.238| slot.egress5.fail_reasons= health_status_kv_end __ADAPTER_DRYRUN_ALL_SLOTS__ adapter_egress1_json_begin 157.173.27.69:41797 178.215.227.13:44408 192.121.163.235:42530 78.31.250.16:41729 95.211.68.119:45176 { "schema": "router-egress-recovery-hmn-pool-replace-v2", "mode": "--dry-run", "epoch": 1783756473, "iso": "2026-07-11T07:54:33+00:00", "slot": "egress1", "interface": "vpn1", "table": "201", "mark": "0x201", "dscp": "cs4", "provider": "hidemyname", "adapter": "hmn_pool_replace", "current_endpoint": "178.215.227.13:44408", "selected_pool": "/root/hmn/cache/ok-awg1-strict-foreign-latest.tsv", "selected_pool_age_sec": 53731, "max_pool_age_sec": 129600, "selected_pool_endpoint_count": 15, "pool_is_fresh": true, "unused_candidate_count": 10, "candidate_endpoint": "109.248.198.4:37129", "decision": "dry_run_ok", "reason": "dry_run_candidate_selected", "apply_performed": false, "apply_rc": 0, "post_strict_ok": false, "rollback_file": "", "safety": { "requires_explicit_commit": true, "dry_run_no_ifup_ifdown": true, "dry_run_no_uci_set": true, "dry_run_no_wg_set": true, "dry_run_no_route_change": true, "no_vm100_change": true } } adapter_egress1_json_end adapter_egress2_json_begin 157.173.27.69:41797 178.215.227.13:44408 192.121.163.235:42530 78.31.250.16:41729 95.211.68.119:45176 { "schema": "router-egress-recovery-hmn-pool-replace-v2", "mode": "--dry-run", "epoch": 1783756473, "iso": "2026-07-11T07:54:33+00:00", "slot": "egress2", "interface": "vpn2", "table": "202", "mark": "0x202", "dscp": "cs5", "provider": "hidemyname", "adapter": "hmn_pool_replace", "current_endpoint": "192.121.163.235:42530", "selected_pool": "/root/hmn/cache/ok-awg1-strict-foreign-latest.tsv", "selected_pool_age_sec": 53731, "max_pool_age_sec": 129600, "selected_pool_endpoint_count": 15, "pool_is_fresh": true, "unused_candidate_count": 10, "candidate_endpoint": "109.248.198.4:37129", "decision": "dry_run_ok", "reason": "dry_run_candidate_selected", "apply_performed": false, "apply_rc": 0, "post_strict_ok": false, "rollback_file": "", "safety": { "requires_explicit_commit": true, "dry_run_no_ifup_ifdown": true, "dry_run_no_uci_set": true, "dry_run_no_wg_set": true, "dry_run_no_route_change": true, "no_vm100_change": true } } adapter_egress2_json_end adapter_egress3_json_begin 157.173.27.69:41797 178.215.227.13:44408 192.121.163.235:42530 78.31.250.16:41729 95.211.68.119:45176 { "schema": "router-egress-recovery-hmn-pool-replace-v2", "mode": "--dry-run", "epoch": 1783756473, "iso": "2026-07-11T07:54:33+00:00", "slot": "egress3", "interface": "vpn3", "table": "203", "mark": "0x203", "dscp": "cs1", "provider": "hidemyname", "adapter": "hmn_pool_replace", "current_endpoint": "95.211.68.119:45176", "selected_pool": "/root/hmn/cache/ok-awg1-strict-foreign-latest.tsv", "selected_pool_age_sec": 53731, "max_pool_age_sec": 129600, "selected_pool_endpoint_count": 15, "pool_is_fresh": true, "unused_candidate_count": 10, "candidate_endpoint": "109.248.198.4:37129", "decision": "dry_run_ok", "reason": "dry_run_candidate_selected", "apply_performed": false, "apply_rc": 0, "post_strict_ok": false, "rollback_file": "", "safety": { "requires_explicit_commit": true, "dry_run_no_ifup_ifdown": true, "dry_run_no_uci_set": true, "dry_run_no_wg_set": true, "dry_run_no_route_change": true, "no_vm100_change": true } } adapter_egress3_json_end adapter_egress4_json_begin 157.173.27.69:41797 178.215.227.13:44408 192.121.163.235:42530 78.31.250.16:41729 95.211.68.119:45176 { "schema": "router-egress-recovery-hmn-pool-replace-v2", "mode": "--dry-run", "epoch": 1783756473, "iso": "2026-07-11T07:54:33+00:00", "slot": "egress4", "interface": "vpn4", "table": "204", "mark": "0x204", "dscp": "cs2", "provider": "hidemyname", "adapter": "hmn_pool_replace", "current_endpoint": "78.31.250.16:41729", "selected_pool": "/root/hmn/cache/ok-awg1-strict-foreign-latest.tsv", "selected_pool_age_sec": 53731, "max_pool_age_sec": 129600, "selected_pool_endpoint_count": 15, "pool_is_fresh": true, "unused_candidate_count": 10, "candidate_endpoint": "109.248.198.4:37129", "decision": "dry_run_ok", "reason": "dry_run_candidate_selected", "apply_performed": false, "apply_rc": 0, "post_strict_ok": false, "rollback_file": "", "safety": { "requires_explicit_commit": true, "dry_run_no_ifup_ifdown": true, "dry_run_no_uci_set": true, "dry_run_no_wg_set": true, "dry_run_no_route_change": true, "no_vm100_change": true } } adapter_egress4_json_end adapter_egress5_json_begin 157.173.27.69:41797 178.215.227.13:44408 192.121.163.235:42530 78.31.250.16:41729 95.211.68.119:45176 { "schema": "router-egress-recovery-hmn-pool-replace-v2", "mode": "--dry-run", "epoch": 1783756473, "iso": "2026-07-11T07:54:33+00:00", "slot": "egress5", "interface": "vpn5", "table": "205", "mark": "0x205", "dscp": "cs3", "provider": "hidemyname", "adapter": "hmn_pool_replace", "current_endpoint": "157.173.27.69:41797", "selected_pool": "/root/hmn/cache/ok-awg1-strict-foreign-latest.tsv", "selected_pool_age_sec": 53731, "max_pool_age_sec": 129600, "selected_pool_endpoint_count": 15, "pool_is_fresh": true, "unused_candidate_count": 10, "candidate_endpoint": "109.248.198.4:37129", "decision": "dry_run_ok", "reason": "dry_run_candidate_selected", "apply_performed": false, "apply_rc": 0, "post_strict_ok": false, "rollback_file": "", "safety": { "requires_explicit_commit": true, "dry_run_no_ifup_ifdown": true, "dry_run_no_uci_set": true, "dry_run_no_wg_set": true, "dry_run_no_route_change": true, "no_vm100_change": true } } adapter_egress5_json_end __PROPOSED_SIMULATION_SAFETY_INPUTS__ candidate_sim_slot=egress2 simulation_should_not_start_yet=true simulation_method_candidate=temporarily_set_bad_endpoint_for_one_slot_then_require_dispatcher_to_replace simulation_requires_pre_snapshot=true simulation_requires_auto_rollback=true __SUMMARY_KV__ contract_audit_collected=true daily_rebalance_installed=false health_repair_installed=false failure_simulated=false