diff --git a/hooks/boot/01-kafo-hook-extensions.rb b/hooks/boot/01-kafo-hook-extensions.rb index 21c596fe..8385b15f 100644 --- a/hooks/boot/01-kafo-hook-extensions.rb +++ b/hooks/boot/01-kafo-hook-extensions.rb @@ -1,5 +1,6 @@ require 'English' require 'open3' +require 'shellwords' module HookContextExtension # FIXME: remove when #23332 is released @@ -85,6 +86,12 @@ def pulpcore_enabled? module_enabled?('foreman_proxy_content') end + def local_db_exists?(database) + db_existence_command = pg_sql_statement("SELECT 1 FROM pg_database WHERE datname = '#{database}';") + db_existence_output, = execute_preformatted_as('postgres', db_existence_command, false, true) + db_existence_output&.strip == '1' + end + def log_and_say(level, message, do_say = true, do_log = true) style = case level when :error @@ -164,13 +171,19 @@ def execute_as!(user, command, do_say = true, do_log = true, extra_env = {}) execute!(runuser_command, do_say, do_log, extra_env) end + def execute_preformatted_as(user, command, do_say = true, do_log = true, extra_env = {}) + runuser_command = ['runuser', '-l', user, '-c', command] + execute_command(runuser_command, do_say, do_log, extra_env) + end + def execute(command, do_say, do_log, extra_env = {}) _stdout_stderr, status = execute_command(command, do_say, do_log, extra_env) status end def execute_command(command, do_say, do_log, extra_env = {}) - log_and_say(:debug, "Executing: #{command}", do_say, do_log) + display_command = command.is_a?(Array) ? Shellwords.join(command) : command + log_and_say(:debug, "Executing: #{display_command}", do_say, do_log) begin stdout_stderr, status = Open3.capture2e(*Kafo::PuppetCommand.format_command(command, extra_env)) diff --git a/hooks/pre/35-change-evr-extension-ownership.rb b/hooks/pre/35-change-evr-extension-ownership.rb new file mode 100644 index 00000000..983c3164 --- /dev/null +++ b/hooks/pre/35-change-evr-extension-ownership.rb @@ -0,0 +1,28 @@ +# In Katello 4.16, the 'evr' extension is removed from PostgreSQL and integrated into the Katello database via a migration. +# This hook ensures the 'evr' extension's ownership is transferred to the 'foreman' user so migrations can act on it. + +if (local_foreman_db? || devel_scenario?) && execute("rpm -q postgresql-evr", false, false) + if app_value(:noop) + logger.debug("Would start postgresql service") + else + start_services(['postgresql']) + end + + database = param_value('foreman', 'db_database') || 'foreman' + username = param_value('foreman', 'db_username') || 'foreman' + + if local_db_exists?(database) + sql = "UPDATE pg_extension SET extowner = (SELECT oid FROM pg_authid WHERE rolname='#{username}') WHERE extname='evr'" + if app_value(:noop) + logger.debug("Would execute the following SQL statement to update ownership of the evr extension: #{sql}") + else + logger.debug("Updating ownership of the evr extension") + _, success = execute_preformatted_as('postgres', "psql -d #{database} -c \"#{sql}\"", false, true) + unless success + fail_and_exit("Failed to update ownership of the evr extension. Please make sure the following sql succeeds before proceeding: #{sql}") + end + end + else + logger.notice("The Foreman database #{database} does not exist.") + end +end