2022-10-05 21:44:23 +00:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2023-01-20 23:34:27 +00:00
|
|
|
require 'distributed_press/v1/client/site'
|
|
|
|
|
|
|
|
# Soportar Distributed Press APIv1
|
|
|
|
#
|
|
|
|
# Usa tokens de publicación efímeros para todas las acciones.
|
2022-10-05 21:44:23 +00:00
|
|
|
#
|
2023-01-20 23:34:27 +00:00
|
|
|
# Al ser creado, genera el sitio en la instancia de Distributed Press
|
|
|
|
# configurada y almacena el ID.
|
2022-10-05 21:44:23 +00:00
|
|
|
#
|
2023-01-20 23:34:27 +00:00
|
|
|
# Al ser publicado, envía los archivos en un tarball y actualiza la
|
|
|
|
# información.
|
2022-10-05 21:44:23 +00:00
|
|
|
class DeployDistributedPress < Deploy
|
2023-11-01 20:11:31 +00:00
|
|
|
store :values, accessors: %i[hostname remote_site_id remote_info distributed_press_publisher_id], coder: JSON
|
2023-01-20 23:34:27 +00:00
|
|
|
|
2023-11-23 21:41:49 +00:00
|
|
|
before_create :create_remote_site!
|
|
|
|
before_destroy :delete_remote_site!
|
2023-01-20 23:34:27 +00:00
|
|
|
|
2023-03-18 19:40:17 +00:00
|
|
|
DEPENDENCIES = %i[deploy_local]
|
2023-01-20 23:34:27 +00:00
|
|
|
|
|
|
|
# Actualiza la información y luego envía los cambios
|
|
|
|
#
|
|
|
|
# @param :output [Bool]
|
|
|
|
# @return [Bool]
|
2023-01-23 21:40:15 +00:00
|
|
|
def deploy(output: true)
|
2023-01-20 23:34:27 +00:00
|
|
|
status = false
|
2023-02-08 20:08:02 +00:00
|
|
|
log = []
|
|
|
|
|
|
|
|
time_start
|
2023-01-20 23:34:27 +00:00
|
|
|
|
2023-03-17 20:39:41 +00:00
|
|
|
create_remote_site! if remote_site_id.blank?
|
|
|
|
save
|
2023-03-17 20:37:48 +00:00
|
|
|
|
2023-03-31 16:58:10 +00:00
|
|
|
if remote_site_id.blank?
|
|
|
|
raise DeployJob::DeployException, 'El sitio no se creó en Distributed Press'
|
|
|
|
end
|
|
|
|
|
2023-01-20 23:34:27 +00:00
|
|
|
site_client.tap do |c|
|
2023-02-08 20:08:02 +00:00
|
|
|
stdout = Thread.new(publisher.logger_out) do |io|
|
|
|
|
until io.eof?
|
|
|
|
line = io.gets
|
|
|
|
|
|
|
|
puts line if output
|
|
|
|
log << line
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2023-06-15 21:51:16 +00:00
|
|
|
begin
|
|
|
|
status = c.publish(publishing_site, deploy_local.destination)
|
|
|
|
rescue DistributedPress::V1::Error => e
|
|
|
|
ExceptionNotifier.notify_exception(e, data: { site: site.name })
|
|
|
|
status = false
|
|
|
|
end
|
2023-02-08 20:08:02 +00:00
|
|
|
|
2023-03-31 17:44:48 +00:00
|
|
|
if status
|
|
|
|
self.remote_info[:distributed_press] = c.show(publishing_site).to_h
|
|
|
|
save
|
|
|
|
end
|
|
|
|
|
2023-02-08 20:08:02 +00:00
|
|
|
publisher.logger.close
|
|
|
|
stdout.join
|
2023-01-20 23:34:27 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
time_stop
|
|
|
|
|
2023-02-08 20:08:02 +00:00
|
|
|
create_stat! status, log.join
|
2022-10-05 21:44:23 +00:00
|
|
|
|
2023-01-20 23:34:27 +00:00
|
|
|
status
|
|
|
|
end
|
2022-10-05 21:44:23 +00:00
|
|
|
|
|
|
|
def limit; end
|
|
|
|
|
|
|
|
def size
|
|
|
|
deploy_local.size
|
|
|
|
end
|
|
|
|
|
2023-01-20 23:34:27 +00:00
|
|
|
def destination; end
|
|
|
|
|
2023-02-08 21:49:37 +00:00
|
|
|
# Devuelve las URLs de todos los protocolos
|
|
|
|
def urls
|
2023-04-19 21:04:22 +00:00
|
|
|
gateway_urls
|
2023-03-31 17:49:17 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
2023-04-15 22:13:23 +00:00
|
|
|
# @return [Array]
|
2023-03-31 17:49:17 +00:00
|
|
|
def gateway_urls
|
2023-04-15 22:13:23 +00:00
|
|
|
remote_info.dig(:distributed_press, :links)&.values&.map do |protocol|
|
2023-02-08 21:49:37 +00:00
|
|
|
[ protocol[:link], protocol[:gateway] ]
|
2023-04-15 22:13:23 +00:00
|
|
|
end&.flatten&.compact&.select do |link|
|
2023-02-08 21:49:37 +00:00
|
|
|
link.include? '://'
|
2023-04-15 22:13:23 +00:00
|
|
|
end || []
|
2023-02-08 21:49:37 +00:00
|
|
|
end
|
|
|
|
|
2023-01-20 23:34:27 +00:00
|
|
|
# El cliente de la API
|
|
|
|
#
|
|
|
|
# @return [DistributedPressPublisher]
|
|
|
|
def publisher
|
2023-11-01 20:02:32 +00:00
|
|
|
@publisher ||=
|
|
|
|
if distributed_press_publisher_id
|
|
|
|
DistributedPressPublisher.find(distributed_press_publisher_id)
|
|
|
|
else
|
|
|
|
DistributedPressPublisher.find_by_default(true)
|
|
|
|
end
|
2022-10-05 21:44:23 +00:00
|
|
|
end
|
|
|
|
|
2023-01-20 23:34:27 +00:00
|
|
|
# El cliente para actualizar el sitio
|
2022-10-05 21:44:23 +00:00
|
|
|
#
|
2023-01-20 23:34:27 +00:00
|
|
|
# @return [DistributedPress::V1::Client::Site]
|
|
|
|
def site_client
|
2023-01-23 21:39:10 +00:00
|
|
|
DistributedPress::V1::Client::Site.new(publisher.client)
|
2022-10-05 21:44:23 +00:00
|
|
|
end
|
|
|
|
|
2023-01-20 23:34:27 +00:00
|
|
|
# Genera el esquema de datos para poder publicar el sitio
|
|
|
|
#
|
|
|
|
# @return [DistributedPress::V1::Schemas::PublishingSite]
|
|
|
|
def publishing_site
|
|
|
|
DistributedPress::V1::Schemas::PublishingSite.new.call(id: remote_site_id)
|
|
|
|
end
|
|
|
|
|
|
|
|
# Genera el esquema de datos para crear el sitio
|
|
|
|
#
|
|
|
|
# @return [DistributedPressPublisher::V1::Schemas::NewSite]
|
|
|
|
def create_site
|
|
|
|
DistributedPress::V1::Schemas::NewSite.new.call(domain: hostname, protocols: { http: true, ipfs: true, hyper: true })
|
|
|
|
end
|
|
|
|
|
|
|
|
# Crea el sitio en la instancia con el hostname especificado
|
|
|
|
#
|
|
|
|
# @return [nil]
|
|
|
|
def create_remote_site!
|
2023-01-26 18:58:22 +00:00
|
|
|
self.hostname = site.hostname
|
|
|
|
|
2023-01-20 23:34:27 +00:00
|
|
|
created_site = site_client.create(create_site)
|
|
|
|
|
|
|
|
self.remote_site_id = created_site[:id]
|
2023-03-31 17:38:04 +00:00
|
|
|
self.remote_info ||= {}
|
|
|
|
self.remote_info[:distributed_press] = created_site.to_h
|
2023-03-31 15:14:14 +00:00
|
|
|
nil
|
2023-03-20 15:13:51 +00:00
|
|
|
rescue DistributedPress::V1::Error => e
|
2023-03-17 20:39:41 +00:00
|
|
|
ExceptionNotifier.notify_exception(e, data: { site: site.name })
|
|
|
|
nil
|
|
|
|
end
|
2023-01-20 23:34:27 +00:00
|
|
|
|
|
|
|
# Registra lo que sucedió
|
|
|
|
#
|
|
|
|
# @param status [Bool]
|
2023-02-08 20:08:02 +00:00
|
|
|
# @param log [String]
|
2023-01-20 23:34:27 +00:00
|
|
|
# @return [nil]
|
2023-02-08 20:08:02 +00:00
|
|
|
def create_stat!(status, log)
|
|
|
|
build_stats.create action: publisher.to_s,log: log, seconds: time_spent_in_seconds, bytes: size, status: status
|
2023-01-20 23:34:27 +00:00
|
|
|
nil
|
|
|
|
end
|
2023-02-09 23:01:22 +00:00
|
|
|
|
2023-03-31 15:14:14 +00:00
|
|
|
def delete_remote_site!
|
2023-03-31 16:40:50 +00:00
|
|
|
site_client.delete(publishing_site)
|
2023-03-31 15:14:14 +00:00
|
|
|
nil
|
|
|
|
rescue DistributedPress::V1::Error => e
|
|
|
|
ExceptionNotifier.notify_exception(e, data: { site: site.name })
|
|
|
|
nil
|
|
|
|
end
|
2022-10-05 21:44:23 +00:00
|
|
|
end
|