С помощью эликсира для очистки компрессов и ftp и кода - Elixir

Задача состоит в том, чтобы:

  1. SSH к серверу Linux.
  2. Остановить службу.
  3. Используя tar, создайте файл tar.gz.из каталога (размер 30 ГБ Макс).
  4. Загрузите этот файл на FTP-сервер.
  5. Запустите остановленный сервис.
  6. Весь вышеуказанный процесс будет выполняться каждое воскресенье

Я рассмотрел почти все шаги и сбои в коде, предполагая, что будет запущена служба, а также есть каталог, в котором она будет выполнять операцию tar.

Я использую https://github.com/rubencaro/sshex для SSH на сервер, а затем выполняю все команды.

Вопросы:

  1. Как я могу заставить канал ждать завершения процесса tar и затем запустить следующую команду? как и в случае файла 30 ГБ, для изменения размера каталога почти требуется более 10 минут. Задача 3 и задача 4 занимают больше всего времени, и я хочу заставить трубу ждать, пока эти команды будут выполнены, а затем перейти к следующей.
  2. Это лучший способ сделать tar на большой каталог (максимум 32 ГБ).
  3. Это лучший способ сделать FTP? в линуксе?
  4. Это лучшее решение для этого? Я имею в виду, что Эликсир великолепен, но хорошо ли выполнять все эти шаги с помощью Эликсира?
  5. Можете ли вы предложить мне некоторые заметки и изменения в коде, я написал, чтобы сделать его лучше?

ОБНОВЛЕНИЕ: делая tar Я получаю эту ошибку от подключения SSH

{:error, "Timeout. Did not receive data for 5000ms."}

Весь модуль:

defmodule EvercamMedia.BackUpSeaweedfsFiler do
  require Logger

  @zip_date Calendar.Strftime.strftime(Calendar.DateTime.now_utc, "%Y%m%d") |> elem(1)
  @ftp_domain Application.get_env(:evercam_media, :ftp_domain)
  @ftp_username Application.get_env(:evercam_media, :ftp_username)
  @ftp_password Application.get_env(:evercam_media, :ftp_password)
  @filer_server Application.get_env(:evercam_media, :filer_server)
  @filer_username Application.get_env(:evercam_media, :filer_username)
  @filer_password Application.get_env(:evercam_media, :filer_password)
  @stop_seaweedfs_command "systemctl stop seaweedfs.service"
  @start_seaweedfs_command "systemctl start seaweedfs.service"
  @zip_filer_directory "tar -czf #{@zip_date}.tar.gz /storage/filer"
  @copy_to_ftp "curl -T #{@zip_date}.tar.gz #{@ftp_domain} --user #{@ftp_username}:#{@ftp_password}"

  def start do
    connect_to_server(@filer_server, @filer_username, @filer_password)
    |> connected?
    |> grant_for_backup()
  end

  defp grant_for_backup({:exit, true}), do: :noop
  defp grant_for_backup(connected) do
    connected
    |> run_command_on_server(@stop_seaweedfs_command)
    |> response_is(connected)
    |> run_command_on_server(@zip_filer_directory)
    |> response_is(connected)
    |> run_command_on_server(@copy_to_ftp)
    |> response_is(connected)
    |> run_command_on_server(@start_seaweedfs_command)
    |> completed?
  end

  defp connected?({:ok, connected}), do: connected
  defp connected?({:halt, true, message}) do
    Logger.info("Process stopped due to: " <> message)
    send_email_for_backup("Process stopped due to: " <> message)
    {:exit, true}
  end

  defp completed?({:halt, reason}) do
    Logger.info("Process stopped due to: " <> reason)
    send_email_for_backup("Process stopped due to: " <> reason)
  end
  defp completed?(_conn) do
    Logger.info "Process has been completed."
    send_email_for_backup("Process has been completed.")
  end

  defp run_command_on_server({:halt, reason}, _command) do
    Logger.info("Process stopped due to: " <> reason)
    send_email_for_backup("Command Couldn't run due to: " <> reason)
    :noop
  end
  defp run_command_on_server(connected, command) do
    connected
    |> SSHEx.run(command)
  end

  defp response_is({:ok, _res, _}, connected), do: connected
  defp response_is({:error, reason}, _connected), do: {:halt, reason}

  defp connect_to_server(ip, username, password, tries \\ 1)
  defp connect_to_server(_ip, _username, _password, 3), do: {:halt, true, "Not possible to make connection with server."}
  defp connect_to_server(ip, username, password, tries) do
    SSHEx.connect(ip: ip, user: username, password: password)
    |> case do
      {:error, :nxdomain} -> {:halt, true, "IP does'nt seem correct."}
      {:error, :timeout} -> connect_to_server(ip, username, password, tries + 1)
      {:error, reason} -> {:halt, true, reason}
      {:ok, connected} -> {:ok, connected}
    end
  end

  defp send_email_for_backup(message) do
    EvercamMedia.UserMailer.seaweedfs_filer_backup(message)
  end
end

Заранее спасибо.

0 ответов

Другие вопросы по тегам