From 7afb826135fd1ceaef9d3d6a4544826f5fe3e9cc Mon Sep 17 00:00:00 2001 From: Victor Vrantchan Date: Sat, 18 Mar 2017 20:05:34 +0000 Subject: [PATCH] add get command to fetch resources --- get.go | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ main.go | 3 ++ serve.go | 21 ++++++++--- 3 files changed, 128 insertions(+), 5 deletions(-) create mode 100644 get.go diff --git a/get.go b/get.go new file mode 100644 index 00000000..f59002e2 --- /dev/null +++ b/get.go @@ -0,0 +1,109 @@ +package main + +import ( + "encoding/json" + "errors" + "flag" + "fmt" + "os" + "strings" + + "github.com/micromdm/dep" +) + +func getResource(args []string) error { + if len(args) < 1 { + return errors.New("get requires at least one resource name") + } + + var run func([]string) error + switch strings.ToLower(args[0]) { + case "dep": + run = getDep + default: + usage() + os.Exit(1) + } + + if err := run(args[1:]); err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) + os.Exit(1) + } + + return nil +} + +func getDep(args []string) error { + if len(args) < 1 { + return errors.New("get dep requires at least one resource name") + } + sm := &config{} + sm.setupBolt() + client, err := sm.depClient() + if err != nil { + return err + } + var run func(dep.Client, []string) error + switch strings.ToLower(args[0]) { + case "account-info": + acc, err := client.Account() + if err != nil { + return err + } + enc := json.NewEncoder(os.Stdout) + enc.SetIndent("", " ") + err = enc.Encode(acc) + return err + case "device": + run = getDepDevice + case "profile": + run = getDepProfile + } + + if err := run(client, args[1:]); err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) + os.Exit(1) + } + return nil +} + +func getDepProfile(client dep.Client, args []string) error { + flagset := flag.NewFlagSet("profile", flag.ExitOnError) + var ( + flUUID = flagset.String("uuid", "", "profile uuid") + ) + if err := flagset.Parse(args); err != nil { + return err + } + + profile, err := client.FetchProfile(*flUUID) + if err != nil { + return err + } + enc := json.NewEncoder(os.Stdout) + enc.SetIndent("", " ") + err = enc.Encode(profile) + return err +} + +func getDepDevice(client dep.Client, args []string) error { + flagset := flag.NewFlagSet("device", flag.ExitOnError) + var ( + flSerial = flagset.String("serial", "", "device serial number") + ) + if err := flagset.Parse(args); err != nil { + return err + } + + resp, err := client.DeviceDetails([]string{*flSerial}) + if err != nil { + return err + } + if dev, ok := resp.Devices[*flSerial]; ok && dev.SerialNumber != "" { + enc := json.NewEncoder(os.Stdout) + enc.SetIndent("", " ") + err = enc.Encode(dev) + return err + } + return nil +} diff --git a/main.go b/main.go index 2d4cfce1..dc38429a 100644 --- a/main.go +++ b/main.go @@ -25,6 +25,8 @@ func main() { run = serve case "deptoken": run = depToken + case "get": + run = getResource default: usage() os.Exit(1) @@ -41,6 +43,7 @@ func usage() error { Available Commands: serve + get deptoken version diff --git a/serve.go b/serve.go index 1a2ef0c6..508d7866 100644 --- a/serve.go +++ b/serve.go @@ -432,11 +432,10 @@ func topicFromCert(cert *x509.Certificate) (string, error) { // the CA. const scepCACertName = "/var/db/micromdm/SCEPCACert.pem" -func (c *config) setupDEPSync() { +func (c *config) depClient() (dep.Client, error) { if c.err != nil { - return + return nil, c.err } - // depsim config depsim := true conf := &dep.Config{ @@ -472,8 +471,7 @@ func (c *config) setupDEPSync() { return nil }) if err != nil { - c.err = err - return + return nil, err } depServerURL := "https://mdmenrollment.apple.com" @@ -481,6 +479,19 @@ func (c *config) setupDEPSync() { depServerURL = "http://dep.micromdm.io:9000" } client, err := dep.NewClient(conf, dep.ServerURL(depServerURL)) + if err != nil { + return nil, err + } + + return client, nil +} + +func (c *config) setupDEPSync() { + if c.err != nil { + return + } + + client, err := c.depClient() if err != nil { c.err = err return