From 1ef9e00a0539bdc7dec84db5626942f9bb03c819 Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Thu, 4 Jun 2026 16:33:12 -0500 Subject: [PATCH] update robots.txt --- lib/aprsme/is/is.ex | 56 ++++++++++++++++++++++++++++++++++++------ priv/static/robots.txt | 29 ++++++++++++++++++++++ 2 files changed, 78 insertions(+), 7 deletions(-) diff --git a/lib/aprsme/is/is.ex b/lib/aprsme/is/is.ex index 7f371c5..eddc3e1 100644 --- a/lib/aprsme/is/is.ex +++ b/lib/aprsme/is/is.ex @@ -10,6 +10,8 @@ defmodule Aprsme.Is do @aprs_timeout 60 * 1000 @keepalive_interval 20 * 1000 @backpressure_safety_valve_timeout 30_000 + @fallback_server "noam.aprs2.net" + @fallback_timeout_seconds 300 defstruct [ :server, @@ -21,12 +23,13 @@ defmodule Aprsme.Is do :packet_stats, :login_params, :safety_valve_timer, + :failure_started_at, buffer: "", backpressure_active: false ] @type t :: %__MODULE__{ - server: charlist() | String.t(), + server: String.t(), port: pos_integer(), socket: :ssl.sslsocket() | nil, timer: reference() | nil, @@ -36,7 +39,8 @@ defmodule Aprsme.Is do buffer: String.t(), login_params: LoginParams.t(), backpressure_active: boolean(), - safety_valve_timer: reference() | nil + safety_valve_timer: reference() | nil, + failure_started_at: DateTime.t() | nil } def start_link(opts \\ []) do @@ -69,7 +73,19 @@ defmodule Aprsme.Is do Process.sleep(Application.get_env(:aprsme, :is_init_delay_ms, 2_000)) # Get startup parameters - server = Application.get_env(:aprsme, :aprs_is_server, ~c"dallas.aprs2.net") + server_raw = Application.get_env(:aprsme, :aprs_is_server, ~c"dallas.aprs2.net") + server = if is_list(server_raw), do: List.to_string(server_raw), else: server_raw + + # If we fell back to the fallback server in a previous failure streak and + # the GenServer restarted (e.g. due to timeout), persist the fallback choice. + server = + if Application.get_env(:aprsme, :aprs_is_using_fallback, false) do + Logger.warning("APRS-IS fallback active from previous failure, connecting to #{@fallback_server}") + @fallback_server + else + server + end + port = Application.get_env(:aprsme, :aprs_is_port, 14_580) default_filter = Application.get_env(:aprsme, :aprs_is_default_filter, "r/33/-96/100") aprs_user_id = Application.get_env(:aprsme, :aprs_is_login_id, "W5ISP") @@ -91,7 +107,8 @@ defmodule Aprsme.Is do user_id: aprs_user_id, passcode: aprs_passcode, filter: default_filter - } + }, + failure_started_at: nil } # Try to connect initially, but don't fail if it doesn't work @@ -101,19 +118,19 @@ defmodule Aprsme.Is do :ok -> timer = create_timer(@aprs_timeout) keepalive_timer = create_keepalive_timer(@keepalive_interval) - {:ok, %{state | socket: socket, timer: timer, keepalive_timer: keepalive_timer}} + {:ok, reset_failure(%{state | socket: socket, timer: timer, keepalive_timer: keepalive_timer})} error -> Logger.warning("Failed to login to APRS-IS: #{inspect(error)}, will retry") :gen_tcp.close(socket) schedule_reconnect(5000) - {:ok, state} + {:ok, track_failure(state)} end error -> Logger.warning("Unable to establish initial connection to APRS-IS: #{inspect(error)}, will retry") schedule_reconnect(5000) - {:ok, state} + {:ok, track_failure(state)} end end @@ -648,4 +665,29 @@ defmodule Aprsme.Is do defp schedule_reconnect(delay) do Process.send_after(self(), :reconnect, delay) end + + # Track a connection failure. If we've been failing continuously for + # @fallback_timeout_seconds, switch to the fallback server until next restart. + defp track_failure(state) do + now = DateTime.utc_now() + failure_started_at = state.failure_started_at || now + + if DateTime.diff(now, failure_started_at) >= @fallback_timeout_seconds and + not Application.get_env(:aprsme, :aprs_is_using_fallback, false) do + Logger.warning( + "Failed to connect to APRS-IS for #{@fallback_timeout_seconds}s, " <> + "falling back to #{@fallback_server}" + ) + + Application.put_env(:aprsme, :aprs_is_using_fallback, true) + %{state | failure_started_at: failure_started_at, server: @fallback_server} + else + %{state | failure_started_at: failure_started_at} + end + end + + # Reset the failure tracking on a successful connection. + defp reset_failure(state) do + %{state | failure_started_at: nil} + end end diff --git a/priv/static/robots.txt b/priv/static/robots.txt index 453cf89..a92d101 100644 --- a/priv/static/robots.txt +++ b/priv/static/robots.txt @@ -3,6 +3,7 @@ # To ban all spiders from the entire site uncomment the next two lines: User-agent: * +Content-Signal: search=yes,ai-train=no Disallow: /info Disallow: /packets Disallow: /api/v1 @@ -10,4 +11,32 @@ Disallow: /api/v1 User-agent: AhrefsBot Disallow: / +User-agent: Amazonbot +Disallow: / + +User-agent: Applebot-Extended +Disallow: / + +User-agent: Bytespider +Disallow: / + +User-agent: CCBot +Disallow: / + +User-agent: ClaudeBot +Disallow: / + +User-agent: CloudflareBrowserRenderingCrawler +Disallow: / + +User-agent: Google-Extended +Disallow: / + +User-agent: GPTBot +Disallow: / + +User-agent: meta-externalagent +Disallow: / + + Sitemap: https://aprs.me/sitemap.xml