main.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "io"
  6. "os"
  7. "os/signal"
  8. "path/filepath"
  9. "strings"
  10. "syscall"
  11. "v2ray.com/core"
  12. "v2ray.com/core/common/log"
  13. //"net/http"
  14. //_ "net/http/pprof"
  15. )
  16. var (
  17. configFile string
  18. version = flag.Bool("version", false, "Show current version of V2Ray.")
  19. test = flag.Bool("test", false, "Test config file only, without launching V2Ray server.")
  20. format = flag.String("format", "json", "Format of input file.")
  21. )
  22. func init() {
  23. defaultConfigFile := ""
  24. workingDir, err := filepath.Abs(filepath.Dir(os.Args[0]))
  25. if err == nil {
  26. defaultConfigFile = filepath.Join(workingDir, "config.json")
  27. }
  28. flag.StringVar(&configFile, "config", defaultConfigFile, "Config file for this Point server.")
  29. }
  30. func GetConfigFormat() core.ConfigFormat {
  31. switch strings.ToLower(*format) {
  32. case "json":
  33. return core.ConfigFormat_JSON
  34. case "pb", "protobuf":
  35. return core.ConfigFormat_Protobuf
  36. default:
  37. return core.ConfigFormat_JSON
  38. }
  39. }
  40. func startV2Ray() *core.Point {
  41. if len(configFile) == 0 {
  42. log.Error("Config file is not set.")
  43. return nil
  44. }
  45. var configInput io.Reader
  46. if configFile == "stdin:" {
  47. configInput = os.Stdin
  48. } else {
  49. fixedFile := os.ExpandEnv(configFile)
  50. file, err := os.Open(fixedFile)
  51. if err != nil {
  52. log.Error("Config file not readable: ", err)
  53. return nil
  54. }
  55. defer file.Close()
  56. configInput = file
  57. }
  58. config, err := core.LoadConfig(GetConfigFormat(), configInput)
  59. if err != nil {
  60. log.Error("Failed to read config file (", configFile, "): ", configFile, err)
  61. return nil
  62. }
  63. vPoint, err := core.NewPoint(config)
  64. if err != nil {
  65. log.Error("Failed to create Point server: ", err)
  66. return nil
  67. }
  68. if *test {
  69. fmt.Println("Configuration OK.")
  70. return nil
  71. }
  72. err = vPoint.Start()
  73. if err != nil {
  74. log.Error("Error starting Point server: ", err)
  75. return nil
  76. }
  77. return vPoint
  78. }
  79. func main() {
  80. flag.Parse()
  81. core.PrintVersion()
  82. if *version {
  83. return
  84. }
  85. //go func() {
  86. // http.ListenAndServe(":6060", nil)
  87. //}()
  88. if point := startV2Ray(); point != nil {
  89. osSignals := make(chan os.Signal, 1)
  90. signal.Notify(osSignals, os.Interrupt, os.Kill, syscall.SIGTERM)
  91. <-osSignals
  92. point.Close()
  93. }
  94. log.Close()
  95. }