/
mclient.go
123 lines (102 loc) · 2.45 KB
/
mclient.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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
Copyright (C) 2015 Enrico Bianchi (enrico.bianchi@gmail.com)
Project Memento
Description A backup system
License GPL version 2 (see GPL.txt for details)
*/
package main
import (
"client"
"fmt"
"github.com/gaal/go-options/options"
"github.com/go-ini/ini"
"github.com/op/go-logging"
"net"
"os"
)
const VERSION = "1.1.0"
const SPEC = `
Memento - A backup system
Usage: mclient [OPTIONS]
--
h,help Print this help
v,version Print version
p,port= Set port to listen
l,listen= Set listen address
s,ssl= Set SSL config file
D,debug Enable debug messages
`
func setLog(debug bool) *logging.Logger {
var log = logging.MustGetLogger("Memento Client")
var format = logging.MustStringFormatter(
"%{time:2006-01-02 15:04:05.000} %{level} Memento - %{message}",
)
backend := logging.NewLogBackend(os.Stderr, "", 0)
backendLeveled := logging.AddModuleLevel(backend)
if debug {
backendLeveled.SetLevel(logging.DEBUG, "")
} else {
backendLeveled.SetLevel(logging.CRITICAL, "")
}
logging.SetBackend(backendLeveled)
logging.SetFormatter(format)
return log
}
func main() {
var log *logging.Logger
var port, listen, address string
s := options.NewOptions(SPEC)
// Check if options isn't passed
if len(os.Args[1:]) <= 0 {
s.PrintUsageAndExit("No option specified")
}
opts := s.Parse(os.Args[1:])
// Print version and exit
if opts.GetBool("version") {
fmt.Println("Memento client " + VERSION)
os.Exit(0)
}
// Print help and exit
if opts.GetBool("help") {
s.PrintUsageAndExit("Memento client " + VERSION)
}
// Enable debug
if opts.GetBool("debug") {
log = setLog(true)
} else {
log = setLog(false)
}
// Get port to listen
if opts.GetBool("port") {
port = opts.Get("port")
} else {
log.Fatal("No port specified")
os.Exit(1)
}
// Get address to listen
if opts.GetBool("listen") {
if addr := net.ParseIP(opts.Get("listen")); addr != nil {
listen = addr.String()
} else {
log.Fatal("Invalid IP address")
}
}
if listen == "" {
log.Debug("Listen on all interfaces")
address = ":" + port
} else {
log.Debug("Listen on address " + listen)
address = listen + ":" + port
}
if opts.GetBool("ssl") {
log.Debug("SSL enabled")
cfg, err := ini.Load([]byte{}, opts.Get("ssl"))
if err != nil {
// handle error
log.Fatalf("Error: %v\n", err)
}
client.Serve(log, address, cfg)
} else {
client.Serve(log, address, nil)
}
}