17344: 'arvados-client root cmd...' uses root token from config.
authorTom Clegg <tom@curii.com>
Mon, 11 Jul 2022 18:33:45 +0000 (14:33 -0400)
committerTom Clegg <tom@curii.com>
Thu, 14 Jul 2022 13:21:41 +0000 (09:21 -0400)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom@curii.com>

cmd/arvados-client/cmd.go
cmd/arvados-client/root.go [new file with mode: 0644]

index cb15462119d4d1d3368382e1cbbcceafba40464f..783fb0ca90b89d2fb84ca4e12ab9cd693e04ff3e 100644 (file)
@@ -61,6 +61,7 @@ var (
                "shell":                shellCommand{},
                "connect-ssh":          connectSSHCommand{},
                "diagnostics":          diagnostics.Command{},
+               "root":                 rootCommand{},
        })
 )
 
diff --git a/cmd/arvados-client/root.go b/cmd/arvados-client/root.go
new file mode 100644 (file)
index 0000000..5d9845c
--- /dev/null
@@ -0,0 +1,48 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+package main
+
+import (
+       "flag"
+       "fmt"
+       "io"
+       "os"
+
+       "git.arvados.org/arvados.git/lib/cmd"
+       "git.arvados.org/arvados.git/lib/config"
+       "git.arvados.org/arvados.git/sdk/go/ctxlog"
+)
+
+// rootCommand runs another command using API connection info and
+// SystemRootToken from the system config file instead of the caller's
+// environment vars.
+type rootCommand struct{}
+
+func (rootCommand) RunCommand(prog string, args []string, stdin io.Reader, stdout, stderr io.Writer) int {
+       ldr := config.NewLoader(stdin, ctxlog.New(stderr, "text", "info"))
+       flags := flag.NewFlagSet(prog, flag.ContinueOnError)
+       ldr.SetupFlags(flags)
+       if ok, code := cmd.ParseFlags(flags, prog, args, "subcommand ...", stderr); !ok {
+               return code
+       }
+       cfg, err := ldr.Load()
+       if err != nil {
+               fmt.Fprintln(stderr, err)
+               return 1
+       }
+       cluster, err := cfg.GetCluster("")
+       if err != nil {
+               fmt.Fprintln(stderr, err)
+               return 1
+       }
+       os.Setenv("ARVADOS_API_HOST", cluster.Services.Controller.ExternalURL.Host)
+       os.Setenv("ARVADOS_API_TOKEN", cluster.SystemRootToken)
+       if cluster.TLS.Insecure {
+               os.Setenv("ARVADOS_API_HOST_INSECURE", "1")
+       } else {
+               os.Unsetenv("ARVADOS_API_HOST_INSECURE")
+       }
+       return handler.RunCommand(prog, flags.Args(), stdin, stdout, stderr)
+}