/
main.go
90 lines (75 loc) · 1.84 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package main
import (
"fmt"
"log"
"math/rand"
"os"
"os/exec"
"os/signal"
"syscall"
"time"
"github.com/lxc/lxd/internal/gnuflag"
"github.com/lxc/lxd/shared"
)
func main() {
if err := run(); err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err)
os.Exit(1)
}
}
var verbose = gnuflag.Bool("v", false, "Enables verbose mode.")
var debug = gnuflag.Bool("debug", false, "Enables debug mode.")
var listenAddr = gnuflag.String("tcp", "", "TCP address <addr:port> to listen on in addition to the unix socket (e.g., 127.0.0.1:8443)")
var group = gnuflag.String("group", "", "Group which owns the shared socket")
var help = gnuflag.Bool("help", false, "Print this help message.")
var version = gnuflag.Bool("version", false, "Print LXD's version number and exit.")
func init() {
myGroup, err := shared.GroupName(os.Getgid())
if err != nil {
shared.Debugf("Problem finding default group %s", err)
}
*group = myGroup
rand.Seed(time.Now().UTC().UnixNano())
}
func run() error {
gnuflag.Usage = func() {
fmt.Printf("Usage: lxd [options]\n\nOptions:\n")
gnuflag.PrintDefaults()
}
gnuflag.Parse(true)
if *help {
// The user asked for help via --help, so we shouldn't print to
// stderr.
gnuflag.SetOut(os.Stdout)
gnuflag.Usage()
return nil
}
if *version {
fmt.Println(shared.Version)
return nil
}
if *verbose || *debug {
shared.SetLogger(log.New(os.Stderr, "", log.LstdFlags))
shared.SetDebug(*debug)
}
needed_programs := []string{"setfacl", "rsync", "tar", "xz"}
for _, p := range needed_programs {
_, err := exec.LookPath(p)
if err != nil {
return err
}
}
d, err := StartDaemon(*listenAddr)
if err != nil {
if d != nil && d.db != nil {
d.db.Close()
}
return err
}
defer d.db.Close()
ch := make(chan os.Signal)
signal.Notify(ch, syscall.SIGINT)
signal.Notify(ch, syscall.SIGTERM)
<-ch
return d.Stop()
}