/*
* 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());
}
}
}