various fixes to make testing possible
[epoint] / cmd / epoint-client / epoint-client.go
index 7ddd923..21541c3 100644 (file)
@@ -8,6 +8,7 @@ import (
        "epoint/document"
        "epoint/key"
        "epoint/store"
+       "flag"
        "fmt"
        "io"
        "log"
@@ -17,23 +18,30 @@ import (
        "strconv"
 )
 
-// TODO: store documents, query document by id, easy submit
+// TODO: create certby/ draftby/
+// TODO: query document by id, easy submit
 
 var db *store.Conn
 
-const usage = `usage: ./epoint-client [i|h|d|r|q|s|v|c] [args..] < [seed|document]
-server is http://localhost:8080 by default
+const usage = `usage: ./epoint-client [flags] [i|h|d|r|q|s|v|c] [args..] < [seed|document]
+flags - one of -help, -dir rootdir, -server serveraddr
 
 i - make issuer key, use seed for generation, args: denomination
 h - make holder key, use seed for generation, args: issuer
 d - make draft, use seed for signing key, args: targetid value
 r - sign raw document, use seed for signing key, args: document
-q - query document, args: k|d|c id [server]
-s - submit a (key|draft|cert) document, args: k|d|c [server]
+q - query document, args: k|d|c id
+s - submit a (key|draft|cert) document, args: k|d|c
 v - verify a document (prints body of the document if ok)
-c - connect to server and get server key, args: [server]
+c - connect to server and get server key
 `
 
+var (
+       rootdir = flag.String("dir", "", "root dir for storage, empty sets a sane default")
+       server  = flag.String("server", "http://localhost:8080", "server address")
+       // TODO: verbose
+)
+
 func rnd(n int) (r []byte, err error) {
        r = make([]byte, n)
        _, err = io.ReadFull(rand.Reader, r)
@@ -223,7 +231,7 @@ func q(cmd, id, server string) (err error) {
                log.Printf("found %s in local store", id)
                return
        }
-       resp, err := http.Get(server+"/"+k+"/"+id)
+       resp, err := http.Get(server + "/" + k + "/" + id)
        if err != nil {
                return
        }
@@ -376,6 +384,10 @@ func s(d []byte, cmd, server string) (err error) {
        if err != nil {
                return
        }
+       if cmd == "k" {
+               // TODO: signed reply?
+               return
+       }
        cert, s, err := document.Parse(b)
        if err != nil {
                return
@@ -462,7 +474,7 @@ func c(server string) (err error) {
 
 // TODO: commmon code with server
 func initstore(dir string) (db *store.Conn, err error) {
-       log.Printf("using root dir %s", dir)
+       //      log.Printf("using root dir %s", dir)
        db, err = store.Open(dir)
        if err != nil {
                return
@@ -487,11 +499,11 @@ func initstore(dir string) (db *store.Conn, err error) {
        if err != nil {
                return
        }
-       err = db.Ensure("certby/key")
+       err = db.Ensure("certby/key.issuer")
        if err != nil {
                return
        }
-       err = db.Ensure("certby/key.serial")
+       err = db.Ensure("certby/key.issuer.serial")
        if err != nil {
                return
        }
@@ -529,67 +541,62 @@ func read() []byte {
        return b
 }
 
+func cmdargs() (cmd string, args []string) {
+       a := flag.Args()
+       cmd = a[0]
+       args = a[1:]
+       return
+}
+
 func main() {
-       if len(os.Args) < 2 {
+       flag.Parse()
+       if flag.NArg() < 1 {
                log.Fatal(usage)
        }
+       cmd, args := cmdargs()
 
        var err error
-       db, err = initstore(storedir())
-       server := "http://localhost:8080"
-       switch os.Args[1] {
+       dir := *rootdir
+       if dir == "" {
+               dir = storedir()
+       }
+       db, err = initstore(dir)
+       switch cmd {
        case "h", "i":
-               if len(os.Args) != 3 {
+               if len(args) != 1 {
                        log.Fatal(usage)
                }
-               err = k(read(), os.Args[1], os.Args[2])
+               err = k(read(), cmd, args[0])
        case "d":
-               if len(os.Args) != 4 {
+               if len(args) != 2 {
                        log.Fatal(usage)
                }
-               err = d(read(), os.Args[2], os.Args[3])
+               err = d(read(), args[0], args[1])
        case "r":
-               if len(os.Args) != 3 {
+               if len(os.Args) != 1 {
                        log.Fatal(usage)
                }
-               err = raw(read(), os.Args[2])
+               err = raw(read(), args[0])
        case "q":
-               cmd := ""
-               id := ""
-               if len(os.Args) == 5 {
-                       cmd = os.Args[2]
-                       id = os.Args[3]
-                       server = os.Args[4]
-               } else if len(os.Args) == 4 {
-                       cmd = os.Args[2]
-                       id = os.Args[3]
-               } else {
+               if len(args) != 2 {
                        log.Fatal(usage)
                }
-               err = q(cmd, id, server)
+               err = q(args[0], args[1], *server)
        case "s":
-               cmd := ""
-               if len(os.Args) == 4 {
-                       cmd = os.Args[2]
-                       server = os.Args[3]
-               } else if len(os.Args) == 3 {
-                       cmd = os.Args[2]
-               } else {
+               if len(args) != 1 {
                        log.Fatal(usage)
                }
-               err = s(read(), cmd, server)
+               err = s(read(), args[0], *server)
        case "v":
-               if len(os.Args) != 2 {
+               if len(args) != 0 {
                        log.Fatal(usage)
                }
                err = v(read())
        case "c":
-               if len(os.Args) == 3 {
-                       server = os.Args[2]
-               } else if len(os.Args) != 2 {
+               if len(args) != 0 {
                        log.Fatal(usage)
                }
-               err = c(server)
+               err = c(*server)
        default:
                log.Fatal(usage)
        }