5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-07-01 12:06:07 +00:00
panel/db/migrate/20210801060844_add_hostname_to_deploys.rb
2021-09-25 19:41:48 -03:00

79 lines
2.6 KiB
Ruby

# frozen_string_literal: true
# Recupera la funcionalidad que estamos deprecando.
module AddValuesToDeploy
extend ActiveSupport::Concern
included do
store :values, accessors: %i[hostname onion], coder: JSON
puts 'XXX: Al incluir este módulo todas las migraciones siguientes van a fallar. Podés correrlas de nuevo para arreglarlas.'
end
end
# Convertir todos los valores serializados de Deploy en una columna,
# porque al final el único uso que tuvo fue para guardar los hostnames
# alternativos.
#
# ¡El hostname es único para poder evitar que haya duplicados!
class AddHostnameToDeploys < ActiveRecord::Migration[6.1]
# Crea una columna temporal y guarda todos los valores. Los traspasa
# y luego elimina la columna.
def up
Deploy.include AddValuesToDeploy
# Ya que estamos hacer limpieza, eliminando deploys sin sitios
Deploy.where(site_id: nil).delete_all
Deploy.where.not(site_id: Site.all.pluck(:id)).delete_all
add_column :deploys, :hostname_tmp, :string
Site.find_each do |site|
# Temporalmente cambiar el nombre del sitio para que los hostnames
# se generen bien, pero los cambios de nombre reales los vamos a
# hacer manualmente.
site.name = site.name.split('.', 2).first if site.name.include?('.')
site.deploys.find_each do |deploy|
hostname = (deploy.values[:onion] || deploy.values[:hostname] || deploy.hostname || "#{SecureRandom.hex}.invalid").dup.sub(
/\.\z/, ''
)
deploy.update_columns hostname_tmp: hostname
end
end
rename_column :deploys, :hostname_tmp, :hostname
remove_column :deploys, :values
# Eliminar los dominios duplicados para un mismo sitio, siempre
# y cuando no sean DeployLocal.
columns = %i[site_id hostname]
Deploy.group(*columns).pluck(*columns).each do |duplicated|
deploys = Deploy.where(columns.zip(duplicated).to_h).order(:created_at).pluck(:id, :type)
next unless deploys.size > 1
Deploy.where(id: deploys.reject { |d| d.last == 'DeployLocal' }.map(&:first)).delete_all
end
add_index :deploys, :hostname, unique: true
# A esta altura todos los dominios deberían estar migrados.
change_column :deploys, :hostname, :string, null: false
end
# Recupera los valores desde la columna creada.
def down
Deploy.include AddValuesToDeploy
rename_column :deploys, :hostname, :hostname_tmp
add_column :deploys, :values, :text
Site.find_each do |site|
site.deploys.find_each do |deploy|
deploy.values[(deploy.is_a? DeployHiddenService ? :onion : :hostname)] = deploy.hostname_tmp
end
end
remove_column :deploys, :hostname_tmp
end
end