external.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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. buf.ReleaseMulti(c.MultiBuffer)
  16. c.MultiBuffer = nil
  17. return nil
  18. }
  19. func loadConfigFile(configFile string) (io.ReadCloser, error) {
  20. if configFile == "stdin:" {
  21. return os.Stdin, nil
  22. }
  23. if strings.HasPrefix(configFile, "http://") || strings.HasPrefix(configFile, "https://") {
  24. content, err := ctlcmd.Run([]string{"fetch", configFile}, nil)
  25. if err != nil {
  26. return nil, err
  27. }
  28. return &ClosableMultiBuffer{content}, nil
  29. }
  30. fixedFile := os.ExpandEnv(configFile)
  31. file, err := os.Open(fixedFile)
  32. if err != nil {
  33. return nil, newError("config file not readable").Base(err)
  34. }
  35. defer file.Close()
  36. content, err := buf.ReadAllToMultiBuffer(file)
  37. if err != nil {
  38. return nil, newError("failed to load config file: ", fixedFile).Base(err).AtWarning()
  39. }
  40. return &ClosableMultiBuffer{content}, nil
  41. }
  42. func init() {
  43. confloader.EffectiveConfigFileLoader = loadConfigFile
  44. }