File gitlab-ce-migrate-services of Package gitlab-ce

#!/usr/bin/ruby.ruby3.3

require 'logger'
require 'fileutils'

class ServiceMigrator
  def initialize(service_mapping = {}, log_level = Logger::WARN)
    @logger = Logger.new(STDERR)
    @logger.level = log_level

    @trigger_prefix='/run/gitlab-ce-services'
    @systemctl='/usr/bin/systemctl'

    @service_mapping = service_mapping
    @ignore_output = {out: File::NULL, err: File::NULL}

    if ! File.exist?(@systemctl)
      @logger.warn("Failed to find #{@systemctl}. This is probably ok. Exciting ...")
      exit(0)
    end
    File.umask(0077)
  end

  def check_services
    old_services = @service_mapping.keys
    start_services = []
    enable_services = []
    @service_mapping.each do |old_service, new_service|
      if system(@systemctl, "is-active", old_service, @ignore_output)
        @logger.debug("[#{old_service}] Status: running, adding #{new_service}")
        start_services << new_service
      else
        @logger.debug("[#{old_service}] Status: inactive")
      end
      if system(@systemctl, "is-enabled", old_service, @ignore_output)
        @logger.debug("[#{old_service}] Status: enabled, adding #{new_service}")
        enable_services << new_service
      else
        @logger.debug("[#{old_service}] Status: disabled")
      end
    end
    cmdline = [@systemctl,'disable', '--now'].concat(old_services)
    @logger.debug("Disabling and stopping services: #{old_services.join(', ')}")
    system(*cmdline, @ignore_output)

    self.write_trigger_file('start', start_services)
    self.write_trigger_file('enable', enable_services)
  end

  # def restore_services
  #   actions = %w{enable start}
  #   actions.each do |action|
  #     self.systemd_action(action)
  #   end
  # end

  private
  # def systemd_action(action)
  #   trigger = "#{@trigger_prefix}-#{action}"
  #   if File.exist?(trigger)
  #     service_list = File.read(trigger).split(/\s+/)
  #     if service_list.empty?
  #       @logger.error("Found no services for action #{action}")
  #     else
  #       if system(@systemctl, action, *service_list, @ignore_output)
  #         @logger.debug("#{action} for #{service_list} was successful")
  #       else
  #         @logger.warn("#{action} for #{service_list} failed")
  #       end
  #       if FileUtils.rm(trigger)
  #         @logger.debug("Removed #{trigger}")
  #       else
  #         @logger.warn("Failed to remove #{trigger}")
  #       end
  #     end
  #   end
  # end

  def write_trigger_file(action, services)
    if services.empty?
      @logger.debug("No services for action #{action} found to migrate")
    else
      trigger = "#{@trigger_prefix}-#{action}"
      content = services.join(' ')
      @logger.debug("Memorizing #{services} for #{action}")
      if File.write(trigger, content)
        @logger.debug("Successfully wrote #{trigger}")
      else
        @logger.warn("Failed to write #{trigger}")
      end
    end
  end
end

service_mapping = {
  'gitlab-ce-unicorn.service' => 'gitlab-ce-puma.service',
}

migrator = ServiceMigrator.new(service_mapping)
migrator.check_services
openSUSE Build Service is sponsored by