From eda91aa26cf4bfa62bdb922ca1c9dc019d6f32fa Mon Sep 17 00:00:00 2001 From: Rohit Bhati Date: Fri, 30 Jan 2026 15:23:45 +0530 Subject: [PATCH] Fix pgAdmin fails when performing Backup/Restore on a PostgreSQL connection defined exclusively via pg_service.conf. #9553 --- web/pgadmin/tools/backup/__init__.py | 64 +++++++++++++++------- web/pgadmin/tools/restore/__init__.py | 77 +++++++++++++++++++-------- 2 files changed, 99 insertions(+), 42 deletions(-) diff --git a/web/pgadmin/tools/backup/__init__.py b/web/pgadmin/tools/backup/__init__.py index 16a5866eb6f..8778b9dd459 100644 --- a/web/pgadmin/tools/backup/__init__.py +++ b/web/pgadmin/tools/backup/__init__.py @@ -94,6 +94,7 @@ def __init__(self, _type, _sid, _bfile, *_args, **_kwargs): self.database = _kwargs['database'] if 'database' in _kwargs else None self.cmd = '' self.args_str = "{0} ({1}:{2})" + self.arg_list = None def cmd_arg(x): if x: @@ -110,19 +111,39 @@ def cmd_arg(x): self.cmd += cmd_arg(arg) def get_server_name(self): + args = self.arg_list s = get_server(self.sid) if s is None: return gettext("Not available") - from pgadmin.utils.driver import get_driver - driver = get_driver(PG_DEFAULT_DRIVER) - manager = driver.connection_manager(self.sid) + host, port = None, None - host = manager.local_bind_host if manager.use_ssh_tunnel else s.host - port = manager.local_bind_port if manager.use_ssh_tunnel else s.port - - return "{0} ({1}:{2})".format(s.name, host, port) + if args and isinstance(args, list): + def get_arg(val): + if val in args and args.index(val) + 1 < len(args): + return args[args.index(val) + 1] + return None + host, port = get_arg('--host'), get_arg('--port') + else: + from pgadmin.utils.driver import get_driver + driver = get_driver(PG_DEFAULT_DRIVER) + manager = driver.connection_manager(self.sid) + + host = manager.local_bind_host if manager.use_ssh_tunnel \ + else s.host + port = manager.local_bind_port if manager.use_ssh_tunnel \ + else s.port + + return "{0} ({1})".format( + s.name, + ': '.join(map(str, filter(None, [ + '{0}: {1}'.format(gettext('Service'), s.service) + if s.service else None, + host, + port + ]))) + ) if (s.service or host or port) else s.name @property def type_desc(self): @@ -159,6 +180,7 @@ def message(self): return "Unknown Backup" def details(self, cmd, args): + self.arg_list = args server_name = self.get_server_name() backup_type = gettext("Backup") if self.backup_type == BACKUP.OBJECT: @@ -199,19 +221,21 @@ def _get_args_params_values(data, conn, backup_obj_type, backup_file, server, from pgadmin.utils.driver import get_driver driver = get_driver(PG_DEFAULT_DRIVER) - host, port = (manager.local_bind_host, str(manager.local_bind_port)) \ - if manager.use_ssh_tunnel else (server.host, str(server.port)) - args = [ - '--file', - backup_file, - '--host', - host, - '--port', - port, - '--username', - manager.user, - '--no-password' - ] + host, port = (manager.local_bind_host, manager.local_bind_port) \ + if manager.use_ssh_tunnel else (server.host, server.port) + + args = ['--file', backup_file] + + if host: + args.extend(['--host', host]) + + if port: + args.extend(['--port', str(port)]) + + if manager.user: + args.extend(['--username', manager.user]) + + args.append('--no-password') def set_param(key, param, assertion=True): if not assertion: diff --git a/web/pgadmin/tools/restore/__init__.py b/web/pgadmin/tools/restore/__init__.py index d74e7b5b939..0fce22a9d79 100644 --- a/web/pgadmin/tools/restore/__init__.py +++ b/web/pgadmin/tools/restore/__init__.py @@ -64,6 +64,7 @@ def __init__(self, _sid, _bfile, *_args, **_kwargs): self.bfile = _bfile self.database = _kwargs['database'] if 'database' in _kwargs else None self.cmd = '' + self.arg_list = None def cmd_arg(x): if x: @@ -86,19 +87,39 @@ def cmd_arg(x): self.cmd += cmd_arg(arg) def get_server_name(self): + args = self.arg_list s = get_server(self.sid) if s is None: return _("Not available") - from pgadmin.utils.driver import get_driver - driver = get_driver(PG_DEFAULT_DRIVER) - manager = driver.connection_manager(self.sid) + host, port = None, None - host = manager.local_bind_host if manager.use_ssh_tunnel else s.host - port = manager.local_bind_port if manager.use_ssh_tunnel else s.port - - return "{0} ({1}:{2})".format(s.name, host, port) + if args and isinstance(args, list): + def get_arg(val): + if val in args and args.index(val) + 1 < len(args): + return args[args.index(val) + 1] + return None + host, port = get_arg('--host'), get_arg('--port') + else: + from pgadmin.utils.driver import get_driver + driver = get_driver(PG_DEFAULT_DRIVER) + manager = driver.connection_manager(self.sid) + + host = manager.local_bind_host if manager.use_ssh_tunnel \ + else s.host + port = manager.local_bind_port if manager.use_ssh_tunnel \ + else s.port + + return "{0} ({1})".format( + s.name, + ': '.join(map(str, filter(None, [ + '{0}: {1}'.format(_('Service'), s.service) + if s.service else None, + host, + port + ]))) + ) if (s.service or host or port) else s.name @property def message(self): @@ -110,6 +131,7 @@ def type_desc(self): return _("Restoring backup on the server") def details(self, cmd, args): + self.arg_list = args return { "message": self.message, "cmd": cmd + self.cmd, @@ -274,14 +296,19 @@ def get_restore_util_args(data, manager, server, driver, conn, filepath): if 'list' in data: args.append('--list') else: - args.extend([ - '--host', - manager.local_bind_host if manager.use_ssh_tunnel else server.host, - '--port', - str(manager.local_bind_port) if manager.use_ssh_tunnel - else str(server.port), - '--username', server.username, '--no-password' - ]) + host = manager.local_bind_host if manager.use_ssh_tunnel \ + else server.host + port = manager.local_bind_port if manager.use_ssh_tunnel \ + else server.port + + if host: + args.extend(['--host', host]) + if port: + args.extend(['--port', str(port)]) + if server.username: + args.extend(['--username', server.username]) + + args.append('--no-password') set_value('role', '--role', data, args) set_value('database', '--dbname', data, args) @@ -357,17 +384,23 @@ def get_sql_util_args(data, manager, server, filepath): :return: args list. """ restrict_key = secrets.token_hex(32) + host = manager.local_bind_host if manager.use_ssh_tunnel \ + else server.host + port = manager.local_bind_port if manager.use_ssh_tunnel \ + else server.port args = [ - '--host', - manager.local_bind_host if manager.use_ssh_tunnel else server.host, - '--port', - str(manager.local_bind_port) if manager.use_ssh_tunnel - else str(server.port), - '--username', server.username, '--dbname', - data['database'], + '--dbname', data['database'], '-c', f'\\restrict {restrict_key}', '--file', fs_short_path(filepath) ] + if host: + args.extend(['--host', host]) + + if port: + args.extend(['--port', str(port)]) + + if server.username: + args.extend(['--username', server.username]) return args