Skip to content

Commit 384b86f

Browse files
committed
Allow executing commands as a different user
1 parent 1d0a3f5 commit 384b86f

5 files changed

Lines changed: 48 additions & 18 deletions

File tree

definitions/features/container_gateway_database.rb

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,9 @@ def load_configuration
3131
connection_string = config[:db_connection_string]
3232
if connection_string
3333
uri = URI.parse(connection_string)
34-
@configuration['adapter'] = uri.scheme
35-
@configuration['host'] = uri.host
36-
@configuration['port'] = uri.port
37-
@configuration['database'] = uri.path[1..-1]
38-
@configuration['username'] = uri.user
39-
@configuration['password'] = uri.password
34+
@configuration['connection_string'] = connection_string
35+
@configuration['user'] = 'foreman-proxy'
36+
@configuration['database'] = uri.path[1..]
4037
end
4138
@configuration
4239
end

definitions/procedures/restore/drop_databases.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ def run
2020
drop_foreman(backup, spinner)
2121
drop_candlepin(backup, spinner)
2222
drop_pulpcore(backup, spinner)
23+
drop_container_gateway(backup, spinner)
2324
end
2425
end
2526

@@ -43,5 +44,12 @@ def drop_pulpcore(backup, spinner)
4344
feature(:pulpcore_database).dropdb
4445
end
4546
end
47+
48+
def drop_container_gateway(backup, spinner)
49+
if backup.file_map[:container_gateway_dump][:present]
50+
spinner.update('Dropping container gateway database')
51+
feature(:container_gateway_database).dropdb
52+
end
53+
end
4654
end
4755
end

definitions/scenarios/restore.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ def restore_sql_dumps(backup)
6565
if backup.file_map[:pulpcore_dump][:present]
6666
add_steps_with_context(Procedures::Restore::PulpcoreDump)
6767
end
68+
if backup.file_map[:container_gateway_dump][:present]
69+
add_steps_with_context(Procedures::Restore::ContainerGatewayDump)
70+
end
6871
if feature(:instance).postgresql_local?
6972
add_step(Procedures::Service::Stop.new(:only => ['postgresql']))
7073
end
@@ -82,6 +85,7 @@ def set_context_mapping
8285
Procedures::Restore::CandlepinDump => :backup_dir,
8386
Procedures::Restore::ForemanDump => :backup_dir,
8487
Procedures::Restore::PulpcoreDump => :backup_dir,
88+
Procedures::Restore::ContainerGatewayDump => :backup_dir,
8589
Procedures::Restore::ExtractFiles => :backup_dir)
8690
end
8791
end

lib/foreman_maintain/concerns/base_database.rb

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ def configuration
4242
end
4343

4444
def local?(config = configuration)
45-
['localhost', '127.0.0.1', `hostname`.strip].include?(config['host'])
45+
['localhost', '127.0.0.1', `hostname`.strip].include?(config['host']) ||
46+
config['host'].nil?
4647
end
4748

4849
def query(sql, config = configuration)
@@ -57,7 +58,8 @@ def psql(query, config = configuration)
5758
if ping(config)
5859
execute(psql_command(config),
5960
:stdin => query,
60-
:hidden_patterns => [config['password']])
61+
:hidden_patterns => [config['password']],
62+
:config => user)
6163
else
6264
raise_service_error
6365
end
@@ -66,11 +68,12 @@ def psql(query, config = configuration)
6668
def ping(config = configuration)
6769
execute?(psql_command(config),
6870
:stdin => 'SELECT 1 as ping',
69-
:hidden_patterns => [config['password']])
71+
:hidden_patterns => [config['password']],
72+
:user => config['user'])
7073
end
7174

7275
def dump_db(file, config = configuration)
73-
execute!(dump_command(config) + " > #{file}", :hidden_patterns => [config['password']])
76+
execute!(dump_command(config) + " > #{file}", :hidden_patterns => [config['password']], :user => config['user'])
7477
end
7578

7679
def restore_dump(file, localdb, config = configuration)
@@ -80,11 +83,16 @@ def restore_dump(file, localdb, config = configuration)
8083
else
8184
# TODO: figure out how to completely ignore errors. Currently this
8285
# sometimes exits with 1 even though errors are ignored by pg_restore
83-
dump_cmd = base_command(config, 'pg_restore') +
84-
' --no-privileges --clean --disable-triggers -n public ' \
85-
"-d #{config['database']} #{file}"
86+
dump_cmd = ''
87+
if config['connection_string']
88+
dump_cmd = "pg_restore --no-privileges --clean --disable-triggers -n public -d #{config['database']} #{file}"
89+
else
90+
dump_cmd = base_command(config, 'pg_restore') +
91+
' --no-privileges --clean --disable-triggers -n public ' \
92+
"-d #{config['database']} #{file}"
93+
end
8694
execute!(dump_cmd, :hidden_patterns => [config['password']],
87-
:valid_exit_statuses => [0, 1])
95+
:valid_exit_statuses => [0, 1], :user => config['user'])
8896
end
8997
end
9098

@@ -152,11 +160,19 @@ def base_command(config, command = 'psql')
152160
end
153161

154162
def psql_command(config)
155-
base_command(config, 'psql') + " -d #{config['database']}"
163+
if config['connection_string']
164+
"psql #{config['connection_string']}"
165+
else
166+
base_command(config, 'psql') + " -d #{config['database']}"
167+
end
156168
end
157169

158170
def dump_command(config)
159-
base_command(config, 'pg_dump') + " -Fc #{config['database']}"
171+
if config['connection_string']
172+
"pg_dump -Fc #{config['connection_string']}"
173+
else
174+
base_command(config, 'pg_dump') + " -Fc #{config['database']}"
175+
end
160176
end
161177

162178
def raise_service_error

lib/foreman_maintain/utils/command_runner.rb

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,15 @@ class CommandRunner
88
attr_reader :logger, :command
99

1010
def initialize(logger, command, options)
11-
options.validate_options!(:stdin, :hidden_patterns, :interactive, :valid_exit_statuses)
11+
options.validate_options!(:stdin, :hidden_patterns, :interactive, :valid_exit_statuses, :user)
1212
options[:valid_exit_statuses] ||= [0]
1313
@logger = logger
14-
@command = command
14+
@user = options[:user]
15+
if @user && !@user.empty?
16+
@command = "sudo -u #{@user} -- " + command
17+
else
18+
@command = command
19+
end
1520
@stdin = options[:stdin]
1621
@hidden_patterns = Array(options[:hidden_patterns]).compact
1722
@interactive = options[:interactive]

0 commit comments

Comments
 (0)