| /* | |
| * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| package com.cloud.bridge.tool; | |
| import java.io.File; | |
| import java.net.URISyntaxException; | |
| import java.net.URL; | |
| import java.util.Calendar; | |
| import java.util.HashMap; | |
| import java.util.Map; | |
| import javax.activation.DataHandler; | |
| import org.apache.axis2.AxisFault; | |
| import org.apache.log4j.xml.DOMConfigurator; | |
| import com.amazon.s3.client.AmazonS3Stub; | |
| import com.amazon.s3.client.AmazonS3Stub.CreateBucket; | |
| import com.amazon.s3.client.AmazonS3Stub.CreateBucketResponse; | |
| import com.amazon.s3.client.AmazonS3Stub.DeleteBucket; | |
| import com.amazon.s3.client.AmazonS3Stub.DeleteBucketResponse; | |
| import com.amazon.s3.client.AmazonS3Stub.DeleteObject; | |
| import com.amazon.s3.client.AmazonS3Stub.DeleteObjectResponse; | |
| import com.amazon.s3.client.AmazonS3Stub.ListBucket; | |
| import com.amazon.s3.client.AmazonS3Stub.ListBucketResponse; | |
| import com.amazon.s3.client.AmazonS3Stub.ListBucketResult; | |
| import com.amazon.s3.client.AmazonS3Stub.ListEntry; | |
| import com.amazon.s3.client.AmazonS3Stub.PrefixEntry; | |
| import com.amazon.s3.client.AmazonS3Stub.PutObjectInline; | |
| import com.amazon.s3.client.AmazonS3Stub.PutObjectInlineResponse; | |
| import com.amazon.s3.client.AmazonS3Stub.Status; | |
| /** | |
| * @author Kelven Yang | |
| */ | |
| public class CloudS3CmdTool { | |
| private String serviceUrl; | |
| private AmazonS3Stub serviceStub; | |
| private static void configLog4j() { | |
| URL configUrl = System.class.getResource("/conf/log4j-cloud-bridge.xml"); | |
| if(configUrl == null) | |
| configUrl = ClassLoader.getSystemResource("log4j-cloud-bridge.xml"); | |
| if(configUrl == null) | |
| configUrl = ClassLoader.getSystemResource("conf/log4j-cloud-bridge.xml"); | |
| if(configUrl != null) { | |
| try { | |
| System.out.println("Configure log4j using " + configUrl.toURI().toString()); | |
| } catch (URISyntaxException e1) { | |
| e1.printStackTrace(); | |
| } | |
| try { | |
| File file = new File(configUrl.toURI()); | |
| System.out.println("Log4j configuration from : " + file.getAbsolutePath()); | |
| DOMConfigurator.configureAndWatch(file.getAbsolutePath(), 10000); | |
| } catch (URISyntaxException e) { | |
| System.out.println("Unable to convert log4j configuration Url to URI"); | |
| } | |
| } else { | |
| System.out.println("Configure log4j with default properties"); | |
| } | |
| } | |
| private static Map<String, String> getNamedParameters(String[] args) { | |
| Map<String, String> params = new HashMap<String, String>(); | |
| for(int i = 1; i < args.length; i++) { | |
| if(args[i].charAt(0) == '-') { | |
| String[] tokens = args[i].substring(1).split("="); | |
| if(tokens.length == 2) { | |
| params.put(tokens[0], tokens[1]); | |
| } | |
| } | |
| } | |
| return params; | |
| } | |
| private static boolean validateNamedParameters(Map<String, String> params, String... keys) { | |
| for(String key : keys) { | |
| if(params.get(key) == null || params.get(key).isEmpty()) | |
| return false; | |
| } | |
| return true; | |
| } | |
| public static void main(String[] args) { | |
| configLog4j(); | |
| (new CloudS3CmdTool()).run(args); | |
| } | |
| private void run(String[] args) { | |
| Map<String, String> env = System.getenv(); | |
| for (String envName : env.keySet()) { | |
| if(envName.equals("CLOUD_SERVICE_URL")) | |
| serviceUrl = env.get(envName); | |
| } | |
| if(serviceUrl == null) { | |
| System.out.println("Please set CLOUD_SERVICE_URL environment variable"); | |
| System.exit(0); | |
| } | |
| if(args.length < 1) { | |
| System.out.println("Please specify a command to run"); | |
| System.exit(0); | |
| } | |
| try { | |
| serviceStub = new AmazonS3Stub(serviceUrl); | |
| } catch (AxisFault e) { | |
| System.out.println("Unable to initialize service stub"); | |
| e.printStackTrace(); | |
| System.exit(0); | |
| } | |
| // command dispatch | |
| if(args[0].equals("bucket-create")) { | |
| createBucket(args); | |
| } else if(args[0].equals("bucket-delete")) { | |
| deleteBucket(args); | |
| } else if(args[0].equals("bucket-list")) { | |
| listBucket(args); | |
| } else if(args[0].equals("object-put-inline")) { | |
| putObjectInline(args); | |
| } else if(args[0].equals("object-delete")) { | |
| deleteObject(args); | |
| } | |
| } | |
| private void createBucket(String[] args) { | |
| if(args.length < 2) { | |
| System.out.println("Usage: bucket-create <bucket-name>"); | |
| System.exit(0); | |
| } | |
| try { | |
| CreateBucket bucket = new CreateBucket(); | |
| bucket.setBucket(args[1]); | |
| bucket.setAWSAccessKeyId( "TODO1" ); | |
| bucket.setSignature("TODO2"); | |
| bucket.setTimestamp(Calendar.getInstance()); | |
| CreateBucketResponse response = serviceStub.createBucket(bucket); | |
| System.out.println("Bucket " + response.getCreateBucketReturn().getBucketName() + " has been created successfully"); | |
| } catch(Exception e) { | |
| System.out.println("Failed to execute bucket-create due to " + e.getMessage()); | |
| } | |
| } | |
| private void deleteBucket(String[] args) { | |
| if(args.length < 2) { | |
| System.out.println("Usage: bucket-delete <bucket-name>"); | |
| System.exit(0); | |
| } | |
| try { | |
| DeleteBucket request = new DeleteBucket(); | |
| request.setBucket(args[1]); | |
| request.setSignature("TODO"); | |
| request.setTimestamp(Calendar.getInstance()); | |
| DeleteBucketResponse response = serviceStub.deleteBucket(request); | |
| Status status = response.getDeleteBucketResponse(); | |
| if(status.getCode() == 200) { | |
| System.out.println("Bucket " + args[1] + " has been deleted successfully"); | |
| } else { | |
| System.out.println("Unable to delete bucket " + args[1] + " - " + status.getDescription()); | |
| } | |
| } catch(Exception e) { | |
| System.out.println("Failed to execute bucket-delete due to " + e.getMessage()); | |
| } | |
| } | |
| private void listBucket(String[] args) { | |
| if(args.length < 2) { | |
| System.out.println("Usage: bucket-list -prefix=<prefix> -delimiter=<delimiter> -marker=<Marker> -max=<max items to return> <bucket name>"); | |
| System.exit(0); | |
| } | |
| try { | |
| ListBucket request = new ListBucket(); | |
| Map<String, String> params = getNamedParameters(args); | |
| request.setBucket(args[args.length - 1]); | |
| request.setCredential("TODO"); | |
| if(params.get("prefix") != null) | |
| request.setPrefix(params.get("prefix")); | |
| if(params.get("delimiter") != null) | |
| request.setDelimiter(params.get("delimiter")); | |
| if(params.get("marker") != null) | |
| request.setMarker(params.get("marker")); | |
| if(params.get("max") != null) { | |
| try { | |
| int maxKeys = Integer.parseInt(params.get("max")); | |
| request.setMaxKeys(maxKeys); | |
| } catch(Exception e){ | |
| System.out.println("-max parameter should be a numeric value"); | |
| } | |
| } | |
| request.setAWSAccessKeyId("TODO"); | |
| request.setCredential("TODO"); | |
| request.setSignature("TODO"); | |
| request.setTimestamp(Calendar.getInstance()); | |
| ListBucketResponse response = serviceStub.listBucket(request); | |
| ListBucketResult result = response.getListBucketResponse(); | |
| System.out.println("\tContent of Bucket " + result.getName()); | |
| System.out.println("\tListing with prefix: " + result.getPrefix() + ", delimiter: " | |
| + result.getDelimiter() + ", marker: " + result.getMarker() + ", max: " + result.getMaxKeys()); | |
| ListEntry[] entries = result.getContents(); | |
| if(entries != null) { | |
| for(int i = 0; i < entries.length; i++) { | |
| ListEntry entry = entries[i]; | |
| System.out.print("\t"); | |
| System.out.print(entry.getSize()); | |
| System.out.print("\t"); | |
| System.out.print(entry.getKey()); | |
| System.out.print("\t"); | |
| System.out.print(entry.getETag()); | |
| System.out.print("\n"); | |
| } | |
| } | |
| PrefixEntry[] prefixEntries = result.getCommonPrefixes(); | |
| if(prefixEntries != null) { | |
| System.out.print("\n\n"); | |
| for(int i = 0; i < prefixEntries.length; i++) { | |
| System.out.print("\t<Prefix>\t"); | |
| System.out.print(prefixEntries[i].getPrefix()); | |
| System.out.print("\n"); | |
| } | |
| } | |
| } catch(Exception e) { | |
| System.out.println("Failed to execute bucket-list due to " + e.getMessage()); | |
| } | |
| } | |
| private void putObjectInline(String[] args) { | |
| if(args.length < 4) { | |
| System.out.println("Usage: object-put-inline -bucket=<bucket name> -name=<object name> <path to the file>"); | |
| System.exit(0); | |
| } | |
| Map<String, String> params = getNamedParameters(args); | |
| if(!validateNamedParameters(params, "bucket", "name")) { | |
| System.out.println("Usage: object-put-inline -bucket=<bucket name> -name=<object name> <path to the file>"); | |
| System.exit(0); | |
| } | |
| File file = new File(args[args.length -1]); | |
| if(!file.exists()) { | |
| System.out.println("Unable to find file " + args[args.length -1]); | |
| System.exit(0); | |
| } | |
| try { | |
| PutObjectInline request = new PutObjectInline(); | |
| request.setBucket(params.get("bucket")); | |
| request.setKey(params.get("name")); | |
| request.setContentLength(file.length()); | |
| request.setAWSAccessKeyId("TODO"); | |
| request.setCredential("TODO"); | |
| request.setSignature("TODO"); | |
| request.setTimestamp(Calendar.getInstance()); | |
| request.setData(new DataHandler(file.toURL())); | |
| PutObjectInlineResponse response = serviceStub.putObjectInline(request); | |
| System.out.println("Object has been posted successfully. ETag: " + response.getPutObjectInlineResponse().getETag()); | |
| } catch(Exception e) { | |
| System.out.println("Failed to execute object-put-inline due to " + e.getMessage()); | |
| } | |
| } | |
| private void deleteObject(String[] args) { | |
| if(args.length < 3) { | |
| System.out.println("Usage: object-delete -bucket=<bucket name> -name=<object name>"); | |
| System.exit(0); | |
| } | |
| Map<String, String> params = getNamedParameters(args); | |
| if(!validateNamedParameters(params, "bucket", "name")) { | |
| System.out.println("Usage: object-delete -bucket=<bucket name> -name=<object name>"); | |
| System.exit(0); | |
| } | |
| try { | |
| DeleteObject request = new DeleteObject(); | |
| request.setAWSAccessKeyId("TODO"); | |
| request.setBucket(params.get("bucket")); | |
| request.setKey(params.get("name")); | |
| request.setSignature("TODO"); | |
| request.setCredential("TODO"); | |
| request.setTimestamp(Calendar.getInstance()); | |
| DeleteObjectResponse response = serviceStub.deleteObject(request); | |
| if(response.getDeleteObjectResponse().getCode() == 200) | |
| System.out.println("Object " + params.get("name") + " has been deleted successfully"); | |
| else | |
| System.out.println("Object " + params.get("name") + " can not be deleted. Error: " | |
| + response.getDeleteObjectResponse().getCode()); | |
| } catch(Exception e) { | |
| System.out.println("Failed to execute object-delete due to " + e.getMessage()); | |
| } | |
| } | |
| } |