diff --git a/ArqRestoreCommand.h b/ArqRestoreCommand.h index c874331..1bed128 100644 --- a/ArqRestoreCommand.h +++ b/ArqRestoreCommand.h @@ -38,7 +38,8 @@ NSString *secretKey; NSString *encryptionPassword; S3Service *s3; + NSString *path; } -- (BOOL)printArqFolders:(NSError **)error; -- (BOOL)restorePath:(NSString *)path error:(NSError **)error; +- (BOOL)readArgc:(int)argc argv:(const char **)argv; +- (BOOL)execute:(NSError **)error; @end diff --git a/ArqRestoreCommand.m b/ArqRestoreCommand.m index 60d0e36..8600382 100644 --- a/ArqRestoreCommand.m +++ b/ArqRestoreCommand.m @@ -40,7 +40,10 @@ #import "HTTP.h" #import "Restorer.h" + @interface ArqRestoreCommand (internal) +- (BOOL)printArqFolders:(NSError **)error; +- (BOOL)restorePath:(NSError **)error; - (BOOL)validateS3Keys:(NSError **)error; @end @@ -72,13 +75,48 @@ [secretKey release]; [encryptionPassword release]; [s3 release]; + [path release]; [super dealloc]; } +- (BOOL)readArgc:(int)argc argv:(const char **)argv { + for (int i = 1; i < argc; i++) { + if (*argv[i] == '-') { + if (strcmp(argv[i], "-l")) { + fprintf(stderr, "invalid argument\n"); + return NO; + } + if (argc <= i+1) { + fprintf(stderr, "missing log_level argument (error,warn,info,debug or trace)\n"); + return NO; + } + i++; + NSString *level = [NSString stringWithUTF8String:argv[i]]; + setHSLogLevel(hsLogLevelForName(level)); + } else if (path == nil) { + path = [[NSString alloc] initWithUTF8String:argv[i]]; + } else { + fprintf(stderr, "warning: ignoring argument '%s'\n", argv[i]); + } + } + return YES; +} +- (BOOL)execute:(NSError **)error { + BOOL ret = YES; + if (path == nil) { + ret = [self printArqFolders:error]; + } else { + ret = [self restorePath:error]; + } + return ret; +} +@end + +@implementation ArqRestoreCommand (internal) - (BOOL)printArqFolders:(NSError **)error { if (![self validateS3Keys:error]) { return NO; } - NSArray *s3BucketNames = [S3Service s3BucketNamesForAccessKeyID:accessKey]; + NSArray *s3BucketNames = [S3Service s3BucketNamesForAccessKeyID:accessKey]; NSMutableArray *computerUUIDPaths = [NSMutableArray array]; for (NSString *s3BucketName in s3BucketNames) { NSString *computerUUIDPrefix = [NSString stringWithFormat:@"/%@/", s3BucketName]; @@ -118,7 +156,7 @@ } return YES; } -- (BOOL)restorePath:(NSString *)path error:(NSError **)error { +- (BOOL)restorePath:(NSError **)error { if (![self validateS3Keys:error]) { return NO; } @@ -153,9 +191,6 @@ printf("restored files are in %s\n", [bucketName fileSystemRepresentation]); return YES; } -@end - -@implementation ArqRestoreCommand (internal) - (BOOL)validateS3Keys:(NSError **)error { if (accessKey == nil) { SETNSERROR(@"ArqErrorDomain", -1, @"missing ARQ_ACCESS_KEY environment variable"); diff --git a/arq_restore.m b/arq_restore.m index fb8e254..1e5c0c2 100644 --- a/arq_restore.m +++ b/arq_restore.m @@ -37,32 +37,25 @@ 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); + fprintf(stderr, "\t%s [-l log_level]\n", exeName); + fprintf(stderr, "\t%s [-l log_level] /s3bucket/computerUUID/folderUUID\n", exeName); } -int main (int argc, const char * argv[]) { +int main (int argc, const char **argv) { setHSLogLevel(HSLOG_LEVEL_ERROR); char *exePath = strdup(argv[0]); char *exeName = basename(exePath); NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; ArqRestoreCommand *cmd = [[[ArqRestoreCommand alloc] init] autorelease]; int ret = 0; - NSError *error = nil; - if (argc == 1) { - if (![cmd printArqFolders:&error]) { - NSLog(@"%@", [error localizedDescription]); - ret = 1; - } else { - printf("\nType %s to restore\n", exeName); - } - } else if (argc == 2) { - if (![cmd restorePath:[NSString stringWithUTF8String:argv[1]] error:&error]) { - NSLog(@"%@", [error localizedDescription]); - ret = 1; - } - } else { + if (![cmd readArgc:argc argv:argv]) { printUsage(exeName); ret = 1; + } else { + NSError *myError = nil; + if (![cmd execute:&myError]) { + NSLog(@"%@", [myError localizedDescription]); + ret = 1; + } } [pool drain]; free(exePath);