chipmunk/cmd/chipd/main.go

160 lines
2.8 KiB
Go

package main
import (
"fmt"
"log"
"math/rand"
"net/http"
"os"
"os/signal"
"strconv"
"time"
"s.mcquay.me/dm/chipmunk"
"github.com/gorilla/context"
"github.com/kelseyhightower/envconfig"
"github.com/spf13/cobra"
)
type Config struct {
Host string
Port int
DBHost string
DBName string
ClientID string
ClientSecret string
CookieSecret string
}
func init() {
rand.Seed(time.Now().UnixNano())
}
func main() {
var host, clientId, clientSecret, cookieSecret string
var port int
var run = &cobra.Command{
Use: "run",
Short: "run command",
Long: `run chipd with given options`,
Run: func(cmd *cobra.Command, args []string) {
config := &Config{
DBHost: "localhost",
DBName: "dmcquay",
}
err := envconfig.Process("chipd", config)
if err != nil {
log.Fatal(err)
}
if host != "" {
config.Host = host
}
if port != -1 {
config.Port = port
} else {
if config.Port == 0 {
config.Port = 8080
}
}
if clientId != "" {
config.ClientID = clientId
}
if clientSecret != "" {
config.ClientSecret = clientSecret
}
if cookieSecret != "" {
config.CookieSecret = cookieSecret
} else {
if config.CookieSecret == "" {
config.CookieSecret = strconv.Itoa(rand.Int())
}
}
if config.ClientID == "" || config.ClientSecret == "" {
log.Println("Please provide both a clientId and a clientSecret")
os.Exit(1)
}
log.Printf("%+v", config)
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, os.Interrupt, os.Kill)
go func() {
s := <-sigs
log.Printf("signal: %+v", s)
os.Exit(1)
}()
sm := http.NewServeMux()
_, err = chipmunk.NewServer(
sm,
config.ClientID,
config.ClientSecret,
config.CookieSecret,
config.DBHost,
config.DBName,
"",
)
if err != nil {
log.Fatalf("problem initializing Chipd server: %+v", err)
}
hostname := "localhost"
if config.Host == "" {
hostname, err = os.Hostname()
if err != nil {
log.Printf("problem getting hostname:", err)
}
}
log.Printf("serving at: http://%s:%d/", hostname, config.Port)
addr := fmt.Sprintf("%s:%d", config.Host, config.Port)
err = http.ListenAndServe(addr, context.ClearHandler(sm))
if err != nil {
log.Printf("%+v", err)
os.Exit(1)
}
},
}
run.Flags().StringVarP(
&host,
"host",
"n",
"",
"hostname",
)
run.Flags().IntVarP(
&port,
"port",
"p",
-1,
"port",
)
run.Flags().StringVarP(
&clientId,
"clientId",
"i",
"",
"github oauth clientId",
)
run.Flags().StringVarP(
&clientSecret,
"clientSecret",
"s",
"",
"github oauth clientSecret",
)
run.Flags().StringVarP(
&cookieSecret,
"cookieSecret",
"c",
"",
"cookieSecret",
)
var rootCmd = &cobra.Command{Use: "app"}
rootCmd.AddCommand(run)
rootCmd.Execute()
}