main.go 2.98 KB
Newer Older
1 2 3 4
package main

import (
	"dfss"
5
	"dfss/dfssp/api"
6
	"dfss/dfssp/authority"
Caro Axel's avatar
Caro Axel committed
7
	"dfss/mgdb"
8
	"dfss/net"
9 10
	"flag"
	"fmt"
11
	"os"
12 13 14 15
	"runtime"
)

var (
16 17 18
	verbose                                            bool
	path, country, org, unit, cn, port, address, dbURI string
	keySize, validity                                  int
19 20 21 22 23 24
)

func init() {

	flag.BoolVar(&verbose, "v", false, "Print verbose messages")

25 26 27
	flag.StringVar(&port, "p", "9000", "Default port listening")
	flag.StringVar(&address, "a", "0.0.0.0", "Default address to bind for listening")

28
	flag.StringVar(&path, "path", authority.GetHomeDir(), "Path for the platform's private key and root certificate")
Caro Axel's avatar
Caro Axel committed
29 30 31 32 33 34 35 36
	flag.StringVar(&country, "country", "France", "Country for the root certificate")
	flag.StringVar(&org, "org", "DFSS", "Organization for the root certificate")
	flag.StringVar(&unit, "unit", "INSA Rennes", "Organizational unit for the root certificate")
	flag.StringVar(&cn, "cn", "dfssp", "Common name for the root certificate")

	flag.IntVar(&keySize, "keySize", 512, "Encoding size for the private key")
	flag.IntVar(&validity, "validity", 21, "Root certificate's validity duration (days)")

37
	flag.StringVar(&dbURI, "db", "mongodb://localhost/dfss", "Name of the environment variable containing the server url in standard MongoDB format")
Caro Axel's avatar
Caro Axel committed
38

39 40 41 42 43
	flag.Usage = func() {
		fmt.Println("DFSS platform v" + dfss.Version)
		fmt.Println("Users and contracts manager")

		fmt.Println("\nUsage:")
44
		fmt.Println("  dfssp [flags] command")
45 46

		fmt.Println("\nThe commands are:")
Caro Axel's avatar
Caro Axel committed
47 48
		fmt.Println("  init     [cn, country, keySize, org, path, unit, validity]")
		fmt.Println("           create and save the platform's private key and root certificate")
49
		fmt.Println("  start    [path, db, a, p]")
Caro Axel's avatar
Caro Axel committed
50
		fmt.Println("           start the platform after loading its private key and root certificate")
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
		fmt.Println("  help     print this help")
		fmt.Println("  version  print dfss client version")

		fmt.Println("\nFlags:")
		flag.PrintDefaults()

		fmt.Println()
	}
}

func main() {
	flag.Parse()
	command := flag.Arg(0)

	switch command {
	case "version":
		fmt.Println("v"+dfss.Version, runtime.GOOS, runtime.GOARCH)
Caro Axel's avatar
Caro Axel committed
68
	case "init":
69
		err := authority.Initialize(keySize, validity, country, org, unit, cn, path)
Caro Axel's avatar
Caro Axel committed
70
		if err != nil {
71 72
			fmt.Println("An error occured during the initialization operation:", err)
			os.Exit(1)
Caro Axel's avatar
Caro Axel committed
73 74
		}
	case "start":
75
		pid, err := authority.Start(path)
Caro Axel's avatar
Caro Axel committed
76
		if err != nil {
77 78
			fmt.Println("An error occured during the private key and root certificate retrieval:", err)
			os.Exit(1)
Caro Axel's avatar
Caro Axel committed
79
		}
Caro Axel's avatar
Caro Axel committed
80

81
		dbManager, err := mgdb.NewManager(dbURI)
Caro Axel's avatar
Caro Axel committed
82
		if err != nil {
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
			fmt.Println("An error occured during the connection to MongoDB:", err)
			os.Exit(1)
		}

		server := net.NewServer(pid.RootCA, pid.Pkey, pid.RootCA)
		api.RegisterPlatformServer(server, &platformServer{
			Pid:     pid,
			DB:      dbManager,
			Verbose: verbose,
		})

		fmt.Println("Listening on " + address + ":" + port)
		err = net.Listen(address+":"+port, server)

		if err != nil {
Caro Axel's avatar
Caro Axel committed
98 99
			fmt.Println(err)
		}
100

101 102 103 104
	default:
		flag.Usage()
	}
}