apig/cmd/apig/main.go

113 lines
2.1 KiB
Go

package main
import (
"bytes"
"encoding/hex"
"flag"
"fmt"
"io/ioutil"
"log"
"strconv"
"git.xeserv.us/xena/apig/internal/confyg"
storm "github.com/asdine/storm"
"github.com/burl/ejson/crypto"
)
type server struct {
port string
keys *crypto.Keypair
db *storm.DB
}
func (s *server) Allow(verb string, block bool) bool {
switch verb {
case "port":
return !block
case "dbfile":
return !block
case "keys":
return !block
}
return false
}
func (s *server) Read(errs *bytes.Buffer, fs *confyg.FileSyntax, line *confyg.Line, verb string, args []string) {
switch verb {
case "port":
_, err := strconv.Atoi(args[0])
if err != nil {
fmt.Fprintf(errs, "%s:%d value is not a number: %s: %v\n", fs.Name, line.Start.Line, args[0], err)
return
}
s.port = args[0]
case "dbfile":
dbFile := args[0][1 : len(args[0])-1] // shuck off quotes
db, err := storm.Open(dbFile)
if err != nil {
fmt.Fprintf(errs, "%s:%d failed to open storm database: %s: %v\n", fs.Name, line.Start.Line, args[0], err)
return
}
s.db = db
case "keys":
kp := &crypto.Keypair{}
pubk, err := hex.DecodeString(args[0])
if err != nil {
fmt.Fprintf(errs, "%s:%d invalid public key: %v\n", fs.Name, line.Start.Line, err)
return
}
privk, err := hex.DecodeString(args[1])
if err != nil {
fmt.Fprintf(errs, "%s:%d invalid private key: %v\n", fs.Name, line.Start.Line, err)
return
}
copy(kp.Public[:], pubk[0:32])
copy(kp.Private[:], privk[0:32])
s.keys = kp
}
}
var (
configFile = flag.String("cfg", "./apig.cfg", "apig config file location")
keygen = flag.Bool("keygen", false, "if true, generate a new root keypair")
)
func main() {
flag.Parse()
if *keygen {
k := &crypto.Keypair{}
err := k.Generate()
if err != nil {
log.Fatal(err)
}
log.Printf("public: %s", k.PublicString())
log.Printf("private: %s", k.PrivateString())
return
}
data, err := ioutil.ReadFile(*configFile)
if err != nil {
log.Fatal(err)
}
s := &server{}
_, err = confyg.Parse(*configFile, data, s, s)
if err != nil {
log.Fatal(err)
}
_ = s
}