├── .github ├── PULL_REQUEST_TEMPLATE.md └── dependabot.yml ├── .gitignore ├── .travis.yml ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── NOTICE ├── README.md ├── build.gradle.kts ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── run.sh └── src ├── main ├── java │ └── com │ │ └── awslabs │ │ └── iot │ │ └── client │ │ ├── applications │ │ ├── Arguments.java │ │ ├── AwsIotClientConsole.java │ │ ├── AwsIotClientModule.java │ │ ├── GreengrassModule.java │ │ ├── GreengrassV2Module.java │ │ ├── Injector.java │ │ ├── IotModule.java │ │ ├── LambdaModule.java │ │ └── LogsModule.java │ │ ├── commandline │ │ └── CommandsCompleter.java │ │ ├── commands │ │ ├── BasicCommandHandlerProvider.java │ │ ├── CommandHandlerProvider.java │ │ ├── connectors │ │ │ └── GetLatestConnectorDefinitionVersionCommandHandlerWithGroupIdCompletion.java │ │ ├── generic │ │ │ ├── ExitCommandHandler.java │ │ │ ├── HelpCommandHandler.java │ │ │ └── QuitCommandHandler.java │ │ ├── greengrass │ │ │ ├── GreengrassCommandHandler.java │ │ │ ├── GreengrassGroupCommandHandlerWithGroupIdAndDeploymentIdCompletion.java │ │ │ ├── GreengrassGroupCommandHandlerWithGroupIdCompletion.java │ │ │ ├── completers │ │ │ │ ├── GreengrassGroupArnCompleter.java │ │ │ │ ├── GreengrassGroupIdAndDeploymentIdCompleter.java │ │ │ │ └── GreengrassGroupIdCompleter.java │ │ │ ├── cores │ │ │ │ └── GetLatestCoreDefinitionVersionCommandHandlerWithGroupIdCompletion.java │ │ │ ├── devices │ │ │ │ └── GetLatestDeviceDefinitionVersionCommandHandlerWithGroupIdCompletion.java │ │ │ ├── functions │ │ │ │ └── GetLatestFunctionDefinitionVersionCommandHandlerWithGroupIdCompletion.java │ │ │ ├── generic │ │ │ │ └── CleanupCommandHandler.java │ │ │ ├── groups │ │ │ │ ├── DeleteAllConnectorDefinitionsCommandHandler.java │ │ │ │ ├── DeleteAllCoreDefinitionsCommandHandler.java │ │ │ │ ├── DeleteAllDeviceDefinitionsCommandHandler.java │ │ │ │ ├── DeleteAllFunctionDefinitionsCommandHandler.java │ │ │ │ ├── DeleteAllGreengrassLambdaFunctionsCommandHandler.java │ │ │ │ ├── DeleteAllGroupsCommandHandler.java │ │ │ │ ├── DeleteAllLoggerDefinitionsCommandHandler.java │ │ │ │ ├── DeleteAllResourceDefinitionsCommandHandler.java │ │ │ │ ├── DeleteAllSubscriptionDefinitionsCommandHandler.java │ │ │ │ ├── DeleteGroupCommandHandlerWithGroupIdCompletion.java │ │ │ │ ├── GetDeploymentStatusCommandHandlerWithGroupIdAndDeploymentIdCompletion.java │ │ │ │ ├── GetLatestDeploymentCommandHandlerWithGroupIdCompletion.java │ │ │ │ ├── GetLatestDeploymentStatusCommandHandlerWithGroupIdCompletion.java │ │ │ │ ├── GetLatestGroupVersionCommandHandlerWithGroupIdCompletion.java │ │ │ │ ├── ListDeploymentsCommandHandlerWithGroupIdCompletion.java │ │ │ │ ├── ListGroupVersionsCommandHandlerWithGroupIdCompletion.java │ │ │ │ └── ListGroupsCommandHandler.java │ │ │ ├── loggers │ │ │ │ └── GetLatestLoggerDefinitionVersionCommandHandlerWithGroupIdCompletion.java │ │ │ ├── resources │ │ │ │ └── GetLatestResourceDefinitionVersionCommandHandlerWithGroupIdCompletion.java │ │ │ └── subscriptions │ │ │ │ └── GetLatestSubscriptionDefinitionVersionCommandHandlerWithGroupIdCompletion.java │ │ ├── greengrassv2 │ │ │ └── greengrass │ │ │ │ ├── GreengrassV2CommandHandler.java │ │ │ │ ├── GreengrassV2CommandHandlerWithCoreNameCompletion.java │ │ │ │ ├── completers │ │ │ │ └── GreengrassV2CoreNameCompleter.java │ │ │ │ └── groups │ │ │ │ ├── DeleteAllCoresV2CommandHandler.java │ │ │ │ └── ListCoresV2CommandHandler.java │ │ ├── iam │ │ │ └── completers │ │ │ │ └── RoleCompleter.java │ │ ├── interfaces │ │ │ └── CommandHandler.java │ │ ├── iot │ │ │ ├── CertificateCommandHandlerWithCompletion.java │ │ │ ├── IotCommandHandler.java │ │ │ ├── PolicyCommandHandlerWithCompletion.java │ │ │ ├── RuleCommandHandlerWithCompletion.java │ │ │ ├── ThingCommandHandlerWithCompletion.java │ │ │ ├── certificates │ │ │ │ ├── CleanUpCertificatesCommandHandler.java │ │ │ │ ├── DeleteAllCaCertificatesCommandHandler.java │ │ │ │ ├── DeleteAllCertificatesCommandHandler.java │ │ │ │ ├── DeleteCertificateCommandHandlerWithCompletion.java │ │ │ │ ├── DeleteUnattachedCertificatesCommandHandlerWithCompletion.java │ │ │ │ ├── ListCertificateArnsCommandHandler.java │ │ │ │ └── ListCertificateIdsCommandHandler.java │ │ │ ├── completers │ │ │ │ ├── CertificateCompleter.java │ │ │ │ ├── PolicyCompleter.java │ │ │ │ ├── RuleCompleter.java │ │ │ │ └── ThingCompleter.java │ │ │ ├── jobs │ │ │ │ └── DeleteAllJobsCommandHandler.java │ │ │ ├── mosh │ │ │ │ ├── BinaryMoshClientCommandHandler.java │ │ │ │ ├── KeyAndPort.java │ │ │ │ ├── MoshClientCommandHandler.java │ │ │ │ ├── MoshDatagramSocket.java │ │ │ │ ├── MoshServerCommandHandler.java │ │ │ │ └── MoshTopics.java │ │ │ ├── policies │ │ │ │ ├── DeleteAllPoliciesCommandHandler.java │ │ │ │ ├── DeletePolicyCommandHandlerWithCompletion.java │ │ │ │ └── ListPoliciesCommandHandler.java │ │ │ ├── publish │ │ │ │ ├── MqttPublishCommandHandler.java │ │ │ │ ├── MqttSubscribeCommandHandler.java │ │ │ │ ├── PublishCommandHandler.java │ │ │ │ ├── RestPublishCommandHandler.java │ │ │ │ └── TestPublishCommandHandler.java │ │ │ ├── rules │ │ │ │ ├── CreateTopicRuleCommandHandler.java │ │ │ │ ├── DeleteTopicRuleCommandHandlerWithCompletion.java │ │ │ │ └── ListTopicRulesCommandHandler.java │ │ │ └── things │ │ │ │ ├── DeleteAllThingGroupsCommandHandler.java │ │ │ │ ├── DeleteAllThingsCommandHandler.java │ │ │ │ ├── DeleteThingCommandHandlerWithCompletion.java │ │ │ │ ├── ListThingPrincipalsCommandHandlerWithCompletion.java │ │ │ │ └── ListThingsCommandHandler.java │ │ ├── lambda │ │ │ └── DeleteLambdaFunctionsCommandHandler.java │ │ └── logs │ │ │ ├── GetLogsCommandHandler.java │ │ │ ├── IotGetLogsCommandHandler.java │ │ │ └── LogsCommandHandler.java │ │ ├── completers │ │ └── DynamicStringsCompleter.java │ │ ├── console │ │ └── AwsIotClientConsoleTerminal.java │ │ ├── helpers │ │ ├── ANSIHelper.java │ │ ├── BasicCandidateHelper.java │ │ ├── CandidateHelper.java │ │ ├── cloudwatch │ │ │ ├── BasicLogsHelper.java │ │ │ └── LogsHelper.java │ │ ├── iot │ │ │ ├── BasicWebsocketsHelper.java │ │ │ └── interfaces │ │ │ │ └── WebsocketsHelper.java │ │ ├── json │ │ │ ├── BasicObjectPrettyPrinter.java │ │ │ └── interfaces │ │ │ │ └── ObjectPrettyPrinter.java │ │ └── progressbar │ │ │ ├── BasicProgressBarHelper.java │ │ │ └── ProgressBarHelper.java │ │ ├── interfaces │ │ └── AwsIotClientTerminal.java │ │ ├── parameters │ │ ├── BasicParameterExtractor.java │ │ └── interfaces │ │ │ └── ParameterExtractor.java │ │ └── streams │ │ └── interfaces │ │ └── UsesStream.java └── resources │ └── log4j.properties └── test └── java ├── MoshClientTest.java └── TestInjector.java /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | *Issue #, if available:* 2 | 3 | *Description of changes:* 4 | 5 | 6 | By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice. 7 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: gradle 4 | directory: "/" 5 | schedule: 6 | interval: daily 7 | open-pull-requests-limit: 10 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /out 2 | /private.key 3 | /client.crt 4 | /certificate.id 5 | /ca.crt 6 | /build 7 | /.gradle 8 | /.idea 9 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: java 2 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | ## Code of Conduct 2 | This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). 3 | For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact 4 | opensource-codeofconduct@amazon.com with any additional questions or comments. 5 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing Guidelines 2 | 3 | Thank you for your interest in contributing to our project. Whether it's a bug report, new feature, correction, or additional 4 | documentation, we greatly value feedback and contributions from our community. 5 | 6 | Please read through this document before submitting any issues or pull requests to ensure we have all the necessary 7 | information to effectively respond to your bug report or contribution. 8 | 9 | 10 | ## Reporting Bugs/Feature Requests 11 | 12 | We welcome you to use the GitHub issue tracker to report bugs or suggest features. 13 | 14 | When filing an issue, please check [existing open](https://github.com/awslabs/aws-iot-client/issues), or [recently closed](https://github.com/awslabs/aws-iot-client/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aclosed%20), issues to make sure somebody else hasn't already 15 | reported the issue. Please try to include as much information as you can. Details like these are incredibly useful: 16 | 17 | * A reproducible test case or series of steps 18 | * The version of our code being used 19 | * Any modifications you've made relevant to the bug 20 | * Anything unusual about your environment or deployment 21 | 22 | 23 | ## Contributing via Pull Requests 24 | Contributions via pull requests are much appreciated. Before sending us a pull request, please ensure that: 25 | 26 | 1. You are working against the latest source on the *master* branch. 27 | 2. You check existing open, and recently merged, pull requests to make sure someone else hasn't addressed the problem already. 28 | 3. You open an issue to discuss any significant work - we would hate for your time to be wasted. 29 | 30 | To send us a pull request, please: 31 | 32 | 1. Fork the repository. 33 | 2. Modify the source; please focus on the specific change you are contributing. If you also reformat all the code, it will be hard for us to focus on your change. 34 | 3. Ensure local tests pass. 35 | 4. Commit to your fork using clear commit messages. 36 | 5. Send us a pull request, answering any default questions in the pull request interface. 37 | 6. Pay attention to any automated CI failures reported in the pull request, and stay involved in the conversation. 38 | 39 | GitHub provides additional document on [forking a repository](https://help.github.com/articles/fork-a-repo/) and 40 | [creating a pull request](https://help.github.com/articles/creating-a-pull-request/). 41 | 42 | 43 | ## Finding contributions to work on 44 | Looking at the existing issues is a great way to find something to contribute on. As our projects, by default, use the default GitHub issue labels (enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any ['help wanted'](https://github.com/awslabs/aws-iot-client/labels/help%20wanted) issues is a great place to start. 45 | 46 | 47 | ## Code of Conduct 48 | This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). 49 | For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact 50 | opensource-codeofconduct@amazon.com with any additional questions or comments. 51 | 52 | 53 | ## Security issue notifications 54 | If you discover a potential security issue in this project we ask that you notify AWS/Amazon Security via our [vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/). Please do **not** create a public github issue. 55 | 56 | 57 | ## Licensing 58 | 59 | See the [LICENSE](https://github.com/awslabs/aws-iot-client/blob/master/LICENSE) file for our project's licensing. We will ask you to confirm the licensing of your contribution. 60 | 61 | We may ask you to sign a [Contributor License Agreement (CLA)](http://en.wikipedia.org/wiki/Contributor_License_Agreement) for larger changes. 62 | -------------------------------------------------------------------------------- /NOTICE: -------------------------------------------------------------------------------- 1 | AWS Iot Client 2 | Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## AWS IoT Client 2 | [![Build Status](https://travis-ci.org/awslabs/aws-iot-client.svg?branch=master)](https://travis-ci.org/awslabs/aws-iot-client) 3 | 4 | A command-line tool that automates several common multi-step operations in the IoT and related services. 5 | 6 | ## License 7 | 8 | This library is licensed under the Apache 2.0 License. 9 | -------------------------------------------------------------------------------- /build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | kotlin("jvm") version "1.6.10" 3 | id("application") 4 | id("java") 5 | id("idea") 6 | id("java-library") 7 | 8 | // Creates fat JAR 9 | id("com.github.johnrengelman.shadow") version "7.1.2" 10 | 11 | // Adds dependencyUpdates task 12 | id("com.github.ben-manes.versions") version "0.41.0" 13 | } 14 | 15 | extensions.findByName("buildScan")?.withGroovyBuilder { 16 | setProperty("termsOfServiceUrl", "https://gradle.com/terms-of-service") 17 | setProperty("termsOfServiceAgree", "yes") 18 | } 19 | 20 | idea.module.isDownloadSources = true 21 | idea.module.isDownloadJavadoc = true 22 | 23 | java.toolchain.languageVersion.set(JavaLanguageVersion.of(11)) 24 | 25 | val gradleDependencyVersion = "7.2" 26 | 27 | application.mainClassName = "com.awslabs.iot.client.applications.AwsIotClientConsole" 28 | 29 | tasks.wrapper { 30 | gradleVersion = gradleDependencyVersion 31 | distributionType = Wrapper.DistributionType.ALL 32 | } 33 | 34 | repositories { 35 | mavenCentral() 36 | mavenLocal() 37 | jcenter() 38 | google() 39 | maven(url = "https://jitpack.io") 40 | // Required for Gradle Tooling API 41 | maven(url = "https://repo.gradle.org/gradle/libs-releases-local/") 42 | } 43 | 44 | tasks.distZip { enabled = false } 45 | tasks.distTar { enabled = false } 46 | tasks.shadowDistZip { enabled = false } 47 | tasks.shadowDistTar { enabled = false } 48 | 49 | tasks.shadowJar { 50 | dependencies { 51 | // Get all of the API dependencies and exclude them 52 | // project.configurations.api.get().allDependencies.forEach { exclude(dependency(it)) } 53 | } 54 | 55 | // Create a shadow JAR with a specific name 56 | archiveName = "aws-iot-client.jar" 57 | } 58 | 59 | val daggerVersion = "2.40.5" 60 | val jcommanderVersion = "1.81" 61 | val awsSdk2Version = "2.17.89" 62 | val gsonVersion = "2.8.9" 63 | val slf4jVersion = "2.0.0-alpha5" 64 | val vertxVersion = "4.2.3" 65 | val jcabiLogVersion = "0.20.1" 66 | val jlineVersion = "3.21.0" 67 | val commonsLang3Version = "3.12.0" 68 | val vavrVersion = "0.10.4" 69 | val junitVersion = "4.13.2" 70 | val resultsIteratorForAwsJavaSdkVersion = "29.0.23" 71 | val awsIotCoreWebsocketsVersion = "4.0.1" 72 | val jodahFailsafeVersion = "2.4.4" 73 | val progressBarVersion = "0.9.2" 74 | val pahoVersion = "1.2.5" 75 | 76 | dependencies { 77 | // Dagger code generation 78 | annotationProcessor("com.google.dagger:dagger-compiler:$daggerVersion") 79 | testAnnotationProcessor("com.google.dagger:dagger-compiler:$daggerVersion") 80 | 81 | // Dependency injection with Dagger 82 | implementation("com.google.dagger:dagger:$daggerVersion") 83 | 84 | implementation("com.google.code.gson:gson:$gsonVersion") 85 | implementation("com.beust:jcommander:$jcommanderVersion") 86 | 87 | implementation("software.amazon.awssdk:greengrass:$awsSdk2Version") 88 | implementation("software.amazon.awssdk:greengrassv2:$awsSdk2Version") 89 | implementation("software.amazon.awssdk:iam:$awsSdk2Version") 90 | implementation("software.amazon.awssdk:iot:$awsSdk2Version") 91 | implementation("software.amazon.awssdk:iotdataplane:$awsSdk2Version") 92 | implementation("software.amazon.awssdk:cloudwatchlogs:$awsSdk2Version") 93 | implementation("software.amazon.awssdk:lambda:$awsSdk2Version") 94 | implementation("software.amazon.awssdk:apache-client:$awsSdk2Version") 95 | 96 | implementation("io.vertx:vertx-core:$vertxVersion") 97 | implementation("org.jline:jline:$jlineVersion") 98 | implementation("org.slf4j:slf4j-log4j12:$slf4jVersion") 99 | implementation("com.jcabi:jcabi-log:$jcabiLogVersion") 100 | implementation("org.apache.commons:commons-lang3:$commonsLang3Version") 101 | implementation("com.github.awslabs:results-iterator-for-aws-java-sdk:$resultsIteratorForAwsJavaSdkVersion") 102 | implementation("com.github.awslabs:aws-iot-core-websockets:$awsIotCoreWebsocketsVersion") 103 | 104 | // Need to explicitly include Paho now 105 | implementation("org.eclipse.paho:org.eclipse.paho.client.mqttv3:$pahoVersion") 106 | 107 | implementation("io.vavr:vavr:$vavrVersion") 108 | implementation("net.jodah:failsafe:$jodahFailsafeVersion") 109 | implementation("me.tongfei:progressbar:$progressBarVersion") 110 | 111 | testImplementation("junit:junit:$junitVersion") 112 | } 113 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/awslabs/aws-iot-client/6a5484e6945271bb682bf7f89fa9c000e7ab579a/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /run.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ./gradlew build && java -Dcom.amazonaws.sdk.disableCbor=true -jar ./build/libs/aws-iot-client.jar $@ 4 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/applications/Arguments.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.applications; 2 | 3 | import com.beust.jcommander.Parameter; 4 | 5 | public class Arguments { 6 | private final String LONG_DANGEROUS_MODE_OPTION_1 = "--dangerousMode"; 7 | private final String LONG_DANGEROUS_MODE_OPTION_2 = "--dangerous-mode"; 8 | 9 | @Parameter(names = {LONG_DANGEROUS_MODE_OPTION_1, LONG_DANGEROUS_MODE_OPTION_2}) 10 | public boolean dangerousMode = false; 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/applications/AwsIotClientConsole.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.applications; 2 | 3 | import com.awslabs.iot.client.interfaces.AwsIotClientTerminal; 4 | import com.beust.jcommander.JCommander; 5 | 6 | public class AwsIotClientConsole { 7 | public static void main(String[] args) throws Exception { 8 | Arguments arguments = new Arguments(); 9 | 10 | JCommander.newBuilder() 11 | .addObject(arguments) 12 | .build() 13 | .parse(args); 14 | 15 | Injector injector = DaggerInjector.create(); 16 | 17 | // Set global arguments 18 | injector.arguments().dangerousMode = arguments.dangerousMode; 19 | 20 | AwsIotClientTerminal awsIotClientTerminal = injector.awsIotClientTerminal(); 21 | awsIotClientTerminal.start(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/applications/AwsIotClientModule.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.applications; 2 | 3 | import com.awslabs.iot.client.commands.BasicCommandHandlerProvider; 4 | import com.awslabs.iot.client.commands.CommandHandlerProvider; 5 | import com.awslabs.iot.client.commands.generic.ExitCommandHandler; 6 | import com.awslabs.iot.client.commands.generic.HelpCommandHandler; 7 | import com.awslabs.iot.client.commands.generic.QuitCommandHandler; 8 | import com.awslabs.iot.client.commands.interfaces.CommandHandler; 9 | import com.awslabs.iot.client.console.AwsIotClientConsoleTerminal; 10 | import com.awslabs.iot.client.helpers.BasicCandidateHelper; 11 | import com.awslabs.iot.client.helpers.CandidateHelper; 12 | import com.awslabs.iot.client.helpers.json.BasicObjectPrettyPrinter; 13 | import com.awslabs.iot.client.helpers.json.interfaces.ObjectPrettyPrinter; 14 | import com.awslabs.iot.client.helpers.progressbar.BasicProgressBarHelper; 15 | import com.awslabs.iot.client.helpers.progressbar.ProgressBarHelper; 16 | import com.awslabs.iot.client.interfaces.AwsIotClientTerminal; 17 | import com.awslabs.iot.client.parameters.BasicParameterExtractor; 18 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 19 | import com.awslabs.iot.data.*; 20 | import com.awslabs.resultsiterator.ResultsIteratorModule; 21 | import dagger.Module; 22 | import dagger.Provides; 23 | import dagger.multibindings.ElementsIntoSet; 24 | import io.vavr.collection.HashSet; 25 | 26 | import javax.inject.Singleton; 27 | import java.util.Set; 28 | 29 | @Module(includes = {GreengrassModule.class, GreengrassV2Module.class, IotModule.class, LogsModule.class, LambdaModule.class, ResultsIteratorModule.class}) 30 | public class AwsIotClientModule { 31 | private static final String CA_CERT_FILENAME = "ca.crt"; 32 | private static final String CLIENT_CERT_FILENAME = "client.crt"; 33 | private static final String CLIENT_PRIVATE_KEY_FILENAME = "private.key"; 34 | private static final String CERTIFICATE_ID_FILENAME = "certificate.id"; 35 | private static final String CLIENT_ID = "aws-iot-client"; 36 | private static final String CLIENT_NAME = "aws-iot-client"; 37 | 38 | // Constants 39 | @Provides 40 | @Singleton 41 | public Arguments arguments() { 42 | return new Arguments(); 43 | } 44 | 45 | @Provides 46 | @Singleton 47 | public CaCertFilename caCertFilename() { 48 | return ImmutableCaCertFilename.builder().caCertFilename(CA_CERT_FILENAME).build(); 49 | } 50 | 51 | @Provides 52 | @Singleton 53 | public ClientCertFilename clientCertFilename() { 54 | return ImmutableClientCertFilename.builder().clientCertFilename(CLIENT_CERT_FILENAME).build(); 55 | } 56 | 57 | @Provides 58 | @Singleton 59 | public ClientPrivateKeyFilename clientPrivateKeyFilename() { 60 | return ImmutableClientPrivateKeyFilename.builder().clientPrivateKeyFilename(CLIENT_PRIVATE_KEY_FILENAME).build(); 61 | } 62 | 63 | @Provides 64 | @Singleton 65 | public CertificateIdFilename certificateIdFilename() { 66 | return ImmutableCertificateIdFilename.builder().certificateIdFilename(CERTIFICATE_ID_FILENAME).build(); 67 | } 68 | 69 | @Provides 70 | @Singleton 71 | public ClientId clientId() { 72 | return ImmutableClientId.builder().clientId(CLIENT_ID).build(); 73 | } 74 | 75 | @Provides 76 | @Singleton 77 | public ClientName clientName() { 78 | return ImmutableClientName.builder().clientName(CLIENT_NAME).build(); 79 | } 80 | 81 | // Normal bindings 82 | @Provides 83 | public CommandHandlerProvider CommandHandlerProvider(BasicCommandHandlerProvider basicCommandHandlerProvider) { 84 | return basicCommandHandlerProvider; 85 | } 86 | 87 | @Provides 88 | public AwsIotClientTerminal awsIotClientTerminal(AwsIotClientConsoleTerminal awsIotClientConsoleTerminal) { 89 | return awsIotClientConsoleTerminal; 90 | } 91 | 92 | @Provides 93 | public CandidateHelper candidateHelper(BasicCandidateHelper basicCandidateHelper) { 94 | return basicCandidateHelper; 95 | } 96 | 97 | @Provides 98 | public ObjectPrettyPrinter objectPrettyPrinter(BasicObjectPrettyPrinter basicObjectPrettyPrinter) { 99 | return basicObjectPrettyPrinter; 100 | } 101 | 102 | @Provides 103 | public ParameterExtractor parameterExtractor(BasicParameterExtractor basicParameterExtractor) { 104 | return basicParameterExtractor; 105 | } 106 | 107 | // Command handler multibindings 108 | @Provides 109 | @ElementsIntoSet 110 | public Set commandHandlerSet(HelpCommandHandler helpCommandHandler, 111 | ExitCommandHandler exitCommandHandler, 112 | QuitCommandHandler quitCommandHandler) { 113 | return HashSet.of( 114 | helpCommandHandler, 115 | exitCommandHandler, 116 | quitCommandHandler) 117 | .toJavaSet(); 118 | } 119 | 120 | @Provides 121 | public ProgressBarHelper progressBarHelper(BasicProgressBarHelper basicProgressBarHelper) { 122 | return basicProgressBarHelper; 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/applications/GreengrassV2Module.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.applications; 2 | 3 | import com.awslabs.iot.client.commands.greengrassv2.greengrass.groups.DeleteAllCoresV2CommandHandler; 4 | import com.awslabs.iot.client.commands.greengrassv2.greengrass.groups.ListCoresV2CommandHandler; 5 | import com.awslabs.iot.client.commands.interfaces.CommandHandler; 6 | import dagger.Module; 7 | import dagger.Provides; 8 | import dagger.multibindings.ElementsIntoSet; 9 | import io.vavr.collection.HashSet; 10 | 11 | import java.util.Set; 12 | 13 | @Module 14 | public class GreengrassV2Module { 15 | @Provides 16 | @ElementsIntoSet 17 | public Set commandHandlerSet(ListCoresV2CommandHandler listCoresV2CommandHandler, 18 | DeleteAllCoresV2CommandHandler deleteAllGroupsCommandHandler) { 19 | return HashSet.of( 20 | listCoresV2CommandHandler, 21 | deleteAllGroupsCommandHandler) 22 | .toJavaSet(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/applications/Injector.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.applications; 2 | 3 | import com.awslabs.iot.client.interfaces.AwsIotClientTerminal; 4 | import dagger.Component; 5 | 6 | import javax.inject.Singleton; 7 | 8 | @Singleton 9 | @Component(modules = AwsIotClientModule.class) 10 | public interface Injector { 11 | AwsIotClientTerminal awsIotClientTerminal(); 12 | 13 | Arguments arguments(); 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/applications/LambdaModule.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.applications; 2 | 3 | import com.awslabs.iot.client.commands.interfaces.CommandHandler; 4 | import com.awslabs.iot.client.commands.lambda.DeleteLambdaFunctionsCommandHandler; 5 | import dagger.Module; 6 | import dagger.Provides; 7 | import dagger.multibindings.ElementsIntoSet; 8 | import io.vavr.collection.HashSet; 9 | 10 | import java.util.Set; 11 | 12 | @Module 13 | public class LambdaModule { 14 | @Provides 15 | @ElementsIntoSet 16 | public Set commandHandlerSet(DeleteLambdaFunctionsCommandHandler deleteLambdaFunctionsCommandHandler) { 17 | return HashSet.of( 18 | deleteLambdaFunctionsCommandHandler) 19 | .toJavaSet(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/applications/LogsModule.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.applications; 2 | 3 | import com.awslabs.iot.client.commands.interfaces.CommandHandler; 4 | import com.awslabs.iot.client.commands.logs.GetLogsCommandHandler; 5 | import com.awslabs.iot.client.commands.logs.IotGetLogsCommandHandler; 6 | import com.awslabs.iot.client.helpers.cloudwatch.BasicLogsHelper; 7 | import com.awslabs.iot.client.helpers.cloudwatch.LogsHelper; 8 | import dagger.Module; 9 | import dagger.Provides; 10 | import dagger.multibindings.ElementsIntoSet; 11 | import io.vavr.collection.HashSet; 12 | import software.amazon.awssdk.services.cloudwatchlogs.CloudWatchLogsClient; 13 | 14 | import java.util.Set; 15 | 16 | @Module 17 | public class LogsModule { 18 | @Provides 19 | public CloudWatchLogsClient cloudWatchLogsClient() { 20 | return CloudWatchLogsClient.create(); 21 | } 22 | 23 | @Provides 24 | public LogsHelper logsHelper(BasicLogsHelper basicLogsHelper) { 25 | return basicLogsHelper; 26 | } 27 | 28 | @Provides 29 | @ElementsIntoSet 30 | public Set commandHandlerSet(GetLogsCommandHandler getLogsCommandHandler, 31 | IotGetLogsCommandHandler iotGetLogsCommandHandler) { 32 | return HashSet.of( 33 | getLogsCommandHandler, 34 | iotGetLogsCommandHandler) 35 | .toJavaSet(); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commandline/CommandsCompleter.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commandline; 2 | 3 | import com.awslabs.iot.client.commands.CommandHandlerProvider; 4 | import com.awslabs.iot.client.commands.interfaces.CommandHandler; 5 | import io.vavr.collection.List; 6 | import org.jline.reader.Candidate; 7 | import org.jline.reader.Completer; 8 | import org.jline.reader.LineReader; 9 | import org.jline.reader.ParsedLine; 10 | import org.jline.reader.impl.completer.AggregateCompleter; 11 | 12 | import javax.inject.Inject; 13 | import java.util.stream.Collectors; 14 | 15 | // Guidance from: https://github.com/jline/jline2/blob/master/src/main/java/jline/console/completer/StringsCompleter.java 16 | public class CommandsCompleter implements Completer { 17 | @Inject 18 | CommandHandlerProvider commandHandlerProvider; 19 | 20 | private AggregateCompleter aggregateCompleter; 21 | 22 | @Inject 23 | public CommandsCompleter() { 24 | } 25 | 26 | private AggregateCompleter getAggregateCompleter() { 27 | if (aggregateCompleter == null) { 28 | // Get all of the completers from the command handlers 29 | List completers = List.ofAll( 30 | commandHandlerProvider.getCommandHandlerSet().stream() 31 | .map(CommandHandler::getCompleter) 32 | .collect(Collectors.toSet())); 33 | 34 | aggregateCompleter = new AggregateCompleter(completers.asJava()); 35 | } 36 | 37 | return aggregateCompleter; 38 | } 39 | 40 | @Override 41 | public void complete(LineReader lineReader, ParsedLine parsedLine, java.util.List candidateList) { 42 | getAggregateCompleter().complete(lineReader, parsedLine, candidateList); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/BasicCommandHandlerProvider.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands; 2 | 3 | import com.awslabs.iot.client.applications.Arguments; 4 | import com.awslabs.iot.client.commands.interfaces.CommandHandler; 5 | 6 | import javax.inject.Inject; 7 | import java.util.Set; 8 | import java.util.stream.Collectors; 9 | 10 | public class BasicCommandHandlerProvider implements CommandHandlerProvider { 11 | @Inject 12 | Arguments arguments; 13 | 14 | @Inject 15 | Set commandHandlerSet; 16 | 17 | @Inject 18 | public BasicCommandHandlerProvider() { 19 | } 20 | 21 | @Override 22 | public Set getCommandHandlerSet() { 23 | if (arguments.dangerousMode) { 24 | return commandHandlerSet; 25 | } 26 | 27 | return commandHandlerSet.stream() 28 | .filter(commandHandler -> !commandHandler.isDangerous()) 29 | .collect(Collectors.toSet()); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/CommandHandlerProvider.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands; 2 | 3 | import com.awslabs.iot.client.commands.interfaces.CommandHandler; 4 | 5 | import java.util.Set; 6 | 7 | public interface CommandHandlerProvider { 8 | Set getCommandHandlerSet(); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/connectors/GetLatestConnectorDefinitionVersionCommandHandlerWithGroupIdCompletion.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.connectors; 2 | 3 | 4 | import com.awslabs.iot.client.commands.greengrass.GreengrassGroupCommandHandlerWithGroupIdCompletion; 5 | import com.awslabs.iot.client.commands.greengrass.completers.GreengrassGroupIdCompleter; 6 | import com.awslabs.iot.client.helpers.json.interfaces.ObjectPrettyPrinter; 7 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 8 | import com.awslabs.iot.data.ImmutableGreengrassGroupId; 9 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 10 | import com.jcabi.log.Logger; 11 | import io.vavr.collection.List; 12 | import io.vavr.control.Option; 13 | import software.amazon.awssdk.services.greengrass.model.ConnectorDefinitionVersion; 14 | import software.amazon.awssdk.services.greengrass.model.GroupInformation; 15 | 16 | import javax.inject.Inject; 17 | 18 | public class GetLatestConnectorDefinitionVersionCommandHandlerWithGroupIdCompletion implements GreengrassGroupCommandHandlerWithGroupIdCompletion { 19 | private static final String GET_LATEST_CONNECTOR_DEFINITION = "get-latest-connector-definition"; 20 | private static final int GROUP_ID_POSITION = 0; 21 | @Inject 22 | GreengrassV1Helper greengrassV1Helper; 23 | @Inject 24 | ObjectPrettyPrinter objectPrettyPrinter; 25 | @Inject 26 | ParameterExtractor parameterExtractor; 27 | @Inject 28 | GreengrassGroupIdCompleter greengrassGroupIdCompleter; 29 | 30 | @Inject 31 | public GetLatestConnectorDefinitionVersionCommandHandlerWithGroupIdCompletion() { 32 | } 33 | 34 | @Override 35 | public void innerHandle(String input) { 36 | List parameters = parameterExtractor.getParameters(input); 37 | 38 | String groupId = parameters.get(GROUP_ID_POSITION); 39 | 40 | Option optionalGroupInformation = greengrassV1Helper.getGroupInformation(ImmutableGreengrassGroupId.builder().groupId(groupId).build()); 41 | 42 | if (optionalGroupInformation.isEmpty()) { 43 | return; 44 | } 45 | 46 | GroupInformation groupInformation = optionalGroupInformation.get(); 47 | 48 | Option optionalConnectorDefinitionVersion = greengrassV1Helper.getConnectorDefinitionVersion(groupInformation); 49 | 50 | if (optionalConnectorDefinitionVersion.isEmpty()) { 51 | Logger.info(this, "No connectors found"); 52 | return; 53 | } 54 | 55 | Logger.info(this, objectPrettyPrinter.prettyPrint(optionalConnectorDefinitionVersion.get())); 56 | } 57 | 58 | @Override 59 | public String getCommandString() { 60 | return GET_LATEST_CONNECTOR_DEFINITION; 61 | } 62 | 63 | @Override 64 | public String getHelp() { 65 | return "Gets the latest connector definition version for a group."; 66 | } 67 | 68 | @Override 69 | public int requiredParameters() { 70 | return 1; 71 | } 72 | 73 | public ParameterExtractor getParameterExtractor() { 74 | return this.parameterExtractor; 75 | } 76 | 77 | public GreengrassGroupIdCompleter getGreengrassGroupIdCompleter() { 78 | return this.greengrassGroupIdCompleter; 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/generic/ExitCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.generic; 2 | 3 | import javax.inject.Inject; 4 | 5 | public class ExitCommandHandler extends QuitCommandHandler { 6 | private static final String EXIT = "exit"; 7 | 8 | @Inject 9 | public ExitCommandHandler() { 10 | } 11 | 12 | @Override 13 | public String getCommandString() { 14 | return EXIT; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/generic/HelpCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.generic; 2 | 3 | 4 | import com.awslabs.iot.client.commands.CommandHandlerProvider; 5 | import com.awslabs.iot.client.commands.interfaces.CommandHandler; 6 | import com.awslabs.iot.client.helpers.ANSIHelper; 7 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 8 | import com.jcabi.log.Logger; 9 | import io.vavr.collection.List; 10 | import io.vavr.collection.Stream; 11 | 12 | import javax.inject.Inject; 13 | import javax.inject.Provider; 14 | import java.util.Comparator; 15 | 16 | public class HelpCommandHandler implements CommandHandler { 17 | private static final String HELP = "help"; 18 | @Inject 19 | Provider commandHandlerProviderProvider; 20 | @Inject 21 | ParameterExtractor parameterExtractor; 22 | 23 | @Inject 24 | public HelpCommandHandler() { 25 | } 26 | 27 | @Override 28 | public void innerHandle(String input) { 29 | StringBuilder stringBuilder = new StringBuilder(); 30 | 31 | stringBuilder.append(ANSIHelper.CRLF); 32 | 33 | List sortedCommandHandlers = Stream.ofAll(commandHandlerProviderProvider.get() 34 | .getCommandHandlerSet()) 35 | .sorted(Comparator.comparing(CommandHandler::getFullCommandString)) 36 | .toList(); 37 | 38 | for (CommandHandler commandHandler : sortedCommandHandlers) { 39 | stringBuilder.append(ANSIHelper.BOLD); 40 | stringBuilder.append(commandHandler.getFullCommandString()); 41 | stringBuilder.append(ANSIHelper.NORMAL); 42 | stringBuilder.append(" - "); 43 | stringBuilder.append(commandHandler.getHelp()); 44 | stringBuilder.append(ANSIHelper.CRLF); 45 | } 46 | 47 | Logger.info(this, stringBuilder.toString()); 48 | } 49 | 50 | @Override 51 | public String getCommandString() { 52 | return HELP; 53 | } 54 | 55 | @Override 56 | public String getHelp() { 57 | return "Gets this help message"; 58 | } 59 | 60 | @Override 61 | public int requiredParameters() { 62 | return 0; 63 | } 64 | 65 | public ParameterExtractor getParameterExtractor() { 66 | return this.parameterExtractor; 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/generic/QuitCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.generic; 2 | 3 | 4 | import com.awslabs.iot.client.commands.interfaces.CommandHandler; 5 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 6 | 7 | import javax.inject.Inject; 8 | 9 | public class QuitCommandHandler implements CommandHandler { 10 | private static final String QUIT = "quit"; 11 | @Inject 12 | ParameterExtractor parameterExtractor; 13 | 14 | @Inject 15 | public QuitCommandHandler() { 16 | } 17 | 18 | @Override 19 | public void innerHandle(String input) { 20 | System.exit(0); 21 | } 22 | 23 | @Override 24 | public String getCommandString() { 25 | return QUIT; 26 | } 27 | 28 | @Override 29 | public String getHelp() { 30 | return "Quits/exits the application"; 31 | } 32 | 33 | @Override 34 | public int requiredParameters() { 35 | return 0; 36 | } 37 | 38 | public ParameterExtractor getParameterExtractor() { 39 | return this.parameterExtractor; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/GreengrassCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass; 2 | 3 | import com.awslabs.iot.client.commands.interfaces.CommandHandler; 4 | 5 | public interface GreengrassCommandHandler extends CommandHandler { 6 | @Override 7 | default String getServiceName() { 8 | return "greengrass"; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/GreengrassGroupCommandHandlerWithGroupIdAndDeploymentIdCompletion.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass; 2 | 3 | import com.awslabs.iot.client.commands.greengrass.completers.GreengrassGroupIdAndDeploymentIdCompleter; 4 | import org.jline.reader.Completer; 5 | import org.jline.reader.impl.completer.ArgumentCompleter; 6 | import org.jline.reader.impl.completer.NullCompleter; 7 | 8 | public interface GreengrassGroupCommandHandlerWithGroupIdAndDeploymentIdCompletion extends GreengrassCommandHandler { 9 | @Override 10 | default Completer getCompleter() { 11 | return new ArgumentCompleter(getCommandNameCompleter(), getGreengrassGroupIdAndDeploymentIdCompleter(), getGreengrassGroupIdAndDeploymentIdCompleter(), new NullCompleter()); 12 | } 13 | 14 | GreengrassGroupIdAndDeploymentIdCompleter getGreengrassGroupIdAndDeploymentIdCompleter(); 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/GreengrassGroupCommandHandlerWithGroupIdCompletion.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass; 2 | 3 | import com.awslabs.iot.client.commands.greengrass.completers.GreengrassGroupIdCompleter; 4 | import org.jline.reader.Completer; 5 | import org.jline.reader.impl.completer.ArgumentCompleter; 6 | import org.jline.reader.impl.completer.NullCompleter; 7 | 8 | public interface GreengrassGroupCommandHandlerWithGroupIdCompletion extends GreengrassCommandHandler { 9 | @Override 10 | default Completer getCompleter() { 11 | return new ArgumentCompleter(getCommandNameCompleter(), getGreengrassGroupIdCompleter(), new NullCompleter()); 12 | } 13 | 14 | GreengrassGroupIdCompleter getGreengrassGroupIdCompleter(); 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/completers/GreengrassGroupArnCompleter.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass.completers; 2 | 3 | import com.awslabs.iot.client.completers.DynamicStringsCompleter; 4 | import com.awslabs.iot.client.helpers.CandidateHelper; 5 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 6 | import io.vavr.collection.List; 7 | import io.vavr.collection.Stream; 8 | import org.jline.reader.Candidate; 9 | import software.amazon.awssdk.services.greengrass.model.GroupInformation; 10 | 11 | import javax.inject.Inject; 12 | 13 | public class GreengrassGroupArnCompleter extends DynamicStringsCompleter { 14 | @Inject 15 | GreengrassV1Helper greengrassV1Helper; 16 | @Inject 17 | CandidateHelper candidateHelper; 18 | 19 | @Inject 20 | public GreengrassGroupArnCompleter() { 21 | } 22 | 23 | @Override 24 | protected List getStrings() { 25 | Stream groupArnStream = greengrassV1Helper.getGroups() 26 | .map(GroupInformation::arn); 27 | 28 | return candidateHelper.getCandidates(groupArnStream); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/completers/GreengrassGroupIdAndDeploymentIdCompleter.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass.completers; 2 | 3 | import com.awslabs.iot.client.helpers.CandidateHelper; 4 | import com.awslabs.iot.data.ImmutableGreengrassGroupId; 5 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 6 | import io.vavr.collection.List; 7 | import org.jline.reader.Candidate; 8 | import org.jline.reader.Completer; 9 | import org.jline.reader.LineReader; 10 | import org.jline.reader.ParsedLine; 11 | import software.amazon.awssdk.services.greengrass.model.Deployment; 12 | import software.amazon.awssdk.services.greengrass.model.GroupInformation; 13 | 14 | import javax.inject.Inject; 15 | 16 | public class GreengrassGroupIdAndDeploymentIdCompleter implements Completer { 17 | @Inject 18 | GreengrassV1Helper greengrassV1Helper; 19 | @Inject 20 | CandidateHelper candidateHelper; 21 | 22 | @Inject 23 | public GreengrassGroupIdAndDeploymentIdCompleter() { 24 | } 25 | 26 | @Override 27 | public void complete(LineReader reader, ParsedLine line, java.util.List candidates) { 28 | List groupIds = greengrassV1Helper.getGroups().map(GroupInformation::id).toList(); 29 | 30 | // Flow: 31 | // If there is only one argument we want the list of group IDs. This is the argument completer validating that the group ID exists. 32 | // If there are two arguments we also want the list of group IDs. This is the argument completer asking for the group ID list. 33 | // If there are three arguments we want the list of deployment IDs for the given group ID. This is the argument completer asking for the deployment ID list. 34 | 35 | if ((line.wordIndex() == 0) || (line.wordIndex() == 1)) { 36 | candidates.addAll(candidateHelper.getCandidates(groupIds.toStream()).asJava()); 37 | return; 38 | } 39 | 40 | String previousWord = line.words().get(line.wordIndex() - 1); 41 | 42 | // This happens when we are entering the deployment ID 43 | if (groupIds.contains(previousWord)) { 44 | ImmutableGreengrassGroupId greengrassGroupId = ImmutableGreengrassGroupId.builder().groupId(previousWord).build(); 45 | candidates.addAll(candidateHelper.getCandidates(greengrassV1Helper.getDeployments(greengrassGroupId).map(Deployment::deploymentId)).asJava()); 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/completers/GreengrassGroupIdCompleter.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass.completers; 2 | 3 | import com.awslabs.iot.client.completers.DynamicStringsCompleter; 4 | import com.awslabs.iot.client.helpers.CandidateHelper; 5 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 6 | import io.vavr.collection.List; 7 | import org.jline.reader.Candidate; 8 | import software.amazon.awssdk.services.greengrass.model.GroupInformation; 9 | 10 | import javax.inject.Inject; 11 | 12 | public class GreengrassGroupIdCompleter extends DynamicStringsCompleter { 13 | @Inject 14 | GreengrassV1Helper greengrassV1Helper; 15 | @Inject 16 | CandidateHelper candidateHelper; 17 | 18 | @Inject 19 | public GreengrassGroupIdCompleter() { 20 | } 21 | 22 | @Override 23 | public List getStrings() { 24 | return candidateHelper.getCandidates(greengrassV1Helper.getGroups().map(GroupInformation::id)); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/cores/GetLatestCoreDefinitionVersionCommandHandlerWithGroupIdCompletion.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass.cores; 2 | 3 | 4 | import com.awslabs.iot.client.commands.greengrass.GreengrassGroupCommandHandlerWithGroupIdCompletion; 5 | import com.awslabs.iot.client.commands.greengrass.completers.GreengrassGroupIdCompleter; 6 | import com.awslabs.iot.client.helpers.json.interfaces.ObjectPrettyPrinter; 7 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 8 | import com.awslabs.iot.data.GreengrassGroupId; 9 | import com.awslabs.iot.data.ImmutableGreengrassGroupId; 10 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 11 | import com.jcabi.log.Logger; 12 | import io.vavr.collection.List; 13 | import io.vavr.control.Option; 14 | import software.amazon.awssdk.services.greengrass.model.CoreDefinitionVersion; 15 | 16 | import javax.inject.Inject; 17 | 18 | public class GetLatestCoreDefinitionVersionCommandHandlerWithGroupIdCompletion implements GreengrassGroupCommandHandlerWithGroupIdCompletion { 19 | private static final String GET_LATEST_CORE_DEFINITION = "get-latest-core-definition"; 20 | private static final int GROUP_ID_POSITION = 0; 21 | @Inject 22 | GreengrassV1Helper greengrassV1Helper; 23 | @Inject 24 | ObjectPrettyPrinter objectPrettyPrinter; 25 | @Inject 26 | ParameterExtractor parameterExtractor; 27 | @Inject 28 | GreengrassGroupIdCompleter greengrassGroupIdCompleter; 29 | 30 | @Inject 31 | public GetLatestCoreDefinitionVersionCommandHandlerWithGroupIdCompletion() { 32 | } 33 | 34 | @Override 35 | public void innerHandle(String input) { 36 | List parameters = parameterExtractor.getParameters(input); 37 | 38 | GreengrassGroupId groupId = ImmutableGreengrassGroupId.builder().groupId(parameters.get(GROUP_ID_POSITION)).build(); 39 | 40 | Option optionalCoreDefinitionVersion = greengrassV1Helper.getGroupInformation(groupId) 41 | .flatMap(greengrassV1Helper::getCoreDefinitionVersion); 42 | 43 | if (optionalCoreDefinitionVersion.isEmpty()) { 44 | Logger.info(this, "No core definition found"); 45 | return; 46 | } 47 | 48 | Logger.info(this, objectPrettyPrinter.prettyPrint(optionalCoreDefinitionVersion.get())); 49 | } 50 | 51 | @Override 52 | public String getCommandString() { 53 | return GET_LATEST_CORE_DEFINITION; 54 | } 55 | 56 | @Override 57 | public String getHelp() { 58 | return "Gets the latest core definition version for a group."; 59 | } 60 | 61 | @Override 62 | public int requiredParameters() { 63 | return 1; 64 | } 65 | 66 | public ParameterExtractor getParameterExtractor() { 67 | return this.parameterExtractor; 68 | } 69 | 70 | public GreengrassGroupIdCompleter getGreengrassGroupIdCompleter() { 71 | return this.greengrassGroupIdCompleter; 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/devices/GetLatestDeviceDefinitionVersionCommandHandlerWithGroupIdCompletion.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass.devices; 2 | 3 | 4 | import com.awslabs.iot.client.commands.greengrass.GreengrassGroupCommandHandlerWithGroupIdCompletion; 5 | import com.awslabs.iot.client.commands.greengrass.completers.GreengrassGroupIdCompleter; 6 | import com.awslabs.iot.client.helpers.json.interfaces.ObjectPrettyPrinter; 7 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 8 | import com.awslabs.iot.data.GreengrassGroupId; 9 | import com.awslabs.iot.data.ImmutableGreengrassGroupId; 10 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 11 | import com.jcabi.log.Logger; 12 | import io.vavr.collection.List; 13 | import io.vavr.control.Option; 14 | import software.amazon.awssdk.services.greengrass.model.Device; 15 | 16 | import javax.inject.Inject; 17 | 18 | public class GetLatestDeviceDefinitionVersionCommandHandlerWithGroupIdCompletion implements GreengrassGroupCommandHandlerWithGroupIdCompletion { 19 | private static final String GET_LATEST_DEVICE_DEFINITION = "get-latest-device-definition"; 20 | private static final int GROUP_ID_POSITION = 0; 21 | @Inject 22 | GreengrassV1Helper greengrassV1Helper; 23 | @Inject 24 | ObjectPrettyPrinter objectPrettyPrinter; 25 | @Inject 26 | ParameterExtractor parameterExtractor; 27 | @Inject 28 | GreengrassGroupIdCompleter greengrassGroupIdCompleter; 29 | 30 | @Inject 31 | public GetLatestDeviceDefinitionVersionCommandHandlerWithGroupIdCompletion() { 32 | } 33 | 34 | @Override 35 | public void innerHandle(String input) { 36 | List parameters = parameterExtractor.getParameters(input); 37 | 38 | GreengrassGroupId groupId = ImmutableGreengrassGroupId.builder().groupId(parameters.get(GROUP_ID_POSITION)).build(); 39 | 40 | Option> optionalDeviceList = greengrassV1Helper.getGroupInformation(groupId) 41 | .flatMap(greengrassV1Helper::getDevices); 42 | 43 | if (optionalDeviceList.isEmpty()) { 44 | Logger.info(this, "No devices found"); 45 | return; 46 | } 47 | 48 | Logger.info(this, objectPrettyPrinter.prettyPrint(optionalDeviceList.get())); 49 | } 50 | 51 | @Override 52 | public String getCommandString() { 53 | return GET_LATEST_DEVICE_DEFINITION; 54 | } 55 | 56 | @Override 57 | public String getHelp() { 58 | return "Gets the latest device definition version for a group."; 59 | } 60 | 61 | @Override 62 | public int requiredParameters() { 63 | return 1; 64 | } 65 | 66 | public ParameterExtractor getParameterExtractor() { 67 | return this.parameterExtractor; 68 | } 69 | 70 | public GreengrassGroupIdCompleter getGreengrassGroupIdCompleter() { 71 | return this.greengrassGroupIdCompleter; 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/functions/GetLatestFunctionDefinitionVersionCommandHandlerWithGroupIdCompletion.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass.functions; 2 | 3 | 4 | import com.awslabs.iot.client.commands.greengrass.GreengrassGroupCommandHandlerWithGroupIdCompletion; 5 | import com.awslabs.iot.client.commands.greengrass.completers.GreengrassGroupIdCompleter; 6 | import com.awslabs.iot.client.helpers.json.interfaces.ObjectPrettyPrinter; 7 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 8 | import com.awslabs.iot.data.GreengrassGroupId; 9 | import com.awslabs.iot.data.ImmutableGreengrassGroupId; 10 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 11 | import com.jcabi.log.Logger; 12 | import io.vavr.collection.List; 13 | import io.vavr.control.Option; 14 | import software.amazon.awssdk.services.greengrass.model.FunctionDefinitionVersion; 15 | 16 | import javax.inject.Inject; 17 | 18 | public class GetLatestFunctionDefinitionVersionCommandHandlerWithGroupIdCompletion implements GreengrassGroupCommandHandlerWithGroupIdCompletion { 19 | private static final String GET_LATEST_FUNCTION_DEFINITION = "get-latest-function-definition"; 20 | private static final int GROUP_ID_POSITION = 0; 21 | @Inject 22 | GreengrassV1Helper greengrassV1Helper; 23 | @Inject 24 | ObjectPrettyPrinter objectPrettyPrinter; 25 | @Inject 26 | ParameterExtractor parameterExtractor; 27 | @Inject 28 | GreengrassGroupIdCompleter greengrassGroupIdCompleter; 29 | 30 | @Inject 31 | public GetLatestFunctionDefinitionVersionCommandHandlerWithGroupIdCompletion() { 32 | } 33 | 34 | @Override 35 | public void innerHandle(String input) { 36 | List parameters = parameterExtractor.getParameters(input); 37 | 38 | GreengrassGroupId groupId = ImmutableGreengrassGroupId.builder().groupId(parameters.get(GROUP_ID_POSITION)).build(); 39 | 40 | Option optionalFunctionDefinitionVersion = greengrassV1Helper.getGroupInformation(groupId) 41 | .flatMap(greengrassV1Helper::getFunctionDefinitionVersion); 42 | 43 | if (optionalFunctionDefinitionVersion.isEmpty()) { 44 | Logger.info(this, "No function definition found"); 45 | return; 46 | } 47 | 48 | Logger.info(this, objectPrettyPrinter.prettyPrint(optionalFunctionDefinitionVersion.get())); 49 | } 50 | 51 | @Override 52 | public String getCommandString() { 53 | return GET_LATEST_FUNCTION_DEFINITION; 54 | } 55 | 56 | @Override 57 | public String getHelp() { 58 | return "Gets the latest function definition version for a group."; 59 | } 60 | 61 | @Override 62 | public int requiredParameters() { 63 | return 1; 64 | } 65 | 66 | public ParameterExtractor getParameterExtractor() { 67 | return this.parameterExtractor; 68 | } 69 | 70 | public GreengrassGroupIdCompleter getGreengrassGroupIdCompleter() { 71 | return this.greengrassGroupIdCompleter; 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/generic/CleanupCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass.generic; 2 | 3 | 4 | import com.awslabs.iot.client.commands.greengrass.GreengrassCommandHandler; 5 | import com.awslabs.iot.client.commands.greengrass.groups.*; 6 | import com.awslabs.iot.client.commands.greengrassv2.greengrass.groups.DeleteAllCoresV2CommandHandler; 7 | import com.awslabs.iot.client.commands.iot.certificates.DeleteAllCertificatesCommandHandler; 8 | import com.awslabs.iot.client.commands.iot.jobs.DeleteAllJobsCommandHandler; 9 | import com.awslabs.iot.client.commands.iot.policies.DeleteAllPoliciesCommandHandler; 10 | import com.awslabs.iot.client.commands.iot.things.DeleteAllThingGroupsCommandHandler; 11 | import com.awslabs.iot.client.commands.iot.things.DeleteAllThingsCommandHandler; 12 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 13 | 14 | import javax.inject.Inject; 15 | 16 | public class CleanupCommandHandler implements GreengrassCommandHandler { 17 | private static final String CLEANUP = "cleanup"; 18 | @Inject 19 | ParameterExtractor parameterExtractor; 20 | @Inject 21 | DeleteAllCertificatesCommandHandler deleteAllCertificatesCommandHandler; 22 | @Inject 23 | DeleteAllPoliciesCommandHandler deleteAllPoliciesCommandHandler; 24 | @Inject 25 | DeleteAllThingsCommandHandler deleteAllThingsCommandHandler; 26 | @Inject 27 | DeleteAllGreengrassLambdaFunctionsCommandHandler deleteAllGreengrassLambdaFunctionsCommandHandler; 28 | @Inject 29 | DeleteAllGroupsCommandHandler deleteAllGroupsCommandHandler; 30 | @Inject 31 | DeleteAllCoreDefinitionsCommandHandler deleteAllCoreDefinitionsCommandHandler; 32 | @Inject 33 | DeleteAllFunctionDefinitionsCommandHandler deleteAllFunctionDefinitionsCommandHandler; 34 | @Inject 35 | DeleteAllSubscriptionDefinitionsCommandHandler deleteAllSubscriptionDefinitionsCommandHandler; 36 | @Inject 37 | DeleteAllDeviceDefinitionsCommandHandler deleteAllDeviceDefinitionsCommandHandler; 38 | @Inject 39 | DeleteAllLoggerDefinitionsCommandHandler deleteAllLoggerDefinitionsCommandHandler; 40 | @Inject 41 | DeleteAllResourceDefinitionsCommandHandler deleteAllResourceDefinitionsCommandHandler; 42 | @Inject 43 | DeleteAllConnectorDefinitionsCommandHandler deleteAllConnectorDefinitionsCommandHandler; 44 | @Inject 45 | DeleteAllThingGroupsCommandHandler deleteAllThingGroupsCommandHandler; 46 | @Inject 47 | DeleteAllJobsCommandHandler deleteAllJobsCommandHandler; 48 | @Inject 49 | DeleteAllCoresV2CommandHandler deleteAllCoresV2CommandHandler; 50 | 51 | @Inject 52 | public CleanupCommandHandler() { 53 | } 54 | 55 | @Override 56 | public void innerHandle(String input) { 57 | // IoT 58 | deleteAllCertificatesCommandHandler.innerHandle(""); 59 | deleteAllThingsCommandHandler.innerHandle(""); 60 | deleteAllThingGroupsCommandHandler.innerHandle(""); 61 | deleteAllPoliciesCommandHandler.innerHandle(""); 62 | 63 | // Greengrass 64 | deleteAllGreengrassLambdaFunctionsCommandHandler.innerHandle(""); 65 | deleteAllGroupsCommandHandler.innerHandle(""); 66 | deleteAllCoreDefinitionsCommandHandler.innerHandle(""); 67 | deleteAllFunctionDefinitionsCommandHandler.innerHandle(""); 68 | deleteAllSubscriptionDefinitionsCommandHandler.innerHandle(""); 69 | deleteAllDeviceDefinitionsCommandHandler.innerHandle(""); 70 | deleteAllLoggerDefinitionsCommandHandler.innerHandle(""); 71 | deleteAllResourceDefinitionsCommandHandler.innerHandle(""); 72 | deleteAllConnectorDefinitionsCommandHandler.innerHandle(""); 73 | 74 | // Jobs 75 | deleteAllJobsCommandHandler.innerHandle(""); 76 | 77 | // Greengrass V2 78 | deleteAllCoresV2CommandHandler.innerHandle(""); 79 | } 80 | 81 | @Override 82 | public String getCommandString() { 83 | return CLEANUP; 84 | } 85 | 86 | @Override 87 | public String getHelp() { 88 | return "Deletes all IoT things, certificates, Greengrass groups, and associated Lambda functions for groups and IoT things that are not immutable"; 89 | } 90 | 91 | @Override 92 | public int requiredParameters() { 93 | return 0; 94 | } 95 | 96 | @Override 97 | public boolean isDangerous() { 98 | return true; 99 | } 100 | 101 | public ParameterExtractor getParameterExtractor() { 102 | return this.parameterExtractor; 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/groups/DeleteAllConnectorDefinitionsCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass.groups; 2 | 3 | 4 | import com.awslabs.iot.client.commands.greengrass.GreengrassCommandHandler; 5 | import com.awslabs.iot.client.helpers.progressbar.ProgressBarHelper; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.awslabs.iot.client.streams.interfaces.UsesStream; 8 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 9 | import io.vavr.collection.List; 10 | import io.vavr.collection.Stream; 11 | import io.vavr.control.Try; 12 | import software.amazon.awssdk.services.greengrass.model.DefinitionInformation; 13 | import software.amazon.awssdk.services.greengrass.model.GetConnectorDefinitionVersionResponse; 14 | 15 | import javax.inject.Inject; 16 | 17 | public class DeleteAllConnectorDefinitionsCommandHandler implements GreengrassCommandHandler, UsesStream { 18 | private static final String DELETE_CONNECTOR_DEFINITIONS = "delete-all-connector-definitions"; 19 | @Inject 20 | GreengrassV1Helper greengrassV1Helper; 21 | @Inject 22 | ParameterExtractor parameterExtractor; 23 | @Inject 24 | ProgressBarHelper progressBarHelper; 25 | 26 | @Inject 27 | public DeleteAllConnectorDefinitionsCommandHandler() { 28 | } 29 | 30 | @Override 31 | public void innerHandle(String input) { 32 | Try.withResources(() -> progressBarHelper.start("Delete all Greengrass connector definitions", this)) 33 | .of(progressBar -> run()); 34 | } 35 | 36 | private Void run() { 37 | getStream() 38 | .peek(definitionInformation -> progressBarHelper.next()) 39 | .forEach(greengrassV1Helper::deleteConnectorDefinition); 40 | 41 | return null; 42 | } 43 | 44 | @Override 45 | public String getCommandString() { 46 | return DELETE_CONNECTOR_DEFINITIONS; 47 | } 48 | 49 | @Override 50 | public String getHelp() { 51 | return "Deletes all Greengrass connector definitions."; 52 | } 53 | 54 | @Override 55 | public int requiredParameters() { 56 | return 0; 57 | } 58 | 59 | public ParameterExtractor getParameterExtractor() { 60 | return this.parameterExtractor; 61 | } 62 | 63 | @Override 64 | public Stream getStream() { 65 | List immutableConnectorDefinitionIds = greengrassV1Helper.getImmutableConnectorDefinitionVersionResponses() 66 | .map(GetConnectorDefinitionVersionResponse::id) 67 | .toList(); 68 | 69 | return greengrassV1Helper.getConnectorDefinitions() 70 | .filter(definitionInformation -> !immutableConnectorDefinitionIds.contains(definitionInformation.id())); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/groups/DeleteAllCoreDefinitionsCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass.groups; 2 | 3 | 4 | import com.awslabs.iot.client.commands.greengrass.GreengrassCommandHandler; 5 | import com.awslabs.iot.client.helpers.progressbar.ProgressBarHelper; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.awslabs.iot.client.streams.interfaces.UsesStream; 8 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 9 | import io.vavr.collection.List; 10 | import io.vavr.collection.Stream; 11 | import io.vavr.control.Try; 12 | import software.amazon.awssdk.services.greengrass.model.DefinitionInformation; 13 | import software.amazon.awssdk.services.greengrass.model.GetCoreDefinitionVersionResponse; 14 | 15 | import javax.inject.Inject; 16 | 17 | public class DeleteAllCoreDefinitionsCommandHandler implements GreengrassCommandHandler, UsesStream { 18 | private static final String DELETE_CORE_DEFINITIONS = "delete-all-core-definitions"; 19 | @Inject 20 | GreengrassV1Helper greengrassV1Helper; 21 | @Inject 22 | ParameterExtractor parameterExtractor; 23 | @Inject 24 | ProgressBarHelper progressBarHelper; 25 | 26 | @Inject 27 | public DeleteAllCoreDefinitionsCommandHandler() { 28 | } 29 | 30 | @Override 31 | public void innerHandle(String input) { 32 | Try.withResources(() -> progressBarHelper.start("Delete all Greengrass core definitions", this)) 33 | .of(progressBar -> run()); 34 | } 35 | 36 | private Void run() { 37 | getStream() 38 | .peek(definitionInformation -> progressBarHelper.next()) 39 | .forEach(greengrassV1Helper::deleteCoreDefinition); 40 | 41 | return null; 42 | } 43 | 44 | @Override 45 | public String getCommandString() { 46 | return DELETE_CORE_DEFINITIONS; 47 | } 48 | 49 | @Override 50 | public String getHelp() { 51 | return "Deletes all Greengrass core definitions."; 52 | } 53 | 54 | @Override 55 | public int requiredParameters() { 56 | return 0; 57 | } 58 | 59 | public ParameterExtractor getParameterExtractor() { 60 | return this.parameterExtractor; 61 | } 62 | 63 | @Override 64 | public Stream getStream() { 65 | List immutableCoreDefinitionIds = greengrassV1Helper.getImmutableCoreDefinitionVersionResponses() 66 | .map(GetCoreDefinitionVersionResponse::id) 67 | .toList(); 68 | 69 | return greengrassV1Helper.getCoreDefinitions() 70 | .filter(definitionInformation -> !immutableCoreDefinitionIds.contains(definitionInformation.id())); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/groups/DeleteAllDeviceDefinitionsCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass.groups; 2 | 3 | 4 | import com.awslabs.iot.client.commands.greengrass.GreengrassCommandHandler; 5 | import com.awslabs.iot.client.helpers.progressbar.ProgressBarHelper; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.awslabs.iot.client.streams.interfaces.UsesStream; 8 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 9 | import io.vavr.collection.List; 10 | import io.vavr.collection.Stream; 11 | import io.vavr.control.Try; 12 | import software.amazon.awssdk.services.greengrass.model.DefinitionInformation; 13 | import software.amazon.awssdk.services.greengrass.model.GetDeviceDefinitionVersionResponse; 14 | 15 | import javax.inject.Inject; 16 | 17 | public class DeleteAllDeviceDefinitionsCommandHandler implements GreengrassCommandHandler, UsesStream { 18 | private static final String DELETE_DEVICE_DEFINITIONS = "delete-all-device-definitions"; 19 | @Inject 20 | GreengrassV1Helper greengrassV1Helper; 21 | @Inject 22 | ParameterExtractor parameterExtractor; 23 | @Inject 24 | ProgressBarHelper progressBarHelper; 25 | 26 | @Inject 27 | public DeleteAllDeviceDefinitionsCommandHandler() { 28 | } 29 | 30 | @Override 31 | public void innerHandle(String input) { 32 | Try.withResources(() -> progressBarHelper.start("Delete all Greengrass device definitions", this)) 33 | .of(progressBar -> run()); 34 | } 35 | 36 | private Void run() { 37 | getStream() 38 | .peek(definitionInformation -> progressBarHelper.next()) 39 | .forEach(greengrassV1Helper::deleteDeviceDefinition); 40 | 41 | return null; 42 | } 43 | 44 | 45 | @Override 46 | public String getCommandString() { 47 | return DELETE_DEVICE_DEFINITIONS; 48 | } 49 | 50 | @Override 51 | public String getHelp() { 52 | return "Deletes all Greengrass device definitions."; 53 | } 54 | 55 | @Override 56 | public int requiredParameters() { 57 | return 0; 58 | } 59 | 60 | public ParameterExtractor getParameterExtractor() { 61 | return this.parameterExtractor; 62 | } 63 | 64 | @Override 65 | public Stream getStream() { 66 | List immutableDeviceDefinitionIds = greengrassV1Helper.getImmutableDeviceDefinitionVersionResponses() 67 | .map(GetDeviceDefinitionVersionResponse::id) 68 | .toList(); 69 | 70 | return greengrassV1Helper.getDeviceDefinitions() 71 | .filter(definitionInformation -> !immutableDeviceDefinitionIds.contains(definitionInformation.id())); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/groups/DeleteAllFunctionDefinitionsCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass.groups; 2 | 3 | 4 | import com.awslabs.iot.client.commands.greengrass.GreengrassCommandHandler; 5 | import com.awslabs.iot.client.helpers.progressbar.ProgressBarHelper; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.awslabs.iot.client.streams.interfaces.UsesStream; 8 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 9 | import io.vavr.collection.List; 10 | import io.vavr.collection.Stream; 11 | import io.vavr.control.Try; 12 | import software.amazon.awssdk.services.greengrass.model.DefinitionInformation; 13 | import software.amazon.awssdk.services.greengrass.model.GetFunctionDefinitionVersionResponse; 14 | 15 | import javax.inject.Inject; 16 | 17 | public class DeleteAllFunctionDefinitionsCommandHandler implements GreengrassCommandHandler, UsesStream { 18 | private static final String DELETE_FUNCTION_DEFINITIONS = "delete-all-function-definitions"; 19 | @Inject 20 | GreengrassV1Helper greengrassV1Helper; 21 | @Inject 22 | ParameterExtractor parameterExtractor; 23 | @Inject 24 | ProgressBarHelper progressBarHelper; 25 | 26 | @Inject 27 | public DeleteAllFunctionDefinitionsCommandHandler() { 28 | } 29 | 30 | @Override 31 | public void innerHandle(String input) { 32 | Try.withResources(() -> progressBarHelper.start("Delete all Greengrass function definitions", this)) 33 | .of(progressBar -> run()); 34 | } 35 | 36 | private Void run() { 37 | getStream() 38 | .peek(definitionInformation -> progressBarHelper.next()) 39 | .forEach(greengrassV1Helper::deleteFunctionDefinition); 40 | 41 | return null; 42 | } 43 | 44 | @Override 45 | public String getCommandString() { 46 | return DELETE_FUNCTION_DEFINITIONS; 47 | } 48 | 49 | @Override 50 | public String getHelp() { 51 | return "Deletes all Greengrass function definitions."; 52 | } 53 | 54 | @Override 55 | public int requiredParameters() { 56 | return 0; 57 | } 58 | 59 | public ParameterExtractor getParameterExtractor() { 60 | return this.parameterExtractor; 61 | } 62 | 63 | @Override 64 | public Stream getStream() { 65 | List immutableFunctionDefinitionIds = greengrassV1Helper.getImmutableFunctionDefinitionVersionResponses() 66 | .map(GetFunctionDefinitionVersionResponse::id) 67 | .toList(); 68 | 69 | return greengrassV1Helper.getFunctionDefinitions() 70 | .filter(definitionInformation -> !immutableFunctionDefinitionIds.contains(definitionInformation.id())); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/groups/DeleteAllGreengrassLambdaFunctionsCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass.groups; 2 | 3 | 4 | import com.awslabs.iot.client.commands.greengrass.GreengrassCommandHandler; 5 | import com.awslabs.iot.client.helpers.progressbar.ProgressBarHelper; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.awslabs.iot.client.streams.interfaces.UsesStream; 8 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 9 | import com.awslabs.iot.helpers.interfaces.IotHelper; 10 | import com.awslabs.lambda.helpers.interfaces.LambdaHelper; 11 | import io.vavr.collection.List; 12 | import io.vavr.collection.Stream; 13 | import io.vavr.control.Try; 14 | import software.amazon.awssdk.services.greengrass.model.GroupInformation; 15 | import software.amazon.awssdk.services.lambda.LambdaClient; 16 | import software.amazon.awssdk.services.lambda.model.DeleteFunctionRequest; 17 | import software.amazon.awssdk.services.lambda.model.FunctionConfiguration; 18 | 19 | import javax.inject.Inject; 20 | 21 | public class DeleteAllGreengrassLambdaFunctionsCommandHandler implements GreengrassCommandHandler, UsesStream { 22 | private static final String DELETE_ALL_LAMBDA_FUNCTIONS = "delete-all-lambda-functions"; 23 | @Inject 24 | GreengrassV1Helper greengrassV1Helper; 25 | @Inject 26 | IotHelper iotHelper; 27 | @Inject 28 | ParameterExtractor parameterExtractor; 29 | @Inject 30 | LambdaClient lambdaClient; 31 | @Inject 32 | LambdaHelper lambdaHelper; 33 | @Inject 34 | ProgressBarHelper progressBarHelper; 35 | 36 | @Inject 37 | public DeleteAllGreengrassLambdaFunctionsCommandHandler() { 38 | } 39 | 40 | @Override 41 | public void innerHandle(String input) { 42 | Try.withResources(() -> progressBarHelper.start("Delete all Greengrass Lambda functions", this)) 43 | .of(progressBar -> run()); 44 | } 45 | 46 | private Void run() { 47 | getStream() 48 | .peek(certificate -> progressBarHelper.next()) 49 | // Extract just the name 50 | .map(FunctionConfiguration::functionName) 51 | // Delete each group's Lambda functions and rethrow all exceptions 52 | .forEach(this::deleteFunction); 53 | 54 | return null; 55 | } 56 | 57 | private void deleteFunction(String functionName) { 58 | DeleteFunctionRequest deleteFunctionRequest = DeleteFunctionRequest.builder() 59 | .functionName(functionName) 60 | .build(); 61 | 62 | lambdaClient.deleteFunction(deleteFunctionRequest); 63 | } 64 | 65 | @Override 66 | public String getCommandString() { 67 | return DELETE_ALL_LAMBDA_FUNCTIONS; 68 | } 69 | 70 | @Override 71 | public String getHelp() { 72 | return "Deletes all Lambda functions associated with any Greengrass groups."; 73 | } 74 | 75 | @Override 76 | public int requiredParameters() { 77 | return 0; 78 | } 79 | 80 | public ParameterExtractor getParameterExtractor() { 81 | return this.parameterExtractor; 82 | } 83 | 84 | @Override 85 | public Stream getStream() { 86 | List nonImmutableGroupNameList = greengrassV1Helper.getNonImmutableGroups() 87 | .map(GroupInformation::name) 88 | .toList(); 89 | 90 | return lambdaHelper.getAllFunctionConfigurations() 91 | // Only get functions that start with the group name 92 | .filter(functionConfiguration -> nonImmutableGroupNameList.filter(functionConfiguration.functionName()::startsWith).nonEmpty()); 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/groups/DeleteAllGroupsCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass.groups; 2 | 3 | 4 | import com.awslabs.iot.client.commands.greengrass.GreengrassCommandHandler; 5 | import com.awslabs.iot.client.helpers.progressbar.ProgressBarHelper; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.awslabs.iot.client.streams.interfaces.UsesStream; 8 | import com.awslabs.iot.data.ImmutableGreengrassGroupId; 9 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 10 | import io.vavr.collection.Stream; 11 | import io.vavr.control.Try; 12 | import software.amazon.awssdk.services.greengrass.model.GroupInformation; 13 | 14 | import javax.inject.Inject; 15 | 16 | public class DeleteAllGroupsCommandHandler implements GreengrassCommandHandler, UsesStream { 17 | private static final String DELETE_ALL_GROUPS = "delete-all-groups"; 18 | @Inject 19 | GreengrassV1Helper greengrassV1Helper; 20 | @Inject 21 | ParameterExtractor parameterExtractor; 22 | @Inject 23 | ProgressBarHelper progressBarHelper; 24 | 25 | @Inject 26 | public DeleteAllGroupsCommandHandler() { 27 | } 28 | 29 | @Override 30 | public void innerHandle(String input) { 31 | Try.withResources(() -> progressBarHelper.start("Delete all Greengrass groups", this)) 32 | .of(progressBar -> run()); 33 | } 34 | 35 | private Void run() { 36 | getStream() 37 | .map(GroupInformation::id) 38 | .map(id -> ImmutableGreengrassGroupId.builder().groupId(id).build()) 39 | .peek(groupId -> progressBarHelper.next()) 40 | .forEach(greengrassV1Helper::deleteGroup); 41 | 42 | return null; 43 | } 44 | 45 | @Override 46 | public String getCommandString() { 47 | return DELETE_ALL_GROUPS; 48 | } 49 | 50 | @Override 51 | public String getHelp() { 52 | return "Deletes all Greengrass groups."; 53 | } 54 | 55 | @Override 56 | public int requiredParameters() { 57 | return 0; 58 | } 59 | 60 | public ParameterExtractor getParameterExtractor() { 61 | return this.parameterExtractor; 62 | } 63 | 64 | @Override 65 | public Stream getStream() { 66 | return greengrassV1Helper.getNonImmutableGroups(); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/groups/DeleteAllLoggerDefinitionsCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass.groups; 2 | 3 | 4 | import com.awslabs.iot.client.commands.greengrass.GreengrassCommandHandler; 5 | import com.awslabs.iot.client.helpers.progressbar.ProgressBarHelper; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.awslabs.iot.client.streams.interfaces.UsesStream; 8 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 9 | import io.vavr.collection.List; 10 | import io.vavr.collection.Stream; 11 | import io.vavr.control.Try; 12 | import software.amazon.awssdk.services.greengrass.model.DefinitionInformation; 13 | import software.amazon.awssdk.services.greengrass.model.GetLoggerDefinitionVersionResponse; 14 | 15 | import javax.inject.Inject; 16 | 17 | public class DeleteAllLoggerDefinitionsCommandHandler implements GreengrassCommandHandler, UsesStream { 18 | private static final String DELETE_LOGGER_DEFINITIONS = "delete-all-logger-definitions"; 19 | @Inject 20 | GreengrassV1Helper greengrassV1Helper; 21 | @Inject 22 | ParameterExtractor parameterExtractor; 23 | @Inject 24 | ProgressBarHelper progressBarHelper; 25 | 26 | @Inject 27 | public DeleteAllLoggerDefinitionsCommandHandler() { 28 | } 29 | 30 | @Override 31 | public void innerHandle(String input) { 32 | Try.withResources(() -> progressBarHelper.start("Delete all Greengrass logger definitions", this)) 33 | .of(progressBar -> run()); 34 | } 35 | 36 | private Void run() { 37 | getStream() 38 | .peek(definitionInformation -> progressBarHelper.next()) 39 | .forEach(greengrassV1Helper::deleteLoggerDefinition); 40 | 41 | return null; 42 | } 43 | 44 | @Override 45 | public String getCommandString() { 46 | return DELETE_LOGGER_DEFINITIONS; 47 | } 48 | 49 | @Override 50 | public String getHelp() { 51 | return "Deletes all Greengrass logger definitions."; 52 | } 53 | 54 | @Override 55 | public int requiredParameters() { 56 | return 0; 57 | } 58 | 59 | public ParameterExtractor getParameterExtractor() { 60 | return this.parameterExtractor; 61 | } 62 | 63 | @Override 64 | public Stream getStream() { 65 | List immutableLoggerDefinitionIds = greengrassV1Helper.getImmutableLoggerDefinitionVersionResponses() 66 | .map(GetLoggerDefinitionVersionResponse::id) 67 | .toList(); 68 | 69 | return greengrassV1Helper.getLoggerDefinitions() 70 | .filter(definitionInformation -> !immutableLoggerDefinitionIds.contains(definitionInformation.id())); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/groups/DeleteAllResourceDefinitionsCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass.groups; 2 | 3 | 4 | import com.awslabs.iot.client.commands.greengrass.GreengrassCommandHandler; 5 | import com.awslabs.iot.client.helpers.progressbar.ProgressBarHelper; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.awslabs.iot.client.streams.interfaces.UsesStream; 8 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 9 | import io.vavr.collection.List; 10 | import io.vavr.collection.Stream; 11 | import io.vavr.control.Try; 12 | import software.amazon.awssdk.services.greengrass.model.DefinitionInformation; 13 | import software.amazon.awssdk.services.greengrass.model.GetResourceDefinitionVersionResponse; 14 | 15 | import javax.inject.Inject; 16 | 17 | public class DeleteAllResourceDefinitionsCommandHandler implements GreengrassCommandHandler, UsesStream { 18 | private static final String DELETE_RESOURCE_DEFINITIONS = "delete-all-resource-definitions"; 19 | @Inject 20 | GreengrassV1Helper greengrassV1Helper; 21 | @Inject 22 | ParameterExtractor parameterExtractor; 23 | @Inject 24 | ProgressBarHelper progressBarHelper; 25 | 26 | @Inject 27 | public DeleteAllResourceDefinitionsCommandHandler() { 28 | } 29 | 30 | @Override 31 | public void innerHandle(String input) { 32 | Try.withResources(() -> progressBarHelper.start("Delete all Greengrass resource definitions", this)) 33 | .of(progressBar -> run()); 34 | } 35 | 36 | private Void run() { 37 | getStream() 38 | .peek(definitionInformation -> progressBarHelper.next()) 39 | .forEach(greengrassV1Helper::deleteResourceDefinition); 40 | 41 | return null; 42 | } 43 | 44 | @Override 45 | public String getCommandString() { 46 | return DELETE_RESOURCE_DEFINITIONS; 47 | } 48 | 49 | @Override 50 | public String getHelp() { 51 | return "Deletes all Greengrass resource definitions."; 52 | } 53 | 54 | @Override 55 | public int requiredParameters() { 56 | return 0; 57 | } 58 | 59 | public ParameterExtractor getParameterExtractor() { 60 | return this.parameterExtractor; 61 | } 62 | 63 | @Override 64 | public Stream getStream() { 65 | List immutableResourceDefinitionIds = greengrassV1Helper.getImmutableResourceDefinitionVersionResponses() 66 | .map(GetResourceDefinitionVersionResponse::id) 67 | .toList(); 68 | 69 | return greengrassV1Helper.getResourceDefinitions() 70 | .filter(definitionInformation -> !immutableResourceDefinitionIds.contains(definitionInformation.id())); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/groups/DeleteAllSubscriptionDefinitionsCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass.groups; 2 | 3 | 4 | import com.awslabs.iot.client.commands.greengrass.GreengrassCommandHandler; 5 | import com.awslabs.iot.client.helpers.progressbar.ProgressBarHelper; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.awslabs.iot.client.streams.interfaces.UsesStream; 8 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 9 | import io.vavr.collection.List; 10 | import io.vavr.collection.Stream; 11 | import io.vavr.control.Try; 12 | import software.amazon.awssdk.services.greengrass.model.DefinitionInformation; 13 | import software.amazon.awssdk.services.greengrass.model.GetSubscriptionDefinitionVersionResponse; 14 | 15 | import javax.inject.Inject; 16 | 17 | public class DeleteAllSubscriptionDefinitionsCommandHandler implements GreengrassCommandHandler, UsesStream { 18 | private static final String DELETE_SUBSCRIPTION_DEFINITIONS = "delete-all-subscription-definitions"; 19 | @Inject 20 | GreengrassV1Helper greengrassV1Helper; 21 | @Inject 22 | ParameterExtractor parameterExtractor; 23 | @Inject 24 | ProgressBarHelper progressBarHelper; 25 | 26 | @Inject 27 | public DeleteAllSubscriptionDefinitionsCommandHandler() { 28 | } 29 | 30 | @Override 31 | public void innerHandle(String input) { 32 | Try.withResources(() -> progressBarHelper.start("Delete all Greengrass subscription definitions", this)) 33 | .of(progressBar -> run()); 34 | } 35 | 36 | private Void run() { 37 | getStream() 38 | .peek(definitionInformation -> progressBarHelper.next()) 39 | .forEach(greengrassV1Helper::deleteSubscriptionDefinition); 40 | 41 | return null; 42 | } 43 | 44 | @Override 45 | public String getCommandString() { 46 | return DELETE_SUBSCRIPTION_DEFINITIONS; 47 | } 48 | 49 | @Override 50 | public String getHelp() { 51 | return "Deletes all Greengrass subscription definitions."; 52 | } 53 | 54 | @Override 55 | public int requiredParameters() { 56 | return 0; 57 | } 58 | 59 | public ParameterExtractor getParameterExtractor() { 60 | return this.parameterExtractor; 61 | } 62 | 63 | @Override 64 | public Stream getStream() { 65 | List immutableSubscriptionDefinitionIds = greengrassV1Helper.getImmutableSubscriptionDefinitionVersionResponses() 66 | .map(GetSubscriptionDefinitionVersionResponse::id) 67 | .toList(); 68 | 69 | return greengrassV1Helper.getSubscriptionDefinitions() 70 | .filter(definitionInformation -> !immutableSubscriptionDefinitionIds.contains(definitionInformation.id())); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/groups/DeleteGroupCommandHandlerWithGroupIdCompletion.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass.groups; 2 | 3 | 4 | import com.awslabs.iot.client.commands.greengrass.GreengrassGroupCommandHandlerWithGroupIdCompletion; 5 | import com.awslabs.iot.client.commands.greengrass.completers.GreengrassGroupIdCompleter; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.awslabs.iot.data.GreengrassGroupId; 8 | import com.awslabs.iot.data.ImmutableGreengrassGroupId; 9 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 10 | import io.vavr.collection.List; 11 | 12 | import javax.inject.Inject; 13 | 14 | public class DeleteGroupCommandHandlerWithGroupIdCompletion implements GreengrassGroupCommandHandlerWithGroupIdCompletion { 15 | private static final String DELETE_GROUP = "delete-group"; 16 | private static final int GROUP_ID_POSITION = 0; 17 | @Inject 18 | GreengrassV1Helper greengrassV1Helper; 19 | @Inject 20 | ParameterExtractor parameterExtractor; 21 | @Inject 22 | GreengrassGroupIdCompleter greengrassGroupIdCompleter; 23 | 24 | @Inject 25 | public DeleteGroupCommandHandlerWithGroupIdCompletion() { 26 | } 27 | 28 | @Override 29 | public void innerHandle(String input) { 30 | List parameters = parameterExtractor.getParameters(input); 31 | 32 | GreengrassGroupId groupId = ImmutableGreengrassGroupId.builder().groupId(parameters.get(GROUP_ID_POSITION)).build(); 33 | 34 | greengrassV1Helper.deleteGroup(groupId); 35 | } 36 | 37 | @Override 38 | public String getCommandString() { 39 | return DELETE_GROUP; 40 | } 41 | 42 | @Override 43 | public String getHelp() { 44 | return "Deletes a Greengrass group."; 45 | } 46 | 47 | @Override 48 | public int requiredParameters() { 49 | return 1; 50 | } 51 | 52 | public ParameterExtractor getParameterExtractor() { 53 | return this.parameterExtractor; 54 | } 55 | 56 | public GreengrassGroupIdCompleter getGreengrassGroupIdCompleter() { 57 | return this.greengrassGroupIdCompleter; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/groups/GetDeploymentStatusCommandHandlerWithGroupIdAndDeploymentIdCompletion.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass.groups; 2 | 3 | 4 | import com.awslabs.iot.client.commands.greengrass.GreengrassGroupCommandHandlerWithGroupIdAndDeploymentIdCompletion; 5 | import com.awslabs.iot.client.commands.greengrass.completers.GreengrassGroupIdAndDeploymentIdCompleter; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.awslabs.iot.data.GreengrassGroupId; 8 | import com.awslabs.iot.data.ImmutableGreengrassGroupId; 9 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 10 | import com.jcabi.log.Logger; 11 | import io.vavr.collection.List; 12 | import io.vavr.control.Option; 13 | import software.amazon.awssdk.services.greengrass.model.GetDeploymentStatusResponse; 14 | 15 | import javax.inject.Inject; 16 | 17 | public class GetDeploymentStatusCommandHandlerWithGroupIdAndDeploymentIdCompletion implements GreengrassGroupCommandHandlerWithGroupIdAndDeploymentIdCompletion { 18 | private static final String GET_DEPLOYMENT_STATUS = "get-deployment-status"; 19 | private static final int GROUP_ID_POSITION = 0; 20 | private static final int DEPLOYMENT_ID_POSITION = 1; 21 | @Inject 22 | GreengrassV1Helper greengrassV1Helper; 23 | @Inject 24 | ParameterExtractor parameterExtractor; 25 | @Inject 26 | GreengrassGroupIdAndDeploymentIdCompleter greengrassGroupIdAndDeploymentIdCompleter; 27 | 28 | @Inject 29 | public GetDeploymentStatusCommandHandlerWithGroupIdAndDeploymentIdCompletion() { 30 | } 31 | 32 | @Override 33 | public void innerHandle(String input) { 34 | List parameters = parameterExtractor.getParameters(input); 35 | 36 | GreengrassGroupId groupId = ImmutableGreengrassGroupId.builder().groupId(parameters.get(GROUP_ID_POSITION)).build(); 37 | String deploymentId = parameters.get(DEPLOYMENT_ID_POSITION); 38 | 39 | Option optionalGetDeploymentStatusResponse = greengrassV1Helper.getDeployments(groupId) 40 | .filter(deployment -> deployment.deploymentId().equals(deploymentId)) 41 | .headOption() 42 | .flatMap(deployment -> greengrassV1Helper.getDeploymentStatusResponse(groupId, deployment)); 43 | 44 | if (optionalGetDeploymentStatusResponse.isEmpty()) { 45 | Logger.info(this, String.join("", "No status available for group [", groupId.getGroupId(), "] and deployment [", deploymentId, "]")); 46 | return; 47 | } 48 | 49 | Logger.info(this, String.join("", "Status of deployment [", deploymentId, "] is [", optionalGetDeploymentStatusResponse.get().deploymentStatus(), "]")); 50 | } 51 | 52 | @Override 53 | public String getCommandString() { 54 | return GET_DEPLOYMENT_STATUS; 55 | } 56 | 57 | @Override 58 | public String getHelp() { 59 | return "Gets the status of a deployment."; 60 | } 61 | 62 | @Override 63 | public int requiredParameters() { 64 | return 2; 65 | } 66 | 67 | public ParameterExtractor getParameterExtractor() { 68 | return this.parameterExtractor; 69 | } 70 | 71 | public GreengrassGroupIdAndDeploymentIdCompleter getGreengrassGroupIdAndDeploymentIdCompleter() { 72 | return this.greengrassGroupIdAndDeploymentIdCompleter; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/groups/GetLatestDeploymentCommandHandlerWithGroupIdCompletion.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass.groups; 2 | 3 | 4 | import com.awslabs.iot.client.commands.greengrass.GreengrassGroupCommandHandlerWithGroupIdCompletion; 5 | import com.awslabs.iot.client.commands.greengrass.completers.GreengrassGroupIdCompleter; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.awslabs.iot.data.GreengrassGroupId; 8 | import com.awslabs.iot.data.ImmutableGreengrassGroupId; 9 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 10 | import com.jcabi.log.Logger; 11 | import io.vavr.collection.List; 12 | 13 | import javax.inject.Inject; 14 | 15 | public class GetLatestDeploymentCommandHandlerWithGroupIdCompletion implements GreengrassGroupCommandHandlerWithGroupIdCompletion { 16 | private static final String GET_LATEST_DEPLOYMENT = "get-latest-deployment"; 17 | private static final int GROUP_ID_POSITION = 0; 18 | @Inject 19 | GreengrassV1Helper greengrassV1Helper; 20 | @Inject 21 | ParameterExtractor parameterExtractor; 22 | @Inject 23 | GreengrassGroupIdCompleter greengrassGroupIdCompleter; 24 | 25 | @Inject 26 | public GetLatestDeploymentCommandHandlerWithGroupIdCompletion() { 27 | } 28 | 29 | @Override 30 | public void innerHandle(String input) { 31 | List parameters = parameterExtractor.getParameters(input); 32 | 33 | GreengrassGroupId groupId = ImmutableGreengrassGroupId.builder().groupId(parameters.get(GROUP_ID_POSITION)).build(); 34 | 35 | greengrassV1Helper.getDeployments(groupId) 36 | .forEach(deployment -> Logger.info(this, String.join("", " [", deployment.deploymentId(), " - ", deployment.createdAt(), "]"))); 37 | } 38 | 39 | @Override 40 | public String getCommandString() { 41 | return GET_LATEST_DEPLOYMENT; 42 | } 43 | 44 | @Override 45 | public String getHelp() { 46 | return "Gets the latest deployment for a group."; 47 | } 48 | 49 | @Override 50 | public int requiredParameters() { 51 | return 1; 52 | } 53 | 54 | public ParameterExtractor getParameterExtractor() { 55 | return this.parameterExtractor; 56 | } 57 | 58 | public GreengrassGroupIdCompleter getGreengrassGroupIdCompleter() { 59 | return this.greengrassGroupIdCompleter; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/groups/GetLatestDeploymentStatusCommandHandlerWithGroupIdCompletion.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass.groups; 2 | 3 | 4 | import com.awslabs.iot.client.commands.greengrass.GreengrassGroupCommandHandlerWithGroupIdCompletion; 5 | import com.awslabs.iot.client.commands.greengrass.completers.GreengrassGroupIdCompleter; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.awslabs.iot.data.GreengrassGroupId; 8 | import com.awslabs.iot.data.ImmutableGreengrassGroupId; 9 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 10 | import com.jcabi.log.Logger; 11 | import io.vavr.collection.List; 12 | import io.vavr.control.Option; 13 | import software.amazon.awssdk.services.greengrass.model.GetDeploymentStatusResponse; 14 | 15 | import javax.inject.Inject; 16 | 17 | public class GetLatestDeploymentStatusCommandHandlerWithGroupIdCompletion implements GreengrassGroupCommandHandlerWithGroupIdCompletion { 18 | private static final String GET_LATEST_DEPLOYMENT_STATUS = "get-latest-deployment-status"; 19 | private static final int GROUP_ID_POSITION = 0; 20 | @Inject 21 | GreengrassV1Helper greengrassV1Helper; 22 | @Inject 23 | ParameterExtractor parameterExtractor; 24 | @Inject 25 | GreengrassGroupIdCompleter greengrassGroupIdCompleter; 26 | 27 | @Inject 28 | public GetLatestDeploymentStatusCommandHandlerWithGroupIdCompletion() { 29 | } 30 | 31 | @Override 32 | public void innerHandle(String input) { 33 | List parameters = parameterExtractor.getParameters(input); 34 | 35 | GreengrassGroupId groupId = ImmutableGreengrassGroupId.builder().groupId(parameters.get(GROUP_ID_POSITION)).build(); 36 | 37 | Option optionalGetDeploymentStatusResponse = greengrassV1Helper.getLatestDeployment(groupId) 38 | .flatMap(deployment -> greengrassV1Helper.getDeploymentStatusResponse(groupId, deployment)); 39 | 40 | if (optionalGetDeploymentStatusResponse.isEmpty()) { 41 | Logger.info(this, String.join("", "No status available the latest deployment of group [", groupId.getGroupId(), "]")); 42 | return; 43 | } 44 | 45 | GetDeploymentStatusResponse getDeploymentStatusResponse = optionalGetDeploymentStatusResponse.get(); 46 | 47 | Logger.info(this, String.join("", "Status of the latest deployment of [", groupId.getGroupId(), "] is [", getDeploymentStatusResponse.deploymentStatus(), "]")); 48 | } 49 | 50 | @Override 51 | public String getCommandString() { 52 | return GET_LATEST_DEPLOYMENT_STATUS; 53 | } 54 | 55 | @Override 56 | public String getHelp() { 57 | return "Gets the status of the latest deployment."; 58 | } 59 | 60 | @Override 61 | public int requiredParameters() { 62 | return 1; 63 | } 64 | 65 | public ParameterExtractor getParameterExtractor() { 66 | return this.parameterExtractor; 67 | } 68 | 69 | public GreengrassGroupIdCompleter getGreengrassGroupIdCompleter() { 70 | return this.greengrassGroupIdCompleter; 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/groups/GetLatestGroupVersionCommandHandlerWithGroupIdCompletion.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass.groups; 2 | 3 | 4 | import com.awslabs.iot.client.commands.greengrass.GreengrassGroupCommandHandlerWithGroupIdCompletion; 5 | import com.awslabs.iot.client.commands.greengrass.completers.GreengrassGroupIdCompleter; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.awslabs.iot.data.ImmutableGreengrassGroupId; 8 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 9 | import com.jcabi.log.Logger; 10 | import io.vavr.collection.List; 11 | import io.vavr.control.Option; 12 | import software.amazon.awssdk.services.greengrass.model.GroupInformation; 13 | 14 | import javax.inject.Inject; 15 | 16 | public class GetLatestGroupVersionCommandHandlerWithGroupIdCompletion implements GreengrassGroupCommandHandlerWithGroupIdCompletion { 17 | private static final String GET_LATEST_GROUP_VERSION = "get-latest-group-version"; 18 | private static final int GROUP_ID_POSITION = 0; 19 | @Inject 20 | GreengrassV1Helper greengrassV1Helper; 21 | @Inject 22 | ParameterExtractor parameterExtractor; 23 | @Inject 24 | GreengrassGroupIdCompleter greengrassGroupIdCompleter; 25 | 26 | @Inject 27 | public GetLatestGroupVersionCommandHandlerWithGroupIdCompletion() { 28 | } 29 | 30 | @Override 31 | public void innerHandle(String input) { 32 | List parameters = parameterExtractor.getParameters(input); 33 | 34 | String groupId = parameters.get(GROUP_ID_POSITION); 35 | 36 | Option optionalGroupInformation = greengrassV1Helper.getGroupInformation(ImmutableGreengrassGroupId.builder().groupId(groupId).build()); 37 | 38 | if (optionalGroupInformation.isEmpty()) { 39 | return; 40 | } 41 | 42 | GroupInformation groupInformation = optionalGroupInformation.get(); 43 | 44 | Logger.info(this, String.join("", " [", groupInformation.latestVersion(), " - ", groupInformation.creationTimestamp(), "]")); 45 | } 46 | 47 | @Override 48 | public String getCommandString() { 49 | return GET_LATEST_GROUP_VERSION; 50 | } 51 | 52 | @Override 53 | public String getHelp() { 54 | return "Gets the latest group version for a group."; 55 | } 56 | 57 | @Override 58 | public int requiredParameters() { 59 | return 1; 60 | } 61 | 62 | public ParameterExtractor getParameterExtractor() { 63 | return this.parameterExtractor; 64 | } 65 | 66 | public GreengrassGroupIdCompleter getGreengrassGroupIdCompleter() { 67 | return this.greengrassGroupIdCompleter; 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/groups/ListDeploymentsCommandHandlerWithGroupIdCompletion.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass.groups; 2 | 3 | import com.awslabs.iot.client.commands.greengrass.GreengrassGroupCommandHandlerWithGroupIdCompletion; 4 | import com.awslabs.iot.client.commands.greengrass.completers.GreengrassGroupIdCompleter; 5 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 6 | import com.awslabs.iot.data.ImmutableGreengrassGroupId; 7 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 8 | import com.jcabi.log.Logger; 9 | import io.vavr.collection.List; 10 | import io.vavr.control.Option; 11 | import software.amazon.awssdk.services.greengrass.model.GroupInformation; 12 | 13 | import javax.inject.Inject; 14 | 15 | public class ListDeploymentsCommandHandlerWithGroupIdCompletion implements GreengrassGroupCommandHandlerWithGroupIdCompletion { 16 | private static final String LIST_DEPLOYMENTS = "list-deployments"; 17 | private static final int GROUP_ID_POSITION = 0; 18 | @Inject 19 | GreengrassV1Helper greengrassV1Helper; 20 | @Inject 21 | ParameterExtractor parameterExtractor; 22 | @Inject 23 | GreengrassGroupIdCompleter greengrassGroupIdCompleter; 24 | 25 | @Inject 26 | public ListDeploymentsCommandHandlerWithGroupIdCompletion() { 27 | } 28 | 29 | @Override 30 | public void innerHandle(String input) { 31 | List parameters = parameterExtractor.getParameters(input); 32 | 33 | String groupId = parameters.get(GROUP_ID_POSITION); 34 | 35 | Option optionalGroupInformation = greengrassV1Helper.getGroupInformation(ImmutableGreengrassGroupId.builder().groupId(groupId).build()); 36 | 37 | if (optionalGroupInformation.isEmpty()) { 38 | return; 39 | } 40 | 41 | greengrassV1Helper.getDeployments(optionalGroupInformation.get()) 42 | .forEach(deployment -> Logger.info(this, String.join("", " [", deployment.deploymentId(), " - ", deployment.createdAt(), "]"))); 43 | } 44 | 45 | @Override 46 | public String getCommandString() { 47 | return LIST_DEPLOYMENTS; 48 | } 49 | 50 | @Override 51 | public String getHelp() { 52 | return "Lists all deployments for a group."; 53 | } 54 | 55 | @Override 56 | public int requiredParameters() { 57 | return 1; 58 | } 59 | 60 | public ParameterExtractor getParameterExtractor() { 61 | return this.parameterExtractor; 62 | } 63 | 64 | public GreengrassGroupIdCompleter getGreengrassGroupIdCompleter() { 65 | return this.greengrassGroupIdCompleter; 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/groups/ListGroupVersionsCommandHandlerWithGroupIdCompletion.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass.groups; 2 | 3 | 4 | import com.awslabs.iot.client.commands.greengrass.GreengrassGroupCommandHandlerWithGroupIdCompletion; 5 | import com.awslabs.iot.client.commands.greengrass.completers.GreengrassGroupIdCompleter; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.awslabs.iot.data.GreengrassGroupId; 8 | import com.awslabs.iot.data.ImmutableGreengrassGroupId; 9 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 10 | import com.jcabi.log.Logger; 11 | import io.vavr.collection.List; 12 | 13 | import javax.inject.Inject; 14 | 15 | public class ListGroupVersionsCommandHandlerWithGroupIdCompletion implements GreengrassGroupCommandHandlerWithGroupIdCompletion { 16 | private static final String LIST_GROUP_VERSIONS = "list-group-versions"; 17 | private static final int GROUP_ID_POSITION = 0; 18 | @Inject 19 | GreengrassV1Helper greengrassV1Helper; 20 | @Inject 21 | ParameterExtractor parameterExtractor; 22 | @Inject 23 | GreengrassGroupIdCompleter greengrassGroupIdCompleter; 24 | 25 | @Inject 26 | public ListGroupVersionsCommandHandlerWithGroupIdCompletion() { 27 | } 28 | 29 | @Override 30 | public void innerHandle(String input) { 31 | List parameters = parameterExtractor.getParameters(input); 32 | 33 | GreengrassGroupId groupId = ImmutableGreengrassGroupId.builder().groupId(parameters.get(GROUP_ID_POSITION)).build(); 34 | 35 | greengrassV1Helper.getVersionInformation(groupId) 36 | .forEach(versionInformation -> Logger.info(this, String.join("", " [", versionInformation.version(), " - ", versionInformation.creationTimestamp(), "]"))); 37 | } 38 | 39 | @Override 40 | public String getCommandString() { 41 | return LIST_GROUP_VERSIONS; 42 | } 43 | 44 | @Override 45 | public String getHelp() { 46 | return "Lists all Greengrass group versions for a group."; 47 | } 48 | 49 | @Override 50 | public int requiredParameters() { 51 | return 1; 52 | } 53 | 54 | public ParameterExtractor getParameterExtractor() { 55 | return this.parameterExtractor; 56 | } 57 | 58 | public GreengrassGroupIdCompleter getGreengrassGroupIdCompleter() { 59 | return this.greengrassGroupIdCompleter; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/groups/ListGroupsCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass.groups; 2 | 3 | 4 | import com.awslabs.iot.client.commands.greengrass.GreengrassCommandHandler; 5 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 6 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 7 | import com.jcabi.log.Logger; 8 | 9 | import javax.inject.Inject; 10 | 11 | public class ListGroupsCommandHandler implements GreengrassCommandHandler { 12 | private static final String LIST_GROUPS = "list-groups"; 13 | @Inject 14 | GreengrassV1Helper greengrassV1Helper; 15 | @Inject 16 | ParameterExtractor parameterExtractor; 17 | 18 | @Inject 19 | public ListGroupsCommandHandler() { 20 | } 21 | 22 | @Override 23 | public void innerHandle(String input) { 24 | greengrassV1Helper.getGroups() 25 | .forEach(groupInformation -> Logger.info(this, String.join("", " [", groupInformation.name(), " - ", groupInformation.id(), "]"))); 26 | } 27 | 28 | @Override 29 | public String getCommandString() { 30 | return LIST_GROUPS; 31 | } 32 | 33 | @Override 34 | public String getHelp() { 35 | return "Lists all Greengrass groups."; 36 | } 37 | 38 | @Override 39 | public int requiredParameters() { 40 | return 0; 41 | } 42 | 43 | public ParameterExtractor getParameterExtractor() { 44 | return this.parameterExtractor; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/loggers/GetLatestLoggerDefinitionVersionCommandHandlerWithGroupIdCompletion.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass.loggers; 2 | 3 | 4 | import com.awslabs.iot.client.commands.greengrass.GreengrassGroupCommandHandlerWithGroupIdCompletion; 5 | import com.awslabs.iot.client.commands.greengrass.completers.GreengrassGroupIdCompleter; 6 | import com.awslabs.iot.client.helpers.json.interfaces.ObjectPrettyPrinter; 7 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 8 | import com.awslabs.iot.data.ImmutableGreengrassGroupId; 9 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 10 | import com.jcabi.log.Logger; 11 | import io.vavr.collection.List; 12 | import io.vavr.control.Option; 13 | import software.amazon.awssdk.services.greengrass.model.GroupInformation; 14 | import software.amazon.awssdk.services.greengrass.model.LoggerDefinitionVersion; 15 | 16 | import javax.inject.Inject; 17 | 18 | public class GetLatestLoggerDefinitionVersionCommandHandlerWithGroupIdCompletion implements GreengrassGroupCommandHandlerWithGroupIdCompletion { 19 | private static final String GET_LATEST_LOGGER_DEFINITION = "get-latest-logger-definition"; 20 | private static final int GROUP_ID_POSITION = 0; 21 | @Inject 22 | GreengrassV1Helper greengrassV1Helper; 23 | @Inject 24 | ObjectPrettyPrinter objectPrettyPrinter; 25 | @Inject 26 | ParameterExtractor parameterExtractor; 27 | @Inject 28 | GreengrassGroupIdCompleter greengrassGroupIdCompleter; 29 | 30 | @Inject 31 | public GetLatestLoggerDefinitionVersionCommandHandlerWithGroupIdCompletion() { 32 | } 33 | 34 | @Override 35 | public void innerHandle(String input) { 36 | List parameters = parameterExtractor.getParameters(input); 37 | 38 | String groupId = parameters.get(GROUP_ID_POSITION); 39 | 40 | Option optionalGroupInformation = greengrassV1Helper.getGroupInformation(ImmutableGreengrassGroupId.builder().groupId(groupId).build()); 41 | 42 | if (optionalGroupInformation.isEmpty()) { 43 | return; 44 | } 45 | 46 | GroupInformation groupInformation = optionalGroupInformation.get(); 47 | 48 | Option optionalLoggerDefinitionVersion = greengrassV1Helper.getLoggerDefinitionVersion(groupInformation); 49 | 50 | if (optionalLoggerDefinitionVersion.isEmpty()) { 51 | Logger.info(this, "No loggers found"); 52 | return; 53 | } 54 | 55 | Logger.info(this, objectPrettyPrinter.prettyPrint(optionalLoggerDefinitionVersion.get())); 56 | } 57 | 58 | @Override 59 | public String getCommandString() { 60 | return GET_LATEST_LOGGER_DEFINITION; 61 | } 62 | 63 | @Override 64 | public String getHelp() { 65 | return "Gets the latest logger definition version for a group."; 66 | } 67 | 68 | @Override 69 | public int requiredParameters() { 70 | return 1; 71 | } 72 | 73 | public ParameterExtractor getParameterExtractor() { 74 | return this.parameterExtractor; 75 | } 76 | 77 | public GreengrassGroupIdCompleter getGreengrassGroupIdCompleter() { 78 | return this.greengrassGroupIdCompleter; 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/resources/GetLatestResourceDefinitionVersionCommandHandlerWithGroupIdCompletion.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass.resources; 2 | 3 | 4 | import com.awslabs.iot.client.commands.greengrass.GreengrassGroupCommandHandlerWithGroupIdCompletion; 5 | import com.awslabs.iot.client.commands.greengrass.completers.GreengrassGroupIdCompleter; 6 | import com.awslabs.iot.client.helpers.json.interfaces.ObjectPrettyPrinter; 7 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 8 | import com.awslabs.iot.data.GreengrassGroupId; 9 | import com.awslabs.iot.data.ImmutableGreengrassGroupId; 10 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 11 | import com.jcabi.log.Logger; 12 | import io.vavr.collection.List; 13 | import io.vavr.control.Option; 14 | import software.amazon.awssdk.services.greengrass.model.GroupVersion; 15 | import software.amazon.awssdk.services.greengrass.model.ResourceDefinitionVersion; 16 | 17 | import javax.inject.Inject; 18 | 19 | public class GetLatestResourceDefinitionVersionCommandHandlerWithGroupIdCompletion implements GreengrassGroupCommandHandlerWithGroupIdCompletion { 20 | private static final String GET_LATEST_RESOURCE_DEFINITION = "get-latest-resource-definition"; 21 | private static final int GROUP_ID_POSITION = 0; 22 | @Inject 23 | GreengrassV1Helper greengrassV1Helper; 24 | @Inject 25 | ObjectPrettyPrinter objectPrettyPrinter; 26 | @Inject 27 | ParameterExtractor parameterExtractor; 28 | @Inject 29 | GreengrassGroupIdCompleter greengrassGroupIdCompleter; 30 | 31 | @Inject 32 | public GetLatestResourceDefinitionVersionCommandHandlerWithGroupIdCompletion() { 33 | } 34 | 35 | @Override 36 | public void innerHandle(String input) { 37 | List parameters = parameterExtractor.getParameters(input); 38 | 39 | GreengrassGroupId groupId = ImmutableGreengrassGroupId.builder().groupId(parameters.get(GROUP_ID_POSITION)).build(); 40 | 41 | Option optionalGroupVersion = greengrassV1Helper.getLatestGroupVersion(groupId); 42 | 43 | if (optionalGroupVersion.isEmpty()) { 44 | return; 45 | } 46 | 47 | GroupVersion groupVersion = optionalGroupVersion.get(); 48 | 49 | Option resourceDefinitionVersion = greengrassV1Helper.getResourceDefinitionVersion(groupVersion); 50 | 51 | Logger.info(this, objectPrettyPrinter.prettyPrint(resourceDefinitionVersion)); 52 | } 53 | 54 | @Override 55 | public String getCommandString() { 56 | return GET_LATEST_RESOURCE_DEFINITION; 57 | } 58 | 59 | @Override 60 | public String getHelp() { 61 | return "Gets the latest resource definition version for a group."; 62 | } 63 | 64 | @Override 65 | public int requiredParameters() { 66 | return 1; 67 | } 68 | 69 | public ParameterExtractor getParameterExtractor() { 70 | return this.parameterExtractor; 71 | } 72 | 73 | public GreengrassGroupIdCompleter getGreengrassGroupIdCompleter() { 74 | return this.greengrassGroupIdCompleter; 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrass/subscriptions/GetLatestSubscriptionDefinitionVersionCommandHandlerWithGroupIdCompletion.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrass.subscriptions; 2 | 3 | 4 | import com.awslabs.iot.client.commands.greengrass.GreengrassGroupCommandHandlerWithGroupIdCompletion; 5 | import com.awslabs.iot.client.commands.greengrass.completers.GreengrassGroupIdCompleter; 6 | import com.awslabs.iot.client.helpers.json.interfaces.ObjectPrettyPrinter; 7 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 8 | import com.awslabs.iot.data.ImmutableGreengrassGroupId; 9 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 10 | import com.jcabi.log.Logger; 11 | import io.vavr.collection.List; 12 | import io.vavr.control.Option; 13 | import software.amazon.awssdk.services.greengrass.model.GroupInformation; 14 | import software.amazon.awssdk.services.greengrass.model.Subscription; 15 | 16 | import javax.inject.Inject; 17 | 18 | public class GetLatestSubscriptionDefinitionVersionCommandHandlerWithGroupIdCompletion implements GreengrassGroupCommandHandlerWithGroupIdCompletion { 19 | private static final String GET_LATEST_SUBSCRIPTION_DEFINITION = "get-latest-subscription-definition"; 20 | private static final int GROUP_ID_POSITION = 0; 21 | @Inject 22 | GreengrassV1Helper greengrassV1Helper; 23 | @Inject 24 | ObjectPrettyPrinter objectPrettyPrinter; 25 | @Inject 26 | ParameterExtractor parameterExtractor; 27 | @Inject 28 | GreengrassGroupIdCompleter greengrassGroupIdCompleter; 29 | 30 | @Inject 31 | public GetLatestSubscriptionDefinitionVersionCommandHandlerWithGroupIdCompletion() { 32 | } 33 | 34 | @Override 35 | public void innerHandle(String input) { 36 | List parameters = parameterExtractor.getParameters(input); 37 | 38 | String groupId = parameters.get(GROUP_ID_POSITION); 39 | 40 | Option optionalGroupInformation = greengrassV1Helper.getGroupInformation(ImmutableGreengrassGroupId.builder().groupId(groupId).build()); 41 | 42 | if (optionalGroupInformation.isEmpty()) { 43 | return; 44 | } 45 | 46 | GroupInformation groupInformation = optionalGroupInformation.get(); 47 | 48 | Option> optionalSubscriptionDefinitionVersion = greengrassV1Helper.getSubscriptions(groupInformation); 49 | 50 | if (optionalSubscriptionDefinitionVersion.isEmpty()) { 51 | Logger.info(this, "No subscriptions found"); 52 | return; 53 | } 54 | 55 | Logger.info(this, objectPrettyPrinter.prettyPrint(optionalSubscriptionDefinitionVersion.get())); 56 | } 57 | 58 | @Override 59 | public String getCommandString() { 60 | return GET_LATEST_SUBSCRIPTION_DEFINITION; 61 | } 62 | 63 | @Override 64 | public String getHelp() { 65 | return "Gets the latest subscription definition version for a group."; 66 | } 67 | 68 | @Override 69 | public int requiredParameters() { 70 | return 1; 71 | } 72 | 73 | public ParameterExtractor getParameterExtractor() { 74 | return this.parameterExtractor; 75 | } 76 | 77 | public GreengrassGroupIdCompleter getGreengrassGroupIdCompleter() { 78 | return this.greengrassGroupIdCompleter; 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrassv2/greengrass/GreengrassV2CommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrassv2.greengrass; 2 | 3 | import com.awslabs.iot.client.commands.interfaces.CommandHandler; 4 | 5 | public interface GreengrassV2CommandHandler extends CommandHandler { 6 | @Override 7 | default String getServiceName() { 8 | return "greengrassv2"; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrassv2/greengrass/GreengrassV2CommandHandlerWithCoreNameCompletion.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrassv2.greengrass; 2 | 3 | import com.awslabs.iot.client.commands.greengrassv2.greengrass.completers.GreengrassV2CoreNameCompleter; 4 | import org.jline.reader.Completer; 5 | import org.jline.reader.impl.completer.ArgumentCompleter; 6 | import org.jline.reader.impl.completer.NullCompleter; 7 | 8 | public interface GreengrassV2CommandHandlerWithCoreNameCompletion extends GreengrassV2CommandHandler { 9 | @Override 10 | default Completer getCompleter() { 11 | return new ArgumentCompleter(getCommandNameCompleter(), getGreengrassV2CoreNameCompleter(), new NullCompleter()); 12 | } 13 | 14 | GreengrassV2CoreNameCompleter getGreengrassV2CoreNameCompleter(); 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrassv2/greengrass/completers/GreengrassV2CoreNameCompleter.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrassv2.greengrass.completers; 2 | 3 | import com.awslabs.iot.client.completers.DynamicStringsCompleter; 4 | import com.awslabs.iot.client.helpers.CandidateHelper; 5 | import com.awslabs.iot.helpers.interfaces.GreengrassV1Helper; 6 | import com.awslabs.iot.helpers.interfaces.GreengrassV2Helper; 7 | import io.vavr.collection.List; 8 | import org.jline.reader.Candidate; 9 | import software.amazon.awssdk.services.greengrass.model.GroupInformation; 10 | import software.amazon.awssdk.services.greengrassv2.model.CoreDevice; 11 | 12 | import javax.inject.Inject; 13 | 14 | public class GreengrassV2CoreNameCompleter extends DynamicStringsCompleter { 15 | @Inject 16 | GreengrassV2Helper greengrassV2Helper; 17 | @Inject 18 | CandidateHelper candidateHelper; 19 | 20 | @Inject 21 | public GreengrassV2CoreNameCompleter() { 22 | } 23 | 24 | @Override 25 | public List getStrings() { 26 | return candidateHelper.getCandidates(greengrassV2Helper.getAllCoreDevices().map(CoreDevice::coreDeviceThingName)); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrassv2/greengrass/groups/DeleteAllCoresV2CommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrassv2.greengrass.groups; 2 | 3 | 4 | import com.awslabs.iot.client.commands.greengrassv2.greengrass.GreengrassV2CommandHandler; 5 | import com.awslabs.iot.client.helpers.progressbar.ProgressBarHelper; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.awslabs.iot.client.streams.interfaces.UsesStream; 8 | import com.awslabs.iot.helpers.interfaces.GreengrassV2Helper; 9 | import io.vavr.collection.Stream; 10 | import io.vavr.control.Try; 11 | import software.amazon.awssdk.services.greengrassv2.model.CoreDevice; 12 | 13 | import javax.inject.Inject; 14 | 15 | public class DeleteAllCoresV2CommandHandler implements GreengrassV2CommandHandler, UsesStream { 16 | private static final String DELETE_ALL_CORES = "delete-all-cores"; 17 | @Inject 18 | GreengrassV2Helper greengrassV2Helper; 19 | @Inject 20 | ParameterExtractor parameterExtractor; 21 | @Inject 22 | ProgressBarHelper progressBarHelper; 23 | 24 | @Inject 25 | public DeleteAllCoresV2CommandHandler() { 26 | } 27 | 28 | @Override 29 | public void innerHandle(String input) { 30 | Try.withResources(() -> progressBarHelper.start("Delete all Greengrass V2 cores", this)) 31 | .of(progressBar -> run()); 32 | } 33 | 34 | private Void run() { 35 | getStream() 36 | .peek(coreDevice -> progressBarHelper.next()) 37 | .forEach(greengrassV2Helper::deleteCoreDevice); 38 | 39 | return null; 40 | } 41 | 42 | @Override 43 | public String getCommandString() { 44 | return DELETE_ALL_CORES; 45 | } 46 | 47 | @Override 48 | public String getHelp() { 49 | return "Deletes all Greengrass core definitions."; 50 | } 51 | 52 | @Override 53 | public int requiredParameters() { 54 | return 0; 55 | } 56 | 57 | public ParameterExtractor getParameterExtractor() { 58 | return this.parameterExtractor; 59 | } 60 | 61 | @Override 62 | public Stream getStream() { 63 | return greengrassV2Helper.getAllCoreDevices(); 64 | } 65 | 66 | @Override 67 | public boolean isDangerous() { 68 | return true; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/greengrassv2/greengrass/groups/ListCoresV2CommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.greengrassv2.greengrass.groups; 2 | 3 | 4 | import com.awslabs.iot.client.commands.greengrassv2.greengrass.GreengrassV2CommandHandler; 5 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 6 | import com.awslabs.iot.helpers.interfaces.GreengrassV2Helper; 7 | import com.jcabi.log.Logger; 8 | 9 | import javax.inject.Inject; 10 | 11 | public class ListCoresV2CommandHandler implements GreengrassV2CommandHandler { 12 | private static final String LIST_CORES = "list-cores"; 13 | @Inject 14 | GreengrassV2Helper greengrassV2Helper; 15 | @Inject 16 | ParameterExtractor parameterExtractor; 17 | 18 | @Inject 19 | public ListCoresV2CommandHandler() { 20 | } 21 | 22 | @Override 23 | public void innerHandle(String input) { 24 | greengrassV2Helper.getAllCoreDevices() 25 | .forEach(coreDevice -> Logger.info(this, String.join("", " [", coreDevice.coreDeviceThingName(), " - ", coreDevice.statusAsString(), "]"))); 26 | } 27 | 28 | @Override 29 | public String getCommandString() { 30 | return LIST_CORES; 31 | } 32 | 33 | @Override 34 | public String getHelp() { 35 | return "Lists all Greengrass groups."; 36 | } 37 | 38 | @Override 39 | public int requiredParameters() { 40 | return 0; 41 | } 42 | 43 | public ParameterExtractor getParameterExtractor() { 44 | return this.parameterExtractor; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iam/completers/RoleCompleter.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iam.completers; 2 | 3 | import com.awslabs.iam.data.RoleName; 4 | import com.awslabs.iam.helpers.interfaces.IamHelper; 5 | import com.awslabs.iot.client.completers.DynamicStringsCompleter; 6 | import com.awslabs.iot.client.helpers.CandidateHelper; 7 | import io.vavr.collection.List; 8 | import org.jline.reader.Candidate; 9 | 10 | import javax.inject.Inject; 11 | 12 | public class RoleCompleter extends DynamicStringsCompleter { 13 | @Inject 14 | IamHelper iamHelper; 15 | @Inject 16 | CandidateHelper candidateHelper; 17 | 18 | @Inject 19 | public RoleCompleter() { 20 | } 21 | 22 | @Override 23 | public List getStrings() { 24 | return candidateHelper.getCandidates(iamHelper.getRoleNames() 25 | .map(RoleName::getName)); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/interfaces/CommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.interfaces; 2 | 3 | 4 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 5 | import com.jcabi.log.Logger; 6 | import io.vavr.collection.List; 7 | import io.vavr.control.Option; 8 | import io.vavr.control.Try; 9 | import org.jline.reader.Completer; 10 | import org.jline.reader.impl.completer.ArgumentCompleter; 11 | import org.jline.reader.impl.completer.NullCompleter; 12 | import org.jline.reader.impl.completer.StringsCompleter; 13 | 14 | public interface CommandHandler { 15 | /** 16 | * Handles the command specified in the input, returns true if the command was acted on by this handler. Returns false otherwise. 17 | * 18 | * @param input 19 | * @return 20 | */ 21 | default boolean handle(String input) { 22 | if (!isHandled(input)) { 23 | return false; 24 | } 25 | 26 | if (!parametersSpecified(input)) { 27 | showUsage(); 28 | return true; 29 | } 30 | 31 | innerHandle(input); 32 | 33 | return true; 34 | } 35 | 36 | /** 37 | * Gets the string that starts this command 38 | * 39 | * @return 40 | */ 41 | default String getFullCommandString() { 42 | String serviceName = getServiceName(); 43 | 44 | if (serviceName != null) { 45 | // Prefix service specific commands with their service name 46 | return String.join("", serviceName, "-", getCommandString()); 47 | } 48 | 49 | return getCommandString(); 50 | } 51 | 52 | /** 53 | * Returns the help for this command 54 | * 55 | * @return 56 | */ 57 | String getHelp(); 58 | 59 | default Completer getCommandNameCompleter() { 60 | return new StringsCompleter(getFullCommandString()); 61 | } 62 | 63 | default Completer getCompleter() { 64 | return new ArgumentCompleter(getCommandNameCompleter(), new NullCompleter()); 65 | } 66 | 67 | void innerHandle(String input); 68 | 69 | default boolean isHandled(String input) { 70 | return Try.of(() -> { 71 | String commandName = input.split(" ")[0]; 72 | 73 | return getFullCommandString().equals(commandName); 74 | }) 75 | .recover(Exception.class, throwable -> false) 76 | .get(); 77 | } 78 | 79 | default String getServiceName() { 80 | return null; 81 | } 82 | 83 | String getCommandString(); 84 | 85 | int requiredParameters(); 86 | 87 | default Option maximumParameters() { 88 | return Option.none(); 89 | } 90 | 91 | default boolean parametersSpecified(String input) { 92 | List parameters = getParameterExtractor().getParameters(input); 93 | int parameterCount = parameters.size(); 94 | return (requiredParameters() == parameterCount) || 95 | ((maximumParameters().isDefined()) && (parameterCount >= requiredParameters())); 96 | } 97 | 98 | ParameterExtractor getParameterExtractor(); 99 | 100 | default void showUsage() { 101 | Logger.info(this, String.join("", "No usage information has been provided for this command, but the required number of parameters were not specified. Expected ", String.valueOf(requiredParameters()), " parameter(s).")); 102 | } 103 | 104 | /** 105 | * Override this to return true for functions that are too dangerous to let the user use unless they specify a special option 106 | * 107 | * @return 108 | */ 109 | default boolean isDangerous() { 110 | return false; 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/CertificateCommandHandlerWithCompletion.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot; 2 | 3 | import com.awslabs.iot.client.commands.iot.completers.CertificateCompleter; 4 | import org.jline.reader.Completer; 5 | import org.jline.reader.impl.completer.ArgumentCompleter; 6 | import org.jline.reader.impl.completer.NullCompleter; 7 | 8 | public interface CertificateCommandHandlerWithCompletion extends IotCommandHandler { 9 | @Override 10 | default Completer getCompleter() { 11 | return new ArgumentCompleter(getCommandNameCompleter(), getCertificateCompleter(), new NullCompleter()); 12 | } 13 | 14 | CertificateCompleter getCertificateCompleter(); 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/IotCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot; 2 | 3 | import com.awslabs.iot.client.commands.interfaces.CommandHandler; 4 | 5 | public interface IotCommandHandler extends CommandHandler { 6 | default String getServiceName() { 7 | return "iot"; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/PolicyCommandHandlerWithCompletion.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot; 2 | 3 | import com.awslabs.iot.client.commands.iot.completers.PolicyCompleter; 4 | import org.jline.reader.Completer; 5 | import org.jline.reader.impl.completer.ArgumentCompleter; 6 | import org.jline.reader.impl.completer.NullCompleter; 7 | 8 | public interface PolicyCommandHandlerWithCompletion extends IotCommandHandler { 9 | @Override 10 | default Completer getCompleter() { 11 | return new ArgumentCompleter(getCommandNameCompleter(), getPolicyCompleter(), new NullCompleter()); 12 | } 13 | 14 | PolicyCompleter getPolicyCompleter(); 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/RuleCommandHandlerWithCompletion.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot; 2 | 3 | import com.awslabs.iot.client.commands.iot.completers.RuleCompleter; 4 | import org.jline.reader.Completer; 5 | import org.jline.reader.impl.completer.ArgumentCompleter; 6 | import org.jline.reader.impl.completer.NullCompleter; 7 | 8 | public interface RuleCommandHandlerWithCompletion extends IotCommandHandler { 9 | @Override 10 | default Completer getCompleter() { 11 | return new ArgumentCompleter(getCommandNameCompleter(), getRuleCompleter(), new NullCompleter()); 12 | } 13 | 14 | RuleCompleter getRuleCompleter(); 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/ThingCommandHandlerWithCompletion.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot; 2 | 3 | import com.awslabs.iot.client.commands.iot.completers.ThingCompleter; 4 | import org.jline.reader.Completer; 5 | import org.jline.reader.impl.completer.ArgumentCompleter; 6 | import org.jline.reader.impl.completer.NullCompleter; 7 | 8 | public interface ThingCommandHandlerWithCompletion extends IotCommandHandler { 9 | @Override 10 | default Completer getCompleter() { 11 | return new ArgumentCompleter(getCommandNameCompleter(), getThingCompleter(), new NullCompleter()); 12 | } 13 | 14 | ThingCompleter getThingCompleter(); 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/certificates/CleanUpCertificatesCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.certificates; 2 | 3 | 4 | import com.awslabs.iot.client.commands.iot.IotCommandHandler; 5 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 6 | import com.awslabs.iot.data.*; 7 | import com.awslabs.iot.helpers.interfaces.IotHelper; 8 | import com.jcabi.log.Logger; 9 | import io.vavr.collection.Stream; 10 | import software.amazon.awssdk.services.iot.model.Certificate; 11 | import software.amazon.awssdk.services.iot.model.Policy; 12 | 13 | import javax.inject.Inject; 14 | 15 | public class CleanUpCertificatesCommandHandler implements IotCommandHandler { 16 | private static final String CLEANUPCERTIFICATES = "clean-up-certificates"; 17 | @Inject 18 | IotHelper iotHelper; 19 | @Inject 20 | ParameterExtractor parameterExtractor; 21 | 22 | @Inject 23 | public CleanUpCertificatesCommandHandler() { 24 | } 25 | 26 | @Override 27 | public void innerHandle(String input) { 28 | iotHelper.getCertificates().forEach(this::deleteEach); 29 | } 30 | 31 | private void deleteEach(Certificate certificate) { 32 | CertificateArn certificateArn = ImmutableCertificateArn.builder().arn(certificate.certificateArn()).build(); 33 | CertificateId certificateId = ImmutableCertificateId.builder().id(certificate.certificateId()).build(); 34 | 35 | Stream attachedThings = iotHelper.getAttachedThings(certificateArn); 36 | 37 | if (attachedThings.nonEmpty()) { 38 | Logger.info(this, String.join("", "Ignoring [", certificateId.getId(), "], it still has things attached to it")); 39 | return; 40 | } 41 | 42 | Stream attachedPolicies = iotHelper.getAttachedPolicies(certificateArn); 43 | 44 | if (attachedPolicies.nonEmpty()) { 45 | Logger.info(this, String.join("", "Ignoring [", certificateId.getId(), "], it still has policies attached to it")); 46 | return; 47 | } 48 | 49 | Logger.info(this, String.join("", "Deleting [", certificateId.getId(), "]")); 50 | 51 | iotHelper.delete(certificateArn); 52 | } 53 | 54 | @Override 55 | public String getCommandString() { 56 | return CLEANUPCERTIFICATES; 57 | } 58 | 59 | @Override 60 | public String getHelp() { 61 | return "Deletes any certificates that have no policies or things attached to them."; 62 | } 63 | 64 | @Override 65 | public int requiredParameters() { 66 | return 0; 67 | } 68 | 69 | public ParameterExtractor getParameterExtractor() { 70 | return this.parameterExtractor; 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/certificates/DeleteAllCaCertificatesCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.certificates; 2 | 3 | 4 | import com.awslabs.iot.client.commands.iot.IotCommandHandler; 5 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 6 | import com.awslabs.iot.helpers.interfaces.IotHelper; 7 | 8 | import javax.inject.Inject; 9 | 10 | public class DeleteAllCaCertificatesCommandHandler implements IotCommandHandler { 11 | private static final String DELETEALLCACERTIFICATES = "delete-all-ca-certificates"; 12 | @Inject 13 | IotHelper iotHelper; 14 | @Inject 15 | ParameterExtractor parameterExtractor; 16 | 17 | @Inject 18 | public DeleteAllCaCertificatesCommandHandler() { 19 | } 20 | 21 | @Override 22 | public void innerHandle(String input) { 23 | iotHelper.getCaCertificates() 24 | .forEach(certificate -> iotHelper.deleteCaCertificate(certificate)); 25 | } 26 | 27 | @Override 28 | public String getCommandString() { 29 | return DELETEALLCACERTIFICATES; 30 | } 31 | 32 | @Override 33 | public String getHelp() { 34 | return "Deletes all CA certificates."; 35 | } 36 | 37 | @Override 38 | public int requiredParameters() { 39 | return 0; 40 | } 41 | 42 | public ParameterExtractor getParameterExtractor() { 43 | return this.parameterExtractor; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/certificates/DeleteAllCertificatesCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.certificates; 2 | 3 | 4 | import com.awslabs.iot.client.commands.iot.IotCommandHandler; 5 | import com.awslabs.iot.client.helpers.progressbar.ProgressBarHelper; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.awslabs.iot.client.streams.interfaces.UsesStream; 8 | import com.awslabs.iot.helpers.interfaces.IotHelper; 9 | import io.vavr.collection.Stream; 10 | import io.vavr.control.Try; 11 | import software.amazon.awssdk.services.iot.model.Certificate; 12 | 13 | import javax.inject.Inject; 14 | 15 | public class DeleteAllCertificatesCommandHandler implements IotCommandHandler, UsesStream { 16 | private static final String DELETEALLCERTIFICATES = "delete-all-certificates"; 17 | @Inject 18 | ParameterExtractor parameterExtractor; 19 | @Inject 20 | IotHelper iotHelper; 21 | @Inject 22 | ProgressBarHelper progressBarHelper; 23 | 24 | @Inject 25 | public DeleteAllCertificatesCommandHandler() { 26 | } 27 | 28 | @Override 29 | public void innerHandle(String input) { 30 | Try.withResources(() -> progressBarHelper.start("Delete all IoT certificates", this)) 31 | .of(progressBar -> run()); 32 | } 33 | 34 | private Void run() { 35 | getStream() 36 | .peek(certificate -> progressBarHelper.next()) 37 | .forEach(iotHelper::recursiveDelete); 38 | 39 | return null; 40 | } 41 | 42 | @Override 43 | public String getCommandString() { 44 | return DELETEALLCERTIFICATES; 45 | } 46 | 47 | @Override 48 | public String getHelp() { 49 | return "Deletes all non-CA certificates."; 50 | } 51 | 52 | @Override 53 | public int requiredParameters() { 54 | return 0; 55 | } 56 | 57 | public ParameterExtractor getParameterExtractor() { 58 | return this.parameterExtractor; 59 | } 60 | 61 | @Override 62 | public Stream getStream() { 63 | return iotHelper.getCertificates(); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/certificates/DeleteCertificateCommandHandlerWithCompletion.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.certificates; 2 | 3 | 4 | import com.awslabs.iot.client.commands.iot.CertificateCommandHandlerWithCompletion; 5 | import com.awslabs.iot.client.commands.iot.completers.CertificateCompleter; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.awslabs.iot.data.CertificateArn; 8 | import com.awslabs.iot.data.ImmutableCertificateArn; 9 | import com.awslabs.iot.helpers.interfaces.IotHelper; 10 | import io.vavr.collection.List; 11 | 12 | import javax.inject.Inject; 13 | 14 | public class DeleteCertificateCommandHandlerWithCompletion implements CertificateCommandHandlerWithCompletion { 15 | private static final String DELETECERTIFICATE = "delete-certificate"; 16 | private static final int CERTIFICATE_ARN_POSITION = 0; 17 | @Inject 18 | ParameterExtractor parameterExtractor; 19 | @Inject 20 | CertificateCompleter certificateCompleter; 21 | @Inject 22 | IotHelper iotHelper; 23 | 24 | @Inject 25 | public DeleteCertificateCommandHandlerWithCompletion() { 26 | } 27 | 28 | @Override 29 | public void innerHandle(String input) { 30 | List parameters = parameterExtractor.getParameters(input); 31 | 32 | CertificateArn certificateArn = ImmutableCertificateArn.builder().arn(parameters.get(CERTIFICATE_ARN_POSITION)).build(); 33 | 34 | iotHelper.delete(certificateArn); 35 | } 36 | 37 | @Override 38 | public String getCommandString() { 39 | return DELETECERTIFICATE; 40 | } 41 | 42 | @Override 43 | public String getHelp() { 44 | return "Deletes a certificate by its ARN."; 45 | } 46 | 47 | @Override 48 | public int requiredParameters() { 49 | return 1; 50 | } 51 | 52 | public ParameterExtractor getParameterExtractor() { 53 | return this.parameterExtractor; 54 | } 55 | 56 | public CertificateCompleter getCertificateCompleter() { 57 | return this.certificateCompleter; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/certificates/DeleteUnattachedCertificatesCommandHandlerWithCompletion.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.certificates; 2 | 3 | 4 | import com.awslabs.iot.client.commands.iot.IotCommandHandler; 5 | import com.awslabs.iot.client.commands.iot.completers.CertificateCompleter; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.awslabs.iot.helpers.interfaces.IotHelper; 8 | 9 | import javax.inject.Inject; 10 | 11 | public class DeleteUnattachedCertificatesCommandHandlerWithCompletion implements IotCommandHandler { 12 | private static final String DELETEUNATTACHEDCERTIFICATES = "delete-unattached-certificates"; 13 | @Inject 14 | ParameterExtractor parameterExtractor; 15 | @Inject 16 | CertificateCompleter certificateCompleter; 17 | @Inject 18 | IotHelper iotHelper; 19 | 20 | @Inject 21 | public DeleteUnattachedCertificatesCommandHandlerWithCompletion() { 22 | } 23 | 24 | @Override 25 | public void innerHandle(String input) { 26 | iotHelper.getUnattachedCertificates() 27 | .forEach(certificate -> iotHelper.delete(certificate)); 28 | } 29 | 30 | @Override 31 | public String getCommandString() { 32 | return DELETEUNATTACHEDCERTIFICATES; 33 | } 34 | 35 | @Override 36 | public String getHelp() { 37 | return "Deletes certificates that have no policy or thing attached."; 38 | } 39 | 40 | @Override 41 | public int requiredParameters() { 42 | return 0; 43 | } 44 | 45 | public ParameterExtractor getParameterExtractor() { 46 | return this.parameterExtractor; 47 | } 48 | 49 | public CertificateCompleter getCertificateCompleter() { 50 | return this.certificateCompleter; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/certificates/ListCertificateArnsCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.certificates; 2 | 3 | 4 | import com.awslabs.iot.client.commands.iot.IotCommandHandler; 5 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 6 | import com.awslabs.iot.helpers.interfaces.IotHelper; 7 | import com.jcabi.log.Logger; 8 | import software.amazon.awssdk.services.iot.model.Certificate; 9 | 10 | import javax.inject.Inject; 11 | 12 | public class ListCertificateArnsCommandHandler implements IotCommandHandler { 13 | private static final String LISTCERTIFICATEARNS = "list-certificate-arns"; 14 | @Inject 15 | ParameterExtractor parameterExtractor; 16 | @Inject 17 | IotHelper iotHelper; 18 | 19 | @Inject 20 | public ListCertificateArnsCommandHandler() { 21 | } 22 | 23 | @Override 24 | public void innerHandle(String input) { 25 | iotHelper.getCertificates().map(Certificate::certificateArn) 26 | .forEach(certificateArn -> Logger.info(this, String.join("", " [", certificateArn, "]"))); 27 | } 28 | 29 | @Override 30 | public String getCommandString() { 31 | return LISTCERTIFICATEARNS; 32 | } 33 | 34 | @Override 35 | public String getHelp() { 36 | return "Lists all certificate ARNs."; 37 | } 38 | 39 | @Override 40 | public int requiredParameters() { 41 | return 0; 42 | } 43 | 44 | public ParameterExtractor getParameterExtractor() { 45 | return this.parameterExtractor; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/certificates/ListCertificateIdsCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.certificates; 2 | 3 | 4 | import com.awslabs.iot.client.commands.iot.IotCommandHandler; 5 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 6 | import com.awslabs.iot.helpers.interfaces.IotHelper; 7 | import com.jcabi.log.Logger; 8 | import software.amazon.awssdk.services.iot.model.Certificate; 9 | 10 | import javax.inject.Inject; 11 | 12 | public class ListCertificateIdsCommandHandler implements IotCommandHandler { 13 | private static final String LISTCERTIFICATEIDS = "list-certificate-ids"; 14 | @Inject 15 | IotHelper iotHelper; 16 | @Inject 17 | ParameterExtractor parameterExtractor; 18 | 19 | @Inject 20 | public ListCertificateIdsCommandHandler() { 21 | } 22 | 23 | @Override 24 | public void innerHandle(String input) { 25 | iotHelper.getCertificates() 26 | .map(Certificate::certificateId) 27 | .forEach(certificateId -> Logger.info(this, String.join("", " [", certificateId, "]"))); 28 | } 29 | 30 | @Override 31 | public String getCommandString() { 32 | return LISTCERTIFICATEIDS; 33 | } 34 | 35 | @Override 36 | public String getHelp() { 37 | return "Lists all certificate IDs."; 38 | } 39 | 40 | @Override 41 | public int requiredParameters() { 42 | return 0; 43 | } 44 | 45 | public ParameterExtractor getParameterExtractor() { 46 | return this.parameterExtractor; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/completers/CertificateCompleter.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.completers; 2 | 3 | import com.awslabs.iot.client.completers.DynamicStringsCompleter; 4 | import com.awslabs.iot.client.helpers.CandidateHelper; 5 | import com.awslabs.iot.helpers.interfaces.IotHelper; 6 | import io.vavr.collection.List; 7 | import org.jline.reader.Candidate; 8 | import software.amazon.awssdk.services.iot.model.Certificate; 9 | 10 | import javax.inject.Inject; 11 | 12 | public class CertificateCompleter extends DynamicStringsCompleter { 13 | @Inject 14 | IotHelper iotHelper; 15 | @Inject 16 | CandidateHelper candidateHelper; 17 | 18 | @Inject 19 | public CertificateCompleter() { 20 | } 21 | 22 | @Override 23 | public List getStrings() { 24 | return candidateHelper.getCandidates(iotHelper.getCertificates().map(Certificate::certificateArn)); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/completers/PolicyCompleter.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.completers; 2 | 3 | import com.awslabs.iot.client.completers.DynamicStringsCompleter; 4 | import com.awslabs.iot.client.helpers.CandidateHelper; 5 | import com.awslabs.iot.helpers.interfaces.IotHelper; 6 | import io.vavr.collection.List; 7 | import org.jline.reader.Candidate; 8 | import software.amazon.awssdk.services.iot.model.Policy; 9 | 10 | import javax.inject.Inject; 11 | 12 | public class PolicyCompleter extends DynamicStringsCompleter { 13 | @Inject 14 | IotHelper iotHelper; 15 | @Inject 16 | CandidateHelper candidateHelper; 17 | 18 | @Inject 19 | public PolicyCompleter() { 20 | } 21 | 22 | @Override 23 | public List getStrings() { 24 | return candidateHelper.getCandidates(iotHelper.getPolicies().map(Policy::policyName)); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/completers/RuleCompleter.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.completers; 2 | 3 | import com.awslabs.iot.client.completers.DynamicStringsCompleter; 4 | import com.awslabs.iot.client.helpers.CandidateHelper; 5 | import com.awslabs.iot.helpers.interfaces.IotHelper; 6 | import io.vavr.collection.List; 7 | import org.jline.reader.Candidate; 8 | import software.amazon.awssdk.services.iot.model.TopicRuleListItem; 9 | 10 | import javax.inject.Inject; 11 | 12 | public class RuleCompleter extends DynamicStringsCompleter { 13 | @Inject 14 | IotHelper iotHelper; 15 | @Inject 16 | CandidateHelper candidateHelper; 17 | 18 | @Inject 19 | public RuleCompleter() { 20 | } 21 | 22 | @Override 23 | public List getStrings() { 24 | return candidateHelper.getCandidates(iotHelper.getTopicRules().map(TopicRuleListItem::ruleName)); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/completers/ThingCompleter.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.completers; 2 | 3 | import com.awslabs.iot.client.completers.DynamicStringsCompleter; 4 | import com.awslabs.iot.client.helpers.CandidateHelper; 5 | import com.awslabs.iot.helpers.interfaces.IotHelper; 6 | import io.vavr.collection.List; 7 | import org.jline.reader.Candidate; 8 | import software.amazon.awssdk.services.iot.model.ThingAttribute; 9 | 10 | import javax.inject.Inject; 11 | 12 | public class ThingCompleter extends DynamicStringsCompleter { 13 | @Inject 14 | IotHelper iotHelper; 15 | @Inject 16 | CandidateHelper candidateHelper; 17 | 18 | @Inject 19 | public ThingCompleter() { 20 | } 21 | 22 | @Override 23 | public List getStrings() { 24 | return candidateHelper.getCandidates(iotHelper.getThings().map(ThingAttribute::thingName)); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/jobs/DeleteAllJobsCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.jobs; 2 | 3 | 4 | import com.awslabs.iot.client.commands.iot.IotCommandHandler; 5 | import com.awslabs.iot.client.helpers.progressbar.ProgressBarHelper; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.awslabs.iot.client.streams.interfaces.UsesStream; 8 | import com.awslabs.iot.helpers.interfaces.IotHelper; 9 | import com.jcabi.log.Logger; 10 | import io.vavr.collection.Stream; 11 | import io.vavr.control.Try; 12 | import net.jodah.failsafe.Failsafe; 13 | import net.jodah.failsafe.RetryPolicy; 14 | import software.amazon.awssdk.services.iot.IotClient; 15 | import software.amazon.awssdk.services.iot.model.DeleteJobResponse; 16 | import software.amazon.awssdk.services.iot.model.JobStatus; 17 | import software.amazon.awssdk.services.iot.model.JobSummary; 18 | import software.amazon.awssdk.services.iot.model.LimitExceededException; 19 | 20 | import javax.inject.Inject; 21 | import java.time.temporal.ChronoUnit; 22 | 23 | public class DeleteAllJobsCommandHandler implements IotCommandHandler, UsesStream { 24 | private static final String DELETE_ALL_JOBS = "delete-all-jobs"; 25 | @Inject 26 | IotHelper iotHelper; 27 | @Inject 28 | IotClient iotClient; 29 | @Inject 30 | ParameterExtractor parameterExtractor; 31 | @Inject 32 | ProgressBarHelper progressBarHelper; 33 | 34 | @Inject 35 | public DeleteAllJobsCommandHandler() { 36 | } 37 | 38 | @Override 39 | public void innerHandle(String input) { 40 | Try.withResources(() -> progressBarHelper.start("Delete all IoT jobs", this)) 41 | .of(progressBar -> run()); 42 | } 43 | 44 | private Void run() { 45 | getStream() 46 | .peek(jobSummary -> progressBarHelper.next()) 47 | // Delete the job with the retry policy 48 | .forEach(jobSummary -> Failsafe.with(getRetryPolicy()).run(() -> iotHelper.forceDelete(jobSummary))); 49 | 50 | return null; 51 | } 52 | 53 | private RetryPolicy getRetryPolicy() { 54 | return new RetryPolicy() 55 | .handle(LimitExceededException.class) 56 | .withBackoff(500, 4000, ChronoUnit.MILLIS) 57 | .withMaxRetries(20) 58 | .onRetry(failure -> progressBarHelper.throttled()) 59 | .onRetriesExceeded(failure -> Logger.error(this, "Exceeded rate limit too many times. Cannot continue.")); 60 | } 61 | 62 | @Override 63 | public String getCommandString() { 64 | return DELETE_ALL_JOBS; 65 | } 66 | 67 | @Override 68 | public String getHelp() { 69 | return "Deletes all jobs."; 70 | } 71 | 72 | @Override 73 | public int requiredParameters() { 74 | return 0; 75 | } 76 | 77 | public ParameterExtractor getParameterExtractor() { 78 | return this.parameterExtractor; 79 | } 80 | 81 | @Override 82 | public Stream getStream() { 83 | return iotHelper.getJobs() 84 | // Do not try to delete jobs that are already in being deleted 85 | .filter(jobSummary -> !jobSummary.status().equals(JobStatus.DELETION_IN_PROGRESS)); 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/mosh/BinaryMoshClientCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.mosh; 2 | 3 | public class BinaryMoshClientCommandHandler {// implements MoshClientCommandHandler { 4 | /* 5 | private static final Logger log = LoggerFactory.getLogger(BinaryMoshClientCommandHandler.class); 6 | @Inject 7 | ParameterExtractor parameterExtractor; 8 | @Inject 9 | 10 | @Inject 11 | ThingCompleter thingCompleter; 12 | @Inject 13 | Vertx vertx; 14 | @Inject 15 | MoshTopics moshTopics; 16 | @Inject 17 | WebsocketsHelper websocketsHelper; 18 | 19 | @Inject 20 | public BinaryMoshClientCommandHandler() { 21 | } 22 | 23 | @Override 24 | public WebsocketsHelper getWebsocketsHelper() { 25 | return websocketsHelper; 26 | } 27 | 28 | @Override 29 | public Logger getLogger() { 30 | return log; 31 | } 32 | 33 | public ParameterExtractor getParameterExtractor() { 34 | return this.parameterExtractor; 35 | } 36 | 37 | public IoHelper getIoHelper() { 38 | return this.ioHelper; 39 | } 40 | 41 | public ThingCompleter getThingCompleter() { 42 | return this.thingCompleter; 43 | } 44 | 45 | public Vertx getVertx() { 46 | return this.vertx; 47 | } 48 | 49 | public MoshTopics getMoshTopics() { 50 | return this.moshTopics; 51 | } 52 | */ 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/mosh/KeyAndPort.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.mosh; 2 | 3 | public class KeyAndPort { 4 | private String key; 5 | 6 | private int port; 7 | 8 | KeyAndPort(String key, int port) { 9 | this.key = key; 10 | this.port = port; 11 | } 12 | 13 | public static KeyAndPortBuilder builder() { 14 | return new KeyAndPortBuilder(); 15 | } 16 | 17 | public String getKey() { 18 | return this.key; 19 | } 20 | 21 | public void setKey(String key) { 22 | this.key = key; 23 | } 24 | 25 | public int getPort() { 26 | return this.port; 27 | } 28 | 29 | public void setPort(int port) { 30 | this.port = port; 31 | } 32 | 33 | public boolean equals(final Object o) { 34 | if (o == this) return true; 35 | if (!(o instanceof KeyAndPort)) return false; 36 | final KeyAndPort other = (KeyAndPort) o; 37 | if (!other.canEqual(this)) return false; 38 | final Object this$key = this.getKey(); 39 | final Object other$key = other.getKey(); 40 | if (this$key == null ? other$key != null : !this$key.equals(other$key)) return false; 41 | return this.getPort() == other.getPort(); 42 | } 43 | 44 | private boolean canEqual(final Object other) { 45 | return other instanceof KeyAndPort; 46 | } 47 | 48 | public int hashCode() { 49 | final int PRIME = 59; 50 | int result = 1; 51 | final Object $key = this.getKey(); 52 | result = result * PRIME + ($key == null ? 43 : $key.hashCode()); 53 | result = result * PRIME + this.getPort(); 54 | return result; 55 | } 56 | 57 | public String toString() { 58 | return String.join("", "KeyAndPort(key=", this.getKey(), ", port=", String.valueOf(this.getPort()), ")"); 59 | } 60 | 61 | public static class KeyAndPortBuilder { 62 | private String key; 63 | private int port; 64 | 65 | KeyAndPortBuilder() { 66 | } 67 | 68 | public KeyAndPort.KeyAndPortBuilder key(String key) { 69 | this.key = key; 70 | return this; 71 | } 72 | 73 | public KeyAndPort.KeyAndPortBuilder port(int port) { 74 | this.port = port; 75 | return this; 76 | } 77 | 78 | public KeyAndPort build() { 79 | return new KeyAndPort(key, port); 80 | } 81 | 82 | public String toString() { 83 | return String.join("", "KeyAndPort.KeyAndPortBuilder(key=", this.key, ", port=", String.valueOf(this.port), ")"); 84 | } 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/mosh/MoshDatagramSocket.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.mosh; 2 | 3 | import io.vavr.control.Option; 4 | import io.vertx.core.datagram.DatagramSocket; 5 | 6 | class MoshDatagramSocket { 7 | private final DatagramSocket datagramSocket; 8 | 9 | private Option sourcePort; 10 | 11 | public MoshDatagramSocket(DatagramSocket datagramSocket) { 12 | this.datagramSocket = datagramSocket; 13 | } 14 | 15 | public DatagramSocket getDatagramSocket() { 16 | return this.datagramSocket; 17 | } 18 | 19 | public Option getSourcePort() { 20 | return this.sourcePort; 21 | } 22 | 23 | public void setSourcePort(Option sourcePort) { 24 | this.sourcePort = sourcePort; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/mosh/MoshTopics.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.mosh; 2 | 3 | import javax.inject.Inject; 4 | 5 | public class MoshTopics { 6 | public static final String CDD = "cdd"; 7 | public static final String MOSH = "mosh"; 8 | public static final String DATA = "data"; 9 | public static final String CLIENT = "client"; 10 | public static final String SERVER = "server"; 11 | private static final String DELIMITER = "/"; 12 | private static final String REQUEST = "request"; 13 | private static final String NEW = "new"; 14 | private static final String RESPONSE = "response"; 15 | 16 | @Inject 17 | public MoshTopics() { 18 | } 19 | 20 | private String getBaselineTopic(String serverName) { 21 | return String.join(DELIMITER, serverName, CDD, MOSH); 22 | } 23 | 24 | private String getBaselineClientTopic(String serverName) { 25 | return String.join(DELIMITER, getBaselineTopic(serverName), DATA, CLIENT); 26 | } 27 | 28 | private String getBaselineServerTopic(String serverName) { 29 | return String.join(DELIMITER, getBaselineTopic(serverName), DATA, SERVER); 30 | } 31 | 32 | public String getDataServerTopic(String serverName, int port) { 33 | return String.join(DELIMITER, getBaselineServerTopic(serverName), String.valueOf(port)); 34 | } 35 | 36 | public String getDataClientTopic(String serverName, int port) { 37 | return String.join(DELIMITER, getBaselineClientTopic(serverName), String.valueOf(port)); 38 | } 39 | 40 | public String getNewResponseTopic(String serverName) { 41 | return String.join(DELIMITER, getBaselineTopic(serverName), RESPONSE); 42 | } 43 | 44 | public String getNewRequestTopic(String serverName) { 45 | return String.join(DELIMITER, getBaselineTopic(serverName), REQUEST, NEW); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/policies/DeleteAllPoliciesCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.policies; 2 | 3 | 4 | import com.awslabs.iot.client.commands.iot.IotCommandHandler; 5 | import com.awslabs.iot.client.helpers.progressbar.ProgressBarHelper; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.awslabs.iot.client.streams.interfaces.UsesStream; 8 | import com.awslabs.iot.helpers.interfaces.IotHelper; 9 | import io.vavr.collection.Stream; 10 | import io.vavr.control.Try; 11 | import software.amazon.awssdk.services.iot.model.Policy; 12 | 13 | import javax.inject.Inject; 14 | 15 | public class DeleteAllPoliciesCommandHandler implements IotCommandHandler, UsesStream { 16 | private static final String DELETEALLPOLICIES = "delete-all-policies"; 17 | @Inject 18 | ParameterExtractor parameterExtractor; 19 | @Inject 20 | IotHelper iotHelper; 21 | @Inject 22 | ProgressBarHelper progressBarHelper; 23 | 24 | @Inject 25 | public DeleteAllPoliciesCommandHandler() { 26 | } 27 | 28 | @Override 29 | public void innerHandle(String input) { 30 | Try.withResources(() -> progressBarHelper.start("Delete all IoT policies", this)) 31 | .of(progressBar -> run()); 32 | } 33 | 34 | private Void run() { 35 | getStream() 36 | .peek(policy -> progressBarHelper.next()) 37 | // Ignore all failures 38 | .forEach(policy -> Try.run(() -> iotHelper.delete(policy))); 39 | 40 | return null; 41 | } 42 | 43 | @Override 44 | public String getCommandString() { 45 | return DELETEALLPOLICIES; 46 | } 47 | 48 | @Override 49 | public String getHelp() { 50 | return "Deletes all IoT policies."; 51 | } 52 | 53 | @Override 54 | public int requiredParameters() { 55 | return 0; 56 | } 57 | 58 | public ParameterExtractor getParameterExtractor() { 59 | return this.parameterExtractor; 60 | } 61 | 62 | @Override 63 | public Stream getStream() { 64 | return iotHelper.getPolicies(); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/policies/DeletePolicyCommandHandlerWithCompletion.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.policies; 2 | 3 | 4 | import com.awslabs.iot.client.commands.iot.PolicyCommandHandlerWithCompletion; 5 | import com.awslabs.iot.client.commands.iot.completers.PolicyCompleter; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.awslabs.iot.data.ImmutablePolicyName; 8 | import com.awslabs.iot.data.PolicyName; 9 | import com.awslabs.iot.helpers.interfaces.IotHelper; 10 | import io.vavr.collection.List; 11 | 12 | import javax.inject.Inject; 13 | 14 | public class DeletePolicyCommandHandlerWithCompletion implements PolicyCommandHandlerWithCompletion { 15 | private static final String DELETEPOLICY = "delete-policy"; 16 | private static final int POLICY_NAME_POSITION = 0; 17 | @Inject 18 | IotHelper iotHelper; 19 | @Inject 20 | ParameterExtractor parameterExtractor; 21 | @Inject 22 | PolicyCompleter policyCompleter; 23 | 24 | @Inject 25 | public DeletePolicyCommandHandlerWithCompletion() { 26 | } 27 | 28 | @Override 29 | public void innerHandle(String input) { 30 | List parameters = parameterExtractor.getParameters(input); 31 | 32 | PolicyName policyName = ImmutablePolicyName.builder().name(parameters.get(POLICY_NAME_POSITION)).build(); 33 | 34 | iotHelper.delete(policyName); 35 | } 36 | 37 | @Override 38 | public String getCommandString() { 39 | return DELETEPOLICY; 40 | } 41 | 42 | @Override 43 | public String getHelp() { 44 | return "Deletes a policy by name."; 45 | } 46 | 47 | @Override 48 | public int requiredParameters() { 49 | return 1; 50 | } 51 | 52 | public ParameterExtractor getParameterExtractor() { 53 | return this.parameterExtractor; 54 | } 55 | 56 | public PolicyCompleter getPolicyCompleter() { 57 | return this.policyCompleter; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/policies/ListPoliciesCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.policies; 2 | 3 | 4 | import com.awslabs.iot.client.commands.iot.IotCommandHandler; 5 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 6 | import com.awslabs.iot.helpers.interfaces.IotHelper; 7 | import com.jcabi.log.Logger; 8 | import software.amazon.awssdk.services.iot.model.Policy; 9 | 10 | import javax.inject.Inject; 11 | 12 | public class ListPoliciesCommandHandler implements IotCommandHandler { 13 | private static final String LISTPOLICIES = "list-policies"; 14 | @Inject 15 | IotHelper iotHelper; 16 | @Inject 17 | ParameterExtractor parameterExtractor; 18 | 19 | @Inject 20 | public ListPoliciesCommandHandler() { 21 | } 22 | 23 | @Override 24 | public void innerHandle(String input) { 25 | iotHelper.getPolicies() 26 | .map(Policy::policyName) 27 | .forEach(policyName -> Logger.info(this, String.join("", " [", policyName, "]"))); 28 | } 29 | 30 | @Override 31 | public String getCommandString() { 32 | return LISTPOLICIES; 33 | } 34 | 35 | @Override 36 | public String getHelp() { 37 | return "Lists all policy names."; 38 | } 39 | 40 | @Override 41 | public int requiredParameters() { 42 | return 0; 43 | } 44 | 45 | public ParameterExtractor getParameterExtractor() { 46 | return this.parameterExtractor; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/publish/MqttPublishCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.publish; 2 | 3 | 4 | import com.awslabs.iot.client.helpers.iot.interfaces.WebsocketsHelper; 5 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 6 | import com.jcabi.log.Logger; 7 | import io.vavr.control.Try; 8 | import org.eclipse.paho.client.mqttv3.MqttClient; 9 | 10 | import javax.inject.Inject; 11 | 12 | public class MqttPublishCommandHandler implements PublishCommandHandler { 13 | private static final String MQTTPUBLISH = "mqtt-publish"; 14 | @Inject 15 | ParameterExtractor parameterExtractor; 16 | @Inject 17 | WebsocketsHelper websocketsHelper; 18 | 19 | @Inject 20 | public MqttPublishCommandHandler() { 21 | } 22 | 23 | @Override 24 | public int requiredParameters() { 25 | return 2; 26 | } 27 | 28 | @Override 29 | public void publish(String topic, String message) { 30 | MqttClient mqttClient = Try.of(() -> websocketsHelper.connectMqttClientAndPublish(topic, message)).get(); 31 | Try.run(mqttClient::disconnect) 32 | .onFailure(throwable -> Logger.info(this, String.join("", "Exception: [", throwable.getMessage(), "]"))); 33 | Try.run(() -> websocketsHelper.close(mqttClient)) 34 | .onFailure(throwable -> Logger.info(this, String.join("", "Exception: [", throwable.getMessage(), "]"))); 35 | } 36 | 37 | @Override 38 | public String getCommandString() { 39 | return MQTTPUBLISH; 40 | } 41 | 42 | @Override 43 | public String getHelp() { 44 | return "Publishes a message using MQTT. First parameter is the topic, second parameter is the message."; 45 | } 46 | 47 | public ParameterExtractor getParameterExtractor() { 48 | return this.parameterExtractor; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/publish/MqttSubscribeCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.publish; 2 | 3 | 4 | import com.awslabs.iot.client.commands.iot.IotCommandHandler; 5 | import com.awslabs.iot.client.helpers.iot.interfaces.WebsocketsHelper; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.jcabi.log.Logger; 8 | import io.vavr.collection.List; 9 | import io.vavr.control.Try; 10 | import org.eclipse.paho.client.mqttv3.MqttClient; 11 | import org.eclipse.paho.client.mqttv3.MqttMessage; 12 | 13 | import javax.inject.Inject; 14 | 15 | public class MqttSubscribeCommandHandler implements IotCommandHandler { 16 | private static final String MQTTSUBSCRIBE = "mqtt-subscribe"; 17 | @Inject 18 | ParameterExtractor parameterExtractor; 19 | @Inject 20 | WebsocketsHelper websocketsHelper; 21 | 22 | @Inject 23 | public MqttSubscribeCommandHandler() { 24 | } 25 | 26 | @Override 27 | public int requiredParameters() { 28 | return 1; 29 | } 30 | 31 | @Override 32 | public String getCommandString() { 33 | return MQTTSUBSCRIBE; 34 | } 35 | 36 | @Override 37 | public String getHelp() { 38 | return "Subscribes to a topic using MQTT."; 39 | } 40 | 41 | @Override 42 | public void innerHandle(String input) { 43 | List parameters = getParameterExtractor().getParameters(input); 44 | String topic = parameters.get(0); 45 | 46 | MqttClient mqttClient = Try.of(() -> websocketsHelper.connectMqttClientAndSubscribe(topic)).get(); 47 | 48 | WebsocketsHelper.Function messageLoggingCallback = (topic1, mqttMessage) -> { 49 | Logger.info(this, String.format("[%s] - length: [%d] [%s]", topic1, mqttMessage.getPayload().length, new String(mqttMessage.getPayload()))); 50 | return null; 51 | }; 52 | 53 | mqttClient.setCallback(websocketsHelper.buildMessageCallback(messageLoggingCallback)); 54 | } 55 | 56 | public ParameterExtractor getParameterExtractor() { 57 | return this.parameterExtractor; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/publish/PublishCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.publish; 2 | 3 | import com.awslabs.iot.client.commands.iot.IotCommandHandler; 4 | import com.google.gson.Gson; 5 | import io.vavr.collection.List; 6 | 7 | import java.util.Map; 8 | 9 | public interface PublishCommandHandler extends IotCommandHandler { 10 | default void innerHandle(String input) { 11 | List parameters = getParameterExtractor().getParameters(input); 12 | String topic = parameters.get(0); 13 | String json = parameters.get(1); 14 | 15 | publish(topic, json); 16 | } 17 | 18 | void publish(String topic, String message); 19 | 20 | default void publish(String topic, Map message) { 21 | String json = new Gson().toJson(message); 22 | publish(topic, json); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/publish/RestPublishCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.publish; 2 | 3 | 4 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 5 | import com.awslabs.iot.data.ImmutableTopicName; 6 | import com.awslabs.iot.data.Qos; 7 | import com.awslabs.iot.data.TopicName; 8 | import com.awslabs.iot.helpers.interfaces.IotHelper; 9 | 10 | import javax.inject.Inject; 11 | 12 | public class RestPublishCommandHandler implements PublishCommandHandler { 13 | private static final String RESTPUBLISH = "rest-publish"; 14 | @Inject 15 | IotHelper iotHelper; 16 | @Inject 17 | ParameterExtractor parameterExtractor; 18 | 19 | @Inject 20 | public RestPublishCommandHandler() { 21 | } 22 | 23 | @Override 24 | public int requiredParameters() { 25 | return 2; 26 | } 27 | 28 | @Override 29 | public void publish(String topic, String message) { 30 | TopicName topicName = ImmutableTopicName.builder().name(topic).build(); 31 | 32 | iotHelper.publish(topicName, Qos.ZERO, message); 33 | } 34 | 35 | @Override 36 | public String getCommandString() { 37 | return RESTPUBLISH; 38 | } 39 | 40 | @Override 41 | public String getHelp() { 42 | return "Publishes a message using the REST APIs. First parameter is the topic, second parameter is the message."; 43 | } 44 | 45 | public ParameterExtractor getParameterExtractor() { 46 | return this.parameterExtractor; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/publish/TestPublishCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.publish; 2 | 3 | import javax.inject.Inject; 4 | 5 | public class TestPublishCommandHandler extends RestPublishCommandHandler { 6 | private static final String TEST_PUBLISH = "test-publish"; 7 | private static final String TEST_TOPIC = "test"; 8 | private static final String TEST_MESSAGE = "This is a test"; 9 | 10 | @Inject 11 | public TestPublishCommandHandler() { 12 | } 13 | 14 | @Override 15 | public void innerHandle(String input) { 16 | publish(TEST_TOPIC, String.join("", "[", String.valueOf(System.currentTimeMillis()), "] ", TEST_MESSAGE)); 17 | } 18 | 19 | @Override 20 | public String getCommandString() { 21 | return TEST_PUBLISH; 22 | } 23 | 24 | @Override 25 | public String getHelp() { 26 | return String.join("", "Publishes the message '", TEST_MESSAGE, "', with a leading epoch milliseconds timestamp, to the topic '", TEST_TOPIC, "' using the REST APIs."); 27 | } 28 | 29 | @Override 30 | public int requiredParameters() { 31 | return 0; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/rules/CreateTopicRuleCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.rules; 2 | 3 | 4 | import com.awslabs.iam.data.ImmutableRoleName; 5 | import com.awslabs.iam.data.RoleName; 6 | import com.awslabs.iam.helpers.interfaces.IamHelper; 7 | import com.awslabs.iot.client.commands.iam.completers.RoleCompleter; 8 | import com.awslabs.iot.client.commands.iot.IotCommandHandler; 9 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 10 | import com.awslabs.iot.data.ImmutableRuleName; 11 | import com.awslabs.iot.data.RuleName; 12 | import com.awslabs.iot.helpers.interfaces.IotHelper; 13 | import com.jcabi.log.Logger; 14 | import io.vavr.collection.List; 15 | import org.jline.reader.Completer; 16 | import org.jline.reader.impl.completer.ArgumentCompleter; 17 | import org.jline.reader.impl.completer.NullCompleter; 18 | import software.amazon.awssdk.services.iam.model.Role; 19 | import software.amazon.awssdk.services.iot.model.Action; 20 | import software.amazon.awssdk.services.iot.model.RepublishAction; 21 | import software.amazon.awssdk.services.iot.model.TopicRulePayload; 22 | 23 | import javax.inject.Inject; 24 | 25 | public class CreateTopicRuleCommandHandler implements IotCommandHandler { 26 | private static final String CREATETOPICRULE = "create-topic-rule"; 27 | private static final int ROLE_NAME_POSITION = 0; 28 | private static final int TOPIC_NAME_POSITION = 1; 29 | private static final int RULE_NAME_POSITION = 2; 30 | private static final int SQL_POSITION = 3; 31 | @Inject 32 | RoleCompleter roleCompleter; 33 | @Inject 34 | IamHelper iamHelper; 35 | @Inject 36 | IotHelper iotHelper; 37 | @Inject 38 | ParameterExtractor parameterExtractor; 39 | 40 | @Inject 41 | public CreateTopicRuleCommandHandler() { 42 | } 43 | 44 | @Override 45 | public Completer getCompleter() { 46 | return new ArgumentCompleter(getCommandNameCompleter(), roleCompleter, new NullCompleter()); 47 | } 48 | 49 | @Override 50 | public void showUsage() { 51 | Logger.info(this, "You must specify the name of the role that will be used for republishing, the republish topic, the rule name, and the rule SQL"); 52 | } 53 | 54 | @Override 55 | public void innerHandle(String input) { 56 | List parameters = parameterExtractor.getParameters(input); 57 | 58 | RoleName roleName = ImmutableRoleName.builder().name(parameters.get(ROLE_NAME_POSITION)).build(); 59 | String topicName = parameters.get(TOPIC_NAME_POSITION); 60 | RuleName ruleName = ImmutableRuleName.builder().name(parameters.get(RULE_NAME_POSITION)).build(); 61 | String sql = parameters.get(SQL_POSITION); 62 | 63 | // Throw an exception if the role isn't present 64 | Role role = iamHelper.getRole(roleName).get(); 65 | 66 | RepublishAction republishAction = RepublishAction.builder() 67 | .roleArn(role.arn()) 68 | .topic(topicName) 69 | .build(); 70 | 71 | Action action = Action.builder() 72 | .republish(republishAction) 73 | .build(); 74 | 75 | TopicRulePayload topicRulePayload = TopicRulePayload.builder() 76 | .ruleDisabled(false) 77 | .actions(action) 78 | .sql(sql) 79 | .build(); 80 | 81 | iotHelper.createTopicRule(ruleName, topicRulePayload); 82 | } 83 | 84 | @Override 85 | public String getCommandString() { 86 | return CREATETOPICRULE; 87 | } 88 | 89 | @Override 90 | public String getHelp() { 91 | return "Creates a rule. First parameter is the output topic, second parameter is the rule name, third parameter is the SQL."; 92 | } 93 | 94 | @Override 95 | public int requiredParameters() { 96 | return 4; 97 | } 98 | 99 | public ParameterExtractor getParameterExtractor() { 100 | return this.parameterExtractor; 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/rules/DeleteTopicRuleCommandHandlerWithCompletion.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.rules; 2 | 3 | 4 | import com.awslabs.iot.client.commands.iot.RuleCommandHandlerWithCompletion; 5 | import com.awslabs.iot.client.commands.iot.completers.RuleCompleter; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.awslabs.iot.data.ImmutableRuleName; 8 | import com.awslabs.iot.data.RuleName; 9 | import com.awslabs.iot.helpers.interfaces.IotHelper; 10 | import com.jcabi.log.Logger; 11 | import io.vavr.collection.List; 12 | 13 | import javax.inject.Inject; 14 | 15 | public class DeleteTopicRuleCommandHandlerWithCompletion implements RuleCommandHandlerWithCompletion { 16 | private static final String DELETETOPICRULE = "delete-topic-rule"; 17 | private static final int TOPIC_RULE_NAME_POSITION = 0; 18 | @Inject 19 | ParameterExtractor parameterExtractor; 20 | @Inject 21 | RuleCompleter ruleCompleter; 22 | @Inject 23 | IotHelper iotHelper; 24 | 25 | @Inject 26 | public DeleteTopicRuleCommandHandlerWithCompletion() { 27 | } 28 | 29 | @Override 30 | public void innerHandle(String input) { 31 | List parameters = parameterExtractor.getParameters(input); 32 | 33 | RuleName topicRuleName = ImmutableRuleName.builder().name(parameters.get(TOPIC_RULE_NAME_POSITION)).build(); 34 | 35 | iotHelper.deleteTopicRule(topicRuleName); 36 | } 37 | 38 | @Override 39 | public void showUsage() { 40 | Logger.info(this, "You must specify the name of the topic rule you want to delete."); 41 | } 42 | 43 | @Override 44 | public String getCommandString() { 45 | return DELETETOPICRULE; 46 | } 47 | 48 | @Override 49 | public String getHelp() { 50 | return "Deletes a rule by name."; 51 | } 52 | 53 | @Override 54 | public int requiredParameters() { 55 | return 1; 56 | } 57 | 58 | public ParameterExtractor getParameterExtractor() { 59 | return this.parameterExtractor; 60 | } 61 | 62 | public RuleCompleter getRuleCompleter() { 63 | return this.ruleCompleter; 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/rules/ListTopicRulesCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.rules; 2 | 3 | 4 | import com.awslabs.iot.client.commands.iot.IotCommandHandler; 5 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 6 | import com.awslabs.iot.helpers.interfaces.IotHelper; 7 | import com.jcabi.log.Logger; 8 | import software.amazon.awssdk.services.iot.model.TopicRuleListItem; 9 | 10 | import javax.inject.Inject; 11 | 12 | public class ListTopicRulesCommandHandler implements IotCommandHandler { 13 | private static final String LISTTOPICRULES = "list-topic-rules"; 14 | @Inject 15 | IotHelper iotHelper; 16 | @Inject 17 | ParameterExtractor parameterExtractor; 18 | 19 | @Inject 20 | public ListTopicRulesCommandHandler() { 21 | } 22 | 23 | @Override 24 | public void innerHandle(String input) { 25 | iotHelper.getTopicRules() 26 | .map(TopicRuleListItem::ruleName) 27 | .forEach(topicRuleName -> Logger.info(this, String.join("", " [", topicRuleName, "]"))); 28 | } 29 | 30 | @Override 31 | public String getCommandString() { 32 | return LISTTOPICRULES; 33 | } 34 | 35 | @Override 36 | public String getHelp() { 37 | return "Lists all topic rules."; 38 | } 39 | 40 | @Override 41 | public int requiredParameters() { 42 | return 0; 43 | } 44 | 45 | public ParameterExtractor getParameterExtractor() { 46 | return this.parameterExtractor; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/things/DeleteAllThingGroupsCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.things; 2 | 3 | 4 | import com.awslabs.iot.client.commands.iot.IotCommandHandler; 5 | import com.awslabs.iot.client.helpers.progressbar.ProgressBarHelper; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.awslabs.iot.client.streams.interfaces.UsesStream; 8 | import com.awslabs.iot.helpers.interfaces.IotHelper; 9 | import io.vavr.collection.Stream; 10 | import io.vavr.control.Try; 11 | import software.amazon.awssdk.services.iot.model.GroupNameAndArn; 12 | 13 | import javax.inject.Inject; 14 | 15 | public class DeleteAllThingGroupsCommandHandler implements IotCommandHandler, UsesStream { 16 | private static final String DELETEALLTHINGGROUPS = "delete-all-thing-groups"; 17 | @Inject 18 | ParameterExtractor parameterExtractor; 19 | @Inject 20 | IotHelper iotHelper; 21 | @Inject 22 | ProgressBarHelper progressBarHelper; 23 | 24 | @Inject 25 | public DeleteAllThingGroupsCommandHandler() { 26 | } 27 | 28 | @Override 29 | public void innerHandle(String input) { 30 | Try.withResources(() -> progressBarHelper.start("Delete all IoT thing groups", this)) 31 | .of(progressBar -> run()); 32 | } 33 | 34 | private Void run() { 35 | getStream() 36 | .peek(definitionInformation -> progressBarHelper.next()) 37 | .forEach(iotHelper::delete); 38 | 39 | return null; 40 | } 41 | 42 | @Override 43 | public String getCommandString() { 44 | return DELETEALLTHINGGROUPS; 45 | } 46 | 47 | @Override 48 | public String getHelp() { 49 | return "Deletes all thing groups."; 50 | } 51 | 52 | @Override 53 | public int requiredParameters() { 54 | return 0; 55 | } 56 | 57 | public ParameterExtractor getParameterExtractor() { 58 | return this.parameterExtractor; 59 | } 60 | 61 | @Override 62 | public Stream getStream() { 63 | return iotHelper.getThingGroups(); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/things/DeleteAllThingsCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.things; 2 | 3 | 4 | import com.awslabs.iot.client.commands.iot.IotCommandHandler; 5 | import com.awslabs.iot.client.helpers.progressbar.ProgressBarHelper; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.awslabs.iot.client.streams.interfaces.UsesStream; 8 | import com.awslabs.iot.data.ImmutableThingName; 9 | import com.awslabs.iot.helpers.interfaces.IotHelper; 10 | import io.vavr.collection.Stream; 11 | import io.vavr.control.Try; 12 | import software.amazon.awssdk.services.iot.model.ThingAttribute; 13 | 14 | import javax.inject.Inject; 15 | 16 | public class DeleteAllThingsCommandHandler implements IotCommandHandler, UsesStream { 17 | private static final String DELETEALLTHINGS = "delete-all-things"; 18 | @Inject 19 | ParameterExtractor parameterExtractor; 20 | @Inject 21 | IotHelper iotHelper; 22 | @Inject 23 | ProgressBarHelper progressBarHelper; 24 | 25 | @Inject 26 | public DeleteAllThingsCommandHandler() { 27 | } 28 | 29 | @Override 30 | public void innerHandle(String input) { 31 | Try.withResources(() -> progressBarHelper.start("Delete all IoT things", this)) 32 | .of(progressBar -> run()); 33 | } 34 | 35 | private Void run() { 36 | getStream() 37 | .map(thingAttribute -> ImmutableThingName.builder().name(thingAttribute.thingName()).build()) 38 | // Filter out non-immutable things 39 | .filter(thingName -> !iotHelper.isThingImmutable(thingName)) 40 | .peek(thingName -> progressBarHelper.next()) 41 | // Rethrow all exceptions 42 | .forEach(iotHelper::delete); 43 | 44 | return null; 45 | } 46 | 47 | @Override 48 | public String getCommandString() { 49 | return DELETEALLTHINGS; 50 | } 51 | 52 | @Override 53 | public String getHelp() { 54 | return "Deletes all things."; 55 | } 56 | 57 | @Override 58 | public int requiredParameters() { 59 | return 0; 60 | } 61 | 62 | public ParameterExtractor getParameterExtractor() { 63 | return this.parameterExtractor; 64 | } 65 | 66 | @Override 67 | public Stream getStream() { 68 | return iotHelper.getThings(); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/things/DeleteThingCommandHandlerWithCompletion.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.things; 2 | 3 | 4 | import com.awslabs.iot.client.commands.iot.ThingCommandHandlerWithCompletion; 5 | import com.awslabs.iot.client.commands.iot.completers.ThingCompleter; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.awslabs.iot.data.ImmutableThingName; 8 | import com.awslabs.iot.data.ThingName; 9 | import com.awslabs.iot.helpers.interfaces.IotHelper; 10 | import io.vavr.collection.List; 11 | 12 | import javax.inject.Inject; 13 | 14 | public class DeleteThingCommandHandlerWithCompletion implements ThingCommandHandlerWithCompletion { 15 | private static final String DELETETHING = "delete-thing"; 16 | private static final int THING_NAME_POSITION = 0; 17 | @Inject 18 | ParameterExtractor parameterExtractor; 19 | @Inject 20 | IotHelper iotHelper; 21 | @Inject 22 | ThingCompleter thingCompleter; 23 | 24 | @Inject 25 | public DeleteThingCommandHandlerWithCompletion() { 26 | } 27 | 28 | @Override 29 | public void innerHandle(String input) { 30 | List parameters = parameterExtractor.getParameters(input); 31 | 32 | ThingName thingName = ImmutableThingName.builder().name(parameters.get(THING_NAME_POSITION)).build(); 33 | 34 | iotHelper.delete(thingName); 35 | } 36 | 37 | @Override 38 | public String getCommandString() { 39 | return DELETETHING; 40 | } 41 | 42 | @Override 43 | public String getHelp() { 44 | return "Deletes a thing by name."; 45 | } 46 | 47 | @Override 48 | public int requiredParameters() { 49 | return 1; 50 | } 51 | 52 | public ParameterExtractor getParameterExtractor() { 53 | return this.parameterExtractor; 54 | } 55 | 56 | public ThingCompleter getThingCompleter() { 57 | return this.thingCompleter; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/things/ListThingPrincipalsCommandHandlerWithCompletion.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.things; 2 | 3 | 4 | import com.awslabs.iot.client.commands.iot.ThingCommandHandlerWithCompletion; 5 | import com.awslabs.iot.client.commands.iot.completers.ThingCompleter; 6 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 7 | import com.awslabs.iot.data.ImmutableThingName; 8 | import com.awslabs.iot.data.ThingName; 9 | import com.awslabs.iot.data.ThingPrincipal; 10 | import com.awslabs.iot.helpers.interfaces.IotHelper; 11 | import com.jcabi.log.Logger; 12 | import io.vavr.collection.List; 13 | 14 | import javax.inject.Inject; 15 | 16 | public class ListThingPrincipalsCommandHandlerWithCompletion implements ThingCommandHandlerWithCompletion { 17 | private static final String LISTTHINGPRINCIPALS = "list-thing-principals"; 18 | private static final int THING_NAME_POSITION = 0; 19 | @Inject 20 | IotHelper iotHelper; 21 | @Inject 22 | ParameterExtractor parameterExtractor; 23 | @Inject 24 | ThingCompleter thingCompleter; 25 | 26 | @Inject 27 | public ListThingPrincipalsCommandHandlerWithCompletion() { 28 | } 29 | 30 | @Override 31 | public void innerHandle(String input) { 32 | List parameters = parameterExtractor.getParameters(input); 33 | 34 | ThingName thingName = ImmutableThingName.builder().name(parameters.get(THING_NAME_POSITION)).build(); 35 | 36 | List principals = iotHelper.getThingPrincipals(thingName) 37 | .toList(); 38 | 39 | if (principals.size() != 0) { 40 | Logger.info(this, String.join("", "Principals attached to thing [", thingName.getName(), "]")); 41 | } 42 | 43 | principals.forEach(principal -> Logger.info(this, String.join("", " ", principal.getPrincipal()))); 44 | } 45 | 46 | @Override 47 | public String getCommandString() { 48 | return LISTTHINGPRINCIPALS; 49 | } 50 | 51 | @Override 52 | public String getHelp() { 53 | return "Lists principals attached to a thing."; 54 | } 55 | 56 | @Override 57 | public int requiredParameters() { 58 | return 1; 59 | } 60 | 61 | public ParameterExtractor getParameterExtractor() { 62 | return this.parameterExtractor; 63 | } 64 | 65 | public ThingCompleter getThingCompleter() { 66 | return this.thingCompleter; 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/iot/things/ListThingsCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.iot.things; 2 | 3 | 4 | import com.awslabs.iot.client.commands.iot.IotCommandHandler; 5 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 6 | import com.awslabs.iot.helpers.interfaces.IotHelper; 7 | import com.jcabi.log.Logger; 8 | import io.vavr.control.Option; 9 | import software.amazon.awssdk.services.iot.model.ThingAttribute; 10 | 11 | import javax.inject.Inject; 12 | 13 | public class ListThingsCommandHandler implements IotCommandHandler { 14 | private static final String LISTTHINGS = "list-things"; 15 | @Inject 16 | IotHelper iotHelper; 17 | @Inject 18 | ParameterExtractor parameterExtractor; 19 | 20 | @Inject 21 | public ListThingsCommandHandler() { 22 | } 23 | 24 | @Override 25 | public void innerHandle(String input) { 26 | iotHelper.getThings() 27 | .forEach(this::logThingInfo); 28 | } 29 | 30 | private void logThingInfo(ThingAttribute thingAttribute) { 31 | Option optionalThingTypeName = Option.of(thingAttribute.thingTypeName()); 32 | Logger.info(this, String.join("", " [", thingAttribute.thingName(), "] [", optionalThingTypeName.getOrElse("NO THING TYPE"), "]")); 33 | } 34 | 35 | @Override 36 | public String getCommandString() { 37 | return LISTTHINGS; 38 | } 39 | 40 | @Override 41 | public String getHelp() { 42 | return "Lists all things."; 43 | } 44 | 45 | @Override 46 | public int requiredParameters() { 47 | return 0; 48 | } 49 | 50 | public ParameterExtractor getParameterExtractor() { 51 | return this.parameterExtractor; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/lambda/DeleteLambdaFunctionsCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.lambda; 2 | 3 | 4 | import com.awslabs.iot.client.commands.interfaces.CommandHandler; 5 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 6 | import com.awslabs.resultsiterator.implementations.ResultsIterator; 7 | import com.jcabi.log.Logger; 8 | import io.vavr.collection.Stream; 9 | import software.amazon.awssdk.services.lambda.LambdaClient; 10 | import software.amazon.awssdk.services.lambda.model.DeleteFunctionRequest; 11 | import software.amazon.awssdk.services.lambda.model.FunctionConfiguration; 12 | import software.amazon.awssdk.services.lambda.model.ListFunctionsRequest; 13 | 14 | import javax.inject.Inject; 15 | 16 | public class DeleteLambdaFunctionsCommandHandler implements CommandHandler { 17 | private static final String LAMBDADELETE = "lambda-delete"; 18 | @Inject 19 | ParameterExtractor parameterExtractor; 20 | @Inject 21 | LambdaClient lambdaClient; 22 | 23 | @Inject 24 | public DeleteLambdaFunctionsCommandHandler() { 25 | } 26 | 27 | @Override 28 | public int requiredParameters() { 29 | return 1; 30 | } 31 | 32 | @Override 33 | public String getCommandString() { 34 | return LAMBDADELETE; 35 | } 36 | 37 | @Override 38 | public String getHelp() { 39 | return "Deletes Lambda functions. First parameter is the function name. Wildcards are supported."; 40 | } 41 | 42 | @Override 43 | public void innerHandle(String input) { 44 | String name = getParameterExtractor().getParameters(input).get(0); 45 | 46 | ListFunctionsRequest listFunctionsRequest = ListFunctionsRequest.builder().build(); 47 | 48 | Stream functionConfigurations = new ResultsIterator(lambdaClient, listFunctionsRequest).stream(); 49 | 50 | functionConfigurations 51 | .filter(functionConfiguration -> functionConfiguration.functionName().matches(name)) 52 | .forEach(this::deleteFunction); 53 | } 54 | 55 | private void deleteFunction(FunctionConfiguration functionConfiguration) { 56 | String name = functionConfiguration.functionName(); 57 | Logger.info(this, String.join(" ", "Deleting function:", name)); 58 | 59 | DeleteFunctionRequest deleteFunctionRequest = DeleteFunctionRequest.builder() 60 | .functionName(name) 61 | .build(); 62 | 63 | lambdaClient.deleteFunction(deleteFunctionRequest); 64 | } 65 | 66 | public ParameterExtractor getParameterExtractor() { 67 | return this.parameterExtractor; 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/logs/GetLogsCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.logs; 2 | 3 | 4 | import com.awslabs.iot.client.helpers.cloudwatch.LogsHelper; 5 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 6 | import com.jcabi.log.Logger; 7 | import io.vavr.collection.List; 8 | import io.vavr.control.Option; 9 | import software.amazon.awssdk.services.cloudwatchlogs.model.OutputLogEvent; 10 | 11 | import javax.inject.Inject; 12 | import javax.inject.Provider; 13 | 14 | public class GetLogsCommandHandler implements LogsCommandHandler { 15 | private static final String GET = "get"; 16 | @Inject 17 | Provider logsHelperProvider; 18 | @Inject 19 | ParameterExtractor parameterExtractor; 20 | 21 | @Inject 22 | public GetLogsCommandHandler() { 23 | } 24 | 25 | @Override 26 | public void innerHandle(String input) { 27 | List parameters = parameterExtractor.getParameters(input); 28 | 29 | String logGroupName = parameters.get(0); 30 | 31 | List logs = logsHelperProvider.get().getLogs(logGroupName, parameters); 32 | 33 | logs.forEach(outputLogEvent -> Logger.info(this, outputLogEvent.message())); 34 | } 35 | 36 | @Override 37 | public String getCommandString() { 38 | return GET; 39 | } 40 | 41 | @Override 42 | public String getHelp() { 43 | return "Finds log messages in CloudWatch logs. First parameter is log group name, subsequent parameters are search strings that all must be present in the log message."; 44 | } 45 | 46 | @Override 47 | public int requiredParameters() { 48 | return 2; 49 | } 50 | 51 | @Override 52 | public Option maximumParameters() { 53 | return Option.of(Integer.MAX_VALUE); 54 | } 55 | 56 | public ParameterExtractor getParameterExtractor() { 57 | return this.parameterExtractor; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/logs/IotGetLogsCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.logs; 2 | 3 | 4 | import com.awslabs.iot.client.helpers.cloudwatch.LogsHelper; 5 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 6 | import com.jcabi.log.Logger; 7 | import io.vavr.collection.List; 8 | import io.vavr.control.Option; 9 | import software.amazon.awssdk.services.cloudwatchlogs.model.OutputLogEvent; 10 | 11 | import javax.inject.Inject; 12 | import javax.inject.Provider; 13 | 14 | public class IotGetLogsCommandHandler implements LogsCommandHandler { 15 | private static final String GET = "iot-get"; 16 | private static final String logGroupName = "AWSIotLogsV2"; 17 | @Inject 18 | Provider logsHelperProvider; 19 | @Inject 20 | ParameterExtractor parameterExtractor; 21 | 22 | @Inject 23 | public IotGetLogsCommandHandler() { 24 | } 25 | 26 | @Override 27 | public void innerHandle(String input) { 28 | List parameters = parameterExtractor.getParameters(input); 29 | 30 | List logs = logsHelperProvider.get().getLogs(logGroupName, parameters); 31 | 32 | logs.forEach(outputLogEvent -> Logger.info(this, outputLogEvent.message())); 33 | } 34 | 35 | @Override 36 | public String getCommandString() { 37 | return GET; 38 | } 39 | 40 | @Override 41 | public String getHelp() { 42 | return "Finds log messages in CloudWatch logs from AWS IoT. Parameters are search strings that all must be present in the log message."; 43 | } 44 | 45 | @Override 46 | public int requiredParameters() { 47 | return 1; 48 | } 49 | 50 | @Override 51 | public Option maximumParameters() { 52 | return Option.of(Integer.MAX_VALUE); 53 | } 54 | 55 | public ParameterExtractor getParameterExtractor() { 56 | return this.parameterExtractor; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/commands/logs/LogsCommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.commands.logs; 2 | 3 | import com.awslabs.iot.client.commands.interfaces.CommandHandler; 4 | 5 | public interface LogsCommandHandler extends CommandHandler { 6 | default String getServiceName() { 7 | return "logs"; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/completers/DynamicStringsCompleter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2002-2016, the original author or authors. 3 | * 4 | * This software is distributable under the BSD license. See the terms of the 5 | * BSD license in the documentation provided with this software. 6 | * 7 | * http://www.opensource.org/licenses/bsd-license.php 8 | */ 9 | package com.awslabs.iot.client.completers; 10 | 11 | import io.vavr.collection.List; 12 | import org.jline.reader.Candidate; 13 | import org.jline.reader.LineReader; 14 | import org.jline.reader.ParsedLine; 15 | import org.jline.reader.impl.completer.StringsCompleter; 16 | 17 | import static dagger.internal.Preconditions.checkNotNull; 18 | 19 | public abstract class DynamicStringsCompleter extends StringsCompleter { 20 | @Override 21 | public void complete(LineReader reader, ParsedLine commandLine, java.util.List candidates) { 22 | checkNotNull(commandLine); 23 | checkNotNull(candidates); 24 | 25 | candidates.addAll(getStrings().asJava()); 26 | } 27 | 28 | protected abstract List getStrings(); 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/console/AwsIotClientConsoleTerminal.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.console; 2 | 3 | import com.awslabs.iot.client.applications.Arguments; 4 | import com.awslabs.iot.client.commandline.CommandsCompleter; 5 | import com.awslabs.iot.client.commands.CommandHandlerProvider; 6 | import com.awslabs.iot.client.commands.interfaces.CommandHandler; 7 | import com.awslabs.iot.client.helpers.ANSIHelper; 8 | import com.awslabs.iot.client.interfaces.AwsIotClientTerminal; 9 | import com.jcabi.log.Logger; 10 | import org.jline.reader.Completer; 11 | import org.jline.terminal.Terminal; 12 | import org.jline.terminal.TerminalBuilder; 13 | 14 | import javax.inject.Inject; 15 | import java.io.IOException; 16 | import java.util.Set; 17 | 18 | public class AwsIotClientConsoleTerminal implements AwsIotClientTerminal { 19 | @Inject 20 | CommandHandlerProvider commandHandlerProvider; 21 | @Inject 22 | CommandsCompleter commandsCompleter; 23 | @Inject 24 | Arguments arguments; 25 | 26 | @Inject 27 | public AwsIotClientConsoleTerminal() { 28 | } 29 | 30 | @Override 31 | public String getTextColor() { 32 | return ANSIHelper.WHITE; 33 | } 34 | 35 | @Override 36 | public String getPromptColor() { 37 | return ANSIHelper.WHITE; 38 | } 39 | 40 | @Override 41 | public Terminal getTerminal() throws IOException { 42 | return TerminalBuilder.builder() 43 | .system(true) 44 | .nativeSignals(true) 45 | // Block CTRL-C - disabled for now 46 | // .signalHandler(Terminal.SignalHandler.SIG_IGN) 47 | .build(); 48 | } 49 | 50 | @Override 51 | public Completer getCommandsCompleter() { 52 | return commandsCompleter; 53 | } 54 | 55 | @Override 56 | public Set getCommandHandlerSet() { 57 | return commandHandlerProvider.getCommandHandlerSet(); 58 | } 59 | 60 | @Override 61 | public void write(String s) { 62 | Logger.info(this, s); 63 | } 64 | 65 | @Override 66 | public void start() throws Exception { 67 | // Show the dangerous mode banner if necessary 68 | showDangerousModeBannerIfNecessary(); 69 | 70 | mainLoop(); 71 | } 72 | 73 | private void showDangerousModeBannerIfNecessary() { 74 | if (!arguments.dangerousMode) { 75 | return; 76 | } 77 | 78 | Logger.warn(this, "------------------------------------ DANGER!"); 79 | Logger.warn(this, "| You have enabled dangerous mode! |"); 80 | Logger.warn(this, "------------------------------------ DANGER!"); 81 | 82 | Logger.warn(this, "Some commands can and will remove resources in your AWS account without confirmation. You have been warned!"); 83 | } 84 | } -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/helpers/ANSIHelper.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.helpers; 2 | 3 | public class ANSIHelper { 4 | public static final String CRLF = "\r\n"; 5 | private static final char ESCAPE = (char) 27; 6 | public static final String RED = ESCAPE + "[31m"; 7 | public static final String BLACK = ESCAPE + "[30m"; 8 | public static final String WHITE = ESCAPE + "[37m"; 9 | public static final String BOLD = ESCAPE + "[1m"; 10 | public static final String NORMAL = ESCAPE + "[0m"; 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/helpers/BasicCandidateHelper.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.helpers; 2 | 3 | import io.vavr.collection.List; 4 | import io.vavr.collection.Stream; 5 | import org.jline.reader.Candidate; 6 | 7 | import javax.inject.Inject; 8 | 9 | public class BasicCandidateHelper implements CandidateHelper { 10 | @Inject 11 | public BasicCandidateHelper() { 12 | } 13 | 14 | @Override 15 | public List getCandidates(Stream strings) { 16 | return strings 17 | .map(Candidate::new) 18 | .toList(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/helpers/CandidateHelper.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.helpers; 2 | 3 | import io.vavr.collection.List; 4 | import io.vavr.collection.Stream; 5 | import org.jline.reader.Candidate; 6 | 7 | public interface CandidateHelper { 8 | List getCandidates(Stream strings); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/helpers/cloudwatch/BasicLogsHelper.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.helpers.cloudwatch; 2 | 3 | import io.vavr.collection.List; 4 | import io.vavr.collection.Stream; 5 | import software.amazon.awssdk.services.cloudwatchlogs.CloudWatchLogsClient; 6 | import software.amazon.awssdk.services.cloudwatchlogs.model.*; 7 | 8 | import javax.inject.Inject; 9 | import java.util.ArrayList; 10 | import java.util.Comparator; 11 | import java.util.Objects; 12 | 13 | public class BasicLogsHelper implements LogsHelper { 14 | @Inject 15 | CloudWatchLogsClient cloudWatchLogsClient; 16 | 17 | @Inject 18 | public BasicLogsHelper() { 19 | } 20 | 21 | @Override 22 | public List getLogs(String logGroupName, List searchStrings) { 23 | DescribeLogStreamsRequest describeLogStreamsRequest = DescribeLogStreamsRequest.builder() 24 | .logGroupName(logGroupName) 25 | .build(); 26 | 27 | DescribeLogStreamsResponse describeLogStreamsResult = cloudWatchLogsClient.describeLogStreams(describeLogStreamsRequest); 28 | 29 | List logStreamNames = Stream.ofAll(describeLogStreamsResult.logStreams()) 30 | .map(LogStream::logStreamName) 31 | .toList(); 32 | 33 | final ArrayList tempOutputLogEventList = new ArrayList<>(); 34 | 35 | logStreamNames.toStream() 36 | .forEach(logStreamName -> { 37 | 38 | GetLogEventsRequest getLogEventsRequest = GetLogEventsRequest.builder() 39 | .logGroupName(logGroupName) 40 | .logStreamName(logStreamName) 41 | .build(); 42 | 43 | GetLogEventsResponse getLogEventsResult = cloudWatchLogsClient.getLogEvents(getLogEventsRequest); 44 | 45 | String currentToken = null; 46 | String nextToken = null; 47 | 48 | do { 49 | currentToken = nextToken; 50 | tempOutputLogEventList.addAll(getLogEventsResult.events()); 51 | nextToken = getLogEventsResult.nextForwardToken(); 52 | } while (!Objects.equals(currentToken, nextToken)); 53 | }); 54 | 55 | return Stream.ofAll(tempOutputLogEventList) 56 | .filter(outputLogEvent -> searchStrings.toJavaParallelStream().allMatch(outputLogEvent.message()::contains)) 57 | .sorted(Comparator.comparing(OutputLogEvent::ingestionTime)) 58 | .toList(); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/helpers/cloudwatch/LogsHelper.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.helpers.cloudwatch; 2 | 3 | import io.vavr.collection.List; 4 | import software.amazon.awssdk.services.cloudwatchlogs.model.OutputLogEvent; 5 | 6 | public interface LogsHelper { 7 | List getLogs(String logGroupName, List searchStrings); 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/helpers/iot/BasicWebsocketsHelper.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.helpers.iot; 2 | 3 | import com.awslabs.aws.iot.websockets.MqttOverWebsocketsProvider; 4 | import com.awslabs.aws.iot.websockets.data.ImmutableClientId; 5 | import com.awslabs.aws.iot.websockets.data.ImmutableMqttClientConfig; 6 | import com.awslabs.iot.client.helpers.iot.interfaces.WebsocketsHelper; 7 | import com.jcabi.log.Logger; 8 | import org.eclipse.paho.client.mqttv3.*; 9 | 10 | import javax.inject.Inject; 11 | import java.io.UnsupportedEncodingException; 12 | import java.security.InvalidKeyException; 13 | import java.security.NoSuchAlgorithmException; 14 | import java.util.UUID; 15 | 16 | public class BasicWebsocketsHelper implements WebsocketsHelper { 17 | @Inject 18 | MqttOverWebsocketsProvider mqttOverWebsocketsProvider; 19 | 20 | @Inject 21 | public BasicWebsocketsHelper() { 22 | } 23 | 24 | public MqttCallback buildMessageCallback(Function messageArrivedHandler) { 25 | return new MqttCallback() { 26 | @Override 27 | public void connectionLost(Throwable cause) { 28 | 29 | } 30 | 31 | @Override 32 | public void messageArrived(String topic, MqttMessage message) { 33 | messageArrivedHandler.handleMessage(topic, message); 34 | } 35 | 36 | @Override 37 | public void deliveryComplete(IMqttDeliveryToken token) { 38 | 39 | } 40 | }; 41 | } 42 | 43 | public MqttClient connectMqttClient() throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException, MqttException { 44 | String clientId = UUID.randomUUID().toString(); 45 | 46 | ImmutableMqttClientConfig mqttClientConfig = ImmutableMqttClientConfig.builder() 47 | .clientId(ImmutableClientId.builder().clientId(clientId).build()) 48 | .build(); 49 | 50 | MqttClient mqttClient = mqttOverWebsocketsProvider.getMqttClient(mqttClientConfig); 51 | mqttClient.connect(); 52 | 53 | return mqttClient; 54 | } 55 | 56 | public MqttClient connectMqttClientAndSubscribe(String topic) throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException, MqttException { 57 | MqttClient mqttClient = connectMqttClient(); 58 | subscribe(mqttClient, topic); 59 | 60 | return mqttClient; 61 | } 62 | 63 | public MqttClient connectMqttClientAndPublish(String topic, String message) throws MqttException, NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException { 64 | MqttClient mqttClient = connectMqttClient(); 65 | publish(mqttClient, topic, message); 66 | 67 | return mqttClient; 68 | } 69 | 70 | public void subscribe(MqttClient mqttClient, String topic) throws MqttException { 71 | mqttClient.subscribe(topic); 72 | } 73 | 74 | public void close(MqttClient mqttClient) throws MqttException { 75 | mqttClient.close(); 76 | } 77 | 78 | public void publish(MqttClient mqttClient, String topic, String message) throws MqttException { 79 | mqttClient.publish(topic, new MqttMessage(message.getBytes())); 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/helpers/iot/interfaces/WebsocketsHelper.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.helpers.iot.interfaces; 2 | 3 | import org.eclipse.paho.client.mqttv3.MqttCallback; 4 | import org.eclipse.paho.client.mqttv3.MqttClient; 5 | import org.eclipse.paho.client.mqttv3.MqttException; 6 | import org.eclipse.paho.client.mqttv3.MqttMessage; 7 | 8 | import java.io.UnsupportedEncodingException; 9 | import java.security.InvalidKeyException; 10 | import java.security.NoSuchAlgorithmException; 11 | 12 | public interface WebsocketsHelper { 13 | MqttCallback buildMessageCallback(Function messageArrivedHandler); 14 | 15 | MqttClient connectMqttClient() throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException, MqttException; 16 | 17 | MqttClient connectMqttClientAndSubscribe(String topic) throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException, MqttException; 18 | 19 | MqttClient connectMqttClientAndPublish(String topic, String message) throws MqttException, NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException; 20 | 21 | void subscribe(MqttClient mqttClient, String topic) throws MqttException; 22 | 23 | void close(MqttClient mqttClient) throws MqttException; 24 | 25 | void publish(MqttClient mqttClient, String topic, String message) throws MqttException; 26 | 27 | @FunctionalInterface 28 | interface Function { 29 | Void handleMessage(String topic, MqttMessage mqttMessage); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/helpers/json/BasicObjectPrettyPrinter.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.helpers.json; 2 | 3 | import com.awslabs.iot.client.helpers.json.interfaces.ObjectPrettyPrinter; 4 | import com.google.gson.*; 5 | 6 | import javax.inject.Inject; 7 | 8 | public class BasicObjectPrettyPrinter implements ObjectPrettyPrinter { 9 | @Inject 10 | public BasicObjectPrettyPrinter() { 11 | } 12 | 13 | @Override 14 | public String prettyPrint(String json) { 15 | Gson gson = new GsonBuilder().setPrettyPrinting().create(); 16 | JsonParser jp = new JsonParser(); 17 | JsonElement je = jp.parse(json); 18 | return gson.toJson(je); 19 | } 20 | 21 | @Override 22 | public String prettyPrint(Object object) { 23 | Gson gson = new GsonBuilder().setExclusionStrategies(new ExclusionStrategy() { 24 | @Override 25 | public boolean shouldSkipField(FieldAttributes fieldAttributes) { 26 | // Don't print SDK related metadata 27 | return (fieldAttributes.getName().startsWith("sdk") && fieldAttributes.getName().endsWith("Metadata")); 28 | } 29 | 30 | @Override 31 | public boolean shouldSkipClass(Class aClass) { 32 | return false; 33 | } 34 | }).create(); 35 | 36 | return prettyPrint(gson.toJson(object)); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/helpers/json/interfaces/ObjectPrettyPrinter.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.helpers.json.interfaces; 2 | 3 | public interface ObjectPrettyPrinter { 4 | String prettyPrint(String json); 5 | 6 | String prettyPrint(Object object); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/helpers/progressbar/BasicProgressBarHelper.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.helpers.progressbar; 2 | 3 | import com.awslabs.iot.client.streams.interfaces.UsesStream; 4 | import io.vavr.control.Try; 5 | import me.tongfei.progressbar.ProgressBar; 6 | 7 | import javax.inject.Inject; 8 | 9 | public class BasicProgressBarHelper implements ProgressBarHelper { 10 | private ProgressBar progressBar; 11 | 12 | @Inject 13 | public BasicProgressBarHelper() { 14 | } 15 | 16 | @Override 17 | public ProgressBar start(String name, UsesStream usesStream) { 18 | // If there's no stream use an empty stream, get the stream, get the size, and rethrow all exceptions 19 | long count = Try.of(() -> usesStream.getStream().size()).get(); 20 | 21 | if (progressBar != null) { 22 | progressBar.close(); 23 | progressBar = null; 24 | } 25 | 26 | progressBar = new ProgressBar(name, count); 27 | 28 | return progressBar; 29 | } 30 | 31 | @Override 32 | public void step(long step) { 33 | progressBar.stepBy(step); 34 | } 35 | 36 | @Override 37 | public void next() { 38 | progressBar.step(); 39 | } 40 | 41 | @Override 42 | public void clearExtraMessageAndStep() { 43 | progressBar.setExtraMessage(""); 44 | progressBar.step(); 45 | } 46 | 47 | @Override 48 | public void close() { 49 | progressBar.close(); 50 | progressBar = null; 51 | } 52 | 53 | @Override 54 | public void throttled() { 55 | progressBar.setExtraMessage("Throttled"); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/helpers/progressbar/ProgressBarHelper.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.helpers.progressbar; 2 | 3 | import com.awslabs.iot.client.streams.interfaces.UsesStream; 4 | import me.tongfei.progressbar.ProgressBar; 5 | 6 | public interface ProgressBarHelper { 7 | ProgressBar start(String name, UsesStream usesStream); 8 | 9 | void step(long step); 10 | 11 | void next(); 12 | 13 | void clearExtraMessageAndStep(); 14 | 15 | void close(); 16 | 17 | void throttled(); 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/interfaces/AwsIotClientTerminal.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.interfaces; 2 | 3 | import com.awslabs.iot.client.commands.interfaces.CommandHandler; 4 | import io.vavr.control.Try; 5 | import org.jline.reader.Completer; 6 | import org.jline.reader.LineReader; 7 | import org.jline.reader.LineReaderBuilder; 8 | import org.jline.reader.UserInterruptException; 9 | import org.jline.reader.impl.history.DefaultHistory; 10 | import org.jline.terminal.Terminal; 11 | 12 | import java.io.IOException; 13 | import java.util.HashSet; 14 | import java.util.Set; 15 | 16 | public interface AwsIotClientTerminal { 17 | String BLANK_STRING = ""; 18 | 19 | default String getPrompt() { 20 | return String.join("", getPromptColor(), "> ", getTextColor()); 21 | } 22 | 23 | String getTextColor(); 24 | 25 | String getPromptColor(); 26 | 27 | default void mainLoop() throws IOException { 28 | Set fullCommands = new HashSet<>(); 29 | 30 | Set commandHandlerSet = getCommandHandlerSet(); 31 | 32 | for (CommandHandler commandHandler : commandHandlerSet) { 33 | int previousSize = fullCommands.size(); 34 | String fullCommandString = commandHandler.getFullCommandString(); 35 | fullCommands.add(fullCommandString); 36 | 37 | if (fullCommands.size() == previousSize) { 38 | String message = String.join("", "Duplicate command string found [", fullCommandString, "]"); 39 | write(message); 40 | throw new UnsupportedOperationException(message); 41 | } 42 | } 43 | 44 | DefaultHistory history = new DefaultHistory(); 45 | 46 | Terminal terminal = getTerminal(); 47 | 48 | LineReader reader = LineReaderBuilder.builder() 49 | .terminal(terminal) 50 | .completer(getCommandsCompleter()) 51 | .history(history) 52 | .build(); 53 | 54 | Try.of(() -> infiniteInputLoop(reader)) 55 | .recover(UserInterruptException.class, this::handleUserInterruptException) 56 | .get(); 57 | } 58 | 59 | default Void infiniteInputLoop(LineReader reader) { 60 | while (true) { 61 | String command = reader.readLine(getPrompt()); 62 | 63 | if (BLANK_STRING.equals(command)) { 64 | continue; 65 | } 66 | 67 | boolean handled = false; 68 | command = command.trim(); 69 | 70 | for (CommandHandler commandHandler : getCommandHandlerSet()) { 71 | if (commandHandler.handle(command)) { 72 | handled = true; 73 | reader.getTerminal().flush(); 74 | break; 75 | } 76 | } 77 | 78 | if (!handled) { 79 | write(String.join("", "The command [", command, "] was not understood.")); 80 | } 81 | } 82 | } 83 | 84 | default Void handleUserInterruptException(UserInterruptException userInterruptException) { 85 | // User probably hit CTRL-C, just bail out 86 | write("User may have hit CTRL-C, exiting"); 87 | System.exit(1); 88 | 89 | return null; 90 | } 91 | 92 | Terminal getTerminal() throws IOException; 93 | 94 | Completer getCommandsCompleter(); 95 | 96 | Set getCommandHandlerSet(); 97 | 98 | void write(String s); 99 | 100 | void start() throws Exception; 101 | } -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/parameters/BasicParameterExtractor.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.parameters; 2 | 3 | import com.awslabs.iot.client.parameters.interfaces.ParameterExtractor; 4 | import io.vavr.collection.List; 5 | 6 | import javax.inject.Inject; 7 | import java.util.regex.Matcher; 8 | import java.util.regex.Pattern; 9 | 10 | public class BasicParameterExtractor implements ParameterExtractor { 11 | private static final Pattern PATTERN = Pattern.compile("([^\"]\\S*|\".+?\")\\s*"); 12 | 13 | @Inject 14 | public BasicParameterExtractor() { 15 | } 16 | 17 | @Override 18 | public List getParameters(String input) { 19 | // From: http://stackoverflow.com/questions/7804335/split-string-on-spaces-in-java-except-if-between-quotes-i-e-treat-hello-wor 20 | List parameters = List.empty(); 21 | 22 | Matcher m = PATTERN.matcher(input); 23 | 24 | // Get all of the matches and put them in a list 25 | while (m.find()) { 26 | // Make sure we remove the double quotes around the parameter 27 | parameters = parameters.append(m.group(1).replace("\"", "")); 28 | } 29 | 30 | // Did we get any input? 31 | if (parameters.size() > 0) { 32 | // Yes, remove the first parameter since it is just the command name 33 | parameters = parameters.removeAt(0); 34 | } 35 | 36 | return parameters; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/parameters/interfaces/ParameterExtractor.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.parameters.interfaces; 2 | 3 | import io.vavr.collection.List; 4 | 5 | public interface ParameterExtractor { 6 | List getParameters(String input); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/awslabs/iot/client/streams/interfaces/UsesStream.java: -------------------------------------------------------------------------------- 1 | package com.awslabs.iot.client.streams.interfaces; 2 | 3 | import io.vavr.collection.Stream; 4 | 5 | public interface UsesStream { 6 | Stream getStream(); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | log4j.rootLogger=INFO, CONSOLE 2 | log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 3 | log4j.appender.CONSOLE.layout=com.jcabi.log.MulticolorLayout 4 | log4j.appender.CONSOLE.layout.ConversionPattern=[%color{%p}] %c{1}: %m%n 5 | -------------------------------------------------------------------------------- /src/test/java/MoshClientTest.java: -------------------------------------------------------------------------------- 1 | import com.awslabs.iot.client.commands.iot.mosh.MoshClientCommandHandler; 2 | import org.junit.Before; 3 | import org.junit.Ignore; 4 | import org.junit.Test; 5 | 6 | public class MoshClientTest { 7 | private MoshClientCommandHandler moshClientCommandHandler; 8 | 9 | @Before 10 | public void setup() { 11 | TestInjector testInjector = DaggerTestInjector.create(); 12 | 13 | // Prevents DefaultAwsRegionProviderChain failures in environments with no AWS configuration 14 | System.setProperty("aws.region", "us-east-1"); 15 | 16 | throw new RuntimeException("Not implemented yet"); 17 | // moshClientCommandHandler = testInjector.moshClientCommandHandler(); 18 | } 19 | 20 | @Test 21 | @Ignore 22 | public void shouldConnectToPi() { 23 | moshClientCommandHandler.innerHandle("BLAH pi_Core"); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/test/java/TestInjector.java: -------------------------------------------------------------------------------- 1 | import com.awslabs.iot.client.applications.AwsIotClientModule; 2 | import dagger.Component; 3 | 4 | import javax.inject.Singleton; 5 | 6 | @Singleton 7 | @Component(modules = {AwsIotClientModule.class}) 8 | public interface TestInjector { 9 | } 10 | --------------------------------------------------------------------------------