def main(args=None): """ The main script entry point :param list[str] args: the raw arguments list. When not provided it defaults to sys.args[1:] """ config = parse_arguments(args) configure_logging(config) try: cloud_interface = CloudInterface(url=config.source_url, encryption=config.encryption, profile_name=config.profile, endpoint_url=config.endpoint_url) with closing(cloud_interface): catalog = S3BackupCatalog(cloud_interface=cloud_interface, server_name=config.server_name) if not cloud_interface.test_connectivity(): raise SystemExit(1) # If test is requested, just exit after connectivity test elif config.test: raise SystemExit(0) if not cloud_interface.bucket_exists: logging.error("Bucket %s does not exist", cloud_interface.bucket_name) raise SystemExit(1) backup_list = catalog.get_backup_list() # Output if config.format == 'console': COLUMNS = "{:<20}{:<25}{:<30}" print(COLUMNS.format("Backup ID", "End Time", "Begin Wal")) for backup_id in sorted(backup_list): item = backup_list[backup_id] if item and item.status == BackupInfo.DONE: print( COLUMNS.format( item.backup_id, item.end_time.strftime("%Y-%m-%d %H:%M:%S"), item.begin_wal)) else: print( json.dumps({ "backups_list": [ backup_list[backup_id].to_json() for backup_id in sorted(backup_list) ] })) except Exception as exc: logging.error("Barman cloud backup list exception: %s", force_str(exc)) logging.debug('Exception details:', exc_info=exc) raise SystemExit(1)
def test_connectivity(self, boto_mock): """ test the test_connectivity method """ cloud_interface = CloudInterface('s3://bucket/path/to/dir', encryption=None) assert cloud_interface.test_connectivity() is True session_mock = boto_mock.Session.return_value s3_mock = session_mock.resource.return_value client_mock = s3_mock.meta.client client_mock.head_bucket.assert_called_once_with(Bucket='bucket')
def main(args=None): """ The main script entry point :param list[str] args: the raw arguments list. When not provided it defaults to sys.args[1:] """ config = parse_arguments(args) configure_logging(config) try: conninfo = build_conninfo(config) postgres = PostgreSQLConnection(conninfo, config.immediate_checkpoint, application_name='barman_cloud_backup') try: postgres.connect() except PostgresConnectionError as exc: logging.error("Cannot connect to postgres: %s", force_str(exc)) logging.debug('Exception details:', exc_info=exc) raise SystemExit(1) with closing(postgres): cloud_interface = CloudInterface( destination_url=config.destination_url, encryption=config.encryption, jobs=config.jobs, profile_name=config.profile) if not cloud_interface.test_connectivity(): raise SystemExit(1) # If test is requested, just exit after connectivity test elif config.test: raise SystemExit(0) with closing(cloud_interface): # TODO: Should the setup be optional? cloud_interface.setup_bucket() uploader = S3BackupUploader(server_name=config.server_name, compression=config.compression, postgres=postgres, cloud_interface=cloud_interface) # Perform the backup uploader.backup() except KeyboardInterrupt as exc: logging.error("Barman cloud backup was interrupted by the user") logging.debug('Exception details:', exc_info=exc) raise SystemExit(1) except Exception as exc: logging.error("Barman cloud backup exception: %s", force_str(exc)) logging.debug('Exception details:', exc_info=exc) raise SystemExit(1)
def test_connectivity_failure(self, boto_mock): """ test the test_connectivity method in case of failure """ cloud_interface = CloudInterface('s3://bucket/path/to/dir', encryption=None) session_mock = boto_mock.Session.return_value s3_mock = session_mock.resource.return_value client_mock = s3_mock.meta.client # Raise the exception for the "I'm unable to reach amazon" event client_mock.head_bucket.side_effect = EndpointConnectionError( endpoint_url='bucket') assert cloud_interface.test_connectivity() is False
def main(args=None): """ The main script entry point :param list[str] args: the raw arguments list. When not provided it defaults to sys.args[1:] """ config = parse_arguments(args) configure_logging(config) # Validate the destination directory before starting recovery if os.path.exists(config.recovery_dir) and os.listdir(config.recovery_dir): logging.error("Destination %s already exists and it is not empty", config.recovery_dir) raise SystemExit(1) try: cloud_interface = CloudInterface(url=config.source_url, encryption=config.encryption, profile_name=config.profile, endpoint_url=config.endpoint_url) with closing(cloud_interface): downloader = S3BackupDownloader(cloud_interface=cloud_interface, server_name=config.server_name) if not cloud_interface.test_connectivity(): raise SystemExit(1) # If test is requested, just exit after connectivity test elif config.test: raise SystemExit(0) if not cloud_interface.bucket_exists: logging.error("Bucket %s does not exist", cloud_interface.bucket_name) raise SystemExit(1) downloader.download_backup(config.backup_id, config.recovery_dir) except KeyboardInterrupt as exc: logging.error("Barman cloud restore was interrupted by the user") logging.debug('Exception details:', exc_info=exc) raise SystemExit(1) except Exception as exc: logging.error("Barman cloud restore exception: %s", force_str(exc)) logging.debug('Exception details:', exc_info=exc) raise SystemExit(1)
def main(args=None): """ The main script entry point :param list[str] args: the raw arguments list. When not provided it defaults to sys.args[1:] """ config = parse_arguments(args) configure_logging(config) # Validate the WAL file name before downloading it if not is_any_xlog_file(config.wal_name): logging.error('%s is an invalid name for a WAL file' % config.wal_name) raise SystemExit(1) try: cloud_interface = CloudInterface( url=config.source_url, encryption=config.encryption, profile_name=config.profile, endpoint_url=config.endpoint_url) with closing(cloud_interface): downloader = S3WalDownloader( cloud_interface=cloud_interface, server_name=config.server_name) if not cloud_interface.test_connectivity(): raise SystemExit(1) # If test is requested, just exit after connectivity test elif config.test: raise SystemExit(0) if not cloud_interface.bucket_exists: logging.error("Bucket %s does not exist", cloud_interface.bucket_name) raise SystemExit(1) downloader.download_wal(config.wal_name, config.wal_dest) except Exception as exc: logging.error("Barman cloud WAL restore exception: %s", force_str(exc)) logging.debug('Exception details:', exc_info=exc) raise SystemExit(1)
def main(args=None): """ The main script entry point :param list[str] args: the raw arguments list. When not provided it defaults to sys.args[1:] """ config = parse_arguments(args) configure_logging(config) postgres = None try: conninfo = build_conninfo(config) postgres = PostgreSQLConnection(conninfo, config.immediate_checkpoint) cloud_interface = CloudInterface( destination_url=config.destination_url, encryption=config.encryption, profile_name=config.profile) uploader = S3BackupUploader(server_name=config.server_name, compression=config.compression, postgres=postgres, cloud_interface=cloud_interface) # If test is requested just test connectivity and exit # TODO: add postgresql connectivity test if config.test: if cloud_interface.test_connectivity(): raise SystemExit(0) raise SystemExit(1) # TODO: Should the setup be optional? cloud_interface.setup_bucket() # Perform the backup uploader.backup() except Exception as exc: logging.exception("Barman cloud backup exception: %s", exc) raise SystemExit(1) finally: if postgres: postgres.close()
def main(args=None): """ The main script entry point :param list[str] args: the raw arguments list. When not provided it defaults to sys.args[1:] """ config = parse_arguments(args) configure_logging() # Validate the WAL file name before uploading it if not is_any_xlog_file(config.wal_path): logging.error('%s is an invalid name for a WAL file' % config.wal_path) raise SystemExit(1) try: cloud_interface = CloudInterface( destination_url=config.destination_url, encryption=config.encryption, profile_name=config.profile) with closing(cloud_interface): uploader = S3WalUploader( cloud_interface=cloud_interface, server_name=config.server_name, compression=config.compression) if not cloud_interface.test_connectivity(): raise SystemExit(1) # If test is requested, just exit after connectivity test elif config.test: raise SystemExit(0) # TODO: Should the setup be optional? cloud_interface.setup_bucket() uploader.upload_wal(config.wal_path) except Exception as exc: logging.error("Barman cloud WAL archiver exception: %s", force_str(exc)) logging.debug('Exception details:', exc_info=exc) raise SystemExit(1)
def main(args=None): """ The main script entry point :param list[str] args: the raw arguments list. When not provided it defaults to sys.args[1:] """ config = parse_arguments(args) configure_logging() # Validate the WAL file name before uploading it file_name = os.path.basename(config.wal_path) if not is_any_xlog_file(os.path.splitext(file_name)[0]): logging.error('%s is an invalid name for a WAL file' % config.wal_path) raise SystemExit(1) try: cloud_interface = CloudInterface( destination_url=config.destination_url, encryption=config.encryption, profile_name=config.profile) uploader = S3WalUploader(cloud_interface=cloud_interface, server_name=config.server_name, compression=config.compression) # If test is requested just test connectivity and exit if config.test: if cloud_interface.test_connectivity(): raise SystemExit(0) raise SystemExit(1) cloud_interface.setup_bucket() uploader.upload_wal(config.wal_path) except Exception as ex: logging.error("Barman cloud WAL archiver exception: %s", ex) raise SystemExit(1)
def main(args=None): """ The main script entry point :param list[str] args: the raw arguments list. When not provided it defaults to sys.args[1:] """ config = parse_arguments(args) configure_logging(config) tempdir = tempfile.mkdtemp(prefix='barman-cloud-backup-') try: # Create any temporary file in the `tempdir` subdirectory tempfile.tempdir = tempdir conninfo = build_conninfo(config) postgres = PostgreSQLConnection(conninfo, config.immediate_checkpoint, application_name='barman_cloud_backup') try: postgres.connect() except PostgresConnectionError as exc: logging.error("Cannot connect to postgres: %s", force_str(exc)) logging.debug('Exception details:', exc_info=exc) raise SystemExit(1) with closing(postgres): cloud_interface = CloudInterface( url=config.destination_url, encryption=config.encryption, jobs=config.jobs, profile_name=config.profile, endpoint_url=config.endpoint_url) if not cloud_interface.test_connectivity(): raise SystemExit(1) # If test is requested, just exit after connectivity test elif config.test: raise SystemExit(0) with closing(cloud_interface): # TODO: Should the setup be optional? cloud_interface.setup_bucket() uploader = S3BackupUploader( server_name=config.server_name, compression=config.compression, postgres=postgres, max_archive_size=config.max_archive_size, cloud_interface=cloud_interface) # Perform the backup uploader.backup() except KeyboardInterrupt as exc: logging.error("Barman cloud backup was interrupted by the user") logging.debug('Exception details:', exc_info=exc) raise SystemExit(1) except Exception as exc: logging.error("Barman cloud backup exception: %s", force_str(exc)) logging.debug('Exception details:', exc_info=exc) raise SystemExit(1) finally: # Remove the temporary directory and all the contained files rmtree(tempdir, ignore_errors=True)