main.go 2.1 KB

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