cmd_devices.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. // Copyright (C) 2014 Audrius Butkevičius
  2. package main
  3. import (
  4. "fmt"
  5. "strings"
  6. "github.com/AudriusButkevicius/cli"
  7. "github.com/syncthing/syncthing/lib/config"
  8. )
  9. func init() {
  10. cliCommands = append(cliCommands, cli.Command{
  11. Name: "devices",
  12. HideHelp: true,
  13. Usage: "Device command group",
  14. Subcommands: []cli.Command{
  15. {
  16. Name: "list",
  17. Usage: "List registered devices",
  18. Requires: &cli.Requires{},
  19. Action: devicesList,
  20. },
  21. {
  22. Name: "add",
  23. Usage: "Add a new device",
  24. Requires: &cli.Requires{"device id", "device name?"},
  25. Action: devicesAdd,
  26. },
  27. {
  28. Name: "remove",
  29. Usage: "Remove an existing device",
  30. Requires: &cli.Requires{"device id"},
  31. Action: devicesRemove,
  32. },
  33. {
  34. Name: "get",
  35. Usage: "Get a property of a device",
  36. Requires: &cli.Requires{"device id", "property"},
  37. Action: devicesGet,
  38. },
  39. {
  40. Name: "set",
  41. Usage: "Set a property of a device",
  42. Requires: &cli.Requires{"device id", "property", "value..."},
  43. Action: devicesSet,
  44. },
  45. },
  46. })
  47. }
  48. func devicesList(c *cli.Context) {
  49. cfg := getConfig(c)
  50. first := true
  51. writer := newTableWriter()
  52. for _, device := range cfg.Devices {
  53. if !first {
  54. fmt.Fprintln(writer)
  55. }
  56. fmt.Fprintln(writer, "ID:\t", device.DeviceID, "\t")
  57. fmt.Fprintln(writer, "Name:\t", device.Name, "\t(name)")
  58. fmt.Fprintln(writer, "Address:\t", strings.Join(device.Addresses, " "), "\t(address)")
  59. fmt.Fprintln(writer, "Compression:\t", device.Compression, "\t(compression)")
  60. fmt.Fprintln(writer, "Certificate name:\t", device.CertName, "\t(certname)")
  61. fmt.Fprintln(writer, "Introducer:\t", device.Introducer, "\t(introducer)")
  62. first = false
  63. }
  64. writer.Flush()
  65. }
  66. func devicesAdd(c *cli.Context) {
  67. nid := c.Args()[0]
  68. id := parseDeviceID(nid)
  69. newDevice := config.DeviceConfiguration{
  70. DeviceID: id,
  71. Name: nid,
  72. Addresses: []string{"dynamic"},
  73. }
  74. if len(c.Args()) > 1 {
  75. newDevice.Name = c.Args()[1]
  76. }
  77. if len(c.Args()) > 2 {
  78. addresses := c.Args()[2:]
  79. for _, item := range addresses {
  80. if item == "dynamic" {
  81. continue
  82. }
  83. validAddress(item)
  84. }
  85. newDevice.Addresses = addresses
  86. }
  87. cfg := getConfig(c)
  88. for _, device := range cfg.Devices {
  89. if device.DeviceID == id {
  90. die("Device " + nid + " already exists")
  91. }
  92. }
  93. cfg.Devices = append(cfg.Devices, newDevice)
  94. setConfig(c, cfg)
  95. }
  96. func devicesRemove(c *cli.Context) {
  97. nid := c.Args()[0]
  98. id := parseDeviceID(nid)
  99. if nid == getMyID(c) {
  100. die("Cannot remove yourself")
  101. }
  102. cfg := getConfig(c)
  103. for i, device := range cfg.Devices {
  104. if device.DeviceID == id {
  105. last := len(cfg.Devices) - 1
  106. cfg.Devices[i] = cfg.Devices[last]
  107. cfg.Devices = cfg.Devices[:last]
  108. setConfig(c, cfg)
  109. return
  110. }
  111. }
  112. die("Device " + nid + " not found")
  113. }
  114. func devicesGet(c *cli.Context) {
  115. nid := c.Args()[0]
  116. id := parseDeviceID(nid)
  117. arg := c.Args()[1]
  118. cfg := getConfig(c)
  119. for _, device := range cfg.Devices {
  120. if device.DeviceID != id {
  121. continue
  122. }
  123. switch strings.ToLower(arg) {
  124. case "name":
  125. fmt.Println(device.Name)
  126. case "address":
  127. fmt.Println(strings.Join(device.Addresses, "\n"))
  128. case "compression":
  129. fmt.Println(device.Compression.String())
  130. case "certname":
  131. fmt.Println(device.CertName)
  132. case "introducer":
  133. fmt.Println(device.Introducer)
  134. default:
  135. die("Invalid property: " + arg + "\nAvailable properties: name, address, compression, certname, introducer")
  136. }
  137. return
  138. }
  139. die("Device " + nid + " not found")
  140. }
  141. func devicesSet(c *cli.Context) {
  142. nid := c.Args()[0]
  143. id := parseDeviceID(nid)
  144. arg := c.Args()[1]
  145. config := getConfig(c)
  146. for i, device := range config.Devices {
  147. if device.DeviceID != id {
  148. continue
  149. }
  150. switch strings.ToLower(arg) {
  151. case "name":
  152. config.Devices[i].Name = strings.Join(c.Args()[2:], " ")
  153. case "address":
  154. for _, item := range c.Args()[2:] {
  155. if item == "dynamic" {
  156. continue
  157. }
  158. validAddress(item)
  159. }
  160. config.Devices[i].Addresses = c.Args()[2:]
  161. case "compression":
  162. err := config.Devices[i].Compression.UnmarshalText([]byte(c.Args()[2]))
  163. die(err)
  164. case "certname":
  165. config.Devices[i].CertName = strings.Join(c.Args()[2:], " ")
  166. case "introducer":
  167. config.Devices[i].Introducer = parseBool(c.Args()[2])
  168. default:
  169. die("Invalid property: " + arg + "\nAvailable properties: name, address, compression, certname, introducer")
  170. }
  171. setConfig(c, config)
  172. return
  173. }
  174. die("Device " + nid + " not found")
  175. }