main.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package server
  2. import (
  3. log "code.google.com/p/log4go"
  4. "flag"
  5. "net"
  6. "ngrok"
  7. "ngrok/conn"
  8. "ngrok/proto"
  9. "regexp"
  10. )
  11. type Options struct {
  12. publicPort int
  13. proxyPort int
  14. tunnelPort int
  15. domain string
  16. }
  17. /* GLOBALS */
  18. var (
  19. hostRegex *regexp.Regexp
  20. version string = "0.1"
  21. proxyAddr string
  22. tunnels *TunnelManager
  23. )
  24. func init() {
  25. hostRegex = regexp.MustCompile("[H|h]ost: ([^\\(\\);:,<>]+)\n")
  26. }
  27. func parseArgs() *Options {
  28. publicPort := flag.Int("publicport", 80, "Public port")
  29. tunnelPort := flag.Int("tunnelport", 2280, "Tunnel port")
  30. proxyPort := flag.Int("proxyPort", 0, "Proxy port")
  31. domain := flag.String("domain", "ngrok.com", "Domain where the tunnels are hosted")
  32. flag.Parse()
  33. return &Options{
  34. publicPort: *publicPort,
  35. tunnelPort: *tunnelPort,
  36. proxyPort: *proxyPort,
  37. domain: *domain,
  38. }
  39. }
  40. func getTCPPort(addr net.Addr) int {
  41. return addr.(*net.TCPAddr).Port
  42. }
  43. /**
  44. * Listens for new control connections from tunnel clients
  45. */
  46. func controlListener(addr *net.TCPAddr, domain string) {
  47. // listen for incoming connections
  48. listener, err := net.ListenTCP("tcp", addr)
  49. if err != nil {
  50. panic(err)
  51. }
  52. log.Info("Listening for control connections on %d", getTCPPort(addr))
  53. for {
  54. tcpConn, err := listener.AcceptTCP()
  55. if err != nil {
  56. panic(err)
  57. }
  58. NewControl(tcpConn)
  59. }
  60. }
  61. /**
  62. * Listens for new proxy connections from tunnel clients
  63. */
  64. func proxyListener(addr *net.TCPAddr) {
  65. listener, err := net.ListenTCP("tcp", addr)
  66. proxyAddr = listener.Addr().String()
  67. if err != nil {
  68. panic(err)
  69. }
  70. log.Info("Listening for proxy connection on %d", getTCPPort(listener.Addr()))
  71. for {
  72. tcpConn, err := listener.AcceptTCP()
  73. if err != nil {
  74. panic(err)
  75. }
  76. conn := conn.NewLogged(tcpConn, "pxy")
  77. go func() {
  78. defer func() {
  79. if r := recover(); r != nil {
  80. conn.Warn("Failed with error: %v", r)
  81. conn.Close()
  82. }
  83. }()
  84. var regPxy proto.RegProxyMsg
  85. if err = proto.ReadMsgInto(conn, &regPxy); err != nil {
  86. panic(err)
  87. }
  88. conn.Info("Registering new proxy for %s", regPxy.Url)
  89. tunnel := tunnels.Get(regPxy.Url)
  90. if tunnel == nil {
  91. panic("No tunnel found for: " + regPxy.Url)
  92. }
  93. tunnel.RegisterProxy(conn)
  94. }()
  95. }
  96. }
  97. func Main() {
  98. ngrok.LogToConsole()
  99. done := make(chan int)
  100. // parse options
  101. opts := parseArgs()
  102. tunnels = NewTunnelManager(opts.domain)
  103. go proxyListener(&net.TCPAddr{net.ParseIP("0.0.0.0"), opts.proxyPort})
  104. go controlListener(&net.TCPAddr{net.ParseIP("0.0.0.0"), opts.tunnelPort}, opts.domain)
  105. go httpListener(&net.TCPAddr{net.ParseIP("0.0.0.0"), opts.publicPort})
  106. <-done
  107. }