lib/backdoor.ex

defmodule NervesBackdoor do
  def home() do
    Application.get_env(:nerves_backdoor, :home)
  end

  def name() do
    Application.get_env(:nerves_backdoor, :name)
  end

  def hostname() do
    Application.get_env(:nerves_backdoor, :hostname, gethostname())
  end

  def version() do
    Application.get_env(:nerves_backdoor, :version)
  end

  def port() do
    Application.get_env(:nerves_backdoor, :port)
  end

  def ifname() do
    Application.get_env(:nerves_backdoor, :ifname)
  end

  def io_led() do
    Application.get_env(:nerves_backdoor, :io_led)
  end

  def io_btn() do
    Application.get_env(:nerves_backdoor, :io_btn)
  end

  def blink_ms() do
    Application.get_env(:nerves_backdoor, :blink_ms)
  end

  def mac() do
    case MACAddress.mac_address(ifname()) do
      {:ok, mac} -> mac |> MACAddress.to_hex(case: :upper)
      _ -> "00:00:00:00:00:00"
    end
    |> String.replace(":", "")
  end

  def password(type \\ :current) do
    case type do
      :default ->
        mac()

      :current ->
        path = pass_path()

        case File.read(path) do
          {:ok, data} -> String.trim(data)
          _ -> mac()
        end
    end
  end

  def pass_reset() do
    File.mkdir_p(home())
    File.rm(pass_path())
  end

  def pass_set(password) do
    File.write(pass_path(), password)
  end

  def pass_path() do
    Path.join(home(), "password.txt")
  end

  def gethostname() do
    {:ok, hostname} = :inet.gethostname()
    hostname |> to_string
  end

  def blink() do
    io = NervesBackdoor.io_led()
    ms = NervesBackdoor.blink_ms()
    {:ok, gpio} = NervesBackdoor.Gpio.output(io)
    :ok = NervesBackdoor.Gpio.write(gpio, 1)
    :timer.sleep(ms)
    :ok = NervesBackdoor.Gpio.write(gpio, 0)
    :timer.sleep(ms)
    :ok = NervesBackdoor.Gpio.write(gpio, 1)
    :timer.sleep(ms)
    :ok = NervesBackdoor.Gpio.write(gpio, 0)
    :timer.sleep(ms)
    :ok = NervesBackdoor.Gpio.write(gpio, 1)
    :timer.sleep(ms)
    :ok = NervesBackdoor.Gpio.write(gpio, 0)
    :ok = NervesBackdoor.Gpio.close(gpio)
  end
end