Skip to content

Commit a9789b6

Browse files
Fix pgAdmin fails when performing Backup/Restore on a PostgreSQL connection defined exclusively via pg_service.conf. #9553
1 parent 5edab2f commit a9789b6

File tree

2 files changed

+99
-42
lines changed

2 files changed

+99
-42
lines changed

web/pgadmin/tools/backup/__init__.py

Lines changed: 44 additions & 20 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,39 @@ 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
124-
125-
return "{0} ({1}:{2})".format(s.name, host, 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
137+
138+
return "{0} ({1})".format(
139+
s.name,
140+
': '.join(map(str, filter(None, [
141+
'{0}: {1}'.format(gettext('Service'), s.service)
142+
if s.service else None,
143+
host,
144+
port
145+
])))
146+
) if (s.service or host or port) else s.name
126147

127148
@property
128149
def type_desc(self):
@@ -159,6 +180,7 @@ def message(self):
159180
return "Unknown Backup"
160181

161182
def details(self, cmd, args):
183+
self.arg_list = args
162184
server_name = self.get_server_name()
163185
backup_type = gettext("Backup")
164186
if self.backup_type == BACKUP.OBJECT:
@@ -199,19 +221,21 @@ def _get_args_params_values(data, conn, backup_obj_type, backup_file, server,
199221
from pgadmin.utils.driver import get_driver
200222
driver = get_driver(PG_DEFAULT_DRIVER)
201223

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-
]
224+
host, port = (manager.local_bind_host, manager.local_bind_port) \
225+
if manager.use_ssh_tunnel else (server.host, server.port)
226+
227+
args = ['--file', backup_file]
228+
229+
if host:
230+
args.extend(['--host', host])
231+
232+
if port:
233+
args.extend(['--port', str(port)])
234+
235+
if manager.user:
236+
args.extend(['--username', manager.user])
237+
238+
args.append('--no-password')
215239

216240
def set_param(key, param, assertion=True):
217241
if not assertion:

web/pgadmin/tools/restore/__init__.py

Lines changed: 55 additions & 22 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,39 @@ 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
100-
101-
return "{0} ({1}:{2})".format(s.name, host, 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
113+
114+
return "{0} ({1})".format(
115+
s.name,
116+
': '.join(map(str, filter(None, [
117+
'{0}: {1}'.format(_('Service'), s.service)
118+
if s.service else None,
119+
host,
120+
port
121+
])))
122+
) if (s.service or host or port) else s.name
102123

103124
@property
104125
def message(self):
@@ -110,6 +131,7 @@ def type_desc(self):
110131
return _("Restoring backup on the server")
111132

112133
def details(self, cmd, args):
134+
self.arg_list = args
113135
return {
114136
"message": self.message,
115137
"cmd": cmd + self.cmd,
@@ -274,14 +296,19 @@ def get_restore_util_args(data, manager, server, driver, conn, filepath):
274296
if 'list' in data:
275297
args.append('--list')
276298
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-
])
299+
host = manager.local_bind_host if manager.use_ssh_tunnel \
300+
else server.host
301+
port = manager.local_bind_port if manager.use_ssh_tunnel \
302+
else server.port
303+
304+
if host:
305+
args.extend(['--host', host])
306+
if port:
307+
args.extend(['--port', str(port)])
308+
if server.username:
309+
args.extend(['--username', server.username])
310+
311+
args.append('--no-password')
285312

286313
set_value('role', '--role', data, args)
287314
set_value('database', '--dbname', data, args)
@@ -357,17 +384,23 @@ def get_sql_util_args(data, manager, server, filepath):
357384
:return: args list.
358385
"""
359386
restrict_key = secrets.token_hex(32)
387+
host = manager.local_bind_host if manager.use_ssh_tunnel \
388+
else server.host
389+
port = manager.local_bind_port if manager.use_ssh_tunnel \
390+
else server.port
360391
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'],
392+
'--dbname', data['database'],
368393
'-c', f'\\restrict {restrict_key}',
369394
'--file', fs_short_path(filepath)
370395
]
396+
if host:
397+
args.extend(['--host', host])
398+
399+
if port:
400+
args.extend(['--port', str(port)])
401+
402+
if server.username:
403+
args.extend(['--username', server.username])
371404

372405
return args
373406

0 commit comments

Comments
 (0)