def get_remote_status(self): """ Execute checks for replication-based wal archiving :return dict[str]: result of archive checks """ result = dict.fromkeys( ('pg_receivexlog_compatible', 'pg_receivexlog_installed', 'pg_receivexlog_path', 'pg_receivexlog_version'), None) try: streaming = self.backup_manager.server.streaming pg_version = Version( utils.simplify_version(streaming.server_txt_version)) except (PostgresConnectionError, psycopg2.Error) as e: _logger.warn("Error retrieving PostgreSQL version: %s", e) return result # detect if there is a pg_receivexlog executable pg_receivexlog = utils.which("pg_receivexlog", self.backup_manager.server.path) # Test pg_receivexlog existence if pg_receivexlog: result["pg_receivexlog_installed"] = True result["pg_receivexlog_path"] = pg_receivexlog else: result["pg_receivexlog_installed"] = False return result receivexlog = Command(pg_receivexlog, check=True) # Obtain the `pg_receivexlog` version try: receivexlog("--version") splitter_version = receivexlog.out.strip().split() result["pg_receivexlog_version"] = splitter_version[-1] receivexlog_version = Version( utils.simplify_version(result["pg_receivexlog_version"])) except CommandFailedException as e: _logger.debug("Error invoking pg_receivexlog: %s", e) return result # pg_receivexlog 9.2 is compatible only with PostgreSQL 9.2. if "9.2" == pg_version == receivexlog_version: result["pg_receivexlog_compatible"] = True # other versions are compatible with lesser versions of PostgreSQL # WARNING: The development versions of `pg_receivexlog` are considered # higher than the stable versions here, but this is not an issue # because it accepts everything that is less than # the `pg_receivexlog` version(e.g. '9.6' is less than '9.6devel') elif "9.2" < pg_version <= receivexlog_version: result["pg_receivexlog_compatible"] = True else: result["pg_receivexlog_compatible"] = False return result
def fetch_remote_status(self): """ Execute checks for replication-based wal archiving This method does not raise any exception in case of errors, but set the missing values to None in the resulting dictionary. :rtype: dict[str, None|str] """ result = dict.fromkeys( ('pg_receivexlog_compatible', 'pg_receivexlog_installed', 'pg_receivexlog_path', 'pg_receivexlog_version'), None) # Check the server version from the streaming # connection streaming = self.backup_manager.server.streaming server_txt_version = None if streaming: server_txt_version = streaming.server_txt_version if server_txt_version: pg_version = Version(utils.simplify_version(server_txt_version)) else: # No log here, it has already been logged in the # StreamingConnection class or during the Server initialization pg_version = None # Detect a pg_receivexlog executable pg_receivexlog = utils.which("pg_receivexlog", self.backup_manager.server.path) # Test pg_receivexlog existence if pg_receivexlog: result["pg_receivexlog_installed"] = True result["pg_receivexlog_path"] = pg_receivexlog else: result["pg_receivexlog_installed"] = False return result receivexlog = Command(pg_receivexlog, check=True) # Obtain the `pg_receivexlog` version try: receivexlog("--version") splitter_version = receivexlog.out.strip().split() result["pg_receivexlog_version"] = splitter_version[-1] receivexlog_version = Version( utils.simplify_version(result["pg_receivexlog_version"])) except CommandFailedException as e: receivexlog_version = None _logger.debug("Error invoking pg_receivexlog: %s", e) # If one of the version is unknown we cannot compare them if receivexlog_version is None or pg_version is None: return result # pg_receivexlog 9.2 is compatible only with PostgreSQL 9.2. if "9.2" == pg_version == receivexlog_version: result["pg_receivexlog_compatible"] = True # other versions are compatible with lesser versions of PostgreSQL # WARNING: The development versions of `pg_receivexlog` are considered # higher than the stable versions here, but this is not an issue # because it accepts everything that is less than # the `pg_receivexlog` version(e.g. '9.6' is less than '9.6devel') elif "9.2" < pg_version <= receivexlog_version: result["pg_receivexlog_compatible"] = True else: result["pg_receivexlog_compatible"] = False return result
def fetch_remote_status(self): """ Execute checks for replication-based wal archiving This method does not raise any exception in case of errors, but set the missing values to None in the resulting dictionary. :rtype: dict[str, None|str] """ result = dict.fromkeys( ('pg_receivexlog_compatible', 'pg_receivexlog_installed', 'pg_receivexlog_path', 'pg_receivexlog_version'), None) # Detect a pg_receivexlog executable pg_receivexlog = utils.which("pg_receivexlog", self.backup_manager.server.path) # Test pg_receivexlog existence if pg_receivexlog: result["pg_receivexlog_installed"] = True result["pg_receivexlog_path"] = pg_receivexlog else: result["pg_receivexlog_installed"] = False return result receivexlog = Command(pg_receivexlog, check=True) # Obtain the `pg_receivexlog` version try: receivexlog("--version") splitter_version = receivexlog.out.strip().split() result["pg_receivexlog_version"] = splitter_version[-1] receivexlog_version = Version( utils.simplify_version(result["pg_receivexlog_version"])) except CommandFailedException as e: receivexlog_version = None _logger.debug("Error invoking pg_receivexlog: %s", e) # Retrieve the PostgreSQL versionn pg_version = None if self.server.streaming is not None: pg_version = self.server.streaming.server_major_version # If one of the version is unknown we cannot compare them if receivexlog_version is None or pg_version is None: return result # pg_version is not None so transform into a Version object # for easier comparison between versions pg_version = Version(pg_version) # pg_receivexlog 9.2 is compatible only with PostgreSQL 9.2. if "9.2" == pg_version == receivexlog_version: result["pg_receivexlog_compatible"] = True # other versions are compatible with lesser versions of PostgreSQL # WARNING: The development versions of `pg_receivexlog` are considered # higher than the stable versions here, but this is not an issue # because it accepts everything that is less than # the `pg_receivexlog` version(e.g. '9.6' is less than '9.6devel') elif "9.2" < pg_version <= receivexlog_version: result["pg_receivexlog_compatible"] = True else: result["pg_receivexlog_compatible"] = False return result