| // Licensed to the Apache Software Foundation (ASF) under one | |
| // or more contributor license agreements. See the NOTICE file | |
| // distributed with this work for additional information | |
| // regarding copyright ownership. The ASF licenses this file | |
| // to you 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; | |
| 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()); | |
| } | |
| } | |
| } |