|
|
@@ -7,6 +7,7 @@ import (
|
|
7
|
7
|
"io"
|
|
8
|
8
|
"math/rand"
|
|
9
|
9
|
"os"
|
|
|
10
|
+ "syscall"
|
|
10
|
11
|
"time"
|
|
11
|
12
|
|
|
12
|
13
|
"go.uber.org/zap"
|
|
|
@@ -15,6 +16,7 @@ import (
|
|
15
|
16
|
|
|
16
|
17
|
"github.com/9seconds/mtg/config"
|
|
17
|
18
|
"github.com/9seconds/mtg/proxy"
|
|
|
19
|
+ "github.com/juju/errors"
|
|
18
|
20
|
)
|
|
19
|
21
|
|
|
20
|
22
|
var (
|
|
|
@@ -81,12 +83,20 @@ var (
|
|
81
|
83
|
secret = app.Arg("secret", "Secret of this proxy.").Required().String()
|
|
82
|
84
|
)
|
|
83
|
85
|
|
|
84
|
|
-func main() {
|
|
|
86
|
+func init() {
|
|
85
|
87
|
rand.Seed(time.Now().UTC().UnixNano())
|
|
86
|
|
-
|
|
87
|
88
|
app.Version(version)
|
|
|
89
|
+
|
|
|
90
|
+}
|
|
|
91
|
+
|
|
|
92
|
+func main() {
|
|
88
|
93
|
kingpin.MustParse(app.Parse(os.Args[1:]))
|
|
89
|
94
|
|
|
|
95
|
+ err := setRLimit()
|
|
|
96
|
+ if err != nil {
|
|
|
97
|
+ usage(err.Error())
|
|
|
98
|
+ }
|
|
|
99
|
+
|
|
90
|
100
|
conf, err := config.NewConfig(*debug, *verbose,
|
|
91
|
101
|
*bindIP, *bindPort,
|
|
92
|
102
|
*publicIPv4, *publicIPv4Port,
|
|
|
@@ -125,6 +135,23 @@ func main() {
|
|
125
|
135
|
}
|
|
126
|
136
|
}
|
|
127
|
137
|
|
|
|
138
|
+func setRLimit() (err error) {
|
|
|
139
|
+ rLimit := syscall.Rlimit{}
|
|
|
140
|
+ err = syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit)
|
|
|
141
|
+ if err != nil {
|
|
|
142
|
+ err = errors.Annotate(err, "Cannot get rlimit")
|
|
|
143
|
+ return
|
|
|
144
|
+ }
|
|
|
145
|
+ rLimit.Cur = rLimit.Max
|
|
|
146
|
+
|
|
|
147
|
+ err = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rLimit)
|
|
|
148
|
+ if err != nil {
|
|
|
149
|
+ err = errors.Annotate(err, "Cannot set rlimit")
|
|
|
150
|
+ }
|
|
|
151
|
+
|
|
|
152
|
+ return
|
|
|
153
|
+}
|
|
|
154
|
+
|
|
128
|
155
|
func printURLs(data interface{}) {
|
|
129
|
156
|
encoder := json.NewEncoder(os.Stdout)
|
|
130
|
157
|
encoder.SetEscapeHTML(false)
|