Improve cmd

This commit is contained in:
世界 2022-08-13 18:36:49 +08:00
parent 529cfe2d9a
commit c8399a297e
No known key found for this signature in database
GPG key ID: CD109927C34A63C4
6 changed files with 56 additions and 41 deletions

View file

@ -1,9 +1,10 @@
NAME=sing-box
COMMIT=$(shell git rev-parse --short HEAD)
PARAMS=-trimpath -tags '$(TAGS)' -ldflags \
NAME = sing-box
COMMIT = $(shell git rev-parse --short HEAD)
TAGS ?= with_quic,with_clash_api
PARAMS = -trimpath -tags '$(TAGS)' -ldflags \
'-X "github.com/sagernet/sing-box/constant.Commit=$(COMMIT)" \
-w -s -buildid='
MAIN=./cmd/sing-box
MAIN = ./cmd/sing-box
.PHONY: test release
@ -24,9 +25,9 @@ fmt_install:
go install -v github.com/daixiang0/gci@v0.4.0
fmt:
gofumpt -l -w .
gofmt -s -w .
gci write -s "standard,prefix(github.com/sagernet/),default" .
@gofumpt -l -w .
@gofmt -s -w .
@gci write -s "standard,prefix(github.com/sagernet/),default" .
lint_install:
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
@ -38,10 +39,10 @@ lint:
GOOS=freebsd golangci-lint run ./...
test:
go test -v . && \
pushd test && \
go test -v . && \
popd
@go test -v . && \
@pushd test && \
@go test -v . && \
@popd
clean:
rm -rf bin dist

View file

@ -8,6 +8,7 @@ import (
"github.com/sagernet/sing-box/common/json"
"github.com/sagernet/sing-box/log"
"github.com/sagernet/sing-box/option"
E "github.com/sagernet/sing/common/exceptions"
"github.com/spf13/cobra"
)
@ -15,24 +16,31 @@ import (
var commandCheck = &cobra.Command{
Use: "check",
Short: "Check configuration",
Run: checkConfiguration,
Args: cobra.NoArgs,
Run: func(cmd *cobra.Command, args []string) {
err := check()
if err != nil {
log.Fatal(err)
}
},
Args: cobra.NoArgs,
}
func checkConfiguration(cmd *cobra.Command, args []string) {
func init() {
mainCommand.AddCommand(commandCheck)
}
func check() error {
configContent, err := os.ReadFile(configPath)
if err != nil {
log.Fatal("read config: ", err)
return E.Cause(err, "read config")
}
var options option.Options
err = json.Unmarshal(configContent, &options)
if err != nil {
log.Fatal("decode config: ", err)
return E.Cause(err, "decode config")
}
ctx, cancel := context.WithCancel(context.Background())
_, err = box.New(ctx, options)
if err != nil {
log.Fatal("create service: ", err)
}
cancel()
return err
}

View file

@ -8,6 +8,7 @@ import (
"github.com/sagernet/sing-box/common/json"
"github.com/sagernet/sing-box/log"
"github.com/sagernet/sing-box/option"
E "github.com/sagernet/sing/common/exceptions"
"github.com/spf13/cobra"
)
@ -17,47 +18,54 @@ var commandFormatFlagWrite bool
var commandFormat = &cobra.Command{
Use: "format",
Short: "Format configuration",
Run: formatConfiguration,
Args: cobra.NoArgs,
Run: func(cmd *cobra.Command, args []string) {
err := format()
if err != nil {
log.Fatal(err)
}
},
Args: cobra.NoArgs,
}
func init() {
commandFormat.Flags().BoolVarP(&commandFormatFlagWrite, "write", "w", false, "write result to (source) file instead of stdout")
mainCommand.AddCommand(commandFormat)
}
func formatConfiguration(cmd *cobra.Command, args []string) {
func format() error {
configContent, err := os.ReadFile(configPath)
if err != nil {
log.Fatal("read config: ", err)
return E.Cause(err, "read config")
}
var options option.Options
err = json.Unmarshal(configContent, &options)
if err != nil {
log.Fatal("decode config: ", err)
return E.Cause(err, "decode config")
}
buffer := new(bytes.Buffer)
encoder := json.NewEncoder(buffer)
encoder.SetIndent("", " ")
err = encoder.Encode(options)
if err != nil {
log.Fatal("encode config: ", err)
return E.Cause(err, "encode config")
}
if !commandFormatFlagWrite {
os.Stdout.WriteString(buffer.String() + "\n")
return
return nil
}
if bytes.Equal(configContent, buffer.Bytes()) {
return
return nil
}
output, err := os.Create(configPath)
if err != nil {
log.Fatal("open output: ", err)
return E.Cause(err, "open output")
}
_, err = output.Write(buffer.Bytes())
output.Close()
if err != nil {
log.Fatal("write output: ", err)
return E.Cause(err, "write output")
}
outputPath, _ := filepath.Abs(configPath)
os.Stderr.WriteString(outputPath + "\n")
return nil
}

View file

@ -20,17 +20,19 @@ import (
var commandRun = &cobra.Command{
Use: "run",
Short: "Run service",
Run: run,
Run: func(cmd *cobra.Command, args []string) {
err := run()
if err != nil {
log.Fatal(err)
}
},
}
func run(cmd *cobra.Command, args []string) {
err := run0()
if err != nil {
log.Fatal(err)
}
func init() {
mainCommand.AddCommand(commandRun)
}
func run0() error {
func run() error {
configContent, err := os.ReadFile(configPath)
if err != nil {
return E.Cause(err, "read config")

View file

@ -21,6 +21,7 @@ var nameOnly bool
func init() {
commandVersion.Flags().BoolVarP(&nameOnly, "name", "n", false, "print version name only")
mainCommand.AddCommand(commandVersion)
}
func printVersion(cmd *cobra.Command, args []string) {

View file

@ -23,11 +23,6 @@ func init() {
mainCommand.PersistentFlags().StringVarP(&configPath, "config", "c", "config.json", "set configuration file path")
mainCommand.PersistentFlags().StringVarP(&workingDir, "directory", "D", "", "set working directory")
mainCommand.PersistentFlags().BoolVarP(&disableColor, "disable-color", "", false, "disable color output")
mainCommand.AddCommand(commandRun)
mainCommand.AddCommand(commandCheck)
mainCommand.AddCommand(commandFormat)
mainCommand.AddCommand(commandVersion)
}
func main() {