subscriptionEntriesExtract.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package engineering
  2. import (
  3. "archive/zip"
  4. "encoding/json"
  5. "flag"
  6. "fmt"
  7. "io"
  8. "os"
  9. "golang.org/x/crypto/sha3"
  10. "github.com/v2fly/v2ray-core/v5/app/subscription/containers"
  11. "github.com/v2fly/v2ray-core/v5/main/commands/base"
  12. )
  13. var cmdSubscriptionEntriesExtractInputName *string
  14. var cmdSubscriptionEntriesExtract = &base.Command{
  15. UsageLine: "{{.Exec}} engineering subscriptionEntriesExtract",
  16. Flag: func() flag.FlagSet {
  17. fs := flag.NewFlagSet("", flag.ExitOnError)
  18. cmdSubscriptionEntriesExtractInputName = fs.String("input", "", "")
  19. return *fs
  20. }(),
  21. Run: func(cmd *base.Command, args []string) {
  22. cmd.Flag.Parse(args)
  23. inputReader := os.Stdin
  24. if *cmdSubscriptionEntriesExtractInputName != "" {
  25. file, err := os.Open(*cmdSubscriptionEntriesExtractInputName)
  26. if err != nil {
  27. base.Fatalf("%s", err)
  28. }
  29. inputReader = file
  30. defer file.Close()
  31. }
  32. content, err := io.ReadAll(inputReader)
  33. if err != nil {
  34. base.Fatalf("%s", err)
  35. }
  36. parsed, err := containers.TryAllParsers(content, "")
  37. if err != nil {
  38. base.Fatalf("%s", err)
  39. }
  40. zipWriter := zip.NewWriter(os.Stdout)
  41. {
  42. writer, err := zipWriter.Create("meta.json")
  43. if err != nil {
  44. base.Fatalf("%s", err)
  45. }
  46. err = json.NewEncoder(writer).Encode(parsed.Metadata)
  47. if err != nil {
  48. base.Fatalf("%s", err)
  49. }
  50. }
  51. for k, entry := range parsed.ServerSpecs {
  52. hash := sha3.Sum256(entry.Content)
  53. fileName := fmt.Sprintf("entry_%v_%x", k, hash[:8])
  54. writer, err := zipWriter.Create(fileName)
  55. if err != nil {
  56. base.Fatalf("%s", err)
  57. }
  58. _, err = writer.Write(entry.Content)
  59. if err != nil {
  60. base.Fatalf("%s", err)
  61. }
  62. }
  63. zipWriter.Close()
  64. },
  65. }