-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmain.go
More file actions
71 lines (59 loc) · 1.64 KB
/
main.go
File metadata and controls
71 lines (59 loc) · 1.64 KB
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
package main
import (
"flag"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"github.com/spf13/viper"
"net"
"os"
)
var (
listenAddr = flag.String("listen", ":3000", "listen address")
backendAddr = flag.String("backend", "127.0.0.1:7000", "backend server")
debug = flag.Bool("debug", false, "debug mode")
configFile = flag.String("config", "./as-proxy.yml", "config file")
)
func main() {
flag.Parse()
// Default level for this example is info, unless debug flag is present
zerolog.SetGlobalLevel(zerolog.InfoLevel)
if *debug {
zerolog.SetGlobalLevel(zerolog.DebugLevel)
}
log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr})
v := viper.New()
config := getConfig(v, *configFile)
authsMap := make(map[string][]byte)
for user, password := range config.Auths {
hash, err := hashPassword(password)
if err != nil {
log.Error().Msgf("Hash password failed: %s", err)
os.Exit(1)
}
authsMap[user] = hash
}
asClusterMap := make(map[string][]byte)
for server, proxy := range config.AsCluster {
proxyByte := []byte(proxy)
asClusterMap[server] = proxyByte
}
log.Info().Msgf("Proxying from %v to %v", *listenAddr, *backendAddr)
listener, err := net.Listen("tcp", *listenAddr)
if err != nil {
log.Error().Msgf("Failed to open local port to listen: %s", err)
os.Exit(1)
}
target := DialProxy{
Addr: *backendAddr,
KeepAlivePeriod: config.KeepAlivePeriod,
DialTimeout: config.ConnectTimeout,
}
for {
conn, err := listener.Accept()
if err != nil {
log.Error().Msgf("Failed to accept connection: %s", err)
os.Exit(1)
}
go target.HandleConn(conn, authsMap, asClusterMap)
}
}