lib/doex/cli/scp.ex

defmodule Doex.Cli.Scp do
  use FnExpr
  alias Doex.Cli.Parser
  alias Doex.Io.Shell

  @moduledoc """
  Secure copy a file from <src> to your droplet's <target>

       doex scp <droplet_name> <src> <target>

  You can provide the droplet ID, reference it by name, or by tag (if you add the --tag option)

  For example

      doex scp my_app ./bin/env /src/my_app/bin/env

  If you have a specific config file, `mix help doex.config` then add it as an environment variable

      DOEX_CONFIG=/tmp/my.doex doex scp my_app ./bin/env /src/my_app/bin/env

  """

  @options %{
    tag: :boolean
  }

  def run(raw_args) do
    Doex.start()

    raw_args
    |> Parser.parse(@options)
    |> invoke(fn {opts, [name, src, target]} ->
      name
      |> Doex.Client.find_droplet(opts)
      |> invoke(fn
        nil -> Shell.unknown_droplet(name, ["scp" | raw_args])
        id -> id
      end)
      |> Doex.Client.droplet_ip()
      |> scp(src, target)
    end)
    |> Shell.info(raw_args)
  end

  def scp(nil, _src, _target), do: nil

  def scp(ip, src, target) do
    {_, 0} = System.cmd("scp", [src, "root@#{ip}:#{target}"])
    "scp #{src} root@#{ip}:#{target}"
  end
end