main.go 2.1 KB

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