@@ -148,10 +148,54 @@
148 148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cmdBackendRename(api, args[2], args[3])
149 149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
default:
150 150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fmt.Fprintf(os.Stderr, "unknown subcommand: backend %s\n", args[1])
151 151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
os.Exit(1)
152 152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case "topology", "topo":
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if len(args) < 2 {
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fmt.Fprintf(os.Stderr, "usage: scuttlectl topology <list|provision|drop>\n")
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ os.Exit(1)
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ switch args[1] {
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case "list", "show":
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cmdTopologyList(api, *jsonFlag)
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case "provision", "create":
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ requireArgs(args, 3, "scuttlectl topology provision #channel")
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cmdTopologyProvision(api, args[2], *jsonFlag)
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case "drop", "rm":
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ requireArgs(args, 3, "scuttlectl topology drop #channel")
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cmdTopologyDrop(api, args[2])
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ default:
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fmt.Fprintf(os.Stderr, "unknown subcommand: topology %s\n", args[1])
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ os.Exit(1)
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case "config":
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if len(args) < 2 {
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fmt.Fprintf(os.Stderr, "usage: scuttlectl config <show|history>\n")
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ os.Exit(1)
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ switch args[1] {
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case "show", "get":
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cmdConfigShow(api, *jsonFlag)
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case "history":
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cmdConfigHistory(api, *jsonFlag)
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ default:
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fmt.Fprintf(os.Stderr, "unknown subcommand: config %s\n", args[1])
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ os.Exit(1)
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case "bot", "bots":
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if len(args) < 2 {
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fmt.Fprintf(os.Stderr, "usage: scuttlectl bot <list>\n")
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ os.Exit(1)
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ switch args[1] {
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case "list":
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cmdBotList(api, *jsonFlag)
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ default:
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fmt.Fprintf(os.Stderr, "unknown subcommand: bot %s\n", args[1])
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ os.Exit(1)
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
153 197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
default:
154 198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fmt.Fprintf(os.Stderr, "unknown command: %s\n", args[0])
155 199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
usage()
156 200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
os.Exit(1)
157 201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -491,10 +535,141 @@
491 535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fmt.Fprintf(tw, "password\t%s\n", creds.Password)
492 536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fmt.Fprintf(tw, "server\t%s\n", creds.Server)
493 537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
tw.Flush()
494 538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fmt.Println("\nStore this password — it will not be shown again.")
495 539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // --- topology ---
542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func cmdTopologyList(api *apiclient.Client, asJSON bool) {
544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ raw, err := api.GetTopology()
545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ die(err)
546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if asJSON {
547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ printJSON(raw)
548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var data struct {
551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ StaticChannels []string `json:"static_channels"`
552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Types []struct {
553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Name string `json:"name"`
554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Prefix string `json:"prefix"`
555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Autojoin []string `json:"autojoin"`
556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Ephemeral bool `json:"ephemeral"`
557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ TTL int64 `json:"ttl_seconds"`
558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } `json:"types"`
559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ must(json.Unmarshal(raw, &data))
561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tw := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fmt.Fprintln(tw, "STATIC CHANNELS")
564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for _, ch := range data.StaticChannels {
565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fmt.Fprintf(tw, " %s\n", ch)
566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if len(data.Types) > 0 {
568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fmt.Fprintln(tw, "\nCHANNEL TYPES")
569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fmt.Fprintln(tw, " NAME\tPREFIX\tAUTOJOIN\tEPHEMERAL\tTTL")
570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for _, t := range data.Types {
571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ttl := "—"
572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if t.TTL > 0 {
573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ttl = fmt.Sprintf("%dh", t.TTL/3600)
574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eph := "no"
576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if t.Ephemeral {
577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eph = "yes"
578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fmt.Fprintf(tw, " %s\t#%s*\t%s\t%s\t%s\n", t.Name, t.Prefix, strings.Join(t.Autojoin, ","), eph, ttl)
580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tw.Flush()
583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func cmdTopologyProvision(api *apiclient.Client, channel string, asJSON bool) {
586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if !strings.HasPrefix(channel, "#") {
587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ channel = "#" + channel
588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ raw, err := api.ProvisionChannel(channel)
590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ die(err)
591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if asJSON {
592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ printJSON(raw)
593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fmt.Printf("Channel provisioned: %s\n", channel)
596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func cmdTopologyDrop(api *apiclient.Client, channel string) {
599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if !strings.HasPrefix(channel, "#") {
600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ channel = "#" + channel
601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ die(api.DropChannel(channel))
603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fmt.Printf("Channel dropped: %s\n", channel)
604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // --- config ---
607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func cmdConfigShow(api *apiclient.Client, asJSON bool) {
609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ raw, err := api.GetConfig()
610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ die(err)
611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ printJSON(raw) // always JSON — config is a complex nested object
612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func cmdConfigHistory(api *apiclient.Client, asJSON bool) {
615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ raw, err := api.GetConfigHistory()
616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ die(err)
617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if asJSON {
618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ printJSON(raw)
619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var data struct {
622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Entries []struct {
623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Filename string `json:"filename"`
624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ At string `json:"at"`
625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } `json:"entries"`
626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ must(json.Unmarshal(raw, &data))
628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if len(data.Entries) == 0 {
629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fmt.Println("no config history")
630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tw := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fmt.Fprintln(tw, "SNAPSHOT\tTIME")
634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for _, e := range data.Entries {
635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fmt.Fprintf(tw, "%s\t%s\n", e.Filename, e.At)
636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tw.Flush()
638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // --- bots ---
641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func cmdBotList(api *apiclient.Client, asJSON bool) {
643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ raw, err := api.GetSettings()
644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ die(err)
645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if asJSON {
646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ printJSON(raw)
647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var data struct {
650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Policies struct {
651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Behaviors []struct {
652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ID string `json:"id"`
653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Name string `json:"name"`
654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Nick string `json:"nick"`
655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Enabled bool `json:"enabled"`
656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } `json:"behaviors"`
657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } `json:"policies"`
658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ must(json.Unmarshal(raw, &data))
660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tw := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fmt.Fprintln(tw, "BOT\tNICK\tSTATUS")
662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for _, b := range data.Policies.Behaviors {
663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ status := "disabled"
664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if b.Enabled {
665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ status = "enabled"
666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fmt.Fprintf(tw, "%s\t%s\t%s\n", b.Name, b.Nick, status)
668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tw.Flush()
670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
496 671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
497 672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
func usage() {
498 673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fmt.Fprintf(os.Stderr, `scuttlectl %s — scuttlebot management CLI
499 674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
500 675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Usage:
@@ -526,10 +701,16 @@
526 701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
backend rename <old> <new> rename a backend
527 702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
admin list list admin accounts
528 703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
admin add <username> add admin (prompts for password)
529 704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
admin remove <username> remove admin
530 705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
admin passwd <username> change admin password (prompts)
706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ topology list show topology (static channels, types)
707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ topology provision #channel provision a new channel via ChanServ
708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ topology drop #channel drop a channel
709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config show dump current config (JSON)
710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config history show config change history
711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bot list show system bot status
531 712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
`, version)
532 713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
533 714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
534 715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
func printJSON(raw json.RawMessage) {
535 716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
var buf []byte
536 717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!