Browse Source

fix(config): support cli for export/import

Signed-off-by: Jianxiang Ran <rxan_embedded@163.com>
Jianxiang Ran 2 years atrás
parent
commit
c39fea3eda
3 changed files with 95 additions and 20 deletions
  1. 62 12
      cmd/kuiper/main.go
  2. 6 0
      internal/pkg/model/data.go
  3. 27 8
      internal/server/rpc.go

+ 62 - 12
cmd/kuiper/main.go

@@ -16,6 +16,7 @@ package main
 
 import (
 	"bufio"
+	"encoding/json"
 	"fmt"
 	"net/rpc"
 	"os"
@@ -981,7 +982,7 @@ func main() {
 		{
 			Name:    "import",
 			Aliases: []string{"import"},
-			Usage:   "import ruleset | data -f file",
+			Usage:   "import ruleset | data -f file -p partial -s stop",
 			Subcommands: []cli.Command{
 				{
 					Name:  "ruleset",
@@ -1011,7 +1012,7 @@ func main() {
 				},
 				{
 					Name:  "data",
-					Usage: "\"import data -f configuration_file -s stop",
+					Usage: "\"import data -f configuration_file -p partial -s stop",
 					Flags: []cli.Flag{
 						cli.StringFlag{
 							Name:     "file, f",
@@ -1022,6 +1023,10 @@ func main() {
 							Name:  "stop, s",
 							Usage: "stop kuiper after the action",
 						},
+						cli.StringFlag{
+							Name:  "partial, p",
+							Usage: "import partial configuration",
+						},
 					},
 					Action: func(c *cli.Context) error {
 						sfile := c.String("file")
@@ -1034,9 +1039,15 @@ func main() {
 							fmt.Printf("Expect s flag to be a boolean value.\n")
 							return nil
 						}
+						p := c.String("partial")
+						if p != "true" && p != "false" {
+							fmt.Printf("Expect p flag to be a boolean value.\n")
+							return nil
+						}
 						args := &model.ImportDataDesc{
 							FileName: sfile,
 							Stop:     r == "true",
+							Partial:  p == "true",
 						}
 
 						var reply string
@@ -1054,7 +1065,7 @@ func main() {
 		{
 			Name:    "export",
 			Aliases: []string{"export"},
-			Usage:   "export ruleset | data $ruleset_file",
+			Usage:   "export ruleset | data $ruleset_file [ -r rules ]",
 			Subcommands: []cli.Command{
 				{
 					Name:  "ruleset",
@@ -1076,18 +1087,57 @@ func main() {
 				},
 				{
 					Name:  "data",
-					Usage: "\"export data $configuration_file",
+					Usage: "export data $configuration_file [ -r rules ]",
+					Flags: []cli.Flag{
+						cli.StringFlag{
+							Name:  "rules, r",
+							Usage: "the rules id in json array format",
+						},
+					},
 					Action: func(c *cli.Context) error {
-						if len(c.Args()) < 1 {
-							fmt.Printf("Require exported file name.\n")
-							return nil
+						args := model.ExportDataDesc{
+							Rules:    []string{},
+							FileName: "",
 						}
-						var reply string
-						err = client.Call("Server.ExportConfiguration", c.Args()[0], &reply)
-						if err != nil {
-							fmt.Println(err)
+
+						rulesArray := c.String("rules")
+						if rulesArray != "" {
+							var rules []string
+							err := json.Unmarshal([]byte(rulesArray), &rules)
+							if err != nil {
+								fmt.Printf("rules %s unmarshal error %s", rules, err)
+								return nil
+							}
+							args.Rules = rules
+							if len(c.Args()) != 1 {
+								fmt.Printf("Expect configuration file.\n")
+								return nil
+							}
+							args.FileName = c.Args()[0]
+
+							var reply string
+
+							err = client.Call("Server.ExportConfiguration", args, &reply)
+							if err != nil {
+								fmt.Println(err)
+							} else {
+								fmt.Println(reply)
+							}
 						} else {
-							fmt.Println(reply)
+							if len(c.Args()) != 1 {
+								fmt.Printf("Expect configuration file.\n")
+								return nil
+							}
+							args.FileName = c.Args()[0]
+
+							var reply string
+
+							err = client.Call("Server.ExportConfiguration", args, &reply)
+							if err != nil {
+								fmt.Println(err)
+							} else {
+								fmt.Println(reply)
+							}
 						}
 						return nil
 					},

+ 6 - 0
internal/pkg/model/data.go

@@ -31,4 +31,10 @@ type PluginDesc struct {
 type ImportDataDesc struct {
 	FileName string
 	Stop     bool
+	Partial  bool
+}
+
+type ExportDataDesc struct {
+	Rules    []string
+	FileName string
 }

+ 27 - 8
internal/server/rpc.go

@@ -310,13 +310,23 @@ func (t *Server) ImportConfiguration(arg *model.ImportDataDesc, reply *string) e
 		return fmt.Errorf("fail to convert file %s: %v", file, err)
 	}
 	content := buf.Bytes()
+	partial := arg.Partial
+
+	var result Configuration
+	if !partial {
+		configurationReset()
+		result = configurationImport(content, arg.Stop)
+	} else {
+		result = configurationPartialImport(content)
+	}
+	marshal, _ := json.Marshal(result)
+
+	dst := &bytes.Buffer{}
+	if err := json.Indent(dst, marshal, "", "  "); err != nil {
+		return fmt.Errorf("import configuration error: %v", err)
+	}
+	*reply = dst.String()
 
-	configurationReset()
-	_ = configurationImport(content, arg.Stop)
-	//if err != nil {
-	//	return fmt.Errorf("import configuration error: %v", err)
-	//}
-	*reply = fmt.Sprintf("import configuration success")
 	return nil
 }
 
@@ -335,12 +345,21 @@ func (t *Server) GetStatusImport(_ int, reply *string) error {
 	return nil
 }
 
-func (t *Server) ExportConfiguration(file string, reply *string) error {
+func (t *Server) ExportConfiguration(arg *model.ExportDataDesc, reply *string) error {
+	rules := arg.Rules
+	file := arg.FileName
 	f, err := os.Create(file)
 	if err != nil {
 		return err
 	}
-	jsonBytes, err := configurationExport()
+	var jsonBytes []byte
+	//do not specify rules, export all
+	if len(rules) == 0 {
+		jsonBytes, err = configurationExport()
+	} else {
+		jsonBytes, err = ruleMigrationProcessor.ConfigurationPartialExport(rules)
+	}
+	jsonBytes, err = configurationExport()
 	_, err = io.Copy(f, bytes.NewReader(jsonBytes))
 	if err != nil {
 		return fmt.Errorf("fail to save to file %s:%v", file, err)