lib/prom_ex/grafana_agent/downloader.ex

defmodule PromEx.GrafanaAgent.Downloader do
  @moduledoc """
  This module is responsible for downloading the GrafanaAgent binary.
  """

  use OctoFetch,
    latest_version: "0.23.0",
    github_repo: "grafana/agent",
    download_versions: %{
      "0.29.0" => [
        {:darwin, :amd64, "2b51aab7cfa4daf9b18c857c85dddb9ee9086e7470c3585be661fd6577e15afe"},
        {:darwin, :arm64, "4bf44f44a1e9f4e9c257bea8bcf63549bf4f8f575f8afca94ff0cac371f55ed9"},
        {:linux, :amd64, "aa07cc24de9d607e6388ce85eec76b250f6a4f304ba86ec7e38fc351d9a2739a"},
        {:linux, :arm64, "7d402893564e4054d7e1401d10031b9c2841832a2dab5212184f2b606cd08b0d"},
        {:freebsd, :amd64, "28becd3451ae8d56f4976e87a622da7cd11ce8a02d9bd9f1ee6517785c7fd594"}
      ],
      "0.23.0" => [
        {:darwin, :amd64, "643044b35ed4bdfd9866a43b70e39d64f16709f9685b89a03b299da8834661b0"},
        {:darwin, :arm64, "e94f7fd0e1ef9fb497cff4f1260cc22967d6a5b003dd2c99f494f9e457482dda"},
        {:linux, :amd64, "9c846f8a1f7829f257759d63db6725831d7bfaba36f1689cdb1a12e92bb91b75"},
        {:linux, :arm64, "3b85ce425026302028f7f07d41fa4fc14e9f028ffe7c9067194753cfa719e0d3"},
        {:freebsd, :amd64, "ec067782cc0fcd9c4e951fd6dd0d8013df7f5ed2cd0acb495ab3acfeb6e72b92"}
      ],
      "0.22.0" => [
        {:darwin, :amd64, "1641b70c63fd077a7218b4f7edfca2ef96d103753f6e202611a694306c58ce58"},
        {:darwin, :arm64, "671244ef0f262c71d9194a1db6765a16261d782ebb608df74558219d0a6ef561"},
        {:linux, :amd64, "7d0611f51fa3da042a9d67cabc5fd3b6529dad75368f8858d234719db1b94c55"},
        {:linux, :arm64, "152027ce40072db581fed8c6d58aad5df58b6e8ed2b85858a5df955391db4a8b"},
        {:freebsd, :amd64, "a70d8d268e695906b484d2bd1302d744786571e211ba019e5cef907d4589f82f"}
      ],
      "0.21.2" => [
        {:darwin, :amd64, "cbd8744f0b280a392dc51441818917fdfb7738187a6281c8ab07a0aca0bb6bcb"},
        {:darwin, :arm64, "3148ddfb0fac53d256a0e30cc9ce20e13cf2db02476fe08fd9b4f44521e38bc0"},
        {:linux, :amd64, "2fb5b2017de181ed4cf1b6fbe6813ee490f0e316bb1b3770c566330658f4586d"},
        {:linux, :arm64, "daba91ec861dbc9db22b08f4ef8c70721d5725804a59d5a62040a5decbea79fa"},
        {:freebsd, :amd64, "f5bed6ee6113f6940d9b1a29e3067b6f2e54843e1e292dfc54651374823605f0"}
      ]
    }

  require Logger

  @impl true
  def download_name(_version, os, arch) do
    "agent-#{os}-#{arch}.zip"
  end

  @impl true
  def post_write_hook(grafana_agent_file) do
    File.chmod!(grafana_agent_file, 0o755)

    :ok
  end

  @impl true
  def pre_download_hook(_download_file, output_dir) do
    already_downloaded =
      output_dir
      |> File.ls!()
      |> Enum.any?(fn file ->
        Regex.match?(~r/agent-(?:linux|darwin|freebsd|windows)-(?:amd64|arm64)/, file)
      end)

    if already_downloaded do
      Logger.info("GrafanaAgent binary already present")
      :skip
    else
      :cont
    end
  end
end