From f758822cab9c7f64c1363602dec96d7d69dd1e85 Mon Sep 17 00:00:00 2001 From: Jeremy Fee Date: Sat, 20 Feb 2021 13:44:19 -0700 Subject: [PATCH] Add AwsProductSender urls for CLIProductBuilder, update ProductResender to resign if key provided --- .../usgs/earthquake/aws/AwsProductSender.java | 4 +++ .../distribution/CLIProductBuilder.java | 20 +++++++++----- .../distribution/ProductResender.java | 26 ++++++++++++++++++- 3 files changed, 42 insertions(+), 8 deletions(-) diff --git a/src/main/java/gov/usgs/earthquake/aws/AwsProductSender.java b/src/main/java/gov/usgs/earthquake/aws/AwsProductSender.java index a491209d..61f03066 100644 --- a/src/main/java/gov/usgs/earthquake/aws/AwsProductSender.java +++ b/src/main/java/gov/usgs/earthquake/aws/AwsProductSender.java @@ -55,6 +55,10 @@ public class AwsProductSender extends DefaultConfigurable implements ProductSend public AwsProductSender() {} + public AwsProductSender(URL url) { + this.hubUrl = url; + } + @Override public void configure(Config config) throws Exception { super.configure(config); diff --git a/src/main/java/gov/usgs/earthquake/distribution/CLIProductBuilder.java b/src/main/java/gov/usgs/earthquake/distribution/CLIProductBuilder.java index 9b6d1533..b83dee1d 100644 --- a/src/main/java/gov/usgs/earthquake/distribution/CLIProductBuilder.java +++ b/src/main/java/gov/usgs/earthquake/distribution/CLIProductBuilder.java @@ -3,6 +3,7 @@ */ package gov.usgs.earthquake.distribution; +import gov.usgs.earthquake.aws.AwsProductSender; import gov.usgs.earthquake.product.ByteContent; import gov.usgs.earthquake.product.FileContent; import gov.usgs.earthquake.product.InputStreamContent; @@ -427,18 +428,23 @@ public Product buildProduct() throws Exception { public static List parseServers(final String servers, final Integer connectTimeout, final boolean binaryFormat, - final boolean enableDeflate) { + final boolean enableDeflate) throws Exception { List senders = new ArrayList(); Iterator iter = StringUtils.split(servers, ",").iterator(); while (iter.hasNext()) { String server = iter.next(); - String[] parts = server.split(":"); - SocketProductSender sender = new SocketProductSender(parts[0], - Integer.parseInt(parts[1]), connectTimeout); - sender.setBinaryFormat(binaryFormat); - sender.setEnableDeflate(enableDeflate); - senders.add(sender); + if (server.startsWith("https://")) { + AwsProductSender sender = new AwsProductSender(new URL(server)); + senders.add(sender); + } else { + String[] parts = server.split(":"); + SocketProductSender sender = new SocketProductSender(parts[0], + Integer.parseInt(parts[1]), connectTimeout); + sender.setBinaryFormat(binaryFormat); + sender.setEnableDeflate(enableDeflate); + senders.add(sender); + } } return senders; diff --git a/src/main/java/gov/usgs/earthquake/distribution/ProductResender.java b/src/main/java/gov/usgs/earthquake/distribution/ProductResender.java index b7c9eb70..dd73bfeb 100644 --- a/src/main/java/gov/usgs/earthquake/distribution/ProductResender.java +++ b/src/main/java/gov/usgs/earthquake/distribution/ProductResender.java @@ -3,19 +3,23 @@ import java.io.BufferedReader; import java.io.File; import java.io.InputStreamReader; +import java.security.PrivateKey; import java.util.Iterator; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; +import gov.usgs.earthquake.aws.AwsProductSender; import gov.usgs.earthquake.product.Product; import gov.usgs.earthquake.product.io.IOUtil; import gov.usgs.earthquake.product.io.ObjectProductHandler; import gov.usgs.earthquake.product.io.ProductSource; +import gov.usgs.util.CryptoUtils; +import gov.usgs.util.FileUtils; /** * A utility class to (re)send an existing product to pdl hubs. - * + * * Mainly used when one server has not received a product, in order to * redistribute the product. */ @@ -26,6 +30,7 @@ public class ProductResender { public static final String SERVERS_ARGUMENT = "--servers="; public static final String BATCH_ARGUMENT = "--batch"; + public static final String PRIVATE_KEY_ARGUMENT = "--privateKey="; public static void main(final String[] args) throws Exception { // disable tracker @@ -37,6 +42,7 @@ public static void main(final String[] args) throws Exception { boolean binaryFormat = false; boolean enableDeflate = true; boolean batchMode = false; + PrivateKey privateKey = null; for (String arg : args) { if (arg.startsWith(IOUtil.INFILE_ARGUMENT)) { @@ -51,6 +57,14 @@ public static void main(final String[] args) throws Exception { enableDeflate = false; } else if (arg.equals(BATCH_ARGUMENT)) { batchMode = true; + } else if (arg.startsWith(PRIVATE_KEY_ARGUMENT)) { + privateKey = CryptoUtils.readOpenSSHPrivateKey( + FileUtils.readFile(new File(arg.replace(PRIVATE_KEY_ARGUMENT, ""))), + null); + if (privateKey == null) { + LOGGER.warning("Unable to parse private key " + arg); + System.exit(1); + } } } @@ -67,6 +81,16 @@ public static void main(final String[] args) throws Exception { builder.getProductSenders().addAll( CLIProductBuilder.parseServers(servers, 15000, binaryFormat, enableDeflate)); + if (privateKey != null) { + // resign products + for (ProductSender sender : builder.getProductSenders()) { + if (sender instanceof AwsProductSender) { + AwsProductSender awsSender = (AwsProductSender) sender; + awsSender.setPrivateKey(privateKey); + awsSender.setSignProducts(true);; + } + } + } if ((!batchMode && product == null) || builder.getProductSenders().size() == 0) { System.err.println("Usage: ProductResender --servers=SERVERLIST"