From 369c103c58ada110e0f48ae864d2cec9a6e435f4 Mon Sep 17 00:00:00 2001 From: Niall Sheridan Date: Sat, 28 May 2016 19:59:04 +0100 Subject: Use a simple config file for configuring the client. --- cmd/cashier/config.go | 33 +++++++++++++++++++++++++++++++++ cmd/cashier/main.go | 35 +++++++++++++++++++++-------------- 2 files changed, 54 insertions(+), 14 deletions(-) create mode 100644 cmd/cashier/config.go (limited to 'cmd') diff --git a/cmd/cashier/config.go b/cmd/cashier/config.go new file mode 100644 index 0000000..b6e583a --- /dev/null +++ b/cmd/cashier/config.go @@ -0,0 +1,33 @@ +package main + +import ( + "github.com/spf13/viper" +) + +type config struct { + CA string `mapstructure:"ca"` + Keytype string `mapstructure:"key_type"` + Keysize int `mapstructure:"key_size"` + Validity string `mapstructure:"validity"` +} + +func setDefaults() { + viper.SetDefault("ca", "http://localhost:10000") + viper.SetDefault("key_type", "rsa") + viper.SetDefault("key_size", 2048) + viper.SetDefault("validity", "24h") +} + +func readConfig(path string) (*config, error) { + setDefaults() + viper.SetConfigFile(path) + viper.SetConfigType("hcl") + if err := viper.ReadInConfig(); err != nil { + return nil, err + } + c := &config{} + if err := viper.Unmarshal(c); err != nil { + return nil, err + } + return c, nil +} diff --git a/cmd/cashier/main.go b/cmd/cashier/main.go index 8bcc3e7..2bac63a 100644 --- a/cmd/cashier/main.go +++ b/cmd/cashier/main.go @@ -10,6 +10,8 @@ import ( "net" "net/http" "os" + "os/user" + "path" "time" "github.com/nsheridan/cashier/lib" @@ -19,10 +21,8 @@ import ( ) var ( - ca = flag.String("ca", "http://localhost:10000", "CA server") - keybits = flag.Int("bits", 2048, "Key size. Ignored for ed25519 keys") - validity = flag.Duration("validity", time.Hour*24, "Key validity") - keytype = flag.String("key_type", "rsa", "Type of private key to generate - rsa, ecdsa or ed25519") + u, _ = user.Current() + cfg = flag.String("config", path.Join(u.HomeDir, ".cashier.cfg"), "Path to config file") ) func installCert(a agent.Agent, cert *ssh.Certificate, key key) error { @@ -37,8 +37,8 @@ func installCert(a agent.Agent, cert *ssh.Certificate, key key) error { return nil } -func send(s []byte, token string) (*lib.SignResponse, error) { - req, err := http.NewRequest("POST", *ca+"/sign", bytes.NewReader(s)) +func send(s []byte, token, ca string) (*lib.SignResponse, error) { + req, err := http.NewRequest("POST", ca+"/sign", bytes.NewReader(s)) if err != nil { return nil, err } @@ -65,17 +65,21 @@ func send(s []byte, token string) (*lib.SignResponse, error) { return c, nil } -func sign(pub ssh.PublicKey, token string) (*ssh.Certificate, error) { +func sign(pub ssh.PublicKey, token string, conf *config) (*ssh.Certificate, error) { + validity, err := time.ParseDuration(conf.Validity) + if err != nil { + return nil, err + } marshaled := ssh.MarshalAuthorizedKey(pub) marshaled = marshaled[:len(marshaled)-1] s, err := json.Marshal(&lib.SignRequest{ Key: string(marshaled), - ValidUntil: time.Now().Add(*validity), + ValidUntil: time.Now().Add(validity), }) if err != nil { return nil, err } - resp, err := send(s, token) + resp, err := send(s, token, conf.CA) if err != nil { return nil, err } @@ -95,13 +99,16 @@ func sign(pub ssh.PublicKey, token string) (*ssh.Certificate, error) { func main() { flag.Parse() - - fmt.Printf("Your browser has been opened to visit %s\n", *ca) - if err := browser.OpenURL(*ca); err != nil { + c, err := readConfig(*cfg) + if err != nil { + log.Fatalf("Error parsing config file: %v\n", err) + } + fmt.Printf("Your browser has been opened to visit %s\n", c.CA) + if err := browser.OpenURL(c.CA); err != nil { fmt.Println("Error launching web browser. Go to the link in your web browser") } fmt.Println("Generating new key pair") - priv, pub, err := generateKey(*keytype, *keybits) + priv, pub, err := generateKey(c.Keytype, c.Keysize) if err != nil { log.Fatalln("Error generating key pair: ", err) } @@ -110,7 +117,7 @@ func main() { var token string fmt.Scanln(&token) - cert, err := sign(pub, token) + cert, err := sign(pub, token, c) if err != nil { log.Fatalln(err) } -- cgit v1.2.3