def filename_with_file_manager_path(_file, _present=False): """ Args: file: File name returned from client file manager Returns: Filename to use for backup with full path taken from preference """ # Set file manager directory from preference storage_dir = get_storage_directory() if storage_dir: _file = os.path.join(storage_dir, _file.lstrip(u'/').lstrip(u'\\')) elif not os.path.isabs(_file): _file = os.path.join(document_dir(), _file) if not _present: # Touch the file to get the short path of the file on windows. with open(_file, 'a'): return fs_short_path(_file) else: if not os.path.isfile(_file): return None return fs_short_path(_file)
def filename_with_file_manager_path(_file, create_file=True): """ Args: file: File name returned from client file manager create_file: Set flag to False when file creation doesn't required Returns: Filename to use for backup with full path taken from preference """ # Set file manager directory from preference storage_dir = get_storage_directory() if storage_dir: _file = os.path.join(storage_dir, _file.lstrip(u'/').lstrip(u'\\')) elif not os.path.isabs(_file): _file = os.path.join(document_dir(), _file) if create_file: # Touch the file to get the short path of the file on windows. with open(_file, 'a'): pass short_path = fs_short_path(_file) # fs_short_path() function may return empty path on Windows # if directory doesn't exists. In that case we strip the last path # component and get the short path. if os.name == 'nt' and short_path == '': base_name = os.path.basename(_file) dir_name = os.path.dirname(_file) short_path = fs_short_path(dir_name) + '\\' + base_name return short_path
def short_filepath(): short_path = fs_short_path(_file) # fs_short_path() function may return empty path on Windows # if directory doesn't exists. In that case we strip the last path # component and get the short path. if os.name == 'nt' and short_path == '': base_name = os.path.basename(_file) dir_name = os.path.dirname(_file) short_path = fs_short_path(dir_name) + '\\' + base_name return short_path
def filename_with_file_manager_path(_file, _present=False): """ Args: file: File name returned from client file manager Returns: Filename to use for backup with full path taken from preference """ # Set file manager directory from preference storage_dir = get_storage_directory() if storage_dir: _file = os.path.join(storage_dir, _file.lstrip(u'/').lstrip(u'\\')) elif not os.path.isabs(_file): _file = os.path.join(document_dir(), _file) if not _present: # Touch the file to get the short path of the file on windows. with open(_file, 'a'): pass else: if not os.path.isfile(_file): return None return fs_short_path(_file)
def filename_with_file_manager_path(_file): """ Args: file: File name returned from client file manager Returns: Filename to use for backup with full path taken from preference """ # Set file manager directory from preference storage_dir = get_storage_directory() if storage_dir: _file = os.path.join(storage_dir, _file.lstrip(u'/').lstrip(u'\\')) elif not os.path.isabs(_file): _file = os.path.join(document_dir(), _file) if not os.path.isfile(_file) and not os.path.exists(_file): return None return fs_short_path(_file)
def filename_with_file_manager_path(_file): """ Args: file: File name returned from client file manager Returns: Filename to use for backup with full path taken from preference """ # Set file manager directory from preference storage_dir = get_storage_directory() if storage_dir: _file = os.path.join(storage_dir, _file.lstrip(u'/').lstrip(u'\\')) elif not os.path.isabs(_file): _file = os.path.join(document_dir(), _file) if not os.path.isfile(_file): return None return fs_short_path(_file)
def filename_with_file_manager_path(_file, create_file=True): """ Args: file: File name returned from client file manager create_file: Set flag to False when file creation doesn't required Returns: Filename to use for backup with full path taken from preference """ # Set file manager directory from preference storage_dir = get_storage_directory() if storage_dir: _file = os.path.join(storage_dir, _file.lstrip(u'/').lstrip(u'\\')) elif not os.path.isabs(_file): _file = os.path.join(document_dir(), _file) if create_file: # Touch the file to get the short path of the file on windows. with open(_file, 'a'): pass return fs_short_path(_file)
# APP_VERSION_INT for cache busting on version upgrade. If the value is set as # None or empty string then it will not be added. # eg - http:localhost:5050/pgadmin.css?intver=3.13 APP_VERSION_PARAM = 'ver' # Add the internal version param to below extensions only APP_VERSION_EXTN = ('.css', '.js', '.html', '.svg', '.png', '.gif', '.ico') # Data directory for storage of config settings etc. This shouldn't normally # need to be changed - it's here as various other settings depend on it. # On Windows, we always store data in %APPDATA%\pgAdmin. On other platforms, # if we're in server mode we use /var/lib/pgadmin, otherwise ~/.pgadmin if IS_WIN: # Use the short path on windows DATA_DIR = os.path.realpath( os.path.join(fs_short_path(env('APPDATA')), u"pgAdmin")) else: if SERVER_MODE: DATA_DIR = '/var/lib/pgadmin' else: DATA_DIR = os.path.realpath(os.path.expanduser(u'~/.pgadmin/')) ########################################################################## # Log settings ########################################################################## # Debug mode? DEBUG = False # Application log level - one of: # CRITICAL 50
def create_restore_job(sid): """ Args: sid: Server ID Creates a new job for restore task Returns: None """ if request.form: # Convert ImmutableDict to dict data = dict(request.form) data = json.loads(data['data'][0], encoding='utf-8') else: data = json.loads(request.data, encoding='utf-8') try: _file = filename_with_file_manager_path(data['file']) except Exception as e: return bad_request(errormsg=str(e)) if _file is None: return make_json_response( status=410, success=0, errormsg=_("File could not be found.") ) # Fetch the server details like hostname, port, roles etc server = Server.query.filter_by( id=sid ).first() if server is None: return make_json_response( success=0, errormsg=_("Could not find the specified server.") ) # To fetch MetaData for the server from pgadmin.utils.driver import get_driver driver = get_driver(PG_DEFAULT_DRIVER) manager = driver.connection_manager(server.id) conn = manager.connection() connected = conn.connected() if not connected: return make_json_response( success=0, errormsg=_("Please connect to the server first.") ) utility = manager.utility('restore') args = [] if 'list' in data: args.append('--list') else: def set_param(key, param): if key in data and data[key]: args.append(param) return True return False def set_value(key, param, default_value=None): if key in data and data[key] is not None and data[key] != '': args.append(param) args.append(data[key]) elif default_value is not None: args.append(param) args.append(default_value) def set_multiple(key, param, with_schema=True): if key in data: if len(data[key]) > 0: if with_schema: # TODO:// This is temporary # Once object tree is implemented then we will use # list of tuples 'else' part if isinstance(data[key], list): s, t = data[key] args.extend([ param, driver.qtIdent( conn, s ) + '.' + driver.qtIdent(conn, t) ]) else: for s, o in data[key]: args.extend([ param, driver.qtIdent( conn, s ) + '.' + driver.qtIdent(conn, o) ]) else: for o in data[key]: args.extend([param, o]) return True return False 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' ]) set_value('role', '--role') set_value('database', '--dbname') if data['format'] == 'directory': args.extend(['--format=d']) set_param('pre_data', '--section=pre-data') set_param('data', '--section=data') set_param('post_data', '--section=post-data') if not set_param('only_data', '--data-only'): set_param('dns_owner', '--no-owner') set_param('dns_privilege', '--no-privileges') set_param('dns_tablespace', '--no-tablespaces') if not set_param('only_schema', '--schema-only'): set_param('disable_trigger', '--disable-triggers') set_param('include_create_database', '--create') set_param('clean', '--clean') set_param('single_transaction', '--single-transaction') set_param('no_data_fail_table', '--no-data-for-failed-tables') set_param('use_set_session_auth', '--use-set-session-authorization') set_param('exit_on_error', '--exit-on-error') if manager.version >= 110000: set_param('no_comments', '--no-comments') set_value('no_of_jobs', '--jobs') set_param('verbose', '--verbose') set_multiple('schemas', '--schema', False) set_multiple('tables', '--table', False) set_multiple('functions', '--function', False) set_multiple('triggers', '--trigger', False) set_multiple('trigger_funcs', '--function', False) set_multiple('indexes', '--index', False) args.append(fs_short_path(_file)) try: p = BatchProcess( desc=RestoreMessage( sid, data['file'].encode('utf-8') if hasattr( data['file'], 'encode' ) else data['file'], *args ), cmd=utility, args=args ) manager.export_password_env(p.id) # Check for connection timeout and if it is greater than 0 then # set the environment variable PGCONNECT_TIMEOUT. if manager.connect_timeout > 0: env = dict() env['PGCONNECT_TIMEOUT'] = str(manager.connect_timeout) p.set_env_variables(server, env=env) else: p.set_env_variables(server) p.start() jid = p.id except Exception as e: current_app.logger.exception(e) return make_json_response( status=410, success=0, errormsg=str(e) ) # Return response return make_json_response( data={'job_id': jid, 'Success': 1} )
def create_restore_job(sid): """ Args: sid: Server ID Creates a new job for restore task Returns: None """ if request.form: # Convert ImmutableDict to dict data = dict(request.form) data = json.loads(data['data'][0], encoding='utf-8') else: data = json.loads(request.data, encoding='utf-8') try: _file = filename_with_file_manager_path(data['file']) except Exception as e: return bad_request(errormsg=str(e)) if _file is None: return make_json_response(success=0, errormsg=_("File couldn't be found!")) # Fetch the server details like hostname, port, roles etc server = Server.query.filter_by(id=sid).first() if server is None: return make_json_response( success=0, errormsg=_("Could not find the specified server.")) # To fetch MetaData for the server from pgadmin.utils.driver import get_driver driver = get_driver(PG_DEFAULT_DRIVER) manager = driver.connection_manager(server.id) conn = manager.connection() connected = conn.connected() if not connected: return make_json_response( success=0, errormsg=_("Please connect to the server first.")) utility = manager.utility('restore') args = [] if 'list' in data: args.append('--list') else: def set_param(key, param): if key in data and data[key]: args.append(param) return True return False def set_value(key, param, value): if key in data: if value: if value is True and data[key]: args.append(param) args.append(data[key]) else: args.append(param) args.append(value) return True return False def set_multiple(key, param, with_schema=True): if key in data: if len(data[key]) > 0: if with_schema: # TODO:// This is temporary # Once object tree is implemented then we will use # list of tuples 'else' part if isinstance(data[key], list): s, t = data[key] args.extend([ param, driver.qtIdent(conn, s) + '.' + driver.qtIdent(conn, t) ]) else: for s, o in data[key]: args.extend([ param, driver.qtIdent(conn, s) + '.' + driver.qtIdent(conn, o) ]) else: for o in data[key]: args.extend([param, o]) return True return False args.extend([ '--host', server.host, '--port', str(server.port), '--username', server.username, '--no-password' ]) set_value('role', '--role', True) set_value('database', '--dbname', True) if data['format'] == 'directory': args.extend(['--format=d']) set_value('pre_data', '--section=pre-data', False) set_value('data', '--section=data', False) set_value('post_data', '--section=post-data', False) if not set_param('only_data', '--data-only'): set_param('dns_owner', '--no-owner') set_param('dns_privilege ', '--no-privileges') set_param('dns_tablespace', '--no-tablespaces') if not set_param('only_schema', '--schema-only'): set_param('disable_trigger', '--disable-triggers') set_param('include_create_database', '--create') set_param('clean', '--clean') set_param('single_transaction', '--single-transaction') set_param('no_data_fail_table ', '--no-data-for-failed-tables') set_param('use_set_session_auth ', '--use-set-session-authorization') set_param('exit_on_error', '--exit-on-error') set_value('no_of_jobs', '--jobs', True) set_param('verbose', '--verbose') set_multiple('schemas', '--schema', False) set_multiple('tables', '--table', False) set_multiple('functions', '--function', False) set_multiple('triggers', '--trigger', False) set_multiple('trigger_funcs', '--function', False) set_multiple('indexes', '--index', False) args.append(fs_short_path(_file)) try: p = BatchProcess(desc=RestoreMessage( sid, data['file'].encode('utf-8') if hasattr( data['file'], 'encode') else data['file'], *args), cmd=utility, args=args) manager.export_password_env(p.id) p.start() jid = p.id except Exception as e: current_app.logger.exception(e) return make_json_response(status=410, success=0, errormsg=str(e)) # Return response return make_json_response(data={'job_id': jid, 'Success': 1})
def _set_args_param_values(data, manager, server, driver, conn, _file): """ add args to the list. :param data: Data. :param manager: Manager. :param server: Server. :param driver: Driver. :param conn: Connection. :param _file: File. :return: args list. """ args = [] 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' ]) set_value('role', '--role', data, args) set_value('database', '--dbname', data, args) if data['format'] == 'directory': args.extend(['--format=d']) set_param('pre_data', '--section=pre-data', data, args) set_param('data', '--section=data', data, args) set_param('post_data', '--section=post-data', data, args) if not set_param('only_data', '--data-only', data, args): set_param('dns_owner', '--no-owner', data, args) set_param('dns_privilege', '--no-privileges', data, args) set_param('dns_tablespace', '--no-tablespaces', data, args) if not set_param('only_schema', '--schema-only', data, args): set_param('disable_trigger', '--disable-triggers', data, args) set_param('include_create_database', '--create', data, args) set_param('clean', '--clean', data, args) set_param('single_transaction', '--single-transaction', data, args) set_param('no_data_fail_table', '--no-data-for-failed-tables', data, args) set_param('use_set_session_auth', '--use-set-session-authorization', data, args) set_param('exit_on_error', '--exit-on-error', data, args) if manager.version >= 110000: set_param('no_comments', '--no-comments', data, args) set_value('no_of_jobs', '--jobs', data, args) set_param('verbose', '--verbose', data, args) set_multiple('schemas', '--schema', data, args, driver, conn, False) set_multiple('tables', '--table', data, args, driver, conn, False) set_multiple('functions', '--function', data, args, driver, conn, False) set_multiple('triggers', '--trigger', data, args, driver, conn, False) set_multiple('trigger_funcs', '--function', data, args, driver, conn, False) set_multiple('indexes', '--index', data, args, driver, conn, False) args.append(fs_short_path(_file)) return args
## the below CAN NOT BE SET TO AN EMPTY LIST # WTF_CSRF_HEADERS: List[str] = [] # ['X-pgA-CSRFToken'] UPGRADE_CHECK_ENABLED = str.lower(env('PGADMIN_CONFIG_UPGRADE_CHECK_ENABLED')) == "true" USER_INACTIVITY_TIMEOUT = 0 SESSION_EXPIRATION_TIME = 365 DEFAULT_SERVER = '127.0.0.1' DEFAULT_SERVER_PORT = int(env('PGADMIN_LISTEN_PORT')) # Note: this has no effect since I am hosting it as a WSGI application UPGRADE_CHECK_KEY = 'pgadmin4' ###### PATHS ###### SQLITE_PATH = os.path.realpath(env('PGADMIN_SQLITE_PATH')) SESSION_DB_PATH = os.path.realpath( os.path.join(fs_short_path(env('PGADMIN_DATA_DIR')), "sessions")) STORAGE_DIR = os.path.realpath( os.path.join(fs_short_path(env('PGADMIN_DATA_DIR')), "storage")) DEFAULT_BINARY_PATHS = {"pg": "C:\\pgsql\\bin", "ppas": "", "gpdb": ""} DATA_DIR = os.path.realpath( fs_short_path(env('PGADMIN_DATA_DIR') ) ) ###### Basic ####### APP_NAME = env('PGADMIN_CONFIG_APP_NAME') loginBanner = env('PGADMIN_CONFIG_LOGIN_BANNER') if ( loginBanner is not None ): LOGIN_BANNER = loginBanner ###### logging ###### # https://www.pgadmin.org/faq/#8 # Application log level - one of:
# longer part of the main configuration, but are stored in the # configuration databases 'keys' table and are auto-generated. # Should HTML be minified on the fly when not in debug mode? # NOTE: The HTMLMIN module doesn't work with Python 2.6, so this option # has no effect on <= Python 2.7. MINIFY_PAGE = True # Data directory for storage of config settings etc. This shouldn't normally # need to be changed - it's here as various other settings depend on it. # On Windows, we always store data in %APPDATA%\pgAdmin. On other platforms, # if we're in server mode we use /var/lib/pgadmin, otherwise ~/.pgadmin if IS_WIN: # Use the short path on windows DATA_DIR = os.path.realpath( os.path.join(fs_short_path(env('APPDATA')), u"pgAdmin") ) else: if SERVER_MODE: DATA_DIR = '/var/lib/pgadmin' else: DATA_DIR = os.path.realpath(os.path.expanduser(u'~/.pgadmin/')) ########################################################################## # Log settings ########################################################################## # Debug mode? DEBUG = False