aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSubodh Ranadive <subodh.ranadive@ekzero.com>2021-03-04 14:53:05 +0530
committerSubodh Ranadive <subodh.ranadive@ekzero.com>2021-03-24 15:30:31 +0530
commit9cc97bf816e166f8d5c43d4aadee24105a9e317d (patch)
tree3ed17f90cd582c7cc5e9f7e95f4fc20a4b6cecea
parentbe87b57c22b385bfc317d4e3e18e43877f46ca9b (diff)
downloadtraccar-server-9cc97bf816e166f8d5c43d4aadee24105a9e317d.tar.gz
traccar-server-9cc97bf816e166f8d5c43d4aadee24105a9e317d.tar.bz2
traccar-server-9cc97bf816e166f8d5c43d4aadee24105a9e317d.zip
feature : added support of AWS SNS messaging
-rw-r--r--build.gradle1
-rw-r--r--pom.xml5
-rw-r--r--src/main/java/org/traccar/Context.java5
-rw-r--r--src/main/java/org/traccar/config/Keys.java30
-rw-r--r--src/main/java/org/traccar/sms/SnsSmsClient.java68
5 files changed, 109 insertions, 0 deletions
diff --git a/build.gradle b/build.gradle
index 83c762d4d..cf0113290 100644
--- a/build.gradle
+++ b/build.gradle
@@ -77,6 +77,7 @@ dependencies {
implementation "com.sun.xml.bind:jaxb-core:2.3.0.1"
implementation "com.sun.xml.bind:jaxb-impl:2.3.3"
implementation "javax.activation:activation:1.1.1"
+ implementation 'com.amazonaws:aws-java-sdk-sns:1.11.692'
testImplementation "junit:junit:4.13.1"
}
diff --git a/pom.xml b/pom.xml
index 49c0895d1..c90bdc96e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -263,6 +263,11 @@
<artifactId>jackson-module-jaxb-annotations</artifactId>
<version>2.12.1</version>
</dependency>
+ <dependency>
+ <groupId>com.amazonaws</groupId>
+ <artifactId>aws-java-sdk</artifactId>
+ <version>1.11.967</version>
+ </dependency>
</dependencies>
diff --git a/src/main/java/org/traccar/Context.java b/src/main/java/org/traccar/Context.java
index 3ba8843f0..0dce70b93 100644
--- a/src/main/java/org/traccar/Context.java
+++ b/src/main/java/org/traccar/Context.java
@@ -60,6 +60,7 @@ import org.traccar.reports.model.TripsConfig;
import org.traccar.schedule.ScheduleManager;
import org.traccar.sms.HttpSmsClient;
import org.traccar.sms.SmsManager;
+import org.traccar.sms.SnsSmsClient;
import org.traccar.web.WebServer;
import javax.ws.rs.client.Client;
@@ -319,6 +320,10 @@ public final class Context {
smsManager = new HttpSmsClient();
}
+ if (config.hasKey(Keys.AWS_SNS_ENABLED)) {
+ smsManager = new SnsSmsClient();
+ }
+
initEventsModule();
serverManager = new ServerManager();
diff --git a/src/main/java/org/traccar/config/Keys.java b/src/main/java/org/traccar/config/Keys.java
index 5f8b36c6d..423c6a31b 100644
--- a/src/main/java/org/traccar/config/Keys.java
+++ b/src/main/java/org/traccar/config/Keys.java
@@ -688,6 +688,36 @@ public final class Keys {
Collections.singletonList(KeyType.GLOBAL));
/**
+ * AWS Access Key with SNS permission.
+ */
+ public static final ConfigKey<String> AWS_ACCESS_KEY = new ConfigKey<>(
+ "aws.access_key",
+ Collections.singletonList(KeyType.GLOBAL));
+
+ /**
+ * AWS Secret Access Key with SNS permission.
+ */
+ public static final ConfigKey<String> AWS_SECRET_KEY = new ConfigKey<>(
+ "aws.secret_key",
+ Collections.singletonList(KeyType.GLOBAL));
+
+ /**
+ * SNS Enable switch.
+ * Use 'enable' to send message with SNS or 'disable' to stop using SNS
+ */
+ public static final ConfigKey<String> AWS_SNS_ENABLED = new ConfigKey<>(
+ "aws.sns_enabled",
+ Collections.singletonList(KeyType.GLOBAL));
+
+ /**
+ * AWS Region for SNS service.
+ * Make sure to use regions that are supported for messaging.
+ */
+ public static final ConfigKey<String> AWS_REGION = new ConfigKey<>(
+ "aws.region",
+ Collections.singletonList(KeyType.GLOBAL));
+
+ /**
* Traccar notification API key.
*/
public static final ConfigKey<String> NOTIFICATOR_TRACCAR_KEY = new ConfigKey<>(
diff --git a/src/main/java/org/traccar/sms/SnsSmsClient.java b/src/main/java/org/traccar/sms/SnsSmsClient.java
new file mode 100644
index 000000000..07814efa5
--- /dev/null
+++ b/src/main/java/org/traccar/sms/SnsSmsClient.java
@@ -0,0 +1,68 @@
+package org.traccar.sms;
+
+import com.amazonaws.auth.AWSStaticCredentialsProvider;
+import com.amazonaws.auth.BasicAWSCredentials;
+import com.amazonaws.services.sns.AmazonSNS;
+import com.amazonaws.services.sns.AmazonSNSClientBuilder;
+import com.amazonaws.services.sns.model.MessageAttributeValue;
+import com.amazonaws.services.sns.model.PublishRequest;
+import com.amazonaws.services.sns.model.PublishResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.traccar.Context;
+import org.traccar.config.Keys;
+import org.traccar.notification.MessageException;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class SnsSmsClient implements SmsManager{
+ private static final Logger LOGGER = LoggerFactory.getLogger(SnsSmsClient.class);
+
+ private final String access_key;
+ private final String secret_key;
+ private final String region;
+
+ private final String sns_status;
+ private final AmazonSNS snsClient;
+
+ public SnsSmsClient() {
+ access_key = Context.getConfig().getString(Keys.AWS_ACCESS_KEY);
+ secret_key = Context.getConfig().getString(Keys.AWS_SECRET_KEY);
+ sns_status = Context.getConfig().getString(Keys.AWS_SNS_ENABLED);
+ region = Context.getConfig().getString(Keys.AWS_REGION);
+ snsClient = awsSNSClient(access_key, secret_key, region);
+
+ if (!sns_status.equals("true") || access_key == null || secret_key == null || region == null) {
+ LOGGER.error("SNS Not Configured Properly. Please provide valid config.");
+ }
+ }
+
+ public AmazonSNS awsSNSClient(String access_key, String secret_key, String region) {
+ BasicAWSCredentials awsCreds = new BasicAWSCredentials(access_key, secret_key);
+ return AmazonSNSClientBuilder.standard().withRegion(region)
+ .withCredentials(new AWSStaticCredentialsProvider(awsCreds)).build();
+ }
+
+ public void sendSNSMessage(String message, String destAddress) {
+ Map<String, MessageAttributeValue> smsAttributes = new HashMap<>();
+ smsAttributes.put("AWS.SNS.SMS.SenderID",
+ new MessageAttributeValue().withStringValue("VegitOne").withDataType("String"));
+ smsAttributes.put("AWS.SNS.SMS.SMSType",
+ new MessageAttributeValue().withStringValue("Transactional").withDataType("String"));
+
+ PublishResult result = this.snsClient.publish(new PublishRequest().withMessage(message)
+ .withPhoneNumber(destAddress).withMessageAttributes(smsAttributes));
+ }
+
+ @java.lang.Override
+ public void sendMessageSync(String destAddress, String message, boolean command) throws InterruptedException, MessageException {
+ sendSNSMessage(message, destAddress);
+ }
+
+ @java.lang.Override
+ public void sendMessageAsync(String destAddress, String message, boolean command) {
+ sendSNSMessage(message, destAddress);
+ }
+} \ No newline at end of file