Commit 67c1bd6a authored by bobbyrullo's avatar bobbyrullo

Merge pull request #277 from ericchiang/cmd_stdin

*: allow dexctl set-connector-configs to read from stdin
parents b5c7f197 ec3bc7f2
...@@ -2,6 +2,8 @@ package main ...@@ -2,6 +2,8 @@ package main
import ( import (
"fmt" "fmt"
"io"
"os"
"github.com/coreos/dex/connector" "github.com/coreos/dex/connector"
"github.com/spf13/cobra" "github.com/spf13/cobra"
...@@ -18,8 +20,8 @@ var ( ...@@ -18,8 +20,8 @@ var (
cmdSetConnectorConfigs = &cobra.Command{ cmdSetConnectorConfigs = &cobra.Command{
Use: "set-connector-configs", Use: "set-connector-configs",
Short: "Overwrite the current IdP connector configs with those from a local file.", Short: "Overwrite the current IdP connector configs with those from a local file. Provide the argument '-' to read from stdin.",
Long: "Overwrite the current IdP connector configs with those from a local file.", Long: "Overwrite the current IdP connector configs with those from a local file. Provide the argument '-' to read from stdin.",
Example: ` dexctl set-connector-configs --db-url=${DB_URL} ./static/conn_conf.json`, Example: ` dexctl set-connector-configs --db-url=${DB_URL} ./static/conn_conf.json`,
Run: wrapRun(runSetConnectorConfigs), Run: wrapRun(runSetConnectorConfigs),
} }
...@@ -36,15 +38,22 @@ func runSetConnectorConfigs(cmd *cobra.Command, args []string) int { ...@@ -36,15 +38,22 @@ func runSetConnectorConfigs(cmd *cobra.Command, args []string) int {
return 2 return 2
} }
rf, err := connector.NewConnectorConfigRepoFromFile(args[0]) var r io.Reader
if err != nil { if from := args[0]; from == "-" {
stderr("Unable to retrieve connector configs from file: %v", err) r = os.Stdin
return 1 } else {
f, err := os.Open(from)
if err != nil {
stderr("Unable to open specified file: %v", err)
return 1
}
defer f.Close()
r = f
} }
cfgs, err := rf.All() cfgs, err := connector.ReadConfigs(r)
if err != nil { if err != nil {
stderr("Unable to retrieve connector configs from file: %v", err) stderr("Unable to decode connector configs: %v", err)
return 1 return 1
} }
...@@ -54,7 +63,6 @@ func runSetConnectorConfigs(cmd *cobra.Command, args []string) int { ...@@ -54,7 +63,6 @@ func runSetConnectorConfigs(cmd *cobra.Command, args []string) int {
} }
fmt.Printf("Saved %d connector config(s)\n", len(cfgs)) fmt.Printf("Saved %d connector config(s)\n", len(cfgs))
return 0 return 0
} }
......
...@@ -3,12 +3,11 @@ package connector ...@@ -3,12 +3,11 @@ package connector
import ( import (
"encoding/json" "encoding/json"
"io" "io"
"os"
"github.com/coreos/dex/repo" "github.com/coreos/dex/repo"
) )
func newConnectorConfigsFromReader(r io.Reader) ([]ConnectorConfig, error) { func ReadConfigs(r io.Reader) ([]ConnectorConfig, error) {
var ms []map[string]interface{} var ms []map[string]interface{}
if err := json.NewDecoder(r).Decode(&ms); err != nil { if err := json.NewDecoder(r).Decode(&ms); err != nil {
return nil, err return nil, err
...@@ -24,21 +23,6 @@ func newConnectorConfigsFromReader(r io.Reader) ([]ConnectorConfig, error) { ...@@ -24,21 +23,6 @@ func newConnectorConfigsFromReader(r io.Reader) ([]ConnectorConfig, error) {
return cfgs, nil return cfgs, nil
} }
func NewConnectorConfigRepoFromFile(loc string) (ConnectorConfigRepo, error) {
cf, err := os.Open(loc)
if err != nil {
return nil, err
}
defer cf.Close()
cfgs, err := newConnectorConfigsFromReader(cf)
if err != nil {
return nil, err
}
return &memConnectorConfigRepo{configs: cfgs}, nil
}
type memConnectorConfigRepo struct { type memConnectorConfigRepo struct {
configs []ConnectorConfig configs []ConnectorConfig
} }
......
package functional package functional
import ( import (
"bytes"
"io"
"io/ioutil" "io/ioutil"
"os" "os"
"os/exec" "os/exec"
...@@ -42,6 +44,7 @@ func TestDexctlCommands(t *testing.T) { ...@@ -42,6 +44,7 @@ func TestDexctlCommands(t *testing.T) {
args []string args []string
env []string env []string
expErr bool expErr bool
stdin io.Reader
}{ }{
{ {
args: []string{"new-client", "https://example.com/callback"}, args: []string{"new-client", "https://example.com/callback"},
...@@ -57,10 +60,20 @@ func TestDexctlCommands(t *testing.T) { ...@@ -57,10 +60,20 @@ func TestDexctlCommands(t *testing.T) {
{ {
args: []string{"set-connector-configs", "--db-url", dsn, connConfig}, args: []string{"set-connector-configs", "--db-url", dsn, connConfig},
}, },
{
args: []string{"set-connector-configs", "--db-url", dsn, "-"},
stdin: bytes.NewReader(connConfigExample),
},
{
args: []string{"set-connector-configs", "-"},
env: []string{"DEXCTL_DB_URL=" + dsn},
stdin: bytes.NewReader(connConfigExample),
},
} }
for _, tt := range tests { for _, tt := range tests {
cmd := exec.Command("../bin/dexctl", tt.args...) cmd := exec.Command("../bin/dexctl", tt.args...)
cmd.Stdin = tt.stdin
cmd.Env = tt.env cmd.Env = tt.env
out, err := cmd.CombinedOutput() out, err := cmd.CombinedOutput()
if !tt.expErr && err != nil { if !tt.expErr && err != nil {
......
...@@ -115,10 +115,16 @@ func (cfg *SingleServerConfig) Configure(srv *Server) error { ...@@ -115,10 +115,16 @@ func (cfg *SingleServerConfig) Configure(srv *Server) error {
return fmt.Errorf("unable to read client identities from file %s: %v", cfg.ClientsFile, err) return fmt.Errorf("unable to read client identities from file %s: %v", cfg.ClientsFile, err)
} }
cfgRepo, err := connector.NewConnectorConfigRepoFromFile(cfg.ConnectorsFile) f, err := os.Open(cfg.ConnectorsFile)
if err != nil { if err != nil {
return fmt.Errorf("unable to create ConnectorConfigRepo: %v", err) return fmt.Errorf("opening connectors file: %v", err)
} }
defer f.Close()
cfgs, err := connector.ReadConfigs(f)
if err != nil {
return fmt.Errorf("decoding connector configs: %v", err)
}
cfgRepo := connector.NewConnectorConfigRepoFromConfigs(cfgs)
sRepo := session.NewSessionRepo() sRepo := session.NewSessionRepo()
skRepo := session.NewSessionKeyRepo() skRepo := session.NewSessionKeyRepo()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment