Highly-opinionated (ex-bullshit-free) MTPROTO proxy for Telegram. If you use v1.0 or upgrade broke you proxy, please read the chapter Version 2
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

main.go 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. package main
  2. //go:generate scripts/generate_version.sh
  3. import (
  4. "encoding/hex"
  5. "encoding/json"
  6. "io"
  7. "io/ioutil"
  8. "net/http"
  9. "os"
  10. "strings"
  11. "github.com/9seconds/mtg/proxy"
  12. "go.uber.org/zap"
  13. "go.uber.org/zap/zapcore"
  14. kingpin "gopkg.in/alecthomas/kingpin.v2"
  15. )
  16. var (
  17. app = kingpin.New("mtg", "Simple MTPROTO proxy.")
  18. debug = app.Flag("debug", "Run in debug mode.").
  19. Short('d').
  20. Envar("MTG_DEBUG").
  21. Bool()
  22. verbose = app.Flag("verbose", "Run in verbose mode.").
  23. Short('v').
  24. Envar("MTG_VERBOSE").
  25. Bool()
  26. bindIP = app.Flag("bind-ip", "Which IP to bind to.").
  27. Short('i').
  28. Envar("MTG_IP").
  29. Default("127.0.0.1").
  30. IP()
  31. bindPort = app.Flag("bind-port", "Which port to bind to.").
  32. Short('p').
  33. Envar("MTG_PORT").
  34. Default("3128").
  35. Uint16()
  36. portToShow = app.Flag("show-bind-port",
  37. "Which port to show in URL. Default is the value of bind-port").
  38. Short('a').
  39. Envar("MTG_SHOW_PORT").
  40. Uint16()
  41. statsIP = app.Flag("stats-ip", "Which IP bind stats server to").
  42. Short('t').
  43. Envar("MTG_STATS_IP").
  44. Default("127.0.0.1").
  45. IP()
  46. statsPort = app.Flag("stats-port", "Which port bind stats to.").
  47. Short('q').
  48. Envar("MTG_STATS_PORT").
  49. Default("3129").
  50. Uint16()
  51. readTimeout = app.Flag("read-timeout", "Socket read timeout.").
  52. Short('r').
  53. Envar("MTG_READ_TIMEOUT").
  54. Default("30s").
  55. Duration()
  56. writeTimeout = app.Flag("write-timeout", "Socket write timeout.").
  57. Short('w').
  58. Envar("MTG_WRITE_TIMEOUT").
  59. Default("30s").
  60. Duration()
  61. serverName = app.Flag("server-name",
  62. "Which server name to use. Default is IP address resolved by ipify.").
  63. Short('s').
  64. Envar("MTG_SERVER").
  65. String()
  66. preferIPv6 = app.Flag("prefer-ipv6", "Use IPv6").
  67. Short('6').
  68. Envar("MTG_USE_IPV6").
  69. Bool()
  70. secret = app.Arg("secret", "Secret of this proxy.").String()
  71. )
  72. func main() {
  73. app.Version(version)
  74. kingpin.MustParse(app.Parse(os.Args[1:]))
  75. secretBytes, err := hex.DecodeString(*secret)
  76. if err != nil {
  77. usage("Secret has to be hexadecimal string.")
  78. }
  79. if *portToShow == 0 {
  80. *portToShow = *bindPort
  81. }
  82. if *serverName == "" {
  83. resp, err := http.Get("https://api.ipify.org")
  84. if err != nil || resp.StatusCode != http.StatusOK {
  85. usage("Cannot get local IP address.")
  86. }
  87. myIPBytes, err := ioutil.ReadAll(resp.Body)
  88. resp.Body.Close()
  89. if err != nil {
  90. usage("Cannot get local IP address.")
  91. }
  92. *serverName = strings.TrimSpace(string(myIPBytes))
  93. }
  94. atom := zap.NewAtomicLevel()
  95. if *debug {
  96. atom.SetLevel(zapcore.DebugLevel)
  97. } else if *verbose {
  98. atom.SetLevel(zapcore.InfoLevel)
  99. } else {
  100. atom.SetLevel(zapcore.ErrorLevel)
  101. }
  102. encoderCfg := zap.NewProductionEncoderConfig()
  103. logger := zap.New(zapcore.NewCore(
  104. zapcore.NewJSONEncoder(encoderCfg),
  105. zapcore.Lock(os.Stderr),
  106. atom,
  107. )).Sugar()
  108. stat := proxy.NewStats(*serverName, *portToShow, *secret)
  109. go stat.Serve(*statsIP, *statsPort)
  110. printURLs(stat.URLs)
  111. srv := proxy.NewServer(*bindIP, int(*bindPort), secretBytes, logger,
  112. *readTimeout, *writeTimeout, *preferIPv6, stat)
  113. if err := srv.Serve(); err != nil {
  114. logger.Fatal(err.Error())
  115. }
  116. }
  117. func printURLs(data interface{}) {
  118. encoder := json.NewEncoder(os.Stdout)
  119. encoder.SetEscapeHTML(false)
  120. encoder.SetIndent("", " ")
  121. err := encoder.Encode(data)
  122. if err != nil {
  123. panic(err)
  124. }
  125. }
  126. func usage(msg string) {
  127. io.WriteString(os.Stderr, msg+"\n")
  128. os.Exit(1)
  129. }