Skip to content

Commit 29624d4

Browse files
Fix pgAdmin fails when performing Backup/Restore on a PostgreSQL connection defined exclusively via pg_service.conf. #9553
1 parent 596b14a commit 29624d4

File tree

2 files changed

+89
-40
lines changed

2 files changed

+89
-40
lines changed

web/pgadmin/tools/backup/__init__.py

Lines changed: 39 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ def __init__(self, _type, _sid, _bfile, *_args, **_kwargs):
9494
self.database = _kwargs['database'] if 'database' in _kwargs else None
9595
self.cmd = ''
9696
self.args_str = "{0} ({1}:{2})"
97+
self.arg_list = None
9798

9899
def cmd_arg(x):
99100
if x:
@@ -110,19 +111,35 @@ def cmd_arg(x):
110111
self.cmd += cmd_arg(arg)
111112

112113
def get_server_name(self):
114+
args = self.arg_list
113115
s = get_server(self.sid)
114116

115117
if s is None:
116118
return gettext("Not available")
117119

118-
from pgadmin.utils.driver import get_driver
119-
driver = get_driver(PG_DEFAULT_DRIVER)
120-
manager = driver.connection_manager(self.sid)
120+
host, port = None, None
121121

122-
host = manager.local_bind_host if manager.use_ssh_tunnel else s.host
123-
port = manager.local_bind_port if manager.use_ssh_tunnel else s.port
122+
if args and isinstance(args, list):
123+
def get_arg(val):
124+
if val in args and args.index(val) + 1 < len(args):
125+
return args[args.index(val) + 1]
126+
return None
127+
host, port = get_arg('--host'), get_arg('--port')
128+
else:
129+
from pgadmin.utils.driver import get_driver
130+
driver = get_driver(PG_DEFAULT_DRIVER)
131+
manager = driver.connection_manager(self.sid)
132+
133+
host = manager.local_bind_host if manager.use_ssh_tunnel \
134+
else s.host
135+
port = manager.local_bind_port if manager.use_ssh_tunnel \
136+
else s.port
124137

125-
return "{0} ({1}:{2})".format(s.name, host, port)
138+
return f"{s.name} ({': '.join(map(str, filter(None, [
139+
f'{gettext('Service')}: {s.service}' if s.service else None,
140+
host,
141+
port
142+
])))})"
126143

127144
@property
128145
def type_desc(self):
@@ -159,6 +176,7 @@ def message(self):
159176
return "Unknown Backup"
160177

161178
def details(self, cmd, args):
179+
self.arg_list = args
162180
server_name = self.get_server_name()
163181
backup_type = gettext("Backup")
164182
if self.backup_type == BACKUP.OBJECT:
@@ -199,19 +217,21 @@ def _get_args_params_values(data, conn, backup_obj_type, backup_file, server,
199217
from pgadmin.utils.driver import get_driver
200218
driver = get_driver(PG_DEFAULT_DRIVER)
201219

202-
host, port = (manager.local_bind_host, str(manager.local_bind_port)) \
203-
if manager.use_ssh_tunnel else (server.host, str(server.port))
204-
args = [
205-
'--file',
206-
backup_file,
207-
'--host',
208-
host,
209-
'--port',
210-
port,
211-
'--username',
212-
manager.user,
213-
'--no-password'
214-
]
220+
host, port = (manager.local_bind_host, manager.local_bind_port) \
221+
if manager.use_ssh_tunnel else (server.host, server.port)
222+
223+
args = ['--file', backup_file]
224+
225+
if host:
226+
args.extend(['--host', host])
227+
228+
if port:
229+
args.extend(['--port', str(port)])
230+
231+
if manager.user:
232+
args.extend(['--username', manager.user])
233+
234+
args.append('--no-password')
215235

216236
def set_param(key, param, assertion=True):
217237
if not assertion:

web/pgadmin/tools/restore/__init__.py

Lines changed: 50 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ def __init__(self, _sid, _bfile, *_args, **_kwargs):
6464
self.bfile = _bfile
6565
self.database = _kwargs['database'] if 'database' in _kwargs else None
6666
self.cmd = ''
67+
self.arg_list = None
6768

6869
def cmd_arg(x):
6970
if x:
@@ -86,19 +87,35 @@ def cmd_arg(x):
8687
self.cmd += cmd_arg(arg)
8788

8889
def get_server_name(self):
90+
args = self.arg_list
8991
s = get_server(self.sid)
9092

9193
if s is None:
9294
return _("Not available")
9395

94-
from pgadmin.utils.driver import get_driver
95-
driver = get_driver(PG_DEFAULT_DRIVER)
96-
manager = driver.connection_manager(self.sid)
96+
host, port = None, None
9797

98-
host = manager.local_bind_host if manager.use_ssh_tunnel else s.host
99-
port = manager.local_bind_port if manager.use_ssh_tunnel else s.port
98+
if args and isinstance(args, list):
99+
def get_arg(val):
100+
if val in args and args.index(val) + 1 < len(args):
101+
return args[args.index(val) + 1]
102+
return None
103+
host, port = get_arg('--host'), get_arg('--port')
104+
else:
105+
from pgadmin.utils.driver import get_driver
106+
driver = get_driver(PG_DEFAULT_DRIVER)
107+
manager = driver.connection_manager(self.sid)
108+
109+
host = manager.local_bind_host if manager.use_ssh_tunnel \
110+
else s.host
111+
port = manager.local_bind_port if manager.use_ssh_tunnel \
112+
else s.port
100113

101-
return "{0} ({1}:{2})".format(s.name, host, port)
114+
return f"{s.name} ({': '.join(map(str, filter(None, [
115+
f'{_('Service')}: {s.service}' if s.service else None,
116+
host,
117+
port
118+
])))})"
102119

103120
@property
104121
def message(self):
@@ -110,6 +127,7 @@ def type_desc(self):
110127
return _("Restoring backup on the server")
111128

112129
def details(self, cmd, args):
130+
self.arg_list = args
113131
return {
114132
"message": self.message,
115133
"cmd": cmd + self.cmd,
@@ -274,14 +292,19 @@ def get_restore_util_args(data, manager, server, driver, conn, filepath):
274292
if 'list' in data:
275293
args.append('--list')
276294
else:
277-
args.extend([
278-
'--host',
279-
manager.local_bind_host if manager.use_ssh_tunnel else server.host,
280-
'--port',
281-
str(manager.local_bind_port) if manager.use_ssh_tunnel
282-
else str(server.port),
283-
'--username', server.username, '--no-password'
284-
])
295+
host = manager.local_bind_host if manager.use_ssh_tunnel \
296+
else server.host
297+
port = manager.local_bind_port if manager.use_ssh_tunnel \
298+
else server.port
299+
300+
if host:
301+
args.extend(['--host', host])
302+
if port:
303+
args.extend(['--port', str(port)])
304+
if server.username:
305+
args.extend(['--username', server.username])
306+
307+
args.append('--no-password')
285308

286309
set_value('role', '--role', data, args)
287310
set_value('database', '--dbname', data, args)
@@ -357,17 +380,23 @@ def get_sql_util_args(data, manager, server, filepath):
357380
:return: args list.
358381
"""
359382
restrict_key = secrets.token_hex(32)
383+
host = manager.local_bind_host if manager.use_ssh_tunnel \
384+
else server.host
385+
port = manager.local_bind_port if manager.use_ssh_tunnel \
386+
else server.port
360387
args = [
361-
'--host',
362-
manager.local_bind_host if manager.use_ssh_tunnel else server.host,
363-
'--port',
364-
str(manager.local_bind_port) if manager.use_ssh_tunnel
365-
else str(server.port),
366-
'--username', server.username, '--dbname',
367-
data['database'],
388+
'--dbname', data['database'],
368389
'-c', f'\\restrict {restrict_key}',
369390
'--file', fs_short_path(filepath)
370391
]
392+
if host:
393+
args.extend(['--host', host])
394+
395+
if port:
396+
args.extend(['--port', str(port)])
397+
398+
if server.username:
399+
args.extend(['--username', server.username])
371400

372401
return args
373402

0 commit comments

Comments
 (0)