С помощью эликсира для очистки компрессов и ftp и кода - Elixir
Задача состоит в том, чтобы:
- SSH к серверу Linux.
- Остановить службу.
- Используя tar, создайте файл tar.gz.из каталога (размер 30 ГБ Макс).
- Загрузите этот файл на FTP-сервер.
- Запустите остановленный сервис.
- Весь вышеуказанный процесс будет выполняться каждое воскресенье
Я рассмотрел почти все шаги и сбои в коде, предполагая, что будет запущена служба, а также есть каталог, в котором она будет выполнять операцию tar.
Я использую https://github.com/rubencaro/sshex для SSH на сервер, а затем выполняю все команды.
Вопросы:
- Как я могу заставить канал ждать завершения процесса tar и затем запустить следующую команду? как и в случае файла 30 ГБ, для изменения размера каталога почти требуется более 10 минут. Задача 3 и задача 4 занимают больше всего времени, и я хочу заставить трубу ждать, пока эти команды будут выполнены, а затем перейти к следующей.
- Это лучший способ сделать
tar
на большой каталог (максимум 32 ГБ). - Это лучший способ сделать FTP? в линуксе?
- Это лучшее решение для этого? Я имею в виду, что Эликсир великолепен, но хорошо ли выполнять все эти шаги с помощью Эликсира?
- Можете ли вы предложить мне некоторые заметки и изменения в коде, я написал, чтобы сделать его лучше?
ОБНОВЛЕНИЕ: делая 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
Заранее спасибо.