diff options
author | Subodh Ranadive <subodh.ranadive@ekzero.com> | 2021-03-04 14:53:05 +0530 |
---|---|---|
committer | Subodh Ranadive <subodh.ranadive@ekzero.com> | 2021-03-24 15:30:31 +0530 |
commit | 9cc97bf816e166f8d5c43d4aadee24105a9e317d (patch) | |
tree | 3ed17f90cd582c7cc5e9f7e95f4fc20a4b6cecea | |
parent | be87b57c22b385bfc317d4e3e18e43877f46ca9b (diff) | |
download | trackermap-server-9cc97bf816e166f8d5c43d4aadee24105a9e317d.tar.gz trackermap-server-9cc97bf816e166f8d5c43d4aadee24105a9e317d.tar.bz2 trackermap-server-9cc97bf816e166f8d5c43d4aadee24105a9e317d.zip |
feature : added support of AWS SNS messaging
-rw-r--r-- | build.gradle | 1 | ||||
-rw-r--r-- | pom.xml | 5 | ||||
-rw-r--r-- | src/main/java/org/traccar/Context.java | 5 | ||||
-rw-r--r-- | src/main/java/org/traccar/config/Keys.java | 30 | ||||
-rw-r--r-- | src/main/java/org/traccar/sms/SnsSmsClient.java | 68 |
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" } @@ -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 |