8
8
"fmt"
9
9
"net/url"
10
10
"os"
11
+ "reflect"
11
12
"strconv"
12
13
"strings"
13
14
"text/tabwriter"
@@ -16,6 +17,7 @@ import (
16
17
"github.com/cozy/cozy-stack/client"
17
18
"github.com/cozy/cozy-stack/client/request"
18
19
"github.com/cozy/cozy-stack/pkg/consts"
20
+ "github.com/cozy/cozy-stack/pkg/couchdb"
19
21
"github.com/cozy/cozy-stack/pkg/instance"
20
22
humanize "github.com/dustin/go-humanize"
21
23
"github.com/spf13/cobra"
@@ -50,6 +52,7 @@ var flagOnboardingFinished bool
50
52
var flagExpire time.Duration
51
53
var flagAllowLoginScope bool
52
54
var flagFsckIndexIntegrity bool
55
+ var flagAvailableFields bool
53
56
54
57
// instanceCmdGroup represents the instances command
55
58
var instanceCmdGroup = & cobra.Command {
@@ -97,14 +100,14 @@ given domain.
97
100
},
98
101
}
99
102
100
- var showPrefixInstanceCmd = & cobra.Command {
101
- Use : "show-prefix <domain>" ,
102
- Short : "Show the instance prefix of the specified domain" ,
103
+ var showDBPrefixInstanceCmd = & cobra.Command {
104
+ Use : "show-db- prefix <domain>" ,
105
+ Short : "Show the instance DB prefix of the specified domain" ,
103
106
Long : `
104
107
cozy-stack instances show allows to show the instance prefix on the cozy for a
105
108
given domain. The prefix is used for databases and VFS prefixing.
106
109
` ,
107
- Example : "$ cozy-stack instances show-prefix cozy.tools:8080" ,
110
+ Example : "$ cozy-stack instances show-db- prefix cozy.tools:8080" ,
108
111
RunE : func (cmd * cobra.Command , args []string ) error {
109
112
if len (args ) == 0 {
110
113
return cmd .Usage ()
@@ -118,7 +121,7 @@ given domain. The prefix is used for databases and VFS prefixing.
118
121
if in .Attrs .Prefix != "" {
119
122
fmt .Println (in .Attrs .Prefix )
120
123
} else {
121
- fmt .Println (in .Attrs .Domain )
124
+ fmt .Println (couchdb . EscapeCouchdbName ( in .Attrs .Domain ) )
122
125
}
123
126
return nil
124
127
},
@@ -328,18 +331,42 @@ by this server.
328
331
if err != nil {
329
332
return err
330
333
}
334
+ if flagAvailableFields {
335
+ instance := list [0 ]
336
+ val := reflect .ValueOf (instance .Attrs )
337
+ t := val .Type ()
338
+ for i := 0 ; i < t .NumField (); i ++ {
339
+ param := t .Field (i ).Tag .Get ("json" )
340
+ fmt .Println (strings .TrimSuffix (param , ",omitempty" ))
341
+ }
342
+ fmt .Println ("db_prefix" )
343
+ return nil
344
+ }
331
345
if flagJSON {
332
346
if len (flagListFields ) > 0 {
333
347
for _ , inst := range list {
334
- var values [ ]interface {}
348
+ var values map [ string ]interface {}
335
349
values , err = extractFields (inst .Attrs , flagListFields )
336
350
if err != nil {
337
351
return err
338
352
}
353
+
354
+ // Insert the db_prefix value if needed
355
+ for _ , v := range flagListFields {
356
+ if v == "db_prefix" {
357
+ values ["db_prefix" ] = couchdb .EscapeCouchdbName (inst .DBPrefix ())
358
+ }
359
+ }
360
+
339
361
m := make (map [string ]interface {}, len (flagListFields ))
340
- for i , fieldName := range flagListFields {
341
- m [fieldName ] = values [i ]
362
+ for _ , fieldName := range flagListFields {
363
+ if v , ok := values [fieldName ]; ok {
364
+ m [fieldName ] = v
365
+ } else {
366
+ m [fieldName ] = nil
367
+ }
342
368
}
369
+
343
370
if err = json .NewEncoder (os .Stdout ).Encode (m ); err != nil {
344
371
return err
345
372
}
@@ -357,27 +384,44 @@ by this server.
357
384
format := strings .Repeat ("%v\t " , len (flagListFields ))
358
385
format = format [:len (format )- 1 ] + "\n "
359
386
for _ , inst := range list {
360
- var values []interface {}
387
+ var values map [string ]interface {}
388
+ var instancesLines []interface {}
389
+
361
390
values , err = extractFields (inst .Attrs , flagListFields )
362
391
if err != nil {
363
392
return err
364
393
}
365
- fmt .Fprintf (w , format , values ... )
394
+
395
+ // Insert the db_prefix value if needed
396
+ for _ , v := range flagListFields {
397
+ if v == "db_prefix" {
398
+ values ["db_prefix" ] = couchdb .EscapeCouchdbName (inst .DBPrefix ())
399
+ }
400
+ }
401
+ // We append to a list to print in the same order as
402
+ // requested
403
+ for _ , fieldName := range flagListFields {
404
+ instancesLines = append (instancesLines , values [fieldName ])
405
+ }
406
+
407
+ fmt .Fprintf (w , format , instancesLines ... )
366
408
}
367
409
} else {
368
410
for _ , i := range list {
369
411
prefix := i .Attrs .Prefix
412
+ DBPrefix := prefix
370
413
if prefix == "" {
371
- prefix = i .Attrs .Domain
414
+ DBPrefix = couchdb . EscapeCouchdbName ( i .Attrs .Domain )
372
415
}
373
- fmt .Fprintf (w , "%s\t %s\t %s\t %s\t %s\t v%d\t %s\n " ,
416
+ fmt .Fprintf (w , "%s\t %s\t %s\t %s\t %s\t v%d\t %s\t %s \ n " ,
374
417
i .Attrs .Domain ,
375
418
i .Attrs .Locale ,
376
419
formatSize (i .Attrs .BytesDiskQuota ),
377
420
formatDev (i .Attrs .Dev ),
378
421
formatOnboarded (i ),
379
422
i .Attrs .IndexViewsVersion ,
380
423
prefix ,
424
+ DBPrefix ,
381
425
)
382
426
}
383
427
}
@@ -387,7 +431,7 @@ by this server.
387
431
},
388
432
}
389
433
390
- func extractFields (data interface {}, fieldsNames []string ) (values [ ]interface {}, err error ) {
434
+ func extractFields (data interface {}, fieldsNames []string ) (values map [ string ]interface {}, err error ) {
391
435
var m map [string ]interface {}
392
436
var b []byte
393
437
b , err = json .Marshal (data )
@@ -397,10 +441,10 @@ func extractFields(data interface{}, fieldsNames []string) (values []interface{}
397
441
if err = json .Unmarshal (b , & m ); err != nil {
398
442
return
399
443
}
400
- values = make ([ ]interface {}, len (fieldsNames ))
401
- for i , fieldName := range fieldsNames {
444
+ values = make (map [ string ]interface {}, len (fieldsNames ))
445
+ for _ , fieldName := range fieldsNames {
402
446
if v , ok := m [fieldName ]; ok {
403
- values [i ] = v
447
+ values [fieldName ] = v
404
448
}
405
449
}
406
450
return
@@ -796,7 +840,7 @@ var showSwiftPrefixInstanceCmd = &cobra.Command{
796
840
797
841
func init () {
798
842
instanceCmdGroup .AddCommand (showInstanceCmd )
799
- instanceCmdGroup .AddCommand (showPrefixInstanceCmd )
843
+ instanceCmdGroup .AddCommand (showDBPrefixInstanceCmd )
800
844
instanceCmdGroup .AddCommand (addInstanceCmd )
801
845
instanceCmdGroup .AddCommand (modifyInstanceCmd )
802
846
instanceCmdGroup .AddCommand (lsInstanceCmd )
@@ -852,6 +896,7 @@ func init() {
852
896
appTokenInstanceCmd .Flags ().DurationVar (& flagExpire , "expire" , 0 , "Make the token expires in this amount of time" )
853
897
lsInstanceCmd .Flags ().BoolVar (& flagJSON , "json" , false , "Show each line as a json representation of the instance" )
854
898
lsInstanceCmd .Flags ().StringSliceVar (& flagListFields , "fields" , nil , "Arguments shown for each line in the list" )
899
+ lsInstanceCmd .Flags ().BoolVar (& flagAvailableFields , "available-fields" , false , "List available fields for --fields option" )
855
900
updateCmd .Flags ().BoolVar (& flagAllDomains , "all-domains" , false , "Work on all domains iterativelly" )
856
901
updateCmd .Flags ().StringVar (& flagDomain , "domain" , "" , "Specify the domain name of the instance" )
857
902
updateCmd .Flags ().StringVar (& flagContextName , "context-name" , "" , "Work only on the instances with the given context name" )
0 commit comments