2020-11-23 10:38:43 -05:00
|
|
|
package all
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"os"
|
|
|
|
|
|
|
|
"google.golang.org/protobuf/proto"
|
|
|
|
"v2ray.com/core/commands/base"
|
2020-11-28 09:06:03 -05:00
|
|
|
"v2ray.com/core/infra/conf/merge"
|
2020-11-23 10:38:43 -05:00
|
|
|
"v2ray.com/core/infra/conf/serial"
|
|
|
|
)
|
|
|
|
|
|
|
|
var cmdConvert = &base.Command{
|
2020-11-28 09:06:03 -05:00
|
|
|
UsageLine: "{{.Exec}} convert [-r] [c1.json] [<url>.json] [dir1] ...",
|
2020-11-23 10:38:43 -05:00
|
|
|
Short: "Convert multiple json config to protobuf",
|
|
|
|
Long: `
|
2020-11-28 09:06:03 -05:00
|
|
|
Convert JSON config to protobuf.
|
|
|
|
|
|
|
|
If multiple JSON files or folders specified, it merges them first, then convert.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
-r
|
|
|
|
Load confdir recursively.
|
2020-11-23 10:38:43 -05:00
|
|
|
|
|
|
|
Examples:
|
|
|
|
|
2020-11-28 09:06:03 -05:00
|
|
|
{{.Exec}} {{.LongName}} config.json
|
|
|
|
{{.Exec}} {{.LongName}} c1.json c2.json
|
|
|
|
{{.Exec}} {{.LongName}} c1.json https://url.to/c2.json
|
|
|
|
{{.Exec}} {{.LongName}} "path/to/json_dir"
|
2020-11-23 10:38:43 -05:00
|
|
|
`,
|
|
|
|
}
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
cmdConvert.Run = executeConvert // break init loop
|
|
|
|
}
|
|
|
|
|
2020-11-28 09:06:03 -05:00
|
|
|
var convertReadDirRecursively = cmdConvert.Flag.Bool("r", false, "")
|
|
|
|
|
2020-11-23 10:38:43 -05:00
|
|
|
func executeConvert(cmd *base.Command, args []string) {
|
2020-11-28 09:06:03 -05:00
|
|
|
unnamed := cmd.Flag.Args()
|
|
|
|
files := resolveFolderToFiles(unnamed, *convertReadDirRecursively)
|
|
|
|
if len(files) == 0 {
|
2020-11-23 10:38:43 -05:00
|
|
|
base.Fatalf("empty config list")
|
|
|
|
}
|
|
|
|
|
2020-11-28 09:06:03 -05:00
|
|
|
data, err := merge.FilesToJSON(files)
|
|
|
|
if err != nil {
|
|
|
|
base.Fatalf("failed to load json: %s", err)
|
|
|
|
}
|
|
|
|
r := bytes.NewReader(data)
|
|
|
|
cf, err := serial.DecodeJSONConfig(r)
|
|
|
|
if err != nil {
|
|
|
|
base.Fatalf("failed to decode json: %s", err)
|
2020-11-23 10:38:43 -05:00
|
|
|
}
|
|
|
|
|
2020-11-28 09:06:03 -05:00
|
|
|
pbConfig, err := cf.Build()
|
2020-11-23 10:38:43 -05:00
|
|
|
if err != nil {
|
|
|
|
base.Fatalf(err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
bytesConfig, err := proto.Marshal(pbConfig)
|
|
|
|
if err != nil {
|
|
|
|
base.Fatalf("failed to marshal proto config: %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := os.Stdout.Write(bytesConfig); err != nil {
|
|
|
|
base.Fatalf("failed to write proto config: %s", err)
|
|
|
|
}
|
|
|
|
}
|