mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-26 15:06:22 +00:00
Merge branch 'deploy-rsync' into panel.sutty.nl
This commit is contained in:
commit
1e6533b52c
1 changed files with 88 additions and 0 deletions
88
app/models/deploy_rsync.rb
Normal file
88
app/models/deploy_rsync.rb
Normal file
|
@ -0,0 +1,88 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
# Sincroniza sitios a servidores remotos usando Rsync. El servidor
|
||||
# remoto tiene que tener rsync instalado.
|
||||
class DeployRsync < Deploy
|
||||
store :values, accessors: %i[flags destination host_keys], coder: JSON
|
||||
|
||||
def deploy
|
||||
ssh? && rsync
|
||||
end
|
||||
|
||||
# No se ocupa espacio local
|
||||
#
|
||||
# @return [Integer]
|
||||
def size
|
||||
0
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# Verificar la conexión SSH implementando Trust On First Use
|
||||
#
|
||||
# TODO: Medir el tiempo que tarda en iniciarse la conexión
|
||||
#
|
||||
# @return [Boolean]
|
||||
def ssh?
|
||||
user, host = user_host
|
||||
ssh_available = false
|
||||
|
||||
Net::SSH.start(host, user, verify_host_key: tofu) do |ssh|
|
||||
if values[:host_keys].blank?
|
||||
# Guardar las llaves que se encontraron en la primera conexión
|
||||
values[:host_keys] = ssh.transport.host_keys.map do |host_key|
|
||||
"#{host_key.ssh_type} #{host_key.fingerprint}"
|
||||
end
|
||||
|
||||
ssh_available = save
|
||||
else
|
||||
ssh_available = true
|
||||
end
|
||||
end
|
||||
|
||||
ssh_available
|
||||
rescue Exception => e
|
||||
ExceptionNotifier.notify_exception(e, data: { site: site.id, hostname: host, user: user })
|
||||
|
||||
false
|
||||
end
|
||||
|
||||
# Confiar en la primera llave que encontremos, fallar si cambian
|
||||
#
|
||||
# @return [Symbol]
|
||||
def tofu
|
||||
values[:host_keys].present? ? :always : :accept_new
|
||||
end
|
||||
|
||||
# Devuelve el par user host
|
||||
#
|
||||
# @return [Array]
|
||||
def user_host
|
||||
destination.split(':', 2).first.split('@', 2).tap do |d|
|
||||
next unless d.size == 1
|
||||
|
||||
d.insert(0, nil)
|
||||
end
|
||||
end
|
||||
|
||||
# Sincroniza hacia el directorio remoto, usando las flags opcionales.
|
||||
#
|
||||
# @return [Boolean]
|
||||
def rsync
|
||||
run %(rsync -av #{flags ? Shellwords.escape(flags) : ''} #{Shellwords.escape source}/ #{Shellwords.escape destination}/)
|
||||
end
|
||||
|
||||
# El origen es el destino de la compilación
|
||||
#
|
||||
# @return [String]
|
||||
def source
|
||||
site.deploys.find_by(type: 'DeployLocal').destination
|
||||
end
|
||||
|
||||
# Devolver el destino o lanzar un error si no está configurado
|
||||
def destination
|
||||
values[:destination].tap do |_d|
|
||||
raise ArgumentError, 'destination no está configurado'
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue