diff options
author | Anton Tananaev <anton.tananaev@gmail.com> | 2021-03-24 10:21:56 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-24 10:21:56 -0700 |
commit | 75ec3fa275b350edfa9f4dce67e2cc098e684b70 (patch) | |
tree | 9dc25bf0aff2b74cf9b5e3499fd8195311a7e748 /src | |
parent | be87b57c22b385bfc317d4e3e18e43877f46ca9b (diff) | |
parent | f10dabf49aa78c8277680d787837cfe74b9e653c (diff) | |
download | trackermap-server-75ec3fa275b350edfa9f4dce67e2cc098e684b70.tar.gz trackermap-server-75ec3fa275b350edfa9f4dce67e2cc098e684b70.tar.bz2 trackermap-server-75ec3fa275b350edfa9f4dce67e2cc098e684b70.zip |
Merge pull request #4650 from subodhranadive/feature-sns-integration
Amazon SNS integration
Diffstat (limited to 'src')
-rw-r--r-- | src/main/java/org/traccar/Context.java | 3 | ||||
-rw-r--r-- | src/main/java/org/traccar/config/Keys.java | 22 | ||||
-rw-r--r-- | src/main/java/org/traccar/sms/SnsSmsClient.java | 82 |
3 files changed, 107 insertions, 0 deletions
diff --git a/src/main/java/org/traccar/Context.java b/src/main/java/org/traccar/Context.java index 3ba8843f0..fe494dabf 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; @@ -317,6 +318,8 @@ public final class Context { if (config.hasKey(Keys.SMS_HTTP_URL)) { smsManager = new HttpSmsClient(); + } else if (config.hasKey(Keys.SMS_AWS_REGION)) { + smsManager = new SnsSmsClient(); } initEventsModule(); diff --git a/src/main/java/org/traccar/config/Keys.java b/src/main/java/org/traccar/config/Keys.java index 5f8b36c6d..d2e5bbd99 100644 --- a/src/main/java/org/traccar/config/Keys.java +++ b/src/main/java/org/traccar/config/Keys.java @@ -688,6 +688,28 @@ public final class Keys { Collections.singletonList(KeyType.GLOBAL)); /** + * AWS Access Key with SNS permission. + */ + public static final ConfigKey<String> SMS_AWS_ACCESS = new ConfigKey<>( + "sms.aws.access", + Collections.singletonList(KeyType.GLOBAL)); + + /** + * AWS Secret Access Key with SNS permission. + */ + public static final ConfigKey<String> SMS_AWS_SECRET = new ConfigKey<>( + "sms.aws.secret", + Collections.singletonList(KeyType.GLOBAL)); + + /** + * AWS Region for SNS service. + * Make sure to use regions that are supported for messaging. + */ + public static final ConfigKey<String> SMS_AWS_REGION = new ConfigKey<>( + "sms.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..bdd4104f5 --- /dev/null +++ b/src/main/java/org/traccar/sms/SnsSmsClient.java @@ -0,0 +1,82 @@ +/* + * Copyright 2021 Anton Tananaev (anton@traccar.org) + * Copyright 2021 Subodh Ranadive (subodhranadive3103@gmail.com) + * + * 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 org.traccar.sms; + +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.handlers.AsyncHandler; +import com.amazonaws.services.sns.AmazonSNSAsync; +import com.amazonaws.services.sns.AmazonSNSAsyncClientBuilder; +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 java.util.HashMap; +import java.util.Map; + +public class SnsSmsClient implements SmsManager { + private static final Logger LOGGER = LoggerFactory.getLogger(SnsSmsClient.class); + + private final AmazonSNSAsync snsClient; + + public SnsSmsClient() { + if (Context.getConfig().hasKey(Keys.SMS_AWS_REGION) + && Context.getConfig().hasKey(Keys.SMS_AWS_ACCESS) + && Context.getConfig().hasKey(Keys.SMS_AWS_SECRET)) { + BasicAWSCredentials awsCredentials = + new BasicAWSCredentials(Context.getConfig().getString(Keys.SMS_AWS_ACCESS), + Context.getConfig().getString(Keys.SMS_AWS_SECRET)); + snsClient = AmazonSNSAsyncClientBuilder.standard() + .withRegion(Context.getConfig().getString(Keys.SMS_AWS_REGION)) + .withCredentials(new AWSStaticCredentialsProvider(awsCredentials)).build(); + } else { + throw new RuntimeException("SNS Not Configured Properly. Please provide valid config."); + } + } + + @Override + public void sendMessageSync(String destAddress, String message, boolean command) { + Map<String, MessageAttributeValue> smsAttributes = new HashMap<>(); + smsAttributes.put("AWS.SNS.SMS.SenderID", + new MessageAttributeValue().withStringValue("SNS").withDataType("String")); + smsAttributes.put("AWS.SNS.SMS.SMSType", + new MessageAttributeValue().withStringValue("Transactional").withDataType("String")); + + PublishRequest publishRequest = new PublishRequest().withMessage(message) + .withPhoneNumber(destAddress).withMessageAttributes(smsAttributes); + + snsClient.publishAsync(publishRequest, new AsyncHandler<PublishRequest, PublishResult>() { + @Override + public void onError(Exception exception) { + LOGGER.error("SMS send failed", exception); + } + @Override + public void onSuccess(PublishRequest request, PublishResult result) { + } + }); + } + + @Override + public void sendMessageAsync(String destAddress, String message, boolean command) { + sendMessageSync(destAddress, message, command); + } +} |