Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Ssh pi-hole conn

ssh_kit_pi_hole.livemd

Ssh pi-hole conn

Mix.install([
  {:sshkit, "~> 0.3.0"},
  {:kino, "~> 0.14.2"}
])

setup (change to system.env)

defmodule PiHoleManager do
  @default_opts [
    user: System.get_env("LB_PI_USER", "pi"),
    password: System.fetch_env!("LB_PI_PASSWD"),
    silently_accept_hosts: true,
    timeout: 15_000
  ]

  def context(extra_opts \\ []) do
    System.fetch_env!("LB_IP_PI")
    |> SSHKit.context(Keyword.merge(@default_opts, extra_opts))
    |> SSHKit.env(%{"PIHOLE_MODE" => "remote"})
  end
  
  def run(command, opts \\ []) do
    SSHKit.run(context(opts), command)
  end

  def update_gravity do
    case run("pihole -g") do
      [{:ok, output, 0}] -> {:ok, parse_output(output)}
      other -> {:error, other}
    end
  end

  defp parse_output(output) do
    output
    |> Keyword.get_values(:stdout)
    |> Enum.join("\n")
  end
end
defmodule ParseTemperature do
  def parse_temperature(output) do
    with {:ok, raw} <- Keyword.fetch(output, :stdout),
         [_, temp_str] <- String.split(raw, "="),
         [value, _] <- String.split(temp_str, "'C"),
         {temp, _} <- Float.parse(value) do
      {:ok, temp}
    else
      _ -> {:error, "Invalid temperature format"}
    end
  end
end

case PiHoleManager.run("vcgencmd measure_temp") do
  [{:ok, output, 0}] ->
    case ParseTemperature.parse_temperature(output) do
      {:ok, temp} when temp < 80.0 ->
        IO.puts("✅ Normal temperature: #{temp}°C")
        
      {:ok, temp} ->
        IO.puts("⚠️ WARNING: High temperature! #{temp}°C")
        
      {:error, reason} ->
        IO.puts("⚠️ Invalid format: #{reason}")
    end

  error ->
    IO.puts("🚨 Connection failed: #{inspect(error)}")
end
defmodule PiHoleCommands do
  def rebuild do
    PiHoleManager.run("pihole restartdns")
    PiHoleManager.run("pihole -g")
  end

  def status do
    PiHoleManager.run("pihole status")
  end

  def disable(min) do
    PiHoleManager.run("pihole disable #{min}")
  end
end
PiHoleCommands.status()
PiHoleManager.update_gravity()

Schedule tasks

Ill use genserver here…

#todo