external.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package external
  2. import (
  3. "io"
  4. "os"
  5. "strings"
  6. "v2ray.com/core/common/buf"
  7. "v2ray.com/core/common/platform/ctlcmd"
  8. "v2ray.com/core/main/confloader"
  9. )
  10. //go:generate errorgen
  11. type ClosableMultiBuffer struct {
  12. buf.MultiBuffer
  13. }
  14. func (c *ClosableMultiBuffer) Close() error {
  15. c.MultiBuffer.Release()
  16. return nil
  17. }
  18. func loadConfigFile(configFile string) (io.ReadCloser, error) {
  19. if configFile == "stdin:" {
  20. return os.Stdin, nil
  21. }
  22. if strings.HasPrefix(configFile, "http://") || strings.HasPrefix(configFile, "https://") {
  23. content, err := ctlcmd.Run([]string{"fetch", configFile}, nil)
  24. if err != nil {
  25. return nil, err
  26. }
  27. return &ClosableMultiBuffer{content}, nil
  28. }
  29. fixedFile := os.ExpandEnv(configFile)
  30. file, err := os.Open(fixedFile)
  31. if err != nil {
  32. return nil, newError("config file not readable").Base(err)
  33. }
  34. defer file.Close()
  35. content, err := buf.ReadAllToMultiBuffer(file)
  36. if err != nil {
  37. return nil, newError("failed to load config file: ", fixedFile).Base(err).AtWarning()
  38. }
  39. return &ClosableMultiBuffer{content}, nil
  40. }
  41. func init() {
  42. confloader.EffectiveConfigFileLoader = loadConfigFile
  43. }