From 718b4afbf3ad211dd6200387d0b721af2ef68940 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Mon, 4 Jul 2022 16:59:27 +0800 Subject: [PATCH] Add check/format command --- cmd/sing-box/cmd_check.go | 36 ++++++++++++++++++++++ cmd/sing-box/cmd_format.go | 61 ++++++++++++++++++++++++++++++++++++++ cmd/sing-box/cmd_run.go | 1 - cmd/sing-box/main.go | 2 ++ 4 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 cmd/sing-box/cmd_check.go create mode 100644 cmd/sing-box/cmd_format.go diff --git a/cmd/sing-box/cmd_check.go b/cmd/sing-box/cmd_check.go new file mode 100644 index 00000000..55a2911a --- /dev/null +++ b/cmd/sing-box/cmd_check.go @@ -0,0 +1,36 @@ +package main + +import ( + "context" + "os" + + "github.com/goccy/go-json" + "github.com/sagernet/sing-box" + "github.com/sagernet/sing-box/option" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" +) + +var commandCheck = &cobra.Command{ + Use: "check", + Short: "check configuration", + Run: checkConfiguration, +} + +func checkConfiguration(cmd *cobra.Command, args []string) { + configContent, err := os.ReadFile(configPath) + if err != nil { + logrus.Fatal("read config: ", err) + } + var options option.Options + err = json.Unmarshal(configContent, &options) + if err != nil { + logrus.Fatal("decode config: ", err) + } + ctx, cancel := context.WithCancel(context.Background()) + _, err = box.NewService(ctx, options) + if err != nil { + logrus.Fatal("create service: ", err) + } + cancel() +} diff --git a/cmd/sing-box/cmd_format.go b/cmd/sing-box/cmd_format.go new file mode 100644 index 00000000..5dc78806 --- /dev/null +++ b/cmd/sing-box/cmd_format.go @@ -0,0 +1,61 @@ +package main + +import ( + "bytes" + "os" + "path/filepath" + + "github.com/goccy/go-json" + "github.com/sagernet/sing-box/option" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" +) + +var commandFormatFlagWrite bool + +var commandFormat = &cobra.Command{ + Use: "format", + Short: "format configuration", + Run: formatConfiguration, +} + +func init() { + commandFormat.Flags().BoolVarP(&commandFormatFlagWrite, "write", "w", false, "write result to (source) file instead of stdout") +} + +func formatConfiguration(cmd *cobra.Command, args []string) { + configContent, err := os.ReadFile(configPath) + if err != nil { + logrus.Fatal("read config: ", err) + } + var options option.Options + err = json.Unmarshal(configContent, &options) + if err != nil { + logrus.Fatal("decode config: ", err) + } + buffer := new(bytes.Buffer) + encoder := json.NewEncoder(buffer) + encoder.SetIndent("", " ") + err = encoder.Encode(options) + if err != nil { + logrus.Fatal("encode config: ", err) + } + if !commandFormatFlagWrite { + os.Stdout.Write(buffer.Bytes()) + return + } + if bytes.Compare(configContent, buffer.Bytes()) == 0 { + return + } + output, err := os.Create(configPath) + if err != nil { + logrus.Fatal("open output: ", err) + } + _, err = output.Write(buffer.Bytes()) + output.Close() + if err != nil { + logrus.Fatal("write output: ", err) + } + outputPath, _ := filepath.Abs(configPath) + os.Stderr.WriteString(outputPath) +} diff --git a/cmd/sing-box/cmd_run.go b/cmd/sing-box/cmd_run.go index c5ba4aae..63ab9689 100644 --- a/cmd/sing-box/cmd_run.go +++ b/cmd/sing-box/cmd_run.go @@ -35,7 +35,6 @@ func run(cmd *cobra.Command, args []string) { } options.Log.DisableColor = true } - ctx, cancel := context.WithCancel(context.Background()) service, err := box.NewService(ctx, options) if err != nil { diff --git a/cmd/sing-box/main.go b/cmd/sing-box/main.go index 72b5370a..55770199 100644 --- a/cmd/sing-box/main.go +++ b/cmd/sing-box/main.go @@ -28,6 +28,8 @@ func main() { command.PersistentFlags().StringVarP(&workingDir, "directory", "D", "", "set working directory") command.PersistentFlags().BoolVarP(&disableColor, "disable-color", "", false, "disable color output") command.AddCommand(commandRun) + command.AddCommand(commandCheck) + command.AddCommand(commandFormat) if err := command.Execute(); err != nil { logrus.Fatal(err) }