diff --git a/ArqRestoreCommand.m b/ArqRestoreCommand.m index fcfe1b1..60d0e36 100644 --- a/ArqRestoreCommand.m +++ b/ArqRestoreCommand.m @@ -42,8 +42,6 @@ @interface ArqRestoreCommand (internal) - (BOOL)validateS3Keys:(NSError **)error; -- (NSArray *)s3BucketNames:(NSError **)error; -- (NSString *)s3BucketNameForRegion:(int)s3BucketRegion; @end @implementation ArqRestoreCommand @@ -80,10 +78,7 @@ if (![self validateS3Keys:error]) { return NO; } - NSArray *s3BucketNames = [self s3BucketNames:error]; - if (s3BucketNames == nil) { - return NO; - } + NSArray *s3BucketNames = [S3Service s3BucketNamesForAccessKeyID:accessKey]; NSMutableArray *computerUUIDPaths = [NSMutableArray array]; for (NSString *s3BucketName in s3BucketNames) { NSString *computerUUIDPrefix = [NSString stringWithFormat:@"/%@/", s3BucketName]; @@ -172,20 +167,4 @@ } return YES; } -- (NSArray *)s3BucketNames:(NSError **)error { - return [NSArray arrayWithObjects: - [self s3BucketNameForRegion:BUCKET_REGION_US_STANDARD], - [self s3BucketNameForRegion:BUCKET_REGION_US_WEST], - [self s3BucketNameForRegion:BUCKET_REGION_EU], - nil]; -} -- (NSString *)s3BucketNameForRegion:(int)s3BucketRegion { - NSString *regionSuffix = @""; - if (s3BucketRegion == BUCKET_REGION_US_WEST) { - regionSuffix = @".us-west-1"; - } else if (s3BucketRegion == BUCKET_REGION_EU) { - regionSuffix = @".eu"; - } - return [NSString stringWithFormat:@"%@.com.haystacksoftware.arq%@", [accessKey lowercaseString], regionSuffix]; -} @end diff --git a/arq_restore.m b/arq_restore.m index aa75a78..fb8e254 100644 --- a/arq_restore.m +++ b/arq_restore.m @@ -36,6 +36,7 @@ #import "ArqFolder.h" static void printUsage(const char *exeName) { + fprintf(stderr, "Usage:\n"); fprintf(stderr, "\t%s\n", exeName); fprintf(stderr, "\t%s /s3bucket/computerUUID/folderUUID\n", exeName); } diff --git a/s3/S3Service.h b/s3/S3Service.h index 3020ab3..9128482 100644 --- a/s3/S3Service.h +++ b/s3/S3Service.h @@ -39,7 +39,8 @@ enum { BUCKET_REGION_US_STANDARD = 0, BUCKET_REGION_US_WEST = 1, - BUCKET_REGION_EU = 2 + BUCKET_REGION_EU = 2, + BUCKET_REGION_AP_SOUTHEAST_1 = 3 }; @interface S3Service : NSObject { @@ -50,6 +51,8 @@ enum { + (NSString *)errorDomain; + (NSString *)serverErrorDomain; + (NSString *)displayNameForBucketRegion:(int)region; ++ (NSString *)s3BucketNameForAccessKeyID:(NSString *)theAccessKeyId region:(int)s3BucketRegion; ++ (NSArray *)s3BucketNamesForAccessKeyID:(NSString *)theAccessKeyId; - (id)initWithS3AuthorizationProvider:(S3AuthorizationProvider *)theSAP useSSL:(BOOL)useSSL retryOnNetworkError:(BOOL)retry; - (NSArray *)s3BucketNames:(NSError **)error; - (BOOL)s3BucketExists:(NSString *)s3BucketName; diff --git a/s3/S3Service.m b/s3/S3Service.m index ab4f827..8e7fa81 100644 --- a/s3/S3Service.m +++ b/s3/S3Service.m @@ -69,12 +69,33 @@ return @"US Standard"; case BUCKET_REGION_US_WEST: return @"US West"; + case BUCKET_REGION_AP_SOUTHEAST_1: + return @"Asia Pacific (Singapore)"; case BUCKET_REGION_EU: return @"EU"; } NSAssert(NO, @"invalid S3 bucket region"); return nil; } ++ (NSString *)s3BucketNameForAccessKeyID:(NSString *)theAccessKeyID region:(int)s3BucketRegion { + NSString *regionSuffix = @""; + if (s3BucketRegion == BUCKET_REGION_US_WEST) { + regionSuffix = @".us-west-1"; + } else if (s3BucketRegion == BUCKET_REGION_AP_SOUTHEAST_1) { + regionSuffix = @".ap-southeast-1"; + } else if (s3BucketRegion == BUCKET_REGION_EU) { + regionSuffix = @".eu"; + } + return [NSString stringWithFormat:@"%@.com.haystacksoftware.arq%@", [theAccessKeyID lowercaseString], regionSuffix]; +} ++ (NSArray *)s3BucketNamesForAccessKeyID:(NSString *)theAccessKeyId { + return [NSArray arrayWithObjects: + [S3Service s3BucketNameForAccessKeyID:theAccessKeyId region:BUCKET_REGION_US_STANDARD], + [S3Service s3BucketNameForAccessKeyID:theAccessKeyId region:BUCKET_REGION_US_WEST], + [S3Service s3BucketNameForAccessKeyID:theAccessKeyId region:BUCKET_REGION_EU], + [S3Service s3BucketNameForAccessKeyID:theAccessKeyId region:BUCKET_REGION_AP_SOUTHEAST_1], + nil]; +} - (id)initWithS3AuthorizationProvider:(S3AuthorizationProvider *)theSAP useSSL:(BOOL)isUseSSL retryOnNetworkError:(BOOL)retry { if (self = [super init]) { sap = [theSAP retain];