2019-10-07 08:14:47 -06:00
// Copyright (c) Mainflux
2018-08-26 13:15:48 +02:00
// SPDX-License-Identifier: Apache-2.0
2018-08-16 13:41:27 +02:00
package cli
2018-07-11 13:53:37 +02:00
import (
2018-10-24 11:21:03 +02:00
"encoding/json"
2023-06-14 12:40:37 +02:00
mfclients "github.com/mainflux/mainflux/pkg/clients"
2020-06-03 15:16:19 +02:00
mfxsdk "github.com/mainflux/mainflux/pkg/sdk/go"
2018-07-11 13:53:37 +02:00
"github.com/spf13/cobra"
)
var cmdThings = [ ] cobra . Command {
2022-02-11 13:22:57 +01:00
{
Use : "create <JSON_thing> <user_auth_token>" ,
Short : "Create thing" ,
2023-06-14 12:40:37 +02:00
Long : "Creates new thing with provided name and metadata\n" +
"Usage:\n" +
"\tmainflux-cli things create '{\"name\":\"new thing\", \"metadata\":{\"key\": \"value\"}}' $USERTOKEN\n" ,
2018-07-11 13:53:37 +02:00
Run : func ( cmd * cobra . Command , args [ ] string ) {
2021-01-28 11:29:32 +01:00
if len ( args ) != 2 {
2022-02-11 13:22:57 +01:00
logUsage ( cmd . Use )
2018-10-14 16:44:21 +02:00
return
}
2018-10-24 11:21:03 +02:00
var thing mfxsdk . Thing
if err := json . Unmarshal ( [ ] byte ( args [ 0 ] ) , & thing ) ; err != nil {
logError ( err )
return
}
2023-06-14 12:40:37 +02:00
thing . Status = mfclients . EnabledStatus . String ( )
thing , err := sdk . CreateThing ( thing , args [ 1 ] )
2018-10-14 16:44:21 +02:00
if err != nil {
logError ( err )
2018-07-11 13:53:37 +02:00
return
}
2018-10-24 11:21:03 +02:00
2023-06-14 12:40:37 +02:00
logJSON ( thing )
2018-07-11 13:53:37 +02:00
} ,
} ,
2022-02-11 13:22:57 +01:00
{
Use : "get [all | <thing_id>] <user_auth_token>" ,
Short : "Get things" ,
2023-06-14 12:40:37 +02:00
Long : "Get all things or get thing by id. Things can be filtered by name or metadata\n" +
"Usage:\n" +
"\tmainflux-cli things get all $USERTOKEN - lists all things\n" +
"\tmainflux-cli things get all $USERTOKEN --offset=10 --limit=10 - lists all things with offset and limit\n" +
"\tmainflux-cli things get <thing_id> $USERTOKEN - shows thing with provided <thing_id>\n" ,
2018-07-11 13:53:37 +02:00
Run : func ( cmd * cobra . Command , args [ ] string ) {
if len ( args ) != 2 {
2022-02-11 13:22:57 +01:00
logUsage ( cmd . Use )
2018-07-11 13:53:37 +02:00
return
}
2022-06-17 18:32:23 +03:00
metadata , err := convertMetadata ( Metadata )
if err != nil {
logError ( err )
return
}
pageMetadata := mfxsdk . PageMetadata {
Name : "" ,
Offset : uint64 ( Offset ) ,
Limit : uint64 ( Limit ) ,
Metadata : metadata ,
}
MF-1718 - Use static code analysis in CI (#1729)
* things, twins, and logger lint fixed
Signed-off-by: aryan <aryangodara03@gmail.com>
* all services updated, auth jwt not working, ineffectual assignment issue
Signed-off-by: aryan <aryangodara03@gmail.com>
* handle error from grpc server in endpointtest
Signed-off-by: aryan <aryangodara03@gmail.com>
* temp commit, auth/jwt needs to be resolved
Signed-off-by: aryan <aryangodara03@gmail.com>
* revert back to jwt v4 temporarily
Signed-off-by: aryan <aryangodara03@gmail.com>
* updated jwt tokenizer
Signed-off-by: aryan <aryangodara03@gmail.com>
* resolve EOF error for httptest requests
Signed-off-by: aryan <aryangodara03@gmail.com>
* fix auth jwt, update to registeredclaims
Signed-off-by: aryan <aryangodara03@gmail.com>
* fix ineffective assignment, auth/api/grpc endpoint failing
Signed-off-by: aryan <aryangodara03@gmail.com>
* temp commit, remove later
Signed-off-by: aryan <aryangodara03@gmail.com>
* fix grpc server setup
Signed-off-by: aryan <aryangodara03@gmail.com>
* resolve golangci tests, remove debug statements
Signed-off-by: aryan <aryangodara03@gmail.com>
* update golangci version and modify linters used
Signed-off-by: aryan <aryangodara03@gmail.com>
* fix failing tests
Signed-off-by: aryan <aryangodara03@gmail.com>
* fix grpc server for setup tests
Signed-off-by: aryan <aryangodara03@gmail.com>
* fix logging and errors inlined
Signed-off-by: aryan <aryangodara03@gmail.com>
* fix remarks, update grpc setup_test
Signed-off-by: aryan <aryangodara03@gmail.com>
* fix setup_test
Signed-off-by: aryan <aryangodara03@gmail.com>
* update setup_test grpc
Signed-off-by: aryan <aryangodara03@gmail.com>
* fix data race
Signed-off-by: aryan <aryangodara03@gmail.com>
* update setup_test grpc
Signed-off-by: aryan <aryangodara03@gmail.com>
* fix grpc setup down to single simple function
Signed-off-by: aryan <aryangodara03@gmail.com>
* fix linting issues
Signed-off-by: aryan <aryangodara03@gmail.com>
* resolve pr comments
Signed-off-by: aryan <aryangodara03@gmail.com>
* fix tests, handle returned errors, go mod tidy vendor
Signed-off-by: aryan <aryangodara03@gmail.com>
* fix errors from new linters
Signed-off-by: aryan <aryangodara03@gmail.com>
---------
Signed-off-by: aryan <aryangodara03@gmail.com>
2023-04-22 08:14:35 -07:00
if args [ 0 ] == all {
2023-01-05 19:20:05 +03:00
l , err := sdk . Things ( pageMetadata , args [ 1 ] )
2018-10-14 16:44:21 +02:00
if err != nil {
logError ( err )
return
}
2018-12-16 20:01:37 +01:00
logJSON ( l )
2018-07-11 13:53:37 +02:00
return
}
2018-10-14 16:44:21 +02:00
t , err := sdk . Thing ( args [ 0 ] , args [ 1 ] )
if err != nil {
logError ( err )
return
}
2018-10-24 11:21:03 +02:00
2018-12-16 20:01:37 +01:00
logJSON ( t )
2018-07-11 13:53:37 +02:00
} ,
} ,
2022-02-11 13:22:57 +01:00
{
2023-06-14 12:40:37 +02:00
Use : "identify <thing_key>" ,
Short : "Identify thing" ,
Long : "Validates thing's key and returns its ID\n" +
"Usage:\n" +
"\tmainflux-cli things identify <thing_key>\n" ,
2018-07-11 13:53:37 +02:00
Run : func ( cmd * cobra . Command , args [ ] string ) {
2023-06-14 12:40:37 +02:00
if len ( args ) != 1 {
2022-02-11 13:22:57 +01:00
logUsage ( cmd . Use )
2018-10-14 16:44:21 +02:00
return
}
2018-10-24 11:21:03 +02:00
2023-06-14 12:40:37 +02:00
i , err := sdk . IdentifyThing ( args [ 0 ] )
if err != nil {
2018-10-14 16:44:21 +02:00
logError ( err )
2018-07-11 13:53:37 +02:00
return
}
2018-10-24 11:21:03 +02:00
2023-06-14 12:40:37 +02:00
logJSON ( i )
2018-07-11 13:53:37 +02:00
} ,
} ,
2022-06-24 17:31:12 +03:00
{
2023-06-14 12:40:37 +02:00
Use : "update [<thing_id> <JSON_string> | tags <thing_id> <tags> | secret <thing_id> <secret> | owner <thing_id> <owner> ] <user_auth_token>" ,
Short : "Update thing" ,
Long : "Updates thing with provided id, name and metadata, or updates thing tags, secret or owner\n" +
"Usage:\n" +
"\tmainflux-cli things update <thing_id> '{\"name\":\"new name\", \"metadata\":{\"key\": \"value\"}}' $USERTOKEN\n" +
"\tmainflux-cli things update tags <thing_id> '{\"tag1\":\"value1\", \"tag2\":\"value2\"}' $USERTOKEN\n" +
"\tmainflux-cli things update secret <thing_id> newsecret $USERTOKEN\n" +
"\tmainflux-cli things update owner <thing_id> <owner_id> $USERTOKEN\n" ,
2022-06-24 17:31:12 +03:00
Run : func ( cmd * cobra . Command , args [ ] string ) {
2023-06-14 12:40:37 +02:00
if len ( args ) != 4 && len ( args ) != 3 {
2022-06-24 17:31:12 +03:00
logUsage ( cmd . Use )
return
}
2023-06-14 12:40:37 +02:00
var thing mfxsdk . Thing
if args [ 0 ] == "tags" {
if err := json . Unmarshal ( [ ] byte ( args [ 2 ] ) , & thing . Tags ) ; err != nil {
logError ( err )
return
}
thing . ID = args [ 1 ]
thing , err := sdk . UpdateThingTags ( thing , args [ 3 ] )
if err != nil {
logError ( err )
return
}
logJSON ( thing )
return
}
if args [ 0 ] == "secret" {
thing , err := sdk . UpdateThingSecret ( args [ 1 ] , args [ 2 ] , args [ 3 ] )
if err != nil {
logError ( err )
return
}
logJSON ( thing )
return
}
if args [ 0 ] == "owner" {
thing . ID = args [ 1 ]
thing . Owner = args [ 2 ]
thing , err := sdk . UpdateThingOwner ( thing , args [ 3 ] )
if err != nil {
logError ( err )
return
}
logJSON ( thing )
return
}
if err := json . Unmarshal ( [ ] byte ( args [ 1 ] ) , & thing ) ; err != nil {
logError ( err )
return
}
thing . ID = args [ 0 ]
thing , err := sdk . UpdateThing ( thing , args [ 2 ] )
2022-06-24 17:31:12 +03:00
if err != nil {
logError ( err )
return
}
2023-06-14 12:40:37 +02:00
logJSON ( thing )
2022-06-24 17:31:12 +03:00
} ,
} ,
2022-02-11 13:22:57 +01:00
{
2023-06-14 12:40:37 +02:00
Use : "enable <thing_id> <user_auth_token>" ,
Short : "Change thing status to enabled" ,
Long : "Change thing status to enabled\n" +
"Usage:\n" +
"\tmainflux-cli things enable <thing_id> $USERTOKEN\n" ,
2018-07-11 13:53:37 +02:00
Run : func ( cmd * cobra . Command , args [ ] string ) {
2023-06-14 12:40:37 +02:00
if len ( args ) != 2 {
2022-02-11 13:22:57 +01:00
logUsage ( cmd . Use )
2018-07-11 13:53:37 +02:00
return
}
2018-10-24 11:21:03 +02:00
2023-06-14 12:40:37 +02:00
thing , err := sdk . EnableThing ( args [ 0 ] , args [ 1 ] )
if err != nil {
logError ( err )
2023-05-25 06:02:46 +08:00
return
}
2023-06-14 12:40:37 +02:00
logJSON ( thing )
} ,
} ,
{
Use : "disable <thing_id> <user_auth_token>" ,
Short : "Change thing status to disabled" ,
Long : "Change thing status to disabled\n" +
"Usage:\n" +
"\tmainflux-cli things disable <thing_id> $USERTOKEN\n" ,
Run : func ( cmd * cobra . Command , args [ ] string ) {
if len ( args ) != 2 {
logUsage ( cmd . Use )
2018-10-24 11:21:03 +02:00
return
}
2023-06-14 12:40:37 +02:00
thing , err := sdk . DisableThing ( args [ 0 ] , args [ 1 ] )
if err != nil {
2018-10-14 16:44:21 +02:00
logError ( err )
return
}
2018-10-24 11:21:03 +02:00
2023-06-14 12:40:37 +02:00
logJSON ( thing )
2018-07-11 13:53:37 +02:00
} ,
} ,
2023-05-25 06:02:46 +08:00
{
2023-06-20 16:48:25 +03:00
Use : "share <channel_id> <user_id> <allowed_actions> <user_auth_token>" ,
2023-06-14 12:40:37 +02:00
Short : "Share thing with a user" ,
Long : "Share thing with a user\n" +
"Usage:\n" +
2023-06-20 16:48:25 +03:00
"\tmainflux-cli things share <channel_id> <user_id> '[\"c_list\", \"c_delete\"]' $USERTOKEN\n" ,
2023-05-25 06:02:46 +08:00
Run : func ( cmd * cobra . Command , args [ ] string ) {
2023-06-20 16:48:25 +03:00
if len ( args ) != 4 {
2023-05-25 06:02:46 +08:00
logUsage ( cmd . Use )
return
}
2023-06-14 12:40:37 +02:00
var actions [ ] string
2023-06-20 16:48:25 +03:00
if err := json . Unmarshal ( [ ] byte ( args [ 2 ] ) , & actions ) ; err != nil {
2023-05-25 06:02:46 +08:00
logError ( err )
return
}
2023-06-20 16:48:25 +03:00
err := sdk . ShareThing ( args [ 0 ] , args [ 1 ] , actions , args [ 3 ] )
2023-06-14 12:40:37 +02:00
if err != nil {
2023-05-25 06:02:46 +08:00
logError ( err )
return
}
logOK ( )
} ,
} ,
2022-02-11 13:22:57 +01:00
{
Use : "connect <thing_id> <channel_id> <user_auth_token>" ,
Short : "Connect thing" ,
2023-06-14 12:40:37 +02:00
Long : "Connect thing to the channel\n" +
"Usage:\n" +
"\tmainflux-cli things connect <thing_id> <channel_id> $USERTOKEN\n" ,
2018-07-11 13:53:37 +02:00
Run : func ( cmd * cobra . Command , args [ ] string ) {
if len ( args ) != 3 {
2022-02-11 13:22:57 +01:00
logUsage ( cmd . Use )
2018-10-14 16:44:21 +02:00
return
}
2018-10-24 11:21:03 +02:00
2019-11-21 04:29:37 -07:00
connIDs := mfxsdk . ConnectionIDs {
2020-03-03 10:58:30 +01:00
ChannelIDs : [ ] string { args [ 1 ] } ,
ThingIDs : [ ] string { args [ 0 ] } ,
2019-11-21 04:29:37 -07:00
}
if err := sdk . Connect ( connIDs , args [ 2 ] ) ; err != nil {
2018-10-14 16:44:21 +02:00
logError ( err )
2018-07-11 13:53:37 +02:00
return
}
2018-10-24 11:21:03 +02:00
2018-10-14 16:44:21 +02:00
logOK ( )
2018-07-11 13:53:37 +02:00
} ,
} ,
2022-02-11 13:22:57 +01:00
{
Use : "disconnect <thing_id> <channel_id> <user_auth_token>" ,
Short : "Disconnect thing" ,
2023-06-14 12:40:37 +02:00
Long : "Disconnect thing to the channel\n" +
"Usage:\n" +
"\tmainflux-cli things disconnect <thing_id> <channel_id> $USERTOKEN\n" ,
2018-07-11 13:53:37 +02:00
Run : func ( cmd * cobra . Command , args [ ] string ) {
if len ( args ) != 3 {
2022-02-11 13:22:57 +01:00
logUsage ( cmd . Use )
2018-07-11 13:53:37 +02:00
return
}
2018-10-24 11:21:03 +02:00
2023-06-14 12:40:37 +02:00
connIDs := mfxsdk . ConnectionIDs {
ThingIDs : [ ] string { args [ 0 ] } ,
ChannelIDs : [ ] string { args [ 1 ] } ,
}
if err := sdk . Disconnect ( connIDs , args [ 2 ] ) ; err != nil {
2018-10-14 16:44:21 +02:00
logError ( err )
return
}
2018-10-24 11:21:03 +02:00
2018-10-14 16:44:21 +02:00
logOK ( )
2018-07-11 13:53:37 +02:00
} ,
} ,
2022-02-11 13:22:57 +01:00
{
Use : "connections <thing_id> <user_auth_token>" ,
Short : "Connected list" ,
2023-06-14 12:40:37 +02:00
Long : "List of Channels connected to Thing\n" +
"Usage:\n" +
"\tmainflux-cli connections <thing_id> $USERTOKEN\n" ,
2020-07-26 22:47:15 +02:00
Run : func ( cmd * cobra . Command , args [ ] string ) {
if len ( args ) != 2 {
2022-02-11 13:22:57 +01:00
logUsage ( cmd . Use )
2020-07-26 22:47:15 +02:00
return
}
2023-01-05 19:20:05 +03:00
pm := mfxsdk . PageMetadata {
2023-06-14 12:40:37 +02:00
Offset : uint64 ( Offset ) ,
Limit : uint64 ( Limit ) ,
2023-01-05 19:20:05 +03:00
}
cl , err := sdk . ChannelsByThing ( args [ 0 ] , pm , args [ 1 ] )
2019-01-10 21:42:31 +01:00
if err != nil {
logError ( err )
return
}
logJSON ( cl )
} ,
} ,
2018-07-11 13:53:37 +02:00
}
2018-10-24 11:21:03 +02:00
// NewThingsCmd returns things command.
2018-07-11 13:53:37 +02:00
func NewThingsCmd ( ) * cobra . Command {
cmd := cobra . Command {
2023-06-14 12:40:37 +02:00
Use : "things [create | get | update | delete | share | connect | disconnect | connections | not-connected]" ,
2019-02-01 23:17:09 +01:00
Short : "Things management" ,
2023-06-14 12:40:37 +02:00
Long : ` Things management: create, get, update, delete or share Thing, connect or disconnect Thing from Channel and get the list of Channels connected or disconnected from a Thing ` ,
2018-07-11 13:53:37 +02:00
}
2018-10-14 16:44:21 +02:00
for i := range cmdThings {
2018-07-11 13:53:37 +02:00
cmd . AddCommand ( & cmdThings [ i ] )
}
return & cmd
}