-
-
Notifications
You must be signed in to change notification settings - Fork 7
/
main.go
111 lines (96 loc) · 3.07 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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package main
import (
"flag"
"fmt"
"github.com/miekg/dns"
"log"
"net"
"net/http"
"os"
"sync"
)
var mainThreadWaitGroup = &sync.WaitGroup{}
var localResolveIp4AddressString *string
var localResolveIp4Address net.IP
var localResolveIp4Enabled bool
var localResolveIp6AddressString *string
var localResolveIp6Address net.IP
var localResolveIp6Enabled bool
var showVersionOnly *bool
func main() {
// arguments parsing
localResolveIp4AddressString = flag.String("ipv4", "", "the IPv4 address to this server")
localResolveIp6AddressString = flag.String("ipv6", "", "the IPv6 address to this server")
showVersionOnly = flag.Bool("version", false, "show version and quit")
flag.Parse()
if *showVersionOnly {
fmt.Println(getVersionFullString())
return
} else {
log.Println(getVersionFullString())
}
if len(*localResolveIp4AddressString) == 0 {
localResolveIp4Enabled = false
localResolveIp4Address = net.ParseIP("0.0.0.0")
log.Println("[CONFIG] IPv4 resolution disabled")
} else {
localResolveIp4Enabled = true
localResolveIp4Address = net.ParseIP(*localResolveIp4AddressString)
log.Printf("[CONFIG] Local server IPv4 address: %s\n", localResolveIp4Address)
}
if len(*localResolveIp6AddressString) == 0 {
localResolveIp6Enabled = false
localResolveIp6Address = net.ParseIP("::")
log.Println("[CONFIG] IPv6 resolution disabled")
} else {
localResolveIp6Enabled = true
localResolveIp6Address = net.ParseIP(*localResolveIp6AddressString)
log.Printf("[CONFIG] Local server IPv6 address: %s\n", localResolveIp6Address)
}
// HTTP router setup
mux := http.DefaultServeMux
mux.HandleFunc("/robots.txt", robots_txt)
mux.HandleFunc("/ncsi.txt", ncsi_txt)
mux.HandleFunc("/redirect", redirect)
mux.HandleFunc("/hotspot-detect.html", hotspot_detect_html)
mux.HandleFunc("/generate_204", generate_204)
mux.HandleFunc("/gen_204", generate_204)
mux.HandleFunc("/nm", nm)
mux.HandleFunc("/nm-check.txt", nm)
mux.HandleFunc("/check_network_status.txt", nm)
mux.HandleFunc("/success.txt", success_txt)
mux.HandleFunc("/connecttest.txt", connecttest)
mux.HandleFunc("/connectivity-check.html", connectivity_check_html)
mux.HandleFunc("/", http_server_fallback) // catch all
// HTTP logger setup
loggingHandler := NewApacheLoggingHandler(mux, os.Stdout) // HTTP access log is sent to stdout for now
// HTTP server setup
plainHttpServer := &http.Server{
Addr: ":80",
Handler: loggingHandler,
}
go plainHttpServer.ListenAndServe()
// HTTPS server setup
// tlsHttpServer := &http.Server{
// Addr: ":443",
// Handler: loggingHandler,
// TLSConfig: &tls.Config{
// GetCertificate: ,
// // ...
// }
// }
// go tlsHttpServer.ListenAndServe()
// DNS TCP server setup
dnsTcp1 := &dns.Server{Addr: ":53", Net: "tcp"}
dnsTcp1.Handler = &dnsRequestHandler{}
go dnsTcp1.ListenAndServe()
// DNS UDP server setup
dnsUdp1 := &dns.Server{Addr: ":53", Net: "udp"}
dnsUdp1.Handler = &dnsRequestHandler{}
go dnsUdp1.ListenAndServe()
// done
log.Println("[MAIN] Server started.")
// just a normal while(1)
mainThreadWaitGroup.Add(1)
mainThreadWaitGroup.Wait()
}